Originariamente inviato da
eldiau
Leggo il contenuto dei registri, per esempio, dal dmseg:
<4>[ 1.640382] [ELDIAU] ft5406_ts.c: trying to reset on PIN 2
<4>[ 2.220376] [ELDIAU] ft5406_ts.c: ft5406_set_regs
<6>[ 2.520777] input: ft5x0x_ts as /devices/virtual/input/input1
<4>[ 2.730364] [ELDIAU] ft5406_ts.c: fts_register_read
<4>[ 2.735803] [ELDIAU] ft5406_ts.c: i2c_write_interface
<4>[ 3.540453] [ELDIAU] ft5406_ts.c: i2c_read_interface
<4>[ 3.740451] [TSP] firmware version = 0xe2
<4>[ 3.745731] [ELDIAU] ft5406_ts.c: fts_register_read
<4>[ 3.751022] [ELDIAU] ft5406_ts.c: i2c_write_interface
<4>[ 4.560432] [ELDIAU] ft5406_ts.c: i2c_read_interface
<4>[ 4.760451] [TSP]firmware report rate = 2260Hz
<4>[ 4.765677] [ELDIAU] ft5406_ts.c: fts_register_read
<4>[ 4.770858] [ELDIAU] ft5406_ts.c: i2c_write_interface
<4>[ 5.580438] [ELDIAU] ft5406_ts.c: i2c_read_interface
<4>[ 5.780428] [TSP]firmware threshold = 904
Quei dati (firmware version, firmware report rate = 2260Hz, firmware threshold = 904) sono letti da:
fts_register_read(FT5X0X_REG_FIRMID, ®_version,1);
printk("[TSP] firmware version = 0x%2x\n", reg_version);
fts_register_read(FT5X0X_REG_REPORT_RATE, ®_value,1);
printk("[TSP]firmware report rate = %dHz\n", reg_value*10);
fts_register_read(FT5X0X_REG_THRES, ®_value,1);
printk("[TSP]firmware threshold = %d\n", reg_value * 4);
fts_register_read(FT5X0X_REG_NOISE_MODE, ®_value,1);
printk("[TSP]nosie mode = 0x%2x\n", reg_value);
la funzione fts_register_read() chiama i2c_write_interface() per mandare via i2c la richiesta di restituire il contenuto di un registro al chip e i2c_read_interface() per leggere il risultato spedito indietro dal chip, come vedi riesco a parlare con il chip correttamente...
Purtroppo pero' c'e' qualcosa che poi blocca la comunicazione per cui successivi accessi mi danno
<3>[ 6.804985] rk29_i2c rk29_i2c.2: i2c transfer err, client address is 0x38 [20110106]
<3>[ 6.809431] ft5x0x_ts 2-0038: ft5406_read_regs fail:-22!
Solo che di questo passo si finisce per dover riscrivere l'intero driver...