已经编写了我的字符驱动程序以使用.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命令从哪里来?
非常感谢您提供任何信息。