第9章 设备驱动程序开发实例.ppt_第1页
第9章 设备驱动程序开发实例.ppt_第2页
第9章 设备驱动程序开发实例.ppt_第3页
第9章 设备驱动程序开发实例.ppt_第4页
第9章 设备驱动程序开发实例.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、第9章设备驱动程序开发实例,教材:嵌入式系统设计与应用 作者:张思民 出版:清华大学出版社,本章要点,1、键盘驱动程序的设计 2、步进电机驱动程序的设计 3、直流电机驱动程序的设计 4、GPIO设备驱动程序设计 5、网络接口设备驱动程序的设计,9.1 键盘驱动程序的设计,9.1.1 键盘原理介绍,1、按键原理,键盘电路,点触按键产生抖动,2矩阵键盘原理,9.1.2 键盘驱动程序设计思路分析,下面以一个64按键的键盘为例来讲述键盘驱动程序的设计方法。 该键盘有四列,其地址分别为:0 xfe、0 xfd、0 xfb、Oxf7。该键盘的六行地址分别为:0 xfe、0 xfd、0 xfb、Oxf7、0

2、 xef、0 xdf。各行按键的地址分布排列如表9.1所示:,表9.1各按键的地址分布排列,1、头文件,#include #include #include #include #include #include #include #include #include #include ,2、处理设备I/O端口的数据的几个重要函数,(1)ioremap( )函数 函数ioremap( )的作用是把一个物理内存地址点映射为一个内核指针,实现从物理地址到内核空间虚拟地址的映射。 (2)inb( )函数 函数inb()作用是从端口读取一个字节,这个函数的返回值就是从这个端口读取到的数据。,(3)outb

3、( )函数 函数outb(,)的作用是向端口发送数值。,3、设备初始化,定义设备驱动程序的初始化函数KEYBOARD_CTL_init( ),在该函数中实现向系统注册设备号、设备名称和初始化寄存器。 (1)向系统注册设备 (2)初始化寄存器 (3)初始化函数KEYBOARD_init( ) 4、驱动程序的file-operation数据结构 5、键盘扫描的接口函数,【例9-1】编写一个64按键的键盘驱动程序。,源程序见教材,9.1.4 键盘用户应用程序设计,1、键盘用户应用程序设计分析 (1)获取设备驱动程序的文件描述符 (2)调用设备驱动程序中的read( )方法,读取检测到的按键数据值 (

4、3)在用户应用程序中还用到一个函数usleep( ),usleep()函数的作用是:休眠若干微秒,延迟执行的时间,起到去除抖动的作用。,9.2步进电机驱动器设计,9.2.2 嵌入式系统控制步进电机,9.2.3步进电机驱动程序设计,1、头文件 设计键盘驱动程序,要使用Linux系统头文件,其顶部位于 /*ARM_Linux。,2、设备初始化,定义初始化函数BJDJ_init( ),在该函数中实现向系统注册设备号、设备名称和初始化寄存器。 (1)向系统注册设备 ret = devfs_register_chrdev(BJDJ_MAJOR, BJDJ, ,(2)初始化通用I/O端口GPIO,对通用I

5、/O端口GPIO的GPDR和GAFR寄存器设置初值 : GPSR为置位寄存器,当1时,电机开始旋转。 GPCR为复位寄存器,当1时,电机停止转动。 GPDR为方向寄存器, 1为输出,0为输入。 GAFR为第二功能寄存器,,3、定义设备数据结构,由于本驱动程序只需对设备IO端口进行控制处理,故在设备驱动的数据结构中仅定义了一个ioctl( )接口函数: static struct file_operations bjdj_ops = ioctl:bjdj_ioctl, ;,4、对电机设备控制的ioctl( ) 函数,(1)定义数组bit ,接收来自用户应用程序的指令。 bit0 = (cmd ,

6、(2)控制转动角度和方向,由用户应用程序发送1组cmd指令:0 x07、0 x0b、0 x0d、0 x0e,数组 bit 得到4组不同的数值,从而控制步进电机转动角度和方向。 若要正转:GPSR为置位寄存器,当1时,步进电机开始旋转。 若要停止:GPCR为复位寄存器,当1时,步进电机停止转动。,(3)为控制电机旋转,对数组赋值,switch(bit0) case 1:/*将GPSR1的第20位设置为1*/ GPSR1 |= (0 x1 20); break; case 0:/*将GPCR1的第20位设置为1*/ GPCR1 |= (0 x1 20); break; default:return

