第七章嵌入式Linux设备驱动程序开发_第1页
第七章嵌入式Linux设备驱动程序开发_第2页
第七章嵌入式Linux设备驱动程序开发_第3页
第七章嵌入式Linux设备驱动程序开发_第4页
第七章嵌入式Linux设备驱动程序开发_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章嵌入式第七章嵌入式Linux设备驱动程序开发设备驱动程序开发目录目录GPIO字符设备驱动程序设计字符设备驱动程序设计本章导读本章导读A/D转换器驱动程序设计转换器驱动程序设计IC卡驱动程序设计卡驱动程序设计内核驱动程序设计内核驱动程序设计触摸屏驱动程序触摸屏驱动程序嵌入式嵌入式Linux的设备管理的设备管理音频驱动程序设计音频驱动程序设计设备驱动模块化编程设备驱动模块化编程目录目录本章导读本章导读能力目标:能力目标:了解嵌入式了解嵌入式Linux的设备驱动开发的一般流程;的设备驱动开发的一般流程;掌握设备驱动模块化编程;掌握设备驱动模块化编程;了解了解GPIO字符设备驱动程序设计过程;字

2、符设备驱动程序设计过程;掌握掌握A/D转换器驱动程序设计方法;转换器驱动程序设计方法; 掌握掌握IC卡驱动程序设计方法;卡驱动程序设计方法;熟悉内核驱动熟悉内核驱动-触摸屏驱动程序设计;触摸屏驱动程序设计;熟悉音频驱动程序设计方法熟悉音频驱动程序设计方法-1-学习导航:学习导航:本章是对基于本章是对基于ARM9硬件平台的硬件平台的Linux嵌入式系统的设备驱动开发的整个流嵌入式系统的设备驱动开发的整个流程的相关概念、基础知识和一般应用的综述。在章节中简单介绍了程的相关概念、基础知识和一般应用的综述。在章节中简单介绍了Linux嵌入式系统的设备驱动开发中的常用数据结构、设备号、设备驱嵌入式系统的

3、设备驱动开发中的常用数据结构、设备号、设备驱动模块加载函数和系统调用的实现方法动模块加载函数和系统调用的实现方法open、read等的视线。等的视线。基于ARM9的Linux嵌入式系统驱动程序的开发Linux设备驱动程序的加载和卸载Linux设备驱动程序的数据结构定义File_operations 中的函数实现,如:open、write等测试程序的开发-2-知识框架:知识框架:本章知识内容为基于本章知识内容为基于ARM9的的Linux嵌入式系统的设备驱动的开发的嵌入式系统的设备驱动的开发的概念、流程、常见函数、开发过程中涉及的硬件设备等。概念、流程、常见函数、开发过程中涉及的硬件设备等。Lin

4、ux嵌入式系统的设备管理Linux设备驱动的模块化编程Linux设备驱动的中断Linux设备驱动的方法实现Linux嵌入式系统的模块下载-3-嵌入式嵌入式Linux的设备管理的设备管理嵌入式系统的应用范围很广,它的处理过程可以简单的概括为:获嵌入式系统的应用范围很广,它的处理过程可以简单的概括为:获取信息、处理信息、输出结果。取信息、处理信息、输出结果。此处的输入信号可以使模拟量,也可以是数字量,具体的处理操作此处的输入信号可以使模拟量,也可以是数字量,具体的处理操作根据应用的不同而不同,而输出结果也各不相同。与输入输出信号对应根据应用的不同而不同,而输出结果也各不相同。与输入输出信号对应的设

5、备,称为输入输出设备。的设备,称为输入输出设备。因为嵌入式系统的这些外部设备随其具体应用而不同,所以在操作因为嵌入式系统的这些外部设备随其具体应用而不同,所以在操作系统内部,不提供相关设备的具体操作。系统内部,不提供相关设备的具体操作。-4-7.1.1 设备驱动和文件系统的关系设备驱动和文件系统的关系在在Linux中一个设备可以看做是一个文件系统,中一个设备可以看做是一个文件系统,Linux对设备的访问,对设备的访问,就是通过文件系统来实现的。就是通过文件系统来实现的。文件系统层是文件系统层是Linux从从Unix中继承而来的。文件系统是中继承而来的。文件系统是Linux操作系统操作系统的重要

6、组成部分,系统内核通过文件系统,在硬件上构造出结构化的层次。的重要组成部分,系统内核通过文件系统,在硬件上构造出结构化的层次。Linux支持多种的文件类型,从最早的支持多种的文件类型,从最早的Linux文件系统文件系统Minix,专门为,专门为Linux 设计的文件系统设计的文件系统ext2,又称扩展文件系统,到后来,又称扩展文件系统,到后来FAT、JFFS2、ext3和和ext4等。在等。在Linux中不同的文件类型,有不同的数据组织和集合方式。中不同的文件类型,有不同的数据组织和集合方式。-5-在在Linux中的每个介质上都可定义一个或者多个文件系统,每个文件系中的每个介质上都可定义一个或

