3.Linux 设备驱动程序的初始化
设备驱动程序所提供的入口点,在设备驱动程序初始化时向系统进行登记,以便系统
在适当的时候调用。系统里,通过调用) %向系统注册字符型设备驱动
程序。) %定义为:
#include <linux/fs.h>
#include <linux/errno.h>
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
其中,是为设备驱动程序向系统申请的主设备号,如果为$,则系统为此驱动程
序动态分配一个主设备号。&是设备名。-即上述对各个调用的入口点说明。此函
数返回$时表示成功。返回!0&45表示申请的主设备号非法,一般来说是主设备号大于
系统所允许的最大设备号。返回!06'78表示所申请的主设备号正在被其他设备程序使用。
如果动态分配主设备号成功,此函数将返回所分配的主设备号。如果) %操
作成功,设备名就会出现在 % 文件中。
为每个设备在%目录中建立一个文件,若用29命令列出函数返回值,则小
于$表示注册失败;返回$或者大于$的值表示注册成功。
22$支持:个主设备号22和;支持<=个主设备号$
和<<保留。注册以后,把设备名和主次设备号联系起来。当有对此设备名的访问
时,通过请求访问的设备名得到主次设备号,然后把此访问分发到对应的设备驱动,
设备驱动再根据次设备号调用不同的函数。
当设备驱动模块从内核中卸载,对应的主设备号必须被释放。在模块卸载调用
函数时,应该调用下面的函数卸载设备驱动:
2) %)22>2 2 2?@2
此函数的参数为主设备号和设备名。内核把和在内核
注册的名称对比,如果不相等,卸载失败,并返回!0&45;如果大于最大的设备
号,也返回!0&45。
初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时钟、端
口等,这些资源也可以在子程序或者其他地方申请。这些资源不用时,应该释放,以
利于资源的共享。
设备驱动的初始化函数只要完成的功能是:
(1) 对驱动程序管理的硬件进行必要的初始化
对硬件寄存器进行设置。比如设置中断掩码,设置串口的工作方式、并口的数据方向
等。
(2) 初始化设备驱动相关的参数
一般说来,每个设备都要定义一个设备变量,用以保存设备相关的参数。在这里可以
对设置变量中的项进行初始化。
(3) 在内核注册设备
内核通过设备的主设备号和从设备号来访问设备驱动,每个驱动程序都有唯一
的主设备号。设备号可以自动获取,内核会分配一个独一无二的主设备号,但这样每次获