Muse Pi Pro 修改GPIO设备树后变砖,卡在启动日志,求修复eMMC方法
在使用 SpacemiT Muse Pi Pro 开发板,在尝试修改设备树(DTS文件)来设置GPIO默认电平后,板子无法正常启动了。
【我的目的】
我想在系统启动时,将 GPIO 35, 37, 46, 71, 72, 73 这几个引脚默认设置为输出低电平。
【如何发生】
- 我修改了
k1-x_MUSE-Pi-Pro.dts 文件,在 &gpio 节点里为上述每个GPIO都添加了 gpio-hog 节点,将它们设置为 output-low。
- 成功编译了
.dts 文件生成了新的 .dtb 文件。
- 在备份原始文件后,将新的
.dtb 文件替换了开发板eMMC存储 /boot 分区里的原始文件。
- 重启后,系统就无法启动了。
【遇到的问题】
系统启动时,串口会打印大量日志,然后卡住不动。出现错误错误信息是 rcu: INFO: rcu_preempt detected stalls on CPUs/tasks。
【串口日志截图】
- 我的系统是烧录在 eMMC 上的,没法像SD卡一样取下来用读卡器修复。
- 因为系统卡在内核启动阶段,我无法通过SSH或正常终端进入文件系统来恢复原始的
.dtb 文件(我有备份文件 .dtb.bak 在 /boot 目录下)。
【侍待解决问题】
- 最关键的:在不重新烧录整个系统的情况下,有什么办法可以进入eMMC的文件系统,把
/boot 目录下的设备树文件恢复?
- 从日志看,我的
gpio-hog 修改是不是和某个系统功能冲突了?我应该如何正确地初始化这些GPIO?
非常感谢任何能提供思路或帮助的朋友!
mark
2
进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分区挂到这个目录上,这样我们就能像访问普通文件夹一样访问它的内容了。
-
创建一个挂载点目录:
sudo mkdir /mnt/emmc_boot
/mnt/emmc_boot 是我们创建的临时目录名,你可以自己随便取。
-
执行挂载命令:
sudo mount /dev/mmcblk2p9 /mnt/emmc_boot
- 如果这条命令执行后没有任何报错,那就说明挂载成功了!
第三步:进入目录,恢复备份文件
-
进入我们刚刚挂载的目录:
cd /mnt/emmc_boot
-
(验证) 查看目录下的文件,确认损坏的 .dtb 文件和你的备份 .dtb.bak 文件都在:
ls -l
先检查当前目录是否为你的boot目录,如果不是,取消挂载然后换一个重新挂载
-
(修复) 拷贝替换损坏的文件,然后将备份文件改名恢复:
1. 拷贝替换损坏的设备树文件
sudo cp k1-x_MUSE-Pi-Pro.dtb.bak k1-x_MUSE-Pi-Pro.dtb
第四步:卸载分区并重启
修复工作已经完成!现在需要安全地卸下这个挂载,然后重启开发板。
-
首先退回到根目录,一定不能停留在挂载目录里,否则无法卸载。
cd /
-
卸载分区:
sudo umount /mnt/emmc_boot
-
现在一切都恢复了。请先关机,然后拔掉SD卡。以确保下次启动时开发板会从eMMC加载。
-
关机:
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 个赞