#include <linux/types.h> //dev_t
#include <linux/kdev_t.h> //MAJOR MINOR MKDEV
dev_t devno;
int major;
int minor;
minor = MAJOR(dev_t dev);
major = MINOR(dev_t dev);
devno = MKDEV(int major, int minor);
#include <linux/fs.h> //register_chrdev_region unregister_chrdev_region
在使用字符设备的时候,首先就要向系统注册字符设备
int register_chrdev_region(dev_t first, unsigned int count, char *name);
这里, first 是你要分配的起始设备编号. first 的次编号部分常常是 0, 但是没有要求
是那个效果. count 是你请求的连续设备编号的总数. 注意, 如果 count 太大, 你要求的
范围可能溢出到下一个次编号; 但是只要你要求的编号范围可用, 一切都仍然会正确工作.
最后, name 是应当连接到这个编号范围的设备的名子; 它会出现在 /proc/devices 和
sysfs 中. 查看name : cat /proc/devices devices是一个文件
如同大部分内核函数, 如果分配成功进行, register_chrdev_region 的返回值是 0. 出错
的情况下, 返回一个负的错误码, 你不能存取请求的区域.
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count,
char *name);
使用这个函数, dev 是一个只输出的参数, 它在函数成功完成时持有你的分配范围的第一
个数. fisetminor 应当是请求的第一个要用的次编号; 它常常是 0. count 和 name 参数
如同给 request_chrdev_region 的一样.
应当在不再使用它们时释放它. 设备编号的释放使用:
void unregister_chrdev_region(dev_t first, unsigned int count);
#include <linux/kdev_t.h> //MAJOR MINOR MKDEV
dev_t devno;
int major;
int minor;
minor = MAJOR(dev_t dev);
major = MINOR(dev_t dev);
devno = MKDEV(int major, int minor);
#include <linux/fs.h> //register_chrdev_region unregister_chrdev_region
在使用字符设备的时候,首先就要向系统注册字符设备
int register_chrdev_region(dev_t first, unsigned int count, char *name);
这里, first 是你要分配的起始设备编号. first 的次编号部分常常是 0, 但是没有要求
是那个效果. count 是你请求的连续设备编号的总数. 注意, 如果 count 太大, 你要求的
范围可能溢出到下一个次编号; 但是只要你要求的编号范围可用, 一切都仍然会正确工作.
最后, name 是应当连接到这个编号范围的设备的名子; 它会出现在 /proc/devices 和
sysfs 中. 查看name : cat /proc/devices devices是一个文件
如同大部分内核函数, 如果分配成功进行, register_chrdev_region 的返回值是 0. 出错
的情况下, 返回一个负的错误码, 你不能存取请求的区域.
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count,
char *name);
使用这个函数, dev 是一个只输出的参数, 它在函数成功完成时持有你的分配范围的第一
个数. fisetminor 应当是请求的第一个要用的次编号; 它常常是 0. count 和 name 参数
如同给 request_chrdev_region 的一样.
应当在不再使用它们时释放它. 设备编号的释放使用:
void unregister_chrdev_region(dev_t first, unsigned int count);
调用 unregister_chrdev_region 的地方常常是你的模块的 cleanup 函数.
allocCharReg.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h> //register_chrdev_region alloc_chrdev_region unregister_chrdev_region
int major = 0; //主设备号
int minor = 0; //次设备号
int nmbr_dev = 1; //设备数量
dev_t devno; //设备号
static int __init hello_init (void)
{
int result;
// "CharDevName": 设备名 加载模块以后,在/proc/devices文件中,通过 cat /proc/devices 查看 CharDevName 的主设备号
<span style="color:#ff6666;">//推荐的分配设备号的方法</span>
if(major)
{
devno = MKDEV(major, minor);
result = register_chrdev_region(devno, nmbr_dev, "CharDevName"); //
}else{
result = alloc_chrdev_region (&devno, minor, nmbr_dev, "CharDevName"); //动态分配主设备号
major = MAJOR(devno);
}
if (result<0) {
printk (KERN_WARNING "charReg: can't register chrdev\n");
return result;
}
printk (KERN_INFO "Registered character driver, major=%d,minor=%d\n", MAJOR(devno),MINOR(devno));
return 0;
}
static void __exit hello_exit (void)
{
// 注销设备
unregister_chrdev_region (devno, nmbr_dev); //注销设备
printk (KERN_INFO "Char driver cleaned up\n");
}
module_init (hello_init);
module_exit (hello_exit);
MODULE_LICENSE ("GPL");