东山Pi壹号开发板SSD202D内核编译烧录全流程:从`make defconfig`到uboot命令
2026/6/8 10:01:38 网站建设 项目流程

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/kernel

3.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

编译过程中几个关键阶段输出解读:

  1. 配置检查阶段:验证工具链和依赖是否完整
  2. vmlinux生成:生成未压缩的原始内核镜像
  3. 设备树编译:将.dts文件编译为.dtb二进制
  4. 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/ sync

SD卡插入开发板后,在U-Boot命令行中检查设备:

mmc list

正常应显示类似"SD: 0"的输出

4.2 U-Boot命令详解

完整的烧录流程涉及以下关键命令:

  1. 加载镜像到内存

    fatload mmc 0:1 0x21000000 uImage.xz
    • mmc 0:1:SD卡第一个分区
    • 0x21000000:DDR内存加载地址
    • uImage.xz:镜像文件名
  2. 擦除NAND Flash分区

    nand erase.part KERNEL nand erase.part RECOVERY

    KERNEL和RECOVERY是预定义的分区名称,对应不同的启动选项

  3. 写入镜像到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 timeoutFlash区块损坏尝试擦除更大区域

重要:执行nand write前务必先erase,否则可能导致写入不完整

5. 启动验证与调试技巧

烧录完成后,使用reset命令重启开发板。观察串口输出,关键启动阶段包括:

  1. U-Boot阶段:显示版本信息和启动参数
  2. 内核解压:显示"Uncompressing Linux..."
  3. 设备树加载:显示"Loading Device Tree..."
  4. 内核启动:开始打印内核日志

如果启动卡住,可以尝试以下调试手段:

  • 在U-Boot中检查环境变量:

    printenv

    确认bootargsbootcmd设置正确

  • 强制进入恢复模式:

    setenv bootcmd "nand read.e 0x21000000 RECOVERY; bootm 0x21000000" saveenv reset
  • 检查内核日志等级:

    setenv bootargs console=ttyS0,115200 earlyprintk debug

在实际项目中,我发现将内核日志级别设置为debug(在menuconfig中修改CONFIG_LOGLEVEL)能极大方便驱动调试。同时,使用klogdsyslogd工具可以将内核日志持久化到Flash中,便于后期分析。

开发板上的LED也可以作为调试辅助,通过sysfs接口控制:

echo 1 > /sys/class/leds/blue/brightness echo 0 > /sys/class/leds/green/brightness

这些看似简单的技巧,在排查启动问题时往往能起到关键作用。记得在最终产品中关闭调试输出以提高性能。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询