驱动 (一) Linux 系统移植
一、Linux 系统移植所需文件
- uboot:一段逻辑代码,核心功能为初始化硬件外设与加载内核,是系统启动的 “先行官”。
- zImage:承担着内存管理、任务管理、多任务间通信、网络管理以及文件系统管理等关键功能,是系统运行的核心软件。
- dtb(设备树文件):与内核配合使用,包含硬件信息,为内核识别硬件提供依据。
- rootfs(文件系统):实现与用户的交互,涵盖 shell 命令、库文件,且因 Linux 系统 “一切皆是文件”,它还能实现对设备的操作以及内核信息的查看。
二、IMX6ull SOC 资源
IMX6uLL - Mini 平台分为核心板(系统启动必备资源)和底板(外设资源)。
核心板包含:
- IMX6uLL 芯片:内部有 32K ICache(指令缓存)、32K DCache(数据缓存)、128K L2Cache(指令和数据缓存)、128K SRAM(初始化 DDR 前可使用的无需初始化的内存空间)、96k BotROM(厂家固化的启动代码)。
- DDR 芯片(512M):内存,掉电数据丢失,但读写速度快。
- EMMC 芯片(8G):EMMC 分为 EMMC0 和 EMMC1,其中一个是核心板上的 8G EMMC 芯片,另一个是底板 SD 卡(32G)对应的 EMMC。
三、IMX6uLL 启动方式
- USB 启动:驱动后,需通过 PC 经 USB 传输系统文件给开发板完成启动,适用于硬件平台无系统时的首次启动。
- SD 卡启动:系统烧录到 SD 卡后由 SD 卡启动,常用于平台代码开发调试或检测硬件平台好坏。
- EMMC 启动:系统烧录到 EMMC 后由 EMMC 启动,可实现开发板随系统自启动。
- NAND 启动:暂无法实现,即不能将系统烧录到 Nand Flash 并由其启动。
四、烧录方法
- Windows 下烧录到 SD 卡:使用 NXP 的 mfgtool 工具。
- Windows 下烧录到 EMMC。
- Ubuntu 下烧录到 SD 卡。
- Ubuntu 下烧录到 EMMC。
- tftp + nfs 网络启动:通过网络传输文件实现启动。
五、IMX6uLL 启动流程
- 上电启动,执行 0x0 处的代码,经中断向量表进入复位异常,跳转至对应函数启动。
- 执行 IMX6ull 内部 96k 的 BotROM 代码:完成 CPU 信息校验;查看启动方式;依据启动方式寻找可执行代码(IVT + BOOT DATA [uboot.bin] + DCD [DDR 寄存器信息]);BotROM 代码找到 DCD 并初始化 DDR;将 uboot.bin 拷贝到 DDR 中运行。
- uboot 阶段:重新设置中断向量表位置(借助协处理器 CP15);初始化串口、网口、EMMC 等硬件外设;加载引导内核启动:uboot 自搬移以腾出内存空间;从 EMMC 查找 zImage 和 DTB 文件(或通过 tftp 从服务器下载)并加载到 DDR;通过 bootz 命令启动内核 zImage;uboot 将文件系统相关参数 bootargs 写入设备树的 choosen 节点;uboot 向内存传参(r0 为固定值、r1 为 CPU ID 号、r2 为设备树内存地址);内核根据设备树信息重新初始化外设;内核找到 choosen 节点查找文件系统位置;内核引导启动文件系统中的内核进程,通过 fork + exec 启动其余所有进程任务,其中包含 shell 终端进程;最终系统启动完成,进入人机交互界面。
六、uboot
功能
- 初始化硬件外设。
- 引导启动内核。
工作流程
初始化 i2c、DDR、EMMC、Serial、Net 等;进入人机交互环节:用户输入回车可进入 uboot 系统并输入命令交互;若用户不输入回车,uboot 会执行 bootcmd。
重点问题
- Linux 系统移植所需文件及作用:前文 “一、Linux 系统移植所需文件” 已详细说明。
- Linux 系统启动流程:前文 “五、IMX6uLL 启动流程” 已详细阐述。
- uboot 中 bootcmd 和 bootargs 的含义:bootcmd 是 uboot 默认执行的命令,用于自动引导系统;bootargs 是传递给内核的参数,包含文件系统等相关信息,帮助内核找到并挂载文件系统。