PowerPC P2040启动流程

概述:

P2040采用powerpc架构,总共有四个e500mc核,独有的DPAA数据路径加速架构,5个Gbps或4 2.5 Gbps以太网控制器,支持10Gbps以太网(XAUI)控制器,十个5Ghz的SerDes通道,扩展性很强的Enhanced local bus controller(eLBC),Multicore programmable interrupt controller (PIC),两个4通道的DMA等。芯片资源与框架如下:

e500mc在P2040上支持最大1.2GHz的时钟,在P2041可以达到最大1.5GHz的时钟,P2040除常见的接口外,还支持高速的SRIO接口、eSPI、sDHC等。

启动流程简述:

从芯片手册中可得知,每个核开始执行的第一条指令都在地址0xffff_fffc处,boot window大小总共8MB,地址范围为0xff80_0000 ~ 0xffff_ffff,如下:

当e500mc core上电后,首先是加载PBL image,然后初始化spi,elbc,I2c接口等硬件配置,接着去找RCW source和pre-boot initialization commands(PBI):

1.       如果我们使用的是非硬编码[hard-code]的RCW data,则core去采样RCW配置管脚cfg_rcw_src[0:4]信号;当这个配置为0_1101时,如下图:

则表示rcw数据存放在非易失性的nor flash中(这个nor flash是连接在elbc控制器GPCM上,片选为CS0片选。如果是NAND flash启动,则是elbc FCM),则PBL会配置这个nor flash的对应的接口用作RCW-data和PBI-data接口,然后预引导程序pre-boot loader会elbc gpcm的br0和or0片选选中这个nor flash地址线上的地址为0(这里nor flash的A25被设置为地电平,所以nor flash的地址的bit25始终为0),从而读取外设nor flash地址0处开始的64 bytes的rcw数据到core的RCW状态寄存器RCWSRn中。----------------------------------------从这里,我们明白rcw文件时烧写在nor flash的0地址处的。

为什么pre-boot loader是去这个nor flash的0地址加载数据???见如下文档截图1

附:PBL首先会去加载指定接口非易失性外设中读取PBL image数据(这个PBL image就是RCW-data和PBI-data)。所以,我们的引导设备nor flash的最低地址的0~4K这些位置要放置rcw-data和PBI-data。RCW-data和PBI-data是放在一个文件中的,见下面截图对其格式的描述。



当加载完rcw数据后,PBL程序会根据RCW中的配置数据去配置系统各参数,比如mem rate等,并配置CPC的1M memory用作SRAM(片内RAM)(如果是nand flash启动,这个被用于存放u-boot 前4K代码)。

RCW数据和PBI commands如下:


然后根据RCW中的PBI_SRC的配置去加载PBI commands。这里rcw中,PBI_SRC=29,结合下图不难看出,PBI command 数据存放位置和rcw是在同一个外设。
返回上面的rcw文件的格式,我们也就知道了rcw和PBI数据是放在同一个文件中的,该文件有一个前导头A5A5。



2.       从RCW数据中,我们知道,我们配置的BOOT_LOC=29,即表示引导位置(uboot存放的位置)是在elbc GPCM控制器上,当PBI完成硬件的初始化后,这时候,系统只有L2 MMU的TLB1的entry0是有效的,它能将EA地址(有效地址,或者叫做cpu线性地址)0xfffff000~0xffffffff转换为PA地址(物理地址)0xfffff000~0xffffffff,这就是为什么我们在uboot的最先执行的代码块只能访问cpu最后4K内存的原因。
由于cpu复位后,这个时候,boot-window space(范围0xFF80_0000 ~ 0xFFFF_FFFF)的优先级高于CCSR space,所以这时候的LAW就是boot-window space时了。
那么这个boot-space 的TARGET-ID是谁呢???
我们返回去看rcw数据,这里的BOOT_LOC就告诉了PBL,在引导时访问的外设是eLBC GPCM,所以,只要地址命中这个boot-window space,那么这个操作的控制器就是eLBC(local bus controller)。
很显然。当PBL完成工作后,CPU发出预取指令的地址为0xfffffffc时,经过L2 MMU的TLB1的entry0,这个EA地址0xffffffc就转变成了PA物理地址0xfffffffc,而这个PA物理地址又命中boot-window,所有CPU就将外设片选目的地设为eLBC GPCM controller了。
这个eLBC GPCM controller有4对片选寄存器(基址寄存器和掩码寄存器构成一对),他们分别是BA0 & OR0,BA1 & OR1,BA,2 & OR2,BA,3 & OR03.
在系统reset后,默认片选的是BA0&OR0。
所以,我们要从nor flash上启动,则nor flash的片选必须接在这个BR0&OR0上。(如果是NAND flash,则是接在eLBC FCM controller的BR0&OR0上)。
到这里为止,我们的片选信号已经选中了目的设备nor flash。接下去就是取片内的指令了。
CPU片选后,会向地址总线上发送地址信号0xfffffffc,并且在控制总线上发送读控制信号。由于nor flash有片选信号,则其会对这个控制信号为读,地址为0xfffffffc的信号进行处理。
一般nor flash只有128M,那么这时候nor flash是如何找到cpu请求地址为0xfffffffc处的数据的呢?
这就要看原理图了。

