USB驱动移植教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

USB驱动移植教程

一.USB驱动框架

在Linux系统中,提供了主机侧和设备侧视角的USB驱动框架,这里,仅仅讲解主机侧角度看到的USB驱动框架。

从主机侧的角度而言,需要编写的USB驱动程序包括主机控制器驱动和设备驱动两类。USB主机控制器驱动程序控

制插入其中的USB设备,而USB设备驱动程序控制该设备如何作为设备与主机通信。在USB主机控制器驱动和USB

设备驱动之间还有一层叫USB核心层。USB核心负责USB驱动管理和协议处理工作,它通过定义一些数据结构、宏

和功能函数,向上为USB设备驱动提供编程接口,向下为USB主机控制器驱动提供编程接口;通过全局变量维护整个

系统的USB设备信息,完成设备热插拔控制、总线数据传输控制等。说了那么多,无图无真相啊~~

Linux USB主机侧驱动总体框架

二.USB驱动移植步骤

1.S5PV210主机控制驱动的移植

USB主机控制器有3种规范,UHCI(Universal Host Controller Interface),这种规范主要是Intel、Via芯片公司提供支

持PC主板的;OHCI(Open Host Controller Interface),这种规范是微软提出来的,主要应用在非PC系统上的嵌入式

领域上的USB芯片;EHCI(Enhanced Host Controller Interface),这种后来为提高USB速度而提出的规范,它支持

最高速度为480Mbps。

在《S5PV210_UM_REV1.1》手册上搜索OHCI关键词,会发现下面一段话

这表明S5PV210这款CPU支持一个USB主机接口,同时支持EHCI和OHCI这两种规范,支持USB1.1和USB2.0规范,支持最高的外设传输速率为480Mbps。注意了,它并不支持USB3.0规范的USB设备,所以做测试的时候,千万不要拿USB3.0规范的USB设备去测试。

2.1移植ohci-s5p驱动

打开内核目录:driversusbhost,发现Linux系统提供了大量的主机控制器驱动,找遍所有平台,都没有找到ohci-s5p.c源码。很遗憾,3.8的内核没有提供S5PV210的USB HOST控制器驱动程序。最好验证有没有提供的办法就是,

烧写网蜂提供的第二版的uImage进去,然后找个U盘、或者鼠标插入Webee210开发板的USB HOST接口,看看串

口有没有打印什么信息,结果是不会有任何反应的。既然没有提供,这就需要我们自己来编写了,这下不好办了吧?

不用紧张,仔细再找找,还是能发现一些类似的源码,可供我们移植的。我们发现,内核虽然没有提供ohci-s5p.c源码,但是有提供ehci-s5p.c源码,还有ohci相关的其他平台的源码,比如ohci-s3c2410.c、ohci-exynos.c供我们移植参考。

2.1.1 ohci-s5p.c程序

内核既然没有ohci-s5p.c,那我们使用其他平台的ohci源码,这里我们拷贝driversusbhost目录下的ohci-exynos.c

为ohci-s5p.c。然后将所有exynos字符串替换成s5p,由于有些地方是exynos4,所以还需要将s5p4替换为s5p。最后

还需要修改一下头文件,将

#include

改为:

#include

2.2 usb-ohci-s5p.h程序

打开内核目录includelinuxplatform_data,然后拷贝

usb-exynos.h为usb-ohci-s5p.h。将所有的exynos4字符串

替换为s5p,将EXYNOS替换为S5P。

最后添加平台数据:

static struct s5p_ohci_platdata s5p_ohci_platdata;

为了以后支持EHCI还添加echi的平台数据,最后usb-ohci-s5p.h修改为:

#ifndef __MACH_S5P_OHCI_H

#define __MACH_S5P_OHCI_H

/**************Add by Webee*******************/

#ifdef CONFIG_S5P_DEV_USB_EHCI

static struct s5p_ehci_platdata s5p_ehci_platdata;

#endif

static struct s5p_ohci_platdata s5p_ohci_platdata;

/**************Add by Webee*******************/

struct s5p_ohci_platdata {

int (*phy_init)(struct platform_device *pdev, int type);

int (*phy_exit)(struct platform_device *pdev, int type);

};

extern void s5p_ohci_set_platdata(struct s5p_ohci_platdata *pd); #endif /* __MACH_S5P_OHCI_H */

2.3 添加s5p_ohci_driver到ohci_hcd.c

打开driversusbhostohci-hcd.c,在CONFIG_USB_OHCI_EXYNOS前面添加如下代码:

#ifdef CONFIG_USB_OHCI_S5P

#include "ohci-s5p.c"

#define PLATFORM_DRIVERs5p_ohci_driver

#endif

相关文档
最新文档