Linux 驱动程序。只读取 IOCTL 命令工作

雅纽科夫·斯坦尼斯拉夫

我在 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 调用的。但是由于某种原因,fd=1 是随写命令一起传输的。为什么它用 1 (stdout) 而不是我的设备文件的 fd 调用?

雅纽科夫·斯坦尼斯拉夫

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

IOCTL Linux设备驱动程序

如何在Rust中称呼“ ioctl”?并连接Linux“ tun”驱动程序

linux驱动程序更新如何工作?

USB存储驱动程序如何在Linux中工作?

Linux输入设备读取ioctl(EVIOCGKEY())与读取(input_event)

块设备驱动程序-了解收到的ioctl

Linux驱动程序如何工作?在哪里可以找到它们?(特别是NIC驱动程序)

在linux中查找IOCTL编号

Linux 命令在 Java 程序中无法正常工作

程序或bash shell命令在Linux系统上如何工作?

在Linux内核空间驱动程序中为USB运行供应商命令

SPI Linux驱动程序

“ get_user_pages”如何工作(对于Linux驱动程序)

Linux内核char驱动程序写调用未按预期工作

Linux内核模块/ IOCTL:不适合设备的ioctl

尝试从/ dev / video0读取设备信息时,Video4Linux ioctl错误(#25)

强制重新读取分区表:BLKRRPART和BLKPG ioctl之间的区别?(Linux)

如何在Driver.c controlFunction上接收通过DeviceIoControl发送的数据?IOCTL,驱动程序

Linux内核中的ioctl调用流程

Linux ioctl的返回值由谁解释?

在Linux下使用ioctl重新映射键盘

(Linux 风格) ioctl 代码,难以理解

Linux socket ioctl SIOCGIFNAME No such device error

从外壳程序运行时,Linux“ at”命令工作正常,但从Web服务器运行时,Linux命令失败

linux字符驱动程序中的接口

编写 Linux 键盘驱动程序

Linux设备驱动程序访问控制

Intel 6280 WiFi Linux驱动程序

Linux中的固件和驱动程序