RK3568开发板外设测试指南:从按键到CAN总线
1. HZ-RK3568开发板外设测试概述
拿到一块新的开发板,第一件事就是全面测试它的各项外设功能是否正常。HZ-RK3568作为一款基于Rockchip RK3568处理器的开发板,集成了丰富的外设接口和功能模块。本文将带您逐步完成按键、LED、存储和CAN总线等核心外设的测试流程。
RK3568处理器采用四核Cortex-A55架构,主频可达2GHz,集成了Mali-G52 GPU和0.8TOPS NPU,外设方面支持多种接口标准。开发板上将这些接口以实用的形式引出,包括:
- 4个用户可编程按键(ADC按键)
- 2个状态指示灯LED
- eMMC 5.1存储
- 双路CAN 2.0B控制器
- 多个USB、UART、SPI、I2C等标准接口
测试这些外设不仅能验证开发板的基本功能,也是后续开发的重要基础。我们将从简单的按键、LED测试开始,逐步深入到存储性能测量和CAN总线通信测试。
2. 按键功能测试与实现原理
2.1 测试步骤详解
开发板上有多个物理按键,除电源键外,其余按键都可通过软件检测状态。测试步骤如下:
- 通过串口终端登录开发板系统(默认使用调试串口,波特率1500000)
- 在终端输入测试命令:
HZ_keytest - 依次按下开发板上的各个按键(不包括POWER_ON键)
- 观察终端输出的按键状态变化:
key 1 pressed key 1 released key 2 pressed ... - 测试完成后,按Ctrl+C退出测试程序
2.2 底层实现机制
这些按键在硬件设计上采用了ADC检测方案,相比GPIO按键有以下优势:
- 节省GPIO资源:多个按键共享一个ADC通道
- 支持按键组合检测:通过不同分压值识别组合按键
- 防抖处理:在驱动层实现硬件防抖
软件层面,HZ_keytest工具通过读取/sys/bus/iio/devices/iio:deviceX/in_voltageY_raw节点获取ADC原始值,经过以下处理流程:
- 定期采样(典型间隔20ms)
- 数值滤波(中值滤波+均值滤波)
- 电压值计算(参考电压1.8V,12位ADC精度)
- 按键状态判断(预设电压阈值)
- 事件上报(通过input子系统)
2.3 测试注意事项
- 按键灵敏度问题:如果发现按键响应不灵敏,可能是阈值设置不合理,可以通过调整
/sys/class/input/inputX/下的阈值参数优化 - 组合键检测:某些开发板支持组合键,需要查看原理图确认分压网络设计
- 长按识别:标准测试程序可能不包含长按检测,需要自行扩展功能
3. LED控制与状态监测
3.1 LED测试完整流程
开发板上有两个可编程LED(LED1和LED2),测试步骤如下:
查看系统识别到的LED设备:
ls /sys/class/leds/正常应显示类似输出:
led1 led2查看LED2的当前触发模式:
cat /sys/devices/platform/leds/leds/led2/trigger输出显示可用模式和当前模式([]括起):
[none] rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock mmc3 mmc1 timer heartbeat gpio default-on mmc0 rfkill0 rfkill1 rfkill2 rfkill4修改LED2触发模式为heartbeat(心跳模式):
echo heartbeat > /sys/devices/platform/leds/leds/led2/trigger观察LED2状态变化,应与LED1同步呈现"快闪两次-暂停"的循环模式
3.2 LED子系统深度解析
Linux LED子系统提供了丰富的控制方式,主要包含以下功能:
触发模式:
- heartbeat:系统运行状态指示(快闪表示活跃)
- timer:定时闪烁(频率可调)
- mmc0/mmc1:存储活动指示
- default-on:常亮
- none:手动控制模式
手动控制: 当触发模式设为none时,可以通过以下命令控制:
echo 1 > /sys/class/leds/led2/brightness # 点亮 echo 0 > /sys/class/leds/led2/brightness # 熄灭亮度调节: 对于支持PWM调光的LED:
echo 50 > /sys/class/leds/led2/brightness # 50%亮度3.3 实际应用技巧
- 诊断用途:可以配置不同LED表示系统不同状态(如网络连接、服务运行等)
- 性能考虑:避免设置过高频率的闪烁模式,会增加系统负载
- 电源管理:在电池供电场景下,可以考虑降低LED亮度或减少活动指示
- 自定义触发:可以通过编写内核模块实现更复杂的触发逻辑
4. eMMC存储性能测试与分析
4.1 完整测试流程
测试写入性能(创建500MB测试文件):
dd if=/dev/zero of=/test bs=1M count=500 conv=fsync注意观察输出中的速度信息,如:
524288000 bytes (524 MB, 500 MiB) copied, 5.12345 s, 89 MB/s重启开发板后测试读取性能:
dd if=/test of=/dev/null bs=1M典型输出:
524288000 bytes (524 MB, 500 MiB) copied, 3.45678 s, 155 MB/s测试完成后清理测试文件:
rm /test
4.2 测试原理与参数解读
关键参数说明:
bs=1M:设置每次读写的块大小为1MB(影响IOPS和吞吐量)count=500:测试500个块,总大小500MBconv=fsync:确保数据完全写入物理存储(避免缓存影响)
性能影响因素:
- 文件系统类型:ext4通常比F2FS有更好的顺序读写性能
- 块大小设置:较大块(如1M)测顺序吞吐,较小块(如4K)测随机IOPS
- 缓存机制:
conv=fsync绕过页面缓存,反映真实写入性能 - eMMC规格:RK3568支持eMMC 5.1,理论带宽最高400MB/s
4.3 进阶测试方法
随机IO性能测试:
# 4K随机读 fio --name=randread --ioengine=libaio --rw=randread --bs=4k --numjobs=4 --size=128M --runtime=60 --time_based --group_reporting # 4K随机写 fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --numjobs=4 --size=128M --runtime=60 --time_based --group_reporting混合负载测试:
fio --name=mixed --ioengine=libaio --rw=randrw --bs=4k --numjobs=4 --size=1G --runtime=120 --time_based --group_reporting --rwmixread=70实际应用建议:
- 关键数据写入考虑使用
fsync()或O_SYNC标志 - 频繁小文件操作建议使用F2FS文件系统
- 大文件顺序读写可以适当增大IO块大小(如1MB)
5. CAN总线通信测试与实践
5.1 完整测试流程
配置CAN接口参数(波特率500kbps):
ip link set can0 type can bitrate 500000 ip link set can1 type can bitrate 500000启用CAN接口:
ifconfig can0 up ifconfig can1 up物理连接:
- 使用杜邦线连接CAN0和CAN1接口:
- CAN0_H(端子2)连CAN1_H(端子6)
- CAN0_L(端子1)连CAN1_L(端子5)
- 使用杜邦线连接CAN0和CAN1接口:
在另一个终端启动CAN数据接收:
candump can0在第一个终端发送测试数据:
cansend can1 5A1#11.22.33.44.55.66.77.88 cansend can1 5A1#40.45.4A.4F.50观察接收终端应显示:
can0 5A1 [8] 11 22 33 44 55 66 77 88 can0 5A1 [5] 40 45 4A 4F 50
5.2 CAN通信技术细节
报文格式解析:
5A1:11位标准帧ID(十六进制)#:分隔符11.22...:数据字节(十六进制,点号可省略)
关键配置参数:
- 比特率:常用125kbps、250kbps、500kbps、1Mbps
- 采样点:通常设置为75%-80%
- 模式:可选loopback(测试)、silent(监听)等
错误检测与处理:
- 使用
ip -details link show can0查看错误计数器 - 常见错误:
- 总线关闭(bus-off)
- 帧错误
- CRC错误
- 错误恢复策略:
ip link set can0 type can restart-ms 100
5.3 实际应用开发建议
性能优化:
- 合理设置接收缓冲区大小:
echo 1000 > /sys/class/net/can0/rx_queue_len - 使用SocketCAN的高效API:
struct can_filter rfilter = { .can_id = 0x123, .can_mask = CAN_SFF_MASK }; setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
调试技巧:
- 使用
candump -l can0记录通信数据到文件 - 使用
canbusload can0 500000监控总线负载 - 使用
cansniffer -c can0彩色显示变化的报文
安全注意事项:
- 重要控制指令应使用安全帧ID范围
- 关键数据应添加校验字段
- 考虑实现心跳机制监测节点在线状态
