This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C1294XL:使用基于闪存的引导加载程序(BOOT_EMAC_FLASH)和 eflash.exe 实用程序、基于以太网的固件升级功能出现问题。

Guru**** 2468460 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667007/ek-tm4c1294xl-problem-in-ethernet-based-firmware-upgrade-functionality-using-flash-based-bootloader-boot_emac_flash-and-eflash-exe-utility

器件型号:EK-TM4C1294XL

您好!

使用以太网引导加载程序升级固件时遇到一些问题。

首先、我使用 JTAG 在内存位置0x0处刷写 boot_emac_flash、在内存位置0x4000处刷写 boot_demo_emac_flash、并尝试使用以太网在位置0x4000处写入同一文件。

我在 LM Flash 程序员中再次遇到相同的错误(无法启动 BOOTP 服务器)。 然后我尝试切换到另一个实用程序 eflash.c、该实用程序在第459行的 BOOTP_server.c 中出现错误、该行用于为 BOOTP 服务器创建套接字。为了更改此 eFLASH 文件、我在 cygwin 中使用 make 实用程序对其进行了编译。

然后、我将 eflash.c 中的 BOOTP 服务器端口更改为50000 (即一些随机端口) BOOTP 客户端模式更改为50002、将 tftp 服务器端口更改为50004、并且我成功地将魔术包发送到 UDP 端口9、 板载 LED 停止闪烁、即代码成功分支到引导加载程序。 但升级确实发生了(因为在引导加载程序中、配置的 UDP 端口为67.68和69 RESP)。

因此、我再次将引导加载程序代码中的端口更改为50000、50002和50004 RESP。 然后再次运行 eflash 实用程序。 但是,eflash 实用程序再次出现错误:无法创建 BOOTP 服务器套接字。  

这是否意味着 BOOT_EMAC _FLASH 中配置的端口与 eFLASH 实用程序冲突?

此外,DHCP 服务器一直处于打开状态。 这会是个问题吗?

另外,我尝试执行 netstat -a,发现:(192.168.1.150是我的笔记本电脑 IP,192.168.1.5是 DHCP 服务器分配的主板 IP。)

UDP 0.0.0.0:58952 *:*
UDP 0.0.0.0:62859 *:*
UDP 127.0.0.1:1900 *:*
UDP 127.0.0.1:49664 *:*
UDP 127.0.0.1:59022 *:*
UDP 192.168.1.150:9 *:*
UDP 192.168.1.150:67 *:*
UDP 192.168.1.150:67 *:*
UDP 192.168.1.150:69 *:*
UDP 192.168.1.150:69 *:*
UDP 192.168.1.150:137 *:*
UDP 192.168.1.150:138 *:*
UDP 192.168.1.150:1900 *:*
UDP 192.168.1.150:40000 *:*
UDP 192.168.1.150:40004 *:*
UDP 192.168.1.150:40006 *:*
UDP 192.168.1.150:50000 *:*
UDP 192.168.1.150:50003 *:*
UDP 192.168.1.150:59820 *:*
UDP 192.168.2.96:137 *:*
UDP 192.168.2.96:138 *:*
UDP 192.168.2.96:1900 *:*
UDP 192.168.2.96:59721 *:*



