新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S5PV210(TQ210)學習筆記——USB HOST移植

        S5PV210(TQ210)學習筆記——USB HOST移植

        作者: 時間:2016-11-28 來源:網絡 收藏

        五 修改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. 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上開發東西沒什么兩樣,你是不會看到底層那些美妙的風景的,如果想踏踏實實的做好嵌入式,底層還是不能忽略的,最好從裸機開始。


        上一頁 1 2 下一頁

        關鍵詞: S5PV210USBHOST移

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沂源县| 山西省| 阿坝县| 辽中县| 旅游| 织金县| 福建省| 中方县| 兴隆县| 龙岩市| 苗栗市| 藁城市| 平和县| 梓潼县| 黄大仙区| 大同市| 印江| 如皋市| 巴马| 巧家县| 阿克陶县| 江孜县| 正宁县| 清新县| 长丰县| 绩溪县| 四平市| 渭源县| 芜湖县| 澜沧| 温州市| 上虞市| 安西县| 云霄县| 铜梁县| 北川| 乌兰察布市| 沧州市| 古蔺县| 衡水市| 长治县|