您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第1章 设备驱动程序简介
1132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类2什么是设备驱动程设备驱动程序是对设备直接进行操作控制的程序操作包括初始化、读、写等LED1LED2PB9PB10VDD3344B0X3LED1LED2PB9PB10VDD3344B0XrPDATB=0x1FF;LED1、LED2亮rPDATB=0x7FF;LED1、LED2灭#definerPCONB(*(volatileunsigned*)0x1d20008)#definerPDATB(*(volatileunsigned*)0x1d2000c)1.LED底层驱动/裸驱初始化leds_on()封装leds_off()封装控制(写)rPCONB=rPCONB&B1010;B10=0,设为输出rPCONB=rPCONB&B99;B9=0,设为输出什么是设备驱动程4(1)双亮驱动voidleds_on(){Led_Display(0x3);}rPDATB=0x1FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程5(2)双灭驱动voidleds_off(){Led_Display(0x0);}rPDATB=0x7FF;LED1LED2PB9PB10VDD3344B0X什么是设备驱动程6voidLed_Display(intLedStatus){led_state=LedStatus;if((LedStatus&0x01)==0x01)rPDATB=rPDATB&0x5ff;elserPDATB=rPDATB|0x200;if((LedStatus&0x02)==0x02)rPDATB=rPDATB&0x3ff;elserPDATB=rPDATB|0x400;}LED1LED2PB9PB10VDD3344B0X什么是设备驱动程7voidled1_on(){led_state=led_state|0x1;Led_Display(led_state);}voidled2_on(){led_state=led_state|0x2;Led_Display(led_state);}什么是设备驱动程8voidled1_off(){led_state=led_state&0xfe;Led_Display(led_state);}voidled2_off(){led_state=led_state&0xfd;Led_Display(led_state);}什么是设备驱动程9voidMain(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();}什么是设备驱动程10应用程序底层驱动程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…前/后台结构单任务结构大循环结构voidMain(void){sys_init();for(;;)//while(1){Led_Test();}}无核结构无操作系统时,应用程序直接调用底层驱动程序!什么是设备驱动程11底层驱动程序LEDdrive硬件LEDLCD8LED…LCDdrive8LEDdrive…应用程序Key应用编程接口(API)操作系统内核设备驱动(接口)open()read()write()ioctl()close()…有操作系统时,应用程序通过操系统的API调用底层驱动程序!Linux驱动程序的任务就是实现与API对应的底层驱动2.LED驱动什么是设备驱动程(有核)12intmain(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硬件13staticstructfile_operationss3c24xx_leds_fops={.owner=THIS_MODULE,.open=s3c24xx_leds_open,.ioctl=s3c24xx_leds_ioctl,…..};file_operaions结构structfile_operations{loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*filp,char*buff,size_tcount,loff_t*offp);ssize_t(*write)(structfile*filp,constchar*buff,size_tcount,loff_t*offp);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*);int(*fasync)(int,structfile*,int);int(*check_media_change)(kdev_tdev);int(*revalidate)(kdev_tdev);int(*lock)(structfile*,int,structfile_lock*);};什么是设备驱动程14staticints3c24xx_leds_open(structinode*inode,structfile*file){inti;//设置GPIO引脚的功能,本驱动中LED所涉及的GPIO引脚设为输出功能for(i=0;i2;i++){s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);}return0;}应用程序对设备文件/dev/leds执行open(...)时,就会调用s3c24xx_leds_open函数rPCONB=rPCONB&B1010;B10=0rPCONB=rPCONB&B99;B9=0什么是设备驱动程15staticints3c24xx_leds_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){if(arg4){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()什么是设备驱动程16/*注册函数*//*执行“insmods3c24xx_leds.ko”命令时就会调用这个函数*/staticint__inits3c24xx_leds_init(void){intret;ret=register_chrdev(LED_MAJOR,DEVICE_NAME,&s3c24xx_leds_fops);if(ret0){printk(DEVICE_NAMEcan'tregistermajornumber\n);returnret;}printk(DEVICE_NAMEinitialized\n);return0;}什么是设备驱动程17/*执行”rmmods3c24xx_leds.ko”命令时就会调用这个函数*/staticvoid__exits3c24xx_leds_exit(void){unregister_chrdev(LED_MAJOR,DEVICE_NAME);}/*卸载函数*/什么是设备驱动程18/*这两行指定驱动程序的初始化函数和卸载函数*/module_init(s3c24xx_leds_init);module_exit(s3c24xx_leds_exit);/*描述驱动程序的一些信息,不是必须的*/MODULE_AUTHOR(“”);MODULE_DESCRIPTION(“S3C2410/S3C2440LEDDriver”);MODULE_LICENSE(GPL);//遵循的协议什么是设备驱动程19设备驱动程序是操作系统中直接控制硬件设备的程序,是内核的一部分,约占Linux内核源程序的60%~80%Linux内核采用可加载的模块化设计(LKMs,LoadableKernelModules)。将最基本的核心代码编译在内核中,其他的代码则往往编译为内核模块,在需要时才动态加载到内核中通常CPU、PCI、TCP/IP、APM、VFS等的驱动直接编译在内核文件中,其它驱动(声卡、网卡等)则作为模块动态加载。什么是设备驱动程20设备驱动程的作用在于提供机制,而不是策略机制-功能策略-如何使用功能驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上层应用程序什么是设备驱动程21132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类22进程管理:CPU是计算机系统中的最重要的资源,进程管理也称CPU管理,进程管理的任务包括进程的创建、销毁、阻塞、调度及进程间的通信等内存管理:内存也是计算机系统中的主要资源,内存管理的任务主要是内存的分配与回收及虚拟内存的实现23文件系统:文件系统是计算机中的软件资源,Linux中将设备也当作文件处理,几乎是“一切皆文件”设备控制:几乎每个系统操作最终都会映射到物理设备上。内核必须为系统中的每件外设嵌入相应的驱动程序,这包括硬盘驱动器、键盘和磁带驱动器等24网络功能:网络功能必须由操作系统来管理,因为大部分网络操作和具体进程无关:进入系统的报文是异步事件,报文在某一个进程接手之前必须被收集,识别,分发。系统负责在进程和网络接口之间递送数据报文;另外,所有的路由和地址解析问题都在内核中实现。25132第1章设备驱动程序简介什么是设备驱动程序内核功能划分可装载模块3设备和模块的分类26可装载模块可装载模块是Linux最吸引人的一个特性,用户可将一时不用或很少使用的功能(包括设备驱动程序)编译为模块,需要时再装载,不用时卸载,这样可以有效地减小内核。当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod自动执行modprobe命令加载所需的内核模块用户
本文标题:第1章 设备驱动程序简介
链接地址:https://www.777doc.com/doc-3796176 .html