wiringpi 不能用了,控制GPIO有什么为法呢?
发现:gpiod这个库还不错
sudo apt install gpiod libgpiod-dev
安装成功后可以用: gpiodetect gpioinfo命令查看是否安装成功
但我想用原生的树莓派接口来控制于是就下载了gpiod的源码进行查看,最后完成
了树莓派gpio的原生接口开发调试,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/gpio.h>
#include <sys/ioctl.h>
#include <string.h>
typedef enum gpio_pin_enum
{
GPIO_PIN_02 = 2,
GPIO_PIN_03,
GPIO_PIN_04,
GPIO_PIN_05,
GPIO_PIN_06,
GPIO_PIN_07,
GPIO_PIN_08,
GPIO_PIN_09,
GPIO_PIN_10,
GPIO_PIN_11,
GPIO_PIN_12,
GPIO_PIN_13,
GPIO_PIN_14,
GPIO_PIN_15,
GPIO_PIN_16,
GPIO_PIN_17,
GPIO_PIN_18,
GPIO_PIN_19,
GPIO_PIN_20,
GPIO_PIN_21,
GPIO_PIN_22,
GPIO_PIN_23,
GPIO_PIN_24,
GPIO_PIN_25,
GPIO_PIN_26,
GPIO_PIN_27,
}gpio_pin_e;
typedef struct gpio_args_sruct
{
int fd;
struct gpiohandle_data data[27];
struct gpiohandle_request req[27];
}gpio_args_s;
void api_gpio_init(gpio_args_s *args)
{
// 打开设备
args->fd = open("/dev/gpiochip0", O_RDWR | O_CLOEXEC);
}
int api_gpio_set_cfg(gpio_args_s *args, unsigned int pin_num)
{
int ret = 0;
struct gpiohandle_request *req = &(args->req[pin_num]);
if(req->fd <= 0) // 没有设置为资源才进行设置
{
req->lineoffsets[0] = pin_num;
req->flags |= GPIOHANDLE_REQUEST_OUTPUT;
req->lines = 1;
ret = ioctl(args->fd, GPIO_GET_LINEHANDLE_IOCTL, req);
if (ret < 0)
{
perror("set pin dir fled");
return -1;
}
}
}
int api_gpio_set_val(gpio_args_s *args, unsigned int pin_num, int val)
{
int ret = 0;
struct gpiohandle_request *req = &(args->req[pin_num]);
args->data[pin_num].values[0] = val; //设置输出电平
ret = ioctl(req->fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &(args->data[pin_num]));
if (ret < 0)
{
perror("set pin val fled");
return -1;
}
}
void api_gpio_close(int fd)
{
close(fd);
}
#if 0 //测试代码
gpio_args_s g_args;
int main()
{
api_gpio_init(&g_args);
api_gpio_set_cfg(&g_args, GPIO_PIN_02);
api_gpio_set_cfg(&g_args, GPIO_PIN_03);
int val=0;
while (1)
{
val = !val;
api_gpio_set_val(&g_args, GPIO_PIN_02, val);
api_gpio_set_val(&g_args, GPIO_PIN_03, val);
usleep(1000);
}
api_gpio_close(g_args.fd);
return 0;
}
#endif
req->lineoffsets[0] = pin_num;
req->flags |= GPIOHANDLE_REQUEST_OUTPUT;
req->lines = 1;
这个代码块中,req->lineoffsets[0]只能对其第0个原素赋值,req->lines 只能等于1,换成其他的就会报错,不知道为什么
后面再研究吧,目前是能满足输出高底电平了