您的位置:首页 > 运维架构 > Linux

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

2017-10-12 10:11 489 查看


一、开发环境

    硬件平台:我用的是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_DRIVER	exynos_ohci_driver
#endif

#ifdef CONFIG_USB_OHCI_S5P		// wzs
#include "ohci-s5p.c"
#define S5P_PLATFORM_DRIVER	s5p_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_OHCI
static 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 OHCI

config 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_OHCI
static 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盘都可以支持。

















                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  s5pv210 usb驱动 ohci