|
本帖最后由 euzen 于 2022-4-11 08:56 编辑
手上的大麦DM4036是多年前开通长城宽带赠送的,没开几次就吃灰了,最近因为折腾青龙面板,将它翻出来刷成了armbian,一时操作不慎,搞坏了bootloader,为了修复它花了近大半个月时间,付出时间精力应该远大于它现在的价值了,毕竟现在咸鱼上一般标价才40左右。因为研究需要,还蹲点收了个25元不包邮,感觉自己对这个修砖的研究实在是爱得深沉。现在将修复过程中的的一些经历写下来,以方便其他有同样需要的爱好者。期间参考了论坛很多帖子,得到不少有用信息,写下这些,也算是回馈一下。
DM4036的SOC是amlogic的 S905B,同时它应该是所谓的高安版本,接口上只有100M网口,HDMI和USB(OTG),没有TF卡接口。其他使用S905系列(L,M,X)的盒子,遇到bootloader损坏,基本上都可以使用相同思路解决问题。坛里某个帖有人说过,只要硬件没问题,这类盒子就是刷不死的,现在是深以为然,极为认同。有人手上依然拿着砖,区别只是是否愿意动手,是否找到相关资源(aka:救砖包)。
事情起因是这样的,我将DM4036通过焊接TTL线进uboot里改env参数的办法,在U盘里刷了 Armbian_5.44_S9xxx_Ubuntu_xenial_3.14.29_server_20180515.img 这个包,Linux跑起来正常,docker装好了,v2ray也能跑,还试过运行里面的脚本,将系统迁移到eMMC,不过操作并不成功,还将里面的安卓系统搞死了,不过我只需要armbian,所以对安卓的损坏并不在意,此时并没有意识到这是一个危险操作。但这个armbian包有一个缺点就是linux核心版本比较旧,docker只能安装17版本,v2ray安装sevice也要做一些修改。以于就继续寻找较新核心的镜像包。之后用同样方法安装了Armbian_20.10_Arm-64_focal_current_5.9.0.img,这次可以使用20版本的docker了,其他都一切正常,然后又跑了一下里面的install-aml-s905-emmc.sh,嘿嘿,论坛里至于有两个人因为这样变砖了,算上自己是三人行了。后面看了看脚本,它是先将emmc里的前4M bootloader区内容备份,然后换上它新版的uboot(8M左右),重启后盒子废了。TTL里连接,反复只有类似下面的信息:
- GXBB:BL1:08dafd:0a8993;FEAT:FDFD31BC;POC:3;RCY:0;EMMC:0;READ:0;CHK:F3;SD:800;USB:8;
复制代码 这串信息是什么意思呢,网上搜索了一下,找到了答案。详细的可以看看这个 romboot初步解析
大概就是POC:3 power on config种类是3,代表读取启动介质的顺序是EMMC->SD卡->USB。EMMC:0 硬件正常;READ:0 数据读取正常; CHK:F3 数据校验错,错误代码为F3。SD:800 响应超时,USB:8 未启用(?)
为什么校验会出错呢,据自己猜测,因为盒子是所谓高安版本,bootloader程序是加密了的,而Linux里脚本写入的uboot是未加密版本,校验都过不了,更不要说正常启动了。这也是后来很多网上找来的工具附带的uboot均无法顺利写入的原因。下图是未加密和加密后UBOOT的比较,左边是未加密,会有@AML这个标识。
前面说过这类盒子刷不死,顺带简单说说我的理解。它的启动过程是这样的,写在SoC(简单解理为CPU啦)里的BL1上电后运行,读取POC信息后,按顺序查找EMMC,SD(或TF),和USB口上的BL2和BL3程序,进入UBOOT,再进一步启动emmc或其他介质上安卓或Linux。盒子里的BL2,BL3是写在EMMC上的,EMMC上的BL损坏后,还可以通过SD卡和USB方式补救,注意这个USB并不是U盘,而是USB线连接电脑进行相关启动,其实就是平时我们进行的线刷的首要阶段。这可以从USB_Burning_Tool的日志上得到印证。下面的类似 Run at address 0xd9000000,就是将BL2上传到盒子内存后运行。
- [00:01:30 485][HUB1-3][Inf]--Start burning...
- [00:01:30 546][HUB1-3][Inf]--------------ERASE BOOTLOADER------------
- [00:01:31 056][HUB1-3][Inf]--2-0-0-0
- [00:01:31 056][HUB1-3][Inf]-------------Download DDR.USB-----------
- [00:01:31 056][HUB1-3][Inf]--2-0-0-0
- [00:01:31 056][HUB1-3][Inf]--Control write pll reg1 0xd9000000:0x000000b1
- [00:01:31 569][HUB1-3][Inf]--Control write pll reg1 0xd9000000:0x00005183
- [00:01:32 085][HUB1-3][Inf]--Control write pll reg1 0xd9000000:0x000000b1
- [00:01:32 595][HUB1-3][Inf]--Control write pll reg1 0xd9000000:0x00005183
- [00:01:33 106][HUB1-3][Inf]--Write initial succeed
- [00:01:33 106][HUB1-3][Inf]--Upload encrypt at 0xc8100228
- [00:01:33 106][HUB1-3][Inf]--ulValue = 0xfdfd31bc
- [00:01:33 106][HUB1-3][Inf]--File change to DDR_ENC.USB
- [00:01:33 106][HUB1-3][Inf]--Read encrypt value succeed
- [00:01:33 119][HUB1-3][Inf]--Transfer complete
- [00:01:33 119][HUB1-3][Inf]--Run at address 0xd9000000
- [00:01:33 120][HUB1-3][Inf]--RunInRam succeed
- [00:01:33 134][HUB1-3][Inf]--2-0-0-0
- [00:01:33 134][HUB1-3][Inf]--CheckFileRunState succeed
- [00:01:33 134][HUB1-3][Inf]--runResult:0x 0,paraMagic:0x3412cdab
- [00:01:33 134][HUB1-3][Err]--ReadPara failed
- [00:01:33 136][HUB1-3][Err]--[0x10105002]Romcode/初始化DDR/读取初始化结果/USB控制命令出错
- [00:01:33 136][HUB1-3][Inf]--Close device handle 0x00000650
- [00:01:51 777][Global][Inf]--Catch DBT_DEVICEREMOVECOMPLETE
复制代码
变砖后,对各种方法都进行了尝试。
首选方案是大家都首先想到的救砖包,但DM4036不是理财产品N1、T1,作为盒子它似乎比较小众(我错了!)玩它的人不多。既然都是晶晨的CPU,前面都是S905,反正都变砖了,所以尝试了webpad著名的T1救砖包,当然是失败了。上面日志就是使用T1救砖包刷机的失败过程,也是很多人会求助的卡在1%,2%”[0x10105002]Romcode/初始化DDR/读取初始化结果/USB控制命令出错“,其中有人说他们遇到了这个错误后,使用换系统,换USB口,换短线,快速插拔或使用指定的USB_Burning_Tool版本的方法跑完了100%,但自己尝试了大部分类似方法,依然失败。而且之前自己曾用相同的系统相同的U口相同的线成功刷过其他包的,只是那时是没有勾选刷除flash和bootloader罢了。估计这个包刷不上,是因为CPU不一致的缘故,救砖包方案尝试到此终止。
其次是使用aml官方的linux版本update工具,这是一个在github上的项目,链接: aml-usb-load-uboot,说明声称 ”Amlogic USB Burning Tool used to load Mainline U-boot without any storage”,这是运行于linux上的命令行刷机工具,但因为附带的BOOTLOAD是非加密版本,当执行到上传“u-boot.bin.usb.tpl”时就报错了。手上虽然有原机备份的BOOTLOAD,但缺乏资料和工具,无法将其拆解成所需的DDR_ENC.USB,UBOOT_ENC.USB等文件。这个以后有时间,可以再继续研究一下。
再次尝试不同方案是因为搜索到webpad的飞线板载emmc救砖的帖子,链接:大麦盒子 DM4036 在位飞线读写板载EMMC,bootloader损坏救砖|机顶盒/智能电视 - 数码之家 (mydigit.cn),为此还花费数元注册了个账号才能读到这个贴子的内容。执行难度比较高,要在细如发丝的印刷电路上刮漆,焊上飞线,不过还是咬咬牙完成了。不过结果还是不如人愿,电脑上并不能正常读到数据,只有瞬间认出29.3G容量然后消失。换过不同的读卡器也是如此,不知道是读卡器的兼容性问题还是自己手艺太差所致。不过看了这个帖也不是没有收获,它公布了一个webpad大佬所在的Q群,336730393。申请过了两天后才成功加入,这个多年前拉起来的群,本来是不抱太大希望可以申请成功的了,看到加入后着实有些惊喜。群已经比较冷清了,但群文件里有非常珍贵实用的资料,也因为这份资料才有了最终的成功。那就是一件大杀器,DM4036的电路原理图。
最终方案,飞线SD卡。大麦DM4036成品是阉割了TF接口的,但在PCB里有相关引脚,估计是为了方便调试吧,如果是其他有TF卡接口的盒子,损坏bootload要挽救就容易得多了,找到原机备份的bootload数据,制作一张启动卡即可。DM4036的SD卡引脚在CPU的同一面上,需要将板子从散热硅胶上拆下来才能进行焊接。相关定义如下:
- TP19-D0
- TP20-D1
- TP21-D2
- TP22-D3
- TP23-CLK
- TP24-CMD
- 另外 电源和地可以使用
- TP10-3.3V
- TP11-GND
复制代码
怎样制作可以启动的SD卡呢,在这里又走了不少弯路,官方有制作工具:SDcardMaker,因为使用的是win10系统,启动工具后连读卡器盘符都出不来,后面尝试以“管理员身份运行”才成功出现读卡器盘符。另外程序不要放在有中文字符的文件夹里,否则会一直提示找不到你选择的bin文件。因最后,在选择*.bin时又兜回去高安版本的困境,没有适用的加密版本固件。在一众下载回来的uboot.bin里不断尝试还是失败告终。(后话:可以尝试将备份的4Mb bootload数据改后缀为.bin来进行制作,因为自己拆除了焊接了SD卡槽后才想到这方面,没有进行验证)
然后是使用Linux的dd命令进行写入,在这里也踩了坑。因为之前分析过那个害我变砖的脚本,它是从emmc的0字节开始保存4MB数据的,于是我也将备份从0字节开始写回SD卡,结果是:
- GXBB:BL1:08dafd:0a8993;FEAT:FDFD31BC;POC:3;RCY:0;EMMC:0;READ:0;CHK:F3;SD:0;READ:0;CHK:F3;USB:8;
复制代码 可以看到,SD卡也正确读到数据了,但还是跟emmc一样校验错误。后面查了不少资料:
How to Create a Bootable Recovery SD Card for Amlogic TV Boxes - CNX Software (cnx-software.com)
friendlyarm/sd-fuse_amlogic: Create bootable SD card for NanoPi K2 (Amlogic S905) (github.com)
才知道需要从512字节后写入,前512字节是SD卡自己的分区信息,不能覆盖。所以,正确的步骤 是:
1,买个SD卡或TF卡后插槽,飞线焊接到主板上。
2,找个SD卡,容量随便,在Linux环境中执行 sudo dd if=u-boot-default-aml-s905.img of=/dev/sdb bs=512 seek=1
上述命令中的u-boot-default-aml-s905.img是变砖脚本良心发现帮我备份下来的bootloader数据,/dev/sdb 是我的sd卡设备。bs=512是指每个块是512字节,seek=1指跳过一个块(即512字节),不覆盖原SD卡分区信息。
3,将写好数据的SD卡插上,上电,就可以回到熟悉的UBOOT环境。
4,在UBOOT环境中,在USB口中插入原来搞坏bootloader的那个Linux U盘,手工执行里面的s905_autoscript,让Linux启动起来。我的内容如下,可能因不同版本并不相同。
- setenv env_addr "0x10400000"
- setenv kernel_addr "0x11000000"
- setenv initrd_addr "0x13000000"
- setenv boot_start booti ${kernel_addr} ${initrd_addr} ${dtb_mem_addr}
- if fatload usb 0 ${kernel_addr} zImage; then if fatload usb 0 ${initrd_addr} uInitrd; then if fatload usb 0 ${env_addr} uEnv.ini; then env import -t ${env_addr} ${filesize};fi; if fatload usb 0 ${dtb_mem_addr} dtb.img; then run boot_start; else store dtb read ${dtb_mem_addr}; run boot_start;fi;fi;fi;
复制代码 5,登录盒子上的这个Linux,在里面执行 sudo dd if=u-boot-default-aml-s905.img of=/dev/mmcblk0 , 将备份数据写回emmc上,注意of=指向的emmc设备名因人而异,要先确认一下。
6,后面就是常规的uboot环境救砖了,因为我只需要在UBOOT里跑U盘上的Linux系统,不需要修复安卓,而且论坛里其他帖子有很多这部分的讨论,就不再重复了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|