Не удалось прочитать регистр ST-1232 I2C во время исследования устройстваLinux

Ответить
Anonymous
 Не удалось прочитать регистр ST-1232 I2C во время исследования устройства

Сообщение Anonymous »

Я работаю над встроенной системой Linux (Kernel-5.10.188), где есть сенсорный экран, чья сенсорная панель IC-ST1232.

Я хочу прочитать версию ST1232, прочитав его I2C Регистр 0x0, но я не смог сделать это в его зондировании следующим образом. его обработчик IRQ, который работал следующим образом. < /p>

Код: Выделить всё

--- a/kernel/kernel-5.10/drivers/input/touchscreen/st1232.c
+++ b/kernel/kernel-5.10/drivers/input/touchscreen/st1232.c
@@ -45,9 +45,36 @@ struct st1232_ts_data {
struct gpio_desc *reset_gpio;
const struct st_chip_info *chip_info;
int read_buf_len;
+       u32  fw_rev;
u8 *read_buf;
};

+static int st1232_ts_read_ver(struct st1232_ts_data *ts)
+{
+       struct i2c_client *client = ts->client;
+       u8 start_reg = 0x0;
+       struct i2c_msg msg[] = {
+               {
+                       .addr   = client->addr,
+                       .len    = sizeof(start_reg),
+                       .buf    = &start_reg,
+               },
+               {
+                       .addr   = client->addr,
+                       .flags  = I2C_M_RD | I2C_M_DMA_SAFE,
+                       .len    = 1,
+                       .buf    = (u8 *)&ts->fw_rev,
+               }
+       };
+       int ret;
+
+       ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
+       if (ret != ARRAY_SIZE(msg))
+               return ret < 0 ? ret : -EIO;
+
+       return 0;
+}
+
static int st1232_ts_read_data(struct st1232_ts_data *ts)
{
struct i2c_client *client = ts->client;
@@ -122,11 +149,19 @@ static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id)
struct st1232_ts_data *ts = dev_id;
int count;
int error;
+static int xx = 0;

error = st1232_ts_read_data(ts);
if (error)
goto out;

+if (xx < 5) {
+    error = st1232_ts_read_ver(ts);
+       memcpy(&ts->input_dev->id.version, &ts->fw_rev, 2);
+       printk("xxxxxxxxxxxxx fw_rev: 0x%x, error: %d\n", ts->fw_rev, error);
+}
+xx++;
+
count = st1232_ts_parse_and_report(ts);
if (!count) {
if (ts->low_latency_req.dev) {
@@ -276,6 +311,9 @@ static int st1232_ts_probe(struct i2c_client *client,

i2c_set_clientdata(client, ts);

+    error = st1232_ts_read_ver(ts);
+       memcpy(&ts->input_dev->id.version, &ts->fw_rev, 2);
+       printk("xxxxxxxxxxxxx fw_rev: 0x%x, error: %d\n", ts->fw_rev, error);
return 0;
}
< /code>
Я получил следующий журнал ядра. < /p>
# dmesg | grep xxxx
[    1.150101] xxxxxxxxxxxxx fw_rev: 0x0, error: -145
[    1.195555] xxxxxxxxxxxxx fw_rev: 0x6, error: 0
Я не знаю, почему он не смог прочитать регистр i2c в функции _probe, в то время как он преуспел в обработчике прерываний, что я упустил при чтении регистра i2c?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ce-probing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»