我有一个linux驱动程序,它为Flattened-Device-Tree(FDT)中的每个兼容设备节点注册一个char设备。
初始化时,驱动程序会分配主设备号和一系列次设备号。
当我查看/proc/devices
时,会列出此主要设备编号。
现在,当我在FDT中定义2个与该驱动程序兼容的设备节点时,驱动程序的platform-probe-function被调用两次,并且2个char设备在相同的主设备号下注册,但是具有递增的次要设备设备编号。
由于我可以查找主要号码,并且我知道有多少设备,并且次要号码从0开始,我只需键入mknod -m 666 /dev/mydevice1 c 246 0
和mknod -m 666 /dev/mydevice2 c 246 1
即可为其创建设备节点两个char设备。
但是我想知道是否有一种方法可以查找系统已知的所有设备及其主设备号和次设备号,所以我不必事先知道次要号码,以便能够创建设备那些设备的节点?
答案 0 :(得分:2)
听起来你问的是如何让系统自动为你创建设备节点,而不是必须使用 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信息来创建节点,并且无需在以后枚举或列出任何内容。
有关详细信息,请查看本教程:Character Device Files。 kernel.org docs for device_create()也可能对您有所帮助。
答案 1 :(得分:2)
使用此命令:
ls -l /sys/dev/char/