此致、
奥 poorv

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Apoorv:

     当您运行 EMAC_BOOT_FLASH 引导加载程序时、您在 LM 闪存编程器中的客户端 IP 地址中放置了什么? 我建议您恢复到原始的 EMAC_BOOT_FLASH 引导加载程序引导加载程序和 BOOT_DEMO_EMAC_FLASH 示例、并再次使用 LM 闪存编程器。  

    以下是您需要执行的步骤。

    1.使用 CCS 或 LM 闪存编程器通过 JTAG 接口将诸如 enet_lwip 的 TivaWare 示例编程到 MCU 闪存中。  

    2.运行 enet_lwip,您应该会在终端窗口中看到已打印的 IP 地址。 您需要记录此 IP 地址。 此 IP 地址由 DHCP 服务器动态生成。 稍后在运行 EMAC_BOOT_FLASH 示例时需要使用此 IP 地址。 原因是运行 LM 闪存编程器的 PC 也是 BootP 服务器和 TFTP 服务器。 BootP 服务器本质上是静态的。 您需要手动将客户端的 IP 地址与 BootP 服务器中固定表中的客户端 MAC 地址关联。  请注意、运行 enet_lwip 的唯一目的是获取 IP 地址。 获取动态地址后,它将在您的网络上租用几个小时。 您可能能够配置路由器以无限期租用 IP 地址。 请咨询您的 IT 部门。  

    3.通过 JTAG 接口将 EMAC_BOOT_FLASH 编程到 MCU 的闪存中。 您可以使用 CCS 或 LM 闪存编程器加载代码。 请注意、EMAC_BOOT_FLASH 从0x0开始。

    4.运行 EMAC_BOOT_FLASH 引导加载程序。 EMAC_BOOT_FLASH 应立即发送 BootP 请求。 但是、由于您尚未启动 BootP 服务器、客户端将继续发送请求。 如果您有 Wireshark、您应该会在1s、2s、4s、8s 等位置看到 BootP 请求。  

    5.打开 LM 闪存编程器。 请参见下面的。 在 Client IP address (客户端 IP 地址)字段中输入刚从运行 enet_lwip 中获取的 IP 地址。 然后输入客户端的 MAC 地址。 如果您使用的是 LaunchPad、则应在电路板背面的贴纸上看到 MAC 地址。 您在这里所做的更像是手动更新 BootP 服务器的 IP 地址和 MAC 地址关联表。  

    6.转到“Program”选项卡,将 boot_demo_emac_flash.bin 指定为您的应用程序映像,然后按“Program”按钮。 请参见下面的。  

    7.留出一些时间,您应该可以通过以太网看到正在进行的下载。  

    我无法回答 eflash 问题、因为我没有亲自使用过它、但我认为它的工作原理应该是完全一样的。 我的理解是 BOOTP 应该在 UDP 端口67和68之间发生。 如果您选择了一些随机端口、我不太确定它将如何在您的网络中工作或不能在您的网络中工作。 我不知道如何回答这些问题。 我建议您重新执行上述示例。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:  

    我正在使用 TM4C1294。

    运行 boot_emac_flash (第3点)后、我能够成功 下载 boot_demo_emac_flash.bin、这样我就能完成您的过程。 我可以这么说、因为 LM 编程器提供了一个积极的结果、我可以看到 LED 闪烁。  

    如果在第7点结束时、我尝试对控制器进行重新编程(即使使用相同 的 boot_demo_emac_flash.bin)、Wireshark 日志不会显示 TM4C 和 LM Programmer 之间的任何活动(在 "尝试连接"中停止)。 我可以通过哪些方法 来了解问题?  

    此外、我无法看到"boot_demo_emac_flash"的串行输出、但我可以看到 LED 闪烁、我非常确信程序正在运行。 您认为与主要问题相关吗?  

    感谢您的观看、

    米歇尔

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Michele、

    引导加载程序 BOOT_EMAC_FLASH 旨在检查应用程序是否已编程。 由于您已经对应用程序 boot_demo_emac_flash 进行了编程、除非您通过 GPIO 引脚输入强制重新编程、否则引导加载程序将跳转到应用程序。 请参阅 bl_config.h 文件。 下面是头文件的一个片段。

    //
    //
    //启用基于引脚的强制更新检查。 启用后、引导加载程序
    //将进入更新模式,而不是在读取引脚时调用应用程序
    //在特定极性强制执行更新操作。 在这两种情况下、都是
    //应用程序仍然能够将控制权返回给引导加载程序以
    //开始更新。 对于需要执行更复杂任务的应用
    //检查可能不是使用单个 GPIO,而是挂钩函数
    //改为使用 BL_CHECK_UPDATE_FN_Hook 提供。
    //
    //取决于:无
    //不包括:无
    //需要:forced_update_Periph、forced_update_port、forced_update_pin、
    //强制_更新_极性
    //
    //
    //#define ENABLE_UPDATE_CHECK

    //
    //
    //启用 GPIO 模块以检查强制更新。 这将会
    //是 SYSCTL_RCGC2_GPIOx 值之一,其中"x"替换为端口
    //名称(如 B)。 "x"的值应与"x"的值匹配
    // Forced_update_port。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_Periph SYSCTL_RCGC2_GPIOB

    //
    //
    // GPIO 端口以检查强制更新。 这将是其中之一
    // GPIO_Portx_BASE 值、其中"x"替换为端口名称(例如
    // B)。 "x"的值应与"x"的值匹配
    // Forced_update_Periph。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define FORUD_UPDATE_PORT GPIO_PORTB_BASE

    //
    //
    //检查强制更新的引脚。 这是一个介于0和7之间的值。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_PIN 4.

    //
    //
    //导致强制更新的 GPIO 引脚的极性。 该值
    如果引脚应为低电平、//应为0;如果引脚应为高电平、则应为1。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_polarity 0

    //
    //
    //这为强制中使用的 GPIO 引脚启用弱上拉或下拉
    //更新。 只应存在一个强制更新 WPU 或强制更新 WPD
    //已定义,或者如果不需要弱上拉或下拉,则两者均不需要。
    //
    //取决于:enable_update_check
    //不包括:无
    //库:无
    //
    //
    //#define Forced_update_WPU
    //#define forced_update_wpd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Charles:

    感谢你的答复。

    如果我想从远程和异步方式更新固件、步骤是什么?
    我认为 boot_demo_emac_flash 正在侦听"魔术包"、当这个数据包到达时、应用程序会将执行返回到引导加载程序。

    问题是我想在软件运行时更新它。 因此、引导加载程序无法检查引脚并强制进行更新。 我缺少什么吗?

    米歇尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Michele、
    是的、您回答正确。 如果您的应用程序被写入以将控制传递回引导加载程序、则应重新编程。 BOOT_DEMO_EMAC_FLASH 确实侦听魔术包。 如果接收到魔术包、则会将控制权转移给引导加载程序。 如果您使用 Wireshark、您将看到魔术包包含6个字节的0xAA、后跟重复4次的目标 MAC 地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    LM 闪存编程器和 eFLASH 工具也发送魔术包吗?

    但是、LM 编程器保持"尝试连接"状态、我在 Wireshark 中看不到数据包。 我正在端口9上查找采用 UDP 协议的数据包。

    此致、

    米歇尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Michele、

     这对我很有用。 魔术包来自 LM 闪存编程器。 eFLASH 应该是 LM 闪存编程器的命令行版本、因此即使我自己从未尝试过 eFLASH、它也应该以类似的方式工作。 00:1a:B6:02:C5:A3是我的 MAC 地址。 您将拥有自己的 MAC 地址。

     您应该能够在 Wireshark 上看到以下内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我现在看到数据包。 问题已经解决。

    我有两个以太网卡、比如 Card1和 Card2。 LM Programmer 允许我仅选择正确的 Card1。
    但是、LM 编程器仅在我禁用 Card2时才开始按预期工作。

    为了便于将来参考、我使用了 Win10 -64位。

    感谢您的澄清和支持。

    此致、
    米歇尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到解决。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    是否有任何诸如 eflash 或 LM 闪存编程器之类的实用程序支持 Linux 的基于以太网的固件升级?
    此致、
    奥 poorv