MPC8314 (e300核) uboot 调试

2023-11-17

历经2个多月,完成了MPC8314最小系统(uboot)及Linux内核和根文件系统的调试。这是我第一次从头开始做小系统和内核的移植工作,虽然调试的比较辛苦,但是收获还是很多的。下面就介绍一下调试的过程和一些原理性的东西。

1 MPC8314 上电流程

   系统上电后,经过若干个时钟后,MPC8314会检测复位配置输入信号CFG_RESET_SOURCE[03]来确定硬件配置字源选择,在目标板上可以设置跳线来改变CFG_RESET_SOURCE[03],选择硬件配置字源。本系统中的硬件配置字存放在CPLD模拟的Flash空间中。

从相应的地方读取硬件配置字(RCWLRCWH)后,会设置相应的寄存器。其中RCWH中的BMS位值为1,定义了e300核心的MSR[IP]位初始值,如上图所示,MSR[IP]1决定中断向量的前缀为0xFFF,启动存储空间的位置为0xFF80_0000~0xFFFF_FFFF;SWEN位为0,禁止软件看门狗;ROMLOC位为0b110RLEXT位为0b00确定了选择local bus GPCM-16bit ROM为启动ROM。复位向量和本地地址映射的默认启动ROM访问将直接指向ROMLOC指定的接口。选中的启动ROM的本地访问窗口(LBLAW0)将被使能,并初始化基地址LBLAWBAR00xFF80_0000,窗口大小为8M这时,Local Bus上的片选CS0的寄存器值为BR00000_0000,OR00000_0000。整个4G空间全是ROM,每16M重复一次

中断向量的前缀为0xFFF,复位向量为100,决定了系统复位后的第一条指令从0xFFF0_0100处获得。

/cpu/mpc83xx/u-boot.lds文件时连接器脚本文件,其中

.text      :

  {

    cpu/mpc83xx/start.o (.text)

    。 。 。 。 。

   }

。 。 。 。 。 。

ENTRY(_start)

规定了代码段从/cpu/mpc83xx/start.s开始。而ENTRY(_start)这一句告诉编译器uboot.bin的镜像入口点为start.s中的_start标号。

所以,我们要将UBOOT的代码烧写到16M Flash中偏移15M的地方,保证了从0xFFF0_0100的空间取到的指令为uboot代码。并且还需要保证0xFFF0_0100start标号。


2 uboot启动流程

2.1 uboot启动概述

    Uboot的启动是从/cpu/mpc83xx/start.s中的_start标号开始的,经历了 /cpu/mpc83xx/start.s/cpu/mpc83xx/cpu_init.c /lib_ppc/Board.c等几个文件中的多个汇编和C函数,最后会在/lib_ppc/Board.c中的board_init_r函数中进入命令死循环,等待执行键入的命令。其具体的流程如下图所示:

2.2 init_e300_core 函数

    初始化e300核心,禁止中断响应,只允许machine check中断和system reset中断,禁止指令和数据地址转换,即关闭MMU,进行实地址转换,设置为supervisor级别,禁止看门狗,无效指令和数据cache,等,为系统创建一个干净可靠的初始环境。

2.3 窗口重映射

从前面MPC8314上电流程可以看出,上电之后,第一条代码是从0xFFF0_0100的地方开始执行的,但是flash并不一定会分配在0xFF00_00000xFFFF_FFFF的地方(以我们16M的为例)。在本系统中,Flash的地址就被分配到了0xFE00_00000xFEFF_FFFF的地方。所以这其中需要做一个跳转,这正是这段代码中map_flash_by_law1remap_flash_by_law0等函数要做的,具体的流程可以由下面的五张图来说明:

 

开始时,BR0OR0为全零,4G全是重复的FlashCPU通过LBLAW0访问Flash

空间 FF80_0000 FFFF_FFFF

2 map_flash_by_law1函数使用LBLAW1映射FE00_0000FEFF_FFFF这段空间。

跳转到FE00_0000这段空间执行代码,由于4G空间重复,只要偏移地址计算正确就

会顺序执行。

