S5PV210(TQ210)学习笔记——USB HOST移植

发布者:平凡梦想最新更新时间:2015-08-19 来源: eefocus关键字:S5PV210  USB  HOST  移植 手机看文章 扫描二维码
随时随地手机看文章
在写USB驱动程序的时候意外发现默认状态下内核没有驱动S5PV210的USB HOST控制器,于是,我自己动手移植了一下S5PV210的USB HOST模块,S5PV210的USB HOST控制器跟S3C2440的有些不同,S5PV210同时支持EHCI和OHCI接口(两者的区别自己谷歌搜一下),这样,S5PV210在功能上就完全支持USB2.0接口了。

Linux内核(以3.8.3为例)默认仅提供了ehci-s5p.c,但是提供了很多其他平台的ohci源码,因此,我们可以参考ohci-exynos.c来编写自己的ohci-s5p.c,然后参考ehci-s5p.c的代码组织方式添加到内核就可以了。下面废话少说,直接进入正题,开始USB HOST的EHCI和OHCI移植。

一 编写自己的ohci-s5p.c

我们以ohci-exynos.c为模板,修改以适合我们的S5P平台。

(1)拷贝ohci-exynos.c为ohci-s5p.c

(2)替换所有的exynos为s5p

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

(4)如果是3.4版本的内核不需要修改头文件,但是3.8.3内核对文件结构作了调整,还是将ohci-exynos.h头文件改为:

  1. #include   

 

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

 

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

  1. #ifdef CONFIG_USB_OHCI_S5P  
  2. #include "ohci-s5p.c"  
  3. #define PLATFORM_DRIVER     s5p_ohci_driver  
  4. #endif  
  5.    
  6. #ifdef CONFIG_USB_OHCI_EXYNOS  
  7. #include "ohci-exynos.c"  
  8. #define PLATFORM_DRIVER     exynos_ohci_driver  
  9. #endif  
(2)打开Kconfig文件,在config USB_OHCI_EXYNOS前面添加S5P配置支持,修改后如下:
  1. config USB_OHCI_S5P  
  2.        boolean "S5P OHCI support"  
  3.        depends on USB_OHCI_HCD && PLAT_S5P  
  4.        help  
  5.      Enable support for the S5P SOC's on-chip OHCI controller.  
  6.   
  7. config USB_OHCI_EXYNOS  
  8.     boolean "OHCI support for Samsung EXYNOS SoC Series"  
  9.     depends on USB_OHCI_HCD && ARCH_EXYNOS  
  10.     help  
  11.      Enable support for the Samsung Exynos SOC's on-chip OHCI controller.  

 

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

(1)切换目录到include/linux/platform_data/,然后拷贝usb-exynos.h到usb-ohci-s5p.h。

(2)打开usb-ohci-s5p.h,将所有的exynos4替换为s5p。

(3)将EXYNOS替换为S5P。

完成这三步,ohci的驱动就已经做好了,但是还需要添加平台支持。

四 配置平台支持

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

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

  1. #ifdef CONFIG_S5P_DEV_USB_OHCI  
  2. static struct resource s5p_ohci_resource[] = {  
  3.     [0] = DEFINE_RES_MEM(0xEC300000, SZ_256),  
  4.     [1] = DEFINE_RES_IRQ(S5P_IRQ_VIC1(23)),  
  5. };  
  6.   
  7. struct platform_device s5p_device_ohci = {  
  8.     .name       = "s5p-ohci",  
  9.     .id     = -1,  
  10.     .num_resources  = ARRAY_SIZE(s5p_ohci_resource),  
  11.     .resource   = s5p_ohci_resource,  
  12.     .dev        = {  
  13.         .dma_mask       = &samsung_device_dma_mask,  
  14.         .coherent_dma_mask  = DMA_BIT_MASK(32),  
  15.     }  
  16. };  
  17.   
  18. void __init s5p_ohci_set_platdata(struct s5p_ohci_platdata *pd)  
  19. {  
  20.     struct s5p_ohci_platdata *npd;  
  21.   
  22.     npd = s3c_set_platdata(pd, sizeof(struct s5p_ohci_platdata),  
  23.             &s5p_device_ohci);  
  24.   
  25.     if (!npd->phy_init)  
  26.         npd->phy_init = s5p_usb_phy_init;  
  27.     if (!npd->phy_exit)  
  28.         npd->phy_exit = s5p_usb_phy_exit;  
  29. }  
  30. #endif /* CONFIG_S5P_DEV_USB_OHCI */  
(2)添加ohci的头文件
  1. #include   
(3)打开Kconfig文件,在S5P_DEV_USB_EHCI模块后面添加OHCI支持,修改后如下
  1. config S5P_DEV_USB_EHCI  
  2.     bool  
  3.     help  
  4.       Compile in platform device definition for USB EHCI  
  5.   
  6. config S5P_DEV_USB_OHCI  
  7.     bool  
  8.     help  
  9.       Compile in platform device definition for USB OHCI  
