美文网首页
usb学习记录

usb学习记录

作者: sgy1993 | 来源:发表于2018-03-24 11:50 被阅读0次
    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函数

    那几个结构体之间的关系


    那几个结构体之间的关系

    相关文章

      网友评论

          本文标题:usb学习记录

          本文链接:https://www.haomeiwen.com/subject/nihmqftx.html