s5pv210-Linux驱动之USB-HOST主机控制器之OHCI

来源:互联网 发布:唇语学习软件 编辑:程序博客网 时间:2024/05/16 16:07

一、开发环境

    硬件平台:我用的是TQ210核心板,板载S5PV210芯片,USB扩展接有FE1.1S芯片,是一个4端口的HUB

    软件平台:开发板移植的是Linux3.10.46内核,UBOOT移植的是2014.12版本

二、资源简介

    上一篇移植了USB-EHCI驱动,内核自带ehci-s5p.c源码,移植比较简单。内核没有S5PV210芯片的USB-OHCI驱动源码,但是提供了很多其他平台的ohci 源码,比如三星的exynos系列芯片,它的USB主机控制器和S5PV210基本相同,所以,我们可以参考ohci-exynos.c 来编写自己的ohci-s5p.c,然后参考ehci-s5p.c 的代码组织方式添加到内核就可以了。

三、移植步骤

(一)代码修改

编写自己的ohci-s5p.c

1、切换到drivers\usb\host目录,拷贝ohci-exynos.c 为ohci-s5p.c

2、替换所有的exynos 为s5p

3、由于有些地方是exynos4,所以,还需要将s5p4 替换为s5p

修改 drivers/usb/host目录下的相关文件

4、打开ohci-hcd.c 文件,找到ohci-exynos,然后再其后面添加S5P 平台支持,修改后如下:

#ifdef CONFIG_USB_OHCI_EXYNOS#include "ohci-exynos.c"#define EXYNOS_PLATFORM_DRIVERexynos_ohci_driver#endif#ifdef CONFIG_USB_OHCI_S5P// wzs#include "ohci-s5p.c"#define S5P_PLATFORM_DRIVERs5p_ohci_driver#endif
5、打开Kconfig 文件,在config USB_OHCI_EXYNOS 前面添加S5P 配置支持,修改后如下:

config USB_OHCI_S5P        boolean "OHCI support for Samsung S5PV210 SoC Series"        depends on PLAT_S5P        help         Enable support for the Samsung S5P SOC's on-chip OHCI controller.config USB_OHCI_EXYNOS        boolean "OHCI support for Samsung EXYNOS SoC Series"        depends on ARCH_EXYNOS        help         Enable support for the Samsung Exynos SOC's on-chip OHCI controller.

编写 usb-ohci-s5p.h 头文件

6、切换目录到include/linux/platform_data/,然后拷贝usb-ohci-exynos.h 到usb-ohci-s5p.h

7、打开usb-ohci-s5p.h,将所有的exynos4 替换为s5p,将EXYNOS 替换为S5P

配置平台支持

8、切换到目录arch/arm/plat-samsung,然后打开devs.c 文件

在CONFIG_S5P_DEV_USB_EHCI 模块后面添加如下内容:

#if CONFIG_S5P_DEV_USB_OHCIstatic struct resource s5p_ohci_resource[] = {[0] = DEFINE_RES_MEM(0xEC300000, SZ_256),[1] = DEFINE_RES_IRQ(S5P_IRQ_VIC1(23)),};struct platform_device s5p_device_ohci = {.name = "s5p-ohci",.id = -1,.num_resources = ARRAY_SIZE(s5p_ohci_resource),.resource = s5p_ohci_resource,.dev = {.dma_mask = &samsung_device_dma_mask,.coherent_dma_mask = DMA_BIT_MASK(32),}};void __init s5p_ohci_set_platdata(struct s5p_ohci_platdata *pd){struct s5p_ohci_platdata *npd;npd = s3c_set_platdata(pd, sizeof(struct s5p_ohci_platdata), &s5p_device_ohci);if (!npd->phy_init)npd->phy_init = s5p_usb_phy_init;if (!npd->phy_exit)npd->phy_exit = s5p_usb_phy_exit;}#endif /* CONFIG_S5P_DEV_USB_OHCI */
9、添加ohci 的头文件

#include <linux/platform_data/usb-ohci-s5p.h>

10、打开Kconfig 文件,在S5P_DEV_USB_EHCI 模块前面添加OHCI支持,修改后如下:

config S5P_DEV_USB_OHCI        bool        help          Compile in platform device definition for USB OHCIconfig S5P_DEV_USB_EHCI        bool        help          Compile in platform device definition for USB EHCI
11、切换到arch\arm\plat-samsung\include\plat目录,打开devs.h文件,填加s5p_device_ohci声明,如下:
extern struct platform_device s5p_device_ehci;extern struct platform_device s5p_device_ohci;

12、切换到arch/arm/mach-s5pv210 目录,打开mach-smdkv210.c,在smdkv210_devices 的定义中添加ohci 设备,如下:
#ifdef CONFIG_S5P_DEV_USB_OHCI&s5p_device_ohci,#endif
13、然后在上面定义platform_data 文件,内容如下:

#ifdef CONFIG_S5P_DEV_USB_OHCIstatic struct s5p_ohci_platdata s5p_ohci_platdata;#endif
14、修改 setup-usb-phy.c文件和移植USB-EHCI相同

    至此,代码修改完毕,下面配制内核。

(二)配制内核

    执行make menuconfig 配置,在Device Drivers --->USB support 下看不到OHCI HCD support,只能看到EHCI HCDsupport,这是因为内核配置存在关联关系,现在解决这个问题。1、切换到目录drivers/usb/,打开Kconfig,在USB_ARCH_HAS_OHCI 模块下添加S5PV210平台支持:

config USB_ARCH_HAS_OHCI        boolean        # ARM:        default y if SA1111        ...        default y if ARCH_S5PV210

2、打开宏开关CONFIG_S5P_DEV_USB_OHCI,切换到目录drivers/usb/host 下,打开Kconfig,在USB_OHCI_S5P 模块下添加如下内容:

config USB_OHCI_S5P        boolean "OHCI support for Samsung S5PV210 SoC Series"        depends on PLAT_S5P        select S5P_DEV_USB_OHCI        help         Enable support for the Samsung S5P SOC's on-chip OHCI controller.
3、执行make menuconfig,把USB-OHCI相关模块编译进内核

<*>     OHCI HCD support[*]       OHCI support for Samsung S5PV210 SoC Series
4、重新编充内核。

四、小结

    OHCI支持USB1.1,速度是慢一些,但是如果应用在嵌入式开发板上还好,因为支持的范围比较广,如鼠标、键盘、U盘都可以支持。





 
原创粉丝点击