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

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

时间:11-28 来源:互联网 点击:

  1. etup-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. ints5p_usb_phy_init(structplatform_device*pdev,inttype)
    14. #include
    15. #include
    16. #include
    17. #include
    18. #include
    19. #include
    20. #include
    21. #include
    22. #include
    23. #include
    24. #include
    25. #include
    26. ints5p_usb_phy_init(structplatform_device*pdev,inttype)
    27. {
    28. interr;
    29. structclk*otg_clk;
    30. if(type!=S5P_USB_PHY_HOST)
    31. return-EINVAL;
    32. otg_clk=clk_get(&pdev->dev,"otg");
    33. if(IS_ERR(otg_clk)){
    34. dev_err(&pdev->dev,"Failedtogetotgclock");
    35. returnPTR_ERR(otg_clk);
    36. }
    37. err=clk_enable(otg_clk);
    38. if(err){
    39. clk_put(otg_clk);
    40. returnerr;
    41. }
    42. if(readl(S5PV210_USB_PHY_CON)&(0x1<1)){
    43. clk_disable(otg_clk);
    44. clk_put(otg_clk);
    45. return0;
    46. }
    47. __raw_writel(__raw_readl(S5PV210_USB_PHY_CON)|(0x1<1),
    48. S5PV210_USB_PHY_CON);
    49. __raw_writel((__raw_readl(S3C_PHYPWR)
    50. &~(0x1<7)&~(0x1<6))|(0x1<8)|(0x1<5)|(0x1<4),
    51. S3C_PHYPWR);
    52. __raw_writel((__raw_readl(S3C_PHYCLK)&~(0x1<7))|(0x3<0),
    53. S3C_PHYCLK);
    54. __raw_writel((__raw_readl(S3C_RSTCON))|(0x1<4)|(0x1<3),
    55. S3C_RSTCON);
    56. __raw_writel(__raw_readl(S3C_RSTCON)&~(0x1<4)&~(0x1<3),
    57. S3C_RSTCON);
    58. /*"atleast10uS"forPHYresetelsewhere,20notenoughhere...*/
    59. udelay(50);
    60. clk_disable(otg_clk);
    61. clk_put(otg_clk);
    62. return0;
    63. }
    64. ints5p_usb_phy_exit(structplatform_device*pdev,inttype)
    65. {
    66. if(type!=S5P_USB_PHY_HOST)
    67. return-EINVAL;
    68. __raw_writel(__raw_readl(S3C_PHYPWR)|(0x1<7)|(0x1<6),
    69. S3C_PHYPWR);
    70. __raw_writel(__raw_readl(S5PV210_USB_PHY_CON)&~(1<1),
    71. S5PV210_USB_PHY_CON);
    72. return0;
    73. }

    六 内核配置项修改

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

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

    1. defaultyifPLAT_S5P

    (2)切换到目录drivers/usb/host下,打开Kconfig,在USB_EHCI_S5P模块下添加如下内容:

    1. selectS5P_DEV_USB_EHCI

    然后再USB_OHCI_S5P模块下添加如下内容:

    1. selectS5P_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. /*DMAburstEnable*/

    一共有两处,分别将其下的一行代码:

    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上开发东西没什么两样,你是不会看到底层那些美妙的风景的,如果想踏踏实实的做好嵌入式,底层还是不能忽略的,最好从裸机开始。

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

网站地图

Top