`
soboer
  • 浏览: 1311217 次
文章分类
社区版块
存档分类
最新评论

2.4、2.6字符设备注册对比

 
阅读更多

韦东山书本和视频讲的都是字符设备驱动都是2.4的接口

但大多新书早已经是讲2.6的接口了,如LDD3、国嵌、宋宝华的书

(1)早期版本的字符设备注册。

早期版本的设备注册使用函数register_chrdev(),调用该函数后就可以向系统申请主设备号,如果register_chrdev()操作成功,设备名就会出现在/proc/devices文件里。在关闭设备时,通常需要解除原先的设备注册,此时可使用函数unregister_chrdev(),此后该设备就会从/proc/devices里消失。其中主设备号和次设备号不能大于255。

当前不少的字符设备驱动代码仍然使用这些早期版本的函数接口,但在未来内核的代码中,将不会出现这种编程接口机制。因此应该尽量使用后面讲述的编程机制。

register_chrdev()函数语法要点

所需头文件

#include<linux/fs.h>

函数原型

intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops)

函数传入值

major:设备驱动程序向系统申请的主设备号,如果为0则系统为此驱动程序动态

配一个主设备号

name:设备名

fops:对各个调用的入口点

成功:如果是动态分配主设备号,此返回所分配的主设备号。且设备名就会出现在/proc/devices文件里

函数返回值

出错:1

unregister_chrdev()函数语法要点

所需头文件

#include<linux/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()函数释放已分配的(无论是静态的还是动态的)设备号。

它们的函数格式如表11.3所示。

表11.3设备号分配与释放函数语法要点

所需头文件

#include<linux/fs.h>

函数原型

intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name)

intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*nam)

voidunregister_chrdev_region(dev_tfirst,unsignedintcount)

函数传入值

first:要分配的设备号的初始值

count:要分配(释放)的设备号数目

name:要申请设备号的设备名称(在/proc/devices和sysfs中显示)

dev:动态分配的第一个设备号

函数返回值

成功:0(只限于两种注册函数)

出错:1(只限于两种注册函数)

(3)最新版本的字符设备注册。

在获得了系统分配的设备号之后,通过注册设备才能实现设备号和驱动程序之间的关联。这里讲解2.6内核中的字符设备的注册和注销过程。

在Linux内核中使用structcdev结构来描述字符设备,我们在驱动程序中必须将已分配到的设备号以及设备操作接口(即为structfile_operations结构)赋予structcdev结构变量。首先使用cdev_alloc()函数向系统申请分配structcdev结构,再用cdev_init()函数初始化已分配到的结构并与file_operations结构关联起来。最后调用cdev_add()函数将设备号与structcdev结构进行关联并向内核正式报告新设备的注册,这样新设备可以被用起来了。

如果要从系统中删除一个设备,则要调用cdev_del()函数。具体函数格式如表11.4

所示。

最新版本的字符设备注册

所需头文件 #include<linux/cdev.h>
函数原型 sturct cdev *cdev_alloc(void)
void cdev_init(struct cdev *cdev, struct file_operations *fops)
int cdev_add (struct cdev *cdev, dev_t num, unsigned int count)
void cdev_del(struct cdev *dev)
函数传入值 cdev :需要初始化 / 注册 / 删除的 struct cdev 结构
fops :该字符设备的 file_operations 结构
num :系统给该设备分配的第一个设备号
count :该设备对应的设备号数量
函数返回值 成功:
cdev_alloc :返回分配到的 struct cdev 结构指针
cdev_add :返回 0
函数返回值
函数返回值 出错:
cdev_alloc :返回 NULL
cdev_add :返回 -1

2.6内核仍然保留早期版本的register_chrdev()等字符设备相关函数,其实从内核

代码中可以发现,在register_chrdev()函数的实现中用到cdev_alloc()和cdev_add()函数,而在unregister_chrdev()函数的实现中调用cdev_del()函数。因此很多代码仍然使用早期版本接口,但这种机制将来会从内核中消失。



参考:华清《嵌入式Linux应用程序开发标准教程》

分享到:
评论

相关推荐

    Linux2.6内核标准教程(共计8-- 第1个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第2个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第6个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第8个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第3个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第7个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第4个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    Linux2.6内核标准教程(共计8--第5个)

    C.2.6 内嵌汇编格式——修饰字符 362 C.2.7 内嵌汇编格式——破坏描述 364 附录D 参考文献 366 D.1 关于IA32体系结构的资源 367 D.2 关于Linux内核的相关资源 367 D.3 关于计算机基本原理的资源 367 D....

    XQuery权威指南(简码·扫描版)

     本书的特点是用简洁的语言深入浅出地介绍了XQuery方方面面的知识,在讲述有些内容时把XQuery与其他广为人知的技术如SQL等相对比,使得读者可以很快上手。阅读本书只须要了解一些基础的XML背景知识。本书除了用于...

    Java入门教程(微学苑)-part1

    2.18 String和StringBuffer的效率对比 38 2.19 StringBuilder类 39 2.20 总结 39 2.21 强调一下编程风格 40 3 Java类与对象 42 3.1 Java类的定义及其实例化 42 3.2 构造方法 42 3.3 创建对象 43 3.4 访问成员变量和...

    sqlserver2000基础(高手也有用)

    2.4 日期格式化与日期推算处理 34 2.4.1 日期格式化处理 34 2.4.2 日期推算处理 35 2.4.3 日期加减处理 38 2.5 日期处理实例 40 2.5.1 生日处理 40 2.5.2 生成日期列表 42 2.5.3 工作日处理 46 ...

    SQL SERVER 2000开发与管理应用实例

    2.4 日期格式化与日期推算处理 34 2.4.1 日期格式化处理 34 2.4.2 日期推算处理 35 2.4.3 日期加减处理 38 2.5 日期处理实例 40 2.5.1 生日处理 40 2.5.2 生成日期列表 42 2.5.3 工作日处理 ...

    MySql 5.1 参考手册.chm

    2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7. 在其它类Unix系统中安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 ...

    像计算机科学家一样思考Python(第2版).pdf

    2.6 字符串操作 13 2.7 注释 13 2.8 调试 14 2.9 术语表 15 2.10 练习 16 第3章 函数 17 3.1 函数调用 17 3.2 数学函数 18 3.3 组合 19 3.4 添加新函数 19 3.5 定义和使用 21 3.6 执行流程 ...

    基于MATLAB的SMI波束形成与最优波束形成算法对比.zip

    3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...

    基于灰狼算法优化长短时记忆GWO-LSTM时序时间序列数据预测(含前后对比)附Matlab代码+运行结果.zip

    3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...

    【电力负荷预测】基于BP神经网络电力系统短期负荷预测未来(对比+误差)附Matlab代码.zip

    3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...

Global site tag (gtag.js) - Google Analytics