本人【Luckfox幸狐 RV1106 Linux 开发板测评】帖子链接:
本篇依然参考Luckfox Wiki之GPIO完成:
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO/
主要测评工作是控制板上GPIO1_C7_d进行LED点灯操作,IO编号55。IO编号算法:pin = bank * 32 + (group * 8 + X)。
以GPIO1_C7_d为例,bank是1(对应GPIO1中的1),group是C即2(A=0,B=1,C=2,D=3),X是7(对应C7中的7)。
利用面包板、LED灯珠、电阻(1K)、杜邦线两根(公对母)完成本次实验的硬件准备工作。
图3-1 Luckfox Pico Max引脚图及连线照片
软件准备工作则包括:Virtual Box+Ubuntu20.04虚拟机(已经clone了Luckfox SDK)作为程序开发、本机使用VS Code + Remote-SSH插件作为IDE、本机使用ADB向开发板发送编译后的程序文件。
图3-2 GPIO开发软件相关准备工作
编程前先验证GPIO的有效性,利用echo命令控制IO,相关方法请查看文档,具体命令如下图所示:
图3-3 echo命令控制55号IO
接着验证C程序控制IO55,在Ubuntu20.04虚拟机中SDK目录创建“CLan/00led/led.c”作为源文件,相关代码也是从文档拷贝的,这里加了个人理解的注释。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int gpio_pin;
printf("请输入GPIO引脚号:");
scanf("%d", &gpio_pin);
// 打开GPIO引脚配置文件,用于设置引脚为输出模式
// 即导出GPIO55到用户空间
FILE *export_file = fopen("/sys/class/gpio/export", "w");
if (export_file == NULL) {
perror("无法打开GPIO引脚配置文件");
return -1;
}
// 文件中写入55,相当于命名:echo 55 > /sys/class/gpio/export
fprintf(export_file, "%d", gpio_pin);
fclose(export_file);
// 组合出设置IO方向的文件路径字符串
char direction_path[50];
snprintf(direction_path, sizeof(direction_path), "/sys/class/gpio/gpio%d/direction", gpio_pin);
// 打开GPIO方向配置文件,设置引脚为输出模式
FILE *direction_file = fopen(direction_path, "w");
if (direction_file == NULL) {
perror("无法打开GPIO方向配置文件");
return -1;
}
// 文件中写入out,相当于命令:echo out > /sys/class/gpio/gpio55/direction
fprintf(direction_file, "out");
fclose(direction_file);
char value_path[50];
char cat_command[100];
snprintf(value_path, sizeof(value_path), "/sys/class/gpio/gpio%d/value", gpio_pin);
snprintf(cat_command, sizeof(cat_command), "cat %s", value_path);
// 打开GPIO值配置文件,用于设置引脚输出值
FILE *value_file = fopen(value_path, "w");
if (value_file == NULL) {
perror("无法打开GPIO值配置文件");
return -1;
}
for (int i = 0; i < 3; i++) {
// 设置引脚输出值为1,并将值写入到配置文件中并立即刷新缓冲区,使值立即生效。
fprintf(value_file, "1");
fflush(value_file);
// 使用系统命令读取引脚当前的值,并显示在终端上。此命令实际上是为了确认引脚值是否改变。
system(cat_command);
sleep(1); // 等待1秒。
// 设置引脚输出值为0,并将值写入到配置文件中并立即刷新缓冲区。
fprintf(value_file, "0");
fflush(value_file);
// 再次使用系统命令读取并显示引脚当前的值。这是为了确认引脚值是否再次改变。
system(cat_command);
sleep(1); // 再次等待1秒。
}
fclose(value_file); // 关闭GPIO值配置文件。
FILE *unexport_file = fopen("/sys/class/gpio/unexport", "w"); // 打开GPIO引脚反配置文件,用于取消配置引脚。
if (unexport_file == NULL) { // 如果无法打开该文件,则打印错误信息。
perror("无法打开GPIO反配置文件"); // 打印错误信息。
return -1; // 返回错误代码。
}
fprintf(unexport_file, "%d", gpio_pin); // 将引脚号写入到反配置文件中。
fclose(unexport_file); // 关闭反配置文件。
return 0; // 返回0表示程序执行成功。
}
程序编写好就是进行编译构建了,文档上给的方法是用export把gcc路径添加到环境变量中,本人图省事,直接敲入gcc的完整路径实现。相关命令:
# 源文件led.c,编译后程序led
~/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc led.c -o led
图3-4 文档添加gcc到环境变量的页面截图
图3-5 完整路径运行gcc编译
最后,就是将程序led发送到开发板并运行,可以使用adb push命令。当然,前提是先从虚拟机拷贝文件到本机Win10系统,因为板子是通过RNDIS连接到本机的,虚拟机上访问不到开发板。开发使用了VS Code + Remote-SSH,支持下载远端文件(即虚拟机)到本地,也支持本地文件拖拽并上传到远端。在本机D盘新建Luckfox目录,放置板子的应用程序,然后拷贝编译好的led文件过来。
图3-6 利用VS Code下载虚拟机文件到本地系统
图3-7 利用VS Code下载虚拟机文件到本地系统
上图即利用adb push命令将程序文件led发送到Buildroot系统的/app目录下(自建目录,用来放置自建测试程序)。然后利用adb shell登录开发板控制台,并chmod修改led的权限——赋予执行权限,然后就是./led执行程序。注:上述adb命令都添加“-s”参数指定ADB连接的设备串号,开发板串号通过adb devices获取,有不明白的小伙伴可以参考本人第一篇:开箱及测试。