我使用ioctl方法使用miscregister
将用户空间sysfs交互移动到“/ dev”。
我们可以从Inode中解析客户端结构(struct i2c_client
)吗请有人告诉我如何在ioctl中获取客户端结构。我需要在ioctl内部进行i2c传输。
我提到了这个链接:
http://stackoverflow.com/questions/2635038/inode-to-device-information
但是coudln得到了任何答案。
请有人给出解决方案。
答案 0 :(得分:2)
使用open函数在内核中打开设备。 (这部分代码是从一个主线驱动程序(drivers / i2c / i2c-dev.c)复制的,以方便您使用)
my_i2c_device_open(struct inode *inode, struct file *file)
{
unsigned int minor = iminor(inode);
struct i2c_client *client;
struct i2c_adapter *adap;
struct i2c_dev *i2c_dev;
i2c_dev = i2c_dev_get_by_minor(minor);
if (!i2c_dev)
return -ENODEV;
adap = i2c_get_adapter(i2c_dev->adap->nr);
if (!adap)
return -ENODEV;
client = kzalloc(sizeof(*client), GFP_KERNEL);
if (!client) {
i2c_put_adapter(adap);
return -ENOMEM;
}
snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr);
client->adapter = adap;
file->private_data = client;
return 0;
}
当您调用ioctl时,您可以从设备的文件指针中检索i2c_client:
static long my_i2c_device_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct i2c_client *client = file->private_data;
}
希望这能让你的生活变得轻松。'
答案 1 :(得分:0)
此参考可能有所帮助:
Reason to pass data using struct inode and struct file in Linux device driver programming
在上面的示例中,您构建了一个与“struct scull_dev”等效的结构,并在那里存储了对i2c_client结构的引用。在IOCTL函数中,您可以稍后在主控制结构上检索,并通过container_of引用i2c_client。