RS485&232 | J_LED-IR1 | J_GPIO1 | SPK1 | UART1 | ||||||
---|---|---|---|---|---|---|---|---|---|---|
1 | RS485_A1 | 1 | VCC3_IR | 1 | GPIO1 | 1 | L_SPK+ | 1 | UART0_RX_CON | |
2 | RS485_B1 | 2 | IR | 2 | GPIO3 | 2 | L_SPK- | 2 | UART0_TX_CON | |
3 | RS485_A2 | 3 | GND | 3 | GPIO2 | 3 | R_SPK+ | 3 | VCC3_TTL | |
4 | RS485_B2 | 4 | AD | 4 | GPIO4 | 4 | R_SPK- | 4 | GND | |
5 | UART_RX3_232 | 5 | LEDB | 5 | SPI2_MOSI_CN | J_KEY1 | J_RS232 | |||
6 | UART_TX3_232 | 6 | P_LED | 6 | SPI2_MISO_CN | 1 | GND | 1 | UART_RX5_232 | |
7 | UART_RX4_232 | I2C-TP | 7 | SPI2_CLK_CN | 2 | P3V3 | 2 | UART_TX5_232 | ||
8 | UART_TX4_232 | 1 | GND | 8 | SPI2_CS_CN | 3 | POWER_ON_BT | 3 | VCC5_232 | |
9 | GND | 2 | I2C1_SDA_TP_C | 9 | VCC5_GPIO | 4 | Reset | 4 | GND | |
10 | GND | 3 | I2C1_SCL_TP_C | 10 | VCC5_GPIO | 5 | RECOVER_BUTTON | PUSB | ||
debug | 4 | TP_RST_C | 11 | GND | HOST1 | 1 | USB_VCC5 | |||
1 | NC | 5 | TP_INT_C | 12 | GND | 1 | HOST1_VCC5 | 2 | USB_D2N | |
2 | UART2_TX_ | 6 | TP_VDD | 2 | HOST1_D1N_CON | 3 | USB_D2P | |||
3 | UART2_RX | 3 | HOST1_D1P_CON | 4 | GND | |||||
4 | GND | 4 | GND |
COM1_SEL | COM2_SEL | EDP | VDD_JU1 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 3 | RS232 | 1 | 3 | RS232 | 1 | 3 | EDP | 1 | 2 | 3.3V | ||||
2 | 4 | 2 | 4 | 2 | 4 | 3 | 4 | 5V | |||||||
3 | 5 | RS485 | 3 | 5 | RS485 | 3 | 5 | LVDS | 5 | 6 | 12V | ||||
4 | 6 | 4 | 6 | 4 | 6 |
硬件资源规格 | |
---|---|
SOC | Rockchip RK3399 (28纳米HKMG制程) |
CPU | ARM®六核64位处理器,主频高达1.8GHz 基于big.LITTLE大小核架构, 双核Cortex-A72(大核) + 四核Cortex-A53(小核) |
GPU | ARM® Mali-T860 MP4 四核GPU 支持OpenGL ES1.1/2.0/3.0/3.1, OpenVG1.1, OpenCL, DX11 支持AFBC(帧缓冲压缩) |
NPU | |
ISP | |
编解码 | |
内存 | 4GB LPDDR4(2GB/4GB可选配) |
存储 | 16G/32G/64G可选 |
以太网 | 2*1000Mpbs ( 可选 ) |
WIFI | 2.4GHz 单频WiFi / 2.4G/5G 双频 |
视频输出 | 支持eDP. LVDS1080P. HDMI2.0 |
视频输入 | |
音频 | 2*SPK ( 6W 8Ω ) |
SATA | |
USB | 3*USB2.0 1*USB3.0 |
电源 | DC IN 12~24V |
其他 | |
硬件电气特性 | |
高低温环境 | -20℃~60℃ |
静电 | 满足ESD 等级3 ,接触放电6KV,空气放电8KV |
其他 | 满足EFT GB/T 17626.4-2008等级3 |
1、下载烧录工具: 请务必先安装驱动,烧录工具链接含有驱动DriverAssitant压缩包,解压后点击DriverInstall.exe安装驱动
2、开始烧录: 将数据线一端与主板OTG连接,另一端连接电脑。注意烧录前,需关闭电源,开电源时按住boot_key按键进行烧入。
打开压缩包中开发工具 » 升级固件 » 点击固件并选择好固件 » 点升级开始烧录
烧录过程中的状态,会有进度显示
更换系统平台(例如安卓切换到Linux)时,可能出现无法烧录的情况,此时打开开发工具 » 高级功能 » 点击进入Maskrom切换烧录模式后烧录系统
3、完成烧录: 烧录过程不需要任何操作,烧录成功后右框会显示设备自动重启,烧录完成。
1、通过串口进入系统后台,需要利用板子的Debug接口,接口位置和定义如图:
* 接口只需要用到3个引脚,TX、RX、GND 2、需要用到串口小板工具 A部分需要接入TX、RX、GND B部分连接电脑USB口
3、硬件部分连接效果图
4、在电脑的设备管理器→端口 中看有没有串口信息
5、打开Xshell新建一个会话,在连接下选择协议为SERIAL,操作如图:
6、点击串口,端口号为设备管理器看到的串口号,波特率为:1500000
7、最后点击连接,串口进入后台
1. 串口定义参考:
2. 安卓系统串口设备节点对应表:
主板丝印 | 设备节点 |
---|---|
UART0_TTL | /dev/ttyS0 |
RS232_Rx5/Tx5 | /dev/ttyS1 |
RS232_Rx3/Tx3 | /dev/ttyS2 |
RS232_Rx4/Tx4 | /dev/ttyS3 |
RS485_A1/B1 | /dev/ttyS4 |
RS485_A2/B2 | /dev/ttyS5 |
3. ComAssistant 测试串口通讯,以232_Rx5\Tx5回环测试为例
波特率:9600 数据位:8bit 起始位:1bit 校验位:none
4. RS485测试通讯,不支持回环测试,测试方式:
连接扬声器后,可播放音视频,测试左右声道
接好麦克风和一对喇叭后,使用系统内置的录音机APP,录音和播放测试
5.1 插入TF卡至设备TF卡卡槽
5.2 上滑至应用页面 » 文件 » 查看外接TF卡信息
5.3 在系统下拷贝文件至TF卡,进行读写测试
5.4 上滑至应用页面 » 文件 » TF卡挂载名称 » 点击旁边的弹出图标,弹出TF卡
支持在线升级,系统内置升级APP,打开可查看是否有最新系统版本
date MMddHHmmyyyy.ss set(月日时分年.秒) 例如:date 052514192023.00 set
hwclock -w --从系统时间同步到硬件时钟 hwclock -s --从硬件时钟同步到系统时间
cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq //查看cpu频率 cat /sys/class/thermal/thermal_zone0/temp //查看CPU当前温度
free -h
df -h
lsusb
NodkaAPI入口类
NodkaAPI使用方法:
1、在Application的onCreate中创建NodkaAPI实例
mNodkaAPI = NodkaAPI.nodkaAPICreate(this);
2、在Activity或Fragment中使用API步驟:
private NodkaAPI mNodkaAPI = APIApplication.getApplication().getNodkaAPI();
NodkaAPI接口说明:
1、以devinfo开头的是硬件及系统信息查询类api
2、以display开头的是显示控制类api
3、以gpio开头的是GPIO控制类api
4、以uart开头的是串口控制类api
5、以sysctrl开头的是系统控制类api,包括定时开关机
接口类别 | 方法名 | 方法说明 |
---|---|---|
硬件及系统信息查询类 | devinfo_getAndroidVersion() | 获取Android系统版本信息 |
devinfo_getAvailMem() | 获取可用内存容量 | |
devinfo_getBuildNumber() | 获取系统版本号信息 | |
devinfo_getCpuCores() | 获取cpu核心数 | |
devinfo_getCPUCurFreqKHz() | 获取cpu当前运行主频 | |
devinfo_getCPUMaxFreqKHz() | 获取cpu最大主频 | |
devinfo_getCPUMinFreqKHz() | 获取cpu最小主频 | |
devinfo_getCPUTemp() | 获取cpu温度 | |
devinfo_getDeviceModel() | 获取设备型号信息 | |
devinfo_getKernelVersion() | 获取内核版本信息 | |
devinfo_getSerialNum() | 获取设备SN号 | |
devinfo_getStorageAvailableSize() | 获取本机可用存储容量 | |
devinfo_getStorageTotalSize() | 获取本机存储容量(不包括系统分区) | |
devinfo_getTotalMem() | 获取内存总容量 | |
显示控制类 | display_getNavBar() | 获取是否显示导航栏跟状态栏 |
display_getScreenBrightness() | 获取屏幕亮度 | |
display_getScreenRotation() | 获取屏幕旋转方向 | |
display_getWindowHeight() | 获取屏幕分辨率高度 | |
display_getWindowWidth() | 获取屏幕分辨率宽度 | |
display_setNavBar(Boolean enable) | 设置是否显示导航栏跟状态栏 | |
display_setNavBarSlideShow(Boolean enable) | 设置滑动是否会显示导航栏跟状态栏 | |
display_setScreenBrightness(int screenBrightness) | 设置屏幕亮度 | |
display_setScreenRotation(int rotation) | 设置屏幕旋转方向 | |
GPIO控制类 | gpio_direction(int gpioNumber, String direction) | 设置GPIO的方向(输入输出),对指定的gpio号进行设置 |
gpio_export(int gpioNumber) | 导出控制的GPIO引脚,对指定的gpio号进行导出 | |
gpio_read(int gpioNumber) | 读取GPIO的输出电平值,对指定的gpio号进行读取 | |
gpio_unExport(int gpioNumber) | 取消导出控制的GPIO引脚,对指定的gpio号进行取消导出 | |
gpio_write(int gpioNumber, int value) | 设置GPIO的输出电平,对指定的gpio号进行设置 | |
串口控制类 | uart_close(String uartNode) | 关闭uart设备,如/dev/ttyXRUSB2 |
List<String> uart_getAvailableDevices() | 获取uart可用的设备节点 | |
uart_IsOpen(String uartNode) | uart设备是否已经打开,如/dev/ttyXRUSB2 | |
uart_open(String uartNode, int baudrate) | 打开uart设备,如/dev/ttyXRUSB2 | |
uart_receive(String uartNode, UartReceiveDataCallback callback) | 接收串口数据,如从/dev/ttyXRUSB2接收数据 | |
uart_send(String uartNode, byte[] buffer) | 发送串口数据,如向/dev/ttyXRUSB2发送数据 | |
uart_stopReceive(String uartNode) | 停止接收数据,调用后,不再有数据回调 | |
系统控制类 | sysctrl_cancelReboot() | 取消重启设备 |
sysctrl_cancelShutdown() | 取消自动关机 | |
sysctrl_powerOn(String time, boolean repeat) | 设置设备开机时间 | |
sysctrl_reboot(String time, boolean repeat) | 设置重启设备时间 | |
sysctrl_rebootNow() | 立即重启设备 | |
sysctrl_shutdown(String time, boolean repeat) | 设置设备关机时间 | |
sysctrl_shutdownNow() | 立即关机 | |
sysctrl_installApk(String apkPath) | 静默安装应用 |
1. IO 控制节点都在/sys/class/gpio/
2. IO 对应表如下:
功能 | 主板丝印 |
---|---|
输入\输出 | GPIO1 |
GPIO2 | |
GPIO3 | |
GPIO4 |
3. IO控制方法:
echo 0 >/sys/class/gpio/gpio56/value
*输出高电平:
echo 1 >/sys/class/gpio/gpio56/value
*查看输入电平:
cat /sys/class/gpio/gpio56/value
1. 串口定义参考:
2. 串口设备节点系统对应表:
主板丝印 | 设备节点 |
---|---|
232_RX5\TX5 | /dev/ttyS7 |
UART0_TTL | /dev/ttyS0 |
232_RX3\TX3 | /dev/ttyS5 |
232_RX4\TX4 | /dev/ttyS9 |
RS485_A1\B1 | /dev/ttyS3 |
RS485_A2\B2 | /dev/ttyS4 |
3. CuTecom 测试串口,以232_RX5\TX5回环测试为例
4. 命令行方式测试串口,同样以UART_RX5\TX5_232回环测试为例
打开终端输入如下指令接收数据:
com_recv /dev/ttyS7 115200
打开另一个终端发送数据:
com_send /dev/ttyS7 115200
测试结果如下:
1. IO 控制节点都在/sys/class/gpio/
2. IO 对应表如下:
功能 | 主板丝印 |
---|---|
输入\输出 | GPIO1 |
GPIO2 | |
GPIO3 | |
GPIO4 |
3. IO控制方法:
echo 0 >/sys/class/gpio/gpio56/value
*输出高电平:
echo 1 >/sys/class/gpio/gpio56/value
*查看输入电平:
cat /sys/class/gpio/gpio56/value
1.导出节点(编号为56、57、58、59)
$:echo 56 >/sys/class/gpio/export 也可以使用for循环一次性导出所有IO节点: $:cd /sys/class/gpio $:for i in {56,57,58,59}; do echo $i >export; done
2. IO 控制节点在目录:/sys/class/gpio/
3. IO 对应表如下:
功能 | 主板丝印 | 节点编号 |
---|---|---|
输入\输出 | J_GPIO1 | gpio56 |
J_GPIO2 | gpio57 | |
J_GPIO3 | gpio58 | |
J_GPIO4 | gpio59 |
4. IO控制方法:
echo out >/sys/class/gpio/gpio56/direction
echo 0 >/sys/class/gpio/gpio56/value
echo 1 >/sys/class/gpio/gpio56/value
cat /sys/class/gpio/gpio56/value
0 对应高电平 1.8V 1 对应低电平 0V
1. 输入命令evtest 查看系统下所有按键、输入设备:
root@rk3568:~# evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: rk805 pwrkey /dev/input/event1: Lenovo Precision USB Mouse /dev/input/event2: HID 04f3:0103 /dev/input/event3: HID 04f3:0103 Consumer Control /dev/input/event4: HID 04f3:0103 System Control /dev/input/event5: adc-keys /dev/input/event6: rk-headset Select the device event number [0-6]:
2. 按照上面提示选择测试按键,如RK3568 boot按键为 /dev/input/event5: adc-keys
则event number 为 5:按下按键会打印value 1,松开按键则会打印value 0,如下图:
3. 自定义按键功能,配置文件为:
/etc/triggerhappy/triggers.d/example.conf
如下,定义按键为reboot功能,也是系统默认配置,用户可以根据需要自定义
KEY_VOLUMEUP 1 reboot
1. HDMI
系统默认支持HDMI显示,默认分辨率 1920 * 1080,设置屏幕分辨率:终端输入命令:dis ,调出设置屏参界面,点击保存
2. eDP
a) 如图,开发板断电状态下接好eDP屏数据线和背光线,支持USB触控屏线,注意跳线帽短接位置 ,背光电压和数据线电压是根据屏参确定的,这里以12V背光和3.3V数据线为例
b) 默认 eDP屏分辨率:1920 * 1080,支持eDP + HDMI 复制双显,支持12.5“1366 * 768, 12.5”1920 * 1080, 13.3“1920 * 1080, 15.6”1920 * 1080
注意:如果上电后屏幕不亮,需要在HDMI上调整 eDP 屏幕对应的分辨率
c) 设置屏幕分辨率:终端输入命令:dis ,调出设置屏参界面
3. LVDS
a) 如图,开发板断电状态下接好 LVDS屏数据线和背光线,支持USB触控屏线,注意跳线帽短接位置 ,背光电压和数据线电压是根据屏参确定的,这里以12V背光和3.3V数据线为例
b) 默认 LVDS屏分辨率:1920 * 1080,支持LVDS + HDMI 复制双显,支持12.5“1366 * 768, 12.5”1920 * 1080, 13.3“1920 * 1080, 15.6”1920 * 1080
注意:如果上电后屏幕不亮,需要在HDMI上调整LVDS屏幕对应的分辨率
c) 设置屏幕分辨率:终端输入命令:dis ,调出设置屏参界面
4. MiPi
a) 如图,开发板断电状态下接好MiPi屏线
b) MiPi屏分辨率:800 * 1280,支持 10.1“800 * 1280
c) 设置屏幕分辨率:终端输入命令:dis ,调出设置屏参界面,进入屏参切换界面,选择选择10.1_mipi_1280x800,点击保存,等待系统自动重启生效
5. 系统支持使用APP切换不同的LCD屏,输入dis命令打开APP如下图:
6. 背光亮度调节:
echo 100 > /sys/class/backlight/backlight1/brightness
(注:写入数值越大亮度越大,max_brightness 为255)
1.查看当前系统时间:
[root@rk3399:~]# date Wed Jun 8 15:54:09 CST 2022
2. 设置同步硬件时钟:
[root@rk3399:/]# date -s "2022-06-08 17:01:01" Wed Jun 8 17:01:01 CST 2022 [root@rk3399:/]# hwclock -w [root@rk3399:/]# hwclock -r Wed Jun 8 17:01:09 2022 0.000000 seconds
3. 关机断电5秒以上,再开机查看系统时间是否保存:
[root@rk3399:/]# date Wed Jun 8 17:02:30 CST 2022
注:系统默认为网络时间同步,以上RTC测试需要在断外网情况下测试。
4. 时区设置
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime reboot
设置其他时区只需将上面命令中的Asia/Shanghai改为对应的时区城市即可。
选择完成后关闭窗口,使用date命令查看时区变化:
C参考代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> static char gpio_path[100]; static int gpio_config(const char *attr, const char *val) { char file_path[100]; int len; int fd; sprintf(file_path, "%s/%s", gpio_path, attr); if (0 > (fd = open(file_path, O_WRONLY))) { perror("open error"); return fd; } len = strlen(val); if (len != write(fd, val, len)) { perror("write error"); close(fd); return -1; } close(fd); //关闭文件 return 0; } int main(int argc, char *argv[]) { char file_path[100]; char val; int fd; /* 校验传参 */ if (2 != argc) { fprintf(stderr, "usage: %s <gpio>\n", argv[0]); exit(-1); } /* 判断指定编号的 GPIO 是否导出 */ sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]); if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出 int len; if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) { perror("open error"); exit(-1); } len = strlen(argv[1]); if (len != write(fd, argv[1], len)) {//导出 gpio perror("write error"); close(fd); exit(-1); } close(fd); //关闭文件 } /* 配置为输入模式 */ if (gpio_config("direction", "in")) exit(-1); /* 极性设置 */ if (gpio_config("active_low", "0")) exit(-1); /* 配置为非中断方式 */ if (gpio_config("edge", "none")) exit(-1); /* 读取 GPIO 电平状态 */ sprintf(file_path, "%s/%s", gpio_path, "value"); if (0 > (fd = open(file_path, O_RDONLY))) { perror("open error"); exit(-1); } if (0 > read(fd, &val, 1)) { perror("read error"); close(fd); exit(-1); } printf("value: %c\n", val); /* 退出程序 */ close(fd); exit(0); }
交叉编译源码:
aarch64-linux-gnu-gcc -o gpio gpio.c
将编译好的gpio程序使用scp拷贝到 r36s0 主板上,执行测试:
使用方法:
0:./gpio 3
1:./gpio 1
系统下操作 UART 的测试串口,以 232_RX5\TX5 测试为例:
232_RX5\TX5 设备节点为:
/dev/ttyS7
C参考UART高低电平输入代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <errno.h> int set_opt(int,int,int,char,int); void main(){ int fd,nByte; char *uart3 = "/dev/ttyS2"; char bufferR[2]; char bufferW[2]; memset(bufferR, '\0', 2); memset(bufferW, '\0', 2); if((fd=open(uart3,O_RDWR,0777))<0) { printf("failed\n"); } else{ printf("success\n"); set_opt(fd, 115200, 8, 'N', 1); } while(1){ nByte = 0; memset(bufferR, '\0', 2); memset(bufferW, '\0', 2); // printf("hello\n"); if((nByte = read(fd, bufferR, 1)) == 1){ //MCU串口发送接收都是单字节(单字符)函数 printf("receive:%c\n",bufferR[0]); bufferW[0] = 'A'; write(fd,bufferW,1); //串口发送单字节(单字符) buffer[0] = data memset(bufferR, '\0', 2); memset(bufferW, '\0', 2); nByte = 0; } } close(fd); } //串口通用初始化函数 int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop) { struct termios newtio,oldtio;//定义结构体newtio和oldtio //将原串口的数据取到oldtio if ( tcgetattr( fd,&oldtio) != 0) { perror("SetupSerial 1"); return -1; } //将newio清零和设置c_cflag bzero( &newtio, sizeof( newtio ) ); newtio.c_cflag |= CLOCAL | CREAD;//使能接收和忽略控制线 newtio.c_cflag &= ~CSIZE; //设置数据位 switch( nBits ) { case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } //设置校验位 switch( nEvent ) { //偶校验 case 'O': newtio.c_cflag |= PARENB;//使能奇偶校验 newtio.c_cflag |= PARODD;//偶校验 newtio.c_iflag |= (INPCK | ISTRIP);//输入校验并忽略第八位 break; case 'E': newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD;//取消偶校验(置零偶校验位),开启奇校验 break; case 'N': newtio.c_cflag &= ~PARENB;//不进行奇偶校验 break; } //设置波特率 switch( nSpeed ) { case 2400: cfsetispeed(&newtio, B2400); cfsetospeed(&newtio, B2400); break; case 4800: cfsetispeed(&newtio, B4800); cfsetospeed(&newtio, B4800); break; case 9600: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; case 115200: cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); break; case 460800: cfsetispeed(&newtio, B460800); cfsetospeed(&newtio, B460800); break; default: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; } //设置停止位 if( nStop == 1 ) newtio.c_cflag &= ~CSTOPB;//一位停止位 else if ( nStop == 2 ) newtio.c_cflag |= CSTOPB;//两位停止位 newtio.c_cc[VTIME] = 0;//不设置读取超时 newtio.c_cc[VMIN] = 0;//读取最小字符数为0 tcflush(fd,TCIFLUSH);//清空缓冲区 //使配置生效 if((tcsetattr(fd,TCSANOW,&newtio))!=0) { perror("com set error"); return -1; } // printf("set done!\n\r"); return 0; }
交叉编译源码:
aarch64-linux-gnu-gcc -o uart uart.c
将编译好的程序使用 scp 拷贝到 r36s0 主板上,执行测试:
参考系统下操作Key的方法,获取到key的设备节点为
/dev/input/event2
C参考代码如下:
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <linux/input.h> #include <sys/select.h> #define INPUT_DEVICE "/dev/input/event2" int main(int argc, char **argv){ int fd; struct input_event event; ssize_t bytesRead; int ret; fd_set readfds; if ( 0 > (fd = open(INPUT_DEVICE,O_RDONLY))) { perror("open error"); return fd; } while(1){ FD_ZERO(&readfds); FD_SET(fd,&readfds); ret = select(fd + 1, &readfds, NULL, NULL, NULL); if (ret == -1){ fprintf(stderr,"select call on%s : an error ocurred",argv[1]); break; } if(FD_ISSET(fd,&readfds)){ bytesRead = read(fd, &event,sizeof(struct input_event)); if(bytesRead == -1 ) fprintf(stderr,"bytesRead :%ld : an error ocurred",bytesRead); } if(event.type == EV_KEY && (event.value == 0 || event.value == 1)) { printf("key %s\n",(event.value) ? "pressed" : "released"); } } close(fd); return EXIT_SUCCESS; }
交叉编译源码:
aarch64-linux-gnu-gcc -o key key.c
将编译好的程序使用 scp 拷贝到 r36e0 主板上,执行测试,按动 key 打印如下: