微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S5PV210(TQ210)学习笔记——USB HOST移植

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

时间:11-28 来源:互联网 点击:
在写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. #ifdefCONFIG_USB_OHCI_S5P
  2. #include"ohci-s5p.c"
  3. #definePLATFORM_DRIVERs5p_ohci_driver
  4. #endif
  5. #ifdefCONFIG_USB_OHCI_EXYNOS
  6. #include"ohci-exynos.c"
  7. #definePLATFORM_DRIVERexynos_ohci_driver
  8. #endif

(2)打开Kconfig文件,在config USB_OHCI_EXYNOS前面添加S5P配置支持,修改后如下:

  1. configUSB_OHCI_S5P
  2. boolean"S5POHCIsupport"
  3. dependsonUSB_OHCI_HCD&&PLAT_S5P
  4. help
  5. EnablesupportfortheS5PSOCson-chipOHCIcontroller.
  6. configUSB_OHCI_EXYNOS
  7. boolean"OHCIsupportforSamsungEXYNOSSoCSeries"
  8. dependsonUSB_OHCI_HCD&&ARCH_EXYNOS
  9. help
  10. EnablesupportfortheSamsungExynosSOCson-chipOHCIcontroller.

三 编写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. #ifdefCONFIG_S5P_DEV_USB_OHCI
  2. staticstructresources5p_ohci_resource[]={
  3. [0]=DEFINE_RES_MEM(0xEC300000,SZ_256),
  4. [1]=DEFINE_RES_IRQ(S5P_IRQ_VIC1(23)),
  5. };
  6. structplatform_devices5p_device_ohci={
  7. .name="s5p-ohci",
  8. .id=-1,
  9. .num_resources=ARRAY_SIZE(s5p_ohci_resource),
  10. .resource=s5p_ohci_resource,
  11. .dev={
  12. .dma_mask=&samsung_device_dma_mask,
  13. .coherent_dma_mask=DMA_BIT_MASK(32),
  14. }
  15. };
  16. void__inits5p_ohci_set_platdata(structs5p_ohci_platdata*pd)
  17. {
  18. structs5p_ohci_platdata*npd;
  19. npd=s3c_set_platdata(pd,sizeof(structs5p_ohci_platdata),
  20. &s5p_device_ohci);
  21. if(!npd->phy_init)
  22. npd->phy_init=s5p_usb_phy_init;
  23. if(!npd->phy_exit)
  24. npd->phy_exit=s5p_usb_phy_exit;
  25. }
  26. #endif/*CONFIG_S5P_DEV_USB_OHCI*/

(2)添加ohci的头文件

  1. #include

(3)打开Kconfig文件,在S5P_DEV_USB_EHCI模块后面添加OHCI支持,修改后如下

  1. configS5P_DEV_USB_EHCI
  2. bool
  3. help
  4. CompileinplatformdevicedefinitionforUSBEHCI
  5. configS5P_DEV_USB_OHCI
  6. bool
  7. help
  8. CompileinplatformdevicedefinitionforUSBOHCI

(4)切换到arch/arm/mach-s5pv210目录,打开mach-smdkv210.c,在smdkv210_devices的定义中添加ehci和ohci设备,如下:

  1. #ifdefCONFIG_S5P_DEV_USB_EHCI
  2. &s5p_device_ehci,
  3. #endif
  4. #ifdefCONFIG_S5P_DEV_USB_OHCI
  5. &s5p_device_ohci,
  6. #endif

然后定义platform_data文件,内容如下:

  1. #ifdefCONFIG_S5P_DEV_USB_EHCI
  2. staticstructs5p_ehci_platdatas5p_ehci_platdata;
  3. #endif
  4. #ifdefCONFIG_S5P_DEV_USB_OHCI
  5. staticstructs5p_ohci_platdatas5p_ohci_platdata;
  6. #endif

最后,设置platform_data,在smdkv210_machine_init函数中添加如下内容:

  1. #ifdefCONFIG_S5P_DEV_USB_EHCI
  2. s5p_ehci_set_platdata(&s5p_ehci_platdata);
  3. #endif
  4. #ifdefCONFIG_S5P_DEV_USB_OHCI
  5. s5p_ohci_set_platdata(&s5p_ohci_platdata);
  6. #endif

这样,就将平台设备注册给内核了。

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

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

切换到目录arch/arm/mach-s5pv210,将s

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top