(4)切换到arch/arm/mach-s5pv210目录,打开mach-smdkv210.c,在smdkv210_devices的定义中添加ehci和ohci设备,如下:
  1. #ifdef CONFIG_S5P_DEV_USB_EHCI  
  2.     &s5p_device_ehci,  
  3. #endif  
  4. #ifdef CONFIG_S5P_DEV_USB_OHCI  
  5.      &s5p_device_ohci,  
  6. #endif  
然后定义platform_data文件,内容如下:
  1. #ifdef CONFIG_S5P_DEV_USB_EHCI  
  2. static struct s5p_ehci_platdata s5p_ehci_platdata;  
  3. #endif  
  4. #ifdef CONFIG_S5P_DEV_USB_OHCI  
  5. static struct s5p_ohci_platdata s5p_ohci_platdata;  
  6. #endif  
最后,设置platform_data,在smdkv210_machine_init函数中添加如下内容:
  1. #ifdef CONFIG_S5P_DEV_USB_EHCI  
  2.     s5p_ehci_set_platdata(&s5p_ehci_platdata);  
  3. #endif  
  4. #ifdef CONFIG_S5P_DEV_USB_OHCI  
  5.     s5p_ohci_set_platdata(&s5p_ohci_platdata);  
  6. #endif  
这样,就将平台设备注册给内核了。

[page]

五 修改setup-usb-phy.c文件

从3.4版本开始,内核中自带的setup-usb-s5p.c文件就存在问题,需要修改才能支持S5PV210芯片。

切换到目录arch/arm/mach-s5pv210,将setup-usb-s5p.c文件中的内容替换成下面的代码:

  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13.   
  14. int s5p_usb_phy_init(struct platform_device *pdev, int type)  
  15. #include   
  16. #include   
  17. #include   
  18. #include   
  19. #include   
  20. #include   
  21. #include   
  22. #include   
  23. #include   
  24. #include   
  25. #include   
  26. #include   
  27.   
  28. int s5p_usb_phy_init(struct platform_device *pdev, int type)  
  29. {  
  30.     int err;  
  31.     struct clk *otg_clk;  
  32.   
  33.     if (type != S5P_USB_PHY_HOST)  
  34.         return -EINVAL;  
  35.   
  36.     otg_clk = clk_get(&pdev->dev, "otg");  
  37.     if (IS_ERR(otg_clk)) {  
  38.         dev_err(&pdev->dev, "Failed to get otg clock ");  
  39.         return PTR_ERR(otg_clk);  
  40.     }     
  41.   
  42.     err = clk_enable(otg_clk);  
  43.     if (err) {  
  44.         clk_put(otg_clk);  
  45.         return err;  
  46.     }     
  47.   
  48.     if (readl(S5PV210_USB_PHY_CON) & (0x1<<1)) {  
  49.         clk_disable(otg_clk);  
  50.         clk_put(otg_clk);  
  51.         return 0;  
  52.     }  
  53.   
  54.     __raw_writel(__raw_readl(S5PV210_USB_PHY_CON) | (0x1<<1),  
  55.             S5PV210_USB_PHY_CON);  
  56.     __raw_writel((__raw_readl(S3C_PHYPWR)  
  57.                 & ~(0x1<<7) & ~(0x1<<6)) | (0x1<<8) | (0x1<<5) | (0x1<<4),  
  58.             S3C_PHYPWR);  
  59.     __raw_writel((__raw_readl(S3C_PHYCLK) & ~(0x1<<7)) | (0x3<<0),  
  60.             S3C_PHYCLK);  
  61.     __raw_writel((__raw_readl(S3C_RSTCON)) | (0x1<<4) | (0x1<<3),  
  62.             S3C_RSTCON);  
  63.     __raw_writel(__raw_readl(S3C_RSTCON) & ~(0x1<<4) & ~(0x1<<3),  
  64.             S3C_RSTCON);  
  65.     /* "at least 10uS" for PHY reset elsewhere, 20 not enough here... */  
  66.     udelay(50);  
  67.   
  68.     clk_disable(otg_clk);  
  69.     clk_put(otg_clk);  
  70.   
  71.     return 0;  
  72. }  
  73.   
  74.   
  75. int s5p_usb_phy_exit(struct platform_device *pdev, int type)  
  76. {  
  77.     if (type != S5P_USB_PHY_HOST)  
  78.         return -EINVAL;  
  79.   
  80.     __raw_writel(__raw_readl(S3C_PHYPWR) | (0x1<<7)|(0x1<<6),  
  81.             S3C_PHYPWR);  
  82.     __raw_writel(__raw_readl(S5PV210_USB_PHY_CON) & ~(1<<1),  
  83.             S5PV210_USB_PHY_CON);  
  84.   
  85.     return 0;  
  86. }  

 

