kernel(十七)USB-HOST主机控制器之OHCI

   Linux内核(以3.8.3为例)默认仅提供了ehci-s5p.c,但是提供了很多其他平台的ohci源码,因此,我们可以参考ohci-exynos.c来编写自己的ohci-s5p.c,然后参考ehci-s5p.c的代码组织方式添加到内核就可以了。下面废话少说,直接进入正题,开始USB HOST的EHCI和OHCI移植。

(一)编写ohci-s5p.c

ohci-exynos.c为模板,修改以适合我们的S5P平台。
(1)拷贝ohci-exynos.c为ohci-s5p.c
(2)替换所有的exynos为s5p
(3)由于有些地方是exynos4,所以,还需要将s5p4替换为s5p

(二)代码修改

1、打开ohci-hcd.c文件,找到ohci-exynos,然后再其前面添加S5P平台支持,修改后如下:


2、打开\drivers\usb\host\Kconfig文件,在config USB_OHCI_EXYNOS前面添加S5P配置支持,修改后如下:


3、编写usb-ohci-s5p.h头文件

   (1)切换目录到include/linux/platform_data/,然后拷贝usb-exynos.h到usb-ohci-s5p.h。
   (2)打开usb-ohci-s5p.h,将所有的exynos4替换为s5p。
   (3)将EXYNOS替换为S5P。

   完成这三步,ohci的驱动就已经做好了,但是还需要添加平台支持。


4、配置平台支持

(1)切换到目录arch/arm/plat-samsung,然后打开devs.c文件
(2)在CONFIG_S5P_DEV_USB_EHCI模块后面添加如下内容:
(3)打开devs.h文件,添加s5p_device_ohci:


S5P_PA_OHCI:查看S5PV210数据手册,USB-OHCI基地址是0xEC30_0000
IRQ_USB_HOST:USB主机控制器中断


5、切换到arch/arm/mach-s5pv210目录,打开mach-smdkv210.c,在smdkv210_devices的定义中添加头文件<linux/platform_data/usb-ohci-s5p.h>,添加ohci设备,如下:


6、 然后在上面定义platform_data 文件smdkv210_ohci_pdata:结构体在usb-ohci-s5p.h中定义,内容如下:


7、然后设置platform_data,在smdkv210_machine_init函数中添加如下内容:


8、打开\arch\arm\plat-samsung\Kconfig文件,在S5P_DEV_USB_EHCI模块后面添加OHCI支持,修改后如下


9、 修改setup-usb-phy.c文件中s5p_usb_phy_init和s5p_usb_phy_exit函数

/* modied by JerryGou */
int s5p_usb_phy_init(struct platform_device *pdev, int type)  
{  
    int err;  
    struct clk *otg_clk;  
  
    //if (type != S5P_USB_PHY_HOST)  
   	if (type != USB_PHY_TYPE_HOST)
        return -EINVAL;  
  
    otg_clk = clk_get(&pdev->dev, "otg");  
    if (IS_ERR(otg_clk)) {  
        dev_err(&pdev->dev, "Failed to get otg clock\n");  
        return PTR_ERR(otg_clk);  
    }     
  
    err = clk_enable(otg_clk);  
    if (err) {  
        clk_put(otg_clk);  
        return err;  
    }     
  
    if (readl(S5PV210_USB_PHY_CON) & (0x1<<1)) {  
        clk_disable(otg_clk);  
        clk_put(otg_clk);  
        return 0;  
    }  
  
    __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);  
    /* "at least 10uS" for PHY reset elsewhere, 20 not enough here... */  
    udelay(50);  
  
    clk_disable(otg_clk);  
    clk_put(otg_clk);  
  
    return 0;  
}  
  
/* modied by JerryGou */  
int s5p_usb_phy_exit(struct platform_device *pdev, int type)  
{  
    //if (type != S5P_USB_PHY_HOST)  
   	if (type != USB_PHY_TYPE_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);  
  
    return 0;  
} 

10、内核自带的ehci-s5p.c文件有一些BUG,仅支持了U盘的读取,还无法支持写操作,所以要做两处修改,如下:

至此,代码已修改完毕,下面配置内核

(二)配置内核

   这时,执行make menuconfig配置,在Device Drivers --->USB support 下看不到OHCI HCD support,只能看到EHCI HCD support,这是因为内核配置存在关联关系,现在解决这个问题。
1、打开\drivers\usb\Kconfig,在USB_ARCH_HAS_OHCI模块下添加如下内容


2、打开\drivers\usb\host\Kconfig,在USB_EHCI_S5P模块下添加如下内容:

3、执行make menuconfig,把USB-EHCI相关模块编译进内核

   Device Drivers  --->
            SCSI devide support  --->
                        <*> SCSI devide support
                        [*] legacy /proc/scsi/support  
                        <*> SCSI disk support
                        <*> SCSI CDROM support
                        <*> SCSI generic support
            HID support  --->
                        <*> Generic HID driver
            [*] USB support  --->
                        <*> Support for Host-side USB
                                    <*> EHCI HCD (USB 2.0) support  
                                    [*] Improved Transaction Translator scheduling
                                    <*> EHCI support for Samsung S5P/EXYNOS SoC Series
                                    
                                    <*> OHCI HCD support
                                    [*] S5P OHCI support
                                    [*] Generic OHCI driver for a platform device
                                    
                                    <*> USB Mass Storage support
                                    [*] USB Mass Storage verbose debug    
                                    <*> SanDisk SDDR-09 (and other SmartMedia, including DPCM)
                                    <*>    SanDisk SDDR-55 SmartMedia support  
报错:


获取不到usbhost时钟,需要修改echi-s5p.c文件中的s5p_ehci_probe函数


正确加载USB-ECHI驱动:


3、插入U盘测试


猜你喜欢

转载自blog.csdn.net/jerrygou/article/details/80933898
今日推荐