7、者多个文件系统,每个文件系统由逻辑块序列组成,一个逻辑空间一般可划分为几个用途各不相同的部分,统由逻辑块序列组成,一个逻辑空间一般可划分为几个用途各不相同的部分,引导块、超级块、索引节点和数据区等。引导块、超级块、索引节点和数据区等。l引导块是文件系统的头,用以存放引导程序,通常为一个扇区;引导块是文件系统的头,用以存放引导程序,通常为一个扇区;l超级块是文件系统中,用于记录文件系统的管理信息;超级块是文件系统中,用于记录文件系统的管理信息;l索引节点是一个文件或目录的根节点;索引节点是一个文件或目录的根节点;l数据区主要用于存放文件数据或者管理数据。数据区主要用于存放文件数据或者管理数据。

8、设备驱动程序以文件的形式嵌入到内核的文件系统中,它的主要功能包设备驱动程序以文件的形式嵌入到内核的文件系统中,它的主要功能包括自动配置并初始化程序,执行功能请求的子程序等。括自动配置并初始化程序,执行功能请求的子程序等。-6-7.1.2 设备类型设备类型在在Linux系统中将设备分成三种基本类型,分别是:字符设备、块设备和系统中将设备分成三种基本类型,分别是:字符设备、块设备和网络设备。网络设备。字符设备:是通过数据字节流来进行访问的,类似文件的访问。在字符设备:是通过数据字节流来进行访问的,类似文件的访问。在Linux系统中所有能够象字节流一样访问的设备都可以通过字符设备来实现,它们系统中所

9、有能够象字节流一样访问的设备都可以通过字符设备来实现,它们被映射为文件系统中的节点,通常保存在目录被映射为文件系统中的节点,通常保存在目录/dev/下,使用下,使用chrdevs来维护。来维护。字符设备是字符设备是Linux中最简单的功能设备,一个字符设备的驱动程序必须具备中最简单的功能设备,一个字符设备的驱动程序必须具备open、 read 、write 、和、和close等系统基本调用。等系统基本调用。-7-块设备:与字符设备类似,也可以通过文件系统来访问。同时块设块设备:与字符设备类似,也可以通过文件系统来访问。同时块设备还是文件系统的物质基础。块设备与字符设备的区别在于,内核管理备还是

10、文件系统的物质基础。块设备与字符设备的区别在于,内核管理数据的方式不同。块设备可以向字符设备一样以字节流的方式来访问,数据的方式不同。块设备可以向字符设备一样以字节流的方式来访问,也可以一次传递任意多的字节。在也可以一次传递任意多的字节。在Linux中块设备是使用中块设备是使用blkdevs向量向量表来维护的。表来维护的。-8-网络接口设备:是指通过网络接口来进行数据交换的设备,它可以网络接口设备:是指通过网络接口来进行数据交换的设备,它可以是硬件设备,也可能是软件设备。它的数据访问是以数据包的形式来进是硬件设备,也可能是软件设备。它的数据访问是以数据包的形式来进行的,它由内核中的网络子系统驱

11、动,主要负责发送和接收数据包。网行的,它由内核中的网络子系统驱动,主要负责发送和接收数据包。网络接口设备只进行数据包的通信,而不必了解数据包中的具体内容。因络接口设备只进行数据包的通信,而不必了解数据包中的具体内容。因为数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的为数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。节点上。-9-7.1.3 设备号设备号Linux的设备号由两部分组成,分别是:主设备号和次设备号。的设备号由两部分组成,分别是:主设备号和次设备号。在在linux中设备号是保存在一个无符号的中设备号是保存在一个无符号的32位的整型中的,其中主设位的整

12、型中的,其中主设备号占据备号占据12个位,次设备号占据了个位,次设备号占据了20位。位。dev_t是在文件是在文件include/linux/type.h中定义的一个无符号的中定义的一个无符号的32位的位的整型整型, 其中高其中高12位表示主设备号,低位表示主设备号,低20位表示次设备号。位表示次设备号。 其具体定义如其具体定义如下:下:-10-Linux设备号是在驱动模块中分配并注册的,它是与驱动程序相对应设备号是在驱动模块中分配并注册的,它是与驱动程序相对应的。的。Linux的设备号的分配有两种方式:静态分配和动态分配。的设备号的分配有两种方式:静态分配和动态分配。静态分配设备号是一种手动

13、分配方式,在静态分配前需要先通过读取静态分配设备号是一种手动分配方式,在静态分配前需要先通过读取文件文件/proc/devices查看系统中已经存在的设备号,常用的手动分配设备号查看系统中已经存在的设备号,常用的手动分配设备号的函数如下:的函数如下:typedef _u32 _kernel_dev_t;typedef _kernel_dev_t dev_t;-11-在函数的形参中在函数的形参中first是手动给定的设备号,是手动给定的设备号,count是所请求的连续是所请求的连续设备号的个数,而设备号的个数,而name是和该设备号范围关联的设备名称,它将出现是和该设备号范围关联的设备名称,它将

