1. 首页
  2. 文档大全

第1章 设备驱动程序简介

上传者:7****0 2022-06-07 13:37:35上传 PPT文件 760.01KB
第1章 设备驱动程序简介_第1页 第1章 设备驱动程序简介_第2页 第1章 设备驱动程序简介_第3页

《第1章 设备驱动程序简介》由会员分享,可在线阅读,更多相关《第1章 设备驱动程序简介(38页珍藏版)》请在文档大全上搜索。

1、1说在前面说在前面Linux设备驱动只有专著,没有教材,高校几乎均未设备驱动只有专著,没有教材,高校几乎均未开设此课,仅少数社会培训机构开展过培训,培训费开设此课,仅少数社会培训机构开展过培训,培训费天价天价涉及内核,内容多,难理解,难表达,属费力不讨好涉及内核,内容多,难理解,难表达,属费力不讨好的课,中国高校往往重科研轻教学,象这类需花费太的课,中国高校往往重科研轻教学,象这类需花费太多力气的课没人愿开多力气的课没人愿开嵌入式系统的价值在软件,软件的核心在驱动嵌入式系统的价值在软件,软件的核心在驱动嵌入式系统方向不开嵌入式系统方向不开Linux设备驱动不够深入,前几设备驱动不够深入,前几届

2、未开主要缺人手,看到部分同学自学时总感到遗憾届未开主要缺人手,看到部分同学自学时总感到遗憾课难,要有思想准备,有不懂正常,不求全懂,先打课难,要有思想准备,有不懂正常,不求全懂,先打下点基础,以后有机再深入进去下点基础,以后有机再深入进去2说在前面说在前面强调强调Linux内核基础知识与驱动程序设计方法,不在内核基础知识与驱动程序设计方法,不在于某一具体设备的驱动程序的编写,授人以于某一具体设备的驱动程序的编写,授人以“渔渔”,而不是授人以而不是授人以“鱼鱼”如以太网卡、如以太网卡、USB等设备,数据手册上百页,寄存器等设备,数据手册上百页,寄存器上百个,讲透一个设备的驱动就需一门课时间上百个

3、,讲透一个设备的驱动就需一门课时间本书使用本书使用“虚拟设备虚拟设备”,避开处理复杂的实际设备,避开处理复杂的实际设备,将重点放在内核知识与驱动设计方法上将重点放在内核知识与驱动设计方法上本书是一本公认的非常权威的专著,翻译也不错,跟本书是一本公认的非常权威的专著,翻译也不错,跟着书走总不会错着书走总不会错要读书,读懂过的书即使要读书,读懂过的书即使10年也能轻易重新拾起年也能轻易重新拾起增加随堂考试,课堂讨论,课堂读书增加随堂考试,课堂讨论,课堂读书3参考书参考书深入理解深入理解Linux内核,第内核,第3版,陈莉君等译版,陈莉君等译深入理解深入理解Linux内核架构,郭旭译内核架构,郭旭译

4、Linux内核设计与实现,陈莉君等译内核设计与实现,陈莉君等译精通精通Linux设备驱动程开发,宋宝华等译设备驱动程开发,宋宝华等译Linux设备驱动开发详解,宋宝华编著设备驱动开发详解,宋宝华编著4第第1章章 设备驱动程序简介设备驱动程序简介什么是设备驱动程序什么是设备驱动程序内核功能划分内核功能划分可装载模块可装载模块设备和模块的分类设备和模块的分类5什么是设备驱动程什么是设备驱动程设备驱动程序是对设备直接进行设备驱动程序是对设备直接进行操作操作控制的控制的程程序序操作包括初始化、读、写等操作包括初始化、读、写等LED1LED2PB9PB10VDD3344B0X6LED1LED2PB9PB

