[MTK] 如何增强 i2c bus 驱动能力?
文摘 Kernel MediaTek 2020-12-1 阅读:16654[DESCRIPTION]
i2c 传输低电平不能到达0v,如何增强 i2c 驱动能力?
[SOLUTION]
i2c 传输低电平不能到达0v,是下拉电流不足导致,需要调整下拉电流。需要注意以下两点:
1.如果低电平的电压值仍在 spec 范围内(-500mV~0.3VDD),只要不影响正常传输,是可以忽略的,因为调整会影响到下降时间tF。
2.出现台阶现象时,如果高阶处于以下阶段,是device下拉能力不足导致,无法通过调节soc侧修复,需要咨询vendor:
a.发送slave地址的 ack/nack 位
b.write 操作的 ack/nack 位
c.read 操作的 data 位
3.调整驱动电流往往会导致 tF 减小,可能会不符合 spec,需要权衡。
修改soc侧下拉电流/驱动能力方式:
1.kernel 侧修改需要咨询 MTKer 相应 kernel 版本中是否有support此功能,如果有,一般在 dts 设置 pinmux 时设定。
2.如果kernel侧不支持,则需要在preloader/lk 的i2c driver中 disable EH feature,需要参考具体user guide中寄存器地址以及偏移位。
EH feature 用于减弱i2c driving 以调节下降时间,默认情况下是 enable。
2.disable EH feature 之后还是不够的话,需要设定 gpio DRV_CFG来增强电流,需要参考具体user guide中寄存器地址以及偏移位。
若无寄存器资料,请联系MTKer帮忙修改。
附在preloader 的i2c driver中 disable EH feature的方法:
修改文件路径:
vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/${proj}/src/drivers/i2c.c
修改函数:
int i2c_hw_init(void)
在函数 return 之前加入如下code:
MT8768:
/* Just for MT6765/MT6762, config driving set EH2,EH1= 2'b01 */
/* EH: 1, i2c mode;0, GPIO mode */
/* [EH2,EH1]: 2'b00,0.31;2'b01,0.61;2'b10,1.1;2'b11,1.41 */
/* [EH,EH2,EH1] = [bit2,bit1,bit0] */
/*I2C0,1*/
I2C_SET_REG32((0x10002a00 + 0x20), 0x0FFF, 0x0B6D);
/*I2C2,4*/
I2C_SET_REG32((0x10002800 + 0x20), 0x0FFF, 0x0B6D);
/*I2C6*/
I2C_SET_REG32((0x10002c00 + 0x20), 0x3F, 0x2D);
/*I2C3,5*/
I2C_SET_REG32((0x10002600 + 0x20), 0x0FFF, 0x0B6D);
MT8788:
/* disable EH feature */
/* SDA0[11:9] SCL0[21:19] */
/* SDA1[14:12] SCL1[24:22] */
I2C_SET_REG32(IOCFG_RB_BASE + 0xF0, 0x01F87E00, 0x0);
/* SDA3[9:7] SCL3[14:12] */
I2C_SET_REG32(IOCFG_BL_BASE + 0xF0, 0x7380, 0x0);
/* SDA5[17:15] SCL5[22:20] */
I2C_SET_REG32(IOCFG_LB_BASE + 0xF0, 0x738000, 0x0);
/* SDA2[16:14] SCL2[26:24] */
/* SDA4[19:17] SCL4[29:27] */
I2C_SET_REG32(IOCFG_RM_BASE + 0xF0, 0x3F0FC000, 0x0);