14、出现在文件在文件/proc/devices和和sysfs中。中。int register_chrdev_region(dev_t first, unsigned int count, char *name)-12-举例说明当举例说明当first为为0 x3FFFF0,count为为0 x5,该区驱动函数可以,该区驱动函数可以为为5个设备注册设备号,分别是:个设备注册设备号,分别是:0 x3FFFF0、 0 x3FFFF1、 0 x3FFFF2、 0 x3FFFF3、 0 x3FFFF4。其中。其中0 x3为主设备号,而为主设备号,而0 xFFFF0、 0 xFFFF1、 0 xFFFF2、 0

15、 xFFFF3、 0 xFFFF4是次设备是次设备号。在指定时应注意号。在指定时应注意count值不能太大,避免设备号范围和下一个主值不能太大,避免设备号范围和下一个主设备号重叠。设备号重叠。-13-动态分配是调用系统函数来给设备动态分配一个设备号的方法,动态分配是调用系统函数来给设备动态分配一个设备号的方法,在在Linux中人为的分配设备号很可能发生冲突,因此在中人为的分配设备号很可能发生冲突,因此在Linux内核中支内核中支持动态的设备号分配。使用函数持动态的设备号分配。使用函数alloc_chrdev_region()就可以达到动就可以达到动态分配设备号的目的。下面是动态分配的函数原形:

16、态分配设备号的目的。下面是动态分配的函数原形:int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)-14-7.1.4 设备驱动中关键数据结构设备驱动中关键数据结构在在Linux的设备驱动程序中有三个非常重要的数据结构,分别是的设备驱动程序中有三个非常重要的数据结构,分别是file_operations、inode和和file。file_operations是把字符设备驱动的操作和设备号联系在一起的纽是把字符设备驱动的操作和设备号联系在一起的纽带;带;inode 用

17、来代表一个文件;用来代表一个文件;File指代一个打开的文。指代一个打开的文。-15-file_operations数据结构数据结构file_operations数据结构用于为设备驱动提供入口函数,它是在文数据结构用于为设备驱动提供入口函数,它是在文件件中的函数指针表,下面来介绍该数据结构。中的函数指针表,下面来介绍该数据结构。struct module *owne;loff_t (*llseek) (struct file*, loff_t,int);ssize_t (*read)(struct file *,char *,size_t,loff_t *);ssize_t (*write)(

18、struct file *,const char *,size_t,loff_t *);int (*readdir) (struct file *,void *,filldir_t);unsigned int (*poll)(struct file *,struct poll_table_struct *);int (*ioctl) (struct inode *,struct file *,unsigned int,unsigned long);int (*mmap) (sturct file *, struct vm_area_struct*);-16-int (*open) (struc

19、t inode *,struct file *);int (*flush)(struct file *);int (*release)(struct inode *,struct file *); int (*synch)(struct file *,struct dentry *,int datasync); int (*fasync)(int, struct file *, int); int (*lock)(struct file *, int,struct file_lock);ssize_t (*readv) (struct file *,const struct iovec *,u

20、nsigned long*,loff_t * );sszie_t(*writev)(struct file *,const struct iovec *,unsigned long *,loff_t *);ssize_t (*sengpage)(struct file *,struct page *,int,size_t,loff_t *,int);unsigned long (*get_unmaapped_area)(struct file *,unsigned long,unsigned long,unsigned long,unsigned long );long (*fcntl)(in

21、t fd,unsigned int cmd,unsigned arg, struct file *filp);-17-inode数据结构数据结构inode是索引节点数据结构,它包含了与文件系统中各个文件相关是索引节点数据结构,它包含了与文件系统中各个文件相关的一些重要信息。的一些重要信息。在在 Linux中创建文件系统时,将同时创建大量的中创建文件系统时,将同时创建大量的inode索引节点。索引节点。通常情况下,文件系统的磁盘空间中大约百分之一的空间被分配给了通常情况下,文件系统的磁盘空间中大约百分之一的空间被分配给了 inode 表,用来存放文件及目录的基本信息。表,用来存放文件及目录的基本

22、信息。 -18-在在Linux中,中,struct inode结构包含了两个很重要成员:结构包含了两个很重要成员:dev_t i_rdev 和和struct cdev *i_cdev。dev_t i_rdev :是设备文件的设备编号。:是设备文件的设备编号。struct cdev *i_cdev:是字符设备的内核数据结构,指向:是字符设备的内核数据结构,指向struct cdev结构。结构。-19-file数据结构数据结构struct file是是Linux内核中的一个重要的数据结构,用于表示被打内核中的一个重要的数据结构,用于表示被打开的文件的信息。与开的文件的信息。与struct inod

