最近在学习altera的socfpga,写一下关于它的u-boot的学习心得。

关于altera的u-boot与linux的交叉编译环境可以在如下网页上查看:

http://www.alterawiki.com/wiki/Compiling_u-boot_and_Linux_Kernel_for_Cyclone_V_SoC

一、 u-boot编译环境的搭建:

下载编译软件: https://sourcery.mentor.com/GNUToolchain/package10928/public/arm-none-eabi/arm-2012.09-63-arm-none-eabi.bin
安装步骤如下:
1. sudo dpkg-reconfigure -plow dash //此步骤弹出对话框,要选择NO,即使用bash,不是dash
2. ls -lh /bin/sh //用来验证sh指向bash还是dash,应指向bash
3. sudo mkdir -p /usr/local/codebench_2012_09_63
4. sudo chown $USER.users /usr/local/codebench_2012_09_63/
5. echo "export PATH=/usr/local/codebench_2012_09_63/bin:\$PATH" >~/CodeBench_setup_linux.sh
6. /bin/sh arm-2012.09-63-arm-none-eabi.bin

二、u-boot安装编译下载步骤

从altera官方下载uboot原码 ftp://ftp.altera.com/outgoing/SoC_FPGA/ethernet_3.7/u-bootaltera-2012.10.tgz
1.tar xvzf u-boot-altera-2012.10.tgz  //Please make sure your PATH variable is set in the rightway so that thecompile tool armnone-eabi-gcc is available.
2. cd u-boot-altera-2012.10
3. export CROSS_COMPILE=arm-none-eabi-
4. ./MAKEALL socfpga_cyclone5

三、u-boot代码学习

3.1 socfpga芯片启动流程简介

socfpga的启动主要分为3步:首先执行片内ROM进行一般初始化,如一些外部载入设备的确定等基本信息,然后从外部存储器将preloader(u-boot-spl.bin)复制到片内RAM执行,执行完毕后将bootloader(u-boot.bin)从外部存储器复制到RAM中,跳转到uboot起始地址运行u-boot,u-boot将内核加载环境准备好后就复制内核映像到RAM中启动内核,u-boot使命完成。 uboot编译后自动会生成 uboot-spl.bin与u-boot.bin两个二进制文件。
socfpga的片内ROM固化了对nand flash,sd/mmc flash与spi flash的最基本支持。对于sd/mmc flash的支持是受限的,它不支持sd卡中有文件系统,支持两种方式MBR方式与RAW方式。由于固化的驱动不支持文件系统,因此在MBR模式下需要将存储preloader与bootloader的分区类型设置为0xA2,即无文件系统,芯片reset后选择SD/MMC启动方式(根据外部引脚电平设置选择),片内ROM经过简单初始化SD/MMC后,分别在MBR方式与RAW方式下去读取flash。若发现SD卡是MBR格式,则搜索类型为0xA2类型的分区,搜索到后读取该分区首地址开始的前64kB内容,即preloader,将其加载到片内RAM中,地址为0xFFFF0000,跳转到preloader的首地址,转移控制权,即PC指针指向了preloader。

3.2 u-boot代码启动流程简介

3.2.1 u-boot-spl启动流程

u-boot-spl代码与u-boot代码有很多是重合的。u-boot-spl的执行过程是start.s(位于/arch/arm/cpu/armv7/)——>board_init_f(位于/arch/arm/lib/board.c)——>board_init_r(位于/common/spl,完成环境变量、串口、DDR等初始化)——>spl_mmc_load_image(位于/drivers/mmc,这是从sd卡启动,从其他设备启动可以类推,将u-boot.bin加载到loadaddr地址)——>jump_to_image_no_args(位于/common/spl),跳转到u-boot的entypoint,一般与loadaddr相同。

3.2.2 u-boot启动流程

u-boot的启动流程也是从start.s开始,设置向量表等(位于/arch/arm/cpu/armv7/start.s)——>board_init_f(位于/arch/arm/lib/board.c)——>relocate_code(位于/arch/arm/cpu/armv7/start.s)——>board_init_r(位于/arch/arm/lib/board.c)——>main_loop (/common/main.c)——>run_command_list(位于/common/main.c)执行脚本命令“bootcmd”(/include/configs/socfpga_cyclone5.h中定义为"run mmcload; run mmcboot","run mmcload"与"run mmcboot"也定义在socfpga_cyclone5.h),内核开始加载并运行。



Logo

更多推荐