Linux设备驱动程序培训课件

上传人:luobi****88888 文档编号:93486039 上传时间:2019-07-22 格式:PPT 页数:80 大小:692.50KB
返回 下载 相关 举报
Linux设备驱动程序培训课件_第1页
第1页 / 共80页
Linux设备驱动程序培训课件_第2页
第2页 / 共80页
Linux设备驱动程序培训课件_第3页
第3页 / 共80页
Linux设备驱动程序培训课件_第4页
第4页 / 共80页
Linux设备驱动程序培训课件_第5页
第5页 / 共80页
点击查看更多>>
资源描述

《Linux设备驱动程序培训课件》由会员分享,可在线阅读,更多相关《Linux设备驱动程序培训课件(80页珍藏版)》请在金锄头文库上搜索。

1、主 题:,Linux设备驱动程序,主讲人:,徐文正,V1.0,大纲,1- 设备驱动程序入门 2- 中断处理 3- 等待队列 4- 定时处理 5- 实例分析字符设备驱动程序 6- 实例分析网络设备驱动程序 7- 用户与内核的接口,1 设备驱动程序入门,驱动程序分类 模块方式驱动程序 内核方式驱动程序 用户模块驱动程序,1.1 驱动程序分类,字符设备驱动程序 表现为文件,面向字节,即时收发数据 块设备驱动程序 表现为文件,面向块,通过缓存区进行缓冲 网络设备驱动程序 表现为net_device结构链表中的一项,面向流或数据 报,通过sk_buff结构进行收发,1.2 模块方式驱动程序,编写步骤 1

2、) 写入口函数 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_i

3、nit(your_init_func) 主要执行设备的注册 Cleanup_module() 模块清理函数。在移除模块时执行 也可以用module_exit(your_cleanup_func) 主要执行设备的反注册,1.2 模块方式驱动程序,三、编译,用如下命令将mydriver.c编译为mydriver.o Ppc_8xx-gcc-DLINUX-DMODULE- D_KERNEL_-Wall-Wstrict-prototypes-fno- builtin-nostdinc -O2- I/opt/hardhat/devkit/lsp/embeddedplanet-cllf-ppc_8xx/l

4、inux-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/-c Mydriver.c,1.2 模块方式驱动程序,四、插入模块,insmod mydriver.o 该命令将驱动程序模块插入到内核中,并执行init_module()函数。该命令也可以向驱动程序中传递一些参数

5、。 rmmod mydriver 该命令将驱动程序模块从内核中先移除,并执行cleanup_module()函数。 其它命令:modprobe、depmod、modinfo。,1.2 模块方式驱动程序,五、创建设备文件,Mknod/dev/mydriver c major minor 该命令创建一个字符设备文件mydriver,它的主设备号是major,次设备号是minor。设备号信息可以在/proc/devices文件中获得。 网络设备驱动程序不需要此步骤,因为它不出现在文件系统中。,1.2 模块方式驱动程序,模块驱动程序的调试,使用printk函数 在程序的开始加入 #define MY_

6、debug 在需要打印调试信息的位置加入 #ifdef MY_DEBUG printk(“my debug info”); #endif,1.2 模块方式驱动程序,模块驱动程序实例,Modexample.c #include #include #include #include #include #include unsigned int test_major=0 ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *offset) int left; if(verify_area(VERIFY_WRITE,buf

7、,count)=-EFAULT) Return EFAULT; for(left=count;left0;left-) put_user(1,buf); buf+ Return count; ,1.2 模块方式驱动程序,ssize_t write_test(struct file *file,const char *buf,size_t count,loff_t *offset) Return count; Int open_test(struct inode *inode,strut file *file) MOD_INC_USE_COUNT; Return 0; Int release_t

8、est(struct inode *inode,struct file *file) MOD_DEC_USE_COUNT; Return 0; ,1.2 模块方式驱动程序,Static struct file_operations Test_fops= Read: read_test, write: write_test, open: open_test, release: release_test, ; Int my_init_module(void) Int result; Result=register_chrdev(test_major,”test”, ,1.2 模块方式驱动程序,Vo

9、id my_cleanup_module(void) Unregister_chrdev(test_major,”test”); Module_init(my_init_module); Module_exit(my_cleanup_module); 编译 Insmod modexample.o 如果安装成功,在/proc/devices文件中就可以看到设备test,并可以看到它的主设备号。 创建设备文件 Mknod/dev/test major minor 将minor设为0即可,1.3 内核方式驱动程序,编写步骤 1) 写入口函数 2) 写初始化函数 3) 修改Config.in文件 4)

