- 怎么打开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
这个文件决定编译不编译
那些调试信息的输出来源
-
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 host controller)与 USB 根集线器(USB root hub)两种
usb主机控制器有哪些功能
- 解析和维护 URB
- 负责不同 USB 传输类型的调度工作
- 负责 USB 数据的实际传输工作
- 实现虚拟 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),
}
};
- 怎么识别 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函数
那几个结构体之间的关系
那几个结构体之间的关系
网友评论