usb学习记录

2018-03-24  本文已影响0人  sgy1993
  1. 怎么打开usb 详细的debug 信息
    Symbol: USB_DEBUG [=y] |
    | Type : boolean |
    | Prompt: USB verbose debug messages |
    | Defined at drivers/usb/core/Kconfig:4 |
    | Depends on: USB_SUPPORT [=y] && USB [=y] |
    | Location: |
    | -> Device Drivers |
    | -> USB support (USB_SUPPORT [=y]) |
    | -> Support for Host-side USB (USB [=y])

配置项是 USB_DEBUG
控制的是
obj-$(CONFIG_USB_SERIAL_DEBUG) += usb_debug.o
这个文件决定编译不编译

那些调试信息的输出来源

  1. dev_dbg


    usb公口和母口的区分

USB 是英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。USB 协议中规定了
USB 的软件结构、硬件结构、数据传输等等。但是我们在提到 USB 协议的时候,通常只是关
注它是 USB2.0 还是 USB3.0 接口,它的传输速率、以及兼容性(例如 USB3.0 接口是否兼容
USB2.0 之类)。
USB 传输速率如下所示:
USB1.0:1.5Mbps(192KB/s)低速(Low-Speed)500mA;
USB1.1:12Mbps(1.5MB/s)全速(Full-Speed)500mA;
USB2.0:480Mbps(60MB/s)高速(High-Speed)500mA;
USB3.0:5Gbps(640MB/s)超速(Super-Speed)900mA。

MCU 通过 AHB 总线,和 USB 主控制器通信,然后通过 USB 总线和 USB 设备通信。在
USB 主控制器中还集成了根集线器 root hub,在下一节中介绍 usb hub 的拓扑结构的时候会
讲到它的作用。


拓扑结构

USB 的主控制器,分为以下几种:
UHCI:UHCI(Universal Host Controller Interface),是 Intel 主导的对 USB1.0、1.1
的接口标准,与 OHCI 不兼容。UHCI 的软件驱动的任务重,需要做得比较复杂,但可以使用
较便宜、较简单的硬件的 USB 控制器。Intel 和 VIA 使用 UHCI,而其余的硬件提供商使用
OHCI。
OHCI:OHCI(Open Host Controller Interface)是支持 USB1.1 的标准与 UHCI 相
比,OHCI 的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对较简
单。主要用于非 x86 的 USB,如扩展卡、嵌入式开发板的 USB 主控。
EHCI:EHCI(Enhanced Host Controller Interface),是 Intel 主导的 USB2.0 的接口
标准。EHCI 仅提供 USB2.0 的高速功能,而依靠 UHCI 或 OHCI 来提供对全速(fullspeed)或低速(low-speed)设备的支持。

XHCI:xHCI(eXtensible Host Controller Interface),是最新最火的 USB3.0 的接口
标准,它在速度、节能、虚拟化等方面都比前面 3 中有了较大的提高。xHCI 支持所有种类速
度的 USB 设备(USB 3.0 SuperSpeed, USB 2.0 Low-, Full-, and High-speed, USB 1.1
Low- and Full-speed)。xHCI 的目的是为了替换前面 3 中(UHCI/OHCI/EHCI)。

一般 USB 系统的基本架构可以分为 3 个主要
的部分:USB 主机控制器/根集线器;USB 集线器;USB 设备

usb系统基本架构

主机硬件包括 USB 主
机控制器(USB host controller)与 USB 根集线器(USB root hub)两种

内核里面的数据流程

usb主机控制器有哪些功能

  1. 解析和维护 URB
  2. 负责不同 USB 传输类型的调度工作
  3. 负责 USB 数据的实际传输工作
  4. 实现虚拟 USB HUB(集线器)的功能

内核配置的时候可以查看一下具体使用是哪一个主机


内核配置
#ifdef PLATFORM_DRIVER
    retval = platform_driver_register(&PLATFORM_DRIVER);//ohci_hcd_s3c2410_driver
    if (retval < 0)
        goto error_platform;
#endif

在上面注册主机驱动的时候,肯定是需要匹配设备端的,设备端需要有同名字的设备
name = "s3c2410-ohci"

F:\source_insight_project\linux-3.4.2\arch\arm\plat-samsung\devs.c
struct platform_device s3c_device_ohci = {
    .name       = "s3c2410-ohci",
    .id     = -1,
    .num_resources  = ARRAY_SIZE(s3c_usb_resource),
    .resource   = s3c_usb_resource,
    .dev        = {
        .dma_mask       = &samsung_device_dma_mask,
        .coherent_dma_mask  = DMA_BIT_MASK(32),
    }
};


  1. 怎么识别 usb设备的
    1.1 hub_irq 检测到 usb端口发生变化
    1.2 负责唤醒 hub_thread 线程
    1. 接着 调用 hub_events--->hub_port_connect_change
    2. 分配一个 usb_device <<<<<<<<<<----------usb_alloc_dev
    3. 给她重新分配 一个 设备地址
    4. 回去 hub 上 port 的状态,判断是 高速,还是低速设备
    5. hub_set_address // 把编号(地址)告诉USB设备
    6. 获取设备描述符, 把所有的配置都给读取出来
    7. usb_new_device , 读取 usb设备的各种配置
    8. device_add -------匹配厂商, 设备类,接口类
    device_add // 把device放入 usb_bus_type 的dev链表,
    // 从usb_bus_type的driver链表里取出usb_driver,
    // 把usb_interface和usb_driver的id_table比较
    // 如果能匹配,调用usb_driver的probe
    9. 匹配成功的话就会调用 drv 的 probe函数

那几个结构体之间的关系


那几个结构体之间的关系
上一篇下一篇

猜你喜欢

热点阅读