5、10VDD3344B0XrPDATBrPDATB=0 x1FF;LED1=0 x1FF;LED1、LED2LED2亮亮rPDATBrPDATB=0 x7FF;LED1=0 x7FF;LED1、LED2LED2灭灭#define rPCONB#define rPCONB ( (* *(volatile unsigned (volatile unsigned * *)0 x1d20008)0 x1d20008)#define rPDATB#define rPDATB ( (* *(volatile unsigned (volatile unsigned * *)0 x1d2000c)0 x1d20

6、00c)1.LED底层驱动底层驱动/裸驱裸驱初始化初始化leds_on()封装封装leds_off()封装封装控制(写)控制(写)rPCONB=rPCONB&B1010; B10=0,设为输出,设为输出rPCONB=rPCONB&B99 ; B9=0 ,设为输出,设为输出什么是设备驱动程什么是设备驱动程7(1)双亮驱动双亮驱动void leds_on()Led_Display(0 x3);rPDATBrPDATB=0 x1FF;=0 x1FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程什么是设备驱动程8(2)双灭驱动双灭驱动void leds_off()Led_Disp

7、lay(0 x0);rPDATBrPDATB=0 x7FF;=0 x7FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程什么是设备驱动程9void Led_Display(int LedStatus)led_state = LedStatus;if(LedStatus&0 x01)=0 x01)rPDATB=rPDATB&0 x5ff;elserPDATB=rPDATB|0 x200;if(LedStatus&0 x02)=0 x02)rPDATB=rPDATB&0 x3ff;elserPDATB=rPDATB|0 x400;LED1LED2PB9PB10VDD3344B

8、0X什么是设备驱动程什么是设备驱动程10void led1_on()led_state = led_state | 0 x1;Led_Display(led_state);void led2_on()led_state = led_state | 0 x2;Led_Display(led_state);什么是设备驱动程什么是设备驱动程11void led1_off()led_state = led_state & 0 xfe;Led_Display(led_state);void led2_off()led_state = led_state & 0 xfd;Led_Display(led_s

9、tate);什么是设备驱动程什么是设备驱动程12void Main(void) sys_init(); for( ; ; )/while(1) Led_Test();void Led_Test()leds_off();Delay(1000);led1_on();Delay(1000);led1_off();led2_on();Delay(1000);leds_on();Delay(1000);led2_off();Delay(1000);led1_off();什么是设备驱动程什么是设备驱动程13应用程序应用程序底层驱动程序底层驱动程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive

10、8LEDdrive前前/后台结构后台结构单任务结构单任务结构大循环结构大循环结构void Main(void) sys_init(); for( ; ; )/while(1) Led_Test();无核结构无核结构无操作系统时,应用程序直接调无操作系统时,应用程序直接调用底层驱动程序!用底层驱动程序!什么是设备驱动程什么是设备驱动程14底层驱动程序底层驱动程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive8LEDdrive应用程序应用程序Key应用编程接口应用编程接口(API)操作系统内核操作系统内核设备驱动设备驱动(接口接口)open() read()write() ioctl

