register_chrdev() register_chrdev_region() alloc_chrdev_region的区别?【转】
register_chrdev() register_chrdev_region() alloc_chrdev_region的区别?【转】
在fs.h中的申明如下:
分配设备号:
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
extern int register_chrdev_region(dev_t, unsigned, const char *);
注册设备:
extern int register_chrdev(unsigned int, const char *,
struct file_operations *);
注销设备:
extern int unregister_chrdev(unsigned int, const char *);
注销设备号:
extern void unregister_chrdev_region(dev_t, unsigned);
说明:
**********************************
extern int register_chrdev(unsigned int, const char *,
struct file_operations *);
作用:注册一个字符串设备
unsigned int 是主设备号;
const char*是设备名;
struct file_operations*是文件结构体。
********************************
extern int register_chrdev_region(dev_t first, unsigned int count, char* name)
要想注册一个设备则需要一个主设备号,那么就需要给设备分配一个主设备号。
这个函数的作用:就是给一个设备分配设备编号的。
first是要分配设备编号范围的起始值。
count是所请求连续设备编号的个数。不能太大。
name是设备名,(要与该设备编号范围关联)
如果分配成功,则返回0,
如果分配失败,则返回负的错误码。这时候所请求的编号区域不能用。
注:申请是只是一个设备编号区域。
**********************************
extern int alloc_chrdev_region(dev_ *dev, unsigned int firstminor, unsinged int count, char *name)
说明:
1.如果我们提前知道设备的编号,那么就用register_chrdev_region(),这个可以工作的很好。
2.但是如果我们不知道呢,linux一直想解决这个问题,这就有了上面的函数。
这个函数是动态申请设备编号,这是linux的一个进步,一直想可以动态申请设备编号。
有了它,我们就不要考虑设备编号的问题了,因为使用它后,内核可以运行上面的函数给我们动态地分配我们需要的主设备号。
-------不知道设备编号的问题就自动解决了。
*dev是一个输出参数,当设备成功完成调用后,它将保存已分配范围的第一个编号。
firstminor是要请求的第一个次设备号。一般为0。
count同样是所请求连续设备编号的次数。
*name同样是相应和设备名。
************************************
说明:因为我们在led_driver中已经知道了设备编号,所以只要注册就可以了。不需要分配编号。
*********************************
注销同上,不说了。
**********************************
回头再说说设备编号的问题:
我们可以分配设备编号,最后用动态分配,不易冲突。
那么我们给一个设备分配的主设备号具体是多少呢?在一个范围总有一个确定的值吧。
其实:
一旦给一个设备分配好了设备号后,我们就可以在/proc/devices中读取了。
原文链接:http://blog.csdn.net/xie376450483/article/details/5727838