ST意法半导体
直播中

梅利号

8年用户 1494经验值
擅长:可编程逻辑
私信 关注
[问答]

Linux内核可以通过写入BOOT_MODE寄存器来强制重启模式吗

如果 ROM CODE 在 BOOT_MODE 寄存器中看到“0xFF”,那么它将不会继续进入 TF-A,而是进入闪烁模式。
还提到了波纹管:
“Linux 内核可以通过写入 BOOT_MODE 寄存器来强制重启模式。
此写入是通过“rebo​​ot”Linux 命令完成的,
这是通过设备树中兼容的“syscon-reboot-mode”配置的。
如果可能的话,我想要实现/理解的是运行 Linux 用户空间命令以将 0xFF 写入 BOOT_MODE 并重新启动系统。
我找不到办法做到这一点...
另外,只是为了确保,如果我能够实现上述目标,设备会启动到 DFU 模式吗?
一些背景:
  • 在评估板上使用引导选择引脚很容易,但在我们的生产板上就没那么容易了。
  • 此外,我想从我们的 U-boot 中删除对 STM32prog 命令的支持,并删除通过按键停止 u-boot 的功能(出于安全原因)


回帖(1)

黄鹏

2022-12-9 15:16:27
您非常了解 TAMP_REG[20] 别名 BOOT_MODE 的行为。如果此寄存器备份中的值是 0xFF,您将在下次重新启动时以串行模式启动。
是的,这可以在 linux 用户空间上下文中修改此寄存器。为了方便地测试它,我建议你在你的板上安装devmem2
此维基页面将为您提供帮助。
然后这里的步骤:
I - 找到 TAMP_REG[20] 的地址进行修改


  • 要找到该寄存器的地址,您有两种方法,第一种来自参考手册(生态系统 v3.1 的 v5.0)
第 2532 页:

由于 TAMP 寄存器的基地址为 0x5C00A000(第 157 页):

备份寄存器TAMP_REG[20]的地址为:


  • 0x5C00A000 + 0x100 + 0x04 * 0x14 = 0x5C00A150
  • 0x14 because it's 20 in decimal

2. 第二种方式是直接读取U-Boot的代码
来自文件:arch/arm/include/asm/arch/stm32.h


  • #define STM32_TAMP_BASE                        0x5C00A000

  • /* TAMP registers */
  • #define TAMP_BACKUP_REGISTER(x)                (STM32_TAMP_BASE + 0x100 + 4 * x)


  • #define TAMP_BOOT_CONTEXT                TAMP_BACKUP_REGISTER(20)

  • Address of BOOT_MODE =  0x5C00A150

II - 确保启用 RCC 时钟
必须启用寄存器 RCC_MP_APB5ENSETR 的位 8。您可以在 refman 的第 831 页找到此信息:

默认情况下,这通常是生态系统 v3.1 的情况,但您可以使用 devmem2 验证 bit8 的值:


  • root@stm32mp1:~# /usr/local/devmem2 0x50000208
  • /dev/mem opened.
  • Memory mapped at address 0xb6f17000.
  • Value at address 0x50000208 (0xb6f17208): 0x113900

III - 验证寄存器在写操作中不受保护
如参考手册第 2512 页所述,这些寄存器受两个寄存器的写保护。
通过 DBP:
和 BKPWDPROT:

我使用生态系统 v3.1 的 linux 5.10.61 在 stm32mp157C-DK2 上进行了测试,默认情况下这些寄存器允许编辑 TAMP_REG 20。
IV - 在 TAMP_REG[20] 寄存器中写入 0xFF
现在你确定一切正常,你可以在寄存器中写入值:


  • root@stm32mp1:~# /usr/local/devmem2 0x5C00A150 w 0xFF
  • /dev/mem opened.
  • Memory mapped at address 0xb6f69000.
  • Value at address 0x5C00A150 (0xb6f69150): 0x1100
  • Written 0xFF; readback 0xFF

  • root@stm32mp1:~# /usr/local/devmem2 0x5C00A150
  • /dev/mem opened.
  • Memory mapped at address 0xb6f0e000.
  • Value at address 0x5C00A150 (0xb6f0e150): 0xFF

第二个命令允许验证该值是否真的被写入。
V - 重启你的开发板,你必须处于串行启动模式
只需键入“重启”。
开发板必须重新启动,如果拔下 USB 电缆,您将看到 LD6 呈红色闪烁,这意味着您处于串行启动模式。
要返回 SD 卡模式,您只需再次重启开发板(例如使用重置按钮)。
--------------------------
关于 u-boot 的第二个问题:


  • In addition I would like to remove support of stm32prog command from our U-boot and also remove the ability to stop u-boot with a key press (security reasons)




  • stm32程序

要删除U-Boot的命令stm32prog,你只需要打开menuconfig:


  • make menuconfig

在“ARM architecture”里面->禁用“command stm32prog for STM32CudeProgrammer”,配置CMD_STM32PROG


  • 删除停止 u-boot 的能力

此功能由命令 autoboot 管理
你可以在“abortboot”函数中读到这个命令的代码(文件:common/autoboot.c),如果bootdelay值为0,你不能中止自动引导:


  • static int abortboot(int bootdelay)
  • {
  •         int abort = 0;

  •         if (bootdelay >= 0) {

所以可以在u-boot环境下将bootdelay值编辑为0:


  • STM32MP> env set bootdelay 0
  • STM32MP> env save

举报

更多回帖

发帖
×
20
完善资料,
赚取积分