文档库 最新最全的文档下载
当前位置:文档库 › 设备驱动笔记——字符设备

设备驱动笔记——字符设备

设备驱动笔记——字符设备
设备驱动笔记——字符设备

驱动之家

设备驱动笔记

——字符设备

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。

相关文档