`
ai_longyu
  • 浏览: 477201 次
社区版块
存档分类
最新评论

Uboot start_armboot

 
阅读更多

ubootC语言代码入口函数(start_armboot)的注释


//打印BANK的相关信息
display_dram_config,
NULL,//
用以标识列表数组的结束
};

//------------start_armboot--------------------
//
功能:完成uboot第二阶级的一系列的
//
硬件初始化工作, 然后转入main函数.
//
备注:该函数是C程序的入口函数,从汇编语
//
言跳转到此 .
//---------------------------------------------
void start_armboot (void)
{
init_fnc_t **init_fnc_ptr;//init_fnc_t
是各初始化函数的数组
char *s;

#ifndef CFG_NO_FLASH
ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif

/* Pointer is writable since we allocated a register for it
gd_t:
定义在 /include/asm-arm/Global_data.h,包含一些全局通用的变量.
_armboot_start:
代码的起始地址,它定义在start.S中的前几行中,定义为 _start
当系统第一次加电时,指令是从0x0地址开始执行的,所以此时的 _start
应为0x0;而当uboot经过代码重定位后,指令会从 _TEXT_BASE 处开始执行,
此时的 _start值就成了 _TEXT_BASE的值.
CFG_MALLOC_LEN:
/include/configs/smdk2440.h中有定义,该变量表示供
malloc
函数使用的内存池空间,代码中定义值为:0x10000+128*1024
|-------|<--- _armboot_start
基址
| 4 |
|-------|<--- malloc
函数池基址
| 3 |
|-------|<--- (gd_t)gd(
全局变量表)基址
| 2 |
|-------|<--- (bt_t)bd(
板卡信息表)基址
| 1 |
-------
4
就是为malloc函数预留的数据空间
3
是全信息表gd的数据区
2
是板卡信息表bd的数据区
网上找了个图片,更能反应这个空间的分配关系:

*/
//
分配区域 3 gd ,gd是一个全局静态变量
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));


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

//gd变量的内容填充为0 ,填充 3 区的数据为0 ,即初始化gd.注意:这里并没有
//
初始化bd,gd表中的bd成员只是一个指针,因为对初始化的是个指针地址
memset ((void*)gd, 0, sizeof (gd_t));
/*
bd_t
结构体在/include/asm-arm/U-boot.h中定义, 定义板子的一些信息,包括:
波特率,IP地址, 以太网地址, 架构编码,启动参数 ,BANK的起始地址和大小等
*/
//
分配区域 2 bd, bd的基址 = gd的基址 - bd的尺寸
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t));

//
把区域 2 填充为 0 ,即初始化 bd
memset (gd->bd, 0, sizeof (bd_t));

/*monitor_falsh_len定义在 /lib_arm/Board.c

bin文件中 BSS 段和 TEXT 段和 DATA 段存放的顺序同前向后依次是:
TEXT(
代码段 RO) DATA(已初始化数据段 RW) BSS(未初始化数据段 ZI)
所以 _bss_start 的基址等于 TEXT的长度加上DATA的长度.
: _bss_start(BSS段基址) = 代码段长度+数据段长度

BSS(Block Started by Symbol)
段是未被初始化的数据段,是存放程序中
未被初始化的全局变量的一块内存区域,初始化时应清零;该段只有
名称和大小却没有值;该段不包含任何数据,只是简单的维护开始和
结束的地址,以便内存区能在运行时被有效地清零,它在应用程序的
映像文件(ARM中也即bin文件)中并不存在.
text :
代码段,是包含程序代码的段
dat :
已经初始化的数据段,保存已经初始化的全局变量.

在嵌入式系统中,bin文件(又称Image文件)中只包含textdata,
bss段不在其中,它是由系统初始化为零.
*/
//_armboot_start
start.S中定义为_start,_start为代码的起始地址
//
只包含 RO(TEXT) RW(DATA) .重定位前的值为0x0,此时指向flash,
//
重定位后则指向RAM中的某一地址
//
由此可以知道: _bss_start - _armboot_start 的值即是在第一阶段从
//flash
中重定位到RAM中的那部分代码的长度,也即可TEXTDATA数据段,
//
这个值与start.S中的重定位那部分代码所计算的值是相等的
//
所以,monitor_flash_len表示从flash中搬来的代码的长度
monitor_flash_len = _bss_start - _armboot_start; //_bss_start
u-boot.lds中定位

//
各设置的初始化.当返回值不为0时表示初始化失败 ,此时会调用 hang()函数
//
打印一错误提示信息,然后进入死循环
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
//CFG_NO_FLASH
表示没有flash,如果没定义该常量则表示板子上有flash,此时调用flash_init()对其进行初始化.
#ifndef CFG_NO_FLASH
/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);//
打印flash的信息,这里仅输出它的大小
#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)
*///
LCD分配RAM(内存)空间
/* 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 */
//malloc
函数使用缓冲区的初始化
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);

//如果定义了命令和NAND命令,则初始化nand
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
puts ("NAND: ");
nand_init();/* go init the NAND */
#endif

#ifdef CONFIG_HAS_DATAFLASH
AT91F_DataflashInit();
dataflash_print_info();
#endif

/* initialize environment 环境的初始化,代码在common/env_common.c*/
env_relocate ();

#ifdef CONFIG_VFD
/* must do this after the framebuffer is allocated */
drv_vfd_init();
#endif /* CONFIG_VFD */

/* IP Address 为全局变量的成员赋值:IP地址*/
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");//ipaddr
smdk2440.h中的CONFIG_IPADDR中出现,应该是该常量

/* MAC Address *///高处MAC地址 ,并赋给gd的成员变量
{
int i;
ulong reg;
char *s, *e;
char tmp[64];

i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;

for (reg = 0; reg < 6; ++reg) {
gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}

#ifdef CONFIG_HAS_ETH1
i = getenv_r ("eth1addr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;

for (reg = 0; reg < 6; ++reg) {
gd->bd->bi_enet1addr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
#endif
}
//
这个函数涉及好多,我没深入分析,若哪位分析了希望能分享一下:cczy_english@163.com,将不胜感激
devices_init ();/* get the devices list going. */

#ifdef CONFIG_CMC_PU2
load_sernum_ethaddr ();
#endif /* CONFIG_CMC_PU2 */

//初始化跳转表,gd中的jt(函数跳转表)数组进行初始化,其中保存着一些函数的入口地址

分享到:
评论

相关推荐

    uboot start_armboot分析

    uboot start_armboot分析

    uboot中C语言代码入口函数(start_armboot)的注释.docx

    uboot中C语言代码入口函数(start_armboot)的注释

    U-Boot启动第二阶段代码分析.rar_U-Boot启动;第二阶段_arm_启动分析

    U-Boot第一阶段的启动流程。(nandflash启动,把nand的4k代码考到... )这个阶段主要是初始化硬件设备,为加载U-Boot的第二阶段代码准备RAM空间最后跳转到lib_arm/board.c中start_armboot函数,这是第二阶段的入口点。

    U-BOOT源码分析及移植

    U-BOOT源码分析及移植,分析uboot的原理,程序执行流程,以及下那个硬的分析2)lib_arm/board.c: ... gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); memset ((void*)gd, 0, sizeof (gd_t));

    u-boot移植实验

    2 阶段2是C语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),...

    uboot代码详细分析.pdf

    start_armboot浅析 42 1.全局数据结构的初始化 42 2.调用通用初始化函数 43 3.初始化具体设备 44 4.初始化环境变量 44 5.进入主循环 44 u-boot编译过程 44 mkconfig文件的分析 47 从NAND闪存中启动U-BOOT的设计 50 ...

    ARM上电启动及Uboot代码分析

    网上关于ARM的bootloader(以Uboot为例)的启动顺序的资料有好多,但是对于Uboot的地址映射、体系结构级操作介绍很少,都是直接开始Start.s代码的阅读。本文拟详细分析Uboot从上电,到第一条指令的执行,同时分析...

    u-boot开源代码

    ◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、设置指令Cache和数据...

    Uboot中start.S源码的指令级的详尽解析 v1.6

    Uboot中start.S源码的指令级的详尽解析 v1.6 学习u-boot必不可少!

    uboott移植实验手册及技术文档

    (4)在 “ _start_armboot: .word start_armboot ”后加入: .align 2 DW_STACK_START: .word STACK_BASE+STACK_SIZE-4 三、创建 board/fs2410/nand_read.c 文件,加入读 NAND Flash 的操作。 #include ...

    lowlevel_init.S Uboot启动分析笔记

    看完《Uboot中start.S源码的指令级的详尽解析_v1.6》,《U-Boot启动过程完全分析》,《lowlevel_Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)》这三篇文章,再参考下《嵌入式Linux应用开发完全手册...

    uboot代码详细分析(88页)

    linux启动代码详细解释u-boot-1.1.6 之cpu/arm920t/start.s 分析 ........................................................................................... 2 u-boot 中.lds 连接脚本文件的分析 ..............

    Uboot启动流程.pdf

    U-BOOT 启动过程 1.cpu/arm920t/start.S

    dp18_ap6330整理完工20170209_1129.7z

    frameworks/native/data/etc/android.software.verified_boot.xml:system/etc/permissions/android.software.verified_boot.xml frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/...

    U-Boot启动过程完全分析

    看完《Uboot中start.S源码的指令级的详尽解析_v1.6》,《U-Boot启动过程完全分析》,《lowlevel_Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)》这三篇文章,再参考下《嵌入式Linux应用开发完全手册...

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z

    if(cap-&gt;status == OFF && cap-&gt;cmd == START_STREAMMING){ hv_dbg("capture start streaming\n"); type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (ioctl(videofh, VIDIOC_STREAMON, &type;) == -1) { hv_err(...

    rtl8188eu_sina33m_sc3817在服务器最终验证版本_20170710_1106.7z

    R:\wyb\rtl8188eu_sina33m_sc3817\lichee\linux-3.4\arch\arm\mach-sunxi\rf\wifi_pm.c struct wifi_pm_ops wifi_select_pm_ops; static char* wifi_mod[] = {" ", "ap6181", /* 1 - AP6181*/ "ap6210", /* 2 - AP...

    u-boot-1.1.6-TQ6410_V0.1

    5、支持内存内容显示、对比、修改 6、支持bootm、bootargs设置 ★ 提供源代码 -ARM11 S3C6410 UOOBT underlying software start-up support SD-WINCE LINUX TQ6410 u-boot version: u-boot-1.1.6 main function: 1, ...

    linux全志R16的linux系统编译的资料_20170502_1655.7z

    全志R16平台编译linux系统V1.0.txt 2017/4/11 13:36 (编译请使用编译android的lichee的选项编译生成的.config文件,不然直接编译会报错!!...rootroot@cm-System-Product-Name:/home/wwt/linux_r16$ tar zxvf ...

Global site tag (gtag.js) - Google Analytics