23、e结构不同,结构不同,file结构只有在文件被打结构只有在文件被打开时才创建,对于某一文件它可以有多个开时才创建,对于某一文件它可以有多个file结构,但是只能有一个结构,但是只能有一个inode结构。结构。struct file结构主要是供设备驱动程序使用的,其结构如下:结构主要是供设备驱动程序使用的,其结构如下:-20-lmode_t f_mode:通过:通过FMODE_READ或或FMODE_WRITE,来表示文,来表示文件是否可读或可写;件是否可读或可写;ldev_ t f_rdev :用于:用于/dev/tty;loff_t f_ops:当前文件位移;:当前文件位移;lunsigne

24、d short f_flags:文件标志,:文件标志,O_RDONLY、O_NONBLOCK和和O_SYNC;lunsigned short f_count:打开的文件数目;:打开的文件数目;lunsigned short f_reada:lstruct inode *f_inode:指向:指向inode的结构指针;的结构指针;lstruct file_operations *f_op:文件索引指针。:文件索引指针。 -21-7.1.5 设备驱动开发中基本函数设备驱动开发中基本函数open( )函数函数在在Linux中中open( )函数主要是为驱动程序提供初始化,从字面上理函数主要是为驱动程

25、序提供初始化,从字面上理解解open的含义是打开和创建文件。的含义是打开和创建文件。file_operations结构中结构中open的原型如下:的原型如下:int (*open) (struct inode * inode,struct file * file);-22-第一个形参是一个指向第一个形参是一个指向struct inode结构的指针,它包含了驱动结构的指针,它包含了驱动程序设备编号等信息;程序设备编号等信息;第二个形参是一个指向第二个形参是一个指向struct file结构的指针。结构的指针。在大多数的设备驱动程序中在大多数的设备驱动程序中open函数必须具备如下功能:函数必须具

26、备如下功能:检查设备是否就绪,硬件是否可用;检查设备是否就绪,硬件是否可用;对于首次打开的设备进行初始化;对于首次打开的设备进行初始化;判断是否有必要对判断是否有必要对f-op进行更新;进行更新;-23-release( )函数函数release ( )函数是释放在函数是释放在open函数中分配的内存存储空间。函数中分配的内存存储空间。file_operations结构中结构中release的原型如下:的原型如下:int (*release) (struct inode * inode,struct file * file);第一个形参是一个指向第一个形参是一个指向struct inode结构

27、的指针,它包含了驱动程结构的指针,它包含了驱动程序设备编号等信息;序设备编号等信息;第二个形参是一个指向第二个形参是一个指向struct file结构的指针。结构的指针。-24-read( )函数函数将设备中的数据拷贝到应用程序的空间中。将设备中的数据拷贝到应用程序的空间中。函数原型如下:函数原型如下: ssize_t (*read)(struct file * filp,char * buff,size_t count,loff_t * offp);第一个形参是一个指向第一个形参是一个指向struct file结构的指针结构的指针第二个形参第二个形参buff是指向用户空间的缓冲区的指针变量是

28、指向用户空间的缓冲区的指针变量第三个形参第三个形参count是请求传送的数据长度是请求传送的数据长度最后一个形参最后一个形参offp是一个长偏移量的指针。是一个长偏移量的指针。-25-write( )函数函数将数据发送到设备中。它的函数原型如下:将数据发送到设备中。它的函数原型如下: ssize_t (*write)(struct file * filp,const char * buff,size_t count,loff_t * offp);第一个形参是一个指向第一个形参是一个指向struct file结构的指针结构的指针第二个形参第二个形参buff是指向用户空间的缓冲区的指针变量是指向用

29、户空间的缓冲区的指针变量第三个形参第三个形参count是请求传送的数据长是请求传送的数据长最后一个形参最后一个形参offp是一个长偏移量的指针。是一个长偏移量的指针。-26-Linux中设备被分为字符型、块型和网络型三大类,每一类的中设备被分为字符型、块型和网络型三大类,每一类的Linux设备都有其标准的接口,按照这些固化的流程进行编写,就可以在设备都有其标准的接口,按照这些固化的流程进行编写,就可以在Linux内部实现不同功能设备的扩展。内部实现不同功能设备的扩展。设备驱动程序内核接口功能函数实现设备驱动模块化编程设备驱动模块化编程-27-7.2.1 设备驱动程序的开发流程设备驱动程序的开发

30、流程1. 理解设备的工作原理理解设备的工作原理2. 设备初始化设备初始化对设备进行初始化,并在初始化函数中实现对驱动程序的注册和加对设备进行初始化,并在初始化函数中实现对驱动程序的注册和加载。载。3. 建立接口建立接口定义定义file-operations结构,实现文件系统与设备驱动程序间的接口。结构,实现文件系统与设备驱动程序间的接口。-28-4. 文件操作实现文件操作实现编写具体的文件操作函数,编写具体的文件操作函数,open、read、write等。等。5. 中断实现中断实现设备中有中断服务实现该功能,并用设备中有中断服务实现该功能,并用request-irq向内核申请中断向内核申请中断

