关于uboot驱动模型,这篇文章讲得很好,不再描述:
[uboot] (番外篇)uboot 驱动模型_ooonebook的博客-CSDN博客

U-Boot Driver Model领域模型设计

linux usb总线架构:
Linux USB总线架构_ZhY_Rening的博客-CSDN博客

uboot版本:uboot2018.01
平台:ti-am5728
usb控制器:xhci-dwc3

usb 命令:cmd/usb.c
usb uclass:drivers/usb/host/usb-uclass.c
usb 控制器驱动:drivers/usb/host/xhci-dwc3.c
usb hub驱动:common/usb_hub.c
usb存储驱动:common/usb_storage.c

uboot DM驱动模型图:

注:图来自网络,是以serial驱动为例,其他驱动也是一样的。

这里涉及到的uclass有 UCLASS_USB,UCLASS_USB_HUB,UCLASS_MASS_STORAGE。

对于UCLASS_USB:一个udevice对应一个 usb控制器(bus、root hub)。udevice从设备树解析,driver在驱动程序里定义。
对于UCLASS_USB_HUB:一个udevice对应一个 usb hub(非root hub)。udevice在父设备(usb或usb hub)扫描时创建并和驱动程序match,driver在驱动程序里定义。
对于UCLASS_MASS_STORAGE:一个udevice对应一个 mass 存储设备。udevice在父设备(usb或usb hub)扫描时创建并和驱动程序match,driver在驱动程序里定义。

这三种udevice的关系如下:
一个usb控制器有且仅有一个root hub设备(和控制器作为一个整体),这个根Hub下可以接多级的Hub(以child udevice的形式),每个子Hub又可以接子Hub。每个USB设备作为一个节点接在不同级别的Hub上。 每条USB总线上最多可以接127个设备。mass storage是一种usb设备。

1.usb控制器驱动(以xhci-dwc3为例):

U_BOOT_DRIVER(xhci_dwc3) = {.name = "xhci-dwc3",.id = UCLASS_USB,.of_match = xhci_dwc3_ids,.probe = xhci_dwc3_probe,.remove = xhci_dwc3_remove,.ops = &xhci_usb_ops,.priv_auto_alloc_size = sizeof(struct xhci_ctrl),.platdata_auto_alloc_size = sizeof(struct xhci_dwc3_platdata),.flags = DM_FLAG_ALLOC_PRIV_DMA,
};

2.usb控制器设备树节点:

usb1: usb@48890000 {compatible = "snps,dwc3";reg = <0x48890000 0x17000>;interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "peripheral","host","otg";phys = <&usb2_phy1>, <&usb3_phy1>;phy-names = "usb2-phy", "usb3-phy";maximum-speed = "super-speed";dr_mode = "host";snps,dis_u3_susphy_quirk;snps,dis_u2_susphy_quirk;};

3.usb uclass驱动:

UCLASS_DRIVER(usb) = {.id       = UCLASS_USB,.name     = "usb",.flags       = DM_UC_FLAG_SEQ_ALIAS,.post_bind  = dm_scan_fdt_dev,.priv_auto_alloc_size = sizeof(struct usb_uclass_priv),.per_child_auto_alloc_size = sizeof(struct usb_device),.per_device_auto_alloc_size = sizeof(struct usb_bus_priv),.child_post_bind = usb_child_post_bind,.child_pre_probe = usb_child_pre_probe,.per_child_platdata_auto_alloc_size = sizeof(struct usb_dev_platdata),
};

4.usb hub 设备驱动和 uclass驱动:

U_BOOT_DRIVER(usb_generic_hub) = {.name = "usb_hub",.id  = UCLASS_USB_HUB,.of_match = usb_hub_ids,.flags   = DM_FLAG_ALLOC_PRIV_DMA,
};UCLASS_DRIVER(usb_hub) = {.id        = UCLASS_USB_HUB,.name     = "usb_hub",.post_bind   = dm_scan_fdt_dev,.post_probe  = usb_hub_post_probe,.child_pre_probe  = usb_child_pre_probe,.per_child_auto_alloc_size = sizeof(struct usb_device),.per_child_platdata_auto_alloc_size = sizeof(struct usb_dev_platdata),.per_device_auto_alloc_size = sizeof(struct usb_hub_device),
};

5.usb mass storage 设备驱动和uclass驱动:

U_BOOT_DRIVER(usb_mass_storage) = {.name    = "usb_mass_storage",.id = UCLASS_MASS_STORAGE,.of_match = usb_mass_storage_ids,.probe = usb_mass_storage_probe,
#ifdef CONFIG_BLK.platdata_auto_alloc_size  = sizeof(struct us_data),
#endif
};UCLASS_DRIVER(usb_mass_storage) = {.id       = UCLASS_MASS_STORAGE,.name        = "usb_mass_storage",
};

6.usb start过程:

