Skip to content
Yuxiang Zhang edited this page Oct 27, 2017 · 6 revisions

背景

U-Boot是一个启动引导程序,常见于嵌入式系统中,用于引导Linux等操作系统。在Thinpad教学实验板上,设计MIPS处理器运行U-Boot引导程序,可以支持从Flash、U盘、网络等来源加载Linux、uCore系统镜像并引导。

在实践中,U-Boot通常作为二级引导程序,放置在外部存储设备中。CPU复位后首先执行一级引导程序(BIOS),一级引导程序将U-Boot复制到内存后,跳转到U-Boot入口地址,U-Boot开始运行。

由于U-Boot本身有较强的命令行功能和交互能力,它也可以作为一个硬件测试与演示的工具。

硬件要求

U-Boot不使用MIPS的中断和TLB机制,因此硬件可以不需要实现这些机制。对于其它的异常,仅仅在程序运行不正常时才会发生,如果假定程序能正常运行,异常处理也不用实现。

本移植版本使用到了Thinpad上大部分的硬件外设,这些外设的物理地址映射如下:

  • 8MB RAM 起始地址 0x0,长度 0x800000
  • 8MB Flash 起始地址 0x1e000000,长度 0x800000
  • 串口控制器 起始地址 0x1fd003f8,长度 0x8
  • USB SL811 寄存器选择地址 0x1c020000,数据地址 0x1c020004
  • Ethernet DM9K 寄存器选择地址 0x1c020100,数据地址 0x1c020104

相关硬件信息硬编码在dts和config头文件中(参见后文的描述)。

开发环境

U-Boot主要开发工具为GCC交叉编译工具链,包括GCC及Binutls。在开发时我们使用了Ubuntu 16.04操作系统提供的软件包“gcc-mipsel-linux-gnu”和“binutils-mipsel-linux-gnu”。其他版本的Linux发行版提供的MIPS工具链,或者自行编译的工具链原则上也可以使用。

构建方法

下载完整源代码,进入顶层目录,用如下命令选择默认的构建配置选项并构建U-Boot。

make CROSS_COMPILE=mipsel-linux-gnu- naivemips_thinpad_defconfig
make CROSS_COMPILE=mipsel-linux-gnu- 

在构建成功完成后,顶层目录中会生成 u-boot 文件,即为ELF格式的U-Boot程序,该文件可以被一级引导程序加载到内存中运行。

移植过程简述

为便于使用者深入了解u-boot与硬件平台间的关系,我们在本节简要介绍移植过程。

我们选用U-Boot 2017.7版本作为基础,以NaiveMIPS为例添加芯片和板级支持代码。移植选用的源代码来源于U-Boot主线 https://github.com/u-boot/u-boot 。主要的移植步骤如下:

添加SoC平台

在源码树的arch/mips目录下面是整个MIPS平台的支持代码,我们需要向其中添加一款新的芯片,即NaiveMIPS。这主要涉及到修改或添加几个文件。

  • arch/mips/Kconfig 添加MACH_NAIVEMIPS选项,描述平台的基本特征
  • arch/mips/Makefile 针对NaiveMIPS平台的特定编译选项
  • arch/mips/mach-naivemips/Kconfig NaiveMIPS支持的电路板列表

NaiveMIPS处理器与MIPS32 Release1 规范最接近,因此我们在MACH_NAIVEMIPS选项中添加select SUPPORTS_CPU_MIPS32_R1,从而复用U-Boot中对于MIPS32规范已有的实现代码。

同时由于指令实现上的差异,在编译选项中,针对本平台添加-mno-branch-likely-mdivide-breaks,这是为了避免产生未实现的Branch Likely和TEQ指令。

添加板级描述

在新的SoC平台基础上进一步增加使用该平台的电路板描述和外设驱动描述。以大赛实验箱平台为例,该步骤主要涉及到修改或添加几个文件。

  • arch/mips/mach-naivemips/Kconfig 平台支持的电路板列表中添加TARGET_NAIVEMIPS_THINPAD
  • board/thucst/Kconfig 实验板的基本信息描述
  • board/thucst/thinpad/ 新建实验板的代码目录
  • board/thucst/thinpad/Makefile 实验板的代码编译控制文件
  • board/thucst/thinpad/naivemips_thinpad.c 实验板初始化代码
  • arch/mips/dts/naivemips_thinpad.dts 实验板设备树文件
  • include/configs/naivemips_thinpad.h 实验板配置类宏定义
  • configs/naivemips_thinpad_defconfig 实验板默认配置
  • drivers/serial/serial_naivemips.c 串口控制器驱动

当用户在构建时,通过make menuconfig工具选择实验板时,board/thucst/thinpad 目录下面相关的代码将被编译,成为板级支持代码,负责电路板相关的初始化工作(如探测内存大小)。由于实验板比较简单,初始化函数基本为留空。

dts设备树文件 arch/mips/dts/naivemips_thinpad.dts 和config头文件 include/configs/naivemips_thinpad.h 中的宏定义,共同提供了电路板具体的硬件信息。这些信息包括外设的型号、地址映射、中断连接及存储空间等。头文件中还包含默认的U-Boot环境变量,利用这些环境变量可以实现自动启动等功能,避免每次上电都要求用户手工输入启动命令。

由于U-Boot具有高度的可裁剪性,内部大多数功能模块都可以在构建时通过menuconfig工具进行选择。我们将最适合本实验板的选项保存到configs/naivemips_thinpad_defconfig中,便于新用户快速完成构建工作。

Clone this wiki locally