4  remap_flash_by_law0函数设置BR0FE00_0000OR0大小为16M

5 remap_flash_by_law0函数设置LBLAW0窗口映射FE00_0000FE7F_FFFF区域,并

清除LBLAW1

2.4 Dcache 中分配空间做堆栈

 

程序跑到这里,就要进入第一个C函数了,C函数的运行需要堆栈空间,但这时,RAM还没有初始化,只能在Dcache中锁定一定的空间,用于C的堆栈空间。

lock_ram_in_cache函数在Dcache中锁定4k的空间。

下面的几行代码将堆栈指针指向刚刚分配好的Dcache空间。

lis r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@h

ori r1, r1, (CFG_INIT_RAM_ADDR + CFG_GBL_DATA_OFFSET)@l

li  r0, 0      

stwu    r0, -4(r1)

2.5 cpu_init_f 函数

   

    该函数是系统执行的第一个C语言的函数,主要是做一些CPU 寄存器的初始化,其中最重要的部分是初始化Local Access Windows的值和Local Bus上的片选BROR的值。这些值需要在/include/configs/MPC8315ERDB.h中配置好。

2.6 board_init_f 函数

 

该函数为板级初始化的第一个函数,会对板子上很多硬件外设做初始化,其中最重要的为init_sequence数组,该数组里面包含了很多板级的硬件初始化函数,在board_init_f函数中会依次的调用该数组中的函数去初始化各个硬件,该数组如下:

init_fnc_t *init_sequence[] = {

 

#if defined(CONFIG_BOARD_EARLY_INIT_F)

    board_early_init_f,

#endif

 

#if !defined(CONFIG_8xx_CPUCLK_DEFAULT)

    get_clocks,     /* get CPU and bus clocks (etc.) */

#if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) /

    && !defined(CONFIG_TQM885D)

    adjust_sdram_tbs_8xx,

#endif

    init_timebase,

#endif

#ifdef CFG_ALLOC_DPRAM

#if !defined(CONFIG_CPM2)

    dpram_init,

#endif

#endif

#if defined(CONFIG_BOARD_POSTCLK_INIT)

    board_postclk_init,

#endif

    env_init,

#if defined(CONFIG_8xx_CPUCLK_DEFAULT)

    get_clocks_866,     /* get CPU and bus clocks according to the environment variable */

    sdram_adjust_866,   /* adjust sdram refresh rate according to the new clock */

    init_timebase,

#endif

    init_baudrate,

    serial_init,

    console_init_f,

    display_options,

#if defined(CONFIG_8260)

    prt_8260_rsr,

    prt_8260_clks,

#endif /* CONFIG_8260 */

#if defined(CONFIG_MPC83XX)

    prt_83xx_rsr,

#endif

    checkcpu,

#if defined(CONFIG_MPC5xxx)

    prt_mpc5xxx_clks,

#endif /* CONFIG_MPC5xxx */

#if defined(CONFIG_MPC8220)

    prt_mpc8220_clks,

#endif

    checkboard,

    INIT_FUNC_WATCHDOG_INIT

#if defined(CONFIG_MISC_INIT_F)

    misc_init_f,

#endif

    INIT_FUNC_WATCHDOG_RESET

#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)

    init_func_i2c,

#endif

#if defined(CONFIG_DTT)     /* Digital Thermometers and Thermostats */

    dtt_init,

#endif

#ifdef CONFIG_POST

    post_init_f,

#endif

    INIT_FUNC_WATCHDOG_RESET

    init_func_ram,

#if defined(CFG_DRAM_TEST)

    testdram,

#endif /* CFG_DRAM_TEST */

    INIT_FUNC_WATCHDOG_RESET

 

    NULL,           /* Terminate this list */

};

可以看到时钟,内存,串口,控制台等初始化函数的调用,其中串口的初始化要先于内存初始化。

2.7 relocate_code 函数

 

到目前为止,boot代码都是在Flash中运行,但是代码最终是要到RAM中运行的,在上面的board_init_f函数中已经将RAM初始化好了,具备了在RAM中运行程序的能力,现在relocate_code函数需要做两个事情:

