【Linux驱动】字符设备的初始化、加载 / 卸载

字符设备的注册分为两部分:注册设备号、注册设备本身。下面的两个函数将用于初始化字符设备,并将字符设备加载到内核。


目录

一、字符设备数据类型

二、字符设备初始化函数

三、字符设备加载 / 卸载函数

1、设备加载函数

2、设备卸载函数


一、字符设备数据类型

在 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 就是要删除的字符设备指针。

猜你喜欢

转载自blog.csdn.net/challenglistic/article/details/131881618