usb设备的节点名是怎么确定的?
本帖最后由 arm-linux-gcc 于 2014-04-02 21:45 编辑/dev/bus/usb/里的目录名和节点名是在那里确定的呢?
我看到usb_alloc_dev里面,调用了dev_set_name来设置kobject->name
dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath);
然后在usb_new_device里面看到这个device的设备号也被设置为了USB_DEVICE_MAJOR(189)
我也看到devtmpfs里面确实是用的usb_alloc_dev里面设置的那个name来创建的节点
但是代码中看到的设备名和实际看到的完全不一样,连格式都不同了
root@luffy:/# ls /dev/bus/usb/* -l
/dev/bus/usb/001:
总用量 0
crw-rw-r-- 1 root root 189, 04月2 18:32 001
/dev/bus/usb/002:
总用量 0
crw-rw-r-- 1 root root 189, 1284月2 18:32 001
crw-rw-r-- 1 root root 189, 1294月2 18:32 002
crw-rw-r-- 1 root root 189, 1304月2 18:32 003
root@luffy:/#
我就搞不懂了,这些001 002的名字是从哪里来的?
PS:我没在udev的rule里面看到有相关的设置
回复 1# arm-linux-gcc
dev_set_name(&dev->dev, "%d-%s", bus->busnum, dev->devpath);` 这个设置的kobject name主要还是/sys/device/*/*下面的名字.
而devtmpfs的设备节点名字应该是device_create()-->device_register()-->device_add()--->devtmpfs_create_node()--->device_get_devnode()这个函数所创建.
创建的规则:1)如果定义了设备类型的device->type->devnode方法,根据这个方法提供的指定名字命名
2)如果定义了类的device->class->devnode方法,则根据这个方法的提供的指定名字命名
3)根据device->kobject的名字命名
usb_alloc_dev() :
--->dev->dev.type = &usb_device_type;
usb_device_type = {
.devnode = usb_devnode,
}
usb_devnode(dev, ...)
{...
return kasprintf(..., "bus/usb/%3d/%3d", usb_dev->bus->busnum, usb_dev->devum);
}
差不多是这样的一个思路. 回复 1# arm-linux-gcc
kobject的名字应该是在sysfs中的名字吧,设备节点的名字不是这个吧!
设备节点的名字是在 device_get_devnode()中决定的,通过 device_type->devnode()决定,如果这个没有,那么就是 class->devnode()决定。
所以 usb设备的设备节点名应该是由 usb_device_type.devnode()决定,即 usb_devnode():
static char *usb_devnode(struct device *dev,
umode_t *mode, kuid_t *uid, kgid_t *gid)
{
struct usb_device *usb_dev;
usb_dev = to_usb_device(dev);
return kasprintf(GFP_KERNEL, "bus/usb/%03d/%03d",
usb_dev->bus->busnum, usb_dev->devnum);
}
本帖最后由 arm-linux-gcc 于 2014-04-02 22:52 编辑
回复 3# asuka2001
回复 2# kiongf
哦,谢谢,怪不得
platform类型的设备没有type->devnode,所以device_create时看到的设备节点名字就是参数
而usb的有type->devnode,获得名字的方法就不再是kobj->name了
回复 4# arm-linux-gcc
platform类型的设备具体是有哪一些设备。这个设备模型的代码看起来怪怪的..没看到枚举设备的过程.. 回复 5# kiongf
这种是soc的片上设备,比如axi ahb apb总线上的设备,这种设备没有枚举过程,地址是写死的 回复 6# arm-linux-gcc
所以这类型的设备的IRQ,Resource这些都是固定的,不变的咯。 本帖最后由 arm-linux-gcc 于 2014-04-02 23:10 编辑
回复 7# kiongf
对,地址和中断号都是设计芯片时就定死了
ARM核的芯片,片上外设上全是这种的,因为AMBA总线的设计就是这样的,不支持PCI那样的枚举 回复 8# arm-linux-gcc
了解。谢谢了。 如果要使用USB设备,怎么获取USB节点啊:((
页:
[1]
2