意外的IOCTL发送到我的uclinux(ARM)驱动程序

已经编写了我的字符驱动程序以使用.unlocked_ioctl和一个用户空间应用程序对其进行测试,当从用户空间打开设备时,我意外地调用了ioctl函数。

驱动程序和应用程序都使用相同的头文件,其中我将“ my”标识字符定义为“ 8”。驱动程序的dev-err输出消息显示意外的ioctl识别字符为“ T”(请参见下文)。

运行测试应用程序时,它会打开两个驱动程序,但仅基于命令行参数来定位一个驱动程序,因此会为每个驱动程序显示意外的ioctl调用。

我想知道ioctl的“调试”内核配置,但找不到类似的设置。

头文件具有以下内容:

#define RLY_IOCTL_BASE  '8'
#define IOC_RLY_GETLAST _IOR(RLY_IOCTL_BASE,u8)
#define IOC_RLY_SETRELAYS _IOW(RLY_IOCTL_BASE,1,u8)

驱动程序源在其各自的ioctl回调函数中具有以下功能:

if (_IOC_TYPE(cmd) != RLY_IOCTL_BASE) {
    dev_err(&RLYspi->dev,"IOCTL: cmd is not for us! (Ty=%c,num=%d,size=%d,dir=%d)\n",_IOC_TYPE(cmd),_IOC_NR(cmd),_IOC_SIZE(cmd),_IOC_DIR(cmd));
    return -EINVAL;
}
dev_info(&RLYspi->dev,"IOCTL: cmd num-%d,dir=%x\n",_IOC_DIR(cmd));

switch (cmd)

用户空间测试应用程序具有用于打开/ dev / x驱动程序以获取文件句柄和描述符的功能:

afe_fp = fopen(AFE_DEVICE_NAME,"r");
if (NULL == afe_fp) {
    printf ("Could not open device %s!\n",AFE_DEVICE_NAME);
    return 1;
}

afe_fd = fileno (afe_fp);       /* Gets the file descriptor from fp */

/* Open dev/ame_sq_rly */
rly_fp = fopen(RLY_DEVICE_NAME,"r");
if (NULL == rly_fp) {
    printf ("Could not open device %s!\n",RLY_DEVICE_NAME);
    return 1;
}

rly_fd = fileno (rly_fp);       /* Gets the file descriptor from fp */

基于命令行参数(显示一个命令),来自测试应用程序的调用是这样的:

if (IOBase == 8) {
    /* driverapp r b (read_command) */
    else if ((argc == 3) && ((argv[1][0] == 'r') || (argv[1][0] == 'R'))){
        ret = ioctl(rly_fd,IOC_RLY_GETLAST,&RlyVal);
        if (ret < 0) {
            perror("ioctl('IOC_RLY_GETLAST')");
            exit (EXIT_FAILURE);
        }

        printf ("Relay shifter last value: 0x%02X\n",RlyVal);
        return 0;
    }
}

我希望只是从驱动程序(dev_info)接受的命令中获取输出,然后从测试应用程序中的printf获取输出。

运行driverapp(测试应用程序)时,我得到以下控制台输出:

# driverapp r 8
<device A info>: IOCTL: cmd is not for us! (Ty=T,num=1,size=0,dir=0)
<device B info>: IOCTL: cmd is not for us! (Ty=T,dir=0)
<device B info>: IOCTL: cmd num-0,size=1,dir=2
Relay shifter last value: 0x00
#

两个驱动程序(在上面显示为“设备A”和“设备B”)都在设备打开时调用了意外的ioctl调用。我只是通过打开其中一个设备(而不是两个设备)进行了测试,但是对于打开的驱动程序,我只会收到一个意外的ioctl调用。

两个意外的“ T” ioctl命令从哪里来?

非常感谢您提供任何信息。

sunbowen1987 回答:意外的IOCTL发送到我的uclinux(ARM)驱动程序

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3142478.html

大家都在问