字符设备的注册分为两部分:注册设备号、注册设备本身。下面的两个函数将用于初始化字符设备,并将字符设备加载到内核。
目录
一、字符设备数据类型
在 Linux 中使用 cdev 结构体表示一个字符设备,cdev 结构体及其相关api函数在 include/linux/cdev.h 文件中,结构体的定义如下。
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops; /* 字符设备文件操作函数 */
struct list_head list;
dev_t dev; /* 设备号 */
unsigned int count;
};
static struct cdev chrdev;
二、字符设备初始化函数
创建好字符设备对象以后,就需要对其进行初始化,初始化使用的函数是 cdev_init。函数声明如下:
void cdev_init(struct cdev *cdev, const struct file_operations *fops);
cdev:字符设备指针(对象)
fops:当前字符设备文件操作集合
static struct cdev dev; /* 字符设备 */
/*
* 设备操作函数结构体
*/
static struct file_operations devfops = {
.owner = THIS_MODULE,
};
// 初始化字符设备
chrdev_led.dev.owner = THIS_MODULE;
cdev_init(&dev, &devfops); // 初始化字符设备
三、字符设备加载 / 卸载函数
1、设备加载函数
创建好字符设备以后,我们需要连同设备号,将字符设备加载到内核。字符设备加载函数声明如下:
int cdev_add(struct cdev *p, dev_t dev, unsigned count);
p:要添加的字符设备指针
dev:为当前字符设备注册的设备号
count:注册的字符设备的数量
返回值:0 代表成功;其他代表失败
static dev_t devid;
static struct cdev dev; /* 初始化以后的字符设备 */
ret = cdev_add(&dev, devid, 1); // 将字符设备添加到内核
if (ret != 0)
{
return -1;
}
2、设备卸载函数
卸载驱动时,一定要从内核中删除对应的字符设备。使用的函数是 cdev_del,函数原型如下:
void cdev_del(struct cdev *p);
参数 p 就是要删除的字符设备指针。