S5PV210(TQ210)學(xué)習筆記——USB HOST移植
五 修改setup-usb-phy.c文件
從3.4版本開(kāi)始,內核中自帶的setup-usb-s5p.c文件就存在問(wèn)題,需要修改才能支持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;
- }
六 內核配置項修改
這時(shí),執行make menuconfig配置,在Device Drivers --->USB support 下看不到OHCI HCD support,只能看到EHCI HCD support,這是因為內核配置存在關(guān)聯(lián)關(guān)系,現在解決這個(gè)問(wèn)題。
(1)切換到目錄drivers/usb/,打開(kāi)Kconfig,在USB_ARCH_HAS_OHCI模塊下添加如下內容
- defaultyifPLAT_S5P
- selectS5P_DEV_USB_EHCI
- selectS5P_DEV_USB_OHCI
七 EHCI模塊內核bug修改
到這里雖然已經(jīng)編譯 通過(guò)了,下載到開(kāi)發(fā)板也可以看到OHCI和EHCI模塊都被驅動(dòng)起來(lái)了,插入U盤(pán)時(shí)也可以正常訪(fǎng)問(wèn)U盤(pán)里的數據了,但是,你會(huì )發(fā)現,如果你對內核U盤(pán)中的內容稍作修改然后卸載U盤(pán)的話(huà)就會(huì )發(fā)生錯誤,而且U盤(pán)中也沒(méi)有存入任何數據,這說(shuō)明,上面的配置僅支持了U盤(pán)的讀取,還無(wú)法支持寫(xiě)操作。
由于芯片手冊上對USB HOST部分,我對各寄存器的功能也不是很了解,另外,想了解各部分的功能還需要閱讀USB1.0、USB1.1和USB2.0協(xié)議,如果想支持USB3.0,還需要閱讀相關(guān)協(xié)議,我暫時(shí)還沒(méi)有時(shí)間和精力來(lái)閱讀這些資料,于是,我去三星的郵件列表中查找,找到了相關(guān)問(wèn)題的解決方法。
打開(kāi)ehci-s5p.c,然后找到注釋
- /*DMAburstEnable*/
- writel(EHCI_INSNREG00_ENABLE_DMA_BURST,EHCI_INSNREG00(hcd->regs));
- writel(0x000E0000,hcd->regs+0x90);
- writel(0x00400040,hcd->regs+0x94);
八 小結
經(jīng)過(guò)上面一番大戰,Linux-3.8.3或者Linux-3.8.6就可以正常驅動(dòng)S5PV210的USB HOST模塊了。
最后,發(fā)表一下個(gè)人意見(jiàn),學(xué)習嵌入式這些東西,還是需要自己親自動(dòng)手做一下,拿官方的核去做一些簡(jiǎn)單的應用跟在PC上開(kāi)發(fā)東西沒(méi)什么兩樣,你是不會(huì )看到底層那些美妙的風(fēng)景的,如果想踏踏實(shí)實(shí)的做好嵌入式,底層還是不能忽略的,最好從裸機開(kāi)始。
評論