11、() close()有操作系统时,有操作系统时,应用程序通过操应用程序通过操系统的系统的API调用底调用底层驱动程序!层驱动程序!Linux驱动程序的驱动程序的任务就是实现设任务就是实现设备的备的API及底层驱及底层驱动动2.LED驱动驱动什么是设备驱动程什么是设备驱动程(有核)(有核)15int main(int argc, char *argv) fd = open(“/dev/leds”, 0); / 打开设备打开设备 . if (!strcmp(argv2, on) ioctl(fd, IOCTL_LED_ON, led_no); else if (!strcmp(argv2, off

12、) ioctl(fd, IOCTL_LED_OFF, led_no); else goto err; close(fd); return 0; 什么是设备驱动程什么是设备驱动程底层驱动程序底层驱动程序LEDdrive硬件硬件LED8LED8LEDdriveopen() read() write() ioctl()应用程序应用程序操作系统内核操作系统内核LCDLCDdrive硬件硬件16static struct file_operations s3c24xx_leds_fops = .owner = THIS_MODULE, .open = s3c24xx_leds_open, .ioctl

13、= s3c24xx_leds_ioctl, .;什么是设备驱动程什么是设备驱动程17static int s3c24xx_leds_open(struct inode *inode, struct file *file) int i; / 设置设置GPIO引脚的功能,本驱动中引脚的功能,本驱动中LED所涉及的所涉及的 GPIO引脚引脚 设为输出功能设为输出功能 for (i = 0; i 2; i+) s3c2410_gpio_cfgpin(led_tablei, led_cfg_tablei); return 0; 应用程序对设备文件应用程序对设备文件/dev/leds执行执行open(.)

14、时,时,就会调用就会调用s3c24xx_leds_open函数函数rPCONB=rPCONB&B1010; B10=0rPCONB=rPCONB&B9 4) return -EINVAL; switch(cmd) case IOCTL_LED_ON: / 设置指定引脚的输出电平为设置指定引脚的输出电平为0 s3c2410_gpio_setpin(led_tablearg, 0); return 0; case IOCTL_LED_OFF: / 设置指定引脚的输出电平为设置指定引脚的输出电平为1 s3c2410_gpio_setpin(led_tablearg, 1); return 0; de

15、fault: return -EINVAL; 应用程序对设备文件应用程序对设备文件/dev/leds执行执行ioclt(.)时,时, 就会调用此函数就会调用此函数 leds_onleds_on() or led1_on()or led2_on()() or led1_on()or led2_on()leds_offleds_off() or led1_off() or led2_off()() or led1_off() or led2_off()什么是设备驱动程什么是设备驱动程19/* 注册函数注册函数 */*执行执行“insmod s3c24xx_leds.ko”命令时就会调用这个函数命令

16、时就会调用这个函数 */static int _init s3c24xx_leds_init(void) int ret; ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c24xx_leds_fops); if (ret 0) printk(DEVICE_NAME cant register major numbern); return ret; printk(DEVICE_NAME initializedn); return 0;什么是设备驱动程什么是设备驱动程20/* 执行执行”rmmod s3c24xx_leds.ko”命令时就会调用这

17、个函命令时就会调用这个函数数 */static void _exit s3c24xx_leds_exit(void) unregister_chrdev(LED_MAJOR, DEVICE_NAME);/* 卸载函数卸载函数 */什么是设备驱动程什么是设备驱动程21/* 这两行指定驱动程序的初始化函数和卸载函数这两行指定驱动程序的初始化函数和卸载函数 */module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/* 描述驱动程序的一些信息,不是必须的描述驱动程序的一些信息,不是必须的 */MODULE_AUTHOR(“http

18、:/”); MODULE_DESCRIPTION(“S3C2410/S3C2440 LED Driver”); MODULE_LICENSE(GPL); / 遵循的协议遵循的协议什么是设备驱动程什么是设备驱动程22设备驱动程序是操作系统中直接控制硬件设备设备驱动程序是操作系统中直接控制硬件设备的程序,是内核的一部分,约占的程序,是内核的一部分,约占Linux内核源内核源程序的程序的60%80% Linux内核采用可加载的模块化设计(内核采用可加载的模块化设计(LKMs,Loadable Kernel Modules)。将最基本的)。将最基本的核心代码编译在内核中,其他的代码则往往编核心代码编译

19、在内核中,其他的代码则往往编译为内核模块,在需要时才动态加载到内核中译为内核模块,在需要时才动态加载到内核中通常通常CPU、PCI、TCP/IP、APM、VFS等的驱动直接等的驱动直接编译在内核文件中,其它驱动(声卡、网卡等)则作编译在内核文件中,其它驱动(声卡、网卡等)则作为模块动态加载。为模块动态加载。什么是设备驱动程什么是设备驱动程23设备驱动程的作用在于提供机制,而不是策略设备驱动程的作用在于提供机制,而不是策略机制机制- 功能功能策略策略-如何使用功能如何使用功能驱动程序应该处理如何使硬件可用的问题,而驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序将怎样

20、使用硬件的问题留给上层应用程序什么是设备驱动程什么是设备驱动程24第第1章章 设备驱动程序简介设备驱动程序简介什么是设备驱动程序什么是设备驱动程序内核功能划分内核功能划分可装载模块可装载模块设备和模块的分类设备和模块的分类25进程管理进程管理:CPU是计算机系统是计算机系统中的最重要的中的最重要的资源,进程管资源,进程管理也称理也称CPU管管理,进程管理理,进程管理的任务包括进的任务包括进程的创建、销程的创建、销毁、阻塞、调毁、阻塞、调度及进程间的度及进程间的通信等通信等内存管理内存管理:内存内存也是计算机系也是计算机系统中的主要资统中的主要资源源, 内存管理内存管理的任务主要是的任务主要是内

21、存的分配与内存的分配与回收及虚拟内回收及虚拟内存的实现存的实现26文件系统文件系统: 文件文件系统是计算机系统是计算机中的软件资源中的软件资源,Linux中将中将设备也当作文设备也当作文件处理,几乎件处理,几乎是是“一切皆文一切皆文件件”设备控制设备控制: 几乎几乎每个系统操作每个系统操作最终都会映射最终都会映射到物理设备上到物理设备上。 内核必须为内核必须为系统中的每件系统中的每件外设嵌入相应外设嵌入相应的驱动程序,的驱动程序,这包括硬盘驱这包括硬盘驱动器、键盘和动器、键盘和磁带驱动器等磁带驱动器等27网络功能网络功能:网络网络功能也必须由功能也必须由操作系统来管操作系统来管理理, 因为大部

22、分因为大部分网络操作和具网络操作和具体进程无关体进程无关: 进进入系统的报文入系统的报文是异步事件是异步事件. 报报文在某一个进文在某一个进程接手之前必程接手之前必须被收集须被收集, 识别识别, 分发分发. 系统负系统负责在程序和网责在程序和网络接口之间递络接口之间递送数据报文送数据报文, 它它必须根据程序必须根据程序的网络活动来的网络活动来控制程序的执控制程序的执行行. 另外另外, 所有所有的路由和地址的路由和地址解析问题都在解析问题都在内核中实现内核中实现28第第1章章 设备驱动程序简介设备驱动程序简介什么是设备驱动程序什么是设备驱动程序内核功能划分内核功能划分可装载模块可装载模块设备和模

23、块的分类设备和模块的分类29可装载模块可装载模块可装载模块是可装载模块是Linux 最吸引人的一个特性,用最吸引人的一个特性,用户可将一时不用或很少使用的功能(包括设备户可将一时不用或很少使用的功能(包括设备驱动程序)编译为模块,需要时再装载,不用驱动程序)编译为模块,需要时再装载,不用时卸载,这样可以有效地减小内核。时卸载,这样可以有效地减小内核。当操作系统内核需要的扩展功能不存在时,内当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程核模块管理守护进程kmod自动执行自动执行modprobe命令加载所需的内核模块命令加载所需的内核模块 用户也可在命令行执行用户也可在命令行执行mod

24、probe/insmod 命命令将模块连接到运行中的内核中(装载),执令将模块连接到运行中的内核中(装载),执行行 rmmod 程序移除连接(卸载)程序移除连接(卸载)30第第1章章 设备驱动程序简介设备驱动程序简介什么是设备驱动程序什么是设备驱动程序内核功能划分内核功能划分可装载模块可装载模块设备和模块的分类设备和模块的分类31设备和模块的分类设备和模块的分类 Linux 设备可分为设备可分为 3 种基本类型:字符设备、块设种基本类型:字符设备、块设备与网络接口,相应地,设备驱动模块也有备与网络接口,相应地,设备驱动模块也有3种类型种类型字符设备字符设备 字符字符( char ) 设备是一种

