S5PV210(TQ210)學(xué)習(xí)筆記——USB HOST移植
五 修改setup-usb-phy.c文件
從3.4版本開始,內(nèi)核中自帶的setup-usb-s5p.c文件就存在問題,需要修改才能支持S5PV210芯片。
切換到目錄arch/arm/mach-s5pv210,將setup-usb-s5p.c文件中的內(nèi)容替換成下面的代碼:
- #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;
- }
六 內(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)容
- defaultyifPLAT_S5P
- selectS5P_DEV_USB_EHCI
- selectS5P_DEV_USB_OHCI
七 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,然后找到注釋
- /*DMAburstEnable*/
- writel(EHCI_INSNREG00_ENABLE_DMA_BURST,EHCI_INSNREG00(hcd->regs));
- writel(0x000E0000,hcd->regs+0x90);
- writel(0x00400040,hcd->regs+0x94);
八 小結(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ī)開始。
評論