[MTK] 如何修改usb驱动能力

文摘 Kernel MediaTek 2020-03-5 阅读:8752

[DESCRIPTION]

 USB驱动能力调节方法;

 USB眼图测试fail处理方法;

[SOLUTION]

 1、USB眼图测试fail通常需要修改如下两个register调节USB驱动能力:

  • RG_USB20_VRT_VREF_SEL:调整VRT的电压大小, 电压愈大, DP DM上SWING愈大,等效调整眼图斜率;
  • RG_USB20_VRT_VREF_SEL:直接调整DP DM 电压大小,等效调整眼图的高度

RG_USB20_VRT_VREF_SEL.png

2、修改或查看USB驱动能力有三种方法:

   1)工模菜单

    通过"##3646633##"进入工程模式,通过如下菜单可以查看修改USB驱动能力:

     hardware testing-->USB-->USB PHY TUning-->USB_DRIVING_CAPABILITY;

    2)adb cmd rw sysfs node

     有ROOT权限image通过下面节点查看修改驱动能力:

  • 调节等效斜率:echo xxx > /sys/kernel/debug/usb20_phy/RG_USB20_VRT_VREF_SEL (二进制,具体值参考register描述)
  • 调节等效高度:echo xxx > /sys/kernel/debug/usb20_phy/RG_USB20_TERM_VREF_SEL(二进制,具体值参考register描述)
  • Both:echo n > /sys/kernel/debug/usb20_phy/USB_DRIVING_CAPABILITY(十进制)

  3)修改CODE:

以alps-mp-p0.mp3为例

(1)修改set_usb_phy_mode()函数

    以MT6765 device和host设置驱动能力为例,若host不care则只修改device即可;注意仅USB20可用;       
/kernel-4.9/drivers/misc/mediatek/usb20/mt6765/usb20_phy.c

void set_usb_phy_mode(int mode)
{
    switch (mode) {
    case PHY_DEV_ACTIVE:
        /* VBUSVALID=1, AVALID=1, BVALID=1, SESSEND=0, IDDIG=1, IDPULLUP=1 */
        USBPHY_CLR32(0x6C, (0x10<<0));
        USBPHY_SET32(0x6C, (0x2F<<0));
        USBPHY_SET32(0x6C, (0x3F<<8));
        // device mode add here 其中u2_vrt_ref与u2_term_ref 最大为0x7,u2_enhance最大为0x3//
        USBPHY_CLR32(OFFSET_RG_USB20_VRT_VREF_SEL,
        VAL_MAX_WIDTH_3 << SHFT_RG_USB20_VRT_VREF_SEL);
        USBPHY_SET32(OFFSET_RG_USB20_VRT_VREF_SEL,
        u2_vrt_ref << SHFT_RG_USB20_VRT_VREF_SEL);
        ......
        break;
    case PHY_HOST_ACTIVE:
        /* VBUSVALID=1, AVALID=1, BVALID=1, SESSEND=0, IDDIG=0, IDPULLUP=1 */
        USBPHY_CLR32(0x6c, (0x12<<0));
        USBPHY_SET32(0x6c, (0x2d<<0));
        USBPHY_SET32(0x6c, (0x3f<<8));
        //host mode add here,与device mode相同,但需设定不同的us_vrt_ref/u2_term_ref/u2_enhance//
    break;
.........
}

(2)usb_phy_tuning(void)函数

        以MT6779 为例,USB20/USB30均可用;

/kernel-4.9/drivers/phy/mediatek/phy-mtk-mt6779.c

void usb_phy_tuning(void)
{
 printk("mtk_usb_phy_tuning is_host_mode:%d", mtk_musb->is_host_mode);
 if (mtk_musb->is_host_mode) {
 if (!instance->phy_tuning.inited) {
     instance->phy_tuning.u2_vrt_ref = 6;
     instance->phy_tuning.u2_term_ref = 6;
     instance->phy_tuning.u2_enhance = 1;
 } else {
 ..........

 与host_modecode一致,只是需要设定不同的参数
 }  

      (3)修改dts 

         USB20/USB30均可用;         

 usb_phy_tuning:usb_phy_tuning {
 compatible = "mediatek,phy_tuning";
 u2_vrt_ref = <7> ; //should replaced by test value
 u2_term_ref = <7> ;//should replaced by test value
 };

0条评论

© 2024 芯缘异码. Powered by Typecho