31、接口。接口。6. 编译驱动程序编译驱动程序将驱动程序直接编译到内核中,或使用将驱动程序直接编译到内核中,或使用insmod命令加载模块。命令加载模块。-29-7. 测试设备测试设备对驱动程序进行测试验证成果。通过系统调用函数访问设备驱动来控制对驱动程序进行测试验证成果。通过系统调用函数访问设备驱动来控制硬件,观察实验结果对测试过程中出现的问题进行分析,并修改程序中的相硬件,观察实验结果对测试过程中出现的问题进行分析,并修改程序中的相关部分。关部分。7.2.2 内核空间和用户空间内核空间和用户空间内核空间和用户空间具有不同的地址空间,引用不同的内存映射,它们内核空间和用户空间具有不同的地址空间,

32、引用不同的内存映射,它们都属于虚拟地址空间。都属于虚拟地址空间。-30-设备驱动程序和内核代码运行在内核空间,应用程序运行在用户空设备驱动程序和内核代码运行在内核空间,应用程序运行在用户空间。间。内核空间下运行的程序,对应处理器的用户态,具有较高的权限,内核空间下运行的程序,对应处理器的用户态,具有较高的权限,可以直接对硬件等资源进行访问。可以直接对硬件等资源进行访问。工作在用户空间的程序,因用户空间对应的是处理器的用户态,其工作在用户空间的程序,因用户空间对应的是处理器的用户态,其权限较低,内核中的很多资源比如硬件设备等,在该空间中是无权访问权限较低,内核中的很多资源比如硬件设备等,在该空间

33、中是无权访问的。的。-31-7.2.3 设备注册和初始化设备注册和初始化在在2.6的的Linux内核中使用的设备注册函数有:内核中使用的设备注册函数有:int register_chrdev_region(dev_t first, unsigned int count, char *name)、int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)void unregister_ chrdev_ region(dev_t first, unsigned int co

34、unt)-32-7.2.4 中断管理中断管理中断是处理器具有的一种快速响应的机制,在处理器的运行过程中,中断是处理器具有的一种快速响应的机制,在处理器的运行过程中,按程序执行的运行顺序可能会使某些关键部位的响应变慢,为了处理器能按程序执行的运行顺序可能会使某些关键部位的响应变慢,为了处理器能更快的响应一些高优先级操作进程,引入了中断的概念。更快的响应一些高优先级操作进程,引入了中断的概念。中断使运行中的程序可以被内部或外部的突发事件所暂停,转去执行中断使运行中的程序可以被内部或外部的突发事件所暂停,转去执行一段预先设置好的程序代码,即中断服务程序,当执行完成后,再返回源一段预先设置好的程序代码

35、,即中断服务程序,当执行完成后,再返回源程序的断点处继续执行。程序的断点处继续执行。-33-申请中断申请中断request_irq()和释放中断和释放中断free_irq()的函数原型。的函数原型。int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long flags, const char * dev_name, void *dev_id);void free_irq(unsigned int irq,void *dev_id);-3

36、4-申请中断函数申请中断函数request_irq()中的参数中的参数irq表示要申请的中断号;表示要申请的中断号;Handler是要安装的中断处理函数的指针,是一个回调函数,中断发生时,是要安装的中断处理函数的指针,是一个回调函数,中断发生时,系统调用这个函数;系统调用这个函数;flags是中断处理的属性,若设置是中断处理的属性,若设置SA_INTERRUPT,标,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断;,则多个设

37、备共享中断;dev_name是设备名称字符串,申请完成后,将在是设备名称字符串,申请完成后,将在/proc/interrupts文件中显示;文件中显示;dev_id是设备的标识,在中断共享时会用到,一般设置为这个设备的是设备的标识,在中断共享时会用到,一般设置为这个设备的device结构本身或者结构本身或者NULL。 -35-7.3.1 GPIO接口设计接口设计S3C2440共有共有117个多功能的个多功能的I/O口,这些口,这些I/O口共分为八组,分别是:口共分为八组,分别是:lGPA:端口:端口A,23 个输出端口;个输出端口;lGPB:端口:端口B,11 个输入个输入/输出端口;输出端口

38、;lGPC:端口:端口C,16 个输入个输入/输出端口;输出端口;lGPD:端口:端口D,16 个输入个输入/输出端口;输出端口;lGPE:端口:端口E,16 个输入个输入/输出端口;输出端口;lGPF:端口:端口F,8 个输入个输入/输出端口;输出端口;lGPG:端口:端口G,16 个输入个输入/输出端口输出端口lGPH:端口:端口H,11 个输入个输入/输出端口;输出端口;GPIO字符设备驱动程序设计字符设备驱动程序设计-36-GPxCON:是引脚功能选择寄存器,在芯片:是引脚功能选择寄存器,在芯片S3C2410中的大多数引脚中的大多数引脚都是多功能的。因此,在使用引脚前应通过寄存器都是多

