Linux驱动程序。只读IOCTL命令有效

问题描述 投票:0回答:1

我在Raspberry Pi上编写IOCTL操作时遇到了一些麻烦。

我的司机:

static struct file_operations st7735_syahniuk_device_fops =
{
    .owner          = THIS_MODULE,
    .open           = st7735_syahniuk_device_open,
    .release        = st7735_syahniuk_device_release,
    .unlocked_ioctl = st7735_syahniuk_device_ioctl,
    .read           = st7735_syahniuk_device_read,
    .write          = st7735_syahniuk_device_write
};

static long st7735_syahniuk_device_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
...
    case ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS:
        printk(KERN_INFO "ST7735 IOCTL: Reading display delay\n");
        uldata = g_display.display_thread_sleep_ms;
        err = copy_to_user((void *)arg, &uldata, sizeof(uldata));
        if(err) {
            printk(KERN_ERR "ST7735 IOCTL: Error\n");
            err = -EIO;
        }
        break;

    case ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS:
        printk(KERN_INFO "ST7735 IOCTL: Writing display delay\n");
        err = copy_from_user(&uldata, (void *)arg, sizeof(uldata));
        if(err) {
            printk(KERN_ERR "ST7735 IOCTL: Error\n");
            err = -EIO;
            break;
        }
        g_display.display_thread_sleep_ms = uldata;
        break;
}

...
}

有IOCTL命令定义:

#define MAJIC_NUM 'k'
#define ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS  _IOR(MAJIC_NUM, 10, unsigned long)
#define ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS _IOW(MAJIC_NUM, 11, unsigned long)

有测试用户态应用程序:

...
    if(ioctl(fd, ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS, &display_delay_ms) < 0) {
        perror("Failed to read Display Delay (ms) register");
        goto finish;
    }
...
if(ioctl(fd, ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS, &display_delay_ms) < 0) {
        perror("Failed to write Display Delay (ms) register");
        goto finish;
    }

当我启动读取命令运行良好但写入命令给出错误ENOTTY - 设备不适当的ioctl。

我已经尝试了不同的幻数,但所有的读命令都运行良好,但写命令却没有。

加成

我用strace检查了userland应用程序并发现了一些奇怪的东西。当我打开我的设备文件时,它返回文件描述符号(例如'3')。当我用read命令调用ioctl时,strace告诉我该函数是用fd = 3调用的。但由于某种原因,使用write命令传输fd = 1。为什么用1(stdout)而不是我的设备文件的fd调用?

linux raspberry-pi driver linux-device-driver kernel-module
1个回答
0
投票

原因是在其中一个读取命令之后,我的文件描述符的值与打开设备文件时的值不同。可能导致内存泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.