usb基本知识

几个重要的概念:

      cpu ----(usb core)----->host controller(usb控制器) +(集成)+root hub(可以连接多个usb设备)

usb主机----(usb协议)--->usb设备

usb core核心:初始化usb系统,初始化root hub

usb host :初始化usb控制器

usb控制器的分类:OHCI 1.1接口标准   UHCI 1.0-1.1 EHCI 2.0 XHCI 3.0

1.

usb子系统的初始化:drivers/usb/core/usb.c   static int __init usb_init(void)

usb总线的注册: int bus_register(struct bus_type *bus)   drivers/base/bus.c

usb_init(void)---->bus_register(struct bus_type *bus) 

ls sys/bus/usb/

 devices            drivers_autoprobe  uevent

 drivers            drivers_probe

bus_register的工作是在sys/bus/usb下创建这些节点。

其中节点 drivers_autoprobe    drivers_probe 由函数 static int add_probe_files(struct bus_type *bus)实现

bus_create_file(bus, &bus_attr_drivers_probe)

bus_create_file(bus, &bus_attr_drivers_autoprobe)

static BUS_ATTR(drivers_probe, S_IWUSR, NULL, store_drivers_probe);这个节点只能写

static BUS_ATTR(drivers_autoprobe, S_IWUSR | S_IRUGO, show_drivers_autoprobe, store_drivers_autoprobe);这个节点可写可读,置一表示每次注册设备或驱动都会自动match另一半。

store_drivers_probe函数调用bus_find_device,让这根总线的设备都去找匹配自己的device_driver。所以我们写这个名字为drivers_probe的文件,就是向内核发出命令,赶紧去把这个bus的设备和驱动遍历一遍,查看有没有能匹配的。

2.

作为u盘不仅要和usb core打交道,而且还要和scsi core ,内存管理单元,还要内核的其他模块打交道,外面的世界很精彩。

usb mass_storage 的驱动  usb_hosts

/sys/bus/usb/drivers

# ls

hub  usb  usb-storage   usbfs usbhid   uvcvideo

# ls usb-storage/

 1-1:1.0(识别的u盘设备)    bind       module     new_id     remove_id  uevent     unbind

u盘的驱动源代码在drivers/usb/storage/usb.c   驱动名字“usb-storage”

 module_usb_driver(usb_storage_driver)向usb core层注册驱动。

 module_usb_driver(usb_storage_driver)-->usb_register()--->usb_register_driver()----->driver_register(drivers/base/driver.c)---->usb_add_driver(drivers/base/bus.c)--->add_bind_files(创建两个节点bind unbind)

bus_add_driver()--->driver_attach()--->bus_for_each_dev()--->__driver_attach()--->driver_probe_device()--->really_probe()-->调用usb_register_driver里面初始化的usb_probe_interface()函数--->然后调用 usb_driver驱动里面的probe函数driver->probe(intf, id)【usb_driver usb_storage_driver-->storage_probe(drivers/usb/storage/usb.c)】

3.

drivers/usb/core/hub.c   hub的驱动代码。

usb_hub_init()->kthread_run(hub_thread, NULL, "khubd")--->创建一个线程hub_thread--->hub_events(检查hub的事件是否变化,是否有探测到设备)--->hub_port_connect_change(探测hub端口设备的连接)-->usb_new_device(探测到新设备)--->announce_device(udev)打印设备信息。

hub_port_connect_change(探测hub端口设备的连接)-->hub_port_init(hub端口的初始化)--->然后才调用usb_new_device().

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux技术芯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值