MTK 平台修改或查看USB驱动能力有三种方法:
1、工模菜单
通过"*#*#3646633#*#*"进入工程模式,通过如下菜单可以查看修改USB驱动能力:
hardware testing-->USB-->USB PHY TUning-->USB_DRIVING_CAPABILITY;
2、USB节点
有ROOT权限image通过下面节点查看修改驱动能力:
/sys/kernel/debug/usb20_phy/USB_DRIVING_CAPABILITY
3、修改CODE:
方法1、修改set_usb_phy_mode()函数
有时候device的驱动能力调整好,但手机作为host确存在连接不上device的问题,这时就需要单独调节device和host的驱动能力,以6765为例,可在如下位置进行修改:
/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); USBPHY_CLR32(OFFSET_RG_USB20_TERM_VREF_SEL, VAL_MAX_WIDTH_3 << SHFT_RG_USB20_TERM_VREF_SEL); USBPHY_SET32(OFFSET_RG_USB20_TERM_VREF_SEL, u2_term_ref << SHFT_RG_USB20_TERM_VREF_SEL); USBPHY_CLR32(OFFSET_RG_USB20_PHY_REV6, VAL_MAX_WIDTH_2 << SHFT_RG_USB20_PHY_REV6); USBPHY_SET32(OFFSET_RG_USB20_PHY_REV6, u2_enhance<<SHFT_RG_USB20_PHY_REV6); 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; case PHY_IDLE_MODE: /* VBUSVALID=0, AVALID=0, BVALID=0, SESSEND=1, IDDIG=0, IDPULLUP=1 */ USBPHY_SET32(0x6c, (0x11<<0)); USBPHY_CLR32(0x6c, (0x2e<<0)); USBPHY_SET32(0x6c, (0x3f<<8)); break; default: DBG(0, "mode error %d\n", mode); } DBG(0, "force PHY to mode %d, 0x6c=%x\n", mode, USBPHY_READ32(0x6c)); }
方法2、直接修改usb_phy_tuning(void)函数,修改为:
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 (u2_vrt_ref != -1) { if (u2_vrt_ref <= VAL_MAX_WIDTH_3) { 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); } } if (u2_term_ref != -1) { if (u2_term_ref <= VAL_MAX_WIDTH_3) { USBPHY_CLR32(OFFSET_RG_USB20_TERM_VREF_SEL, VAL_MAX_WIDTH_3 << SHFT_RG_USB20_TERM_VREF_SEL); USBPHY_SET32(OFFSET_RG_USB20_TERM_VREF_SEL, u2_term_ref << SHFT_RG_USB20_TERM_VREF_SEL); } } if (u2_enhance != -1) { if (u2_enhance <= VAL_MAX_WIDTH_2) { USBPHY_CLR32(OFFSET_RG_USB20_PHY_REV6, VAL_MAX_WIDTH_2 << SHFT_RG_USB20_PHY_REV6); USBPHY_SET32(OFFSET_RG_USB20_PHY_REV6, u2_enhance<<SHFT_RG_USB20_PHY_REV6); } } else { .......... 与host_modecode一致,只是需要设定不同的参数 }