驱动程序嵌入式系统.ppt

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用户的应用程序以设备文件方式访问驱动程序。即 linux把设备当文件,通过文件系统对设备进行访问
所有的设备的驱动程序有共性,了解驱动程序的结构, 对嵌入式系统的开发有价值
设备驱动程序流程图:
insmod
模块 init_module()
rmmod
clean_module()
内核 设备注册 设备功能 设备卸载
应用程序与内核模块的比较
源程序:有main();没有main(内核模块结构) 编译:gcc;gcc加参数(幻33) 运行:运行命令;模块加载(用命令insmod rmmod
或内核裁减,以模块方式或编译进内核,由内核需要 时调用)
内核模块结构
#include <linux/kernel.h> // 说明是个内核功能
1 模块的组织结构
模块作为一种抽象数据类型,它具有一个可以通过静态内核中断的 接口。最小的模块结构必须包括两个函数:init_module()和 cleanup_module(),它们在系统加载模块和卸载模块时被调用。也 可以编写一个只包括这两个函数的模块,这样该模块中唯一会被调 用的函数就是模块被加载时所调用的函数init_module()和模块被卸 载时所调用的函数cleanup_module()。并且用函数init_module()来 启动模块加载期间的操作,用函数cleanup_module()来停止这些操 作。
#gcc -O2 –g -Wall -DMODULE -D__KERNEL__ -c –f -I/usr/src/ linux-
2.4/include filename.c //filename.c为自己编写的模块程序源代码文件
(3) 模块的加载
Insmod命令调用module_init
(4) 模块的卸载
由于模块可以实现相当复杂的功能,故可以在模块中加入很多新函 数以实现所期望的功能。不过加入模块的每个新函数都必须在该模 块加载到内核中时进行注册。若该模块是静态加载的,则该模块的 所有函数都是在内核启动时进行注册;若该模块是动态加载的,则 这些新函数必须在加载这个模块时动态注册。当然,如果该模块被 动态卸载了,则该模块的函数都必须从系统中注销。通过这种方式, 当这个模块不在系统中时,就不能调用该模块的函数。其中注册工 作通常是在函数init_module()中完成的,而注销工作则是在函数 cleanup_module()中完成。
#include <linux/module.h> // 声明是一个模块
……
// 其它header信息
int init_module( )
{
……
// 加载时,初始化模块的编码 如注册register_chrdev
}
百度文库
……
……
// 期望该模块所能实现的一些功能函数,如open()、
release()、write()、 read()、ioctl()等函数
用户调用
Linux的设备管理
嵌入式Linux设备驱动程序的设计大致包括以下步骤: 向系统申请也可以动态获得主、次设备号。 实现设备初始化和卸载模块。(以模块方式) 设计对设备文件操作。如定义file_operations结构。 设计对设备文件操作调用。如read、write等操作。 实现中断服务函数,用request_irq向内核注册。 将驱动程序编译到内核或编译成模块,用ismod命令加载。 生成设备节点文件。
检测和处理设备出现的错误。
Linux输入/输出系统层次结构和功能:
输入/输出请求 输入/输出响应 用户应用程序
(设备)文件系统 设备驱动程序
物理物设理设备备控控制器制器 物理设备
驱动程序通常是以内核模块的形式加载进内核 或直 接 编译进内核,(但编译进内核是某些驱动运行的唯 一方法。例如:console驱动,flash驱动和对至少一 种文件系统的支持等等。)是内核的一部分。与应用 程序的执行过程不同,模块通常只是预先向内核注册 自己,当内核需要时响应请求。
驱动硬件是操作系统最基本的功能。它通过驱动程序来操作 硬件。
驱动程序是内核和硬件之间的接口,为应用程序屏蔽了硬件 的细节。
驱动程序最为操作系统最基本组成部分,具有以下功能:
对设备初始化和释放。驱动程序要完成设备注册,初始化及对设 备的卸载
数据传送。驱动程序最重要的功能就是在内核,硬件和应用程序 之间传送数据。即把数据从内核传到硬件和从硬件读取数据;读 取应用程序传给设备文件的数据和回送应用程序要求的数据
rmmod命令调用module_exit
Linux内核模块结构介绍
内核模块的基本框架(1/2):
#include <linux/module.h> //所有模块都需要的 头文件
#include <linux/init.h> // init&exit相关宏
static int __init hello_init (void) {
Linux内核模块结构介绍
内核模块的编译和加载:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux2.4/include -c -o hello.o hello.c
insmod ./hello.o
…………
rmmod hello
……
void cleanup_module( )
{
… … // 卸载时,注销模块的编码

module_init(dri_arch_init_module); 加载本驱动是执行 module_exit(dri_arch_cleanup_module);卸载驱动时执行
(2)模块的编译
一般编译模块文件的命令格式如下:
printk("Hello module init\n"); return 0; }
Linux内核模块结构介绍
内核模块的基本框架(2/2):
static void __exit hello_exit (void) { printk("Hello module exit\n"); }
module_init(hello_init); module_exit(hello_exit);
相关文档
最新文档