驱动程序(嵌入式系统)

上传人:kms****20 文档编号:51397991 上传时间:2018-08-13 格式:PPT 页数:33 大小:1.15MB
返回 下载 相关 举报
驱动程序(嵌入式系统)_第1页
第1页 / 共33页
驱动程序(嵌入式系统)_第2页
第2页 / 共33页
驱动程序(嵌入式系统)_第3页
第3页 / 共33页
驱动程序(嵌入式系统)_第4页
第4页 / 共33页
驱动程序(嵌入式系统)_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《驱动程序(嵌入式系统)》由会员分享,可在线阅读,更多相关《驱动程序(嵌入式系统)(33页珍藏版)》请在金锄头文库上搜索。

1、驱动硬件是操作系统最基本的功能。它通过驱动程序来操作 硬件。驱动程序是内核和硬件之间的接口,为应用程序屏蔽了硬件 的细节。驱动程序最为操作系统最基本组成部分,具有以下功能:对设备初始化和释放。驱动程序要完成设备注册,初始化及对设 备的卸载数据传送。驱动程序最重要的功能就是在内核,硬件和应用程序 之间传送数据。即把数据从内核传到硬件和从硬件读取数据;读 取应用程序传给设备文件的数据和回送应用程序要求的数据检测和处理设备出现的错误。Linux输入/输出系统层次结构和功能:用户应用程序(设备)文件系统设备驱动程序物理设备控制器输入/输出请求输入/输出响应物理设备物理设备控制器驱动程序通常是以内核模块

2、的形式加载进内核 或直 接 编译进内核,(但编译进内核是某些驱动运行的唯 一方法。例如:console驱动,flash驱动和对至少一 种文件系统的支持等等。)是内核的一部分。与应用 程序的执行过程不同,模块通常只是预先向内核注册 自己,当内核需要时响应请求。用户的应用程序以设备文件方式访问驱动程序。即 linux把设备当文件,通过文件系统对设备进行访问所有的设备的驱动程序有共性,了解驱动程序的结构 ,对嵌入式系统的开发有价值设备驱动程序流程图:insmodrmmodinit_module()clean_module()模块内核设备功能设备注册设备卸载用户调用Linux的设备管理嵌入式Linux

3、设备驱动程序的设计大致包括以下步骤:向系统申请也可以动态获得主、次设备号。实现设备初始化和卸载模块。(以模块方式)设计对设备文件操作。如定义file_operations结构。设计对设备文件操作调用。如read、write等操作。实现中断服务函数,用request_irq向内核注册。将驱动程序编译到内核或编译成模块,用ismod命令加载 。生成设备节点文件。模块作为一种抽象数据类型,它具有一个可以通过静态内核中断的 接口。最小的模块结构必须包括两个函数:init_module()和 cleanup_module(),它们在系统加载模块和卸载模块时被调用。也 可以编写一个只包括这两个函数的模块,

4、这样该模块中唯一会被调 用的函数就是模块被加载时所调用的函数init_module()和模块被卸 载时所调用的函数cleanup_module()。并且用函数init_module()来 启动模块加载期间的操作,用函数cleanup_module()来停止这些操 作。由于模块可以实现相当复杂的功能,故可以在模块中加入很多新函 数以实现所期望的功能。不过加入模块的每个新函数都必须在该模 块加载到内核中时进行注册。若该模块是静态加载的,则该模块的 所有函数都是在内核启动时进行注册;若该模块是动态加载的,则 这些新函数必须在加载这个模块时动态注册。当然,如果该模块被 动态卸载了,则该模块的函数都必须

5、从系统中注销。通过这种方式 ,当这个模块不在系统中时,就不能调用该模块的函数。其中注册 工作通常是在函数init_module()中完成的,而注销工作则是在函数 cleanup_module()中完成。 1 模块的组织结构应用程序与内核模块的比较源程序:有main();没有main(内核模块结构)编译:gcc;gcc加参数(幻33)运行:运行命令;模块加载(用命令insmod rmmod 或内核裁减,以模块方式或编译进内核,由内核需要 时调用)内核模块 结构#include / 说明是个内核功能 #include / 声明是一个模块 / 其它header信息 int init_module(

6、) / 加载时,初始化模块的编码 如注册register_chrdev / 期望该模块所能实现的一些功能函数,如open()、 release()、write()、 read()、ioctl()等函数 void cleanup_module( ) / 卸载时,注销模块的编码 module_init(dri_arch_init_module); 加载本驱动是执行 module_exit(dri_arch_cleanup_module);卸载驱动时执行一般编译模块文件的命令格式如下:#gcc -O2 g -Wall -DMODULE -D_KERNEL_ -c f -I/usr/src/ linu