Flash中拷贝uboot的代码到RAM

2   记下现在执行代码的偏移,跳转到RAM中相应的位置执行。

2.8 board_init_r 函数

   

    该函数为板级初始化的第二阶段,主要是初始化PCIPCIE,网口,Flash等设备,关闭看门狗,把前面借dcache做堆栈的空间解锁,还给cache。在一切设备都初始化好后,便会进去main_loop的死循环中。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPC8314 (e300核) uboot 调试 的相关文章

  • 如何通过http打开远程sqlite数据库?

    是否可以通过 http 打开 sqlite 文件 我只需要读取数据库 并希望我可以做类似的事情 var dbFile File new File http 10 1 1 50 project db sqlite sqlConnection
  • 隐藏的 YouTube 播放器失去了方法

    我正在使用 javascript 控制嵌入式 youtube chromeless 播放器 并且我想偶尔通过设置 display none 来隐藏它 然而 当我再次向播放器展示时 它失去了 YouTube 方法 例如
  • 将变量从 flash 传递到 HTML/php

    我希望也许有人可以对我很难决定如何解决的问题提供一些见解 我有一个相当简单的 Flash 应用程序 用户可以在连接时快速创建一个用户名 并且该用户名是在 Flash swf 内创建的 现在 我有一个 cron 作业 每十分钟删除一次不活动的
  • 如何检测浏览器是否支持flash?

    我的网站只有两个版本 一种是针对支持 Flash 的设计 如桌面设备 另一种是针对移动设备的设计 我只是想知道我是否可以检测到 如果是真的 支持 他们将保持相同的网站假设是http mywebsite com但链接会显示http myweb
  • Uploadify 在 Chrome 10 中突然完全停止工作

    我正在使用 Uploadify 来允许在我的网络应用程序中上传多个文件 它始终适用于 IE 7 8 9 FF 3 6 Safari 和 Chrome 今天我偶然发现它在每个浏览器中都可以工作 但在 Chrome 中却不行 我目前使用的是 C
  • 使用selenium点击swf

    我正在尝试使用 Selenium IDE 单击 html 页面中的 swf DIV id 和 Embed id 的变化取决于时间戳 例如id FLASH 0 23458974594 我尝试过使用id FLASH 0 9 0 9 0 9 or
  • 使用 Swift 以编程方式闪烁屏幕(在“屏幕截图”上)

    为了从这里转换 Objective C 示例 如何以编程方式闪烁屏幕 https stackoverflow com questions 5254508 how to flash screen programmatically我写了以下代码
  • NetStream.appendBytes

    我有一个连接到 Flash Media Server 的 netConnection 我正在尝试使用 Flash Player 10 1 中的新appendBytes 函数将本地FLV 文件流式传输到FMS 但是我遇到了问题 我在网上获取的
  • Flash AS3 - 如何访问其他帧(也称为非一帧)中的显示对象

    只要该子项位于第一帧中 getChildByName name 就会起作用 其他框架中的显示对象还没有被实例化 所以并不是说不能访问它们 它们不存在可供访问的地方 当播放头进入具有特定对象的关键帧时 会创建该对象并将其添加到舞台中 当播放头
  • 在 AS3 中快速设置关键帧上的实例名称

    现在在 Flash CS3 及更高版本 使用 Actionscript 3 中 如果您在图层中的多个关键帧中使用相同的实例 并且您决定稍后分配或更改实例名称 则必须转到每个关键帧并设置实例名称 这是一个很大的麻烦 有没有更快或更好的方法来做
  • 在 Flash AS3 中捕获未处理的 IOErrorEvent

    错误 2044 未处理的 IOErrorEvent text 错误 2036 从不加载 完全的 这就是我每次尝试使用加载器加载不存在的图像时看到的情况 我正在获取 URL 列表 但无法验证它们是否指向任何有用的内容 每当遇到 404 时 它
  • ruby on Rails 3.1 将 .swf 移动到资产管道?

    是否可以将 SWF 文件移动到资源管道中 如果可以 如何做到这一点 我建议将它们放在一个名为的文件夹中app assets flash 将此文件夹添加到您的资源路径中 config assets paths lt lt Rails root
  • 如何向 Flash Player 10.1 发出启动 flv 或 swf 的意图?

    我有一堆FLV视频文件存储在媒体服务器 我正在尝试让它们在 Flash 播放器中启动 一直在四处寻找但没有找到太多帮助 我已将 flv 文件下载到临时存储中 并尝试使用intent 这就是我的代码的样子 来自我在网上看到的 try URL
  • 我可以从 C# 转换为 asp.Net 以在线托管应用程序吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 是否可以将 C 应用程序转换为 as
  • 检查用户的 Flash 播放器是否具有音频功能。 (功能.hasAudio)

    是否可以检查用户是否有声卡 我找到了 Capability hasAudio 但不知道这是否是我应该查看的值 trace Capabilities hasAudio 指定系统是否具有音频功能 此属性始终true 文档对此并不清楚 但我认为
  • ActionScript 3.0 中缺少运算符重载

    我在 ActionScript 中最怀念的事情之一是缺少运算符重载 特别是 我通过在我的类中添加 Compare 方法来解决这个问题 但这在很多情况下没有帮助 比如当你想使用内置字典之类的东西时 有没有好的方法来解决这个问题 Nope 但添
  • iPhone 上的 Flash(或 Silverlight)

    我对在 iPhone 上开发应用程序感兴趣 并且作为一名 NET 和 ActionScript 开发人员 我对 Objective C Cocoa Touch 编程的学习曲线有点害怕 我知道 Adob e 已经为 iPhone 准备好了 F
  • 使用多个模块时优化 Flex

    我有一个 Flex 应用程序 加载时间非常重要 消费者网站 我希望能够在屏幕上显示一些内容 然后允许根据需要加载其他模块 我面临的问题是所有模块的总和比我将所有组件包含在单个 swf 文件中要大得多 原因很明显 例如 访问 Web 服务所需
  • 如何在动作脚本 3 中设置/访问外部 swf 文件的动态文本字段?

    我正在处理一个 fla 文件 其中添加了一个 swf 文件 我如何在该 swf 文件的动态文本上设置文本 有没有直接设置文本的方法 我不想在 url 中作为参数传递 我试过这样 var rq URLRequest new URLReques
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch

