~~NOCACHE~~ ~~NOTOC~~
产品系列:sTPC-EXXX-3568B(E101 / E121 / E150 / E156 / E170 / E215) · 瑞芯微 RK3568 · 10.1″ ~ 21.5″ 无风扇 ARM 触控一体机(PANEL PC)
# 打包整包镜像
./build.sh updateimg
ls -lh rockdev/update.img
U 盘要求:FAT32 格式,可用容量 ≥ 4GB(建议 ≤ 32GB),update.img 放在根目录且文件名不变。
=== 3.4.2 U盘本地升级 ===
- 把 update.img 拷到 U 盘根目录
- 把 U 盘插入整机的 USB 口(USB3.0 / USB2.0 任意一口均可)
- 系统识别到升级包后按弹窗提示确认,升级过程中保持供电,完成后整机自动重启
**提示:**插入 U 盘后无升级提示时,先确认文件名与 U 盘格式,再重启整机重试;Android 联网升级见 4.13。
===== 4 Android系统的使用 =====
本章**只针对 Android 系统**(Android 11)。Linux(Ubuntu / Debian)下的同名功能集中在第 5 章,两章界面、工具、命令均不混用;Android 应用层的接口调用统一见 4.12。
==== 4.1 开启ADB调试 ====
=== 4.1.1 USB ADB使用方法 ====
- 使用 USB 数据线连接整机 **USB3.0/OTG 口**(下排蓝色口)与电脑
- 「设置 → 关于平板电脑」,连续点击「版本号」7 次开启开发者选项
- 进入「开发者选项」,打开「USB 调试」
- 电脑端执行 adb devices,首次连接需在整机弹窗点击「允许」
adb devices
# List of devices attached
# 0123456789ABCDEF device
=== 4.1.2 网络ADB使用方法 ====
整机与电脑同网段时,可无线调试,无需数据线。
adb connect 192.168.8.55:5555
adb devices
==== 4.2 WiFi使用方法 ====
- 「设置 → 网络和互联网 → WLAN」,打开开关
- 选择目标热点并输入密码(板载 2.4G/5G 双频,802.11 a/b/g/n/ac)
- 连接成功后可在「网络详情」中查看 IP 地址
- 信号弱时可调整背部 **Wi-Fi/BT** SMA 天线角度,或改用吸盘天线
adb shell dumpsys wifi | grep -i "curState"
adb shell ifconfig wlan0
==== 4.3 以太网使用方法 ====
整机为单网口(LAN,千兆自适应),Android 下设备名为 **eth0**。以下命令均在 adb shell 中执行,修改配置需 su 权限。
**查看设备**
ip link show
**使用(动态 IP)**
su
ifconfig eth0 up
ifconfig eth0 dhcp # 部分固件需改用 dhcpcd eth0
**使用(静态 IP)**
su
ifconfig eth0 down
ifconfig eth0 192.168.8.55 netmask 255.255.255.0
ifconfig eth0 up
**测试**
ping -c 4 192.168.8.1
**提示:**静态 IP 需开机自动生效时,在系统内配置 eth0 静态地址,或应用层通过 ConnectivityManager 设置以太网静态 IP。
==== 4.4 4G模块使用方法 ====
整机 4G 采用 Quectel EG800AK-C 模组(插装于 6A12-J 载板),系统上电后自动拨号,无需手工配置。
=== 4.4.1 支持列表 ====
整机仅支持下表所列 4G 模组,USB ID 用于在板端 lsusb 输出中确认模组是否已被识别:
^ 模组型号 ^ 制式 ^ USB ID ^
| Quectel EG800AK-C | LTE 4G | 2c7c:6002 |
=== 4.4.2 步骤 ====
**4G 模组**
- 接上 4G 天线,SIM 卡缺口朝外插入卡座(芯片面朝板)
- 上电后在「设置 → 网络和互联网 → 移动网络」中确认已识别 SIM 卡
- 打开移动数据,状态栏出现 4G 图标即可上网
adb shell lsusb
# Bus 002 Device 002: ID 2c7c:6002 Quectel Wireless Solutions Co., Ltd. EG800AK-C
**查看信号与网络注册(AT 命令)**
模组 AT 口一般为 /dev/ttyUSB2,需 root 权限:
echo -e "AT+CPIN?\r\n" > /dev/ttyUSB2 # SIM 卡是否插好
echo -e "AT+CSQ\r\n" > /dev/ttyUSB2 # 信号强度,0~99 为正常
echo -e "AT+COPS?\r\n" > /dev/ttyUSB2 # 是否注册到运营商网络
echo -e "AT+CGREG?\r\n" > /dev/ttyUSB2 # 数据网络是否就绪
**提示:**SIM 卡需在**断电状态**下插拔,热插拔可能导致模组不识别,需重新上电。
==== 4.5 串口使用方法 ====
整机提供 2 路 RS485 与 2 路 RS232,Android 下节点与端子定义如下(最终以背部丝印为准):
^ 接口 ^ 设备节点 ^ 引脚定义 ^
| RS485-1 | /dev/ttyS1 | A1 / B1 / G1 |
| RS485-2 | /dev/ttyS3 | A3 / B3 / G3 |
| RS232-1 | /dev/ttyS2 | R2 / T2 / G2 |
| RS232-2 | /dev/ttyS4 | R4 / T4 / G4 |
=== 4.5.1 测试工具 ComAssistant ====
Android 下串口测试统一使用 **ComAssistant**(串口助手 App):
- 安装并打开 ComAssistant,首次运行授予存储与串口设备权限
- 在设备列表中选择目标节点:RS485 选 /dev/ttyS1 或 /dev/ttyS3,RS232 选 /dev/ttyS2 或 /dev/ttyS4
- 设置参数 115200、8 位数据、1 位停止、无校验(8N1)
- 点击「打开串口」,在发送区输入内容后点「发送」;回环或对发时可同时观察接收区
**提示:**ComAssistant 需要 Root 权限访问 /dev/ttyS*;打开失败时先在 adb shell 中执行 su 与 ls -l /dev/ttyS* 确认节点权限。
=== 4.5.2 测试方式 ====
- RS232 回环:跳帽短接同一 232 节点的 R 与 T
- RS232 — RS232 对发:交叉接线(R↔T,GND 共地)
- RS232 — RS485 对发:经 232 转 485 模块
- RS232 — RS232 转 USB — PC 端串口助手
- RS485 — RS485 转 USB — PC 端串口助手
- RS485 回环:短接 A 与 B
**注意事项**
- 整机为 3.5mm 3P 可插拔端子(无 DB9),配压接端子或转接线使用;不同厂商的转接线线序可能不同,A / B 或 R / T 反接会直接导致通信失败
- RS485 为半双工,方向由硬件自动切换,收发切换时注意帧间隔
=== 4.5.3 应用层调用 ====
应用内不要直接用 shell 打开节点,使用 NodkaAPI 的 uart_ 接口(见 4.12.5):
NodkaAPI api = NodkaAPI.nodkaAPICreate(context);
api.uart_open("/dev/ttyS2", 115200);
api.uart_send("/dev/ttyS2", "hello".getBytes());
api.uart_receive("/dev/ttyS2", new UartReceiveDataCallback() {
@Override
public void onReceiveData(byte[] data) {
// 处理收到的数据
}
});
api.uart_close("/dev/ttyS2");
==== 4.6 USB与SD卡 ====
整机提供 2 × USB3.0(下排为 OTG 复用)与 2 × USB2.0,另支持 SD 卡。
**U 盘**
- 插入 U 盘,文件管理器左侧出现「USB 存储设备」
- 进入后能浏览 U 盘内容即识别正常
- 拔出前先在「设置 → 存储」中卸载,避免数据损坏
adb shell ls /storage # 可见 udisk0 或 91A3-2B1C 形式的挂载点
adb shell lsusb
**SD 卡**
adb shell ls /storage # 可见 xxxx-xxxx 形式的 SD 卡挂载点
adb shell dumpsys mount | grep -i mmc
**提示:**OTG 口在 Device 模式(烧录 / ADB)下不能同时作为 Host 使用;插 U 盘前请确认系统已退出烧录模式。Linux 下的手工挂载方法见 5.5。
==== 4.7 音频测试 ====
整机音频由 **SPK(PH2.0-4P,8Ω 6W)** 输出、**MIC(Ø3.5)** 输入,无内置喇叭时需外接。
**喇叭输出测试**
- 8Ω 喇叭接 SPK 端子(L+ / L- / R+ / R-)
- 打开系统自带「音乐」播放器播放测试音频,按音量键确认音量可调、左右声道正常
- 测试文件位于 /nodka_test/LR_audio.wav,可用「文件」App 直接播放
**麦克风录音测试**
- 插入 Ø3.5 麦克风或使用板载 MIC
- 打开系统自带「录音机」App,录制约 5 秒后回放,确认清晰无杂音
**查看音频通路**
adb shell dumpsys media.audio_flinger | grep -i "Output thread"
adb shell getprop | grep -i audio
**提示:**无声音时先确认 SPK 端子 L+ / L- / R+ / R- 与喇叭线序一致,再用 adb shell tinymix 检查功放通路是否打开。Linux 下用 aplay / arecord,见 5.1。
==== 4.8 HDMI与双屏显示 ====
整机支持内部屏 + HDMI 同时输出,HDMI 最高 3840 × 2160。
**设置 HDMI 输出**
- 接入 HDMI 显示器,进入「设置 → 显示 → HDMI」
- 选择分辨率与刷新率(推荐 1920 × 1080 @ 60Hz),确认画面稳定无闪烁
- 选择显示模式:同显(镜像)或异显(扩展)
^ 模式 ^ 说明 ^
| 同显(镜像) | 内部屏与 HDMI 显示相同画面,分辨率取二者较小值 |
| 异显(扩展) | 两屏独立画面,应用侧需指定 DisplayId |
**命令行查看**
adb shell wm size
adb shell wm density
adb shell dumpsys display | grep -i "mDisplayId"
**提示:**应用内可用 display_setScreenRotation / display_setScreenBrightness 等接口控制显示(见 4.12.3)。Linux 下用 xrandr 或 weston.ini,见 5.6。
==== 4.9 按键与指示灯测试 ====
^ 项目 ^ 位置 ^ 现象 / 操作 ^ 判定 ^
| PWR 指示灯 | 接口区左侧 | 接入 DC 12V 后绿色常亮 | 灯亮即电源正常 |
| SYS 指示灯 | PWR 右侧 | 系统启动完成后蓝色常亮 | 灯亮即系统运行 |
| Recover | 指示灯右侧针孔 | 断电按住 + 上电 2 秒后松开 | RKDevTool 识别到 LOADER 设备 |
| Return | Recover 右侧 | 按下返回上一级;长按上电 3s 进入烧录模式 | 界面返回 / 进入 Loader |
**Return 按键测试(getevent)**
adb shell getevent -l
# /dev/input/event2: EV_KEY KEY_BACK DOWN
# /dev/input/event2: EV_SYN SYN_REPORT 00000000
# /dev/input/event2: EV_KEY KEY_BACK UP
按下 Return 出现 DOWN,松开出现 UP,即按键与驱动正常。
**Return 按键:进入烧录模式**
长按 Return 按键不放,上电 3 秒后松开即可进入烧录模式,无需使用 Recover 针孔。
**Recover 快速自检**
断电按住 Recover 针孔再上电,RKDevTool 中出现 LOADER 设备即正常(烧录步骤见 3.3)。
**提示:**Recover 为针孔结构,请使用直径 ≤ 1.5mm 的针状物,避免损伤内部轻触开关。
==== 4.10 触摸屏测试 ====
整机为多点电容触摸屏,控制器经 USB 接入系统。
**查看触摸设备**
adb shell getevent -pl /dev/input/event*
adb shell dumpsys input | grep -i -A2 "touch"
**划线与多点检测**
- 「设置 → 开发者选项 → 指针位置」,手指滑动可看到 X / Y 坐标与轨迹
- 用五指同时按住屏幕,观察是否同时上报多个触点(多点触控)
- 四角与中心各点按一次,确认无偏移、无死区(触摸校准数据出厂已写入,一般无需重新校准)
**提示:**若触摸无响应,先确认触摸 USB 线与主板连接,再用 adb shell lsusb 检查是否存在触摸控制器设备。
==== 4.11 GPIO使用方法 ====
整机 GPIO 为**选配引出**(背部 GPIO 座 / 内部插针)。16 针端子的奇偶脚方向规则、系统 GPIO 编号与端子对应关系见 **2.3**,本节不再重复。
Android 应用通过 NodkaAPI 的 gpio_ 接口操作,无需 shell(见 4.12.4):
NodkaAPI api = NodkaAPI.nodkaAPICreate(context);
api.gpio_export(95); // 导出引脚
api.gpio_direction(95, "out"); // 设为输出
api.gpio_write(95, 1); // 输出高电平
int v = api.gpio_read(95); // 回读电平
api.gpio_unExport(95); // 取消导出
**提示:**GPIO 编号为内核 gpiochip 全局编号,不同固件版本可能整体偏移;未导出的引脚需先 gpio_export 再操作。Linux 命令行(/sys/class/gpio)操作见 5.4。
==== 4.12 API参考与使用 ====
面向 Android 应用开发,把硬件与系统能力封装为 Java 接口,应用不必直接读写 /dev 与 /sys 节点。Linux 侧不提供本套接口,请使用第 5 章的命令行方式。
**接口源码包下载**
{{wiki:androidapi1.5.zip|AndroidAPI 1.5 接口源码包(18.7 MB)}}
包内包含 AndroidAPI.jar、libandroid-jni.so、AndroidAPI-sources.jar、Javadoc 文档、AndroidAPIDemo 示例工程与 APK、platform.jks 签名文件及 readme.txt。串口、GPIO、系统控制类接口需要系统签名或 Root 权限。
=== 4.12.1 使用说明 ===
**接口分类**
^ 前缀 ^ 类别 ^ 说明 ^
| devinfo_ | 硬件及系统信息查询类 | 系统版本、CPU、内存、存储、SN 等 |
| display_ | 显示控制类 | 亮度、旋转、分辨率、导航栏与状态栏 |
| gpio_ | GPIO 控制类 | 导出、方向、读写电平 |
| uart_ | 串口控制类 | 打开、收发、关闭串口 |
| sysctrl_ | 系统控制类 | 定时开关机、立即重启、静默安装 |
**1. 在 Application 的 onCreate 中创建实例**
public class APIApplication extends Application {
private NodkaAPI mNodkaAPI;
@Override
public void onCreate() {
super.onCreate();
mNodkaAPI = NodkaAPI.nodkaAPICreate(this);
}
public NodkaAPI getNodkaAPI() {
return mNodkaAPI;
}
}
**2. 在 Activity 或 Fragment 中取用**
private NodkaAPI mNodkaAPI = APIApplication.getApplication().getNodkaAPI();
**提示:**需在 AndroidManifest.xml 中把 android:name 指向 APIApplication;串口、GPIO、系统控制类接口需要系统签名或 Root 权限。
=== 4.12.2 硬件及系统信息查询 ===
^ 方法名 ^ 方法说明 ^
| 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() | 获取内存总容量 |
=== 4.12.3 显示控制(display_) ===
^ 方法名 ^ 方法说明 ^
| 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) | 设置屏幕旋转方向 |
=== 4.12.4 GPIO控制(gpio_) ===
^ 方法名 ^ 方法说明 ^
| gpio_direction(int gpioNumber, String direction) | 设置指定 GPIO 的方向(输入 / 输出) |
| gpio_export(int gpioNumber) | 导出指定 GPIO 引脚 |
| gpio_read(int gpioNumber) | 读取指定 GPIO 的电平值 |
| gpio_unExport(int gpioNumber) | 取消导出指定 GPIO 引脚 |
| gpio_write(int gpioNumber, int value) | 设置指定 GPIO 的输出电平 |
引脚编号见 4.11。
=== 4.12.5 串口控制(uart_) ===
^ 方法名 ^ 方法说明 ^
| uart_close(String uartNode) | 关闭 uart 设备,如 /dev/ttyS2 |
| uart_getAvailableDevices() | 获取 uart 可用设备节点,返回 List
aplay -l # 查看声卡与设备列表
aplay /nodka_test/LR_audio.wav -D hw:0,0 # 指定声卡设备播放
arecord -d 5 -f cd -r 44100 -c 2 -t wav test.wav
aplay test.wav
音量调节:
alsamixer
amixer -c 0 set 'Playback' 80%
**提示:**整机播放在 SPK 端子(PH2.0-4P)输出,需外接 8Ω 喇叭;MIC 走 Ø3.5 接口。
==== 5.2 网络使用方法 ====
=== 5.2.1 以太网 ====
**查看网口**
ifconfig -a
ip link show
**命令行设置静态 IP**
1. 用 vim 打开网络配置文件:vim /etc/network/interfaces
2. 按现场网络修改 IP、掩码、网关(整机为单网口,只配 eth0)
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.2.110
netmask 255.255.255.0
gateway 192.168.2.1
3. 保存退出(vim 下按 Esc,输入 :wq),重启系统使配置生效。
**提示:**Ubuntu 20.04 默认由 NetworkManager 接管网络,/etc/network/interfaces 里的配置可能不生效;此时改用 5.2.2 的 nmcli 写法,或先停用 NetworkManager 再用本节方式。
**设置 DNS**
vi /etc/resolv.conf
nameserver 114.114.114.114
**网络优先级**
# 临时修改,数值越小优先级越高
sudo ifmetric eth0 100
# 永久修改
sudo nmcli connection modify "有线连接名称" connection.autoconnect-priority 1
sudo nmcli connection modify "有线连接名称" ipv4.route-metric 100
sudo nmcli connection modify "有线连接名称" connection.autoconnect yes
sudo systemctl restart NetworkManager
**验证**
ping -c 4 192.168.2.1
ping -c 4 www.baidu.com
**提示:**图形界面(Debian 桌面)可在「About NetworkManager Applet → Edit Connections…」中直接设置 IP、掩码、网关;没有现成连接时点右下角 + 新建。
=== 5.2.2 WiFi ====
**查询并启用无线网卡**
ifconfig -a # 无线网卡通常为 wlan0
ifconfig wlan0 up # 启用无线网卡
iw dev wlan0 scan # 扫描热点,获取 SSID、信号强度、加密方式
**连接无线网络**
nmcli d wifi connect "SSID" password "PASSWORD"
**静态 IP**
sudo nmcli connection modify NODKA ipv4.addresses 172.10.21.111/24 # IP / 子网掩码
sudo nmcli connection modify NODKA ipv4.gateway 172.10.21.1 # 网关
sudo nmcli connection modify NODKA ipv4.dns "114.114.114.114,61.177.7.1,8.8.8.8" # DNS
sudo nmcli connection modify NODKA ipv4.method manual # 静态
sudo nmcli device disconnect wlan0
sudo nmcli device connect wlan0
**动态 IP(DHCP)**
sudo nmcli connection modify NODKA ipv4.method auto
sudo nmcli connection modify NODKA ipv4.addresses "" # 清除静态 IP
sudo nmcli connection modify NODKA ipv4.gateway "" # 清除网关
sudo nmcli connection modify NODKA ipv4.dns "" # 清除 DNS(可选)
sudo nmcli connection down NODKA
sudo nmcli connection up NODKA
**配置为 AP 热点**
IFNAME="wlan0" # 无线网卡节点
CON_NAME="One" # 热点名称
nmcli con add type wifi ifname $IFNAME con-name $CON_NAME autoconnect yes ssid $CON_NAME
nmcli con modify $CON_NAME 802-11-wireless.mode ap 802-11-wireless.band bg ipv4.method shared
nmcli con up $CON_NAME
**提示:**信号弱时可调整背部 Wi-Fi/BT 天线角度,或改用吸盘天线;连接后可用 ip addr show wlan0 查看获取到的地址。
==== 5.3 串口使用方法(Linux) ====
Linux 下串口节点与 Android 一致:RS485 为 /dev/ttyS1、/dev/ttyS3,RS232 为 /dev/ttyS2、/dev/ttyS4(以背部丝印为准)。
**测试工具**
- 图形界面:CuteCom(sudo apt install cutecom),选择 /dev/ttyS2、115200、8N1 后打开
- 命令行:系统自带 com_send / com_recv
# 发送
com_send /dev/ttyS2 115200
# 接收(另开一个终端)
com_recv /dev/ttyS2 115200
**直接读写节点**
stty -F /dev/ttyS2 115200 cs8 -cstopb -parenb
echo "hello" > /dev/ttyS2 # 发送
cat /dev/ttyS2 # 接收
**测试方式**
回环、对发与转接的接法见 **4.5.2**,与操作系统无关,本节不重复。
**注意事项**
- 整机为 3.5mm 3P 可插拔端子(无 DB9),配压接端子或转接线使用;线序反接(A / B、R / T)会直接导致通信失败
- RS485 为半双工,方向由硬件自动切换,收发切换时注意帧间隔
- 提示无权限时把当前用户加入 dialout 组:sudo usermod -aG dialout $USER(重新登录生效)
==== 5.4 GPIO使用方法(sysfs) ====
Linux 下统一通过 /sys/class/gpio 访问。端子脚位规则与系统 GPIO 编号见 **2.3**,本节只给操作命令。
**1. 查看相关 IO 是否导出**
cd /sys/class/gpio
ls
**2. 设置 GPO(系统配置)**
for i in {95,94,21,22,140,141}; do echo out >gpio$i/direction; done
for i in {13,14,96,93,108,107}; do echo out >gpio$i/direction; done
**3. 设置 GPO 高 / 低**
输出高电平:
for i in {95,94,21,22,140,141}; do echo 1 >gpio$i/value; done
for i in {13,14,96,93,108,107}; do echo 1 >gpio$i/value; done
回读当前电平:
for i in {95,94,21,22,140,141}; do cat /sys/class/gpio/gpio$i/value; done
输出低电平:
for i in {95,94,21,22,140,141}; do echo 0 >gpio$i/value; done
for i in {13,14,96,93,108,107}; do echo 0 >gpio$i/value; done
**4. 设置 GPI(系统配置)**
for i in {13,14,96,93,108,107}; do echo in >gpio$i/direction; done
**5. 获取 GPI value**
for i in {13,14,96,93,108,107}; do cat /sys/class/gpio/gpio$i/value; done
for i in {95,94,21,22,140,141,13,14,96,93,108,107}; do cat /sys/class/gpio/gpio$i/direction; done
**提示:**GPIO 编号为内核 gpiochip 全局编号,不同固件版本可能整体偏移;若 /sys/class/gpio 下没有对应节点,先执行 echo 编号 > /sys/class/gpio/export 导出后再操作。
==== 5.5 USB与SD卡挂载 ====
**U 盘识别**
dmesg | tail -20 # 插入后内核提示,可见设备名为 sda / sda1
lsblk # 查看块设备及挂载点
**挂载与卸载**
mkdir -p /mnt/USB1
mount /dev/sda1 /mnt/USB1
df -h
umount /mnt/USB1
**SD 卡**
fdisk -l # SD 卡设备名通常为 /dev/mmcblk1p1
mount /dev/mmcblk1p1 /mnt/sdcard
umount /mnt/sdcard
**提示:**ext4 / vfat 可直接挂载;NTFS 需安装 ntfs-3g,exFAT 需 exfat-fuse。Android 下的查看方式见 4.6。
==== 5.6 分辨率与HDMI ====
内部屏分辨率由机型固定(见 1.3 型号与配置),HDMI 外接输出可通过 xrandr 调整。
**X11 桌面**
xrandr # 查看输出与可用模式
xrandr --output HDMI-1 --mode 1920x1080 --rate 60
xrandr -o left # 左旋 90°
xrandr -o right # 右旋 90°
xrandr -o inverted # 翻转 180°
xrandr -o normal # 恢复
**临时添加自定义分辨率**
cvt 800 750
# 800x750 59.86 Hz (CVT) ... Modeline "800x750_60.00" 48.50 800 840 920 1040 750 753 763 779 -hsync +vsync
xrandr --newmode "800x750_60.00" 48.50 800 840 920 1040 750 753 763 779 -hsync +vsync
xrandr --addmode HDMI-1 800x750_60.00
xrandr --output HDMI-1 --mode 800x750_60.00
**Wayland / Weston(使用 Wayland 会话时)**
Ubuntu 20.04 默认使用 Xorg,xrandr 方式适用;若改用 Wayland 会话,Wayland 下不支持 xrandr,编辑 /etc/xdg/weston/weston.ini:
[output]
name=HDMI-A-1
mode=1920x1080
修改后重启系统或 weston 服务生效。
**双屏模式**
同显(镜像)与异显(扩展)两种模式的定义见 **4.8**。Linux 下由桌面显示设置或 xrandr 控制两路输出的开关与位置。
==== 5.7 远程访问及文件传输 ====
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable --now ssh
ip addr show
电脑端传输:
scp ./update.img root@192.168.8.55:/home/root/
图形化工具可用 WinSCP / FileZilla,协议 SFTP,端口 22。
==== 5.8 开机自动执行程序 ====
按启动时机分三种,按需选择,可叠加使用:**登录前 → 登录时 → 进入图形界面后**。同一程序只放一处即可。
=== 5.8.1 登录前执行 ===
适用于不依赖桌面、开机就要跑的后台服务。
- 编辑 /etc/rc.local 文件
- 在 exit 0 之前加入程序调用
- 保存退出(按 Esc,输入 :wq 回车)
sudo vim /etc/rc.local
# 在 exit 0 之前添加
/path/to/myprogram &
exit 0
**说明:**/path/to/myprogram 为程序完整路径;行尾的 & 让程序在后台运行,否则会阻塞后续登录流程。文件最后一行必须是 exit 0,脚本才会被执行。
**提示:**Ubuntu 20.04 默认未启用 /etc/rc.local,需确认 rc-local.service 已启用;只支持 systemd 的场景建议改用自建 service 或 5.8.3 的启动脚本。
=== 5.8.2 登录后执行 ===
只对当前用户生效,在用户登录完成时执行。
- 编辑用户配置文件 ~/.profile
- 在文件末尾追加启动命令
- 保存退出
- 执行 source ~/.profile 使改动立即生效
vim ~/.profile
# 文件末尾追加
/path/to/myprogram &
source ~/.profile
**提示:**~/.profile 仅对当前用户生效;需要所有用户生效时改 /etc/profile。
=== 5.8.3 进入图形界面后执行 ===
桌面起来之后才需要显示界面的应用(如全屏主程序)放这里。
**Debian(LXDE)**
- 编辑自启动文件
- 在末尾追加启动命令
- 保存退出,重启或重新登录生效
vim /root/.config/lxsession/LXDE/autostart
# 末尾追加
/path/to/myprogram > /dev/null 2>&1 &
**Ubuntu**
Ubuntu 下统一由启动脚本托管,把命令写进 /nodka_test/autorun.sh(该脚本在桌面启动后自动执行)。
sudo vim /nodka_test/autorun.sh
# 末尾追加
/path/to/myprogram > /dev/null 2>&1 &
**提示:**> /dev/null 2>&1 用于丢弃程序输出,避免日志写满分区;& 保证后台运行。
==== 5.9 界面与显示自定义 ====
=== 5.9.1 状态栏自定义 ===
LXDE 面板(任务栏 / 菜单栏)的配置保存在:
$HOME/.config/lxpanel/LXDE/panels/panel
用文本编辑器打开即可增删插件、调整位置与尺寸;改完执行 lxpanelctl restart,或重新登录生效。
=== 5.9.2 屏蔽桌面环境 ===
桌面自启动文件 /root/.config/lxsession/LXDE/autostart 的默认内容:
@lxpanel --profile LXDE
@pcmanfm --desktop --profile LXDE
@xscreensaver -no-splash
pulseaudio -D
/nodka_test/autorun.sh
^ 行 ^ 作用 ^
| @lxpanel --profile LXDE | 启动 LXDE 面板(任务栏与菜单) |
| @pcmanfm --desktop --profile LXDE | 以 PCManFM 接管桌面,负责壁纸与图标 |
| @xscreensaver -no-splash | 屏幕保护程序 |
| pulseaudio -D | 启动音频服务 |
| /nodka_test/autorun.sh | 桌面起来后执行的自启动脚本 |
屏蔽桌面、只显示应用界面,把前三行注释掉即可:
#@lxpanel --profile LXDE
#@pcmanfm --desktop --profile LXDE
#@xscreensaver -no-splash
pulseaudio -D
/nodka_test/autorun.sh
**提示:**注释掉面板与 PCManFM 后,桌面无任务栏、无壁纸图标,仅显示自启动程序窗口,适合整机出厂即全屏应用的场景。
=== 5.9.3 更换开机LOGO ===
开机 LOGO 存放在 resource 分区。按 ① ~ ⑥ 顺序在整机 Linux 终端执行(需 root 权限):需要执行命令的步骤,说明文字与紧随其后的代码块对应;④ 的文件位置见下表。
**① 准备 BMP 图片**
准备 BMP 格式图片,并把图片尺寸设为屏幕分辨率大小(如 HDMI 1920×1080)。
**② 拷贝 bmpconvert 工具并赋予可执行权限**
{{wiki:bmpconvert.zip|下载 bmpconvert 转换工具(2.3 KB,解压即得脚本)}},解压后拷贝到 /usr/bin:
sudo cp bmpconvert /usr/bin/
sudo chmod +x /usr/bin/bmpconvert
**③ 挂载 resource 分区**
sudo mount /dev/block/by-name/resource /mnt
**④ 放置开机 LOGO 文件**
把 BMP 图片按屏幕类型放入 /mnt 对应文件名:
^ 屏幕类型 ^ 文件位置 ^
| HDMI / eDP / LVDS | /mnt/logo.bmp、/mnt/logo_kernel.bmp |
| MIPI | /mnt/logo_mipi.bmp、/mnt/logo_kernel_mipi.bmp |
**⑤ 执行 bmpconvert 转换**
HDMI / eDP / LVDS 屏执行:
sudo bmpconvert /mnt/logo.bmp
sudo bmpconvert /mnt/logo_kernel.bmp
MIPI 屏改用对应文件名:
sudo bmpconvert /mnt/logo_mipi.bmp
sudo bmpconvert /mnt/logo_kernel_mipi.bmp
**报错处理:**若步骤 ⑤ 出现如下输出,说明系统只有 python3、缺少 python 命令:
root@rk3568: bmpconvert /mnt/logo.bmp
/usr/bin/env: 'python': No such file or directory
root@rk3568: bmpconvert /mnt/logo_kernel.bmp
/usr/bin/env: 'python': No such file or directory
先建立 python 软链,再重跑步骤 ⑤ 的两条命令:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1
sudo bmpconvert /mnt/logo.bmp
sudo bmpconvert /mnt/logo_kernel.bmp
**⑥ 重启系统**
sudo reboot
**提示:**logo.bmp 为 U-Boot 阶段显示,logo_kernel.bmp 为内核启动阶段显示,两个都要替换。修改前建议先备份 /mnt 下的原文件。
=== 5.9.4 切换不同LCD显示屏 ===
**HDMI**:系统默认支持,默认输出 1920×1080,无需设置。
**eDP / LVDS**:屏参与屏体必须匹配。终端执行 dis 调出屏参设置界面,选择对应屏参后点击 Save,重启生效。
dis
{{wiki:cm_lcd_sml.png?620}}
Display Settings 屏参设置界面:选择与屏体一致的参数,点击 Save 保存。
=== 5.9.5 屏幕旋转 ===
**Debian:修改 xorg 配置**
- 先用 xrandr 查看屏幕节点名(如 eDP-1、HDMI-1)
- 编辑 /etc/X11/xorg.conf.d/20-modesetting.conf
- 修改 Option "Rotate" 取值后重启
Section "Monitor"
Identifier "eDP-1" # 屏幕节点名,用 xrandr 查询
Option "Rotate" "inverted" # 旋转方向,见下表
EndSection
^ 取值 ^ 旋转角度 ^
| normal | 0°(默认) |
| right | 顺时针 90° |
| inverted | 顺时针 180° |
| left | 顺时针 270° |
**Ubuntu:使用 xrandr**
xrandr --output HDMI-1 --rotate left # 向左旋转 90°
xrandr --output HDMI-1 --rotate right # 向右旋转 90°
xrandr --output HDMI-1 --rotate inverted # 旋转 180°
xrandr --output HDMI-1 --rotate normal # 恢复默认
**提示:**把旋转命令放到 /nodka_test/autorun.sh 末尾,可开机自动生效。
**触摸旋转**
屏幕旋转后触摸坐标会错位,需同步修改 /usr/share/X11/xorg.conf.d/40-libinput.conf 中的 CalibrationMatrix:
Section "InputClass"
Identifier "libinput touchscreen catchall"
Option "CalibrationMatrix" "-1 0 1 0 -1 1 0 0 1"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSection
^ 屏幕方向 ^ CalibrationMatrix ^
| 0°(默认) | 1 0 0 0 1 0 0 0 1 |
| 90°(顺时针) | 0 1 0 -1 0 1 0 0 1 |
| 180°(上下颠倒) | -1 0 1 0 -1 1 0 0 1 |
| 270°(逆时针 90°) | 0 -1 1 1 0 0 0 0 1 |
==== 5.10 OTA在线升级固件 ====
=== 5.10.1 通过网络OTA ===
升级由板内 /usr/bin/ota 脚本完成。按实际情况编辑该脚本、设置 FTP 地址与账号,并把相应固件放到 FTP 下载地址,然后执行 ota。需要改动的文件与对应代码如下。
**① 编辑升级脚本 /usr/bin/ota**
sudo vim /usr/bin/ota
**② 在脚本中设置以下三项**
URL=ftp://<固件服务器地址>
USERNAME=<用户名>
PASSWORD=<密码>
**③ 保存后执行升级**
ota
按提示完成升级。
**提示:**服务器地址、账号与固件目录由我司提供;升级过程请勿断电,完成后设备自动重启。
=== 5.10.2 使用U盘在线升级 ===
Linux 下由板内 /usr/bin/ota 脚本执行在线升级,U 盘作为固件暂存盘。按 ① ~ ⑤ 顺序操作:需要执行命令的步骤,说明文字与紧随其后的代码块一一对应;③④ 为条件确认,无需执行命令。
**① 解除 U 盘挂载**
sudo umount /dev/sdb
**② 格式化 U 盘为 ext4**
sudo mkfs.ext4 /dev/sdb
**③ 确认系统支持在线升级**
板内需已具备 /usr/bin/ota 脚本(脚本配置见 5.10.1)。
**④ 确认 U 盘规格**
U 盘需格式化为 linux ext4 格式,可用容量大于 8G,否则升级包无法写入。
**⑤ 插网线、插 U 盘,执行升级**
ota
按提示完成升级,过程中请勿断电,完成后设备自动重启。
**提示:**/dev/sdb 为 U 盘常见设备节点,实际以 lsblk 结果为准。本节是 Linux 在线升级(ext4、≥8G、ota 命令),与 3.4 的 Android U 盘升级(FAT32、update.img)、4.13 的 Android 在线升级是两套流程,不要混用。
==== 5.11 交叉编译环境 ====
=== 5.11.1 apt安装交叉编译环境 ====
Debian / Ubuntu 主机上一条命令即可装好 aarch64 交叉工具链,再用 -v 确认版本:
sudo apt install -y crossbuild-essential-arm64
aarch64-linux-gnu-gcc -v
=== 5.11.2 下载指定版本工具链 ====
需要特定版本时,从 ARM 官方下载对应工具链(developer.arm.com/downloads/-/gnu-a),解压后把 bin 目录加入 PATH:
export PATH=$PATH:/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/
aarch64-none-linux-gnu-gcc --version
**提示:**写入 ~/.bashrc 或 /etc/profile 可永久生效;路径按实际解压目录替换。
=== 5.11.3 工具链下载 ===
常用交叉编译工具链与获取方式:
* **aarch64-linux-gnu-gcc 交叉工具链**:SDK prebuilts 目录内提供
* **arm-linux-gnueabihf 交叉工具链**:用于 32 位用户态程序编译
* **x86 主机交叉编译 arm64 工具链**:ARM 官方发布,用于在 x86_64 主机上编译 aarch64(arm64)程序
**下载:**[[https://pan.baidu.com/s/1OjJVuzDB3hFMgO6yS3EAZw|gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz]] 百度网盘 提取码 hkku
**提示:**该工具链免安装,解压后把压缩包内 bin 目录加入 PATH 即可;编译时调用 aarch64-none-linux-gnu-gcc。
==== 5.12 Qt应用开发 ====
预置环境:**Debian 11 → Qt 5.15.2**,**Ubuntu 20.04 → Qt 5.12.8**。两种方式按条件选择。
=== 5.12.1 导入Docker镜像编译 ===
用现成编译镜像,主机无需安装 Qt,隔离性好,适合批量编译。
- 导入镜像
- 启动容器,把应用目录挂载到 /mnt(source 换成实际路径)
- 容器内进入 /mnt 执行 qmake 与 make
sudo docker load < nodka_docker_qt_build_20230223.tar
sudo docker run --rm --mount type=bind,source=/home/APP_PATH,target=/mnt/ -i -t 09a37c1b2fc3 /bin/bash
cd /mnt
qmake
make
**提示:**镜像体积较大,由我司单独提供;容器 ID(09a37c1b2fc3)以 docker images 实际输出为准。
=== 5.12.2 板端搭建Qt编译环境 ===
**1. 安装 Qt Creator**
sudo apt-get install qtcreator
sudo apt-get install qt5-default
若 qt5-default 已被官方仓库移除,改用下面这组依赖:
sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator
**2. 添加 qmake**
Qt Creator → Tools → Options → Kits → Qt Versions → Add,选择板内 qmake:
/usr/local/qt5.12-arm/bin/qmake
{{wiki:qt_set_qmake.png?620}}
在 Qt Versions 中添加板内 qmake 路径。
**3. 配置交叉编译器**
同一窗口切到 Compilers → Add → GCC,分别添加 g++ 与 gcc:
g++:/usr/bin/aarch64-linux-gnu-g++
gcc:/usr/bin/aarch64-linux-gnu-gcc
g++ 编译器位置:
{{wiki:qt_set_compiler_gpp.png?620}}
gcc 编译器位置:
{{wiki:qt_set_compiler_gcc.png?620}}
添加交叉编译器;主机装的是 crossbuild-essential-arm64 时编译器在 /usr/bin 下,用第三方工具链时填其安装路径。
**4. 配置 Debugger(可选,在线调试用)**
sudo apt install -y gdb-multiarch
板端需存在 /usr/bin/gdbserver,没有则安装 gdbserver(Buildroot 自带,无需安装)。在 Qt Creator 的 Debuggers 中添加 /usr/bin/gdb-multiarch。
{{wiki:qt_set_debugger.png?620}}
**5. 配置 Devices**
填入板卡 IP 与用户名 root;建议给板卡设置静态 IP,避免调试中断线。
{{wiki:qt_set_device.png?620}}
**6. 配置 Kits**
把前面的 Qt 版本、编译器、调试器、设备组合成一个 Kit。目标系统为 Ubuntu 时,还需在 Kit 中填写 sysroot 路径。
{{wiki:qt_set_kits_std.png?620}}
在 Kits 中组合 Qt 版本、编译器、调试器与设备。
==== 5.13 视频硬件编解码支持 ====
板载 VPU 支持 H.264 / H.265 硬件编解码,系统已带 GStreamer 插件与 OpenGL ES / OpenCL 运行库。
**GStreamer 编解码**
系统自带测试脚本,直接运行即可验证硬解与硬编:
/rockchip-test/video/test_dec-gst.sh # 硬解测试
/rockchip-test/video/test_enc-gst.sh # 硬编测试
**OpenGL ES**
用 glmark2 跑分验证 GPU:
glmark2-es2
**WebGL**
打开 Chromium,在地址栏输入以下地址,查看 WebGL 与硬件加速状态:
chrome://gpu
**OpenCL**
clinfo
{{wiki:cm_clinfo.png?620}}
clinfo 输出:确认平台、设备与 OpenCL 版本信息。
===== 6 通用方法 =====
本章为查询类命令,Android(adb shell)与 Linux 终端下基本一致,个别命令已在条目中注明差异。
==== 6.1 查看CPU温度 ====
cat /sys/class/thermal/thermal_zone0/temp
# 输出为毫摄氏度,45200 表示 45.2℃
==== 6.2 查看CPU序列号 ====
cat /proc/device-tree/serial-number
# Android 下
getprop ro.serialno
==== 6.3 查看CPU频率 ====
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
==== 6.4 查看内存容量 ====
free -h
cat /proc/meminfo | head -3
==== 6.5 查看存储容量 ====
df -h
lsblk
==== 6.6 网络Ping测试 ====
ping -c 4 192.168.8.1
ping -c 4 www.baidu.com
ping -c 1 -W 1 8.8.8.8
==== 6.7 设置系统时间保存到RTC芯片 ====
# 查看系统时间
date
# 设置系统时间并写入 RTC 芯片
sudo date -s "2025-04-08 17:01:01"
sudo hwclock -w
sudo hwclock -r
**验证**:关机断电 5 秒以上再开机,用 date 查看时间是否保持。
**提示:**系统默认启用网络对时,RTC 测试需在断开外网的情况下进行。
**时区设置**
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
reboot
图形界面可在「首选项 → 时间和日期」中选择时区,设置其他时区只需把命令中的 Asia/Shanghai 换成对应城市。
===== 7 附录 =====
==== 7.1 常见问题排查 ====
^ 现象 ^ 可能原因 ^ 处理方式 ^
| 烧录工具一直显示「没有发现设备」 | 未进入 Loader / USB 驱动异常 / 线材问题 | 按 3.3 步骤 ④ 重新进入;驱动卸载后重装;更换 USB 口与数据线 |
| 设备管理器出现未知设备 | 瑞芯微 USB 驱动未装好 | 见 3.2,重新安装 DriverInstall |
| ADB 无法连接 | 未开启 USB 调试 / 接错 USB 口 | 见 4.1;确认接的是蓝色 USB3.0/OTG 下口 |
| 串口打不开或无数据 | 节点选错 / 无权限 / A-B 或 R-T 反接 | 见 4.5、5.3;按丝印核对节点与线序 |
| GPIO 读写无反应 | 未 export / 编号随固件偏移 | 见 2.3、5.4;先 export 再操作 |
| 触摸无响应或坐标错位 | 触摸 USB 线松动 / 旋转后未改 CalibrationMatrix | 见 4.10、5.9.5 |
| 屏幕旋转后界面正常但触摸反向 | 未同步修改 libinput 校准矩阵 | 见 5.9.5 触摸旋转表 |
| 开机 LOGO 不生效 | 只替换了其中一张 / 未执行 bmpconvert | 见 5.9.3,两张 logo 都要替换并转换 |
| 静态 IP 配置不生效 | NetworkManager 与 ifupdown 并存 | 见 5.2.1 提示 |
| U 盘升级无提示 | 文件名不是 update.img / 格式不是 FAT32 | 见 3.4.1,改名并重新格式化为 FAT32 |
==== 7.2 文档信息与修订记录 ====
^ 项目 ^ 内容 ^
| 适用产品 | sTPC-E101 / E121 / E150 / E156 / E170 / E215-3568B |
| 主控平台 | Rockchip RK3568(4 × Cortex-A55 @2.0GHz,1TOPS NPU) |
| 适用系统 | Android 11、Ubuntu 20.04(Debian 11 按项目配置) |
| 文档版本 | v1.4 |
| 更新日期 | 2026-11-11 |
^ 版本 ^ 日期 ^ 修订内容 ^
| v1.4 | 2026-11-11 | 全文口径对齐:统一串口组数与丝印、电源范围、系统范围、接口数量口径;GPIO 与 OTA 去重;补 SD 卡 / GPIO / 编解码规格;新增 4.13 与第 7 章附录 |
历史版本请向技术支持索取。
==== 7.3 技术支持 ====
* 固件、烧录工具、SDK 与规格书获取:联系销售或技术支持
* 反馈问题时请提供:整机 SN(查看方法见 6.2)、系统版本、复现步骤与截图
* 自行修改系统后出现异常,建议先重新烧录出厂固件(见 3.3)再判断是否为硬件问题