7、x- 2.4/include filename.c /filename.c为自己编写的模块程序源代码文件 (2)模块的编译 (3) 模块的加载(4) 模块的卸载Insmod命令调用module_initrmmod命令调用module_exitLinux内核模块结构介绍#include /所有模块都需要的 头文件 #include / initreturn 0; 内核模块的基本框架(1/2):Linux内核模块结构介绍static void _exit hello_exit (void) printk(“Hello module exitn“); module_init(hello_init);

8、 module_exit(hello_exit); 内核模块的基本框架(2/2):Linux内核模块结构介绍gcc -D_KERNEL_ -DMODULE -DLINUX -I /usr/src/linux2.4/include -c -o hello.o hello.c insmod ./hello.o rmmod hello 内核模块的编译和加载:模块作为一种抽象数据类型,它具有一个可以通过静态内核中断的 接口。最小的模块结构必须包括两个函数:init_module()和 cleanup_module(),它们在系统加载模块和卸载模块时被调用。也 可以编写一个只包括这两个函数的模块,这样该

9、模块中唯一会被调 用的函数就是模块被加载时所调用的函数init_module()和模块被卸 载时所调用的函数cleanup_module()。并且用函数init_module()来 启动模块加载期间的操作,用函数cleanup_module()来停止这些操 作。由于模块可以实现相当复杂的功能,故可以在模块中加入很多新函 数以实现所期望的功能。不过加入模块的每个新函数都必须在该模 块加载到内核中时进行注册。若该模块是静态加载的,则该模块的 所有函数都是在内核启动时进行注册;若该模块是动态加载的,则 这些新函数必须在加载这个模块时动态注册。当然,如果该模块被 动态卸载了,则该模块的函数都必须从系统

10、中注销。通过这种方式 ,当这个模块不在系统中时,就不能调用该模块的函数。其中注册 工作通常是在函数init_module()中完成的,而注销工作则是在函数 cleanup_module()中完成。 7.2.1 模块的组织结构#include / 说明是个内核功能 #include / 声明是一个模块 / 其它header信息 int init_module( ) / 加载时,初始化模块的编码 / 期望该模块所能实现的一些功能函数,如open()、release()、write()、 read()、ioctl()等函数 void cleanup_module( ) / 卸载时,注销模块的编码 一

11、般编译模块文件的命令格式如下:#gcc -O2 g -Wall -DMODULE -D_KERNEL_ -c f -I/usr/src/ linux- 2.4/include filename.c /filename.c为自己编写的模块程序源代码文件 7.2.2 模块的编译 7.2.3 模块的加载7.2.4 模块的卸载图7-1 模块链接到内核的示意图7.2.5 模块链接到内核的示意图在内核是用一个file结构来识别模块,而且内核使用file_operations结 构来访问模块程序中的函数。file_operations结构是一个定义在 中的函数指针表。管理模块的文件操作,通常也称为“方 法”

12、,它们都为struct file_operations提供函数指针。在struct file_operations中的操作一般按如下顺序出现,除非特别说明,一般它 们返回0值时表示访问成功;发生错误时会返回一个负的错误值(目前共 有13个操作):int (*lseek) ()、 int (*read)()、int (*write) ()int (*readdir)()、int (*select)()、 int (*ioctl)()int (*mmap)()、int (*open)()、void (*release)()int (*fsync)()、int (*fasync)()int (*ch

13、eck_media_change)()int (*revalidate)() u 用于字符设备的I/O调用主要有:open()、release()、read()、write()和ioctl()。7.2.6 模块管理程序中的文件操作驱动字符设备的注册 字符设备驱动程序入口点在xxx_init_modules函数。 通过系统调用register_chrdev()向系统注册字符型设备驱 动程序,在内核中登记设备驱动程序。register_chrdev()定义如下: #include #include int register_chrdev (unsigned int major, const cha

14、r *name, struct file_operations *ops)字符设备驱动程序注册要用到的数据结构定义:struct device_struct const char *name; struct file_operations *chops; ; static struct device_struct chrdevsMAX_CHRDEV; 8.4.1 字符类类型设备设备 的驱动驱动 程序 当字符设备向内核进行注册时,设备的file_operations结构及其 名字将被添加到一个全局性的chrdevs数组中去,这个数组是由一些 device_struct结构组成,数组的下标就是设备的主设备号,该数组被成 为字符设备切换表。 因此,通过查看chrdevsYOUR_MAJOR-

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

当前位置:首页 > 生活休闲 > 科普知识

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