保姆级教程:在Ubuntu 22.04上为新唐NUC980编译5.10.y内核与根文件系统(含SD卡分区避坑指南)

📅 2026/7/30 8:27:19 👁️ 阅读次数 📝 编程学习
保姆级教程:在Ubuntu 22.04上为新唐NUC980编译5.10.y内核与根文件系统(含SD卡分区避坑指南)

从零构建NUC980嵌入式系统:Ubuntu 22.04环境下的内核编译与SD卡部署实战

当一块崭新的NUC980开发板摆在面前,许多嵌入式开发者面临的第一个挑战往往是如何搭建完整的开发环境。本文将手把手带你完成从Ubuntu系统配置到最终系统烧录的全流程,特别针对5.10.y内核版本和SD卡部署中的常见陷阱提供解决方案。

1. 开发环境准备与基础配置

在VirtualBox中安装Ubuntu 22.04时,建议分配至少40GB磁盘空间和4GB内存。安装完成后,首先需要更新软件源并安装基础开发工具:

sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git make gcc

关键依赖库安装(避免后续编译错误):

sudo apt install -y libusb-1.0-0-dev zlib1g-dev pkg-config \ python3-dev swig libncurses5-dev libssl-dev \ u-boot-tools flex bison

对于国内用户,建议更换apt源以提高下载速度:

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

2. 构建交叉编译工具链

我们将使用Buildroot 2023.02来生成工具链和根文件系统。这是目前最稳定兼容NUC980的版本组合。

mkdir ~/nuc980-sdk && cd ~/nuc980-sdk wget https://buildroot.org/downloads/buildroot-2023.02.tar.xz tar -xJf buildroot-2023.02.tar.xz

配置Buildroot时需要注意以下关键选项:

配置项推荐值说明
Target ArchitectureARM (little endian)必须匹配NUC980架构
Target Binary FormatELF标准格式
Target Architecture Variantcortex-a9NUC980处理器核心
Toolchain typeBuildroot toolchain自包含工具链

配置完成后执行编译:

cd buildroot-2023.02 make menuconfig make -j$(nproc)

提示:编译过程可能持续30-60分钟,期间可以准备其他工作。完成后工具链路径为output/host/bin/

3. SD卡分区方案设计与实施

NUC980的SD卡布局有特殊要求,不当的分区会导致系统无法启动。推荐使用以下分区方案:

  1. 未分配空间:起始1MB(留给u-boot)
  2. boot分区:32MB FAT32(存放内核和设备树)
  3. rootfs分区:剩余全部空间EXT4

使用fdisk进行分区的具体命令序列:

sudo fdisk /dev/sdX # 在fdisk交互界面依次输入: # o (创建新DOS分区表) # n (新建分区1,起始扇区2048,大小+32M) # t (设置类型为c,即FAT32) # n (新建分区2,使用默认起始扇区,大小可留空表示剩余全部空间) # w (写入并退出)

格式化分区时需特别注意:

sudo mkfs.vfat -F 32 -n boot /dev/sdX1 sudo mkfs.ext4 -L rootfs /dev/sdX2

4. U-Boot编译与烧录技巧

获取官方U-Boot源码并切换到适配分支:

git clone --depth=1 -b nuc980 https://github.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git cd NUC970_U-Boot_v2016.11

关键配置修改点:

  • include/configs/nuc980_evb.h中启用SD卡支持:
    #define CONFIG_ENV_IS_IN_MMC #define CONFIG_SYS_MMC_ENV_DEV 0
  • 确保设备树支持已启用(5.10.y内核必需)

编译命令:

export PATH=$PATH:~/nuc980-sdk/buildroot-2023.02/output/host/bin make nuc980_defconfig make -j$(nproc)

烧录u-boot时需要特别注意开发板启动模式设置:

  1. 将PG[1:0]跳线设为00(SPI启动模式)
  2. 使用NuWriter工具烧录生成的u-boot.bin
  3. 烧录完成后改回01(SD卡启动模式)

5. Linux内核定制化编译

获取官方内核源码:

git clone --depth=1 -b nuc980-5.10.y https://github.com/OpenNuvoton/NUC980-linux-5.10.y.git cd NUC980-linux-5.10.y

关键配置步骤:

  1. 应用默认配置:make nuc980_defconfig
  2. 在menuconfig中确保以下选项启用:
    • Device Drivers -> MMC/SD/SDIO support
    • File systems -> EXT4 filesystem support
    • Kernel Features -> Use the ARM EABI to compile the kernel

设备树修改重点:

sdh@b0018000 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sdh0>; };

编译命令:

make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabi- uImage dtbs -j$(nproc)

6. 系统部署与调试技巧

将编译产物拷贝到SD卡:

sudo cp arch/arm/boot/uImage /media/$USER/boot/ sudo cp arch/arm/boot/dts/nuc980-*.dtb /media/$USER/boot/ sudo tar -xf ~/nuc980-sdk/buildroot-2023.02/output/images/rootfs.tar -C /media/$USER/rootfs/

常见启动问题排查:

  • U-Boot不加载:检查PG跳线设置和烧录模式
  • 内核panic:确认设备树文件与硬件版本匹配
  • 根文件系统挂载失败:检查内核EXT4驱动是否启用
  • 串口无输出:确认开发板串口跳线设置

在项目实践中,我发现最常出错的环节是SD卡分区顺序和文件系统类型设置。有一次因为误将boot分区格式化为EXT4,导致系统无法启动,花费数小时才定位到这个简单问题。建议在每次分区操作后使用lsblk -f命令确认分区类型是否正确。