25、可以当作字节流来存取的设备设备是一种可以当作字节流来存取的设备( 如同一个文件如同一个文件 ); 字符驱动负责实现这种行为。字符驱动负责实现这种行为。 这样的驱这样的驱动常常至少实现动常常至少实现 open, close,read, 和和 write 系统调用系统调用 字符终端字符终端( /dev/console )和串口和串口( /dev/ttyS0 等等 )是字符是字符设备的例子设备的例子, 因为它们很好地展现了流的抽象因为它们很好地展现了流的抽象 字符设备通过文件系统结点来存取字符设备通过文件系统结点来存取, 例如例如 /dev/tty1 和和 /dev/lp0 字符设备文件和普通文件之

26、间的唯一不同在于对普通文字符设备文件和普通文件之间的唯一不同在于对普通文件的访问可以前后移动位置,件的访问可以前后移动位置, 但是大部分字符设备只能但是大部分字符设备只能顺序存取顺序存取32设备和模块的分类设备和模块的分类块设备块设备与字符设备类似与字符设备类似, 块设备也通过位于块设备也通过位于 /dev 目录目录下的文件系统结点来存取。但块设备下的文件系统结点来存取。但块设备(例如一个例如一个磁盘磁盘)上能够容纳文件系统。上能够容纳文件系统。 在在Unix 系统系统, 进行进行I/O 操作时块设备每次只能传操作时块设备每次只能传送一个或多个完整的块,每块包含送一个或多个完整的块,每块包含

27、512 字节字节( 或或一个更大的一个更大的 2 的幂的数据的幂的数据 )的整块。的整块。 Linux可以可以让应用程序象读写字符设备一样地读写块设备让应用程序象读写字符设备一样地读写块设备,一次可传送任意数目的字节。,一次可传送任意数目的字节。 因而块和字符因而块和字符设备的区别仅仅在于内核内部管理数据的方式设备的区别仅仅在于内核内部管理数据的方式, 也就是在于内核与驱动程序之间的软件接口上也就是在于内核与驱动程序之间的软件接口上,即块驱动和字符驱动的不同在内核接口上,即块驱动和字符驱动的不同在内核接口上.33设备和模块的分类设备和模块的分类网络接口网络接口 任何网络事务都通过一个网络接口来

