《Linux那些事儿之我是USB》我是U盘(8)总线,设备和驱动(上)--总结

(1)
struct bus_type中为设备和驱动准备了两个链表,设备的结构体struct device中又有两个成员,struct bus_type *bus和struct device_driver *driver。驱动的结构体struct device_driver同样有两个成员,struct bus_type *bus和struct list_head devices;struct device和struct device_driver的定义和struct bus_type一样,在include/linux/device.h中。

(2)
struct device中的bus记录的是这个设备连在哪条总线上,driver记录的是这个设备用的是哪个驱动。
struct device_driver中的bus代表的也是这个驱动属于哪条总线,devices记录的是这个驱动支持的那些设备。devices(复数),而不是device(单数),因为一个驱动程序可以支持一个或多个设备,反过来一个设备则只会绑定给一个驱动程序。

一旦为一条总线申请了一个struct bus_type的数据结构之后,就往它的devices链表和drivers链表

每一个驱动本身去bus上面登记,或者说挂牌。具体到USB系统,每一个USB设备的驱动程序都会有一个struct usb_driver结构体
struct usb_driver {
const char *name;
int (*probe) (struct usb_interface *intf,
const struct usb_device_id *id);
void (*disconnect) (struct usb_interface *intf);
int (*unlocked_ioctl) (struct usb_interface *intf, unsigned int code,
void *buf);
int (*suspend) (struct usb_interface *intf, pm_message_t message);
int (*resume) (struct usb_interface *intf);
int (*reset_resume)(struct usb_interface *intf);
int (*pre_reset)(struct usb_interface *intf);
int (*post_reset)(struct usb_interface *intf);
const struct usb_device_id *id_table;
struct usb_dynids dynids;
struct usbdrv_wrap drvwrap;
unsigned int no_dynamic_id:1;
unsigned int supports_autosuspend:1;
unsigned int disable_hub_initiated_lpm:1;
unsigned int soft_unbind:1;
};
#define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver)

struct usbdrv_wrap {
struct device_driver driver;
int for_devices;
};
struct device_driver driver这个成员,USB Core为每一个设备驱动准备了一个函数,让它把这个struct device_driver driver插入到usb_bus_type中的drivers链表中去。这个函数是usb_register。

usb_register()--->
int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
const char *mod_name)
{
retval = driver_register(&new_driver->drvwrap.driver);
}

drivers/usb/core/hub.c
static struct usb_driver hub_driver = {
.name = "hub",
.probe = hub_probe,
.disconnect = hub_disconnect,
.suspend = hub_suspend,
.resume = 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,
}

drivers/usb/core/devio.c
struct usb_driver usbfs_driver = {
.name = "usbfs",
.probe = driver_probe,
.disconnect = driver_disconnect,
.suspend = driver_suspend,
.resume = driver_resume,
};

drivers/usb/storage/usb.c
static struct usb_driver usb_storage_driver = {
.name = "usb-storage",
.probe = storage_probe,
.disconnect = usb_stor_disconnect,
.suspend = usb_stor_suspend,
.resume = usb_stor_resume,
.reset_resume = usb_stor_reset_resume,
.pre_reset = usb_stor_pre_reset,
.post_reset = usb_stor_post_reset,
.id_table = usb_storage_usb_ids,
.supports_autosuspend = 1,
.soft_unbind = 1,
};

猜你喜欢

转载自blog.csdn.net/sinat_37817094/article/details/80355520
今日推荐