




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linuxserialtouch设计总结概述:最近在做嵌入式 linux 下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把 linux 相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。如有任何问题请联系 ,转载请标明出处。系统资源:Linux:2.6.36UI:QT+TSLIB硬件资源不关心设计方法:有两种实现途径。1、是将要使用的串口单独拿出来,作为一个 platform 总线设备实现,在嵌入式平台mach文件里面, 加上串口中断号和寄存器首地址, 然后将这个串口注册成一个platform总线设备。 在驱动 probe 函数里面需要得到这个串口中断
2、号以及寄存器映射地址, 通过寄存器映射地址设置串口波特率,数据位,停止位等,通过中断号注册中断等,然后调用input_register_device 注册一个 input 设备。在中断里面得到外面触摸屏的数据,然后根据 inputtouch 协议上报触摸数据。这种方法实现简单明了,不需要和 linux 的 tty,serio 等打交道。但是要求知道串口硬件 spec,比如寄存器等,而且这个串口就只能给触摸屏使用了,不能作为 tty 使用。因为是嵌入式开发,因此很容易知道硬件 spec,而且嵌入式平台一旦确定,那么这个串口肯定就是给触摸屏使用了。因此在嵌入式平台上,推荐使用这个方法。2、是将串口
3、作为一个 serio 总线设备,利用 linux 内核提供 serio 总线驱动,通过设置对应的串口,调用 serport 提供的函数将串口当做 serio 总线设备,在驱动里面需要按照 serio 总线设备驱动的框架来实现,这方面的例子 linux 里面有很多,比如 touchright.c,在模块 init 函数里面调用 serio_register_driver 注册 serio 总线设备驱动,如果 serio 总线上对应的 serio 设备存在,就调用 connect 函数,在这个函数里面调用 input_register_device 注册一个 input 设备。具体驱动不再分析了,
4、很简单,相信各位都能看的懂。至此,两种方法都实现了串口触摸屏的驱动,讲到这里是不是就完了,非也,本文的重点还在后面,请看下面分析:第一种方法只要驱动模块被加载,就会在/dev/input 下面创建一个 eventx 节点,tslib 就能访问这个节点,获得触摸坐标,然后送给 qto第二种方法驱动模块加载后,并没有创建 eventx 节点,也就是说 connect 函数没有被调用,按照 linux 驱动模型来看,就是 serio 总线上还没有对应的 serio 设备,因此驱动加载时没有对应的设备,就不会调用 connect 函数,这时的串口还是作为一个 linuxtty 设备存在。我遇到的问题就
5、是 serio 驱动加载了,但是没有创建 eventx 节点,查找资料也只有一个说是要把 tty 设置成 N_MOUSE,然后读,说的不清楚,也不知道怎么实现,经过自己摸索,终于把问题解决了。Linux 启动后串口形式:Linux 一启动是将串口作为 tty 来设置的。看下的调用:start_kernelinit/main.c 大家对这个函数不陌生吧,linux 启动过程中重要的一个函数console_init();drivers/tty/tty_io.ctty_register_ldisc(N_TTY,&tty_ldisc_N_TTY);drivers/tty/tty_idisc.c给串口注
6、册一个 tty 链路层处理函数 ops。现在我们需要写一个上层的应用程序,对这个 tty 进行设置,需要设置波特率,数据位,停止位等,最重要的是要将这个 tty 设备设置成一个 serio 总线设备,然后把它注册在 serio 总线上,请看下面的代码:fd=open(device,O_RDWR|O_NOCTTY|O_NONBLOCK);if(fdflags,type-speed);ldisc=N_MOUSE;if(ioctl(fd,TIOCSETD,&ldisc)fprintf(stderr,inputattach:cantsetlinediscipline);returnEXIT_FAILU
7、RE;devt=type-type|(id8)|(extraops-open(tty)ld-ops 就是 serport 注册的 serport_ldiscstaticintserport_ldisc_open(structtty_struct*tty)drivers/input/serio/serport.c这个函数里面会创建一个 serport 结构体,并初始化至此,已经给串口增加了一个 N_MOUSE 的链路层,并且把链路层的处理函数也注册进去了。这个串口当前的链路层就是 N_MOUSE。目前为止串口还只是个 tty 设备,并没有注册到 serio总线上。继续看我们的应用程序:devt=
8、type-type|(id8)|(extraops-ioctl(tty,file,cmd,arg);staticintserport_ldisc_ioctl(structtty_struct*tty,structfile*file,unsignedintcmd,unsignedlongarg)设置to=type&0 x000000ff;serport-id.id=(type&0 x0000ff00)8;serport-id.extra=(type&0 x00ff0000)16;这里三个值一定要和 serio 总线驱动里面对应的值一致,serio 总线就是靠它们来给设
9、备和驱动建立联系的。调用read(fd,NULL,0);跟踪代码到内核层 tty_read:staticssize_ttty_read(structfile*file,char_user*buf,size_tcount,loff_t*ppos)(ld-ops-read)(tty,file,buf,count)这个 ld 就是 tty 当前的链路层结构,上面我们已经设置N_MOUSE 为 tty 的当前链路层,因此 ld-ops 就是 serport 注册的 serport_ldiscstaticssize_tserport_ldisc_read(structtty_struct*tty,str
10、uctfile*file,unsignedchar_user*buf,size_tnr)serio_register_port(serport-serio);serio_init_port(serio);serio_queue_event(serio,owner,SERIO_REGISTER_PORT);注册一个 serio 总线设备,关于 serio 总线,网络有很多资料介绍,这里就不说了。至此,我们的串口设备已经当做 serio 总线设备注册在 serio 总线上了,如果相应的驱动也在serio 总线上,就会进行设备和驱动的匹配,然后调用驱动里面的 connect 函数,在这个函数里面就会
11、创建 input 节点。我们的驱动和设备已经运行起来了,现在看看数据是如何传递的先看具体串口中断函数:我们以 altera_uart.c 为例:altera_uart_interruptaltera_uart_rx_chars(pp)tty_flip_buffer_push(port-state-port.tty);flush_to_ldisc(&tty-buf.work);disc-ops-receive_buf(tty,char_buf,flag_buf,count);disc-ops 就是 serport 注册的 serport_ldiscstaticvoidserport_ldisc_
12、receive(structtty_struct*tty,constunsignedchar*cp,char*fp,intcount)serio_interrupt(serport-serio,cpi,ch_flags);ret=serio-drv-interrupt(serio,data,dfl);drv-interrupt 就是我们驱动函数提供一个函数,它每次接受一个字符,在这个函数里面,接受到足够信息后,就能得到触摸屏坐标信息,然后通过 input_report 上报上去。看看数据处理流程图:总结:Dataflowandfunctioncallsinwritingandreading要想让基于 serio 总线驱动的用口触摸屏能正常工作,在 linux 内核需要加载驱动模块,ser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 银行数字化转型实施方案解析
- 钢结构安全操作培训题库
- 现代家长教育方式与实践指导
- 建筑电气工程施工质量验收规范检查表
- 企业跨文化管理及国际业务拓展
- 幼儿园防溺水安全管理措施
- 筏板马凳筋施工专项方案范本
- 企业节能减排实施年计划
- 网络营销策划书撰写技巧
- 起诉采购合同(标准版)
- 2025年高中语文必修上册第二单元大单元教学设计
- 2025年高考成人政治试题及答案
- 2025年护理质控标准题库及答案
- 2025年农作物植保员岗位技术基础知识考试题库附含答案
- 2025年长宁储备人才真题及答案
- 光子嫩肤课件讲解
- 人力资源中薪酬管理案例分析题及答案
- 采购业务审计培训
- 2025-2026学年冀美版(2024)小学美术二年级上册(全册)教学设计(附目录P284)
- 服装色彩构成课件
- 化工仪表检修与维护课件
评论
0/150
提交评论