新聞中心

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

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

作者: 時間: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)修改

這時,執(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)在解決這個問題。

(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ū)動起來了,插入U(xiǎn)盤時也可以正常訪問U盤里的數(shù)據(jù)了,但是,你會發(fā)現(xiàn),如果你對內(nèi)核U盤中的內(nèi)容稍作修改然后卸載U盤的話就會發(fā)生錯誤,而且U盤中也沒有存入任何數(shù)據(jù),這說明,上面的配置僅支持了U盤的讀取,還無法支持寫操作。

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

八 小結(jié)

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

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


上一頁 1 2 下一頁

關(guān)鍵詞: S5PV210USBHOST移

評論


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

關(guān)閉