嵌入式软件开发技术:第8章 嵌入式Linux设备驱动编程

举报
资源描述
1 7.1 设备驱动编程基础设备驱动编程基础7.2 字符设备驱动编程字符设备驱动编程7.3 GPIO驱动程序实例驱动程序实例7.4 按键驱动编程实例按键驱动编程实例第第7章章 嵌入式嵌入式Linux设备驱动编程设备驱动编程2 7.1.1 Linux设备驱动概述设备驱动概述设备驱动概念设备驱动概念操作系统是通过各种驱动程序来驾驭硬件设备的,它操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽为用户屏蔽了各种各样的设备了各种各样的设备,驱动硬件是操作系统最基本的功能,并且,驱动硬件是操作系统最基本的功能,并且提提供统一的操作方式供统一的操作方式。设备驱动程序是操作系统最基本的组成部分。设备驱动程序是操作系统最基本的组成部分之一,在之一,在Linux内核源程序中也占有内核源程序中也占有60%以上。因此,熟悉驱动以上。因此,熟悉驱动的编写是很重要的。的编写是很重要的。Linux的一个重要特点就是将所有的设备都当做文件进行处理的一个重要特点就是将所有的设备都当做文件进行处理,这一类特殊文件就是设备文件(通常在这一类特殊文件就是设备文件(通常在/dev目录下),这样在应目录下),这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,这样就大大方便了对设备的普通文件一样对硬件设备进行操作,这样就大大方便了对设备的处理。处理。7.1 设备驱动编程基础设备驱动编程基础 在在ARM系系统统中中,每每个个物物理理设设备备都都有有自自己己的的控控制制器器,每每个个硬硬件件控控制制器器都都有有各各自自的的控控制制状状态态寄寄存存器器,这这些些寄寄存存器器用用来来启启动动、停停止止、初初始始化化设设备备,以以及及对对设设备备进进行行诊诊断断,对对硬硬件件的的控控制制主主要要是是针针对对这这些些寄寄存存器器进进行行操操作作设设备备驱驱动动程程序序的的主主要要功功能能就就是是完成对硬件寄存器的操作。完成对硬件寄存器的操作。没有操作系统时用户程序对寄存器的操作:没有操作系统时用户程序对寄存器的操作:#define rGPFCON (*(volatile unsigned*)0 x56000050)rGPFCON=0 x55aa;7.1 设备驱动编程基础设备驱动编程基础4 7.1.1 Linux设备驱动概述设备驱动概述Linux系统的设备分为三类:字符设备、块设备和网络设备系统的设备分为三类:字符设备、块设备和网络设备.字符设备通常指像普通文件或字节流一样,以字节为单位字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备,顺序读写的设备,如并口设备、虚拟控制台等。如并口设备、虚拟控制台等。块设备通常指一些需要以块为单位随机读写的设备,如块设备通常指一些需要以块为单位随机读写的设备,如IDE硬盘、硬盘、SCSI硬盘、光驱等。硬盘、光驱等。字符字符设备和和块设备可以像文件一可以像文件一样被被访问,例如,例如,驱动程序都会程序都会实现open(打开)、(打开)、close(关(关闭,或叫,或叫release)、)、read(读取)、取)、write(写入)或(写入)或seek(定位)(定位)等操作。等操作。7.1 设备驱动编程基础设备驱动编程基础5 7.1.1 Linux设备驱动概述设备驱动概述网络设备通常是指通过网络能够与其他主机进行数据通信网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。的设备,如网卡等。Linux网络设备不是面向流的设备,因此不会将网络设备网络设备不是面向流的设备,因此不会将网络设备的名字(如的名字(如eth0)映射到文件系统中。)映射到文件系统中。7.1 设备驱动编程基础设备驱动编程基础6 7.1.1 Linux设备驱动概述设备驱动概述设备驱动程序的特点设备驱动程序的特点 内核代码内核代码:驱动程序是内核的一部分:驱动程序是内核的一部分内核接口内核接口:为内核提供标准接口:为内核提供标准接口内核机制和服务内核机制和服务:设备驱动程序使用标准的内核服务:设备驱动程序使用标准的内核服务可装载可装载:可加载:可加载/卸载卸载可设置可设置:可配置为内核的一部分:可配置为内核的一部分动态性动态性 7.1 设备驱动编程基础设备驱动编程基础7 7.1.1 Linux设备驱动概述设备驱动概述设备驱动程序与整个软硬件系统的关系设备驱动程序与整个软硬件系统的关系7.1 设备驱动编程基础设备驱动编程基础u设备文件设备文件Linux把把所所有有设设备备都都看看作作是是特特殊殊的的文文件件,都都纳纳入入文文件件系系统统的的范范畴畴,例例如如,系系统统中中第第一一个个IDE硬硬盘盘使使用用/dev/hda来来表表示示。系系统统通通过过处处理理文文件件的的接接口口虚虚拟拟文文件件系系统统VFS来来管管理理和和控控制制各各种种设设备备,Linux的的设设备备又又称称为为设设备备文件。文件。Linux抽抽象象了了对对硬硬件件的的处处理理,所所有有的的硬硬件件设设备备都都可可以以作作为为普普通通文文件件来来看看待待,对对它它们们的的使使用用和和操操作作文文件件相相同同,使使用用标标准准的的系系统统调调用用接接口口来来完完成成打打开开、关关闭闭、读读写写和和I/O控控制制等等操操作作,驱驱动动程程序序的的主主要要任任务务也也就就是是要要实实现现这这些些系系统统调调用用函函数数。由由于于引引入入了了设设备备文文件件这这一一概概念念,Linux为为文文件件和和设设备备提提供供了了一一致致的的用用户户接接口口,对对用用户户来来说说,设设备备文文件件与与普普通通文文件件并并无无区别。区别。7.1 设备驱动编程基础设备驱动编程基础u主设备号主设备号与与次设备号次设备号 Linux下每个设备都对应两个设备号,一个是主设备号,标识该下每个设备都对应两个设备号,一个是主设备号,标识该设备的类别,也标识该设备的驱动程序;另一个是从设备号,标识设备的类别,也标识该设备的驱动程序;另一个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备设备文件的主设备号必须与号必须与设备驱动程序在登记设备驱动程序在登记时申请的主设备号一致,否则用户进时申请的主设备号一致,否则用户进程将无法访问驱动程序。程将无法访问驱动程序。习惯上,设备文件都存在于系统的习惯上,设备文件都存在于系统的/dev目录下。使用命令目录下。使用命令#ls l/dev,可以列出系统的设备文件,下面是该命令显示的部分内容:,可以列出系统的设备文件,下面是该命令显示的部分内容:crw-1 root root 10,10 Jan 30 2003 adbmousecrw-1 root root 14,3 Jan 30 2003 dspbrw-rw-1 root floppy 2,0 Jan 30 2003 fd0brw-rw-1 root floppy 2,4 Jan 30 2003 fd0CompaQ7.1 设备驱动编程基础设备驱动编程基础u主设备号主设备号与与次设备号次设备号使使用用命命令令mknod可可以以创创建建指指定定类类型型的的设设备备文文件件,同同时时为为其其分分配配主主设设备备号和次设备号:号和次设备号:#mknod /dev/dsp c 14 3命命令令中中c表表示示字字符符设设备备,14是是主主设设备备号号,3是是次次设设备备号号。主主设设备备号号的的范范围是围是1255,次设备号可以使,次设备号可以使0255间的值。间的值。系系统统依依靠靠主主设设备备号号标标识识不不同同的的驱驱动动程程序序,因因此此在在同同一一个个系系统统中中,一一类类设设备备的的主主设设备备号号是是唯唯一一的的。所所有有已已经经注注册册(即即已已经经加加载载了了驱驱动动程程序序)的硬件设备的主设备号都可以在文件的硬件设备的主设备号都可以在文件/proc/devices中得到。中得到。#cat/proc/devices7.1 设备驱动编程基础设备驱动编程基础11 7.1.2 Linux内核模块编程内核模块编程设备驱动和内核模块设备驱动和内核模块 Linux设备驱动属于内核的一部分,设备驱动属于内核的一部分,Linux内核的一个内核的一个模块可以以两种方式被编译和加载。模块可以以两种方式被编译和加载。直接编译进直接编译进Linux内核,随同内核,随同Linux启动时加载;启动时加载;编译成一个可加载和删除的模块。编译成一个可加载和删除的模块。7.1 设备驱动编程基础设备驱动编程基础12 7.1.2 Linux内核模块编程内核模块编程模块相关命令模块相关命令lsmod列出当前系统中加载的模块列出当前系统中加载的模块 7.1 设备驱动编程基础设备驱动编程基础13 7.1.2 Linux内核模块编程内核模块编程模块相关命令模块相关命令rmmod用于模块卸载。用于模块卸载。insmod和和modprobe用于加载模块用于加载模块modprobe可以根据模块间依存关系以及可以根据模块间依存关系以及/etc/modules.conf文件中的内容自动加载其他有依赖关系的模块,而文件中的内容自动加载其他有依赖关系的模块,而insmod不会自动解决依存关系,即如果要加载的模块引用了当前内不会自动解决依存关系,即如果要加载的模块引用了当前内核符号表中不存在的符号,则无法加载。核符号表中不存在的符号,则无法加载。7.1 设备驱动编程基础设备驱动编程基础14 小结小结操作系统通过各种驱动程序来驾驭硬件设备,为用户屏蔽操作系统通过各种驱动程序来驾驭硬件设备,为用户屏蔽了各种各样的设备的差异性,提供统一的操作方式。了各种各样的设备的差异性,提供统一的操作方式。Linux系统的设备分为三类:字符设备、块设备和网络设备。系统的设备分为三类:字符设备、块设备和网络设备。Linux下每个设备都对应两个设备号,一个是主设备号,另下每个设备都对应两个设备号,一个是主设备号,另一个是从设备号。一个是从设备号。#mknod /dev/dsp c 14 3Linux内核的一个模块可以以两种方式被编译和加载。内核的一个模块可以以两种方式被编译和加载。模块命令:模块命令:lsmod insmodrmmod7.1 设备驱动编程基础设备驱动编程基础15 7.1.2 Linux内核模块编程内核模块编程一个一个Linux内核模块主要由以下几个部分组成。内核模块主要由以下几个部分组成。模块加载函数(必须)模块加载函数(必须)模块卸载函数(必须)模块卸载函数(必须)模块许可证声明(必须)模块许可证声明(必须)模块参数(可选)模块参数(可选):接收加载模块时传入的数据,对接收加载模块时传入的数据,对应模块的全局变量;应模块的全局变量;模块导出符号(可选):对应于模块的函数或变量,模块导出符号(可选):对应于模块的函数或变量,导出后可供其它模块使用。导出后可供其它模块使用。模块作者等信息声明(可选)模块作者等信息声明(可选)7.1 设备驱动编程基础设备驱动编程基础16 7.1.2 Linux内核模块编程内核模块编程模块加载函数模块加载函数static int _init initialization_function(void)static int _init initialization_function(void)/*/*初始化代初始化代码码*/module_initmodule_init(initialization_function);(initialization_function);n模块加载函数以模块加载函数以“module_init(funcName)”的形式指定,的形式指定,当通过当通过insmod或或modprobe命令加载内核模块时,模块的加命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。载函数会自动被内核执行,完成本模块的相关初始化工作。包括向内核注册设备、申
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关资源
正为您匹配相似的精品文档
相关搜索

当前位置:首页 > 中学教育 > 初中教育


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号