概览
根据Uboot的DM模型,需要有udevice_id或UBOOT_DEVICE描述设备信息,U_BOOT_DRIVER驱动对应设备的实际硬件操作;UCLASS_USB描述抽象的类信息,和与其对应的UCLASS_DRIVER来描述对应的通用操作。如果一脸懵逼,请先阅读下前言中的博客链接,才能更好的理解Uboot中的驱动模型。
Host驱动简要分析
UCLASS驱动
源自文件drivers/usb/host/usb-uclass.c。
792 UCLASS_DRIVER(usb) = {
793 .id = UCLASS_USB,
794 .name = "usb",
795 .flags = DM_UC_FLAG_SEQ_ALIAS,
796 .post_bind = dm_scan_fdt_dev,
797 .priv_auto_alloc_size = sizeof(struct usb_uclass_priv),
798 .per_child_auto_alloc_size = sizeof(struct usb_device),
799 .per_device_auto_alloc_size = sizeof(struct usb_bus_priv),
800 .child_post_bind = usb_child_post_bind,
801 .child_pre_probe = usb_child_pre_probe,
802 .per_child_platdata_auto_alloc_size = sizeof(struct usb_dev_platdata),
803 };
设备驱动
源自文件drivers/usb/host/ehci-exynos.c。
247 static const struct udevice_id ehci_usb_ids[] = {
248 { .compatible = "samsung,exynos-ehci" },
249 { }
250 };
251
252 U_BOOT_DRIVER(usb_ehci) = {
253 .name = "ehci_exynos",
254 .id = UCLASS_USB,
255 .of_match = ehci_usb_ids,
256 .ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
257 .probe = ehci_usb_probe,
258 .remove = ehci_usb_remove,
259 .ops = &ehci_usb_ops,
260 .priv_auto_alloc_size = sizeof(struct exynos_ehci),
261 .platdata_auto_alloc_size = sizeof(struct exynos_ehci_platdata),
262 .flags = DM_FLAG_ALLOC_PRIV_DMA,
263 };
设备驱动操作集
源自文件drivers/usb/host/ehci-exynos.c。
1665 struct dm_usb_ops ehci_usb_ops = {
1666 .control = ehci_submit_control_msg,
1667 .bulk = ehci_submit_bulk_msg,
1668 .interrupt = ehci_submit_int_msg,
1669 .create_int_queue = ehci_create_int_queue,
1670 .poll_int_queue = ehci_poll_int_queue,
1671 .destroy_int_queue = ehci_destroy_int_queue,
1672 .get_max_xfer_size = ehci_get_max_xfer_size,
1673 };
工作流程
udevice和对应uclass的创建(初始化DM时自动创建)
udevice和对应uclass的绑定(初始化DM时自动绑定)
对应udevice的probe调用 (需要自己实现)
uclass的接口调用(最终对应udevice driver中ops结构体保存的各种回调)