28、进行。任何网络事务都通过一个网络接口来进行。 网网络接口是络接口是 一个能够与其他主机交换数据的设备一个能够与其他主机交换数据的设备。通常。通常, 网络接口是个硬件设备网络接口是个硬件设备, 但是也可能是但是也可能是个纯软件设备,比如环回(个纯软件设备,比如环回(loopback)接口。接口。网络接口负责发送和接收数据报文网络接口负责发送和接收数据报文, 在内核网络在内核网络子系统的驱动下子系统的驱动下, 不必知道单个事务是如何映射不必知道单个事务是如何映射到实际的被发送的报文上的。到实际的被发送的报文上的。 很多网络连接很多网络连接( 特特别那些使用别那些使用 TCP 的的)是面向流的是面向

29、流的, 但是网络设备但是网络设备却常常设计成处理报文的发送和接收。一个网却常常设计成处理报文的发送和接收。一个网络驱动对单个连接一无所知,它只处理报文络驱动对单个连接一无所知,它只处理报文. 34设备和模块的分类设备和模块的分类既然不是一个面向流的设备既然不是一个面向流的设备, 一个网络接口就不一个网络接口就不能象能象 /dev/tty1 那样容易映射到文件系统的一个那样容易映射到文件系统的一个结点上。结点上。 Unix 提供的对接口的存取的方式仍然提供的对接口的存取的方式仍然是通过分配一个名字给它们是通过分配一个名字给它们( 例如例如 eth0 ), 但是但是这这个名字在文件系统中没有对应的

30、入口个名字在文件系统中没有对应的入口. 内核与网内核与网络设备驱动间的通讯与字符和块设备驱动所用的络设备驱动间的通讯与字符和块设备驱动所用的完全不同。完全不同。 内核调用一套和报文传递相关的函内核调用一套和报文传递相关的函数而不是数而不是 read 和和 write.35安全问题安全问题驱动程序属于内核,如果内核有安全漏洞,整驱动程序属于内核,如果内核有安全漏洞,整个系统就会有安全漏洞,故只有授权用户才能个系统就会有安全漏洞,故只有授权用户才能装载模块装载模块驱动程序中容易产生安全隐患的地方驱动程序中容易产生安全隐患的地方缓冲区溢出缓冲区溢出使用未初始化的内存使用未初始化的内存中断中断使用第三

31、方软件使用第三方软件竞态竞态36许可证条款许可证条款Linux 遵守遵守 GNU 通用公共许可证(通用公共许可证( General Public License, GPL )版本版本 2 。GPL由自自由软件基金会的由自自由软件基金会的 GNU 项目设计,它允许项目设计,它允许任何人重新发布任何人重新发布, 甚至是销售由甚至是销售由GPL条款保护的产品条款保护的产品, 只要接收者能获得源码并且能够拥有同样的权利只要接收者能获得源码并且能够拥有同样的权利. 另另外外, 任何从任何从 GPL 条款保护的产品中派生出来的软件条款保护的产品中派生出来的软件产品也必须在产品也必须在 GPL 条款下发布条

32、款下发布.采取采取这种许可的主要目的是通过允许每个人随意修改这种许可的主要目的是通过允许每个人随意修改程序来推广知识;同时,向公众出售软件的人仍可以程序来推广知识;同时,向公众出售软件的人仍可以获得利益获得利益。尽管。尽管出发点很好出发点很好,但关于但关于GPL条款仍存在条款仍存在不少争论。不少争论。37教材概貌第第 2 章章 介绍了模块化技术介绍了模块化技术, 解释了其实现技巧,并讲解解释了其实现技巧,并讲解了运行模块的代码了运行模块的代码. 第第3 章章 讨论字符驱动程序,给出了一个基于内存的设备讨论字符驱动程序,给出了一个基于内存的设备驱动的代码。驱动的代码。第第 4 章章 介绍调试技术

33、,对程序员来说这是必备的工具。介绍调试技术,对程序员来说这是必备的工具。第第 5 章章 关注的是由于并发存取资源而导致的问题关注的是由于并发存取资源而导致的问题, 并且并且介绍控制并发的介绍控制并发的 Linux 机制机制.第第 6 章章 在具备了调试和并发管理的能力下在具备了调试和并发管理的能力下, 转向字符驱转向字符驱动的高级特性动的高级特性, 例如阻塞操作例如阻塞操作, selet 的使用的使用 以及重要的以及重要的 ioctl 调用。调用。第第 7 章章 展示了在内核中是如何管理时间的展示了在内核中是如何管理时间的 第第 8 章章 讲解了内存分配讲解了内存分配38教材概貌第第 9 章章 描述了描述了 I/O 口的管理和设备上的内存缓存口的管理和设备上的内存缓存第第 10 章章 介绍中断处理介绍中断处理第第 11 章章 讨论内核数据类型的使用讨论内核数据类型的使用第第 12 章章 编写编写 PCI 设备驱动设备驱动 第第 13 章章 检验使用检验使用 USB 设备的设备的 API第第 14 章章 介绍介绍Linux 设备模型设备模型第第 15 章章 介绍介绍Linux 的内存管理的内存管理第第 16 章章 介绍块设备驱动介绍块设备驱动第第 17 章章 介绍网络驱动的编写介绍网络驱动的编写第第 18 章章 讨论串行口讨论串行口TTY驱动驱动


文档来源:https://www.renrendoc.com/paper/212536732.html

文档标签:

下载地址