新闻  |   论坛  |   博客  |   在线研讨会
iTOP-4412开发板-驱动-usb文档04-主控制器和驱动框架简介
daybydayi | 2019-05-13 14:07:40    阅读:412   发布文章

iTOP-4412- 驱动-usb  文档 04- 主控制器和驱动框架简介

在学习 USB 驱动的过程中,虽然 USB 的内部驱动不需要我们去写,但是还是需要对其有

个大概的了解。

1 USB 驱动架构简介

USB 是一种主从结构的系统。主机叫做 Host,从机叫做 Device;开发板作为 USB host

端,USB 鼠标、USB 键盘、USB-WIFI 等等称为设备端;通常,作为 USB device 的设备被称

为 Gadget。

如下图所示,是 USB 驱动架构简略图。在主机端(这里需要注意的是,内部驱动和外部

驱动都是属于主机端)。

01.png 

设备端,Gadget API 定义了一个通用的 Gadget Driver 的接口,Gadget Driver 通过

Gadget API 与底层 USB Device Controller Driver 通信。其中 Gadget API 层屏蔽了底层硬

件的不同,使 Gadget Driver 注重功能的实现,尽量与硬件无关。设备端的驱动一般是以固

件形式在设备端中,由设备端的生产厂商固化在设备端中。

在主机端,有 USB HCD 和 USBD 两个接口层。

USB HCD 的全称为主机控制器驱动(Host Controller Driver),它是对主机控制器硬件的

一个抽象,提供与 USB 系统软件之间的软件接口。

从客户软件的角度看,USBD 控制所有的 USB 设备,因此客户软件对设备的控制和所要

发送的数据只要交给 USBD 就可以了。USBD 为客户软件提供命令机制和管道机制。客户软

件通过命令机制可以访问所有设备的 0 号端点且与默认管道通信,从而实现对设备的配置和其

他一些基本的控制工作。管道机制允许客户和设备实现特定的通信功能。该默认管道描述了一

条 USBD 和 USB 设备间通信的逻辑通道。

主机端各层有以下功能:

1) 检测连接和移去的 USB 设备;

2) 管理主机和 USB 设备间的数据流;

3) 连接 USB 状态和活动统计;

4) 控制主控制器和 USB 设备间的电气接口,包括能量供应。

如下图所示,是主机端驱动架构,在后面的教程中,我们会详细分析其中的 URB(USB

请求块)和 USB 设备描述符。在 USB 设备通信的整个流程中,USB 描述符用于主机端识别设

备端具体是哪个设备,这个过程是由主控制器来完成;USB 请求块用于主机端和设备端的数

据传输,提供具体的数据格式定义以及通道。整个驱动架构中的其它部分一般不需要关注。

 02.png

2 USB 主控制器

本节简单了解一下 4412 的主控制驱动。

2.1 USB 主控制器的功能

USB 主控制器是集成到片上系统的,例如,4412 开发板,主控制器是在 4412 芯片上,

代码也是集成在三星原厂提供的内核中的。主控制器主要有一下功能:

1. 解析和维护 URB

2. 负责不同 USB 传输类型的调度工作

3. 负责 USB 数据的实际传输工作

4. 实现虚拟 USB HUB(集线器)的功能

2.2 了解 USB 主控制器驱动

USB 的 USB CORE 在内核源码“drivers/usb/core/”中,如下图所示,可以看到和各种

功能对应的内核源码。其中有,USBCORE 核心代码,hub、urb 等等。这些都是具体平台无

关的代码,在任意平台中都是通用的核心层代码,给外部驱动提供对应的 API。

 03.png

另外在内核目录“drivers/usb/serial/”下可以看到前面文档中介绍的 USB 转串口驱

动,这个目录里面是 usb 转串口的驱动源码。

USB 主控制在内核源码“drivers/usb/host/”中,如下图所示,可以看到其中只有一个

编译生成的“.o”文件。

 04.png

我们在第一篇文档中有介绍到 4412 的主控制器是 USB2.0,使用的是 EHCI 控制器。我

们在 menuconfig 中,进入“ Device Drivers”-> “USB support (USB_SUPPORT

[=y])”,如下图所示,可以看到“EHCI HCD (USB 2.0) support”默认被配置了。

05.png

如上图所示,可以看到“ S5P EHCI support”,这是针对具体平台的配置,如下图所示

这个配置定义了宏“CONFIG_USB_EHCI_S5P”。

 06.png

接着使用 source insight 看一下“drivers/usb/host/ehci-hcd.c”的驱动源码,做一下

简单了解。

module_init(ehci_hcd_init);入口函数

入口函数 ehci_hcd_init 中,以下代码是注册主控制器驱动的代码。

#ifdef PLATFORM_DRIVER

retval = platform_driver_register(&PLATFORM_DRIVER);

if (retval < 0)

goto clean0;

#endif

如下图所示,在 menuconfig 中我们可以看到 CONFIG_USB_EHCI_S5P 宏是被定义的,

所以 PLATFORM_DRIVER 被定义为 s5p_ehci_driver。

#ifdef CONFIG_USB_EHCI_S5P

#include "ehci-s5p.c"

#define PLATFORM_DRIVER s5p_ehci_driver

#endif

接着找一下 s5p_ehci_driver 的定义,在“drivers/usb/host/ehci-s5p.c”文件下。如下

图所示,可以看到驱动名称为"s5p-ehci",USB 的主控制驱动在驱动注册的时候也是使用平台

驱动结构体 platform_driver,结构体中也是和字符驱动类似的 move、probe 等等函数。

有驱动注册,那么肯定有设备注册,而且设备名称也是要和驱动名称一样为"s5p-ehci"。

接着我们在平台文件中找一下设备注册。在“arch/arm/mach-exynos/mach-

itop4412.c”文件中,搜索宏定义“USB_EHCI_S5P”,如下图所示,可以看到主控制器函数

的设备注册代码。

07.png

如上图所示,smdk4x12_ehci_pdata 结构体变量应该是在调用函数

s5p_ehci_set_platdata(pdata)中初始化的。接着在 source insight 中搜索一下

s5p_ehci_set_platdata 函数,找到了该函数是在“arch/arm/plat-s5p/dev-ehci.c”中定

义。如下图所示,该函数中调用了 s5p_device_ehci 结构体来进行初始化,接着搜索一下

s5p_device_ehci 结构体。

 08.png

如下图所示,可以看到设备名称注册也是使用的“s5p-ehci”。

09.png

至此,我们完成分析了主控制的设备注册和驱动注册。具体实现代码更加复杂,但是这部

分不需要我们去做,有原厂会提供做好的驱动。

本文档只是让大家对主控制驱动有个感性的认识,在后面文档中的设备描述符、URB(请

求块)才是驱动学习的重点。

另外还有具体的 USB 驱动的移植,也比主机驱动和 USB 核心层驱动更重要,希望大家不

要花费过多的时间去研究主控制驱动和 USB 核心层代码。而是要在主机驱动和核心层驱动的

基础上,移植我们在项目和工程中需要的外围模块。到后面,大家会发现,在移植和使用

USB 外围设备驱动的时候,完全不需要用到 USB 主控制器、USB 驱动框架等等知识。


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客