我正在模仿Linux源代码中的gpio-hammer示例。我正在使用Raspberry Pi 3B +,希望LED闪烁。
这就是我要做的:
#include <linux/gpio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
int main(int argc,const char **argv) {
int fd,ret;
struct gpiohandle_request req;
struct gpiohandle_data data;
char *gpio_dev_name = "/dev/gpiochip0";
unsigned int gpio_line = 8;
memset(&data.values,sizeof(data.values));
// open device
fd = open(gpio_dev_name,0);
if (fd == -1) {
fprintf(stderr,"Failed to open %s,%s\n",gpio_dev_name,strerror(errno));
}
// request gpio output
req.lineoffsets[0] = gpio_line;
req.flags = GPIOHANDLE_REQUEST_OUTPUT | GPIOHANDLE_REQUEST_actIVE_LOW;
strcpy(req.consumer_label,"blink");
req.lines = 1;
memcpy(req.default_values,&data,sizeof(req.default_values));
ret = ioctl(fd,GPIO_GET_LINEHANDLE_IOCTL,&req);
if (ret == -1) {
fprintf(stderr,"Failed to issue %s (%d),"GPIO_GET_LINEHANDLE_IOCTL",ret,strerror(errno));
}
// blink
while (1) {
// read data
ret = ioctl(fd,GPIOHANDLE_GET_LINE_VALUES_IOCTL,&data);
if (ret == -1) {
ret = -errno;
fprintf(stderr,"GPIOHANDLE_GET_LINE_VALUES_IOCTL",strerror(errno));
exit(ret);
}
// flip digits
data.values[0] = !data.values[0];
// set data
ret = ioctl(fd,GPIOHANDLE_SET_LINE_VALUES_IOCTL,"GPIOHANDLE_SET_LINE_VALUES_IOCTL",strerror(errno));
exit(ret);
}
// delay
sleep(1);
}
}
我可以在RPi上编译gpio-hammer示例,并使用./gpio-hammer -n gpiochip0 -o 8
运行它。连接到gpiochip0 line8的LED指示灯闪烁。
但是我的程序不起作用。失败
Failed to issue GPIOHANDLE_GET_LINE_VALUES_IOCTL (-22),Invalid argument
我研究了gpiolib的实现。如果ioctl cmd不是ioctl
也不是EINVAL (22)
,则gpio线句柄的GPIOHANDLE_GET_LINE_VALUES_IOCTL
返回GPIOHANDLE_SET_LINE_VALUES_IOCTL
。但是事实并非如此。怎么了?