资源预览内容
第1页 / 共34页
第2页 / 共34页
第3页 / 共34页
第4页 / 共34页
第5页 / 共34页
第6页 / 共34页
第7页 / 共34页
第8页 / 共34页
第9页 / 共34页
第10页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
嵌入式系统嵌入式系统课件课件1第九章 Keypad接口设计与驱动开发本章要点使用基本的逻辑器件,设计Keypad的外围电 路根据外围电路编写相应的驱动程序在驱动程序中使用等待队列、定时器嵌入式系统嵌入式系统课件课件29.1 最小硬件系统设计嵌入式系统和用户进行人机交互时,最基本的 输入设备是按键或者键盘。简单的应用可以选 用按键,比较复杂的应用可以选用键盘。不论是最简单的按键,还是比较复杂的键 盘,总的说来,都是通过0、1来代表按键状态 的变化。按键以0、1代表“断开”和“闭合” ,键盘以0、1的序列代表按键的键值。嵌入式系统嵌入式系统课件课件3通常,CPU获知按键状态变化的方式有两种 :查询式和中断式。当采用查询式时,CPU定时( 例如每隔0.2s)查询IO接口的状态,当IO接 口的状态有变化时,系统认为有按键被按下,并 读取键值。当采用中断式时,一般将按键电路连 接到一个逻辑器件,再将此逻辑器件输出端连接到CPU的中断输入引脚。当有按 键被按下时,与键盘电路相连的逻辑电路触发中 断,CPU执行中断服务程序将键值读入内存。嵌入式系统嵌入式系统课件课件4查寻方式电路简单,但是占用较多CPU资源 ;中断方式节省CPU资源,但电路稍复杂,并且 占用CPU中断资源。通常在嵌入式系统中,按照情况区别对待。 对于功能要求简单的应用场合,一般采用查询式 的按键电路,而对于功能要求复杂的应用场合, 一般采用中断式的键盘电路。本章节主要介绍查询式的按键电路设计和驱 动程序开发。 本章节所设计的简单键盘通过双向收发器和38译码器实现,如图9-1所示。双向收发器将Keypad电路连接到PXA255的数据总线,3-8译码器连接着地址总线和异步静态存储器的片选信号nCS2,它的输出充当双向收发器的使能信号,由KEY-CS#表示。9.1.1 Keypad接口设计5嵌入式系统嵌入式系统课件课件嵌入式系统嵌入式系统课件课件63-8译码器使能nCS2#SA-D0:7SA-A20:22PXA255KEY-CS#键盘双向 收发器使能图9-1 键盘与处理器接口框图其它设备Keypad电路中采用了标准的3-8译码器74LCXl38。 3-8译码器的工作原理。键盘的使能电路如下图:9.1.2 Keypad电路原理7嵌入式系统嵌入式系统课件课件KEY-CS#片选信号连接着双向收发器的使 能端,具体电路见图9-3:图9-3 键盘的电路原理图8嵌入式系统嵌入式系统课件课件嵌入式系统嵌入式系统课件课件9由图9-3可以看到,当KEY-CS#片选信号为低电 平时,按键信息透过双向收发器74LCX245送到 PXA255数据线SA-DOSA-D7。当没有键按下时,SA-DOSAD7读入的键值 为“0xFF”。 当有键按下时,SA-D0SA-D7读入的键值对 应的位为“0”。KEY-CS对应着3-8译码器的Y2脚,当该脚使能时 ,它对应的输入SA-A22:20为010, 也就是地址 0x00200000。由于SA-CS2#的物理地址是0x08000000 ,故最终KEY-CS信号的物理地址是: 0x08000000+0x00200000=0x08200000。嵌入式系统嵌入式系统课件课件10在驱动程序中,假定KEY-CS的物理地址 0x08200000对应的虚地址为0xf8200000。由上面的 介绍可知,当KEY-CS#片选信号为低电平使能时,数 据通过74LCX245传送到数据总线上,因而可以用如 下宏定义读键值(也就是从KEY-CS对应的地址读取数 据):#define KEY_CS(*(volatile unsigned short *)(0xf8200000)其中,volatile关键字是一种类型修饰符,用 它声明的变量不会被缓存在寄存器中,也不会对它 做常量合并、常量传播以及读/写优化等。在嵌入式 Linux中,与I/O存储器访问相关的变量都应加 volatile类型修饰符。 嵌入式系统嵌入式系统课件课件11加volatile修饰符是为了保证读取数值的正确 性。因为KEY-CS地址的数据是随时可能发生变化的 ,所以每次使用它时,必须从地址中直接读取。如 果不使用volatile声明,则编译器生成的汇编代码 会做一些优化。编译器如果发现有连续两次从同一 地址读取数据的代码,而它们之间没有对该地址进 行写操作的代码,那么编译器会自动地把上次读取 的数据放在寄存器中作为第二次读取的数据,而不 是重新从该地址里面读取。这样一来,读取的键值 就不是当前最新的键值,因此不能对这类的I/O操作 进行优化。嵌入式系统嵌入式系统课件课件129.2 Keypad软件驱动原理在驱动程序中,注册函数、撤销函数、虚 拟文件接口函数及其结构体构成了驱动程序的 基本框架。 本节将首先介绍注册函数、撤销函数、内 核的接口函数及其结构体,然后介绍接口函数 的具体功能。这些函数中最核心的部分是读取 键值的函数。在加载模块时,首先运行的是内核模块的注册函数 。它的功能包括向内核注册设备以及变量的初始化。内 核模块的注册函数如下: 9.2.1 内核模块的注册和撤销13嵌入式系统嵌入式系统课件课件与注册相对应的就是撤销。内核模块的注销函数的 主要功能是释放资源和注销设备。内核模块的注销函数 如下:14嵌入式系统嵌入式系统课件课件Keypad是字符型设备,通常直接使用 file_operations接口。Keypad设备接口函数的定义:9.2.2 虚拟文件系统与硬件驱动的接口在应用程序中,可以通过调用open()、read()、 close()等通用函数,进而调用这里定义的接口函数, 完成某种功能。 15嵌入式系统嵌入式系统课件课件设备打开操作接口函数可以完成两大操作,一是完成必 要的设备初试化,而是设备引用计数加1。设备的初试化是由read_xy()函数完成的, read_xy()函 数有2个子函数:new_data()和Keypad_starttimer() 。 它 们分别负责获取键值和开启内核定时器。具体如下: 9.2.3 设备打开操作接口函数16嵌入式系统嵌入式系统课件课件读取设备的函数比较复杂,涉及等待队列、 内核定时器等机制。函数的主要作用就是从缓冲区中取出键值。 该功能主要通过调用get_data()实现,然后通过 copy_to_user()函数复制键值到用户数据区。具体见P226:9.2.4 设备读取操作接口函数17嵌入式系统嵌入式系统课件课件设备关闭接口函数可实现3个功能:关闭设备异步 通知;设备计数器减1;删除定时器信号中断;最后函 数返回0。9.2.5 设备关闭操作接口函数18嵌入式系统嵌入式系统课件课件获取键值子函数new_data()从KEY_CS对应的地址读 入键值,存人环形缓冲区buf。环形缓冲区的写指针是head,读指针是tail。cur_data.click=1;1代表有键按下,0则代表没有。cur_data.status=x;x代表被按下的键。具体程序见P227。9.2.6 获取键值子函数19嵌入式系统嵌入式系统课件课件每读出一个缓冲区,读出指针tail就加1。代码如下:9.2.7 读缓冲区子函数20嵌入式系统嵌入式系统课件课件在Keypad的驱动程序中,对键盘键值的获取是以0.2 秒为周期执行的,需要用到内核定时器。源代码如下:9.2.8 内核定时器的使用21嵌入式系统嵌入式系统课件课件配置timer_list结构体可以完成“在未来某一 个特定时刻执行某个特定任务”的功能。该结构在 includelinuxtimer.h头文件中定义。timer_list的结构如下:22嵌入式系统嵌入式系统课件课件在本驱动程序中,首先通过init_timer(timer) 初始化定时器结构,配置timer结构体的function和 expires;最后通过使用add_timer(printf(“Good Bye”);33嵌入式系统嵌入式系统课件课件OVER !34嵌入式系统嵌入式系统课件课件
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号