从上图,我们可以看到nor flash(8-bit,64M)的地址线A00~A24分别连着CPU地址线的ADDR00~ADDR24,A25未连,保持低电平。
所以当CPU在地址线上发出地址0xfffffffc时,对于外设nor flash而言,它所看到的访问地址是0x1fffffc,即flash的第一个32M的最后4字节。
这样,CPU就取到了uboot的第一条指令了(是个跳转指令,跳转到这一页的首地址,级uboot的入口start_e500)

3.   接着,系统就开始巡行uboot代码了。

以上纯属个人观点,如有错误,欢迎指正。让我们共同成长,谢谢。

今天看了原理图,对于flash的寻址过程,现在补上。
cpu的地址线和nor flash的地址线的连线草图如下:

使用的flash是xxx系列,是16bit的flash,内存大小为128M,共1024个扇区,每个扇区64K bytes,地址引脚为A00~A25,其他参数,请去官网找这个datasheet。
我们这个图中,nor flash的地址引脚A00~A24分别连到CPU的地址引脚A01~ A25,这里错位连,是因为flash是16位的。
当CPU发出地址信号为0xfffffffc时,flash看到的地址引脚上的值为A24~A3全为1,A2~A0为0b110,A25 = 0b1(A25由拨码开关控制,假设为高电平),那么你索访问的flash的地址为0x3FFFFFE,即剩余2个word(16bit)的首地址,也就是这个flash的最后4个字节。
我们编译出来的u-boot.bin必须烧写在flash的最后512K上,打开u-boot.bin可以看到最后4个字节的值为(hex)4B FF F0 04,这是一条跳转指令,跳转到u-boot的入口start_e500.

下面附上flash芯片的memory-map截图:

上述内容引用了http://blog.chinaunix.net/uid-23782786-id-3944129.html,文章写的很好,在此引用一下。

关于片选基地址的问题,参见eLBC总结

PowerPC P2040启动流程分析相关推荐

  1. bootloader启动流程分析

    bootloader启动流程分析 1.Bootloader的概念和作用 Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序.在完成对系统的初始化任务之后,它会将Flash中 ...

  2. 解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  3. Zygote进程启动流程分析

    文中的源代码版本为api23 Zygote进程启动流程分析 先说结论,zygote进程启动过程中主要做了下面这些事情: 启动DVM虚拟机 预加载部分资源,如一些通用类.通用资源.共享库等 启动syst ...

  4. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  5. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  6. Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

    uboot启动流程分析如下: 第一阶段: a -- 设置cpu工作模式为SVC模式 b -- 关闭中断,mmu,cache v -- 关看门狗 d -- 初始化内存,串口 e -- 设置栈 f -- ...

  7. MyBatis启动流程分析

    目录 MyBatis简单介绍 启动流程分析 简单总结 附录 MyBatis内置别名转换 参考 MyBatis简单介绍 MyBatis是一个持久层框架,使用简单,学习成本较低.可以执行自己手写的SQL语 ...

  8. NameNode之启动流程分析

    NameNode启动流程分析 public staticvoid main(Stringargv[]) throws Exception { if (DFSUtil.parseHelpArgument ...

  9. springboot中获得app_Spring Boot 应用程序启动流程分析

    SpringBoot 有两个关键元素: @SpringBootApplication SpringApplication 以及 run() 方法 SpringApplication 这个类应该算是 S ...

最新文章

  1. HTML5 localStorage本地儲存
  2. linux centos7怎么绑定多ip,003 Linux配置多ip绑定的方法 | ip别名(以CentOS7为例 )
  3. 从零开始打造自己的PHP框架――第2章
  4. 【鸿蒙 HarmonyOS】HarmonyOS 开发环境搭建 ( Node.js 安装 )
  5. Python3回文相关算法小结
  6. 15产品经理要懂的-社会基本规律
  7. 电脑一直弹出传奇游戏网页弹窗怎么办
  8. vscode之添加到右键快捷方式
  9. 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  10. Caffe学习:pycaffe接口配置
  11. 几种物流业务的凭证模板设置说明
  12. 如何给论文添加参考文献
  13. 把AppData目录挪到D盘的方法方法
  14. Cisco Packet Tracer 思科模拟器三层交换机配置
  15. JS获取下个月的第一天和最后一天
  16. html化妆品商城设计,基于HTML5的彩妆购物网站设计任务书
  17. 【mysql】查询过滤器ON,WHERE,HAVING
  18. 白帽子黑客生存环境变好,顶级人才年入千万
  19. 2015年阿里巴巴校招笔试题
  20. 【JVM Ⅵ】GC相关概念+引用

热门文章

  1. Label Inference Attacks Against Vertical Federated Learning
  2. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件
  3. 海店湾养生专家告诉你:有这5个坏习惯,迟早会生病!
  4. appium android函数,Appium(一):appium环境以及基础函数的封装
  5. android默认exported_Android activity exported属性理解
  6. 高压功率放大器原理和应用场合介绍
  7. 一场斗鸡引发的肉食主义论!
  8. instanceof原理与实现
  9. instanceof用法详解以及注意事项
  10. 《地下城与勇士》时尚混搭流行风