随机推荐

  • Apache网页优化压缩步骤

    Apache网页与安全优化 Apache网页优化 1 网页压缩 2 网页缓存 Apache安全优化 1 配置防盗链 2 隐藏版本信息 Apache 网页 优化概述 1 在企业中 部署Apache后只采用默认的配置参数 会引发网站很多问题 换
  • Python笔记:操作ndarray元素:访问、删除、插入

    引入 import numpy as np 在此引入一次 下面直接使用 np 访问ndarray元素 x np array 1 2 3 4 5 print print x x print print This is First Elemen
  • 《UnityAPI.Animation动画》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Animation+AddClip+CrossFade+立钻哥哥++OK++)

    UnityAPI Animation动画 版本 作者 参与者 完成日期 备注 UnityAPI Animation V01 1 0 严立钻 2020 06 23 UnityAPI Animation动画 发布说明 UnityAPI Anim
  • Android——单选多选按钮的使用详解

    button1 Button findViewById R id button1 button2 Button findViewById R id button2 button1 setOnClickListener this button
  • java学习总结——protobuf3的语法

    本文主要讨论protobuf3在编写proto接口描述文件时的语法 下面是一个proto文件的实例 syntax proto3 import address proto package com study blog protobuf opt
  • [激光原理与应用-40]:《光电检测技术-7》- 常见光干涉仪及其应用

    目录 第1章 干涉仪概述 1 1 什么是干涉仪 1 2 基本原理 1 3 分类 1 4 应用 1 5 干涉仪的类型 第2章 常见光干涉仪 2 1 迈克尔逊干涉仪 2 2 泰曼 格林干涉仪 2 3 移相干涉测量仪 2 4 菲索共路干涉仪 第1
  • vue+webpack5:If you want to include a polyfill, you need to

    升级 vue cli 5 0 1 发现 const path require path 异常 发现默认webpack 是 提示v5区别于v4不再自动引入Polyfills 需要手动添加 按照控制台提示 1 安装path browserify
  • mysql不包含模糊查询

    包含like 不包含not like select from 数据库表 where HouseName like 江门奥园项目 and HouseName like 幢 and HouseName not like 商 不包含not in
  • jupyter修改文件目录和虚拟环境

    在我们安装完jupyter的时候 他是默认为根目录的 我们想切换到我们自己创建的文件目录中该怎么做呢 请看下面步骤 一 切换文件目录 首先 先在我们要放的目录下创建一个文件夹 如 我的为 F Jupyter 在命令行窗口中输入 jupyte
  • cocos2dx 常见的49中动作详解

    bool HelloWorld init 1 super init first if CCLayer init return false CCSprite sp CCSprite create Icon png sp gt setPosit
  • java中的类型赋值常见错误

    Java中float double long类型变量赋值添加f d L尾缀问题 添加尾缀说明 我们知道Java在变量赋值的时候 其中float double long数据类型变量 需要在赋值直接量后面分别添加f或F d或D l或L尾缀来说明
  • JAVA的可变类与不可变类

    可变类和不可变类 Mutable and Immutable Objects 的初步定义 可变类 当你获得这个类的一个实例引用时 你可以改变这个实例的内容 不可变类 当你获得这个类的一个实例引用时 你不可以改变这个实例的内容 不可变类的实例
  • Mybatis批量插入数据的三种方式分享

    转自 Mybatis批量插入数据的三种方式分享 下文笔者讲述Mybatis插入数据的方法分享 如下所示 for循环insert long start System currentTimeMillis for int i 0 i lt 100
  • 结构化思维

    我们在求职时 经常能看到岗位要求上写着 逻辑思维 系统 结构化思维 身为一个直觉的打工仔 面对未来Boss耳提面命的 能力标签 我们怎能视若无睹 逻辑思维 好理解 不就 判断 推理 嘛 可这 结构化思维 是啥 很多人就答不上来了 在理解概念
  • electron ajax路径,electron 文件及文件夹上传的问题探索

    不晓得如今electron最新版的dialog解决了这个问题没有 选择文件夹的时候没有返回文件夹里面全部的文件 而是返回了文件夹的路径 一样的在网页端是能够经过webkitDirectory获取到文件夹下面全部的文件node 我试了不少的方
  • https开头的网址是什么意思_网址是什么意思?基础知识普及

    通俗的理解网址就是常说的URL 是很多个它一起组成了数量庞大形形色色的网站 网址 Uniform Resource Locator 统一资源定位器 是计算机Web网络相关的术语 就是网页地址的意思 我们的互联网世界就是由很多的网址组成 也可
  • 2021-04-06

    开源 开源的概念 开源 一词对应英文 Open Source 最初起源于软件开发领域 因此也称为 开放源代码 对应的软件则称为开源软件 Open Source Software 除了我们熟知的开源软件以外 开源的表现形式还有开源硬件 Ope
  • C++编译器为类自动生成拷贝构造函数的情况

    在一下情况中C 会为类自动生成拷贝构造函数 1 类中有虚函数 这种情况即意味着类的对象中有指向虚函数表的指针 考虑下面的情况 class A private int m a public virtual void ShowVal void
  • echarts实现气泡图(气泡之间不叠加)

    前言 echarts本身是有气泡图的 官方气泡图的特点是每个气泡的位置是基于坐标轴进行定位 如图1和2所示 但是本文所介绍的气泡图并不是官方所介绍的气泡图 而是一类区别于官方的图表类型 这种图表类型通常采用d3 js插件实现 如图3所示 从
  • MPC8314 (e300核) uboot 调试

    历经2个多月 完成了MPC8314最小系统 uboot 及Linux内核和根文件系统的调试 这是我第一次从头开始做小系统和内核的移植工作 虽然调试的比较辛苦 但是收获还是很多的 下面就介绍一下调试的过程和一些原理性的东西 1 MPC8314