基于ARM嵌入式系统的触摸屏驱动程序开发.doc_第1页
基于ARM嵌入式系统的触摸屏驱动程序开发.doc_第2页
基于ARM嵌入式系统的触摸屏驱动程序开发.doc_第3页
基于ARM嵌入式系统的触摸屏驱动程序开发.doc_第4页
基于ARM嵌入式系统的触摸屏驱动程序开发.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

西安文理学院机械电子工程系本科毕业设计(论文)题 目 基于arm嵌入式系统的触摸屏驱动程序开发专业班级 08级自动化(2)班 学 号 08103080227 学生姓名 赵凯 指导教师 雷俊红 设计所在单位 自动化 2012年5月西安文理学院本科毕业设计(论文)评阅教师评分表学生姓名赵凯学 号08103080227专 业自动化班 级08级(2)班毕业设计(论文)题目基于arm嵌入式系统的触摸屏驱动程序开发设计(论文)起止时间 2012年 1月 10日至 2012年 5月 12日评阅教师评语:(应从选题、写作规范、问题论证或说明效果等方面对论文进行评述)建议成绩:评阅教师签名: 年 月 日西安文理学院本科毕业设计(论文)答辩记录学生姓名赵凯学 号08103080227专业名称自动化答辩时间2012年5月 12日答辩地点b0209指导教师雷俊红题 目基于arm嵌入式系统的触摸屏驱动程序开发答辩小组成 员姓 名职 称姓 名职 称提问及回答情况记录: 记录人签字: 年 月 日答辩成绩:答辩小组组长签名: 年 月 日毕业论文成绩答辩委员会认定成绩毕业论文等级系(院)答辩委员会意见:负责人签名: 年 月 日注:1、毕业论文成绩=指导教师成绩40%评阅教师成绩20%答辩成绩40%;2、答辩委员会认定成绩是根据该生毕业设计期间的表现及该专业整体论文情况的综合评定成绩。3、论文等级分优秀(90分)、良好(8089分)、中等(7079分)、及格(6069分)、不及格(程序-附件-通讯”中,选择运行该程序,一般会弹出提示窗口,询问你是否将hyperterminal作为默认的telnet程序,此时选择“否”。 接下来弹出来的窗口,选择“取消”。 此时系统提示“您确定要取消吗?”,选择“是”,接着点击提示窗口的“确定”,进入下一步。 超级终端会要求你为新的连接取个新的名字,我在配置的时候取的是“tty”。 当你命名完以后,又会跳出一个对话框,选择开发板的串口,我选择的是串口4. 最后一步,最重要的一步,数据流控制必须选择“无”,另外板子的串口波特率设为115200。 当所有的参数都设置好后,超级终端就配置好了。3.3 配置网络文件系统nfs服务 在配置nfs服务之前,先使用查看一下linux系统在安装的时候是否已经安装了nfs服务,方法如下:输入命令setup,然后在出现的蓝色窗口中选择system services,进入后,如果看到选项前的中括号有“*”,表示已经被选中,如果没有,就表示没选中;现在选中nfs服务,去掉iptables,然后保存退出。 接下来运行命令 #gedit /etc/exports 在打开的nfs服务的配置文件中添加以下内容: /home/share 30(rw,sync,no_root_squash) 其中:/home/share表示nfs共享目录,它可以作为开发板的根文件系统30是开发板的ip地址,注意ip地址前有空格。(这里的ip地址可以用*代替,表示所有的客户机都可以挂载次 目录)rw表示挂载次目录的客户机多该目录有读写的权力sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘no_root_squash表示允许挂载次目录的客户机有该主机的root身份然后保存退出。最后使用/etc/init.d/nfs stop和 /etc/init.d/portmap stop命令停止nfs服务和端口监听服务,再用/etc/init.d/nfs start和 /etc/init.d/portmap start命令重新启动nfs服务和端口监听服务使之配置生效。第四章 嵌入式设备驱动程序开发4.1编写触摸屏设备驱动程序4.1.1 linux输入子系统介绍在linux中,输入子系统是由输入子系统设备驱动、输入子系统核心层(input core)和事件输入层(event handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交层给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。下面用图形来描述一下这三者的关系吧!图4.1 输入子系统结构图4.1.2驱动程序的实现原理与步骤 (1).驱动程序的实现原理在linux中,input设备用input_dev结构体描述,定义在input.h中。设备驱动的实现步骤:在驱动模块加载函数中设置input设备支持input子系统的哪些事件;将input设备注册到input子系统中;在input设备发生输入操作时,提交所发生的事件及对应的键值/坐标等状态。 (2).驱动程序实现过程建立触摸屏程序ts_driver.c,首先实现加载和卸载部分,在驱动加载部分:启用adc所需要的时钟、映射io口、申请中断(触摸屏中断和adc中断)、初始化输入设备、将输入设备注册到输入子系统中。图4.2 程序框架图源程序见附录a4.2 运行程序4.2.1 烧写程序将编译好的可执行文件下载到目标板,我通过在网络上收集了资料总结了以下四种方式:第一种:使用u盘或者其他可移动设备第二种:通过nfs直接运行第三种:通过串口下载文件到开发板第四板:通过网络下载文件到开发板(1) 使用u盘方法:先把编译好的可执行程序复制到u盘,在u盘插到目标板上并挂载,然后把程序拷贝到目标板的可执行目录/bin。(2) 通过网络文件系统nfs执行方法:前提是先按照3.3节搭建好nfs服务器系统,然后在超级终端中输入命令#mount t nfs o nolock 2:/home/share /mnt/nfs2为宿主机的ip地址,/home/share是宿舍机上的共享目录;/mnt/nfs是目标机上的共享目录。这样就挂载成功了,只要把需要执行文件复制到共享文件中,然后再目标机的超级终端上执行即可。第五章 结束语本次毕业设计顺利完成了触摸屏驱动开发的设计,完成了毕业设计的基本要求。在本次毕业设计中,nfs服务系统的配置是最基本的东西,虽然从理论上来说不是太难,但是实际操作时遇到了不少问题,不过通过在网上找寻的资料和同老师、同学的交流下,得到了解答;在设备驱动的开发中,虽然也很难,但是这些东西都是框架式的,网上很多,只需修改一下,满足自己的硬件平台即可。应用相当来说不是太难,只要注意到一些特有的函数,库文件,问题不是太大。通过这次毕业设计,对linux中的一些常用命令又回顾了一遍,并且也加深了印象,对linux下设备驱动程序的开发也有了基本的认识,感觉学到了很多东西,对不会的知识有一定的了解;对熟悉、学过的知识又复习了一遍,理解更加深刻,也加深了印象。接下来,我对在这次课程设计中遇到的问题和解决方法进行个总结:1. 目标板和宿主机不能ping通解决方法:(1) 看交叉网线是否接触正常 (2) 检查开发板上的网口驱动是否挂载 (3) 开发板的ip地址必须要和宿主机的ip地址在一个ip段内,例如192.168.1.*和192.168.1.*就在一个ip段内 (4) 关闭linux的防火墙2. 使用nfs共享目录时,挂载共享目录不成功解决方法:(1) 检查目标板和宿主机是否能ping通(这是基础)(2)查看nfs服务和端口监听服务的状态(命令分别是/etc/init.d/nfs status /etc/init.d/portmap status),如果是关闭请打开(命令分别是/etc/init.d/nfs start /etc/init.d/portmap start)3. 由于对linux内核不熟悉,所以在分析触摸屏的驱动代码时,遇到了不少问题解决方案:(1) 通过对网上的教学视频和资料的学习,初步了解了其构架 (2) 分析代码中所用到的函数和宏定义 4. makefile的编写问题,经常出错 这个问题不好解决,因为makefile文件的编写比较难,不是短时间能解决的。在课程设计中,大的问题基本上就遇到了这么多,还有很多小问题,在谷歌上一搜就有,关于技术方面的问题,最好是在谷歌上搜,感觉比百度全。总之,我相信有付出就有回报!致谢本课题的研究探讨以及论文撰写一直都是在雷俊红老师的细心指导下进行的,可以说其中的每个环节都倾注了雷俊红老师的智慧和心血,在此表示感谢。参考文献1杜春雷 . arm体系结构与编程 . 北京:清华大学出版社,2003.2张思民 . 嵌入式系统设计与应用 . 北京:清华大学出版社,2008.3冯国进 . 嵌入式linux驱动程序设计从入门到精通 . 北京:清华大学出版社,2008.4马忠梅等 . arm & linux嵌入式系统教程 . 北京:北京航空航天大学出版社,20045魏永明等译 . linux设备驱动程序 . 北京:中国电力出版社,20066张晓林等 . 嵌入式系统设计与实践 . 北京:北京航空航天大学出版社,2006附录a 驱动源程序驱动源程序 /* ts_driver.c*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define s3c2410tsversion0x0101#define wait4int(x) (x)= 2; yp = 2; input_report_abs(dev, abs_x, xp); input_report_abs(dev, abs_y, yp); input_report_key(dev, btn_touch, 1); input_report_abs(dev, abs_pressure, 1); input_sync(dev); xp = 0; yp = 0; count = 0; iowrite32(s3c2410_adctsc_pull_up_disable | autopst, base_addr+s3c2410_adctsc); iowrite32(ioread32(base_addr+s3c2410_adccon) | s3c2410_adccon_enable_start, base_addr+s3c2410_adccon); else count = 0; input_report_key(dev, btn_touch, 0); input_report_abs(dev, abs_pressure, 0); input_sync(dev); iowrite32(wait4int(0), base_addr+s3c2410_adctsc);if (ownadc)ownadc = 0;up(&adc_lock); static struct timer_list touch_timer =timer_initializer(touch_timer_fire, 0, 0);static irqreturn_t stylus_updown(int irq, void *dev_id)unsigned long data0;unsigned long data1;int updown;if (down_trylock(&adc_lock) = 0)ownadc = 1;data0 = ioread32(base_addr+s3c2410_adcdat0);data1 = ioread32(base_addr+s3c2410_adcdat1);updown = (!(data0 & s3c2410_adcdat0_updown) & (!(data1 & s3c2410_adcdat0_updown);if (updown)touch_timer_fire(0);elseownadc = 0;up(&adc_lock);return irq_handled;static irqreturn_t stylus_action(int irq, void *dev_id)unsigned long data0;unsigned long data1;if (ownadc)data0 = ioread32(base_addr+s3c2410_adcdat0);data1 = ioread32(base_addr+s3c2410_adcdat1);xp += data0 & s3c2410_adcdat0_xpdata_mask;yp += data1 & s3c2410_adcdat1_ypdata_mask;count+;if (count (1evbit0 = bit(ev_syn) | bit(ev_key) | bit(ev_abs);dev-keybitbits_to_longs(btn_touch) = bit(btn_touch);input_set_abs_params(dev, abs_x, 0, 0x3ff, 0, 0);input_set_abs_params(dev, abs_y, 0, 0x3ff, 0, 0);input_set_abs_params(dev, abs_pressure, 0, 1, 0, 0);dev-name = gt2440ts_name;dev-id.bustype = bus_rs232;dev-id.vendor = 0xdead;duct = 0xbeefdev-id.version = s3c2410tsversion;if (request_irq(irq_adc, stylus_action, irqf_shared|irqf_sample_random, gt2440ts_name, dev)printk(kern_err gt2440_ts.c: could not allocate ts irq_adc !n);iounmap(base_addr);return -eio;if (request_irq(irq_tc, stylus_updown, irqf_sample_random, gt2440ts_name, dev)printk(kern_err gt2440_ts.c: could not allocate ts irq_adc !n);iounmap(base_addr);return -eio;printk(kern_info %s successfully loadedn, gt2440ts_name);input_register_device(dev);return 0;static void _exit gt2440ts_exit(void)disable_irq(irq_adc);disable_irq(irq_tc);free_irq(irq_tc,dev);free_irq(irq_adc,dev);if (adc_clock)clk_disable(adc_clock);clk_put(adc_clock);adc_clock = null;input_unregister_device(dev);iounmap(base_addr);module_init(gt2440ts_init);module_exit(gt2440ts_exit);第41页附录b 英文资料how to design touch screens driveralthough touch screens are rapidly becoming more popular most developers have never created one before. here is a step by step design guide that leads you through the hardware and software required to make touch screens work the first time. touch screens are everywhere. industrial control systems, consumer electronics, and even medical devices are commonly equipped with touch-screen input. we use touch

温馨提示

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

评论

0/150

提交评论