broadcom学习心得

路由器启动流程学习心得:

  • bootloader启动流程

Bootloader启动大多数都分为两个阶段。第一阶段主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。这个阶段的任务有:
基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)。
为第二阶段准备RAM空间。
如果是从某个固态存储媒质中,则复制Bootloader的第二阶段代码到RAM。
设置堆栈。
跳转到第二阶段的C程序入口点。
第二阶段通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的任务有:
初始化本阶段要使用到的硬件设备。
检测系统内存映射。
将内核映像和根文件系统映像从Flash读到RAM。
为内核设置启动参数。
调用内核。(借鉴)

broadcom芯片引导系统属于自己修改的bootloader,简称CFE。在具体的代码上可以细分为三部分:Bootrom、Cferom、Cfeam。
启动流程可以分为三阶段:

  1. 上电或复位之后,CPU执行的最初指令即Bootrom,进行基本的硬件的硬件检查和初始化。
    2、Cferom包含两个阶段,第一阶段属于汇编语言,初始化环境,拷贝Cferom到SRAM;第二阶段进行CPU和DDR的初始化,并将Cferam从FLASH加载到DDR中,并跳转到Cferam的地址上。
    3、Cferam同样会执行两个阶段,第一阶段初始化相关的硬件环境,配置硬件设备;第二阶段加载kernel、dtb、rootfs、logfs等到DDR中。

详细分析
1、Cferom启动流程:
HELO
CPU0
PMCM
PMCS
PMCD
CODE
L1CD
MMUI
ZBBS
MAIN

执行arch/arm/common/src/init_arm.S.
切到系统模式,关中断;
判断CPU类型;
初始化缓存;
拷贝cferom到SRAM,配置堆栈;
关闭MMU,清BSS段;
在内部 RAM 中设置堆栈指针以调用cferom的c_main函数;

PASS
FPS0
CFE1
BT00
0156
NAN3
RFS3
NAN5

c_main函数: board/bcm63xx_rom/src/bcm63xx_main.c
函数主体包含bootInit、ddrInit、boot_media,主要进行CPU和DDR的初始化工作。
bootInit主要进行CPU一些引导寄存器、LDO、时钟、flash等的初始化。针对一些特殊的板极会有其他不同的操作,如拷贝NVRAM到ddr相应地址,PMC初始化等。
ddrInit主要进行ddr的初始化工作,其中会根据ulMemoryConfig这个标志位判断是否进行DDR的格式化操作。
boot_media根据当前要启动的image,计算需要拷贝的cferam对应的flash的位置和大小,拷贝到DDR中,最后跳转到cferam对应的位置。

2、Cferam启动流程

2.1、执行arch/arm/common/src/init_arm.S.
根据宏控配置Cferom未执行的相关操作;
从FLASH拷贝cferam到SRAM;
在内部 DDR中设置堆栈指针以调用Cferam的c_main函数;

备注:
1、这个文件属于Cferom和Cferam的通用代码,利用宏控进行区分具体的操作;
2、从FLASH中拷贝拷贝Cferom时,未进行FLASH的初始化,主要是因为Cferom位于FLASH的起始位置,且内存较小,同时博通的另外做法是直接将FLASH中Cferom映射到SRAM上;

2.2、Cferam跳转到board/bcm63xx_ram/src/bcm63xx_main.c中。
完成硬件的初始化,包括外部设备的初始化,image更新,引导kernel等。
calculateCpuSpeed(); /* 通过读取 PLL 配置寄存器计算CPU 速度 /
cfe_timer_init(); /
初始化定时器 /
board_console_init(); /
初始化串口 /
cfe_setup_exceptions(); /
配置异常处理 /
cfe_say_hello(); /
CFE开始信息 /
cfe_startup_info(); /
输出环境信息,例如存储空间使用情况 /
board_device_init(); /
配置LED、phy、pinmux等 /
cfe_setup_default_env(); /
初始化CFE默认环境 /
ui_init_cmddisp();
getBootLine(0);
getBoardParam(); /
根据command输入更新信息 /
board_final_init(rc); /
硬件部分初始化,配置pinmux,判断cfe模式下是否操作,无操作直接从flash加载kernel /
cfe_command_loop(); /
CFE终端循环等待 */

