《嵌入式应用程序设计设备驱动.ppt》由会员分享,可在线阅读,更多相关《嵌入式应用程序设计设备驱动.ppt(24页珍藏版)》请在三一办公上搜索。
1、嵌入式应用程序设计第八章 嵌入式Linux设备驱动编程,知识点回顾,TCP/IP模型套接字TCP 套接字编程UDP 套接字编程,滨州学院计算机科学技术系吴殿红,设备驱动的基本概念Linux内核与驱动的关系Linux内核模块结构内核模块命令,本次课内容,滨州学院计算机科学技术系吴殿红,1.设备驱动概念 是处理和操作硬件控制器的软件。驱动程序是内核的一部分,是操作系统内核与硬件设备的直接接口,驱动程序屏蔽了硬件的细节,完成以下功能:对设备初始化和释放;对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;读取应用程序传送给设备文件的数据或者回送应用程序请求的数据;检测和处理设备出现的错误。,
2、8.1 设备驱动编程基础设备驱动,滨州学院计算机科学技术系吴殿红,2.Linux系统的设备分类字符设备通常指以字节为单位顺序读写的设备,如并口设备、虚拟控制台等。块设备通常指以块为单位随机读写的设备,如IDE硬盘、SCSI硬盘、光驱等。网络设备通常是指通过网络能够与其他主机进行数据通信的设备,如网卡等。,8.1 设备驱动编程基础设备驱动,举例:linux设备识别,在linux中任何设备都是文件。所有设备的设备文件节点都在/dev目录下。#:ls al/dev,滨州学院计算机科学技术系吴殿红,3.设备驱动程序的特点 内核代码 内核接口 内核机制和服务 可装载 可设置 动态性,8.1 设备驱动编程
3、基础设备驱动,滨州学院计算机科学技术系吴殿红,4.设备驱动程序与整个软硬件系统的关系,8.1 设备驱动编程基础设备驱动,滨州学院计算机科学技术系吴殿红,1.Linux的内核模块Linux内核采用可加载内核模块化设计(Loadable Kernel Module,LKM)内核模块:是一些可以让操作系统内核在需要时载入和执行的代码。是一种目标对象文件,通常由一组函数和数据结构组成。内核的一个模块可以以两种方式被编译和加载。直接编译进Linux内核,随同Linux启动时加载;编译成一个可加载和删除的模块。,8.1 设备驱动编程基础内核模块编程,8.1 设备驱动编程基础内核模块编程,C语言程序 Lin
4、ux内核模块运行 用户空间 内核空间入口 main()module_init()指定;出口 main()module_exit()指定;编译 gcc c Makefile连接 ld insmod运行 直接运行 insmod调试 gdb kdbug,kdb,kgdb等,2.Linux内核模块与应用程序的区别,8.1 设备驱动编程基础内核模块编程,3.内核模块相关命令insmod module.oLoad the module注意,只有超级用户才能使用这个命令rmmod module Unload the modulelsmodList all modules loaded into the ke
5、rnel这个命令和cat/proc/modules等价modprobe-r Load the module specified and modules it depends,举例:模块相关命令,lsmodinsmod hello.ormmod hellomodprobe/lib/modules/linux版本号/modules.dep/etc/modprobe.conf modeproble r hello,最简单的内核模块例子,#include#include#includeMODULE_LICENSE(GPL);static int _init hello_init(void)printk
6、(“Hello kernel.n);return 0;static void _exit hello_exit(void)printk(“bye bye.n);module_init(hello_init);module_exit(hello_exit);,生成makefile文件,Makefile文件obj-m:=hello.oall:make-C/usr/src/linux-2.4.20/M=$(shell pwd)modulesclean:make-C/usr/src/linux-2.4.20/M=$(shell pwd)modules clean,编译装载过程,$lshello.c M
7、akefile$makemake-C/usr/src/linux-2.4.20/M=/wu/char_8 modules$lshello.c hello.mod.c hello.mode.o hello.omake.log Makefile modules.order$sudo insmod hello.o$dmesg|tail-1Hello kernel$lsmod|grep hellohello 1216 0$sudo rmmod hello$dmesg|tail-1bye bye.,不需要编写Makefile的方法,gcc编译后加上-DMODULE-DLINUX 参数例如:gcc-DMO
8、DULE-DLINUX-I/usr/src/linux-2.4.20/include-c-o hello.o hello.c 注意:-I选项跟着Linux内核源代码中Include目录的路径。,滨州学院计算机科学技术系吴殿红,4.内核模块的程序结构一个Linux内核模块主要由以下几个部分组成。模块加载函数(必须)模块卸载函数(必须)模块许可证声明(必须)模块参数(可选)模块导出符号(可选)模块作者等信息声明(可选),8.1 设备驱动编程基础内核模块编程,滨州学院计算机科学技术系吴殿红,static int _init initialization_function(void)/*初始化代码*/
9、module_init(initialization_function);,模块加载函数,滨州学院计算机科学技术系吴殿红,static void _exit cleanup_function(void)/*释放代码*/module_exit(cleanup_function);,模块卸载函数,滨州学院计算机科学技术系吴殿红,module_param(参数名,参数类型,参数读/写权限访问许可掩码)宏为模块声明一个参数支持的参数类型byte,short,ushort,int,uint,long,ulong,bool,charp,invboolarray(module_param_array(nam
10、e,type,nump,perm)例如:static char*str_param=Linux Module Program;static int num_param=4000;module_param(num_param,int,S_IRUGO);module_param(str_param,charp,S_IRUGO);参数在模块加载时传递#insmod hello.o test=2,模块参数,滨州学院计算机科学技术系吴殿红,导出符号EXPORT_SYMBOL(符号名);EXPORT_SYMBOL_GPL(符号名);模块声明与描述MODULE_AUTHOR(author);MODULE_D
11、ESCRIPTION(description);MODULE_VERSION(version_string);MODULE_DEVICE_TABLE(table_info);MODULE_ALIAS(alternate_name);,导出符号与模块声明与描述,#include#include#include static char*whom=world;static int howmany=1;module_param(howmany,int,0444);module_param(whom,charp,S_IRUGO);static int _init hello_init(void)int
12、i;for(i=0;i howmany;i+)printk(“(%d)Hello,%sn”,i,whom);return 0;static void _exit hello_exit(void)printk(Goodbye worldn);MODULE_LICENSE(GPL);MODULE_DESCRIPTION(“A simple module program”);MODULE_VERSION(“V1.0”);MODULE_AUTHOR(“wdh);module_init(hello_init);module_exit(hello_exit);,举例:带参数的内核模块,sudo insmod hello.o howmany=10 whom=Tom,小结,设备驱动概念Linux中设备驱动的分类内核模块的两种编译加载方式内核模块编程思考:改进前面程序,