实习日记--核心板第一周
第一天
了解公司核心板:IDO-EVB3568-V1/IDO-EVB3562-V1
对两块核心板的功能外设进行了解,了解各个接口分别是什么
第二天
对IDO-EVB3562-V1进行基础测试(SOC:RockChip RK3562)
1、烧录固件:IDO_EVB3562_V1B_Android13_LVDS1280×800_240411R
2、测试主要用ADB、LVDS屏幕和调试串口(Debug UART)进行辅助测试
3、补充:调试串口(Debug UART):BootROM → Bootloader(如 U-Boot)→ Linux 内核 → 文件系统依次执行,每个阶段都会通过这个串口打印日志
1、测试环境准备
首先将板子连接上LVDS屏幕的屏幕接口,选择驱动电压(我选择3.3v),连接好屏幕背光座和屏幕的TP,接着win+r输入cmd启动命令行接口,将核心板的OTG的USB口与电脑连接起来,在命令行接口输入adb shell命令在主机上建立一个与核心板之间的交互式 Linux Shell 会话
现例举印象深刻的模块:
2、Ethernet测试/WIFI测试
在主板上插网线,看屏幕上是否有主板动态分配 IP 地址/在屏幕上连接WiFi看是否能连接
通过ifconfig查看网线/WiFi分配的IP地址和MAC地址等,然后静态修改IP地址和MAC地址看是否成功
接着查看丢包率,使用ping -c 100 -I wlan0 www.baidu.com进行ping100次www.baidu.com查看丢包率,跑完后再查看cat /proc/net/dev
再进行冲突测试,看优先级是否网口>WIFI>4G/5G上网优先级
3、串口测试
本次测了四个串口,uart4,uart9,uart6,uart8(前两个是ttl,后两个是rs232)
3.1、ttl
ttl的测试通过USB转TTL模块和串口调试助手进行测试,先将USB转TTL模块和板子与主机连接好,进入adb shell,输入microcom -s 9600 -X /dev/ttyS4(后面那个是串口的设备节点)
接着进入串口调试助手,输入对应波特率,选择设备,接着就可以进行测试
3.2、rs232
通过官网文档找到设备RS232节点,EVB3562为/dev/ttyS6和/dev/ttyS8,使用回环测试,将两个串口的tx接rx,rx接tx。
接着用调试串口和adb分别进入两个命令行,其中一个输入cat /dev/ttyS6监视串口是否有数据收发,在另一个命令行输入echo 123 > /dev/ttyS8发送数据
3.3、UI测试
如果要用LVDS屏幕进行UI测试,通过 adb 工具安装 ComAssistant.apk 至开发板
adb install "C:\Users\admin\Desktop\ComAssistant.apk"后面那个是apk的地址,获取地址可以通过直接将apk拖入cmd命令行获取
接着做法就与上述方式类似,ui配置设备节点和波特率,串口调试助手也配置对应波特率
4、ADC测试
该板子
然后通过cat /sys/bus/iio/devices/iio\:device1/in_voltage0_raw读取ADC
5、固件
固件”实际上是一个完整的系统镜像包,它包含了让硬件启动和运行所需的所有软件层
固件 ≈引导程序 + 内核 + 根文件系统 + 分区表的打包体
每次使用一块新的核心板时,都需要先烧录固件,我使用RKDevTool进行烧录固件
烧录固件前,要先进行驱动安装,下载官方驱动软件压缩包DriverAssitant_v5.11.zip,解压完之后运行DriverInstall.exe进行驱动安装
5.1、固件烧录方式
固件烧录有两种方式,MaskRom和Loader模式,OTG
烧录模式 | MaskRom模式 | Loader模式 |
简单描述 | 1.使用USB线将主板连接到电脑上 2.硬件操作使板子进入升级模式 3.在PC上使用USB升级单板固件 | 1.使用USB线将主板连接到电脑上 2.软件或按键操作使板子进入升级模式 3.在PC上使用USB升级单板固件 |
使用场景 | 1.当板子无法正常启动时 | 1.有完整Uboot或能正常进入系统 2.需要单独烧写分区 |
优点 | 1.最基本的烧写方式 2.非固件和硬件问题,一般都能成功烧写 3.不需要Uboot支持,拯救变砖的单板 | 1.烧写效果与MaskRom升级模式类似 2.能单独烧写分区 3.进入Loader模式方便 |
缺点 | 1.进入方式麻烦,不适难拆除外壳的产品 2.较难单独烧写分区 3.需要完全擦除设备再烧写 | 1.需要完整的Loader 2.跨系统升级需要完全擦除设备在烧写 |
5.2、固件内部结构(以 Rockchip Android 为例)
| 组件 | 说明 | 对应文件(分区) |
|---|---|---|
| 1. Loader / SPL | 一级引导程序,初始化 DDR 时钟、存储控制器,从闪存加载下一级 | MiniLoaderAll.bin |
| 2. U-Boot | 二级引导程序,初始化外设、显示、启动内核 | uboot.img |
| 3. Trusted Firmware (ATF) | ARM 可信固件,提供安全监控模式调用 | trust.img |
| 4. 内核 (Kernel) | Linux/Android 内核镜像,包含驱动、调度器、文件系统支持 | boot.img(内含 kernel + ramdisk + DTB) |
| 5. 设备树 (DTB) | 硬件描述文件,告诉内核板子上有哪些外设、引脚功能、时钟等 | 通常打包在boot.img或单独的dtbo.img |
| 6. 根文件系统 (Rootfs) | 系统启动后挂载的根目录,包含/system,/vendor,/data等分区 | system.img,vendor.img,oem.img等 |
| 7. 用户数据分区 | 出厂预置的用户空间,首次开机会被复制到/data | userdata.img |
| 8. 其他参数 | 分区表、环境变量、开机 Logo、恢复模式等 | parameter.txt,misc.img,logo.img,recovery.img |
我通过RKDevToll解包该固件得到:
| 文件名 | 说明 |
|---|---|
MiniLoaderAll.bin | 一级引导加载器(SPL),初始化 DDR 和存储,加载 U-Boot |
parameter.txt | 分区表配置,定义了各分区的起始地址、大小和名称 |
uboot.img | U-Boot 二级引导程序镜像 |
boot.img | 内核 + ramdisk + 设备树(DTB),用于启动系统 |
dtbo.img | 设备树叠加层(Device Tree Overlay),用于动态调整硬件配置 |
recovery.img | 恢复模式系统镜像(包含独立的 kernel + ramdisk) |
misc.img | misc 分区,用于控制启动模式(如进入 recovery) |
super.img | Android 动态分区镜像,内部包含system、vendor、product、odm等逻辑分区 |
vbmeta.img | Android Verified Boot 元数据,用于验证分区完整性 |
baseparameter.img | 板级参数(如序列号、WiFi MAC 地址等) |
package-file | 打包配置文件,记录了固件打包时各镜像的打包顺序和路径 |
6、驱动编写
6.1、准备与理解
理解硬件:需要清晰地知道这个外设在硬件上是如何连接,了解工作原理、寄存器定义、通信协议和时序,确认它连接到了哪个接口(例如,I2C、SPI、GPIO等)以及具体引脚
确认驱动类型:根据设备特性,确定它在Linux系统中的驱动类型
明确接口方式:明确应用程序将如何与你的驱动交互
6.2、设备树配置 (DTS)
修改板级dts文件:在对应目录下,找到并修改你开发板对应的.dts文件
添加或修改节点:根据硬件连接来编写设备树节点
上面的启动节点就是把status设置成“okay”
6.3、驱动代码编写
![]()
6.4、编译
在kconfig里面定义了内核配置的菜单项,让你可以通过 make menuconfig来决定是否编译某个驱动(编译进内核、编译成模块、或完全不编译)
接着修改Makefile:打开Makefile,添加“obj-$(CONFIG_MY_SENSOR) += my_sensor.o”
6.5、测试与调试 (Test & Debug)
第三,四天
对SBC-7602进行测试(SOC:RockChip RK3576)
(测试内容不写完,仅展示部分)
1、Ethernet测试
ifconfig查看IP地址,Mac地址等等
ethtool eth0查看以太网口速率
2、TF卡
TF卡全称TransFlash 卡,是Micro SD 卡的旧称。它是一种极小的闪存存储卡,主要用于手机、平板、运动相机、树莓派、开发板等空间受限的设备扩展存储。
测试速率,插入TF卡,输入df-h,在输出里面找设备
挂载点也可为:/storage/E07E-415A0
查询设备
输入df
清除缓存
su echo 3 > /proc/sys/vm/drop_caches读速率测试(2G)
dd if=/storage/E07E-415A0/test.txt of=/dev/zero bs=16k count=128k写速率测试(2G)
dd if=/dev/zero of=/storage/E07E-415A0/test.txt bs=16k count=128k| 方向 | 作用 |
|---|---|
if=/dev/zero | 生成无限零字节,用于写测试或创建空白文件 |
of=/dev/zero | 丢弃所有写入的数据,用于读测试(相当于黑洞) |
of=/.../test.txt表示输出文件。如果该文件不存在,dd会自动创建它
连续测试3次,取平均值,测试前均需要清除缓存
3、串口测试
RS232
把RS232的TX和RX通过一根导线短接,然后在终端输入microcom -p /dev/ttyS7 -s 115200进行测试,在键盘上输入什么,终端就会显示什么
RS485
将两个RS485的A连起来,B连起来,假设两个串口节点分别为/dev/ttyS1和/dev/ttyS7
然后设置参数
stty -F /dev/ttyS1 115200 cs8 -cstopb -parenb stty -F /dev/ttyS7 115200 cs8 -cstopb -parenb终端1 监听
cat /dev/ttyS1终端2 发送
echo "test" > /dev/ttyS74、Linux操作系统
Debian、Ubuntu 和 Buildroot 的核心区别在于,前两者是成熟的通用操作系统,而 Buildroot 更像一个用于构建定制系统的框架
4.1、Buildroot
它不是一个装好就能用的操作系统,而是一套用 Makefile 和 Kconfig 脚本写成的自动化构建工具。你给它选好目标硬件、需要的软件包,它就会帮你从源代码交叉编译,生成一个极简的根文件系统、内核和引导程序。
产出:几 MB 到几十 MB 的固件镜像,适合小到路由器、摄像头这类资源紧张的设备。
特点:高度定制,要什么功能加什么,系统非常轻量;没有传统的包管理器(如 apt),升级通常靠整体烧录新固件。
4.2、Debian
它是一个完全由社区维护的通用操作系统,以坚如磐石的稳定性和庞大的软件仓库闻名。它只收录经过充分测试的自由软件。
用途:服务器、追求长期无故障运行的桌面。
特点:软件版本偏保守但极其可靠,是许多其他发行版(包括 Ubuntu)的“母版”。
4.3、Ubuntu
它基于 Debian 的不稳定分支构建,由 Canonical 公司主导,目标是降低 Linux 的使用门槛,提供更现代的桌面体验和更新的软件。
用途:个人电脑、云服务器、人工智能开发环境。
特点:界面友好,软件版本新,对硬件驱动支持更好。分为每半年一版的常规版和每两年一版的长期支持版 (LTS)。
| 对比维度 | Buildroot | Debian | Ubuntu |
|---|---|---|---|
| 本质 | 嵌入式系统构建工具 | 通用 Linux操作系统发行版 | 基于 Debian 的操作系统发行版 |
| 目标场景 | 极简嵌入式设备、IoT、工控 | 服务器、追求稳定的桌面、嵌入式(如树莓派) | 个人/企业桌面、云服务器、AI 开发 |
| 系统大小 | 极轻量,可做到几 MB | 基础安装约几百 MB起步 | 基础安装约几百 MB起步 |
| 软件获取 | 完全从源代码编译,精挑细选 | 使用庞大的二进制软件包仓库 (apt) | 使用庞大的二进制软件包仓库 (apt) |
| 包管理器 | 无。系统构建完成后是静态的。 | dpkg / apt,可随时安装、升级、删除软件 | dpkg / apt,同 Debian |
| 发布与维护 | 每 3 个月发布一次版本,持续滚动更新 | 不定期发布稳定版,维护周期长(约5年) | 定期发布,LTS 版维护 5-10 年 |
| 定制与复杂度 | 灵活度极高,但需要较多嵌入式 Linux 知识 | 通过包管理安装卸载,常规配置,上手相对简单 | 同 Debian,且提供更多自动化配置工具 |
5、M.2
M.2 是一种电脑内部的硬件接口规范,主要用来安装固态硬盘(SSD)和无线网卡。可以把它理解成一种新的、小巧的“插槽标准”,用来替代老旧的 mSATA 等接口。
5.1、显著特点:
体积很小:像一根口香糖,长条形,直接平插在主板上,非常适合轻薄笔记本和紧凑的迷你主机。
速度极快:M.2 接口最重要的优势是支持NVMe 协议,数据通过 PCIe 通道(类似显卡用的高速通道)传输,速度可达几千 MB/s,是传统 SATA 固态硬盘的好几倍。
一槽两用,需要留意:M.2 插槽既可以走SATA 通道,也可以走PCIe 通道(支持 NVMe)。
M.2 SATA SSD:速度跟普通 2.5 寸固态一样(约 550MB/s),价格便宜。
M.2 NVMe SSD:速度极快(可达 7000MB/s+),是目前的主流。
外观上可能一样,但插槽协议可能不同,购买时一定要看清主板 M.2 插槽和硬盘都支持哪种协议。
5.2、常见形态与用途
最常见的尺寸是2280(宽22mm,长80mm)。除了 SSD,M.2 接口也常用于安装 Wi-Fi/蓝牙无线网卡(尺寸更小,通常为 2230)。很多工业主板或树莓派 CM4 的扩展底板上,也会用 M.2 槽来挂载硬盘或 AI 算力卡。
6、GPIO
#输出 # 设置 GPIO0_D1 输出高电平状态 gpioset gpiochip0 25=1 # 设置 GPIO0_D1 输出低电平状态 gpioset gpiochip0 25=0 #输入 # 获取 GPIO0_D1 输入电平状态 gpioget gpiochip0 25其中25是GPIO序号
然后用万用表测gpio电平
7、串口通信
7.1、UART
UART 不是一种硬件,而是一种通信约定,它解决的是“一个比特一个比特如何打包”的问题。
本质:一种异步串行通信协议,没有独立的时钟线,双方约定相同的波特率(如 9600、115200)。
数据帧格式(一帧数据):
起始位:未通信时总线保持高电平(空闲状态),要发送数据时,先拉低一个位宽,作为起始标志。
数据位:紧接起始位后,通常是5到9位,最低有效位(LSB)先发。最常见的是8位数据。
奇偶校验位(可选):用于简单检错。比如“偶校验”保证数据位加校验位中 1 的个数为偶数。接收方可以据此判断单比特错误。
停止位:数据发送完毕后,将总线拉高,维持 1、1.5 或 2 个位宽,表示本帧结束,同时让总线回到空闲状态,准备下一帧。
全双工:TX 和 RX 独立线路,可同时收发
注意:UART 是全双工(可同时收发),但它通常只需要 TX、RX、GND 三根线(无硬件流控时)。
7.2、TTL
当人们说“接个 TTL 串口”,指的是:直接使用 0V 和芯片供电电压(3.3V 或 5V)来表示 0 和 1 的 UART 信号。
电平标准(以 5V TTL 为例):
信号连接:单端信号,以公共地(GND)为参考。最少只需3 根线:TX(发送)、RX(接收)、GND(地)。带硬件流控时才需要 RTS/CTS。
致命弱点:
7.3、RS232
TTL 用 0V 和几伏的正电压来表示;RS232 用正负十几伏的电压来表示,而且逻辑是反的。
RS232 就是给两台设备之间,拉一根“专用电话线”,只能你和我通话,距离不远,但够直接。
工作方式:
它用电线上的电压高低来表示 0 和 1。比如电压是正的(+几伏)表示 0,电压是负的(-几伏)表示 1。
这就像两个人拿对讲机,按下说话时灯亮(代表 0),松开时灯灭(代表 1),对方看灯就知道你在说什么,很简单直接。
特点:
| 比较点 | TTL 串口 | RS232 串口 |
|---|---|---|
| 电压 | 0V ~ 3.3V 或 0V ~ 5V | +3V 到 +15V和-3V 到 -15V(常见 ±12V) |
| 逻辑定义 | 0V 左右 = 逻辑0Vcc(3.3V/5V)= 逻辑 1 | 正电压(+3V ~ +15V)= 逻辑0负电压(-3V ~ -15V)= 逻辑 1(注意是反的) |
| 空闲状态 | 高电平(Vcc) | 负电压(逻辑1) |
| 连接线 | TX, RX, GND(最少3根) | TX, RX, GND(DB9头里常用2,3,5脚) |
| 距离 | 板级,几厘米到几十厘米 | 可达15米左右 |
| 抗干扰 | 差,因为电压低且单端对地 | 稍好,因为电压摆幅大 |
| 能否直连 | 绝对不能直接连 RS232,会烧毁芯片 | 必须通过MAX232 之类芯片转换才能接 TTL 设备 |
| 典型场景 | 单片机连接蓝牙模块、GPS模块、串口屏 | 电脑背后老式 COM 口连调制解调器、工控仪表 |
7.4、RS485
RS485 就是给一群设备拉一根“公共广播线”,大家都能接在这条线上,轮流说话,传得远,抗干扰强。
它没有固定形状的接头,通常就是两根普通的双绞线(像网线里面那种两根拧在一起的线),一红一黑或者标着A 和 B。
工作方式:
它不靠电压的绝对值,而是靠两根线之间的电压差来表示 0 和 1。就像跷跷板:
这样做的好处:假设外面有电磁干扰,两根线靠得很近又拧在一起,受到的干扰几乎一样,差值却基本不变,所以不容易出错。这就是它抗干扰强、能传很远的秘密。
特点:
如何给特定设备发信息:
所有设备都在静默“监听” -> 主机发出“寻址呼叫” -> 从机“对号入座”,只有被点名的才应答 -> 目标从机接管总线,做出回应
7.5、Modbus
Modbus 是一种主从架构的通信协议,主要用于工业设备之间交换数据。它规定了数据怎么打包、谁问谁答、问的格式是什么
Modbus 的核心规则:
一条总线上只有一个主机(主设备,比如 PLC 或电脑),其他都是从机(从设备,比如传感器、仪表)。从机从不主动说话,只有主机点到它的地址,它才能回答。
数据打包格式:
功能码决定了“干什么”:
8、GDB
GDB(GNU Debugger)是 Linux/Unix 下最常用的命令行调试器,用于调试 C/C++ 程序。它可以让你在程序运行时暂停、查看变量、设置断点、单步执行、查看调用栈等,是排查崩溃、逻辑错误、内存泄漏的核心工具。
| 指令(简写) | 作用 |
|---|---|
gdb ./program | 启动 GDB 并加载程序 |
gdb ./program core | 调试 core dump 文件 |
run(r) | 运行程序 |
break main(b main) | 在main函数设置断点 |
break file.c:50 | 在 file.c 的第 50 行设置断点 |
continue(c) | 继续执行,直到下一个断点 |
next(n) | 单步执行(不进入函数内部) |
step(s) | 单步执行(会进入函数内部) |
print var(p var) | 打印变量var的值 |
info locals(i loc) | 显示当前函数的局部变量 |
backtrace(bt) | 查看函数调用栈 |
frame n(f n) | 切换到栈帧 n(0 为当前) |
list(l) | 显示当前附近的源代码 |
quit(q) | 退出 GDB |
