(二)系统移植之uboot

我只是一个虾纸丫 提交于 2020-02-27 09:26:21
  • BootLoader:嵌入式系统从开始上电到系统启动需要一个引导过程,这个引导程序就叫作启动加载程序,即BootLoader。它在操作系统运行之前运行,它负责初始化硬件设备,建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。最常用的一种就是uboot。
  • uboot的配置编译:uboot的编译是基于GNU Makefile组织编译的,顶层的Makefile完成对开发板整体配置,然后递归调用各级子目录下的Makefile,最后把所有编译过的程序链接成u-boot映像。 具体的配置流程:
  1. 解压uboot源码:"$ tar -xvf u-boot-2013.01.tar.bz2"
  2. 修改顶层的Makefile(改为自己交叉编译工具链):ifeq (arm, $(ARCH)) CROSS_COMPILE ?= /opt/arm-linux-gcc-4.8.3/bin/arm-none-linux-gnueabi-
  3. 进入源码目录,并配置:"$make exynos4412_config"
  4. 编译:make 编译好的uboot就可以烧写到开发板中。
  • 串口调试命令:uboot烧写好后,还需要串口调试设置相关环境变量,主要有:
    1. 设置内核启动参数:setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200init=/linuxrc ip=192.168.9.233
    2. 自启动命令:bootcmd=自启动命令1;自启动命令2; ...(U-BOOT是单任务的裸机代码,不支持多任务,如果需要多个命令自启动,需要用命令分隔符“;”,按次序顺序执行:)setenv bootcmd tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
    3. 删除环境变量:$ setenv 变量
    4. 保存环境变量:$ saveenv
  • uboot 的启动分析:uboot的启动流程是指从开机上电执行uboot到uboot加载操作系统的过程。可分为2个阶段
    1. 第一阶段功能:硬件设备初始化,加载uboot第二阶段代码到RAM中,设置好栈,跳转到第二阶段的代码入口。入口代码start.S
    2. 设置异常向量表
    3. 设置CPU的工作模式为系统模式,屏蔽中断。
    4. 设置控制寄存器地址
    5. 关闭看门狗
    6. 设置时钟
    7. 关闭MMU和Cache
    8. 初始化存储控制器:lowlevel_init
    9. 第二阶段:复制uboot到RAM
      1. 设置栈:栈是执行C程序的必要条件,因此进入C语言实现的初始化代码前,需要通过汇编进行栈的初始化。
      2. 清除BSS段
      3. 跳转到第二阶段代码入口
      4. 板级相关的初始化:board_init
      5. 时钟初始化:timer_init
      6. 环境变量初始化:env_init
      7. 串口、控制台初始化:init_baudrate,serial_init、console_init_f
      8. 配置内存:dram_init
      9. NORFlash初始化:flash_init
      10. Nand Flash初始化
      11. 调用main_loop
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!