如何在ioctl中获取struct i2c_client *客户端结构?

时间:2013-07-05 14:17:24

标签: linux linux-kernel linux-device-driver

我使用ioctl方法使用miscregister将用户空间sysfs交互移动到“/ dev”。

我们可以从Inode中解析客户端结构(struct i2c_client)吗请有人告诉我如何在ioctl中获取客户端结构。我需要在ioctl内部进行i2c传输。

我提到了这个链接:

http://stackoverflow.com/questions/2635038/inode-to-device-information

但是coudln得到了任何答案。

请有人给出解决方案。

2 个答案:

答案 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。