【usb】设备的生命线

创建设备 usb_alloc_dev

  • HUB检测到自己的某个端口有设备连接进来之后,它会调用core里的usb_alloc_dev函数,为struct usb_device结构的对象申请内存,这个函数在 rivers/usb/core/usb.c 文件中定义。
  • usb_alloc_dev 函数就相当于 USB 设备的构造函数,在参数中, parent 是设备连接的 Hub,
    bus 是设备连接的总线, port1 就是设备连接在 Hub 上的端口。
  • 可以通过函数kzalloc完成内存分配和初始化0,两个动作。
  • 在USB的世界里,一个主机控制器对应着一条总线。主机控制器驱动用struct usb_hcd 结构表示,一条总线用 struct usb_bus结构表示。
  • 函数 usb_get_hcd 只是将得到的 usb_hcd 结构对象的引用计数加 1。
  • dev->dev.dma_mask = bus->controller->dma_mask;就是与 DMA 传输相关的了,设备能不能进行 DMA 传输,得看主机控制器的脸色, 主机控制器不支持设备也没法使用。 所以这里 dma_mask 被设置为主机控制器的 dma_mask.
  • dev->state = USB_STATE_ATTACHED; 将 USB 设备的状态设置为 ATTACHED,表示设备已经连接到 USB 接口上了,是Hub 检测到设备时的初始状态.
  • ep_in[0]和 ep_out[0]本来表示的就是端点 0.
  • 272 行到 291 行整个的代码就是首先判断你的设备是不是直接连到 Root Hub 上的, 如果是,
    将 dev->devpath[0]赋值为 0,以示特殊,然后父设备设为 controller,同时把 dev->bus_id[]设置
    为如 usb1/usb2/usb3/usb4 这样的字符串。如果你的设备不是直接连到 Root Hub 上的,分两种情
    况:如果你的设备连接的 Hub 是直接连到 Root Hub 上的,则 dev->devpath 就等于端口号,否则
    dev->devpath 就等于在父 Hub 的 devpath 基础上加一个“”再加一个端口号,最后把 bus_id[]设置
    成 1-/2-/3-/4-这样的字符串后面连接上 devpath。

猜你喜欢

转载自blog.csdn.net/C2681595858/article/details/128177480