7、 0; ,9.2.4步进电机用户应用程序设计,打开设备文件获取文件描述符 fd=open(/dev/BJDJ,O_RDWR); 然后,通过选择“1”、“2”及其他数值来控制电机旋转状况。,9.3 直流电机驱动程序设计,9.3.1 直流电机驱动程序,1、设备初始化 (1)向系统注册设备 我们定义电机的主设备号宏符号名为ZLDJ_MAJOR,设备名称为zldj_drv,设备的结构体为,(2)设备初始化函数 (3)驱动程序的file-operation数据结构 static struct file_operations ZLDJ_ops = ioctl: ZLDJ_ioctl, ;,2、控制直流电机

8、转动和停止的接口函数,定义控制直流电机转动和停止的接口函数ioctl( )。主要是设置寄存器GPSR与寄存器GPCR的值。 GPSR为置位寄存器,当取值1时,电机开始旋转。 GPSR2 |= (0 x1 20); /电机正转 GPSR2 |= (0 x1 18); /电机反转 GPCR为复位寄存器,当取值1时,电机停止转动。 GPCR2 |= (0 x1 20); /电机正转停止 GPCR2 |= (0 x1 18); /电机反转停止,9.3.2 直流电机用户应用程序,(1)获取直流电机驱动程序的文件描述符 fd=open(/dev/zldj_drv,O_RDWR); (2)调用设备驱动程序中

9、的ioctl( )方法,向电机发出控制指令: ioctl(fd,0 x1,1000);,9.4通用I/O接口驱动程序设计,通用IO接口(General Purpose IO,GPIO)是嵌入式系统中一种非常重要的IO接口。它具有使用灵活、可配置性好、硬件代价小等优点,在嵌入式系统中广泛应用。,9.4.1GPIO设备驱动,GPIO属于字符设备,其驱动可以归类为Linux设备驱动的字符设备驱动。开发这类设备驱动,要为设备分别设计设备驱动程序和用户应用程序,其设备驱动程序的一般方法与步骤与上节内容是相同的。,9.4.2PXA270的GPIO端口简介,PXA270处理器在设计上有121个复用功能输入输

10、出GPIO端口的引脚,但其中的GPIO119与GPIO120两端口没被引出,因此,实际可用的只有119个引脚,它们是GPIO0GPIO118,其端口名为GPIO120:0。 PXA270处理器的每一个GPIO端口都可以由软件设置来满足各种系统配置和设计需求。,9.4.2PXA270的GPIO端口简介,1、GPIO端口控制功能 (1)状态寄存器(GPLRx) 状态寄存器GPLR可以监视每一个GPIO引脚的状态(输入或输出),GPIO有4个GPLR状态寄存器:GPLR0GPLR3。,9.4.2PXA270的GPIO端口简介,1、GPIO端口控制功能 2)控制寄存器(GPSRx,GPCRx) GPI

11、O有4个GPSR控制寄存器和4个GPCR控制寄存器,它们分别是:GPSR0GPSR3和GPCR0GPCR3。如果将一个端口设置为输出端口,数据就能被写到控制寄存器的对应位。控制寄存器GPSR对每一个引脚进行位设置来定义其功能,控制寄存器GPCR对每一个引脚的功能进行清零。,9.4.2PXA270的GPIO端口简介,1、GPIO端口控制功能 (3)端口配置寄存器(GPDRx) 在PXA270处理器中,大部分引脚都是可复用的。所以,对每一个引脚要定义一个具体功能。端口配置寄存器GPDR为每一个引脚定义输入或输出的功能。GPIO有4个GPDR端口配置寄存器:GPDR0GPDR3。,9.4.2PXA2

