arm-linux-gcc 发表于 2014-04-02 21:35

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里面看到有相关的设置


kiongf 发表于 2014-04-02 22:20

回复 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);
}

   差不多是这样的一个思路.

asuka2001 发表于 2014-04-02 22:22

回复 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:32

本帖最后由 arm-linux-gcc 于 2014-04-02 22:52 编辑

回复 3# asuka2001
回复 2# kiongf

哦,谢谢,怪不得
platform类型的设备没有type->devnode,所以device_create时看到的设备节点名字就是参数
而usb的有type->devnode,获得名字的方法就不再是kobj->name了

   

kiongf 发表于 2014-04-02 22:44

回复 4# arm-linux-gcc


    platform类型的设备具体是有哪一些设备。这个设备模型的代码看起来怪怪的..没看到枚举设备的过程..

arm-linux-gcc 发表于 2014-04-02 22:51

回复 5# kiongf


    这种是soc的片上设备,比如axi ahb apb总线上的设备,这种设备没有枚举过程,地址是写死的

kiongf 发表于 2014-04-02 23:03

回复 6# arm-linux-gcc


    所以这类型的设备的IRQ,Resource这些都是固定的,不变的咯。

arm-linux-gcc 发表于 2014-04-02 23:06

本帖最后由 arm-linux-gcc 于 2014-04-02 23:10 编辑

回复 7# kiongf


    对,地址和中断号都是设计芯片时就定死了
ARM核的芯片,片上外设上全是这种的,因为AMBA总线的设计就是这样的,不支持PCI那样的枚举

kiongf 发表于 2014-04-02 23:13

回复 8# arm-linux-gcc


    了解。谢谢了。

l289123557 发表于 2015-09-01 22:30

如果要使用USB设备,怎么获取USB节点啊:((
页: [1] 2
查看完整版本: usb设备的节点名是怎么确定的?