六 内核配置项修改

这时,执行make menuconfig配置,在Device Drivers  --->USB support 下看不到OHCI HCD support,只能看到EHCI HCD support,这是因为内核配置存在关联关系,现在解决这个问题。

(1)切换到目录drivers/usb/,打开Kconfig,在USB_ARCH_HAS_OHCI模块下添加如下内容

  1. default y if PLAT_S5P  
(2)切换到目录drivers/usb/host下,打开Kconfig,在USB_EHCI_S5P模块下添加如下内容:
  1. select S5P_DEV_USB_EHCI  
然后再USB_OHCI_S5P模块下添加如下内容:
  1. select S5P_DEV_USB_OHCI  
到这里,执行make menuconfig,到USB相关部分开始OHCI和EHCI中S5P相关,然后编译内核即可正式支持S5PV210内核了。

 

七 EHCI模块内核bug修改

到这里虽然已经编译 通过了,下载到开发板也可以看到OHCI和EHCI模块都被驱动起来了,插入U盘时也可以正常访问U盘里的数据了,但是,你会发现,如果你对内核U盘中的内容稍作修改然后卸载U盘的话就会发生错误,而且U盘中也没有存入任何数据,这说明,上面的配置仅支持了U盘的读取,还无法支持写操作。

由于芯片手册上对USB HOST部分,我对各寄存器的功能也不是很了解,另外,想了解各部分的功能还需要阅读USB1.0、USB1.1和USB2.0协议,如果想支持USB3.0,还需要阅读相关协议,我暂时还没有时间和精力来阅读这些资料,于是,我去三星的邮件列表中查找,找到了相关问题的解决方法。

打开ehci-s5p.c,然后找到注释

  1. /* DMA burst Enable */  
一共有两处,分别将其下的一行代码:
  1. writel(EHCI_INSNREG00_ENABLE_DMA_BURST, EHCI_INSNREG00(hcd->regs));  
改为:
  1. writel(0x000E0000, hcd->regs + 0x90);  
  2. writel(0x00400040, hcd->regs + 0x94);  
这样,就解决了U盘卸载时出错的问题。

 

八 小结

经过上面一番大战,Linux-3.8.3或者Linux-3.8.6就可以正常驱动S5PV210的USB HOST模块了。

最后,发表一下个人意见,学习嵌入式这些东西,还是需要自己亲自动手做一下,拿官方的核去做一些简单的应用跟在PC上开发东西没什么两样,你是不会看到底层那些美妙的风景的,如果想踏踏实实的做好嵌入式,底层还是不能忽略的,最好从裸机开始。

关键字:S5PV210  USB  HOST  移植 引用地址:S5PV210(TQ210)学习笔记——USB HOST移植

上一篇:S5PV210(TQ210)学习笔记——Nand flash驱动编写
下一篇:S5PV210(TQ210)学习笔记——触摸屏驱动编写

推荐阅读最新更新时间:2024-03-16 14:29

STM32 基础系列教程 26 - USB_MSC
前言 学习stm32 USB接口使用,学会用CUBE工具快速创建USB设备工程及调试,关于usb的相关知道请读者提前准备并学习,当然如果不想深究其中原理的话,跟着本文来操作就可以实现基于USB的设备开发了。需要提示的是,stm32在使用usb接口功能是一般需要在DP引脚上上拉一个1.5K电阻到3.3V(部分MCU内部会上拉)。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如
[单片机]
STM32 基础系列教程 26 - <font color='red'>USB</font>_MSC
STM32移植LWIP网线热插入网络不通的解决办法
开发背景: 1、主芯片—STM32F207VCT6; 2、TCP/IP协议栈—LWIP,依托ST例程移植; 3、操作系统—无(裸机); 异常现象: 1、网线不插入的情况下先给设备上电,之后再插入网线无法ping通;(如果上电前网线插入,网络正常); 2、网络已经正常的情况下,电脑PC端修改传输模式(比如从原来的100M全双工修改为10M全双工)导致网络不通; 原因分析: 1、针对第一种异常情况,是由于上电时网线未插入,导致ETH初始化部分未能成功完成,之后即使再插入网线,程序中没有再次进行初始化的逻辑补充,从而导致网络异常; 2、针对第二种情况,情况是上电时完成了ETH的初始化并与PC协商成功,此时网络正常。但当PC端修改传输
[单片机]
USB接口的数模转换系统设计解析
  0 引言   在控制系统中经常需要产生和控制一些模拟信号,而常用的微处理器外部总线接口为数字信号,无法直接产生需要的模拟信号,这就用到了D/A转换器。可以通过USB接口来控制D/A转换器,使其输出要求的模拟量电压或模拟量电流。   USB接口作为微处理器常用的外部总线接口,目前已经得到了广泛的应用,采用USB接口减少了开发的时间、风险以及费用,从而用最快捷的方法实现最经济的解决方案。   本文以USB接口芯片PDIUSBD12和电压输出型D/A转换芯片AD558为例,详细阐述了基于USB接口的DAC系统电路及程序设计方法。   1 USB接口芯片PDIUSBD12简介   本系统选用的USB接口芯片是Phi
