当前位置:   article > 正文

kernel(十六)USB-HOST主机控制器之EHCI_usb_hostehcitaskfunction

usb_hostehcitaskfunction

   简单地讲,OHCI、UHCI都是USB1.1的接口标准,而EHCI是对应USB2.0的接口标准,最新的xHCI是USB3.0的接口标准。
1. OHCI(Open Host Controller Interface)是支持USB1.1的标准,主要用于非x86的USB,如扩展卡、嵌入式开发板的USB主控。
2. UHCI(Universal Host Controller Interface),是Intel主导的对USB1.0、1.1的接口标准,与OHCI不兼容。
3. EHCI(Enhanced Host Controller Interface),是Intel主导的USB2.0的接口标准。EHCI仅提供USB2.0的高速功能,而依靠UHCI或OHCI来提供对全速(full-speed)或低速(low-speed)设备的支持。
4. xHCI(eXtensible Host Controller Interface),是最新最火的USB3.0的接口标准,它在速度、节能、虚拟化等方面都比前面3中有了较大的提高。

   Linux3.10.46内核驱动中针对S5PV210芯片自带有USB-EHCI主机控制器驱动ehci-s5p.c,在目录drivers\usb\host里,所以移植起来比较方便。

(一)代码修改

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


S5P_PA_EHCI:查看S5PV210数据手册,USB-EHCI基地址是0xEC20_0000

IRQ_USB_HOST:USB主机控制器中断

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

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


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


s5p_ehci_set_platdata:函数在devs.c 中定义,如下


最终会调用arch/arm/mach-s5pv210/setup-usb-phy.c中的初始化和退出函数

5、 但这两个函数有问题,需要修改,需改后如下

  1. /* add by JerryGou */
  2. static int s5pv210_usb_phy1_init(struct platform_device *pdev)
  3. {
  4.     int err;  
  5.     struct clk *otg_clk;  
  6.  
  7.     otg_clk = clk_get(&pdev->dev, "otg");  
  8.     if (IS_ERR(otg_clk)) {  
  9.         dev_err(&pdev->dev, "Failed to get otg clock\n");  
  10.         return PTR_ERR(otg_clk);  
  11.     }     
  12.  
  13.     err = clk_enable(otg_clk);  
  14.     if (err) {  
  15.         clk_put(otg_clk);  
  16.         return err;  
  17.     }
  18.  
  19.     writel(readl(S5PV210_USB_PHY_CON) | S5PV210_USB_PHY1_EN, S5PV210_USB_PHY_CON);
  20.     writel((readl(S3C_PHYPWR) & ~(0x1<<7) & ~(0x1<<6)), S3C_PHYPWR);
  21.     writel((readl(S3C_PHYCLK) & ~(0x1<<7)) | (0x3<<0), S3C_PHYCLK);
  22.     writel((readl(S3C_RSTCON)) | (0x1<<4) | (0x1<<3), S3C_RSTCON);  
  23.     writel(readl(S3C_RSTCON) & ~(0x1<<4) & ~(0x1<<3), S3C_RSTCON);
  24.     /* "at least 10uS" for PHY reset elsewhere, 20 not enough here... */  
  25.     udelay(50);  
  26.  
  27.     clk_disable(otg_clk);  
  28.     clk_put(otg_clk);  
  29.  
  30.     return 0;  
  31. }
  32. /* add by JerryGou */
  33. static int s5pv210_usb_phy1_exit(struct platform_device *pdev)
  34. {
  35.     writel((readl(S3C_PHYPWR) | (1 << 6) |(1 << 7)), S3C_PHYPWR);
  36.     writel(readl(S5PV210_USB_PHY_CON) & ~S5PV210_USB_PHY1_EN,
  37.             S5PV210_USB_PHY_CON);
  38.     return 0;
  39. }
  40. /* modied by zjh */
  41. int s5p_usb_phy_init(struct platform_device *pdev, int type)
  42. {
  43.     if (type == USB_PHY_TYPE_DEVICE)
  44.         return s5pv210_usb_otgphy_init(pdev);
  45.     else if (type == USB_PHY_TYPE_HOST)            /* add by JerryGou */
  46.         return s5pv210_usb_phy1_init(pdev);        /* add by JerryGou */
  47.     return -EINVAL;
  48. }
  49. /* modied by zjh */
  50. int s5p_usb_phy_exit(struct platform_device *pdev, int type)
  51. {
  52.     if (type == USB_PHY_TYPE_DEVICE)
  53.         return s5pv210_usb_otgphy_exit(pdev);
  54.     else if (type == USB_PHY_TYPE_HOST)            /* add by JerryGou */
  55.         return s5pv210_usb_phy1_exit(pdev);        /* add by JerryGou */
  56.     return -EINVAL;
  57. }

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

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

(二)配制内核

1、打开宏开关CONFIG_S5P_DEV_USB_EHCI,切换到目录drivers/usb/host 下,打开Kconfig,在USB_EHCI_S5P模块下添加如下内容:


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

  1. Device Drivers --->
  2.     [*] USB support --->
  3.         <*> Support for Host-side USB
  4.             <*> EHCI HCD (USB 2.0) support
  5.             <*> EHCI support for Samsung S5P/EXYNOS SoC Series

报错:


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


正确加载USB-ECHI驱动:


3、插入U盘测试


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/247066?site
推荐阅读
相关标签
  

闽ICP备14008679号