u-boot第二阶段之start_armboot()函数

原创 2012年03月29日 20:13:10
1、#ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */
ulong gd_base;


gd_base = CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE - sizeof(gd_t);
#ifdef CONFIG_USE_IRQ
gd_base -= (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ);
#endif
gd = (gd_t*)gd_base;
#else
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
#endif


/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory");


memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));

memset (gd->bd, 0, sizeof (bd_t));

为gd_t和bd_t结构体分配内存并初始化


2、调用通用初始化函数 

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { 


           if ((*init_fnc_ptr)() != 0) { 
                hang (); 
           } 


      } 
init_sequence[]是init_fnc_t 函数指针数组,这个数组包含了众多初始化函数,比如cpu_init, 
board_init 等。 


                  //init_fnc_t *init_sequence[] = { 


                      //   cpu_init,        /* basic cpu dependent setup */ 


                      //   board_init,         /* basic board dependent setup */ 


                     //    interrupt_init,        /* set up exceptions */ 


                     //    env_init,        /* initialize environment */ 


                      //   init_baudrate,         /* initialze baudrate settings */ 


                    //     serial_init,       /* serial communications setup */ 


                    //     display_banner, 


                    //     dram_init,         /* configure available RAM banks */ 


                    //     display_dram_config, 


                    //     NULL, 


                    //     }; 

3、具体设备初始化

#ifndef CFG_NO_FLASH
/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);
#endif /* CFG_NO_FLASH */


#ifdef CONFIG_VFD
# ifndef PAGE_SIZE
#  define PAGE_SIZE 4096
# endif
/*
* reserve memory for VFD display (always full pages)
*/
/* bss_end is defined in the board-specific linker script */
addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
size = vfd_setmem (addr);
gd->fb_base = addr;
#endif /* CONFIG_VFD */


#ifdef CONFIG_LCD
# ifndef PAGE_SIZE
#  define PAGE_SIZE 4096
# endif
/*
* reserve memory for LCD display (always full pages)
*/
/* bss_end is defined in the board-specific linker script */
addr = (_bss_end + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
size = lcd_setmem (addr);
gd->fb_base = addr;
#endif /* CONFIG_LCD */


/* armboot_start is defined in the board-specific linker script */
#ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */
mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE);
#else
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);
#endif


#if defined(CONFIG_SMDK6400) || defined(CONFIG_SMDK6410) || defined(CONFIG_SMDK6430) || defined(CONFIG_SMDK2450) || defined(CONFIG_SMDK2416)


   #if defined(CONFIG_NAND)
    puts ("NAND:    ");
    nand_init(); /* go init the NAND */
   #endif
    
    #if defined(CONFIG_ONENAND)
    puts ("OneNAND: ");
    onenand_init(); /* go init the One-NAND */
    #endif
    
    #if defined(CONFIG_BOOT_MOVINAND)
    puts ("SD/MMC:  ");
    
    if ((0x24564236 == magic[0]) && (0x20764316 == magic[1])) {
    printf("Boot up for burning\n");
    } else {
    movi_set_capacity();
    movi_set_ofs(MOVI_TOTAL_BLKCNT);
    movi_init();
    }
    #endif


#else


  #if (CONFIG_COMMANDS & CFG_CMD_NAND)
  puts ("NAND:    ");
  nand_init(); /* go init the NAND */
  #endif


#endif

4、环境变量初始化



环境变量在通用初始化函数里面,已经初始化一次(env_init ),这里调用env_relocate 对环 

境变量进行重新定位。


/* initialize environment */
env_relocate ();

5、进入主循环

/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
}

版权声明:原创文章,请注明出处。

U-Boot系列之四: start_armboot()函数分析

在上一篇文章中,我们介绍了u-boot启动的时候汇编语言的部分,当时我们进行了一些简单的初始化,并且为C语言的执行建立的环境(堆栈),现在我们看 看当从汇编语言转到C语言的时候执行的第一个函数( s...
  • liangkaiming
  • liangkaiming
  • 2010年10月22日 17:30
  • 2426

uboot第2阶段分析 start_armboot

通过前面的分析,知道第2阶段代码主要是start_armboot,首先我们先介绍几个比较重要的结构体。这里主要是对start_armboot中的流程做具体的分析,我的uboot-2009-06.至于具...
  • fangbing007
  • fangbing007
  • 2009年10月03日 01:06
  • 4805

U-Boot启动第二阶段代码

U-Boot第一阶段的启动流程。(nandflash启动,把nand的4k代码考到sram中,因为nand没址线,不能映射到内存,所以通过sram进行过度,sram中4k代码把整个uboot拷贝到sd...
  • u010979030
  • u010979030
  • 2013年12月18日 10:35
  • 1069

u-boot第二阶段board.c分析

针对s3c2440 u-boot-1.1.6 u-boot第一阶段主要就是:关闭看门狗,关中断,初始化存储器,初始化nand,u-boot代码的重定位。 u-boot第二阶段的主要任务:初始化网口、...
  • hongwazi_2010
  • hongwazi_2010
  • 2013年08月02日 19:24
  • 1146

u-boot第二阶段启动流程分析

第一阶段的初始化结束后进入start_armboot函数,也就是进入第二阶段的初始化。下面来分析第二阶段的主要流程。 在此之前,我们先来明确u-boot的目标,u-boot要做的事情是1、把内核中fl...
  • Stephen_Lu_Fahai
  • Stephen_Lu_Fahai
  • 2017年04月11日 11:26
  • 192

U-Boot 第二阶段代码分析

文章转自http://blog.csdn.net/zzsfqiuyigui/article/details/8453919 uboot第一阶段分析完毕,根据第一阶段最后的分析,程序跳转到了ra...
  • manchestermi
  • manchestermi
  • 2015年08月23日 15:29
  • 315

回味经典——uboot1.1.6 之 第二阶段 第三阶段

第一阶段:http://blog.csdn.net/lizuobin2/article/details/52054293     上篇文章说到,再清 BSS 段之后,CPU 跳转到 sdram 里...
  • lizuobin2
  • lizuobin2
  • 2016年07月29日 14:10
  • 1334

u-boot中代码的疑问(_armboot_start与_start?)

我使用的是u-boot-1.3.0-rc2。在cpu/pxa/start.S中,有如下的标号定义: _TEXT_BASE: .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址...
  • lemon_fantasy
  • lemon_fantasy
  • 2008年12月25日 10:48
  • 4624

U-Boot串口初始化详解

http://blog.csdn.net/ce123/article/details/7326996 U-Boot串口初始化详解 目录 零、概述 一、init_baudrate...
  • sunjing_
  • sunjing_
  • 2016年07月29日 11:15
  • 407

U-Boot启动过程完全分析(uboot启动2个阶段的分析)

1.1       U-Boot工作过程   U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:        (1)第一阶段的功能 Ø  硬件设备初始化 Ø  加载U-Boot第二阶段...
  • hanchaoman
  • hanchaoman
  • 2013年07月09日 16:14
  • 4056
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:u-boot第二阶段之start_armboot()函数
举报原因:
原因补充:

(最多只允许输入30个字)