如何调用compat_ioctl或unlocked_ioctl?

时间:2014-05-17 07:12:44

标签: linux-device-driver ioctl

我正在尝试为RTC(实时时钟)实现驱动程序。我在ioctl中使用了kernel 2.6.32函数。它工作正常。但是当我在内核3.13.0中运行相同的驱动程序时,它给出了一个错误‘struct file_operations’ has no member named ‘ioctl’

当我将ioctl更改为unlocked_ioctlcompat_ioctl时,已编译并模块化插入。

但是在用户应用程序中调用ioctl而不是在模块中调用ioctl函数。我必须在用户应用程序中使用哪些函数来调用compat_ioctlunlocked_ioctl

1 个答案:

答案 0 :(得分:7)

检查驱动程序中的参数

定义结构文件操作定义如

static struct file_operations query_fops =
{
    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_close,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
    .ioctl = my_ioctl
#else
    .unlocked_ioctl = my_ioctl
#endif
};

定义类似ioctl

#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
static int my_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
#else
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
        #endif
    {
              switch(cmd){
                ....................................
                ...................................
              }
    }

和应用程序级别

无需进行任何修改,您可以在应用程序级别遵循ioctl的基本规则。