-
作为一名萌新,在如何操作gpio端口上,历经千辛万苦,查阅各种资料。
-
首先是根据同样是发布在平头哥开发社区的博文,链接如下
[https://bbs.aw-ol.com/topic/349/模块第一弹-哪吒d1中gpio及pwm使用?_=1660806719873&lang=zh-CN]
本文是文件操作gpio端口,代码易读懂,但是代码量太大了。对有些部分,像是打开文件,进行读写操作的一块进行,可以简化一些,但是要控制多个gpio端口,还要多次复用,实在是不好用。所以在写完小车动起来的程序后,就想着有没有更简单的方式。 -
找到了官方提供的gpio开发指南,利用的是设备树和Pinctrl和gpio子系统操作gpio,花了两天时间终于弄了个大概明白,想上手开始做,发现没找到一个完整的案例,不知如何入手。
-
于是搜搜查查,最后回归了简单的终端操作,将终端操作用命令和shell脚本来操作方便同时操作多个gpio端口。更简单了,但是没学过脚本语言,准备开始学习基本知识的时候,发现了一篇博文,什么都解决了。链接如下(https://blog.csdn.net/weixin_39673471/article/details/110256721?app_version=5.8.1&code=app_1562916241&csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"110256721"%2C"source"%3A"Roselucky"}&uLinkId=usr1mkqgl919blen&utm_source=app)https://blog.csdn.net/weixin_39673471/article/details/110256721?app_version=5.8.1&code=app_1562916241&csdn_share_tail={"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"110256721"%2C"source"%3A"Roselucky"}&uLinkId=usr1mkqgl919blen&utm_source=app
此文里面有一个板块为C语言代码里操作gpio,代码短短几行,用了system()函数来操作echo等,很类似终端操作,但又更方便了。
于是操作gpio变成了这样 -
将大部分操作宏定义
#define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export"
#define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export"
#define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export"
#define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport"
#define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction"
#define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction"
#define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction"
#define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction"
#define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value"
#define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value"
#define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value"
#define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value"
- 一些操作语句,简单明了
void INIT()
{
system(EXPORT_GPIO1);
system(EXPORT_GPIO2);
system(EXPORT_GPIO3);
system(EXPORT_GPIO4);
system(EXPORT_HW1);
system(EXPORT_HW2);
system(EXPORT_HW3);
system(EXPORT_HW4);
system(GPIO1_OUTPUT);
system(GPIO2_OUTPUT);
system(GPIO3_OUTPUT);
system(GPIO4_OUTPUT);
system(HW1_INPUT);
system(HW2_INPUT);
system(HW3_INPUT);
system(HW4_INPUT);
}
void RUN()
{
system(LOWGPIO1);//0
system(HIGHGPIO2);//1
system(HIGHGPIO3);//1
system(LOWGPIO4);//0
}
- 但是由于没有办法system(cat...),得到value的值只能用文件方式来读出,但也将代码简化了很多。
int GETHW(int gpio)
{
char in[3] = {0, 0, 0};
char buf[50];
int nread, gpiofd;
sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio);
gpiofd = open(buf, O_RDWR);
if(gpiofd < 0) {
fprintf(stderr, "Failed to open gpio %d value\n", gpio);
perror("gpio failed");
}
do {
nread = read(gpiofd, in, 1);
} while (nread == 0);
if(nread == -1){
perror("GPIO Read failed");
return -1;
}
close(gpiofd);
return atoi(in);
}
最后希望哪吒开发板也能拥有专门的操作gpio的函数和接口,方便大家使用。