Linux kernel `ioctl`读取和写入GPIO:参数无效

Linux kernel `ioctl`读取和写入GPIO:参数无效,linux-kernel,linux-device-driver,gpio,ioctl,invalid-argument,Linux Kernel,Linux Device Driver,Gpio,Ioctl,Invalid Argument,我在Linux源代码中模仿这个例子。我用的是覆盆子Pi 3B+,希望LED闪烁 我是这样做的: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(int argc,常量字符**argv){ int fd,ret; 结构gpiohandle_请求请求请求; 结构gpiohandle_数据; char*gpio_dev_name=“/dev/gpiochip0”; 无符号整数gpio_线=8; memset(&data.values,0,sizeof(data.val

我在Linux源代码中模仿这个例子。我用的是覆盆子Pi 3B+,希望LED闪烁

我是这样做的:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,常量字符**argv){
int fd,ret;
结构gpiohandle_请求请求请求;
结构gpiohandle_数据;
char*gpio_dev_name=“/dev/gpiochip0”;
无符号整数gpio_线=8;
memset(&data.values,0,sizeof(data.values));
//开放式设备
fd=打开(gpio_dev_name,0);
如果(fd==-1){
fprintf(stderr,“无法打开%s,%s\n”,
gpio_dev_name,strerror(errno));
}
//请求gpio输出
请求行偏移量[0]=gpio_行;
req.flags=GPIOHANDLE_请求_输出| GPIOHANDLE_请求_激活_低;
strcpy(要求消费者标签“闪烁”);
请求行=1;
memcpy(请求默认值和数据,sizeof(请求默认值));
ret=ioctl(fd、GPIO、GET、LINEMHANDLE、ioctl和req);
如果(ret==-1){
fprintf(标准,“未能发出%s(%d),%s\n”,
“GPIO_GET_LINEHANDLE_IOCTL”,ret,strerror(errno));
}
//眨眼
而(1){
//读取数据
ret=ioctl(fd、GPIOHANDLE、GET、LINE、value、ioctl和data);
如果(ret==-1){
ret=-errno;
fprintf(标准,“未能发出%s(%d),%s\n”,
“GPIOHANDLE_GET_LINE_VALUES_IOCTL”,ret,strerror(errno));
出口(ret);
}
//翻转数字
data.values[0]=!data.values[0];
//设置数据
ret=ioctl(fd、GPIOHANDLE\U SET\U LINE\U VALUES\U ioctl和data);
如果(ret==-1){
ret=-errno;
fprintf(标准,“未能发出%s(%d),%s\n”,
“GPIOHANDLE_SET_LINE_VALUES_IOCTL”,ret,strerror(errno));
出口(ret);
}
//耽搁
睡眠(1);
}
}
我可以在RPi上编译gpio hammer示例,并使用
/gpio-hammer-n gpiochip0-o8
运行它。连接到gpiochip0 line8的是一个LED,它会闪烁

但是我的程序不起作用。它失败了

Failed to issue GPIOHANDLE_GET_LINE_VALUES_IOCTL (-22), Invalid argument

我调查了这项计划的实施情况。如果ioctl cmd不是
GPIOHANDLE\u GET\u line\u VALUES\u ioctl
GPIOHANDLE\u SET\u line\u VALUES\u ioctl,则gpio line handle的
ioctl
返回
EINVAL(22)
。但事实并非如此。出了什么问题?

linux/gpio.h
中,struct gpiohandle\u请求的

/*
* ...
*@fd:如果成功,此字段将包含有效的匿名文件句柄
*GPIO\U GET\U LINEMHANDLE\U IOCTL操作后,为零或负值
*意味着错误
*/
结构gpiohandle\u请求{
__u32线偏移量[GPIOU最大值];
__u32旗;
__u8默认_值[GPIOU最大值];
字符消费者标签[32];
__u32线;
int-fd;
};
当使用
GPIO\u GET\u LINEHANDLE\u IOCTL
时,GPIO芯片设备的文件句柄通过
IOCTL()
的第一个参数传递,如果操作成功,另一个文件句柄将在
gpiohandle\u请求::fd
中发回。此新的
fd
应在
GPIO\u GET\u LINE\u VALUES\u ioctl
GPIO\u SET\u LINE\u VALUES\u ioctl的
ioctl
中使用

所以代码应该是

ret=ioctl(fd、GPIO、GET、LINEHANDLE、ioctl和req);
如果(ret==-1){
fprintf(标准,“未能发出%s(%d),%s\n”,
“GPIO_GET_LINEHANDLE_IOCTL”,ret,strerror(errno));
}
否则{
如果(关闭(fd)=-1){
fprintf(stderr,“无法关闭GPIO字符开发。\n”);
}
fd=req.fd;
}

首先,
open()调用的错误检查在哪里?第二,您在哪个迭代中得到了问题?我建议限制迭代次数,并使用for loop to print count进行调试。另外,使用
gpio-hammer
的输出更新帖子。