[MTK] 如何增强 i2c bus 驱动能力?

文摘 Kernel MediaTek 2020-12-1 阅读:14805

[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);

0条评论

© 2024 芯缘异码. Powered by Typecho