39、功能的。因此,在使用引脚前应通过寄存器GPxCON设置好每个引设置好每个引脚的功能。脚的功能。GPxDAT:是引脚数据寄存器,用于读:是引脚数据寄存器,用于读/写引脚数据。当对应的引脚被写引脚数据。当对应的引脚被设置为输出时,写该寄存器中的相应位可输出高电平或低电平;当此引脚被设置为输出时,写该寄存器中的相应位可输出高电平或低电平;当此引脚被设置为输入时,读该寄存器可以获取相应引脚的电平状态。设置为输入时,读该寄存器可以获取相应引脚的电平状态。GPxUP:是上拉电阻设置寄存器,通过该寄存器可以设置相应引脚是:是上拉电阻设置寄存器,通过该寄存器可以设置相应引脚是否使用上拉电阻。当寄存器中的某位为

40、否使用上拉电阻。当寄存器中的某位为0时,则对应的引脚将不使用上拉电时,则对应的引脚将不使用上拉电阻;若寄存器阻;若寄存器GPxUP钟的某位为钟的某位为1,则对应的端口引脚使用上拉电阻。,则对应的端口引脚使用上拉电阻。-37-端口端口A寄存器及引脚配置寄存器及引脚配置端口端口A中有中有23个输出引脚无上拉选择,控制寄存器个输出引脚无上拉选择,控制寄存器GPACON中的每一中的每一位对应一根引脚。当对应为设置为位对应一根引脚。当对应为设置为0时,相应引脚为输出引脚。反之,则相时,相应引脚为输出引脚。反之,则相应引脚为地址线或用于地址控制,此时应引脚为地址线或用于地址控制,此时GPADAT无用。无用

41、。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPACON0 x5600 0000读/写端口A引脚配置寄存器0 x7FFFFFGPADAT0 x5600 0004读/写端口A数据寄存器-保留0 x5600 0008-保留-保留0 x5600 000C-保留-38-端口端口B寄存器及引脚配置寄存器及引脚配置端口端口B有有11个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPBCON中的每两位对应中的每两位对应一根引脚。一根引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口B的数据寄存器的数据寄存器GPBDAT为为11位

42、有效值。上拉寄存器位有效值。上拉寄存器GPBUP也是也是11位有效,位有效,0表示对应引脚设置上拉,表示对应引脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPBCON0 x5600 0010读/写端口B引脚配置寄存器0 x0GPBDAT0 x5600 0014读/写端口B数据寄存器-GPBUP0 x5600 0018读/写端口B上拉寄存器0 x0保留0 x5600 001C-保留-39-端口端口C寄存器及引脚配置寄存器及引脚配置端口端口C有有16个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPCCON中的每两位对应中的每两位对应一根引脚

43、。一根引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口C的数据寄存器的数据寄存器GPCDAT为为16位有效值。上拉寄存器位有效值。上拉寄存器GPBUP也是也是16位有效,位有效,0表示对应引脚设置上拉,表示对应引脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPCCON0 x5600 0020读/写端口C引脚配置寄存器0 x0GPCDAT0 x5600 0024读/写端口C数据寄存器-GPCUP0 x5600 0028读/写端口C上拉寄存器0 x0保留0 x5600 002C-保留-40-端

44、口端口D寄存器及引脚配置寄存器及引脚配置端口端口D有有16个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPDCON中的每两位对应一中的每两位对应一根引脚。根引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口D的数据的数据寄存器寄存器GPDDAT为为16位有效值。上拉寄存器位有效值。上拉寄存器GPDUP也是也是16位有效,在上电时位有效,在上电时引脚引脚15:12无上拉功能,而无上拉功能,而11:0有上拉。该寄存器位设置为有上拉。该寄存器位设置为0表示对应引表示对应引脚设置上拉,脚设置上拉,1表示无上拉。表示无上拉。寄存器

45、寄存器地址地址读读/写写说明说明复位值复位值GPDCON0 x5600 0030读/写端口D引脚配置寄存器0 x0GPDDAT0 x5600 0034读/写端口D数据寄存器-GPDUP0 x5600 0038读/写端口D上拉寄存器0 x0保留0 x5600 003C-保留-41-端口端口E寄存器及引脚配置寄存器及引脚配置端口端口E有有16个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPECON中的每两位对应一根中的每两位对应一根引脚。引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口E的数据寄的数据寄存器存器GPEDAT

46、为为16位有效值。上拉寄存器位有效值。上拉寄存器GPEUP也是也是16位有效,在上电时各位有效,在上电时各引脚均有上拉。该寄存器的位设置为引脚均有上拉。该寄存器的位设置为0表示对应引脚设置上拉,表示对应引脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPECON0 x5600 0040读/写端口E引脚配置寄存器0 x0GPEDAT0 x5600 0044读/写端口E数据寄存器-GPEUP0 x5600 0048读/写端口E上拉寄存器0 x0保留0 x5600 004C-保留-42-端口端口F寄存器及引脚配置寄存器及引脚配置端口端口F有有8个输入个输入/

