第1章 设备驱动程序简介



《第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()
7、Led_Display(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
8、;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程什么是设备驱动程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_sta
9、te & 0 xfd;Led_Display(led_state);什么是设备驱动程什么是设备驱动程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应用程序应用程序底层驱动程序底层驱动
10、程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive8LEDdrive前前/后台结构后台结构单任务结构单任务结构大循环结构大循环结构void Main(void) sys_init(); for( ; ; )/while(1) Led_Test();无核结构无核结构无操作系统时,应用程序直接调无操作系统时,应用程序直接调用底层驱动程序!用底层驱动程序!什么是设备驱动程什么是设备驱动程14底层驱动程序底层驱动程序LEDdrive硬件硬件LEDLCD8LEDLCDdrive8LEDdrive应用程序应用程序Key应用编程接口应用编程接口(API)操作系统内核操作系统内核设备驱动设备驱动
11、(接口接口)open() read()write() ioctl() 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_