新字符设备驱动原理
分配和释放设备号
int major; // 主设备号
int minor; // 次设备号
dev_t devid; // 设备号
if(major) // 定义主设备号
{
devid = MKDEV(major, 0); // 构建次设备号
// 起始设备号:devid
// 申请数量:1
// 设备名:text
register_chrdev_region(devid, 1, "test"); // 注册设备号
}
else // 未定义主设备号
{
alloc_chrdev_region(&devid, 0, 1, "text"); // 申请设备号
major = MAJOR(devid); // 获取主设备号
minor = MINOR(devid); // 获取次设备号
}
unregister_chrdev_region(devid, 1); // 注销设备号
新的字符设备注册方法
字符设备结构
// linux-5.5.4\linux-5.5.4\include\linux\cdev.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_CDEV_H
#define _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;
}__randomize_layout;
//...
#endif
cdev_init 函数
struct cdev testcdev;
static struct file_operations test_fogs = // 设备操作函数
{
.owner = THIS_MODULE;
//...
};
testcdev.owner = THIS_MODULE;
// 初始化cdev变量:testcdev
// 字符设备文件操作函数集合:test_fops
cdev_init(&testcdev,&test_fops); //初始化cdev结构体变量
自动创建设备节点
设置文件私有数据