47、输出引脚,其控制寄存器输出引脚,其控制寄存器GPFCON中的每两位对应一根中的每两位对应一根引脚。引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口F的数据寄的数据寄存器存器GPFDAT为为8位有效值。上拉寄存器位有效值。上拉寄存器GPFUP也是也是8位有效,在上电时各引位有效,在上电时各引脚均有上拉。该寄存器的位设置为脚均有上拉。该寄存器的位设置为0表示对应引脚设置上拉,表示对应引脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPFCON0 x5600 0050读/写端口F引脚配置寄存器0

48、x0GPFDAT0 x5600 0054读/写端口F数据寄存器-GPFUP0 x5600 0058读/写端口F上拉寄存器0 x0保留0 x5600 005C-保留-43-端口端口G寄存器及引脚配置寄存器及引脚配置端口端口G有有16个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPGCON中的每两位对应一中的每两位对应一根引脚。根引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口G的数据的数据寄存器寄存器GPGDAT为为16位有效值。上拉寄存器位有效值。上拉寄存器GPGUP也是也是16位有效,在上电时位有效,在上电时15:1

49、1引脚无上拉功能,其它引脚有上拉。该寄存器的位设置为引脚无上拉功能,其它引脚有上拉。该寄存器的位设置为0表示对应引表示对应引脚设置上拉,脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPGCON0 x5600 0060读/写端口G引脚配置寄存器0 x0GPGDAT0 x5600 0064读/写端口G数据寄存器-GPGUP0 x5600 0068读/写端口G上拉寄存器0 x0保留0 x5600 006C-保留-44-端口端口H寄存器及引脚配置寄存器及引脚配置端口端口H有有16个输入个输入/输出引脚,其控制寄存器输出引脚,其控制寄存器GPHCON中的每两位

50、对应一中的每两位对应一根引脚。根引脚。00表示输入、表示输入、01表示输出、表示输出、10表示特殊功能、表示特殊功能、11保留。端口保留。端口H的数据的数据寄存器寄存器GPHDAT为为16位有效值。上拉寄存器位有效值。上拉寄存器GPHUP也是也是16位有效,在上电时位有效,在上电时15:11引脚无上拉功能,其它引脚有上拉。该寄存器的位设置为引脚无上拉功能,其它引脚有上拉。该寄存器的位设置为0表示对应引表示对应引脚设置上拉,脚设置上拉,1表示无上拉。表示无上拉。寄存器寄存器地址地址读读/写写说明说明复位值复位值GPHCON0 x5600 0060读/写端口H引脚配置寄存器0 x0GPHDAT0

51、x5600 0064读/写端口H数据寄存器-GPHUP0 x5600 0068读/写端口H上拉寄存器0 x0保留0 x5600 006C-保留-45-7.3.2 LED驱动程序代码分析驱动程序代码分析/*LED设备驱动的引脚定义*/static unsigned long led_tab = S3C2410_GPE3,S3C2410_GPE4,S3C2410_GPE5,;/*LED设备驱动文件操作结构*/static struct file_operations led_fops = .ioctl = led_ioctl,;/*LED设备驱动自定义设备结构*/static struct mis

52、cdevice led_dev = MISC_DYNAMIC_MINOR,led_dri,&led_fops;/* LED灯的状态 1开,0闭*/#define LED_ON 1 #define LED_OFF 0 -46-led_tab程序与程序与LED直接相连的引脚,在电路中根据实际的连接直接相连的引脚,在电路中根据实际的连接情况可修改该部分的代码,确定驱动的实际引脚。情况可修改该部分的代码,确定驱动的实际引脚。在驱动程序中只给出在驱动程序中只给出ioctl函数,该函数是函数,该函数是file_operation中提供的中提供的一种硬件的操作方法。一种硬件的操作方法。在驱动程序中凡是与硬件

53、有关的除读写设备外的,其他的硬件操作在驱动程序中凡是与硬件有关的除读写设备外的,其他的硬件操作如:设备弹出、修改波特率等操作,都可以通过如:设备弹出、修改波特率等操作,都可以通过ioctl方法来实现。方法来实现。-47-7.3.3 LED驱动程序加载及测试驱动程序加载及测试测试程序是在开发完成后为检测软件系统的性能是否正常,内部数测试程序是在开发完成后为检测软件系统的性能是否正常,内部数据结构是否有效的一种程序。据结构是否有效的一种程序。通过检测,可以对设备或系统的功能的正确性进行测定,并在显示通过检测,可以对设备或系统的功能的正确性进行测定,并在显示器上给出相应的信息。器上给出相应的信息。测

54、试程序是进行软件测试的一种常用的测试手段,对于不同的人群,测试程序是进行软件测试的一种常用的测试手段,对于不同的人群,测试方法也各不相同。测试方法也各不相同。-48-在测试程序中包含了标准的输入输出库,文件操作库等。在驱动的在测试程序中包含了标准的输入输出库,文件操作库等。在驱动的编写过程中,没有编写过程中,没有main函数可能会让很多从事函数可能会让很多从事C语言开发的程序员感语言开发的程序员感到茫然。在测试程序中到茫然。在测试程序中main函数是必不可少的,在下面的测试代码中函数是必不可少的,在下面的测试代码中主要的功能代码都被放到了主要的功能代码都被放到了main函数中来实现。在函数中来

