驱动之家
设备驱动笔记
——字符设备
By Mc.meng
11/1/2011
Mc嵌入式学习笔记>>Linux设备驱动>>字符设备
目录
字符设备驱动 (2)
添加字符设备 (2)
1. 参数1 :dev_t devNo_t(设备号) (2)
设备号的注册 (2)
2. 参数2:struct cdev *cdev_t(设备结构指针) (3)
1) 声明设备结构 (3)
2) 初始化设备结构 (3)
3. 参数2.2 dev_fops (4)
声明file_operations及初始化 (4)
字符设备驱动
(树形分析)
添加字符设备
cdev_add(dev_tdevNo_t, structcdev *cdev_t);
cdev_add(设备号,设备描述指针);
这个函数的意思是:添加一个设备号为devNo_t,设备描述符为cde_t的设备。只要调用成功,则设备马上可用,那我们还关心其他的干什么呢?因此不防以此函数为根,一层一层地满足该函数调用的条件和找到调用参数。
条件个数:0
参数个数: 2
条件:
参数:
1)devtdevNo_t //设备号
2)structcdev *cdev_t //设备描述结构指针
参数1 :dev_tdevNo_t(设备号)
每个设备必须有一个唯一的设备号。头文件中有如下定义:
typedef __kernel_dev_tdev_t;
typedef __U32 __kernel_dev_t;
devt_t实际上是一个32位无符号整数。其中高12位是主设备号,低20位表示次设备号。设备号的注册
1)直接指定:
unsigned long CDRIVER_MAJOR= 54;
unsigned long CDRIVER_MINOR= 30;
dev_tdevNo_t = MKDEV(CDRIVER_MAJOR,CDRIVER_MINOR);
int result = register _chrdev_region(devNo_t,count,CDRIVER_NAME);
(分别定义主、次设备号,然后用MKDEV() 函数合成设备号devNo_t,最后向系统注册该设备号,注意,注册的是从devNo_t开始的count个设备号)
2)动态分配:
int result = alloc_chrdev_region(&devNo_t, 0,count,CDRIVER_NAME);
unsigned long CDRIVER_MAJOR = MAJOR(devNot_t);
unsigned long CDRIVER_MINOR = MINOR(devNot_t);
(申请设备号,然后分别用MAJOR() 和MINOR() 函数获取主、次设备号。)
(动态地为名为CDRIVER_NAME的设备,分配count个连续设备号,第一个放在devNo_t中,0表示从0开始申请,如果申请成功result=0);
Linux开发论坛上比较趋向于使用地二处方法。
参数2:structcdev*cdev_t(设备结构指针)
声明设备结构
cdev_t = cdev_alloc();
cdev_t的定义:
Structcdev{
Structkobjectkobj;
Structmdule *owner;
Conststructfile_operations *ops;
Structlist_head list;
Dev_tdev;
Unsigned int count;
}
初始化设备结构
初始化设备结构cdev_t中的各个字段
cdev_init(cdev_t,&dev_fops); //用dev_fops初始化cdev_t的ops字段
cdev_t->owner = THIS_MODULE;//用THIS_MODULE初始化cdev_t的owner字段
(此外,cdev_init()还对cdev_t的字段进行初始化,如引用计数置0等)
参数2.2 dev_fops
声明file_operations及初始化
file_operations数据结构提供文件系统的入口,也就是访问设备驱动的函数。file_operations 在
structfile_operationsdev_fops={
.owner = THIS_MODULE,
.open =simple_open,
.close =simple_close,
.read = simple_read,
.write = simple_write,
.ioctl= simple_ioctl,
.release = simple_release,
…
}
perations里面的成员都是函数,跟杂项设备的一样,要哪个就实现哪个吧。
字符设备的操作
open函数
原型:
Int (*open)(structinode *,struct file *);
内核用inode结构在内部表示文件,因此它与file结构不同,后者表示打开的文件描述符。对单个文件,可能会有多个表示打开的文件描述符的file结构,但它们都指向单个inode。