版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
说在前面Linux设备驱动只有专著,没有教材,高校几乎均未开设此课,仅少数社会培训机构开展过培训,培训费天价涉及内核,内容多,难理解,难表达,属费力不讨好的课,中国高校往往重科研轻教学,象这类需花费太多力气的课没人愿开嵌入式系统的价值在软件,软件的核心在驱动嵌入式系统方向不开Linux设备驱动不够深入,前几届未开主要缺人手,看到部分同学自学时总感到遗憾课难,要有思想准备,有不懂正常,不求全懂,先打下点基础,以后有机再深入进去说在前面强调Linux内核基础知识与驱动程序设计方法,不在于某一具体设备的驱动程序的编写,授人以“渔”,而不是授人以“鱼”如以太网卡、USB等设备,数据手册上百页,寄存器上百个,讲透一个设备的驱动就需一门课时间本书使用“虚拟设备”,避开处理复杂的实际设备,将重点放在内核知识与驱动设计方法上本书是一本公认的非常权威的专著,翻译也不错,跟着书走总不会错要读书,读懂过的书即使10年也能轻易重新拾起增加随堂考试,课堂讨论,课堂读书参考书深入理解Linux内核,第3版,陈莉君等译深入理解Linux内核架构,郭旭译Linux内核设计与实现,陈莉君等译精通Linux设备驱动程开发,宋宝华等译Linux设备驱动开发详解,宋宝华编著132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类什么是设备驱动程设备驱动程序是对设备直接进行操作控制的程序操作包括初始化、读、写等LED1LED2PB9PB10VDD3344B0XLED1LED2PB9PB10VDD3344B0XrPDATB=0x1FF;LED1、LED2亮rPDATB=0x7FF;LED1、LED2灭#definerPCONB(*(volatileunsigned*)0x1d20008)#definerPDATB(*(volatileunsigned*)0x1d2000c)1.LED底层驱动/裸驱初始化leds_on()封装leds_off()封装控制(写)rPCONB=rPCONB&B10<<10;B10=0,设为输出rPCONB=rPCONB&B9<<9;B9=0,设为输出什么是设备驱动程(1)双亮驱动voidleds_on(){
Led_Display(0x3);}rPDATB=0x1FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程(2)双灭驱动voidleds_off(){
Led_Display(0x0);}rPDATB=0x7FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程voidLed_Display(intLedStatus){ led_state=LedStatus;
if((LedStatus&0x01)==0x01)
rPDATB=rPDATB&0x5ff; else
rPDATB=rPDATB|0x200;
if((LedStatus&0x02)==0x02)
rPDATB=rPDATB&0x3ff; else
rPDATB=rPDATB|0x400;}LED1LED2PB9PB10VDD3344B0X什么是设备驱动程voidled1_on(){ led_state=led_state|0x1; Led_Display(led_state);}voidled2_on(){ led_state=led_state|0x2;
Led_Display(led_state);}什么是设备驱动程voidled1_off(){ led_state=led_state&0xfe;
Led_Display(led_state);}voidled2_off(){ led_state=led_state&0xfd;
Led_Display(led_state);}什么是设备驱动程voidMain(void){sys_init(); for(;;)//while(1) {
Led_Test(); }}voidLed_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();}什么是设备驱动程应用程序底层驱动程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…前/后台结构单任务结构大循环结构voidMain(void){sys_init(); for(;;)//while(1) {
Led_Test(); }}无核结构无操作系统时,应用程序直接调用底层驱动程序!什么是设备驱动程底层驱动程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…应用程序Key应用编程接口(API)操作系统内核设备驱动(接口)open()read()write()ioctl()close()…有操作系统时,应用程序通过操系统的API调用底层驱动程序!Linux驱动程序的任务就是实现设备的API及底层驱动2.LED驱动什么是设备驱动程(有核)intmain(intargc,char**argv){…
fd=open(“/dev/leds”,0);//打开设备….if(!strcmp(argv[2],"on"))
ioctl(fd,IOCTL_LED_ON,led_no);
elseif(!strcmp(argv[2],"off"))
ioctl(fd,IOCTL_LED_OFF,led_no);
elsegotoerr;close(fd);return0;}什么是设备驱动程底层驱动程序LEDdrive硬件LED8LED…8LEDdrive…open()read()write()ioctl()…应用程序操作系统内核LCDLCDdrive硬件staticstructfile_operationss3c24xx_leds_fops={.owner=THIS_MODULE,.open=s3c24xx_leds_open,.ioctl=s3c24xx_leds_ioctl,…..};什么是设备驱动程staticints3c24xx_leds_open(structinode*inode,structfile*file){inti;//设置GPIO引脚的功能,本驱动中LED所涉及的GPIO引脚设为输出功能for(i=0;i<2;i++){s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);}return0;}应用程序对设备文件/dev/leds执行open(...)时,就会调用s3c24xx_leds_open函数rPCONB=rPCONB&B10<<10;B10=0rPCONB=rPCONB&B9<<9;B9=0什么是设备驱动程staticints3c24xx_leds_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){if(arg>4){return-EINVAL;}switch(cmd){caseIOCTL_LED_ON://设置指定引脚的输出电平为0s3c2410_gpio_setpin(led_table[arg],0);return0;caseIOCTL_LED_OFF://设置指定引脚的输出电平为1s3c2410_gpio_setpin(led_table[arg],1);return0;default:return-EINVAL;}}应用程序对设备文件/dev/leds执行ioclt(...)时,就会调用此函数leds_on()orled1_on()orled2_on()leds_off()orled1_off()orled2_off()什么是设备驱动程/*注册函数*//*执行“insmod
s3c24xx_leds.ko”命令时就会调用这个函数*/staticint__inits3c24xx_leds_init(void){intret;ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&s3c24xx_leds_fops);if(ret<0){printk(DEVICE_NAME"can'tregistermajornumber\n");returnret;}printk(DEVICE_NAME"initialized\n");return0;}什么是设备驱动程/*执行”rmmod
s3c24xx_leds.ko”命令时就会调用这个函数*/staticvoid__exits3c24xx_leds_exit(void){unregister_chrdev(LED_MAJOR,DEVICE_NAME);}/*卸载函数*/什么是设备驱动程/*这两行指定驱动程序的初始化函数和卸载函数*/module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/*描述驱动程序的一些信息,不是必须的*/MODULE_AUTHOR(“”);
MODULE_DESCRIPTION(“S3C2410/S3C2440LEDDriver”);
MODULE_LICENSE("GPL");//遵循的协议什么是设备驱动程设备驱动程序是操作系统中直接控制硬件设备的程序,是内核的一部分,约占Linux内核源程序的60%~80%Linux内核采用可加载的模块化设计(LKMs,LoadableKernelModules)。将最基本的核心代码编译在内核中,其他的代码则往往编译为内核模块,在需要时才动态加载到内核中通常CPU、PCI、TCP/IP、APM、VFS等的驱动直接编译在内核文件中,其它驱动(声卡、网卡等)则作为模块动态加载。什么是设备驱动程设备驱动程的作用在于提供机制,而不是策略机制-功能策略-如何使用功能驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序什么是设备驱动程132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类进程管理:CPU是计算机系统中的最重要的资源,进程管理也称CPU管理,进程管理的任务包括进程的创建、销毁、阻塞、调度及进程间的通信等内存管理:内存也是计算机系统中的主要资源,内存管理的任务主要是内存的分配与回收及虚拟内存的实现文件系统:文件系统是计算机中的软件资源,Linux中将设备也当作文件处理,几乎是“一切皆文件”设备控制:几乎每个系统操作最终都会映射到物理设备上。内核必须为系统中的每件外设嵌入相应的驱动程序,这包括硬盘驱动器、键盘和磁带驱动器等网络功能:网络功能也必须由操作系统来管理,因为大部分网络操作和具体进程无关:进入系统的报文是异步事件.报文在某一个进程接手之前必须被收集,识别,分发.系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行.另外,所有的路由和地址解析问题都在内核中实现132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类可装载模块可装载模块是Linux最吸引人的一个特性,用户可将一时不用或很少使用的功能(包括设备驱动程序)编译为模块,需要时再装载,不用时卸载,这样可以有效地减小内核。当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod自动执行modprobe命令加载所需的内核模块用户也可在命令行执行modprobe/insmod命令将模块连接到运行中的内核中(装载),执行rmmod程序移除连接(卸载)132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类设备和模块的分类Linux设备可分为3种基本类型:字符设备、块设备与网络接口,相应地,设备驱动模块也有3种类型字符设备字符(char)设备是一种可以当作字节流来存取的设备(如同一个文件);字符驱动负责实现这种行为。这样的驱动常常至少实现open,close,read,和write系统调用字符终端(/dev/console)和串口(/dev/ttyS0等)是字符设备的例子,因为它们很好地展现了流的抽象字符设备通过文件系统结点来存取,例如/dev/tty1和/dev/lp0字符设备文件和普通文件之间的唯一不同在于对普通文件的访问可以前后移动位置,但是大部分字符设备只能顺序存取设备和模块的分类块设备与字符设备类似,块设备也通过位于/dev目录下的文件系统结点来存取。但块设备(例如一个磁盘)上能够容纳文件系统。在Unix系统,进行I/O操作时块设备每次只能传送一个或多个完整的块,每块包含512字节(或一个更大的2的幂的数据)的整块。Linux可以让应用程序象读写字符设备一样地读写块设备,一次可传送任意数目的字节。因而块和字符设备的区别仅仅在于内核内部管理数据的方式,也就是在于内核与驱动程序之间的软件接口上,即块驱动和字符驱动的不同在内核接口上.设备和模块的分类网络接口任何网络事务都通过一个网络接口来进行。网络接口是一个能够与其他主机交换数据的设备。通常,网络接口是个硬件设备,但是也可能是个纯软件设备,比如环回(loopback)接口。网络接口负责发送和接收数据报文,在内核网络子系统的驱动下,不必知道单个事务是如何映射到实际的被发送的报文上的。很多网络连接(特别那些使用TCP的)是面向流的,但是网络设备却常常设计成处理报文的发送和接收。一个网络驱动对单个连接一无所知,它只处理报文.设备和模块的分类既然不是一个面向流的设备,一个网络接口就不能象/dev/tty1那样容易映射到文件系统的一个结点上。Unix提供的对接口的存取的方式仍然是通过分配一个名字给它们(例如eth0),但是这个名字在文件系统中没有对应的入口.内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同。内核调用一套和报文传递相关的函数而不是read和write.安全问题驱动程序属于内核,如果内核有安全漏洞,整个系统就会有安全漏洞,故只有授权用户
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版项目部石材辅料采购合同3篇
- 2024版家具展览展示与赞助合同3篇
- 2024年度基本建设领域贷款合同2篇
- 2024版电动三轮车二手买卖及品牌推广合同
- 2024年度高科技产业园区个人劳务分包建设合同2篇
- 2024年新型环保建筑材料采购合同书范本3篇
- 福建省厦门市思明区夏门一中2025届高考数学五模试卷含解析
- 2025届湖南省郴州市苏仙区湘南中学高三下学期联合考试英语试题含解析
- 福建省莆田市仙游县郊尾中学2025届高考英语考前最后一卷预测卷含解析
- 2025届甘肃张掖市高考考前模拟英语试题含解析
- 合作共赢商务合作PPT模板(基础教育)
- 白酒厂污水处理设计(共35页)
- 《雾化吸入疗法在呼吸疾病中的应用专家共识2016年版》
- 胎元、命宫、身宫的推算
- 高速公路改扩建中的保通设计分析
- 美人蕉锈病病情调查报告
- 手工钨极氩弧焊焊接工艺指导书
- 分级护理细化标准[资料]
- 板式换热器计算
- 最新大学毛概期末考试重点总结
- 事故隐患排查治理统计分析制度
评论
0/150
提交评论