Linux – 注册设备列表

我有一个linux驱动程序,为平铺设备树(FDT)中的每个兼容设备节点注册一个char设备。

在初始化时,驱动程序分配一个主设备号和一系列次设备号。 当我看/proc/devices ,这个主要的设备编号被列出。

现在,当我定义2个与该驱动程序兼容的设备节点时,在FDT中,驱动程序的平台探测函数被调用两次,并且在相同的主设备号下注册了2个char设备,但是具有升序次设备号。

由于我可以查找主号码,我知道有多less设备,并且次要号码从0开始,我只需键入mknod -m 666 /dev/mydevice1 c 246 0mknod -m 666 /dev/mydevice2 c 246 1为两个字符设备创build设备节点。

但是我想知道是否有一种方法可以查找系统已知的所有设备的主要和次要设备号码,所以我不必事先知道次要号码,以便能够为这些设备创build设备节点设备?

这听起来像是在问如何让系统自动为您创建设备节点,而不是必须使用mknod命令。

试试这些步骤:

1)一点初始化

 #include <linux/devices.h> #define DEVNAME "device_name" /* you will need this a few times, so make it a macro */ static dev_t my_devt; /* make this static so we can access it across function calls */ static struct class* my_class; /* pointer to device class */ 

2)在cdev_add()之后的__init例程中,初始化类并使用sysfs注册设备:

 my_class = class_create(THIS_MODULE, DEVNAME); if(IS_ERR(device_create(my_class, NULL, my_devt, NULL, DEVNAME))){ printk(KERN_ERR "Node creation for %s failed.", DEVNAME); /* clean up after failed initialization */ } 

3)将相应的清理函数调用添加到__exit():

 device_destroy(my_class, my_devt); class_destroy(my_class); 

这应该会导致在/ dev中为单个设备创建一个节点。 您的问题具体询问多个节点,因此您可以创建一个节点数组,然后为您拥有的每个节点复制device_create()和device_destroy()函数调用。

我知道你原来的问题是要求一种方法来枚举系统已知的所有设备,但是你也表示你的驱动程序已经为FDT中的每个兼容设备注册了一个char设备。 如果将此代码添加到现有的驱动程序中,则可以利用在char设备注册过程中已拥有的dev_t信息来创建节点,并且不需要稍后枚举或列出任何东西。

有关更多详细信息,请查看本教程: 字符设备文件 。 device_create()的kernel.org文档也可能对您有所帮助。

使用这个命令:

 ls -l /sys/dev/char/