10、 修改Makefile文件 5) 配置初始化函数 6) 编译内核 7) 创建设备文件 调试方式 实例,1.3 内核方式驱动程序,一、入口函数,Open(), Release() 打开和关闭设备 Write(), Read() 读写设备 ioctl() 对设备的控制函数 其他函数,如和中断处理函数等,二、初始化函数,一般命名为mydriver_init() 其功能包括: 填充设备相关结构的信息域 实现入口函数指针与设备相 关结构的连接 探测可用的IRQ号 探测可用的IO基址 注册设备,1.3 内核方式驱动程序,三、修改Config.in文件,目的:在配置内核时要在相应菜单下出现my driver

11、选项 修改文件 linux-2.4.17_mv121/drivers/char/Config.in, 在相应位置添加如下语句 bool my driver CONFIG_MYDRIVER,四、修改Makefile文件,目的:使内核能够编译mydriver.c文件(在配置内核时选择了my driver) 修改文件 linux-2.4.17_mv121/drivers/char/Makefile,在相应位置添加如下语句 obj-$( CONFIG_MYDRIVER)+=mydriver.o 将mydriver.c等源文件拷贝到目录linux-2.4.17_mv121/drivers/char/下,

12、1.3 内核方式驱动程序,五、配置初始化函数,目的:使内核启动时执行mydriver_init()函数 在linux-2.4.17_mv121/drivers/block/genhd.c中device_init()函数外的适当位置添加: #ifdef CONFIG_MYDRIVER extern void mydriver_init(void); #endif 在linux-2.4.17_mv121/drivers/block/genhd.c中device_init()函数内的适当位置添加: #ifdef CONFIG_MYDRIVER mydriver_init(); #endif,1.3

13、内核方式驱动程序,六、编译内核,在linux-2.4.17_mv121/下执行如下命令 make clean; make dep; make zImage 编译好的内核保存在linux-2.4.17_mv121/arch/ppc/boot/images/zImage.embedded中; 启动内核就可以在/proc/devices文件中看到mydriver设备,七、创建设备文件,Mknod/dev/mydriver c major minor 该命令创建了一个字符设备文件mydriver,它的主设备号是major,次设备号是minor。设备号信息可以在/proc/devices文件中获得。 也

14、可以在rc.sysinit文件中添加此命令,从而在启动时自动创建该设备文件,1.3 内核方式驱动程序,内核驱动程序调试,Printk Kgdb BDI2000,一.配置内核 1.Make menuconfig 2.在Kernel Hacking部分选中CONFIG_KGDB 3.将makefile中的CFLAGS变量修改为CFLAGS= -Wall-Wstrict-prototypes o2 g ggdb 二.重新编译内核并启动,内核会等待gdb连接 三.关闭minicom 四.在主机上执行ddd debugger /opt/hardhat/devkit/ppc/8xx/bin/ppc_8xx

15、-gdb gdb /opt/hardhat/devkip/lsp/embeddedpla Net-cllf-ppc_8xx/linux2.4.17_mv121/vmlinux 五.然后在ddd中输入 target remote /dev/ttyS0,1.3 内核方式驱动程序,BDI2000,一.配置内核 1.Make menuconfig 2.在Kernel Hacking部分选中CONFIG_KGDB 3.将makefile中的CFLAGS变量修改为变量修改为CFLAGS=-Wall-Wstrict-prototypes o2 g ggdb 二.配置BDI2000,ip设为192.168.1

16、.20 三.在主机上输入telnet 192.168.1.20 四.通过BDI2000下载并启动内核 BDIload Ox200000 nete860.bin BIN BDIti Ox200000 五.在主机上执行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中输入:Target remote 192.168.1.20:2001,1.4 用户模式驱动程序,适用范围及特点 I/O映射 内存映射 读写设备,1.4 用户模式驱动程序,适用范围及特点,测试新的硬件设备 测试一个新的设

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 其它文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号