uboot stage2 init_fnc_t *init_sequence[]代码分析

发布者:科技创客最新更新时间:2015-07-27 来源: 51hei关键字:代码分析 手机看文章 扫描二维码
随时随地手机看文章
 今天总算是把uboot stage2看完了,哎,感受太深了一句话:看完了这些代码,才知道什么叫代码~~

 uboot第二阶段代码是用C写的,本来以为可以比第一阶段的汇编好理解,毕竟对C更熟悉一点。可刚开始进入start_armboot()函数一看,就了~~哎,学习不到家啊~~ 所以,现在还不敢大谈对第二阶段有多理解吧,只是简单记一下,大概理解的。

 本着理解代码高于一切的原则,顺着start_armboot()函数执行顺序读下去。前面的还是比较好理解的,现在就讲讲init_fnc_t *init_sequence[]吧。

 在init_fnc_t *init_sequence[]定义前有这样一行:typedef int (init_fnc_t) (void)哎,这,最怕碰到这种定义了~~都是受谭老师的祸害啊~~自己的C语言基础还是在大二的时候打下的,计算机专业学生学C语言用的居然是谭浩强的那本C搞的直到现在面对这个typedef int (init_fnc_t) (void)都还有点不敢确定。定义init_fnc_t为函数类型,该函数返回int型,无参数。而init_fnc_t *init_sequence[]则是定义一个init_fnc_t指针类型的数组。简单的说就是定义了个函数指针数组,指向一系列cpu初始化函数。包括cpu_init,board_init,interupt_init,env_init,init_baudrate,serial_init,console_init_f,display_banner,dram_init,display_dram_config并且如果定义了CONFIG_VCMA9的话还有checkboard函数。当然这些函数都是返回int并且无参数输入型,有些还是static的。

 现分别说说各个初始化函数吧:简单的现在可以多讲点,还有一些是现在还不太理解或是很长的,需要以后单独列个日志来写吧,打算是这样,希望后面几天能搞懂

 int cpu_init(void):该函数位于ubootcpus3c44b0cpu.c

    该函数只是调用icache_enable()函数实现cpu cache的初始化,然后返回0。

    void icache_enable(void)位于同一文本中。该函数首先调用s3c44b0_flush_cache(),通过向

    LRU RAM写0来刷新cpu cache。刷新cpu cache之后,icache_enale()函数再设置两个非缓冲区域寄    存器NCACHBE0和NCACHBE1 。最后通过设置SYSCFG寄存器来开启cpu cache。

 int board_init(void):函数实现位于ubootoarddaveB2B2.c。依次为初始化GPIO和中断,把cpu体系号传    送给gd->bd->bi_arch_number,把要传送给系统内核(uclinux)的参数的首地址给

    gd->bd-?bi_boot_params。完成后返回0。

 int interrupt_init(void):位于ubootcpus3c44b0interrupt.c

    初始化timer1相关寄存器,用于产生定时中断信号。为什么是timer1呢??好像是timer5做为      uclinux的系统时钟的。以后再研究吧

   int env_init(void):该函数位于ubootcommonenv_flash.c。

    大概分为两种情况:如果定义了CFG_ENV_ADDR_REDUND,即如果环境变量需要在SDRAM中有备    份的话,是一种env_init(),如果不需要备份的话,是另外一个env_init()。还是需要单列一篇记录

 int init_baudrate(void):函数位于ubootlib_armoard.c

    如果参数中设置了波特率则利用参数用设置的波特率,否则利用默认的CONFIG_BAUDRATE(115200)

    CONFIG_BAUDRATE宏定义位于ubootincludeconfigsB2.h

    #define CONFIG_BAUDRATE  115200

 int serial_init(void):函数位于ubootcommonserial.c。

    调用 serial_setbrg ()设置串口相关寄存器,包括FIFO寄存器、控制寄存器、列控制寄存器和波特率    约数寄存器等

   console_init_f():位于ubootcommonconsole.c。

    这个函数就这句:

            gd->have_console = 1

    就是设置了一下相关的数据

   display_banner():位于ubootlib_arm_board.c

    用来打印当前的一些状态

   dram_init():位于ubootcpudaveB2B2.c

    设置RAM的起始地址和大小,依据板子硬件设置。设置文件为ubootincludeconfigsB2.h

    #define PHYS_SDRAM_1  0xc0000000 /* SDRAM Bank #1 */
    #define PHYS_SDRAM_1_SIZE 0x01000000 /* 16 MB */

 display_dram_config():位于ubootlib_armoard.c

    打印RAM的相关信息,相关的宏定义都位于ubootincludeconfigsB2.h,当然都是依据板子实际来定    义的。