[嵌入式]
Exynos4412 内核移植(三)—— 内核启动过程分析
内核启动所用函数如下: 与移植U-Boot 的过程相似,在移植Linux 之前,先了解它的启动过程。Linux 的过程可以分为两部分:架构/开发板相关的引导过程、后续的通用启动过程。对于uImage、zImage ,它们首先进行自解压得到vmlinux ,然后执行 vmlinux 开始“正常的”启动流程。 引导阶段通常使用汇编语言编写,它首先检查内核是否支持当前架构的处理器,然后检查是否支持当前开发板。通过检查后,就为调用下一阶段的start_kernel函数作准备了。这主要分如下两个步骤: 1)-- 连接内核时使用的虚拟地址,所以要设置页表、使能MMU; 2)调用C 函数 start_kernel 之前的常规工作
[单片机]
Exynos4412 内核<font color='red'>移植</font>(三)—— 内核启动过程分析
USB的开发之标准篇
通用串行总线(Universal Serial Bus)是用于将适用USB的外围设备连接到主机的外部总线结构,其主要是用在中速和低速的外设。USB是通过PCI总线和PC的CPU连接,实现数据的 传送。USB同时又是一种通信协议,他支持主系统(host)和USB的外围设备(device)之间的数据传送。 USB的优点有以下几条:         USB为所有的USB外设提供了单一的、易于操作的标准的连接类型。这样一来就简化了USB外设的设计,同时也简化了用户在判断哪个插头对应哪个插槽时的任务,实现了单一的数据通用接口。         USB排除了对各个鼠标、调制解调器、键盘和打印机接口的需求,因而减少了硬件的复杂性和对端口的
[嵌入式]
USB微型频谱分析仪WIFI测试
无线路由器接入USB频谱分析仪测试 1: 使用定向耦合器 连接TSA5G35和天 线 2: 使用TSA5G35前接入30dB 衰减器, 因为无线 路由器的输出功率大约20dBm TSA5G35 参数设定 External 30dB 软件中CURRENT功能将显 示图中曲线,测量结果以每 一帧的方式被显示。 无线路由器传导性测试 中心频率: 2417.1MHz 电平 : 10dBm 带宽: 19.67MHz Density功能将显示信号密度分布 使用互联网看电视,平均曲线将 是高水平。 无线路由器传导性测试 放大密度图像,能看 到信号分布的更多细 节。 TSA5G35 参数设置 两种天线的距离是1 米,TSA5G35使用 USB
[测试测量]
<font color='red'>USB</font>微型频谱分析仪WIFI测试
基于USB总线的多路同步数据采集系统
  1. 引言   通用串行总线(USB,Universal Serial Bus)是现代PC数据传输的发展趋势, PC的所有外设,包括键盘、鼠标、显示器、打印机、录音机、数字音响、电视机顶盒、数码相机、扫描仪、MODEM及各种多媒体音频、视频设备均可通过USB接口接入PC。USB总线同步数据采集系统即为这种总线接入系统。   2. 硬件方案   本系统采用MAXIAM公司的MAX125四路12位同步采集芯片,只需一个启动信号即可实现同步采集、数据转换,完成后给出一个转换完成信号,可从端口依次读取A/D转换数据,送入单片机处理;USB接口芯片采用PHILIPS公司的PDIUSBD12,此芯片单片集成SIE、FIFO存储器、收
[嵌入式]
USB2.0高速读卡器方案 优点和参数
GL823K是一款USB 2.0单LUN读卡器控制器,可支持SD/MMC/MSPRO闪存卡。它支持USB 2.0高速传输,作为USB 2.0闪存卡读卡器的单芯片解决方案,GL823K符合通用串行总线规范2.0版、USB存储类规范1.0版和每个闪存卡接口规范。 BL8810是一款USB2.0读卡器控制芯片,可以在SD、SDHC、mini SD、Micro SD(T-Flash)接口规范之间高速数据传输。BL8810符合标准的USB2.0规范协议。BL8810可替代GL823K,且BL8810集成了片上时钟,可以替代外围的12MHz晶体振荡器。单芯片BL8810成本较GL823K要低,整体BOM成本有比GL823K更具有优势。
[单片机]
<font color='red'>USB</font>2.0高速读卡器方案 优点和参数
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved