Linux输入子系统及触摸屏驱动分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux输入子系统及触摸屏驱动分析

Linux输入子系统 前面章节讲解按键设备驱动,实际上,在Linux系统中,一种更值得推荐的实现这类设备驱动的方法是利用input子系统。Linux系统提供了input子系统,按键、触摸屏、鼠标都可以利用input接口函数来实现设备驱动。 input子系统体系结构 设备描述: 在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统那个已经完成了文件操作接口。驱动报告的事件经过InputCore和Eventhandler最终到达用户空间。 设备注册/注销: 注册输入设备的函数为: int input_register_device(struct input_dev *dev) 注销输入设备的函数为: void input_unregister_device(struct input_dev *dev) 驱动实现—事件支持 设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示: set_bit(EV_KEY, button_dev.evbit) struct iput_dev有两个成员,一个是evbit,一个是keybit。分别用来表示设备所支持的事件类型和按键类型。 事件类型: EV_RST Reset EV_REL 相对坐标 EV_MSC 其它 EV_SND 声音 EV_FF 力反馈 EV_KEY 按键 EV_ABS 绝对坐标 EV_LED LED EV_REP Repeat 驱动实现—报告事件: 用于报告EV_KEY、EV_REL、EV_ABS事件的函数分别为: void input_report_key(struct input_dev *dev, unsigned int code, int value) void input_report_rel(struct input_dev *dev, unsigned int code, int value) void input_report_abs(struct input_dev *dev, unsigned int code, int value) code: 事件的代码。如果事件的类型是EV_KEY,该代码code为设备键盘代码。代码值0-127为键盘上的按键代码,0x110-0x116为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_MIDDLE)为鼠标中键。其代码含义参看include/linux/input.h文件 value: 事件的值。如果事件的类型是EV_KEY,当按键按下时值为1,松开时值为0 input_sync()用于事件同步,它告知事件的接收者:驱动已经发出一个完整的报告。例如:在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下: input_report_abs(input_dev, ABS_X, x); //X坐标 input_report_abs(input_dev, ABS_Y,y); //Y坐标 input_report_abs(input_dev, ABS_PRESSURE,pres); //压力 input_sync(input_dev); //同步 实例分析 /*在按键中断中报告事件*/ static void button_interrupt(int irq, void *dummy, struct pt_regs *fp) { input_report_key(buton_dev, BTN_0, intb(BUTTON_PORT0)); input_report_key(buton_dev, BTN_0, intb(BUTTON_PORT1)); input_sync(button_dev); } static int _ _init button_init(void){ /*申请中断*/ if(request_irq(BUTTON_IRQ, button_interrupt, 0, “button”, NULL)) return –EBUSY; set_bit(EV_KEY, button_dev.evbit); //支持EV_KEY事件 set_bit(BTN_0, button_dev.keybit) ; //设备支持两个键 set_bit(BTN_1, buton.dev.keybit);

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档