Имеется следующая функция в драйвере:
Код:
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.
Не могу сообразить в чем проблема. Подскажите?
Спасибо.