【发布时间】:2011-07-17 11:18:49
【问题描述】:
我正在编写需要在另一台设备上执行 ioctl 的内核驱动程序。我意识到这不是处理代码的最佳方式,但这只是暂时的修复。我从函数中的 ioctl 调用中返回错误代码 -22(无效参数),但我看不出参数可能有什么问题。以下是相关的代码部分。
#define GPIO74 "/dev/gpio/74"
struct file* gpio74FD;
.
.
.
gpio74FD = filp_open(GPIO74,O_RDWR,0)
.
.
.
int device_ioctl(struct inode* inode,struct file *file, unsigned int ioctl_num,unsigned long ioctl_param)
{
.
.
.
ret_val = gpio74FD->f_op->ioctl(inode, gpio74FD, GPIO_CONFIG_AS_INP, 0); //returns error code -22 (Invlaid Argument)
.
.
.
return ret_val;
}
我怀疑这可能与在此处传递不正确的 inode 有关,但如果它不是从用户空间传递给 ioctl 的 inode,我什至不确定如何获取正确的 inode。
【问题讨论】:
-
对不起,标题是“用户空间”,但正文暗示内核空间。这是正确的吗?
-
我很确定它现在是 inode,因为我设法将其追踪到另一个模块中的 return 语句。我意识到我确实需要 gpio 模块的 inode,但我仍然不清楚如何获取该 inode 的句柄
-
是的,这是一个错字,应该说是内核空间,我修好了
-
在
gpio74FD->f_dentry->inode下找不到文件的inode吗?或者我相信的类似的东西。 -
好的,我不确定如何准确获取 inode,但 gpio74FD->f_dentry->d_inode 似乎工作正常。在我有机会重新刷新我的 linux 设备之前,我不确定这是否能解决我的全部问题。感谢您为我指明正确的方向