问题描述
如何修改USB驱动能力
解决方案
修改或查看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:
P0.MP1
方法1、修改set_usb_phy_mode()函数
有时候device的驱动能力调整好,但手机作为host确存在连接不上device的问题,这时就需要单独调节device和host的驱动能力,以6765为例,可在如下位置进行修改:
/kernel-4.9/drivers/misc/mediatek/usb20/mt6765/usb20_phy.c
1 2 3 4 5 6 7 8 9 |
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// |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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; |
1 2 3 4 5 6 |
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// |
1 2 3 4 5 6 7 8 9 10 11 12 |
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)函数,修改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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一致,只是需要设定不同的参数 } |
P0.MP3(mt6779)
/kernel-4.9/drivers/phy/mediatek/phy-mtk-mt6779.c
1 2 |
usb_phy_tuning(struct mtk_phy_instance *instance) 具体修改与方法2一致 |