风火轮科技开发一款rk3588s的主板youyeetoo R1,该主板提供40pin扩展管脚,其中提供7根管脚可作为gpio管脚使用。管脚分布如下图所示:
如果要在Android系统里面使用shell命令,需要通过ADB进入Android的命令行窗口。ADB的使用教程请参考 adb调试 一章。通过adb打开Android系统命令行后,操作gpio需要先把对应gpio设备导出到用户空间。导出时需要用到的编号看下方表格。下面以操作GPIO1_A4
管脚为例。
管脚名 | GPIO编号 |
---|---|
GPIO2_A6 | 70 |
GPIO1_A4 | 36 |
GPIO1_A7 | 39 |
GPIO1_B1_D | 41 |
GPIO1_D5 | 61 |
GPIO0_B0 | 8 |
GPIO0_A0 | 0 |
adb shell setprop persist.sys.root_access 3
adb root
adb remount
adb shell
cat >> /system/bin/setup.sh << EOF
echo 36 > /sys/class/gpio/export
chmod 777 /sys/class/gpio/gpio36/direction
chmod 777 /sys/class/gpio/gpio36/value
EOF
Android系统的权限管理是十分严格的,使用c++或者java操作Android根文件系统里的文件或资源需要对应的权限。这里编写的ndk程序是基于 system app的作为模板进行编写。system app请参考创建system app这一章。
在native-lib.cpp文件编写如下代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <jni.h>
#include <string>
#define DIRECTION "sys/class/gpio/gpio36/direction"
#define VALUE "sys/class/gpio/gpio36/value"
extern "C" JNIEXPORT jstring JNICALL
Java_com_youyeetoo_r1_1gpio_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
int fd_dir;
int fd_val;
char val[2];
fd_dir = open( DIRECTION, O_WRONLY);//打开文件
if (fd_dir < 0) {
return env->NewStringUTF("direction open fail");
}
fd_val = open( VALUE, O_RDONLY);//打开文件
if (fd_val < 0) {
return env->NewStringUTF("value open fail");
}
write(fd_dir, "in", 3);
read(fd_val, val, 1);
close(fd_dir);
close(fd_val);
return env->NewStringUTF(val);
}