请选择 进入手机版 | 继续访问电脑版
电路城论坛交流群:579145816
查看: 83|回复: 1

[进行中] 从零开始-uboot的移植-前期准备:uboot是如何启动倒数,启...

[复制链接]

签到天数: 33 天

[LV.5]正式坛友

发表于 2018-6-27 22:16:33 | 显示全部楼层 |阅读模式
前言:   
    在移植 uboot 的时候,最核心的工作是引导启动内核,那么uboot是如何进入倒数,启动内核的呢。

一,进入倒数,启动内核
    在 文件 common/main.c 中的 main_loop 函数有如下判断:
点击(此处)折叠或打开

  • s = getenv ("bootcmd");
  •     debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "");
  •     if (bootdelay >= 0 && s && !abortboot (bootdelay)) {


    char * s;
    则只有单 S != NULL 时,才有效


      在文件 common/env_common.c 中定义了如下数组:
点击(此处)折叠或打开

  • const uchar default_environment[] = {
  • #ifdef CONFIG_BOOTARGS
  •     "bootargs=" CONFIG_BOOTARGS "\0"
  • #endif
  • #ifdef CONFIG_BOOTCOMMAND
  •     "bootcmd=" CONFIG_BOOTCOMMAND "\0"
  • #endif
  • #ifdef CONFIG_RAMBOOTCOMMAND
  •     "ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
  • #endif
  • #ifdef CONFIG_NFSBOOTCOMMAND
  •     "nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
  • #endif
  • #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
  •     "bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
  • #endif
  • #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
  •     "baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"
  • #endif
  • #ifdef CONFIG_LOADS_ECHO
  •     "loads_echo=" MK_STR(CONFIG_LOADS_ECHO) "\0"
  • #endif
  • #ifdef CONFIG_ETHADDR
  •     "ethaddr=" MK_STR(CONFIG_ETHADDR) "\0"
  • #endif
  • #ifdef CONFIG_ETH1ADDR
  •     "eth1addr=" MK_STR(CONFIG_ETH1ADDR) "\0"
  • #endif
  • #ifdef CONFIG_ETH2ADDR
  •     "eth2addr=" MK_STR(CONFIG_ETH2ADDR) "\0"
  • #endif
  • #ifdef CONFIG_ETH3ADDR
  •     "eth3addr=" MK_STR(CONFIG_ETH3ADDR) "\0"
  • #endif
  • #ifdef CONFIG_ETH4ADDR
  •     "eth4addr=" MK_STR(CONFIG_ETH4ADDR) "\0"
  • #endif
  • #ifdef CONFIG_ETH5ADDR
  •     "eth5addr=" MK_STR(CONFIG_ETH5ADDR) "\0"
  • #endif
  • #ifdef CONFIG_IPADDR
  •     "ipaddr=" MK_STR(CONFIG_IPADDR) "\0"
  • #endif
  • #ifdef CONFIG_SERVERIP
  •     "serverip=" MK_STR(CONFIG_SERVERIP) "\0"
  • #endif
  • #ifdef CONFIG_SYS_AUTOLOAD
  •     "autoload=" CONFIG_SYS_AUTOLOAD "\0"
  • #endif
  • #ifdef CONFIG_PREBOOT
  •     "preboot=" CONFIG_PREBOOT "\0"
  • #endif
  • #ifdef CONFIG_ROOTPATH
  •     "rootpath=" CONFIG_ROOTPATH "\0"
  • #endif
  • #ifdef CONFIG_GATEWAYIP
  •     "gatewayip=" MK_STR(CONFIG_GATEWAYIP) "\0"
  • #endif
  • #ifdef CONFIG_NETMASK
  •     "netmask=" MK_STR(CONFIG_NETMASK) "\0"
  • #endif
  • #ifdef CONFIG_HOSTNAME
  •     "hostname=" MK_STR(CONFIG_HOSTNAME) "\0"
  • #endif
  • #ifdef CONFIG_BOOTFILE
  •     "bootfile=" CONFIG_BOOTFILE "\0"
  • #endif
  • #ifdef CONFIG_LOADADDR
  •     "loadaddr=" MK_STR(CONFIG_LOADADDR) "\0"
  • #endif
  • #ifdef CONFIG_CLOCKS_IN_MHZ
  •     "clocks_in_mhz=1\0"
  • #endif
  • #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
  •     "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY) "\0"
  • #endif
  • #ifdef CONFIG_EXTRA_ENV_SETTINGS
  •     CONFIG_EXTRA_ENV_SETTINGS
  • #endif
  •     "\0"
  • }



    因此,要在  include\configs下的相关板子 *.h 文件中添加如下
点击(此处)折叠或打开

  • /* uboot 启动之后,是根据以下参数来启动内核的
  • * 从nand flash 中读内核映像文件,
  • * 从nand 的 0x00060000 地址开始读到SDRAM 中,读的长度为0x200000
  • * 在从 SDRAM 中启动内核
  • *
  • * 如果不定义这个宏,uboot不会主动调整到内核的启动,
  • * 必须手动复制内核映像文件到sdram中,在用bootm命令来启动
  • */
  • #define    CONFIG_BOOTCOMMAND    "nand read 30000000 0x00060000 0x200000;bootm 30000000"



签到天数: 639 天

[LV.9]元老将成

发表于 2018-6-28 08:09:10 | 显示全部楼层
不错的文章
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


返回顶部