HCDapple watch怎么配对对

1708人阅读
usb host子系统(13)
网上有一副图基本就是整个usb匹配识别的流程框架了
usb_bus_type总线
linux设备模型由3部分构成,设备、驱动、总线。
先来看看总线,在usb/core/driver.c文件中定义
struct bus_type usb_bus_type = {
usb_device_match,
usb_uevent,
static int __init usb_init(void)
bus_register(&usb_bus_type);
在usb_init函数中通过bus_register(&usb_bus_type)注册usb_bus_type总线,所有的usb设备和usb驱动的总线都是它。
设备驱动模型中的总线与hcd总线区别
设备驱动模型中的总线是为了匹配usb的设备和驱动而设置的逻辑总线
hcd总线hcd-&self是物理总线,所有的usb设备、hub都是挂在hcd-&self物理总线上的,通过usb_register_bus(&hcd-&self)来将hcd-&self-&bus_list添加到usb_bus_list上
usb_device_driver
// core/generic.c
struct usb_device_driver usb_generic_driver = {
.name = "usb",
.probe = generic_probe,
.disconnect = generic_disconnect,
.supports_autosuspend = 1,
// core/usb.c
usb_register_device_driver(&usb_generic_driver, THIS_MODULE)
int usb_register_device_driver(struct usb_device_driver *new_udriver,
struct module *owner)
int retval = 0;
if (usb_disabled())
return -ENODEV;
new_udriver-&drvwrap.for_devices = 1;
new_udriver-&drvwrap.driver.name = (char *) new_udriver-&
new_udriver-&drvwrap.driver.bus = &usb_bus_
new_udriver-&drvwrap.driver.probe = usb_probe_
new_udriver-&drvwrap.driver.remove = usb_unbind_
new_udriver-&drvwrap.driver.owner =
retval = driver_register(&new_udriver-&drvwrap.driver);
if (!retval)
pr_info("%s: registered new device driver %s\n",
usbcore_name, new_udriver-&name);
printk(KERN_ERR "%s: error %d registering device "
driver %s\n",
usbcore_name, retval, new_udriver-&name);
EXPORT_SYMBOL_GPL(usb_register_device_driver);
usb_register_device_driver注册的usb_device_driver的bus是usb_bus_type,与添加root_hub设备和usb device设备时使用的usb_alloc_dev函数中设置usb_device的bus一样。
因为一个usb设备分为device和interface两个层面:
1) usb_register_device_driver注册的是device层面的驱动,能匹配所有的usb设备,root_hub设备与正常插入的usb设备都要先与这个usb_device_driver匹配,然后进入generic_probe函数中添加对应的intf-&dev,再与intf driver匹配进入root_hub设备的hub_probe函数或着usb设备的xxx_probe函数。具体流程图如上面。
2) usb_register_driver注册的是interface层面的驱动,与usb device具体功能相关
root_hub device
int usb_add_hcd(struct usb_hcd *hcd, unsigned int irqnum, unsigned long irqflags)
rhdev = usb_alloc_dev(NULL, &hcd-&self, 0);
dev-&dev.bus=&usb_bus_和上面注册的struct usb_device_driver usb_generic_driver的bus是一样的
dev-&bus=&hcd-&self;
hcd-&self.root_hub =
register_root_hub(hcd)
struct usb_device *usb_dev = hcd-&self.root_hub;
usb_new_device (usb_dev);
device_add(&udev-&dev);
在ehci或者ohci驱动中调用usb_add_hcd注册usb_hcd的时候添加了hcd-&self.roothub,也就是root_hub device,而且hcd-&self.roothub-&dev.bus_type=usb_bus_type,当root_hub设备添加之后,会与上面的usb_device_driver匹配,进入generic_probe函数,然后执行usb_choose_configuration、usb_set_configuration,在usb_set_configuration中添加root_hub对应的intf-&dev。
root_hub interface
device层面的驱动”usb_device_driver”与设备”hcd-&self.root_hub-&dev”匹配之后,会进入generic_probe函数,添加了interface层面的hcd-&self.root_hub对应的intf-&dev.
root_hub interface driver
interface层面的设备”root_hub对应的intf-&dev”会与驱动”root_hub对应的hub_driver”匹配,然后进入hub_driver的hub_probe函数。
来看看interface层面的root_hub的驱动
static struct usb_driver hub_driver = {
hub_probe,
.disconnect =
hub_disconnect,
.suspend =
hub_suspend,
hub_resume,
.reset_resume = hub_reset_resume,
.pre_reset =
hub_pre_reset,
.post_reset =
hub_post_reset,
.unlocked_ioctl = hub_ioctl,
.id_table = hub_id_table,
.supports_autosuspend = 1,
int usb_hub_init(void)
if (usb_register(&hub_driver) & 0) {
printk(KERN_ERR "%s: can't register hub driver\n",
usbcore_name);
return -1;
static int __init usb_init(void)
usb_hub_init();
usb_register其实调用的是usb_register_driver函数,
int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
const char *mod_name)
int retval = 0
if (usb_disabled())
return -ENODEV
new_driver-&drvwrap.for_devices = 0
new_driver-&drvwrap.driver.name = (char *) new_driver-&name
new_driver-&drvwrap.driver.bus = &usb_bus_type
new_driver-&drvwrap.driver.probe = usb_probe_interface
new_driver-&drvwrap.driver.remove = usb_unbind_interface
new_driver-&drvwrap.driver.owner = owner
new_driver-&drvwrap.driver.mod_name = mod_name
spin_lock_init(&new_driver-&dynids.lock)
INIT_LIST_HEAD(&new_driver-&dynids.list)
retval = driver_register(&new_driver-&drvwrap.driver)
if (retval)
retval = usb_create_newid_files(new_driver)
if (retval)
goto out_newid
pr_info("%s: registered new interface driver %s\n",
usbcore_name, new_driver-&name)
return retval
out_newid:
driver_unregister(&new_driver-&drvwrap.driver)
printk(KERN_ERR "%s: error %d registering interface "
driver %s\n",
usbcore_name, retval, new_driver-&name)
usb device
usb device
当hub_events检测到设备插入之后,会执行hub_port_connect_change,确认端口确实有设备插入后,和前面usb_add_hcd一样会通过usb_alloc_dev分配一个struct usb_device结构体,并添加设备。
使用usb_alloc_dev添加的usb_device中的device type都是usb_device_type,device bus都是usb_bus_type,当总线usb_bus_type有对应的的driver挂上来时,会执行bus的match函数,match函数中会区分device type是usb_device_type还是usb_if_device_type。
usb interface
与root_hub interface一样,device层面的驱动”usb_device_driver”与设备”usb device”匹配之后,会进入generic_probe函数,添加了interface层面的usb对应的intf-&dev。
usb interface driver
与root_hub interface driver一样,有interface层面的usb interface driver,当usb interface与usb interface driver匹配之后会进入xxx_probe函数。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 苹果手机蓝牙怎么配对 的文章

 

随机推荐