我在之前的帖子中展示了如何从 U-boot 中更新 SDK 映像。然而,在那个例子中,我没有听从自己的建议,最初我将 FMC uCode 图像刻录到闪存中的错误位置。重新启动后,我不再有以太网连接,并且需要通过我的调试器Codewarrior重新刷新 FMC 代码。在这篇文章中,我将尝试介绍我所做的恢复工作,让您了解如何通过调试器重新刷新 P3041DS,甚至是裸板。
首先,我们需要 Codewarrior。我目前在 Windows 主机上使用版本 10.2,但看起来Codewarrior 10.3是目前最新版本。您还需要一个硬件 TAP,可以是 USB Tap、Codewarrior TAP、GigaTap 或以太网 Tap。对于 P3041,这需要一个 COP 接口 16 针接头。我的 USB 分接头已借出,因此我使用以太网分接头,这提供了通过 LAN 访问的额外便利。
为了本文的目的,我假设我已经清除了 NOR 闪存中的所有内容(包括 RCW)。这与从工厂返回的一块空白板的情况类似。在这种情况下,为了连接调试器,我们需要设置硬编码的 RCW。从 P3041DS 文档中,我看到 DIP 开关 SW1 配置 RCW_SRC
我需要一个硬编码的 RCW 选项,因此我将查看 P3041RM 以找出应将 cfg_rcw_src 设置为何。
由此,我确定我想要设置 cfg_rcw_src = 1_0010,因此我在 DS 上适当地设置 SW1。
请注意,在 DS 系统上,“ON”='1'
将SW1 重新配置为硬编码 RCW 选项后,我将以太网 TAP 探头尖端插入 COP 接头。
注意 pin1 的位置,并适当排列探头尖端。
现在是时候启动 Codewarrior 了。Codewarrior 基于eclipse 。我不会进行大型的 Eclipse 教程 - 但我会演示一些基础知识。Codewarrior 做的第一件事就是询问您工作区的位置。工作区是包含您可能拥有的任何项目的文件夹。在这种情况下,我创建了一个名为workspace_community的新文件夹。
我将为此创建一个新项目。项目包含我可能编译并下载到裸板的文件、初始化脚本以及如何连接到电路板的设置。选择文件/新建/Power Architecture 项目
我将我的项目命名为P3041DS并单击“下一步” 。
接下来,选择合适的处理器
构建设置通常用于构建代码,就我而言,这真的不重要。
我只使用 Core0,因此我按NEXT ,然后最后选择我的 TAP 连接。就我而言,我使用的是 IP 地址为 192.168.1.76 的以太网 TAP
我不打算使用跟踪,因此我可以在下一个屏幕上单击“完成” ,然后就会看到 Codewarrior 编码前景。我对编写任何代码不感兴趣,所以我要建立我的调试连接。为此,我单击工具栏上错误旁边的小向下箭头,然后选择“调试配置” 。
有三种方法可以连接到目标:
请注意,重置和初始化是可选的,可以配置。
我将使用Codewarrior Connect ,并将为我的项目选择该选项。要配置我的连接,我可以选择连接旁边的编辑。
在这里我看到我的连接类型是以太网 TAP,具有正确的 IP 地址,正如我之前在新项目向导中选择的那样。
如果我想更改我的初始化脚本,我会选择目标旁边的“编辑” 。
这将打开一个屏幕,其中显示用于连接特定目标的选项。您可以选择重置核心或不重置,也可以选择使用脚本初始化目标。默认脚本可以作为定制板的参考。它们初始化 DDR、MMU、本地总线等参数,以便调试器能够访问这些外围设备。再次强调,我不会详述细节。安装中包含 Codewarrior 文档,通常位于C:\Program Files\Freescale\CW PA v10.xx\PA\Help\PDF目录中。
在这种情况下,我使用标准 P3041DS 系统,只需返回主调试“调试配置”屏幕并单击调试。这将通过以太网 TAP 启动与目标的连接,并将 eclipse 前景更改为调试前景。
我看到我的目标已经停止在 0xFFFFFFFC 的重置向量处。在右下角我有一个调试器外壳。如果它不在您的视图中,您可以通过窗口/显示视图/调试器 Shell 启用它
在调试器 Shell 中,我可以直接向调试器输入命令。例如,为了读取并验证 DDR 是否正常工作,我将转储从地址 0x0 开始的 20 个位置
mem 0x0 20
这应该在默认项目上返回 0xdeadbeef,因为这是在初始化文件中将 flash 初始化的值。我可以对 flash 做同样的事情:
mem 0xe8000000 20
这应该返回闪存的前 20 个位置,这是我的重置配置字应该存储的地方。如果这两者都返回数据,我们就可以刻录闪存了。
Codewarrior Flash 刻录机通过 Codewarrior 10.x 中的目标任务运行。目标任务定义了闪存接口、地址和要刻录的图像。在目标任务视图中,单击绿色加号图标以添加目标任务。
这将打开一个窗口,我们可以在其中命名任务。任务类型应为闪存编程器。硬件诊断任务类型对于运行内存测试很有用,但这在 Codewarrior 文档中有所讨论。运行配置描述了我们如何连接到电路板。由于我已经通过项目连接到目标,因此我选择 Active Debug Context。
应显示与创建的任务相对应的视图。此时,我们需要添加闪存设备。闪存基地址是您可以通过单击“添加设备”窗口中组织右侧来更改组织。这将显示一个包含各个组织的下拉菜单。
基地址是通过初始化脚本配置的。默认情况下,此设置为 0xE8000000。目标 RAM 定义了目标上供算法使用的缓冲区。在视图的底部,可以添加 Flash 程序员操作,描述要执行的操作。示例包括擦除或编程文件。可以设置多个操作,例如擦除整个闪存、编程 RCW、FMC uCode 和 Uboot。
在这张图片中,我添加了一个操作来将 bin 文件中包含的 RCW 编程到位置 0xe8000000。由于二进制文件没有偏移量,我需要将地址偏移量 0xe8000000 应用于该文件。我指示它在编程之前也擦除扇区,并将操作限制在受影响的扇区内。
当我添加了所有需要的内容后,请务必保存目标任务。下面是我的目标任务更新 RCW 和 Fman UCode 的屏幕截图。
我会将它保存到框架中,这意味着它是项目的一部分。
然后,要运行闪存编程器,只需单击目标任务视图中的绿色“播放”箭头。编程器应该运行,如果成功,将在 Codewarrior 闪存编程器控制台中打印一条消息。
您现在可以断开 codewarrior(红色停止按钮图标),并尝试启动您的系统。请记住,DIP 开关仍然设置为硬配置重置配置字,因此我一定要先将它们改回来。
下划线只是让它更容易阅读 - 没有别的作用。它有时被用来打破一小口。
保留值可以是任何值。有时它们是空白的——没有任何意义。有时它们是内部测试模式等等......
对于大多数 QorIQ 部件,我们将内容按 MSB 到 LSB 列出。例如我现在打开了 P3041RM。
LAD[0:15] - LAD0 是 MSB
LCS[0:7] - LCS0 是 MSB
EC1_RXD[3:0] - RXD3 为 MSB
保罗,
感谢您回复我。我有一个后续问题。
为什么显示的位在第 0 位和第 1 位之间显示下划线“_”?
下划线的意义是什么...只是为了更容易查看而分解一部分吗?
根据此回复,我们一直误解了硬编码 POR 配置输入以及非硬编码 POR 配置。
当你转到保留值时会发生什么?
我们的主板是几年前设计的,但我们不断发现一些奇怪的行为。
鲍勃
这些位(至少在 Power Architecture 上)通常按 MSB 到 LSB(从左到右)的方式书写。因此,在 cfg_rcw_src[0:4] 的情况下,crg_rcw_src0 是 MSB。这对应于 LGPL0。
因此,当写入 cfg_rcw_src[0:4]=1_0010 时:
cfg_rcw_src0 = lgpl0 = 1
cfg_rcw_src1 = lgpl1 = 0
cfg_rcw_src2 = lgpl2 = 0
cfg_rcw_src3 = lgpl3 = 1
cfg_rcw_src4 = lgpl4 = 0
保罗,
我是一名硬件工程师,对于如何将 cfg_rcw_scr(0:4) 与实际硬件信号关联感到困惑。这种混淆导致无法确定 cfg_rcw_scr 位的最高有效位。
对于上面显示的硬编码表表 4-32,对于等于 cfg_rcw_src(0:4) 的 1_0010,最高有效位是什么,cfg_rcw_src[0] 还是 cfg_rcw_src[4]?
对于下面显示的 LGPLx 硬件信号,当您写入 cfg_rcw_src(0:4) = 1_0010 时,哪个是 msb 是不明确的。硬件约定建议最左边的数字是 msb,它是 cfg_rcw_src(0)。
Cfg_rcw_src[0] = LGPL0
Cfg_rcw_src[1] = LGPL1
Cfg_rcw_src[2] = LGPL2
Cfg_rcw_src[3] = LGPL3
Cfg_rcw_src[4] = LGPL5
你能解释一下其中的歧义吗?
谢谢!
鲍勃
无论如何,我想我找到了这个问题的答案。它位于 QorIQ_SDK_Infocenter.pdf 文档内。以下是有关如何构建 u-boot 以支持 CW 的步骤。
这些步骤是否也适用于生成 u-boot elf 文件?
问:如何使用调试器(CodeWarrior 支持)构建 u-boot/内核?
答:对于 u-boot:
1. $ cd
2. $ bitbake -c cleansstate u-boot
3.修改u-boot_git.bb文件,添加以下内容:
• $ cd meta-fsl-ppc/recipes-kernel/u-boot
• $ add 'EXTRA_OEMAKE += "CONFIG_CW=1"' in u-boot_git.bb file
4.重建u-boot:
•$ bitbake u-boot
Hi Marius,
我已经重新安装了最新的 CW 并设法找到了文档Targeting_PA_Processors.pdf 。
文档中提到我们必须构建具有 Code Warrior Debugger 支持的 u-boot 或者构建 u-boot elf 文件。它谈论的是文件夹iso/help/documents/pdf,我可以在其中找到有关如何执行这些操作的步骤,但我不知道这个文件夹在哪里。
如何在 yocto 构建环境中构建 u-boot elf 或构建支持 CW 的 u-boot?
我将对 Flash 编程器例程做一个小小的说明。使用“已经准备好的”闪存编程器目标任务而不是制作一些新的任务非常简单。
只需右键单击并导入您的主板所需的 FP 目标任务。这些提供的目标任务的最好的部分在于它们已经构建了所有必要的闪存设备和内存设置。
此致,
Marius
Hi,
P3041DS 处的 u-boot 必须写入 NOR flash 的最后 512KB 中。是的,过程类似,只需使用从 0xeff80000 开始的起始地址。
对于 u-boot 调试,请查看 PA\Help\PDF\Targeting_PA_Processors.pdf 中有关
<5.4.6 从 NOR、NAND、SPI 和SDCard/MMC 闪存设备调试 U-Boot>章节。
此致,
Marius
我也对 u-boot 的刷新感兴趣。如果有的话就太好了。
Hi Paul,
感谢上述有用的文档。我有几个问题希望您能给我一些提示:
1) 您在文档中展示了如何将 rcw 和 fman ucode 刷入闪存。那么刷写u-boot的过程也是类似的吗?
2)如何使用 Code Warehouse 和 USB Tap 调试 u-boot(在 yocto 环境中编译)?有关于这个过程的任何文档吗?