55、实现。在main函数中给出了函数中给出了两个参数,分别是两个参数,分别是argc和和argv。其中。其中argc表示了存放在地址指针参数表示了存放在地址指针参数argv中的参数的个数。中的参数的个数。-49-在在AD转换器进行模数转换的过程中,其主要的技术指标如下:转换器进行模数转换的过程中,其主要的技术指标如下:l分辩率:又称精,是指数字量变化一个最小量时模拟信号的变化量,分辩率:又称精,是指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与定义为满刻度与2n的比值,通常以数字信号的位数来表示。的比值,通常以数字信号的位数来表示。 l转换速率:是指完成一次从模拟信号转换到数字信号的转换所

56、需的时转换速率:是指完成一次从模拟信号转换到数字信号的转换所需的时间的倒数。积分型间的倒数。积分型AD转换器的转换时间是毫秒级属于低速转换器的转换时间是毫秒级属于低速AD转换器;逐转换器;逐次比较型次比较型AD转换器的转换时间是微秒级属于中速转换器的转换时间是微秒级属于中速AD转换器;全并行和串转换器;全并行和串并行型的并行型的AD转换器的转换速度可达到纳秒级。转换器的转换速度可达到纳秒级。A/D转换器驱动程序设计转换器驱动程序设计-50-l采样时间:是指两次采样时间:是指两次AD转换的时间间隔。在转换过程中为了确保每一次转换的时间间隔。在转换过程中为了确保每一次转化都能被正常的完成,要求转换

57、的采样速率必须小于或等于转换速率。转化都能被正常的完成,要求转换的采样速率必须小于或等于转换速率。 l量化误差:是由于量化误差:是由于AD转换中的有限的分辩率引起的误差,即有限分辩率转换中的有限的分辩率引起的误差,即有限分辩率AD的阶梯状转移特性曲线与无限分辩率的阶梯状转移特性曲线与无限分辩率AD的转移特性曲线之间的最大偏的转移特性曲线之间的最大偏差。通常情况下是差。通常情况下是1个或半个最小数字量的模拟变化量,表示为个或半个最小数字量的模拟变化量,表示为1LSB或或1/2LSB。 l偏移误差:是输入信号为零时输出的不为零的值,该值的到小与电路、偏移误差:是输入信号为零时输出的不为零的值,该值

58、的到小与电路、温度等条件有关,通过外接电位器可将偏移误差调至最小。温度等条件有关,通过外接电位器可将偏移误差调至最小。 -51-l满刻度误差:是指满度输出时对应的输入信号与理想输入信号值之差。满刻度误差:是指满度输出时对应的输入信号与理想输入信号值之差。 l线性度:是实际的线性度:是实际的AD转换器的转移曲线与理想的转换直线的最大偏移。转换器的转移曲线与理想的转换直线的最大偏移。7.4.1 S3C2410X中断控制器中断控制器中断是处理器提供的快速反应的通道,在正常的执行流程中,中断的到来中断是处理器提供的快速反应的通道,在正常的执行流程中,中断的到来可以使得程序的执行被中止,处理器根据中断源

59、等信息,跳转到相应的中可以使得程序的执行被中止,处理器根据中断源等信息,跳转到相应的中断程序入口处开始执行中断处理程序,处理完毕之后返回被暂停的断点,断程序入口处开始执行中断处理程序,处理完毕之后返回被暂停的断点,或者是通过进程调度执行当前就绪的最高优先执行进程。或者是通过进程调度执行当前就绪的最高优先执行进程。S3C2410X有有56个中断源。个中断源。-52-中断源中断源描述描述优先权仲裁组优先权仲裁组INT_ADCADC EOC和触摸中断(INT_ADC/INT_TC)ARB5INT_RTCRTC告警中断ARB5INT_SPI1SPI1中断ARB5INT_UART0UART0中断(ERR

60、,RXD,TXD)ARB5INT_IICIIC中断ARB4INT_USBHUSB主机中断ARB4INT_USBDUSB从设备中断ARB4保留保留ARB4INT_UART1UART1中断(ERR,RXD,TXD)ARB4INT_SPI0SPI0中断ARB4INT_SDISI中断ARB3INT_DMA3DMA通道3中断ARB3INT_DMA2DMA通道2中断ARB3INT_DMA1DMA通道1中断ARB3INT_DMA0DMA通道0中断ARB3INT_LCDLCD 中断(INT_FrSyn 和INT_FiCnt)ARB3-53-中断源中断源描述描述优先权仲裁组优先权仲裁组INT_UART2UART

温馨提示

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

评论

0/150

提交评论