I have an RT5350 device (Vstarcam T7838WIP IP camera) and I'm trying to upgrade it to OpenWRT software.
Found a strange bug with i2c bus: system completely hangs on modprobe of i2c-ralink kernel module.
After some research I found the reason: read/write to registers before device reset.
I fixed rt_i2c_init
function, this is the working one:
static int rt_i2c_init(struct rt_i2c *i2c)
{
u32 reg;
/* i2c_sclk = periph_clk / ((2 * clk_div) + 5) */
i2c->clk_div = (clk_get_rate(i2c->clk) - (5 * i2c->cur_clk)) /
(2 * i2c->cur_clk);
if (i2c->clk_div < 8)
i2c->clk_div = 8;
if (i2c->clk_div > I2C_CLKDIV_MASK)
i2c->clk_div = I2C_CLKDIV_MASK;
rt_i2c_reset(i2c);
/* check support combinde/repeated start message */
rt_i2c_w32(i2c, NOSTOP_CMD, REG_STARTXFR_REG);
reg = rt_i2c_r32(i2c, REG_STARTXFR_REG) & NOSTOP_CMD;
return reg;
}
Part of the original version does rt_i2c_reset
:
/* check support combinde/repeated start message */
rt_i2c_w32(i2c, NOSTOP_CMD, REG_STARTXFR_REG);
reg = rt_i2c_r32(i2c, REG_STARTXFR_REG) & NOSTOP_CMD;
rt_i2c_reset(i2c);
Can anybody tell me, why the original version does reset after reading REG_STARTXFR_REG
? My system completely hangs at rt_i2c_w32
if rt_i2c_reset has
not been called before.
Is it possible to make a bugfix to all releases starting from v17?
Can anybody help with this? Don't know how to read this, looks like i2c bus has not been configured.
OpenWRT 18 on RT5350 device with wm8988 on i2c + i2s.
root@OpenWrt:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: -- -- -- -- -- -- -- -- 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77
root@OpenWrt:~# i2cdetect -r -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@OpenWrt:~# i2cdetect -q -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77
root@OpenWrt:~# i2cdetect -F 0
Functionalities implemented by /dev/i2c-0:
I2C yes
SMBus Quick Command yes
SMBus Send Byte yes
SMBus Receive Byte yes
SMBus Write Byte yes
SMBus Read Byte yes
SMBus Write Word yes
SMBus Read Word yes
SMBus Process Call yes
SMBus Block Write yes
SMBus Block Read no
SMBus Block Process Call no
SMBus PEC yes
I2C Block Write yes
I2C Block Read yes