Linux2.6内核下键盘输入设备驱动的实现.doc_第1页
Linux2.6内核下键盘输入设备驱动的实现.doc_第2页
Linux2.6内核下键盘输入设备驱动的实现.doc_第3页
Linux2.6内核下键盘输入设备驱动的实现.doc_第4页
Linux2.6内核下键盘输入设备驱动的实现.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux2.6内核下键盘输入设备驱动的实现分类:linux设备驱动2011-02-08 00:472600人阅读评论(0)收藏举报linuxkeyboardinputactionreportrandom实验环境:1)Ubuntu9.10 OS 2)arm-linux-gcc 4.3.2交叉编译器 3)勤研S3C2440开发板(Linux2.6.29内核)实现的功能:键盘驱动通过input子系统将按键事件上报给上层的应用程序,应用程序将相应的按键事件打印出来关于input子系统的相关知识可以参考博文Linux设备模型之input子系统详解/u1/51562/showart_1090628.html废话不多说,附上源码:1) s3c2440键盘驱动源代码,参考2.6.29内核中触摸屏驱动s3c2410_ts.c实现c-sharpview plaincopy1. /*2. *Copyright(c)2011ShenYunlong3. *4. *5. *Thisprogramisfreesoftware;youcanredistributeitand/ormodifyit6. *underthetermsoftheGNUGeneralPublicLicenseversion2aspublishedby7. *theFreeSoftwareFoundation.8. */9. #include10. #include11. #include12. #include13. #include14. #include15. #include16. #include17. #include18. #include19. #include20. #include21. MODULE_LICENSE(GPL);22. MODULE_AUTHOR(SYL_USST);23. staticstructinput_dev*dev;24. staticchar*s3c2440_keyboard_name=s3c2440_keyboard_syl;25. /*26. *SetGPF0,GPF1,GPF2,GPF3portsusedasEINT0,EINT1,EINT2,EINT327. *SetGPG0,GPG1usedasEINT8,EINT928. */29. staticinlinevoids3c2440_keyboard_connect(void)30. 31. s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_EINT0);32. s3c2410_gpio_cfgpin(S3C2410_GPF1,S3C2410_GPF1_EINT1);33. s3c2410_gpio_cfgpin(S3C2410_GPF2,S3C2410_GPF2_EINT2);34. s3c2410_gpio_cfgpin(S3C2410_GPF3,S3C2410_GPF3_EINT3);35. s3c2410_gpio_cfgpin(S3C2410_GPG0,S3C2410_GPG0_EINT8);36. s3c2410_gpio_cfgpin(S3C2410_GPG1,S3C2410_GPG1_EINT9);37. 38. /*39. *InterruptHandlersofEINT0EINT3&EINT8&EINT940. *41. *Note:oncetheISRhasreportedakeywithaspecifiedvalue,42. *thenthenexttimeit(thekeywiththesamevalue)willbefiltered.43. *Itmeansthattheprograminuser-spacecannotgettheinput_eventfromthekernel.44. */45. staticirqreturn_tkeyboard_sw1_action(intirq,void*dev_id)46. 47. /printk(KERN_INFOsw1ispressed!/n);48. unsignedintupdown=ioread32(S3C2410_GPFDAT)&0x1;49. if(updown)50. /*thekeyBTN_0israised*/51. input_report_key(dev,BTN_0,0);52. else53. /*thekeyBTN_0ispressed*/54. input_report_key(dev,BTN_0,1);55. input_sync(dev);56. 57. returnIRQ_HANDLED;58. 59. staticirqreturn_tkeyboard_sw2_action(intirq,void*dev_id)60. 61. /printk(KERN_INFOsw2ispressed!/n);62. unsignedintupdown=ioread32(S3C2410_GPFDAT)&(0x11);63. if(updown)64. input_report_key(dev,BTN_1,0);65. else66. input_report_key(dev,BTN_1,1);67. input_sync(dev);68. returnIRQ_HANDLED;69. 70. staticirqreturn_tkeyboard_up_action(intirq,void*dev_id)71. 72. /printk(KERN_INFOupispressed!/n);73. unsignedintupdown=ioread32(S3C2410_GPFDAT)&(0x12);74. if(updown)75. input_report_key(dev,BTN_2,0);76. else77. input_report_key(dev,BTN_2,1);78. input_sync(dev);79. returnIRQ_HANDLED;80. 81. staticirqreturn_tkeyboard_down_action(intirq,void*dev_id)82. 83. /printk(KERN_INFOdownispressed!/n);84. unsignedintupdown=ioread32(S3C2410_GPFDAT)&(0x13);85. 86. if(updown)87. input_report_key(dev,BTN_3,0);88. else89. input_report_key(dev,BTN_3,1);90. input_sync(dev);91. returnIRQ_HANDLED;92. 93. staticirqreturn_tkeyboard_left_action(intirq,void*dev_id)94. 95. /printk(KERN_INFOleftispressed!/n);96. unsignedintupdown=ioread32(S3C2410_GPGDAT)&0x1;97. if(updown)98. input_report_key(dev,BTN_4,0);99. else100. input_report_key(dev,BTN_4,1);101. input_sync(dev);102. returnIRQ_HANDLED;103. 104. staticirqreturn_tkeyboard_right_action(intirq,void*dev_id)105. 106. /printk(KERN_INFOrightispressed!/n);107. unsignedintupdown=ioread32(S3C2410_GPGDAT)&(0x1evbit0=BIT(EV_SYN)|BIT(EV_KEY);140. /*DoNotforgettosetkeybitofBTN_0-BTN_5*/141. dev-keybitBIT_WORD(BTN_0)=BIT_MASK(BTN_0)|BIT_MASK(BTN_1)|BIT_MASK(BTN_2)|BIT_MASK(BTN_3)|BIT_MASK(BTN_4)|BIT_MASK(BTN_5);142. dev-name=s3c2440_keyboard_name;143. /dev-id.bustype144. /dev-id.vendor145. /duct146. /dev-id.version147. printk(inputdevicehasallocated/n);148. /*RegisteranInterruptHandlertoIRQ_EINT0*/149. if(request_irq(IRQ_EINT0,keyboard_sw1_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)150. 151. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT0!/n);152. return-EIO;153. 154. if(request_irq(IRQ_EINT1,keyboard_sw2_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)155. 156. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT1!/n);157. return-EIO;158. 159. if(request_irq(IRQ_EINT2,keyboard_up_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)160. 161. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT2!/n);162. return-EIO;163. 164. if(request_irq(IRQ_EINT3,keyboard_down_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)165. 166. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT3!/n);167. return-EIO;168. 169. if(request_irq(IRQ_EINT8,keyboard_left_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)170. 171. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT8!/n);172. return-EIO;173. 174. if(request_irq(IRQ_EINT9,keyboard_right_action,IRQF_SAMPLE_RANDOM,s3c2440_keyboard_action,dev)175. 176. printk(KERN_ERRmy_keyboard.c:CouldnotallocatekeyboardIRQ_EINT9!/n);177. return-EIO;178. 179. printk(KERN_INFO%ssuccessfullyloaded/n,s3c2440_keyboard_name);180. input_register_device(dev);181. return0;182. 183. /*184. *s3c2440my_keyboardmoduleexitfunction185. */186. staticvoid_exits3c2440_keyboard_exit(void)187. 188. disable_irq(IRQ_EINT0);189. disable_irq(IRQ_EINT1);190. disable_irq(IRQ_EINT2);191. disable_irq(IRQ_EINT3);192. disable_irq(IRQ_EINT8);193. disable_irq(IRQ_EINT9);194. free_irq(IRQ_EINT0,dev);195. free_irq(IRQ_EINT1,dev);196. free_irq(IRQ_EINT2,dev);197. free_irq(IRQ_EINT3,dev);198. free_irq(IRQ_EINT8,dev);199. free_irq(IRQ_EINT9,dev);200. input_unregister_device(dev);201. 202. module_init(s3c2440_keyboard_init);203. module_exit(s3c2440_keyboard_exit);2) 一个简单的上层应用程序,通过读取键盘对应的设备文件将input子系统上报的键盘事件打印出来cppview plaincopy1. /*2. *Copyright(c)2011ShenYunlong3. *4. *5. *Thisprogramisfreesoftware;youcanredistributeitand/ormodifyit6. *underthetermsoftheGNUGeneralPublicLicenseversion2aspublishedby7. *theFreeSoftwareFoundation.8. */9. #include10. #include11. #include12. #include13. #include14. #include15. #include16. #include17. #defineMY_DEBUG018. intmain()19. 20. char*dev=/dev/event1;21. structinput_eventievent;22. intretval;23. unsignedshorttype;24. unsignedshortcode;25. intvalue

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论