SSD202D开发实战:东山Pi壹号开发板内核编译与烧录全解析
第一次拿到东山Pi壹号开发板时,看着那块小巧的板子和密密麻麻的接口,我意识到这将是一场硬仗。作为一款基于星宸科技SSD202D芯片的嵌入式开发平台,它兼具性价比与扩展性,但真正要让它跑起来,内核编译与烧录才是真正的门槛。本文将从实战角度,带你完整走通从源码到NAND Flash的全流程,避开那些我踩过的坑。
1. 开发环境与工具链配置
在开始内核编译之前,确保你的Ubuntu 18.04环境已经准备就绪。我强烈建议使用阿里云镜像源加速软件包下载:
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update安装必要的编译工具链和依赖库时,以下这个组合经过多次验证最为稳定:
sudo apt-get install -y libc6-dev-i386 lib32z1 lib32ncurses5 \ libuuid1:i386 cmake libncurses5-dev libncursesw5-dev \ bc xz-utils automake libtool libevdev-dev \ pkg-config openssh-server repo关键工具版本检查:
- gcc:
gcc --version≥ 7.5.0 - make:
make --version≥ 4.1 - repo:
repo --version≥ 2.0
注意:32位兼容库(lib32*)在64位系统上必不可少,缺少它们会导致工具链运行异常
2. 源码获取与SDK结构解析
星宸科技的SDK采用repo工具管理多个git仓库,这是Android开发中常见的方式。首先获取repo工具本身:
git clone https://e.coding.net/codebug8/repo.git mkdir DongshanPiOne-TAKOYAKI && cd DongshanPiOne-TAKOYAKI ../repo/repo init -u https://gitee.com/weidongshan/manifests.git \ -b linux-sdk -m SSD202D/dongshanpi-one_takoyaki_dlc00v030.xml \ --no-repo-verify ../repo/repo sync -j4成功同步后,目录结构应包含以下关键部分:
DongshanPiOne-TAKOYAKI/ ├── gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf # 交叉编译工具链 ├── kernel # Linux内核源码 ├── uboot # U-Boot源码 ├── out # 编译输出目录 └── project # 板级支持包(BSP)将工具链加入PATH环境变量时,建议在~/.bashrc中添加:
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export PATH=$PATH:$(pwd)/gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf/bin验证工具链是否生效:
arm-linux-gnueabihf-gcc -v预期输出应显示gcc version 8.2.0
3. 内核配置与编译实战
东山Pi壹号开发板使用定制的Linux 4.9.84内核,针对SPI NAND Flash做了特殊适配。进入内核目录:
cd DongshanPiOne-TAKOYAKI/kernel3.1 配置内核选项
开发板提供了预置的defconfig文件,位于arch/arm/configs/目录。对于东山Pi壹号,正确的配置是:
make infinity2m_spinand_ssc011a_s01a_minigui_defconfig这个配置文件中已经预设了:
- SPI NAND Flash控制器驱动
- 显示子系统支持
- 视频编解码模块
- 关键外设驱动
如果需要调整配置,可以使用menuconfig界面:
make menuconfig提示:在menuconfig中,按'/'键可以搜索配置选项,例如要查找USB相关配置,输入
/usb
3.2 内核编译与产物分析
开始编译内核镜像:
make -j$(nproc) 2>&1 | tee build.log编译过程中几个关键阶段输出解读:
- 配置检查阶段:验证工具链和依赖是否完整
- vmlinux生成:生成未压缩的原始内核镜像
- 设备树编译:将.dts文件编译为.dtb二进制
- uImage打包:生成可被U-Boot加载的镜像
编译完成后,关键产物位于:
arch/arm/boot/uImage.xz:压缩后的内核镜像arch/arm/boot/dts/infinity2m-spinand-ssc011a-s01a.dtb:设备树二进制
使用file命令验证uImage.xz:
file arch/arm/boot/uImage.xz预期输出应包含:"U-Boot legacy uImage"和"Linux Kernel Image"
4. U-Boot烧录全流程
4.1 准备SD卡与镜像文件
将编译好的内核镜像拷贝到SD卡FAT32分区:
cp arch/arm/boot/uImage.xz /media/$USER/BOOT/ syncSD卡插入开发板后,在U-Boot命令行中检查设备:
mmc list正常应显示类似"SD: 0"的输出
4.2 U-Boot命令详解
完整的烧录流程涉及以下关键命令:
加载镜像到内存:
fatload mmc 0:1 0x21000000 uImage.xzmmc 0:1:SD卡第一个分区0x21000000:DDR内存加载地址uImage.xz:镜像文件名
擦除NAND Flash分区:
nand erase.part KERNEL nand erase.part RECOVERYKERNEL和RECOVERY是预定义的分区名称,对应不同的启动选项
写入镜像到Flash:
nand write.e 0x21000000 KERNEL ${filesize} nand write.e 0x21000000 RECOVERY ${filesize}${filesize}:自动获取加载文件的大小.e后缀表示启用ECC校验
4.3 常见错误排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| "mmc device 0 not found" | SD卡未正确插入 | 检查物理连接,重新插拔 |
| "nand: device not found" | NAND驱动未加载 | 确认U-Boot配置支持SPI NAND |
| "Bad Magic Number" | 镜像损坏 | 重新编译并拷贝uImage.xz |
| Write timeout | Flash区块损坏 | 尝试擦除更大区域 |
重要:执行nand write前务必先erase,否则可能导致写入不完整
5. 启动验证与调试技巧
烧录完成后,使用reset命令重启开发板。观察串口输出,关键启动阶段包括:
- U-Boot阶段:显示版本信息和启动参数
- 内核解压:显示"Uncompressing Linux..."
- 设备树加载:显示"Loading Device Tree..."
- 内核启动:开始打印内核日志
如果启动卡住,可以尝试以下调试手段:
在U-Boot中检查环境变量:
printenv确认
bootargs和bootcmd设置正确强制进入恢复模式:
setenv bootcmd "nand read.e 0x21000000 RECOVERY; bootm 0x21000000" saveenv reset检查内核日志等级:
setenv bootargs console=ttyS0,115200 earlyprintk debug
在实际项目中,我发现将内核日志级别设置为debug(在menuconfig中修改CONFIG_LOGLEVEL)能极大方便驱动调试。同时,使用klogd和syslogd工具可以将内核日志持久化到Flash中,便于后期分析。
开发板上的LED也可以作为调试辅助,通过sysfs接口控制:
echo 1 > /sys/class/leds/blue/brightness echo 0 > /sys/class/leds/green/brightness这些看似简单的技巧,在排查启动问题时往往能起到关键作用。记得在最终产品中关闭调试输出以提高性能。