Linux设备模型中的总线落实在USB子系统里就是usb_bus_type,它在usb_init函数注册,在drivers/usb/core/driver.c文件里定义
name自然就是usb总线的绰号了。match这个函数充当了一个红娘的角色,在总线的设备和驱动之间牵线搭桥。match指向了函数usb_device_match
第1行,经历了linux设备模型的繁华,参数我们都已经很熟悉了,对应的就是总线两条链表里的设备和驱动,也可以说是鹊桥版上的挂牌的和摘牌的。总线上有新设备或新的驱动添加时,这个函数总是会被调用,如果指定的驱动能够处理指定的设备,也就是匹配成功,函数返回0。梦想是美好的,现实是残酷的,匹配是未必成功的,红娘再努力,双方对不上眼也是实在没办法的事。
第4行,一遇到if和else,我们就知道又处在两难境地了,代码里我们可选择的太多。这里的岔路口只有两条路,一条给USB设备走,一条给USB接口走,各走各的路,分开了,就不再相见。
struct bus_type usb_bus_type = {
.name = "usb",
.match = usb_device_match,
.uevent = usb_uevent,
};
name自然就是usb总线的绰号了。match这个函数充当了一个红娘的角色,在总线的设备和驱动之间牵线搭桥。match指向了函数usb_device_match
static int usb_device_match(struct device *dev, struct device_driver *drv)
{
/* devices and interfaces are handled separately */
if (is_usb_device(dev)) {
/* interface drivers never match devices */
if (!is_usb_device_driver(drv))
return 0;
/* TODO: Add real matching code */
return 1;
} else if (is_usb_interface(dev)) {
struct usb_interface *intf;
struct usb_driver *usb_drv;
const struct usb_device_id *id;
/* device drivers never match interfaces */
if (is_usb_device_driver(drv))
return 0;
intf = to_usb_interface(dev);
usb_drv = to_usb_driver(drv);
id = usb_match_id(intf, usb_drv->id_table);
if (id)
return 1;
id = usb_match_dynamic_id(intf, usb_drv);
if (id)
return 1;
}
return 0;
}
第1行,经历了linux设备模型的繁华,参数我们都已经很熟悉了,对应的就是总线两条链表里的设备和驱动,也可以说是鹊桥版上的挂牌的和摘牌的。总线上有新设备或新的驱动添加时,这个函数总是会被调用,如果指定的驱动能够处理指定的设备,也就是匹配成功,函数返回0。梦想是美好的,现实是残酷的,匹配是未必成功的,红娘再努力,双方对不上眼也是实在没办法的事。
第4行,一遇到if和else,我们就知道又处在两难境地了,代码里我们可选择的太多。这里的岔路口只有两条路,一条给USB设备走,一条给USB接口走,各走各的路,分开了,就不再相见。