4412开发板-驱动-usb-主控制器和驱动框架简介

 时间:2024-10-14 13:33:47

1、在学习 USB 驱动的过程中,虽然 USB 的内部驱动不需要我们去写,但是还是需要对其有个大概的了解。

2、在学习 USB 驱动的过程中,虽然 USB 的内部驱动不需要我们去写,但是还是需要对其有个大概的了解。1 USB 驱动架构简介USB 是一种主从结构的系统。主机叫做 Host,从机叫做 Device;开发板作为 USB host端,USB 鼠标、USB 键盘、USB-WIFI 等等称为设备端;通常,作为 USB device 的设备被称为 Gadget。如下图所示,是 USB 驱动架构简略图。在主机端(这里需要注意的是,内部驱动和外部驱动都是属于主机端)。

4412开发板-驱动-usb-主控制器和驱动框架简介

3、设备端,Gadget API 定义了一个通用的 Gadget Driver 的接口,Gadget Driver 通过Gadget API 与底层 USB Device Controller Driver 通信。其中 Gadget API 层屏蔽了底层硬件的不同,使 Gadget Driver 注重功能的实现,尽量与硬件无关。设备端的驱动一般是以固件形式在设备端中,由设备端的生产厂商固化在设备端中。

4、在主机端,有 USB HCD 和 USBD 两个接口层。USB HCD 的全称为主机控制器驱动(Host Controller Driver),它是对膈套甘勰主机控制器硬件的一个抽象,提供与 USB 系统软件之间的软件接口。从客户软件的角度看,USBD 控制所有的 USB 设备,因此客户软件对设备的控制和所要发送的数据只要交给 USBD 就可以了。USBD 为客户软件提供命令机制和管道机制。客户软件通过命令机制可以访问所有设备的 0 号端点且与默认管道通信,从而实现对设备的配置和其他一些基本的控制工作。管道机制允许客户和设备实现特定的通信功能。该默认管道描述了一条 USBD 和 USB 设备间通信的逻辑通道。主机端各层有以下功能:1) 检测连接和移去的 USB 设备;2) 管理主机和 USB 设备间的数据流;3) 连接 USB 状态和活动统计;4) 控制主控制器和 USB 设备间的电气接口,包括能量供应。

5、如下图所示,是主机端驱动架构,在后面的教程中,我们会详细分析其中的 URB(USB请求块)和 USB 设备描述符。在 USB 设备通信的整个流程中,USB 描述符用于主机端识别设备端具体是哪个设备,这个过程是由主控制器来完成;USB 请求块用于主机端和设备端的数据传输,提供具体的数据格式定义以及通道。整个驱动架构中的其它部分一般不需要关注。

4412开发板-驱动-usb-主控制器和驱动框架简介

6、USB 主控制器本节简单了解一下 4412 的主控制驱动。2.1 USB 主控制器的功能USB 主控制器是集成到片上系统的,例如,4412 开发板,主控制器是在 4412 芯片上,代码也是集成在三星原厂提供的内核中的。主控制器主要有一下功能:1. 解析和维护 URB2. 负责不同 USB 传输类型的调度工作3. 负责 USB 数据的实际传输工作4. 实现虚拟 USB HUB(集线器)的功能

7、2 了解 USB 主控制器驱动USB 的 USB CORE 在内核源码“drivers/usb/core/”中,如下图所示,可以看到和各种功能对应的内核源码。其中有,USBCORE 核心代码,hub、urb 等等。这些都是具体平台无关的代码,在任意平台中都是通用的核心层代码,给外部驱动提供对应的 API。

4412开发板-驱动-usb-主控制器和驱动框架简介

8、另外在内核目录“drivers/usb/serial/”下可以看到前面文档中介绍的 USB 转串口驱动,这个目录里面是 usb 转串口的驱动源码。USB 主控制在内核源码“drivers/usb/host/”中,如下图所示,可以看到其中只有一个编译生成的“.o”文件。

4412开发板-驱动-usb-主控制器和驱动框架简介

9、我们在第一篇文档中有介绍到 4412 的主控制器是 USB2.0,使用的是 EHCI 控制器。我们在 menuconfig 中,进入“ Device Drivers”-> “USB support (USB_SUPPORT[=y])”,如下图所示,可以看到“EHCI HCD (USB 2.0) support”默认被配置了。

4412开发板-驱动-usb-主控制器和驱动框架简介

10、如上图所示,可以看到“ S5P EHCI support”,这是针对具体平台的配置,如下图所示这个配置定义了宏“CONFIG_USB_EHCI_S5P”。

4412开发板-驱动-usb-主控制器和驱动框架简介

11、接着使用 source insight 看一下“drivers/usb/host/ehci-hcd.c”的驱动源码,做一下简单了解。module_init(ehci_hcd_init);入口函数入口函数 ehci_hcd_init 中,以下代码是注册主控制器驱动的代码。#ifdef PLATFORM_DRIVERretval = 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 等等函数。

12、有驱动注册,那么肯定有设备注册,而且设备名称也是要和驱动名称一样为"s5p-ehci"。接着我们在平台文件中找一下设备注册。在“arch/arm/mach-exynos/mach-itop4412.c”文件中,搜索宏定义“USB_EHCI_S5P”,如下图所示,可以看到主控制器函数的设备注册代码。

4412开发板-驱动-usb-主控制器和驱动框架简介

13、如上图所示,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 结构体。

4412开发板-驱动-usb-主控制器和驱动框架简介

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

4412开发板-驱动-usb-主控制器和驱动框架简介

15、至此,我尺攵跋赈们完成分析了主控制的设备注册和驱动注册。具体实现代码更加复杂,但是这部分不需要我们去做,有原厂会提供做好的驱动。本文档只是让大家对主控制驱动有个感性的认识,在后面文档中的设备描述掼屐磴磨符、URB(请求块)才是驱动学习的重点。另外还有具体的 USB 驱动的移植,也比主机驱动和 USB 核心层驱动更重要,希望大家不要花费过多的时间去研究主控制驱动和 USB 核心层代码。而是要在主机驱动和核心层驱动的基础上,移植我们在项目和工程中需要的外围模块。到后面,大家会发现,在移植和使用USB 外围设备驱动的时候,完全不需要用到 USB 主控制器、USB 驱动框架等等知识。

热门搜索
关于母亲的手抄报 关于科学的手抄报 读书节手抄报内容 法制宣传手抄报 科学幻想手抄报 小学生手抄报制作技巧入门 三八妇女节的手抄报 安全知识手抄报内容 春节手抄报资料 祖国在我心中手抄报内容