关键字:代码分析 引用地址:uboot stage2 init_fnc_t *init_sequence[]代码分析

上一篇:uboot移植初步成功啦
下一篇:uboot之relocate代码的深入理解

推荐阅读最新更新时间:2024-03-16 14:26

arm linux 从入口到start_kernel 代码分析 - 7(end)
6. 切换数据 在 arch/arm/kernel/head-common.S 中: 00014: .type __switch_data, %object 00015: __switch_data: 00016: .long __mmap_switched 00017: .long __data_loc @ r4 00018: .long __data_start @ r5 00019: .long __bss_start @ r6 00020: .long _end @ r7 00021: .long processor_id @ r4 00022: .long __mac
[单片机]
STM32F103X启动代码详细分析
1. 在分析启动代码之前,先把STM32的存储结构说一下: 上面这张图来自CORTEX M3权威指南 STM32F103RTB6 有20k的SRAM,起始地址为0x20000000,128k的闪存flash,起始地址为0x08000000(处于code区域). 从主闪存存储器启动时,主闪存存储器被映射到启动空间(0x00000000),但仍然能够在它原有的地址(0x08000000)访问它,即闪存存储器的内容可以在两个地址区域访问,0x00000000或0x0800 0000。 通过boot0和boot1的配置可以选着三种启动方式: 当我们下载程序时,选着的是系统存储器启动,当我
[单片机]
STM32F103X启动<font color='red'>代码</font>详细<font color='red'>分析</font>
基于Cortex-A9 uboot代码启动分析
前言 我们在前面的arm系列课程,已经讲解了arm的架构、汇编指令、异常、常用外设的控制器驱动,那么我们已经具备开发arm系列产品的基本技能。 本篇给大家介绍一款比较常用的bootloader:uboot,通过uboot的介绍以及源代码的详细分析,让大家把之前所有ARM相关的知识点融会贯通起来。 一、uboot 1. 概念 U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。 U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBS
[单片机]
基于Cortex-A9 uboot<font color='red'>代码</font>启动<font color='red'>分析</font>
充分应用功能安全性开发环境中集成的代码分析工具
目前,越来越多的汽车、工业和其他应用都在强调功能安全性(functional safety),其开发过程也需要先进和完善的工具链支持,以及一些重要的开发工具使用经验。作为功能安全性产品的研发工程师,一定听说过类似MISRA C的静态代码检查,以及其他一些代码标准和自动化检查工具。但是,在日常的开发流程中,仅仅知道这些标准并不代表着能够高效地让代码符合代码标准。 本文将从代码标准本身、以及配套的检查工具如何使用及流程两方面,通过以业界常见的IAR开发工具链为例来提供一些思路,解释为什么在开发需要安全认证的产品时,推荐使用其自带的代码分析工具。在实际应用中,针对Renesas RX和Arm系列内核,C-STAT 静态代码分析和 C
[嵌入式]
充分应用功能安全性开发环境中集成的<font color='red'>代码</font><font color='red'>分析</font>工具
u-boot移植(三)---修改前工作:代码流程分析2
一、vectors.S 1.1 代码地址   vectors.S (archarmlib) 1.2 流程跳转         跳转符号 B 为 start.S 中的 reset 执行代码,暂且先不看,先看看 vector.S 中的执行。 1.3 代码分析   ldr{条件} 目的寄存器 存储器地址 1 _start: 2 3 #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG 4 .word CONFIG_SYS_DV_NOR_BOOT_CFG 5 #endif 6 /* LDR{条件} 目的寄存器 存储器地址 */ 7 /* 当异常发生的时候,由硬件机制处理器自动的跳到
[单片机]
u-boot移植(三)---修改前工作:<font color='red'>代码</font>流程<font color='red'>分析</font>2
S3C2440裸机学习[2] - LCD驱动原理及代码分析[一]
1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的 形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通 过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:REGBAN
[单片机]
S3C2440裸机学习[2] - LCD驱动原理及<font color='red'>代码</font><font color='red'>分析</font>[一]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved