<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S5PV210(TQ210)學(xué)習(xí)筆記——USB HOST移植

          S5PV210(TQ210)學(xué)習(xí)筆記——USB HOST移植

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

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

          從3.4版本開始,內(nèi)核中自帶的setup-usb-s5p.c文件就存在問題,需要修改才能支持S5PV210芯片。

          切換到目錄arch/arm/mach-s5pv210,將setup-usb-s5p.c文件中的內(nèi)容替換成下面的代碼:

          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. }

          六 內(nèi)核配置項(xiàng)修改

          這時(shí),執(zhí)行make menuconfig配置,在Device Drivers --->USB support 下看不到OHCI HCD support,只能看到EHCI HCD support,這是因?yàn)閮?nèi)核配置存在關(guān)聯(lián)關(guān)系,現(xiàn)在解決這個(gè)問題。

          (1)切換到目錄drivers/usb/,打開Kconfig,在USB_ARCH_HAS_OHCI模塊下添加如下內(nèi)容

          1. defaultyifPLAT_S5P
          (2)切換到目錄drivers/usb/host下,打開Kconfig,在USB_EHCI_S5P模塊下添加如下內(nèi)容:
          1. selectS5P_DEV_USB_EHCI
          然后再USB_OHCI_S5P模塊下添加如下內(nèi)容:
          1. selectS5P_DEV_USB_OHCI
          到這里,執(zhí)行make menuconfig,到USB相關(guān)部分開始OHCI和EHCI中S5P相關(guān),然后編譯內(nèi)核即可正式支持S5PV210內(nèi)核了。

          七 EHCI模塊內(nèi)核bug修改

          到這里雖然已經(jīng)編譯 通過了,下載到開發(fā)板也可以看到OHCI和EHCI模塊都被驅(qū)動(dòng)起來了,插入U(xiǎn)盤時(shí)也可以正常訪問U盤里的數(shù)據(jù)了,但是,你會(huì)發(fā)現(xiàn),如果你對內(nèi)核U盤中的內(nèi)容稍作修改然后卸載U盤的話就會(huì)發(fā)生錯(cuò)誤,而且U盤中也沒有存入任何數(shù)據(jù),這說明,上面的配置僅支持了U盤的讀取,還無法支持寫操作。

          由于芯片手冊上對USB HOST部分,我對各寄存器的功能也不是很了解,另外,想了解各部分的功能還需要閱讀USB1.0、USB1.1和USB2.0協(xié)議,如果想支持USB3.0,還需要閱讀相關(guān)協(xié)議,我暫時(shí)還沒有時(shí)間和精力來閱讀這些資料,于是,我去三星的郵件列表中查找,找到了相關(guān)問題的解決方法。

          打開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盤卸載時(shí)出錯(cuò)的問題。

          八 小結(jié)

          經(jīng)過上面一番大戰(zhàn),Linux-3.8.3或者Linux-3.8.6就可以正常驅(qū)動(dòng)S5PV210的USB HOST模塊了。

          最后,發(fā)表一下個(gè)人意見,學(xué)習(xí)嵌入式這些東西,還是需要自己親自動(dòng)手做一下,拿官方的核去做一些簡單的應(yīng)用跟在PC上開發(fā)東西沒什么兩樣,你是不會(huì)看到底層那些美妙的風(fēng)景的,如果想踏踏實(shí)實(shí)的做好嵌入式,底層還是不能忽略的,最好從裸機(jī)開始。


          上一頁 1 2 下一頁

          關(guān)鍵詞: S5PV210USBHOST移

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();