Hi,
we use one 941 connect with 2 948 for 2 display:
941’s GPIO0/1/2/3 to first 948's GPIO0/1/2/3 and 941's D_GPIO0/1/2/3 to secont 948's GPIO0/1/2/3.
set gpio3 output, then we set high on 941's D_GPIO3, but 948's GPIO3 not be high;
but after set gpio3 input, we see 941's D_GPIO3 change follow 948's GPIO3.
Thanks
code:
static int du90ub941_enable_port(struct goodix_ts_data *ts,
int port_index)
{
u8 dreg, dval;
dreg = 0x1e;
dval = 0;
du90ub941_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "941[4] reg=0x%x, val=0x%x\n", dreg, dval);
if (port_index == 0)
dval = 0x1;
else if (port_index == 1)
dval = 0x4;
else
return 0;
du90ub941_i2c_write(ts, dreg, &dval, 1);
}
//set gpio3 output
case 3:
dreg = 0x0f;
dval = 0;
du90ub941_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "941 before out reg=0x%x, val=0x%x\n", dreg,
dval);
dval &= 0xf0;
dval |= 0x03;
du90ub941_i2c_write(ts, dreg, &dval, 1);
dval = 0;
du90ub941_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "941 after out reg=0x%x, val=0x%x\n", dreg,
dval);
dreg = 0x1f;
dval = 0;
du90ub948_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "948 before out reg=0x%x, val=0x%x\n", dreg,
dval);
dval &= 0xf0;
dval |= 0x05;
du90ub948_i2c_write(ts, dreg, &dval, 1);
dval = 0;
du90ub948_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "948 after out reg=0x%x, val=0x%x\n", dreg,
dval);
break;
//set gpio3 input
case 3:
dreg = 0x0f;
dval = 0;
du90ub941_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "941 in reg=0x%x, val=0x%x\n", dreg, dval);
dval &= 0xf0;
dval |= 0x05;
du90ub941_i2c_write(ts, dreg, &dval, 1);
dreg = 0x1f;
dval = 0;
du90ub948_i2c_read(ts, dreg, &dval, 1);
dev_err(&ts->client->dev, "948 in reg=0x%x, val=0x%x\n", dreg, dval);
dval &= 0xf0;
dval |= 0x03;
du90ub948_i2c_write(ts, dreg, &dval, 1);
break;
log:
[ 1.498605] Semidrive DS941 DS948 Goodix-TS 5-0014: goodix_ts_probe(): get_gpio error=0
[ 1.506790] Semidrive DS941 DS948 Goodix-TS 5-0014: ts->addr_ds941=0xd, ts->addr_ds948=0x3c
[ 1.515252] Semidrive DS941 DS948 Goodix-TS 5-0014: ts->irq_channel=3, ts->reset_channel=2
[ 1.543934] Semidrive DS941 DS948 Goodix-TS 5-0014: 941[4] reg=0x1e, val=0x4
[ 1.553453] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 reg=0x17, val=0x9e
[ 1.560793] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 reg=0x7, val=0xba
[ 1.568074] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 reg=0x8, val=0xba
[ 1.575323] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 reg=0x70, val=0x28
[ 1.582664] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 reg=0x77, val=0x28
[ 1.590005] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 before out reg=0xf, val=0x0
[ 1.601109] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 after out reg=0xf, val=0x3 //
[ 1.609183] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 before out reg=0x1f, val=0x3
[ 1.617677] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 after out reg=0x1f, val=0x5 //output
[ 1.644092] Semidrive DS941 DS948 Goodix-TS 5-0014: goodix_ts_probe(): call reset
[ 1.652122] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 before reg=0x1e, val=0x90
[ 1.660449] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 after reg=0x1e, val=0x10
[ 1.752086] Semidrive DS941 DS948 Goodix-TS 5-0014: ts->client->addr == 0x14 1
[ 1.761469] Semidrive DS941 DS948 Goodix-TS 5-0014: goodix_reset(): reset high
[ 1.769163] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 before reg=0x1e, val=0x10
[ 1.777396] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 after reg=0x1e, val=0x90
[ 1.852568] Semidrive DS941 DS948 Goodix-TS 5-0014: 941 in reg=0xf, val=0x3
[ 1.860261] Semidrive DS941 DS948 Goodix-TS 5-0014: 948 in reg=0x1f, val=0x5