嵌入式Linux设备驱动开发之:字符设备驱动编程
3.设备驱动程序主要组成
(1)早期版本的字符设备注册。
早期版本的设备注册使用函数register_chrdev(),调用该函数后就可以向系统申请主设备号,如果register_chrdev()操作成功,设备名就会出现在/proc/devices文件里。在关闭设备时,通常需要解除原先的设备注册,此时可使用函数unregister_chrdev(),此后该设备就会从/proc/devices里消失。其中主设备号和次设备号不能大于255。
当前不少的字符设备驱动代码仍然使用这些早期版本的函数接口,但在未来内核的代码中,将不会出现这种编程接口机制。因此应该尽量使用后面讲述的编程机制。
register_chrdev()函数格式如表11.1所示。
表11.1 register_chrdev()函数语法要点
所需头文件 | #includelinux/fs.h> |
函数原型 | intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops) |
函数传入值 | major:设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态地分配一个主设备号 |
name:设备名 | |
fops:对各个调用的入口点 | |
函数返回值 | 成功:如果是动态分配主设备号,此返回所分配的主设备号。且设备名就会出现在/proc/devices文件里 |
出错:-1 |
unregister_chrdev()函数格式如下表11.2所示:
表11.2 unregister_chrdev()函数语法要点
所需头文件 | #includelinux/fs.h> |
函数原型 | intunregister_chrdev(unsignedintmajor,constchar*name) |
函数传入值 | major:设备的主设备号,必须和注册时的主设备号相同 |
name:设备名 | |
函数返回值 | 成功:0,且设备名从/proc/devices文件里消失 |
出错:-1 |
(2)设备号相关函数。
在前面已经提到设备号有主设备号和次设备号,其中主设备号表示设备类型,对应于确定的驱动程序,具备相同主设备号的设备之间共用同一个驱动程序,而用次设备号来标识具体物理设备。因此在创建字符设备之前,必须先获得设备的编号(可能需要分配多个设备号)。
在Linux2.6的版本中,用dev_t类型来描述设备号(dev_t是32位数值类型,其中高12位表示主设备号,低20位表示次设备号)。用两个宏MAJOR和MINOR分别获得dev_t设备号的主设备号和次设备号,而且用MKDEV宏来实现逆过程,即组合主设备号和次设备号而获得dev_t类型设备号。
分配设备号有静态和动态的两种方法。静态分配(register_chrdev_region()函数)是指在事先知道设备主设备号的情况下,通过参数函数指定第一个设备号(它的次设备号通常为0)而向系统申请分配一定数目的设备号。动态分配(alloc_chrdev_region())是指通过参数仅设置第一个次设备号(通常为0,事先不会知道主设备号)和要分配的设备数目而系统动态分配所需的设备号。
通过unregister_chrdev_region()函数释放已分配的(无论是静态的还是动态的)设备号。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)linux相关文章:linux教程
评论