您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Linux设备驱动程序
V1.0大纲1-设备驱动程序入门2-中断处理3-等待队列4-定时处理5-实例分析字符设备驱动程序6-实例分析网络设备驱动程序7-用户与内核的接口§1设备驱动程序入门•驱动程序分类•模块方式驱动程序•内核方式驱动程序•用户模块驱动程序§1.1驱动程序分类•字符设备驱动程序表现为文件,面向字节,即时收发数据•块设备驱动程序表现为文件,面向块,通过缓存区进行缓冲•网络设备驱动程序表现为net_device结构链表中的一项,面向流或数据报,通过sk_buff结构进行收发§1.2模块方式驱动程序•编写步骤1)写入口函数2)写模块函数3)编译为.O文件4)插入模块5)创建设备文件•调试方式•实例§1.2模块方式驱动程序•一、入口函数Open()•打开设备•增加使用记数;分配内存空间;初始化变量、函数;申请中断、I/O空间Release()•关闭设备•减少使用记数;释放内存空间;释放中断、I/O空间Write()•写设备·Copy_from_user()Read()•写设备·Copy_to_user()其他函数如ioctl()和中断处理函数等§1.2模块方式驱动程序•二、模块函数Init_module()•模块初始化函数。在插入模块时执行•也可以用module_init(your_init_func)•主要执行设备的注册Cleanup_module()•模块清理函数。在移除模块时执行•也可以用module_exit(your_cleanup_func)•主要执行设备的反注册§1.2模块方式驱动程序•三、编译用如下命令将mydriver.c编译为mydriver.oPpc_8xx-gcc-DLINUX-DMODULE-D_KERNEL_-Wall-Wstrict-prototypes-fno-builtin-nostdinc-O2-I/opt/hardhat/devkit/lsp/embeddedplanet-cllf-ppc_8xx/linux-2.4.17_mvl21/include/-I/opt/hardhat/devkit/ppc/8xx/lib/lib/gcc-Lib/powerpc-hardhat-linux/2.95.3/include/-I/opt/hardhat/devkit/lsp/embeddedplanet-cllf-ppc_8xx/linux-2.4.17_mvl21/arch/ppc/-cMydriver.c§1.2模块方式驱动程序•四、插入模块insmodmydriver.o该命令将驱动程序模块插入到内核中,并执行init_module()函数。该命令也可以向驱动程序中传递一些参数。rmmodmydriver该命令将驱动程序模块从内核中先移除,并执行cleanup_module()函数。其它命令:modprobe、depmod、modinfo。§1.2模块方式驱动程序•五、创建设备文件Mknod/dev/mydrivercmajorminor该命令创建一个字符设备文件mydriver,它的主设备号是major,次设备号是minor。设备号信息可以在/proc/devices文件中获得。网络设备驱动程序不需要此步骤,因为它不出现在文件系统中。§1.2模块方式驱动程序•模块驱动程序的调试使用printk函数在程序的开始加入#defineMY_debug在需要打印调试信息的位置加入#ifdefMY_DEBUGprintk(“1mydebuginfo”);#endif§1.2模块方式驱动程序•模块驱动程序实例Modexample.c#includelinux/module.h#includelinux/init.h#includelinux/kernel.h#includelinux/fs.h#includelinux/proc_fs.h#includelinux/uaccess.hunsignedinttest_major=0ssize_tread_test(structfile*file,char*buf,size_tcount,loff_t*offset){intleft;if(verify_area(VERIFY_WRITE,buf,count)==-EFAULT)Return–EFAULT;for(left=count;left0;left--){put_user(1,buf);buf++}Returncount;}§1.2模块方式驱动程序ssize_twrite_test(structfile*file,constchar*buf,size_tcount,loff_t*offset){Returncount;}Intopen_test(structinode*inode,strutfile*file){MOD_INC_USE_COUNT;Return0;}Intrelease_test(structinode*inode,structfile*file){MOD_DEC_USE_COUNT;Return0;}§1.2模块方式驱动程序Staticstructfile_operationsTest_fops={Read:read_test,write:write_test,open:open_test,release:release_test,};Intmy_init_module(void){Intresult;Result=register_chrdev(test_major,”test”,&test_fops);If(result0){Printk(KERN_INFO“test:can’tgetmajornumber\n”);Returnresult;}If(test_major==0)test_major=result;/*Dynamic*/Return0;}§1.2模块方式驱动程序Voidmy_cleanup_module(void){Unregister_chrdev(test_major,”test”);}Module_init(my_init_module);Module_exit(my_cleanup_module);编译Insmodmodexample.o如果安装成功,在/proc/devices文件中就可以看到设备test,并可以看到它的主设备号。创建设备文件Mknod/dev/testmajorminor将minor设为0即可§1.3内核方式驱动程序•编写步骤1)写入口函数2)写初始化函数3)修改Config.in文件4)修改Makefile文件5)配置初始化函数6)编译内核7)创建设备文件•调试方式•实例§1.3内核方式驱动程序•一、入口函数Open(),Release()•打开和关闭设备Write(),Read()•读写设备ioctl()•对设备的控制函数其他函数,如和中断处理函数等•二、初始化函数一般命名为mydriver_init()其功能包括:•填充设备相关结构的信息域•实现入口函数指针与设备相关结构的连接•探测可用的IRQ号•探测可用的IO基址•注册设备§1.3内核方式驱动程序•三、修改Config.in文件目的:在配置内核时要在相应菜单下出现mydriver选项修改文件linux-2.4.17_mv121/drivers/char/Config.in,在相应位置添加如下语句bool’mydriver’CONFIG_MYDRIVER•四、修改Makefile文件目的:使内核能够编译mydriver.c文件(在配置内核时选择了mydriver)修改文件linux-2.4.17_mv121/drivers/char/Makefile,在相应位置添加如下语句obj-$(CONFIG_MYDRIVER)+=mydriver.o将mydriver.c等源文件拷贝到目录linux-2.4.17_mv121/drivers/char/下§1.3内核方式驱动程序•五、配置初始化函数目的:使内核启动时执行mydriver_init()函数在linux-2.4.17_mv121/drivers/block/genhd.c中device_init()函数外的适当位置添加:#ifdefCONFIG_MYDRIVERexternvoidmydriver_init(void);#endif在linux-2.4.17_mv121/drivers/block/genhd.c中device_init()函数内的适当位置添加:#ifdefCONFIG_MYDRIVERmydriver_init();#endif§1.3内核方式驱动程序•六、编译内核在linux-2.4.17_mv121/下执行如下命令makeclean;makedep;makezImage编译好的内核保存在linux-2.4.17_mv121/arch/ppc/boot/images/zImage.embedded中;启动内核就可以在/proc/devices文件中看到mydriver设备•七、创建设备文件Mknod/dev/mydrivercmajorminor该命令创建了一个字符设备文件mydriver,它的主设备号是major,次设备号是minor。设备号信息可以在/proc/devices文件中获得。也可以在rc.sysinit文件中添加此命令,从而在启动时自动创建该设备文件§1.3内核方式驱动程序•内核驱动程序调试PrintkKgdbBDI2000一.配置内核1.Makemenuconfig2.在KernelHacking部分选中CONFIG_KGDB3.将makefile中的CFLAGS变量修改为CFLAGS=-Wall-Wstrict-prototypes–o2–g–ggdb二.重新编译内核并启动,内核会等待gdb连接三.关闭minicom四.在主机上执行ddd–debugger/opt/hardhat/devkit/ppc/8xx/bin/ppc_8xx-gdb–gdb/opt/hardhat/devkip/lsp/embeddedplaNet-cllf-ppc_8xx/linux2.4.17_mv121/vmlinux五.然后在ddd中输入targetremote/dev/ttyS0§1.3内核方式驱动程序BDI2000一.配置内核1.Makemenuconfig2.在KernelHacking部分选中CONFIG_KGDB3.将makefile中的CFLAGS变量修改为变量修改为CFLAGS=-Wall-Wstrict-prototypes–o2–g–ggdb二.配置BDI2000,ip设为192.168.1.20三.在主机上输入telnet192.168.1.20四.通过BDI2000下载并启动内核BDIloadOx200000nete860.binBINBDItiOx200000五.在主机上执行ddd–debugger/opt/hardhat/devkit/ppc/8xx/bin/ppc_8xx-gdb–gdb/opt/hardhat/devkip/lsp/embeddedplanet-cllf-8xx/linux2.4.17_mvl21/vmlinux六.在ddd中输入:Targetremote192.168.1.20:2001§1.4用户模式驱动程序•适用范围及特点•I/O映射•内存映射•读写设备§1.4用户模式驱动程序•适用范围及特点测试新的硬件设备•测试一个新的设备是否可用•观察设备的工作情况快速创建一个硬件应用•比如控制小马达的转动•点亮某个指示灯范围特点优点:1)可以连接完整的C库,编程容易2)可以使用传统调试器,而不必调试内容缺点:1)不支持设备中断2)不支持设备定时§1.4用户模式驱动程序•I/O映射ioperm()为用户应用程序打开一块I/O空间iopl()为用户应用程序打开整个I/O地址空间MontaVistaLinux
本文标题:Linux设备驱动程序
链接地址:https://www.777doc.com/doc-1307019 .html