put_user

Взгляд изнутри

Модератор: Модераторы разделов

Ответить
IMB
Сообщения: 2561
ОС: Debian

put_user

Сообщение IMB »

Приветсвую!
Имеется следующая функция в драйвере:

Код:

static int aic33_i2c_read_reg(u8 reg, u8 *val) { int err; struct i2c_client *client = &aic33_i2c_dev.client; struct i2c_msg msg[1]; unsigned char data[1]; int __user buff; if (!client->adapter) return -ENODEV; /*Rishi*/ msg->addr = client->addr; msg->flags = 0; msg->len = 1; msg->buf = data; data[0] = reg; /*Rishi*/ //*data = reg; err = i2c_transfer(client->adapter, msg, 1); if (err >= 0) { msg->flags = I2C_M_RD; err = i2c_transfer(client->adapter, msg, 1); } if (err >= 0) { *val = data[0]; //*val = *data; printk(KERN_INFO "val = %#x, buf = %#x, &buf = %#x\n", *val, buff, &buff); put_user(*val, &buff); //return err; } return err; }

Клиентская программа через ioctl обращается к драйверу и должна выдать результат.
Правильный вывод:

user@localhost

# /opt/dvsdk/ctrl -d cmos -r 0xf0 device = cmosioctl_read 0x1 value less 0xf

Вывод при обращении к данному драйверу:

user@localhost

# /opt/dvsdk/ctrl -d aic22 -r 0x1 val = 0x50, buf = 0xc46908d0, &buf = 0xc5e15ee8 i2c_read_reg val = 0x50 device = aic22ioctl_read 0 value less 0xf

Вся проблема в том, что в данном драйвере почему то не работает передача через put_user.
Не могу сообразить в чем проблема. Подскажите?
Спасибо.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: put_user

Сообщение deadhead »

я, конечно, не спец, но почему у вас в примерах разное обращение к драйверу ?!!
/opt/dvsdk/ctrl -d cmos -r 0xf0

и
# /opt/dvsdk/ctrl -d aic22 -r 0x1
[x] close
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: put_user

Сообщение IMB »

Спасибо за внимание!
Все правильно, я привел обращение к двум разным устройством. Устройство aic22 работало не корректно.
На данный момент проблема решена, все было из-за передачи разных типов данных.
Спасибо сказали:
Ответить