- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux串口触摸屏设计总结
Linux serial touch 设计总结概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。mailto:如有任何问题请联系yxj_5421@163.com如有任何问题请联系yxj_5421@163.com,转载请标明出处。系统资源:Linux:2.6.36 UI:QT+TSLIB硬件资源不关心设计方法:有两种实现途径。是将要使用的串口单独拿出来,作为一个platform总线设备实现,在嵌入式平台mach文件里面,加上串口中断号和寄存器首地址,然后将这个串口注册成一个platform总线设备。在驱动probe函数里面需要得到这个串口中断号以及寄存器映射地址,通过寄存器映射地址设置串口波特率,数据位,停止位等,通过中断号注册中断等,然后调用input_register_device注册一个input设备。在中断里面得到外面触摸屏的数据,然后根据input touch协议上报触摸数据。这种方法实现简单明了,不需要和linux的tty,serio等打交道。但是要求知道串口硬件spec,比如寄存器等,而且这个串口就只能给触摸屏使用了,不能作为tty使用。因为是嵌入式开发,因此很容易知道硬件spec,而且嵌入式平台一旦确定,那么这个串口肯定就是给触摸屏使用了。因此在嵌入式平台上,推荐使用这个方法。是将串口作为一个serio总线设备,利用linux内核提供serio总线驱动,通过设置对应的串口,调用serport提供的函数将串口当做serio总线设备,在驱动里面需要按照serio总线设备驱动的框架来实现,这方面的例子linux里面有很多,比如touchright.c,在模块init函数里面调用serio_register_driver注册serio总线设备驱动,如果serio总线上对应的serio设备存在,就调用connect函数,在这个函数里面调用input_register_device注册一个input设备。具体驱动不再分析了,很简单,相信各位都能看的懂。至此,两种方法都实现了串口触摸屏的驱动,讲到这里是不是就完了,非也,本文的重点还在后面,请看下面分析:第一种方法只要驱动模块被加载,就会在/dev/input下面创建一个eventx节点,tslib就能访问这个节点,获得触摸坐标,然后送给qt。第二种方法驱动模块加载后,并没有创建eventx节点,也就是说connect函数没有被调用,按照linux驱动模型来看,就是serio总线上还没有对应的serio设备,因此驱动加载时没有对应的设备,就不会调用connect函数,这时的串口还是作为一个linux tty设备存在。我遇到的问题就是serio驱动加载了,但是没有创建eventx节点,查找资料也只有一个说是要把tty设置成N_MOUSE,然后读,说的不清楚,也不知道怎么实现,经过自己摸索,终于把问题解决了。Linux 启动后串口形式:Linux一启动是将串口作为tty来设置的。看下的调用:start_kernel init/main.c大家对这个函数不陌生吧,linux启动过程中重要的一个函数console_init(); drivers/tty/tty_io.c tty_register_ldisc(N_TTY, tty_ldisc_N_TTY); drivers/tty/tty_idisc.c给串口注册一个tty链路层处理函数ops。现在我们需要写一个上层的应用程序,对这个tty进行设置,需要设置波特率,数据位,停止位等,最重要的是要将这个tty设备设置成一个serio总线设备,然后把它注册在serio总线上,请看下面的代码:fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);if (fd 0) {fprintf(stderr, inputattach: %s - %s\n,device, strerror(errno));return 1;}setline(fd, type-flags, type-speed);ldisc = N_MOUSE;if (ioctl(fd, TIOCSETD, ldisc)) {fprintf(stderr, inputattach: cant set line discipline\n);return EXIT_FAILURE;}devt = type-type | (id 8) | (extra 16);if (ioctl(fd, SPIOCSTYPE, devt)) {fprintf(stderr, inputattach: cant set dev
文档评论(0)