do_usbdo_usb_startusb_init    //drivers/usb/host/usb-uclass.cuclass_get(UCLASS_USB, &uc);    //根据uclass id获取usb uclassuclass_foreach_dev(bus, uc) {    //遍历 probe uclass下的udevice(控制器)device_probe(bus);    //drivers/core/device.cdevice_probe(dev->parent);    //递归probe父节点uclass_resolve_seq//父节点都probe之后,会分配一个seq给该设备dev->flags |= DM_FLAG_ACTIVATED//设置该设备的flag为激活状态pinctrl_select_state(dev, "default")//和引脚相关的初始化设置uclass_pre_probe_device    //uc_drv->pre_probedev->parent->driver->child_pre_probe(dev)//执行父节点驱动的child_pre_probedrv->ofdata_to_platdata(dev)//执行设备驱动的ofdata_to_platdata接口函数clk_set_defaults(dev)//设备时钟相关的设置drv->probe(dev)//调用设备驱动的probe接口函数uclass_post_probe_device(dev)//调用所属CLASS驱动的post_probe接口函数}uclass_foreach_dev(bus, uc) {    //遍历 扫描 uclass下的udevice(控制器)if (!device_active(bus))    //跳过active的设备continue;usb_scan_bus(bus, true);    //扫描bus(usb控制器)下的设备usb_scan_device(bus, 0, USB_SPEED_FULL, &dev);struct usb_device *parent_udev;    //定义usb_devideusb_setup_device        //配置设备usb_prepare_device    //设置地址和描述符usb_select_config     //选择设备的配置usb_find_child    //寻找子设备usb_find_and_bind_driver //遍历usb驱动(hub、keyboard、storage)并和子设备绑定device_probe    //子设备probe,最终会调用子设备驱动里面的方法,如果是hub就递归扫描,如果是storage就初始化并获取描述符等。

uboot usb驱动模型相关推荐

  1. u-boot器件驱动模型(DeviceDrivers)之链接器的秘密

    写在前面 哈哈,写东西前总喜欢先扯蛋,赶时间的直接无视这段吧.前段时间照着x_project成功的将手上的一块基于nuc972的板子成功移植上了最新的u-boot,相关细节可以参考我的这篇博客. 那篇 ...

  2. Linux内核移植 part2:uboot 设备驱动模型

    最近在移植uboot-2015.04的时候发现,uboot的设备驱动也带驱动模型了,第一次见到的时候还真是愣了一下,特别是调试的时候没有以前那么方便直接了.而且设备模型和设备树捆绑在一起,又得花费一番 ...

  3. uboot 网络驱动模型

    原文:https://blog.csdn.net/zhouxinlin2009/article/details/45390065 UBOOT的PHYCHIP配置 PHYCHIP的配置位于 includ ...

  4. Linux USB驱动程序设计

    Linux USB驱动程序设计 1. USB发展史 USB(Universal Serial Bus ),通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯. USB是在1994年底 ...

  5. usb5-写成usb驱动

    usb总线驱动模型里也有struct usb_driver和struct  usb_device,这点与platform虚拟总线里的struct platform_device和struct plat ...

  6. u-boot下的DM驱动模型

    U-boot 下DM驱动模型的相关笔记 要注意的关键两点: DM驱动模型的一般流程bind->ofdata_to_platdata(可选)->probe 启动,bind操作时单独完成的,主 ...

  7. Uboot中的DM驱动模型

    这一篇我们学习uboot中的驱动模型的初始化,在uboot中,驱动模型被称为Driver Model,简称DM.这种驱动模型为uboot中的各类驱动提供了统一的接口. 1. 数据结构及概念 DM模型主 ...

  8. Uboot Beaglebone Black Usb驱动分析

    在驱动开发中,USB驱动是比较难以理解的部分,也是令驱动开发者比较头疼的,不仅是因为USB包括host端和设备端:USB的协议类型也非常多:数据传输的协议,控制协议,主控制器协议,设备相关的协议,硬件 ...

  9. 从串口驱动到Linux驱动模型,想转Linux的必会!

    关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到 ...

最新文章

  1. Swift 中使用Alamofire 免证书的设置
  2. java弹出微信扫一扫_JAVA实现调用微信js-sdk扫一扫
  3. vue 数组长度_深入理解Vue的数据响应式
  4. AcWing - 246. 区间最大公约数(树状数组+线段树)
  5. 【Python CheckiO 题解】Long Repeat
  6. 关于PHP代码写的下载文件打不开的问题,自己备忘!(韩老师2011年的例子)
  7. obs摄像头模糊_OBS录制视频画面很糊,不清晰,怎么调整设置?
  8. 如何用自己的电脑开WiFi热点
  9. uniapp 跳转到商品详情页
  10. 金融科技之交易:动量效应选股策略
  11. c语言 结构体ppt,C语言知识学习结构体.ppt
  12. QObject::killTimer: Timers cannot be stopped from another thread
  13. Lync2013 升级Skype For Bussiness 2015 升级思路整理
  14. C语言计算一元二次方程的根(完全版)
  15. AVM 环视拼接方法介绍
  16. proteus7【硬件课程设计】
  17. SpringSecurity OAuth2.0认证授权-part1
  18. 【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering
  19. 基于node的毕业设计学生宿舍寝室管理系统
  20. 6k高清Mac粉色动态壁纸

热门文章

  1. C语言编程游戏-教程1 Star Empires
  2. 只需九步让你新站成为高权重网站
  3. ubuntu英文版变成中文版
  4. mysql数据表去重合并_MySQL数据表合并(两表字段相同)以及数据去重(抄)
  5. 软件工程毕业设计项目分享【含源码+论文】
  6. javascript 计算两个坐标的距离 米_EXCEL VBA曲线坐标计算程序在工程测量中的应用...
  7. 安川工业机器人实训心得_MOTOMAN安川工业机器人基础解析
  8. 【linux系列】内核编译最新教程+常见问题总结
  9. Linux使用笔记:Oracle数据库安装配置(命令行安装)
  10. 使用VM15创建虚拟机并安装CentOS 7 连接不到网络解决方法(设置静态ip)