S5PV210(TQ210)學習筆記——USB HOST移植
五 修改setup-usb-phy.c文件
從3.4版本開始,內核中自帶的setup-usb-s5p.c文件就存在問題,需要修改才能支持S5PV210芯片。
切換到目錄arch/arm/mach-s5pv210,將setup-usb-s5p.c文件中的內容替換成下面的代碼:
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- ints5p_usb_phy_init(structplatform_device*pdev,inttype)
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- ints5p_usb_phy_init(structplatform_device*pdev,inttype)
- {
- interr;
- structclk*otg_clk;
- if(type!=S5P_USB_PHY_HOST)
- return-EINVAL;
- otg_clk=clk_get(&pdev->dev,"otg");
- if(IS_ERR(otg_clk)){
- dev_err(&pdev->dev,"Failedtogetotgclock");
- returnPTR_ERR(otg_clk);
- }
- err=clk_enable(otg_clk);
- if(err){
- clk_put(otg_clk);
- returnerr;
- }
- if(readl(S5PV210_USB_PHY_CON)&(0x1<<1)){
- clk_disable(otg_clk);
- clk_put(otg_clk);
- return0;
- }
- __raw_writel(__raw_readl(S5PV210_USB_PHY_CON)|(0x1<<1),
- S5PV210_USB_PHY_CON);
- __raw_writel((__raw_readl(S3C_PHYPWR)
- &~(0x1<<7)&~(0x1<<6))|(0x1<<8)|(0x1<<5)|(0x1<<4),
- S3C_PHYPWR);
- __raw_writel((__raw_readl(S3C_PHYCLK)&~(0x1<<7))|(0x3<<0),
- S3C_PHYCLK);
- __raw_writel((__raw_readl(S3C_RSTCON))|(0x1<<4)|(0x1<<3),
- S3C_RSTCON);
- __raw_writel(__raw_readl(S3C_RSTCON)&~(0x1<<4)&~(0x1<<3),
- S3C_RSTCON);
- /*"atleast10uS"forPHYresetelsewhere,20notenoughhere...*/
- udelay(50);
- clk_disable(otg_clk);
- clk_put(otg_clk);
- return0;
- }
- ints5p_usb_phy_exit(structplatform_device*pdev,inttype)
- {
- if(type!=S5P_USB_PHY_HOST)
- return-EINVAL;
- __raw_writel(__raw_readl(S3C_PHYPWR)|(0x1<<7)|(0x1<<6),
- S3C_PHYPWR);
- __raw_writel(__raw_readl(S5PV210_USB_PHY_CON)&~(1<<1),
- S5PV210_USB_PHY_CON);
- return0;
- }
六 內核配置項修改
這時,執行make menuconfig配置,在Device Drivers --->USB support 下看不到OHCI HCD support,只能看到EHCI HCD support,這是因為內核配置存在關聯關系,現在解決這個問題。
(1)切換到目錄drivers/usb/,打開Kconfig,在USB_ARCH_HAS_OHCI模塊下添加如下內容
- defaultyifPLAT_S5P
- selectS5P_DEV_USB_EHCI
- selectS5P_DEV_USB_OHCI
七 EHCI模塊內核bug修改
到這里雖然已經編譯 通過了,下載到開發板也可以看到OHCI和EHCI模塊都被驅動起來了,插入U盤時也可以正常訪問U盤里的數據了,但是,你會發現,如果你對內核U盤中的內容稍作修改然后卸載U盤的話就會發生錯誤,而且U盤中也沒有存入任何數據,這說明,上面的配置僅支持了U盤的讀取,還無法支持寫操作。
由于芯片手冊上對USB HOST部分,我對各寄存器的功能也不是很了解,另外,想了解各部分的功能還需要閱讀USB1.0、USB1.1和USB2.0協議,如果想支持USB3.0,還需要閱讀相關協議,我暫時還沒有時間和精力來閱讀這些資料,于是,我去三星的郵件列表中查找,找到了相關問題的解決方法。
打開ehci-s5p.c,然后找到注釋
- /*DMAburstEnable*/
- writel(EHCI_INSNREG00_ENABLE_DMA_BURST,EHCI_INSNREG00(hcd->regs));
- writel(0x000E0000,hcd->regs+0x90);
- writel(0x00400040,hcd->regs+0x94);
八 小結
經過上面一番大戰,Linux-3.8.3或者Linux-3.8.6就可以正常驅動S5PV210的USB HOST模塊了。
最后,發表一下個人意見,學習嵌入式這些東西,還是需要自己親自動手做一下,拿官方的核去做一些簡單的應用跟在PC上開發東西沒什么兩樣,你是不會看到底層那些美妙的風景的,如果想踏踏實實的做好嵌入式,底層還是不能忽略的,最好從裸機開始。
評論