12、70的GPIO端口简介,1、GPIO端口控制功能 4)上升沿/下降沿监视寄存器(GPERx,GFERx) 上升沿/下降沿监视寄存器控制着每个端口的上升沿/下降沿监视的功能状态。上升沿监视寄存器GPER对应每个端口处于监视上升沿状态;下降沿监视寄存器GFER对应每个端口处于监视下降沿状态。GPIO有4个上升沿监视寄存器GPER和4个下降沿监视寄存器GFER,它们分别是:GPER0GPER3和GFER0GFER3。,部分GPIO寄存器定义,GPSR:置位寄存器。 GPCR:复位寄存器。 GPDR;方向寄存器,设置为1表示输出,为0则表示输入。 GPLR:监视引脚状态。 GAFR:第二功能寄存器。,

13、部分GPIO寄存器定义,9.4.3编写LED设备驱动程序,【例8-4】编写一个PXA270开发板上连接在GPIO端口的LED驱动程序,使开发板上的发光二极管每隔1秒钟闪烁一次。,1、LED电路分析,编写驱动程序及应用程序控制GPIO96的电平。其电路原理图如图所示,当引脚为低电平时,电路导通,发光二极管发亮;当引脚为高电平时,电路截止,发光二极管不亮。,2、编写LED驱动程序,LED驱动程序见教材,将其保存为:led_drv.c文件。 其核心语句为ioctl接口函数 : switch (cmd) case LED_ON : GPCR3 |= 0 x1;break; case LED_OFF:

14、GPSR3 |= 0 x1;break; ,复位寄存器设置为1,输出低电平,二极管点亮,置位寄存器设置为1,输出高电平,二极管不亮,9.4.4编写LED用户应用程序,在编写用户应用程序过程中,考虑通过接口open()函数打开设备,再通过接口ioctl()函数来实现对LED的控制功能。其调用关系如图8.5所示:,在用户应用程序中,其核心语句为:接口ioctl()的参数在0、1之间交替取值,使得驱动程序中第31、32行的状态交替出现,控制GPIO的输出电平高低变化,从而使发光二极管LED按照一定的时间间隔亮灭,实现闪烁的效果。 即:当LED_OFF代表数值0,LED_ON代表数值1时 ioctl(

15、fd,LED_OFF); sleep(1);/休眠1秒钟 ioctl(fd,LED_ON); sleep(1); /休眠1秒钟,9.5网络接口设备驱动程序设计,在嵌入式系统中,网络接口的实现方式通常是:嵌入式微处理器+网络接口芯片(网卡芯片)。,9.5.1 以太网数据帧传输原理,1、以太网的体系结构,2、以太网的工作原理,当以太网中的一台主机要传输数据时,它将按如下步骤进行: (1)侦听信道上收否有信号在传输。如果有的话,表明信道处于忙状态,就继续侦听,直到信道空闲为止。 (2)若没有侦听到任何信号,就传输数据。 (3)传输的时候继续侦听,如发现冲突则执行退避算法,随机等待一段时间后,重新执行

16、步骤1(当冲突发生时,涉及冲突的计算机会返回到侦听信道状态)。,3、数据帧的结构,以太网的帧是数据链路层的MAC子层封装组成的。在该层将要发送的数据加上帧头和帧尾成为可以被数据链路层识别的数据帧(成帧)。,4、寻址,网卡安装于站点内部并提供6字节(48位)的物理地址,该地址通常称为MAC地址。以太网的地址是6字节的,用十六进制书写并用连字符将它们分割开。如图9.14所示。,5、基于DM9000的以太网数据帧传输过程,使用DM9000作为以太网的物理层接口,它的基本工作原理与上述以太网的原理相同。当需要发送数据时,先要侦听网络线路。如果线路忙,它就等到线路空闲为止,否则,立即发送该数据帧。,9.5.2网络设备驱动程序的框架,1、数据结构,在网络驱动程序部分主要有二个数据结构,一个net_device,另一个是是sk_b

温馨提示

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

评论

0/150

提交评论