【求助贴】Muse Pi Pro 修改设备树后无法启动,卡在 RCU Stall,如何修复eMMC系统?

Muse Pi Pro 修改GPIO设备树后变砖,卡在启动日志,求修复eMMC方法

在使用 SpacemiT Muse Pi Pro 开发板,在尝试修改设备树(DTS文件)来设置GPIO默认电平后,板子无法正常启动了。

【我的目的】
我想在系统启动时,将 GPIO 35, 37, 46, 71, 72, 73 这几个引脚默认设置为输出低电平。

【如何发生】

  1. 我修改了 k1-x_MUSE-Pi-Pro.dts 文件,在 &gpio 节点里为上述每个GPIO都添加了 gpio-hog 节点,将它们设置为 output-low
  2. 成功编译了 .dts 文件生成了新的 .dtb 文件。
  3. 在备份原始文件后,将新的 .dtb 文件替换了开发板eMMC存储 /boot 分区里的原始文件。
  4. 重启后,系统就无法启动了。

【遇到的问题】
系统启动时,串口会打印大量日志,然后卡住不动。出现错误错误信息是 rcu: INFO: rcu_preempt detected stalls on CPUs/tasks

【串口日志截图】

  • 我的系统是烧录在 eMMC 上的,没法像SD卡一样取下来用读卡器修复。
  • 因为系统卡在内核启动阶段,我无法通过SSH或正常终端进入文件系统来恢复原始的 .dtb 文件(我有备份文件 .dtb.bak/boot 目录下)。

【侍待解决问题】

  1. 最关键的:在不重新烧录整个系统的情况下,有什么办法可以进入eMMC的文件系统,把 /boot 目录下的设备树文件恢复?
  2. 从日志看,我的 gpio-hog 修改是不是和某个系统功能冲突了?我应该如何正确地初始化这些GPIO?

非常感谢任何能提供思路或帮助的朋友!

进uboot之后,用uboot的文件系统命令来恢复文件。

用SD卡启动,启动后挂载emmc来修复。

或者从固件单独烧录这一个分区。

只是想法没有实测过,供参考

【 二改,已成功救砖】

具体如下(本人提前备份了原始系统的设备树,所以目标就是进入emmc,进入boot目录,然后把备份文件替换回去即可,如果你忘了备份,只能考虑寻找与系统版本相同的设备树文件或者考虑刷机)

由于操作的时候是在另一台设备实现,所以写文章很多会凭记忆,也没拍多少图,但是确实成功救援

1.准备一张32G sd卡和读卡器(需要格式化,所以不要放重要数据),
2.下载balenaEtcher,我下载的来源: balenaEtcher - Flash OS images to SD cards & USB drives
3.准备一下适用于muse pi pro的镜像,来源: Index of /image/k1/version/bianbu
4.选择好你下载的 img.zip 文件,第一个选则镜像,第二个选择卡,然后烧录进去

5.烧录完后,在muse pi pro的背面有一个tf卡槽,插进去。插好键盘鼠标和显示器,然后上电(因为这是一个全新的系统,需要初始化,设置名称等),然后自行先处理初始化好相关内容

6.启动完后,打开命令行,然后就是简单的查找个挂载存储设备

6.1. 运行 lsblk 命令来查看所有块设备和它们的分区:

```
lsblk
```

6.2. 你将会看到类似下面的输出。你需要仔细辨认哪个是eMMC。eMMC通常分区更多,容量也与你购买的规格一致(我的是64GB)。

**示例输出可能像这样:**
```
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk1     179:0    0  29.7G  0 disk            <-- 我的救援SD卡
|-mmcblk1p1 179:1    0   256M  0 part /boot
`-mmcblk1p2 179:2    0  29.5G  0 part /
mmcblk2     179:32   0  58.7G  0 disk            <-- 这就是我们要操作的目标eMMC!
|-mmcblk2p1 179:33   0   256M  0 part            <-- 可能有多个大小为256MB的分区,建议倒着来,一个一个挂载检查,我的就是p9
`-mmcblk2p2 179:34   0  58.4G  0 part            < eMMC的rootfs分区
`- ........

`-mmcblk2p9 179:45   0   256M  0 part            <-- 我的boot分区
```

6.3. 根据上面的例子,我们确定了目标是 /dev/mmcblk2,其中我们需要修改的 boot分区/dev/mmcblk2p9

下一步:创建挂载点并挂载eMMC的Boot分区**

我们需要在当前系统中创建一个临时目录,然后把eMMC的boot分区挂到这个目录上,这样我们就能像访问普通文件夹一样访问它的内容了。

  1. 创建一个挂载点目录:

    sudo mkdir /mnt/emmc_boot
    
    • /mnt/emmc_boot 是我们创建的临时目录名,你可以自己随便取。
  2. 执行挂载命令:

    sudo mount /dev/mmcblk2p9 /mnt/emmc_boot
    
    • 如果这条命令执行后没有任何报错,那就说明挂载成功了!

第三步:进入目录,恢复备份文件

  1. 进入我们刚刚挂载的目录:

    cd /mnt/emmc_boot
    
  2. (验证) 查看目录下的文件,确认损坏的 .dtb 文件和你的备份 .dtb.bak 文件都在:

    ls -l
    

    先检查当前目录是否为你的boot目录,如果不是,取消挂载然后换一个重新挂载

  3. (修复) 拷贝替换损坏的文件,然后将备份文件改名恢复:

    1. 拷贝替换损坏的设备树文件

    
    sudo cp k1-x_MUSE-Pi-Pro.dtb.bak k1-x_MUSE-Pi-Pro.dtb
    

第四步:卸载分区并重启

修复工作已经完成!现在需要安全地卸下这个挂载,然后重启开发板。

  1. 首先退回到根目录,一定不能停留在挂载目录里,否则无法卸载。

    cd /
    
  2. 卸载分区:

    sudo umount /mnt/emmc_boot
    
  3. 现在一切都恢复了。请先关机,然后拔掉SD卡。以确保下次启动时开发板会从eMMC加载。

  4. 关机:

    sudo shutdown now
    

现在,你的Muse Pi Pro应该会从eMMC加载那个被你恢复好的、正确的设备树文件,并成功启动主系统了!

命令总结

# 1. 查找eMMC分区
lsblk

# 2. 创建挂载点
sudo mkdir /mnt/emmc_boot

# 3. 挂载eMMC的boot分区 (注意替换设备名!)
sudo mount /dev/mmcblk2p9 /mnt/emmc_boot

# 4. 进入目录
cd /mnt/emmc_boot

# 5. 查看并确认文件
ls -l

# 6. 恢复备份 
sudo cp k1-x_MUSE-Pi-Pro.dtb.bak k1-x_MUSE-Pi-Pro.dtb

# 7. 退回到根目录
cd /

# 8. 卸载分区
sudo umount /mnt/emmc_boot

# 9. 关机,拔掉sd卡,然后重启
sudo shutdown now

附一张成功救砖的效果图:

最后,可能每个人的板子会有些许差异,需要找到自己备份文件并且替换,发现不是自己的分区后,先回到根目录卸载然后重新挂载新的分区进行尝试。
在干敏感任务的时候记得一定一定要备份,不然恢复都困难

2 个赞