概述
几个重要的概念:
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().
最后
以上就是超级汽车为你收集整理的usb基本知识的全部内容,希望文章能够帮你解决usb基本知识所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复