其中重点解释下board_final_init的流程,因为涉及的流程较多,系统升级之后出现问题,大多都在里面。
board_final_init
|
bcm63xx_run
|
bcm63xx_run_ex /* 更新ulMemoryConfig,初始化cfe下相关命令 /
|
auto_run /
根据cfe终端输入加载网络端或是本地image /
|
bootNandImage /
根据当前启动的image配置start_blk和end_blk /
|
bootNandImageFromRootfs /
从flash拷贝image,进行解压操作,并设置好跳转指针 /
|
cfe_go(la)
|
cfe_start(la->la_entrypt)
|
cfe_launch(ept) /
跳转到kernel */

bootNandImageFromRootf会进行kernel和rootfs的拷贝,并在DDR中进行解压,其中会根据当前FLASH打包的魔数判断读取格式。

broadcom学习心得相关推荐

  1. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  2. Assembly学习心得

    http://blog.csdn.net/etmonitor/ Assembly学习心得 说明: 最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参 ...

  3. 对于mysql存储过程感想_存储过程学习心得

    存储过程学习心得 (2014-12-28 17:28:06) 标签: it 我使用过几次SQL Server,但所有与数据库的交互都是通过应用程序的编码来实现的.我不知到在哪里使用存储过程,也不了解实 ...

  4. 好程序员Web前端教程分享Vue学习心得

    为什么80%的码农都做不了架构师?>>>    好程序员Web前端教程分享Vue学习心得,Vue是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向 ...

  5. 大学计算机课英语心得体会,关于计算机网络辅助大学英语教学的思考学习心得...

    关于计算机网络辅助大学英语教学的思考学习心得 [摘要]计算机网络辅助教学可以增强学生的学习兴趣,提高他们自觉学习的能力,因而得到了大多数学生的认可,取得了比较显著的成效.计算机网络辅助教学也对大学英语 ...

  6. 我的MYSQL学习心得(十六) 优化

    原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看 ...

  7. Spring Framework------version4.3.5-----Reference学习心得-----总结

    1.Spring Framework概述: 有很多可用版本,网址http://projects.spring.io/spring-framework/       2.Spring Framework ...

  8. 计算机基础与应用(上)笔记总结,计算机基础学习心得体会范文(通用3篇)

    计算机基础学习心得体会范文(通用3篇) 当我们对人生或者事物有了新的思考时,好好地写一份心得体会,这样可以记录我们的思想活动.那么要如何写呢?以下是小编精心整理的计算机基础学习心得体会范文(通用3篇) ...

  9. *:学习心得——C语言----S1T62班 王作舟

    *:学习心得--C语言----S1T62班 王作舟 来源:[url]http://www.accp-teem.com.cn/ArticleView/2007-7-14/Article_View_118 ...

  10. [转]verilog语法学习心得

    verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器  AD  数字处理器  D ...

最新文章

  1. mysql索引空间太大_MySQL优化索引
  2. CentOS 6.5 apache源码安装2.0版
  3. (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
  4. SQL SERVER中求上月、本月和下月的第一天和最后一天[转]
  5. JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题
  6. numpy 笔记 view,copy和numpy的运行速度
  7. 【转知乎】人工智能会是泡沫吗?
  8. Java基础—序列化底层原理
  9. 【Java】兔子问题
  10. 寻找可接入正版音乐曲库的音乐API?来了解HIFIVE音乐开放平台!
  11. 使用文本编辑器来写Python代码
  12. 新萝卜家园 Ghost XP SP3 电脑城装机版 2011.06+
  13. Android对未签名的apk进行签名
  14. 民宿OTA运营有哪些指标数据最重要
  15. 联想电脑 恢复键盘F1-F12按键的标准功能
  16. Verilog自制NIOS2外设,Avalon总线上的HelloWorld
  17. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
  18. 可编辑的日历控件_选择正确的WordPress编辑日历插件
  19. 米兔积木机器人与履带机甲零件差别_米兔积木机器人履带机甲版怎么样 米兔积木机器人孩子喜欢吗...
  20. TryHackMe-Binex

热门文章

  1. JVM菜鸟进阶高手之路十(基础知识开场白)
  2. iPhone屏幕尺寸、statusBar、navigationBar、tabBar高度对比
  3. Android 拨号盘应用源码分析
  4. 小曾带你刷牛客03(Java版本)
  5. uniapp遮罩_uni-app 遮罩模板
  6. html canvas 遮罩蒙版,canvas生成遮罩图片
  7. 中年危机也许只是个幻觉
  8. 微信,百度,字节跳动,支付宝小程序注册流程
  9. springboot无法打开 jsp 页面变成下载解决办法
  10. 快速爬取链家网的房源信息