diff --git a/Software/Development/OperatingSystem/Linux/Kernel/API/Linux_Kernel_字符设备接口函数.md b/Software/Development/OperatingSystem/Linux/Kernel/API/Linux_Kernel_字符设备接口函数.md new file mode 100644 index 0000000..97456db --- /dev/null +++ b/Software/Development/OperatingSystem/Linux/Kernel/API/Linux_Kernel_字符设备接口函数.md @@ -0,0 +1,115 @@ +# Linux Kernel 字符设备接口函数 + +**头文件:** + +```cpp +#include +``` + +## MKDEV + +**函数原型:** + +```cpp +#define MKDEV(major,minor) (((major) << MINORBITS) | (minor)) +``` + +**说明:** + +将主设备号和次设备号转换成 dev_t 类型。 + +**参数:** + +major:主设备号。 + +minor:次设备号。 + +**返回值:** + +dev_t 类型的设备号。 + +## register_chrdev_region + +**函数原型:** + +```cpp +int register_chrdev_region(dev_t from, unsigned count, const char *name); +``` + +**说明:** + +向内核申请注册设备号。 + +**参数:** + +from:dev_t 形式的设备号,可由 MKDEV 创建。 + +count:申请次设备号的个数。 + +name:设备名称。执行 cat /proc/devices 时会显示该名称。 + +**返回值:** + +成功返回 0,否则返回错误码。 + +## alloc_chrdev_region + +**函数原型:** + +```cpp +int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name) +{ + struct char_device_struct *cd; + cd = __register_chrdev_region(0, baseminor, count, name); + if (IS_ERR(cd)) + return PTR_ERR(cd); + *dev = MKDEV(cd->major, cd->baseminor); + return 0; +} +``` + +**说明:** + +动态分配主设备号。 + +**参数:** + +dev:返回函数向内核申请下来的设备号。 + +baseminor:起始次设备号。 + +count:申请次设备号的个数。 + +name:设备名称。执行 cat /proc/devices 时会显示该名称。 + +**返回值:** + +成功返回 0,否则返回错误码。 + +## cdev_init + +**函数原型:** + +```cpp +void cdev_init(struct cdev *cdev, const struct file_operations *fops) +{ + memset(cdev, 0, sizeof *cdev); + INIT_LIST_HEAD(&cdev->list); + kobject_init(&cdev->kobj, &ktype_cdev_default); + cdev->ops = fops; +} +``` + +**说明:** + +关联 cdev 和 file_operations + +**参数:** + +cdev:字符设备对象 + +fops:设备操作方法 + +**返回值:** + +无