新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于嵌入式Linux系统设备驱动程序的开发

基于嵌入式Linux系统设备驱动程序的开发

作者:时间:2012-04-19来源:网络收藏


初始化时将调用初始化函数int device_init( ),该函数包括以下内容:

注册所用设备。用设备号来标识字符设备和块设备。设备号分为主设备号和从设备号,最终形成设备接点。设备节点在访问字符设备和块设备的设备时将使用。通常主设备号标识设备对应的,大多数设备是“一个主设备号对应一个”,如:虚拟控制台和串口终端由驱动程序4管理。次设备号由内核使用,用于确定设备文件所指的设备。字符设备和块设备注册时必须先定义好设备号。

字符设备注册函数如下:
int register_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);
其中 major是主设备号。

由于对网络设备驱动程序的访问不需要设备节点,它的注册函数如下:
int register_netdev(struct net_device *dev)

注册设备所用的中断。中断在现代计算机结构中有重要的地位,操作系统必须提供程序响应中断的能力。一般是把一个中断处理程序注册到系统中去。操作系统在硬件中断发生后调用驱动程序的处理程序。

注册中断所用的函数如下:
int request_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

其中,irq是中断向量;handler是中断处理函数;flags是中断处理中的掩码;devices是设备名;dev_id是在中断共享使用的id。

不使用该设备时,就要调用清除函数void_devicie_exit ( ),它同初始化函数相对应的,主要是:

注销设备,字符设备注销函数如下:
int unregister_chrdev(unsigned int major ,const char *name, struct file_oprations *fops);

注销中断,注销中断所用的函数如下:
int free_irq (unsigned irq,void(*handler)(int,void*,struct pt_regs*),unsigned long flags,const char*device,void* dev_id);

释放资源,模块初始化和清除函数采用module_init(device_init),module_exit(device_exit) 形式

编写服务子程序

服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分是由于系统调用的结果。这部分程序在执行的时候.系统仍认为是和进行调用的进程属于同一个进程. 只是用户态变成了核心态,具有进行此系统调用的用户程序的运行环境.因此可以在其中调用sleep等与进程运行环境有关的函数。

中断服务子程序,又称为驱动程序的下半部分。在Linux系统中.并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以产生在任何一个进程运行的时候,因此在中断服务程序被调用的时候.不能依赖于仟何进程的状态,也就不能调用任何与进程运行环境相关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务程序的时候,都带有一个或多个参数,以唯一标识请求服务的设备。

设备驱动程序的使用

直接将驱动程序编译进linux内核

将设备驱动程序复制到 linux/drivers相关的子目录下,比如字符设备驱动程序 就放在linux/drivers/char下。

修改linux/drivers相关的子目录的Makefile,
如obj-$(config_dev_driver) +=dev_driver.o,这样在编译内核时将会编译dev_driver.c,生成 dev_driver.o.

对内核进行重新编译时,进行相关的配置,比如要使用AT91RM9200的UART,就要如下配置:
Character devices -> Serial drivers ->AT91RM9200 serial port support

将驱动程序编译成驱动模块

在设备驱动程序中要有两个重要函数:
module_init(dev_init),module_exit(dev_exit)

利用相应的交叉编译器以及编译命令将驱动程序dev_driver.c编译成dev_driver.o 这样的动态驱动模块。利用insmod命令给系统安装驱动模块,如果在/dev目录下没有相应的设备文件,就可以使用mknod创建一个设备文件。利用 rmmod命令卸载驱动模块,设备文件的删除可以用rm命令。

结语

设备驱动程序的开发是在Linux环境中最复杂的编程任务之一 。它需要和硬件打交道,容易引起系统崩溃,而且很难调试。掌握设备驱动程序的开发技术,将使得开发嵌入式Linux的系统更为迅速和有效。

参考文献:
1. AlessandroRubmi,JonathanCorbet.Linux设备驱动程序,第3版,中国电力出版社,2006.2
2. 毛德操、胡希明,Linux内核源代码情景分析,浙江大学出版社,2001
3. 周立功、陈明记、陈渝,ARM嵌入式linux系统构建与驱动开发,北京航空航天大学出版社,2006年1月第1版
4. 李祥兵、郑扣根,Linux中I2C总线驱动程序的开发,计算机工程与设计,2005;26(1)
5. 郑伟、王钦若,Linux内核空间设备驱动程序的开发,微计算机信息,2003;19(12)

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