ophub / amlogic-s9xxx-armbian

Support for Armbian in Amlogic, Rockchip and Allwinner boxes. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568, rk3399, rk3328, h6, etc.
GNU General Public License v2.0
5.45k stars 1.74k forks source link

所有的S905都不能写入emmc吗? #1173

Closed God-JohnDiamond closed 1 year ago

God-JohnDiamond commented 1 year ago

Describe the bug | 问题描述 所有的S905都不能写入emmc吗? 「我的设备是S905L 是带后缀的 可以刷emmc」

ophub commented 1 year ago

已知的都不能

God-JohnDiamond commented 1 year ago

是缺什么数据吗 关于emmc的dtb还是什么的

7Ji commented 1 year ago

晶晨搞GXBB(S905, S905-H)这代的时候把bootloader的位置定死在了eMMC用户区域(主线内核看到的mmcblk2)的第一个扇区起,这个位置和主流的分区格式(MBR和GPT)均冲突了。只要写MBR/GPT分区表,就会把bootloader损坏,砖机且无法启动。这么搞,是因为晶晨觉得自己搞出来的专有格式分区表(我的项目ampart可以读写这种分区表)给自己的原厂内核用就够了,完全没考虑到非安卓和非原厂内核的使用情景。

GXBB之后,GXM (S912) 和 GXL(S905X/L/D/W) 起, 他们把bootloader的位置改成了用户区域和启动区域均可以存放(主线内核看到的mmcblk2, mmcblk2boot0mmcblk2boot1),且是从第二个扇区开始存放,所以可以在eMMC上建立MBR分区表和GPT分区表了,这个仓库里的安装脚本就是在eMMC上创建MBR分区表来安装的,也因此只能在GXM/GXL之后的平台上安装。

但是,在GXBB上,安装到eMMC并非不可能(下面信息来自使用S905的小米盒子3C (MDZ-16-AA)):

[root@mi3 ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk2      179:0    0  3.7G  0 disk 
└─mmcblk2p1  179:1    0  3.7G  0 part /
mmcblk2boot0 179:32   0    2M  1 disk 
mmcblk2boot1 179:64   0    2M  1 disk 
zram0        254:0    0  932M  0 disk [SWAP]
[root@mi3 ~]# cat /boot/extlinux/extlinux.conf 
LABEL   Arch Linux
LINUX   /boot/vmlinuz-linux-aarch64-flippy
INITRD  /boot/initramfs-linux-aarch64-flippy.img
FDT     /boot/dtbs/linux-aarch64-flippy/amlogic/meson-gxbb-p201.dtb
FDTOVERLAYS /boot/dtbs/overlays/meson-disable-ethernet-mac.dtbo /boot/dtbs/overlays/meson-gxbb-disable-usb1.dtbo
APPEND  blkdevparts=mmcblk2:-@1M(root) root=/dev/mmcblk2p1 rw audit=0

如你所见,内核可以通过命令行参数blkdevparts来直接声明分区,该参数的文档见kernel.org

然后,启动前环境,有几个不同的方案可以考虑:

当然,上面所有的安装路线,都需要手操。我在这里只给出思路。

实际手操安装前,我建议你确定自己能在UEFI启动的x86-84设备上,使用efibootmgr手写启动项,不经安装向导,完成一次ArchLinux或者Debian的安装。我不希望被追问分区格式化之类的基础事项,如果你琢磨不透,直接放弃吧。。

7Ji commented 1 year ago

你的盒子是CM211? 那么不是GXBB的S905。S905L是可以直接用MBR分区表安装的

ophub commented 1 year ago

7Ji大佬的每个回复都是经典。资深报告。解释的明明白白,并且还给出解决办法。

God-JohnDiamond commented 1 year ago

感谢大佬的耐心解答,从根上把我的困惑解决了

roseybear098765 commented 1 year ago

晶晨搞GXBB(S905, S905-H)这代的时候把bootloader的位置定死在了eMMC用户区域(主线内核看到的mmcblk2)的第一个扇区起,这个位置和主流的分区格式(MBR和GPT)均冲突了。只要写MBR/GPT分区表,就会把bootloader损坏,砖机且无法启动。这么搞,是因为晶晨觉得自己搞出来的专有格式分区表(我的项目ampart可以读写这种分区表)给自己的原厂内核用就够了,完全没考虑到非安卓和非原厂内核的使用情景。

GXBB之后,GXM (S912) 和 GXL(S905X/L/D/W) 起, 他们把bootloader的位置改成了用户区域和启动区域均可以存放(主线内核看到的mmcblk2, mmcblk2boot0mmcblk2boot1),且是从第二个扇区开始存放,所以可以在eMMC上建立MBR分区表和GPT分区表了,这个仓库里的安装脚本就是在eMMC上创建MBR分区表来安装的,也因此只能在GXM/GXL之后的平台上安装。

但是,在GXBB上,安装到eMMC并非不可能(下面信息来自使用S905的小米盒子3C (MDZ-16-AA)):

[root@mi3 ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk2      179:0    0  3.7G  0 disk 
└─mmcblk2p1  179:1    0  3.7G  0 part /
mmcblk2boot0 179:32   0    2M  1 disk 
mmcblk2boot1 179:64   0    2M  1 disk 
zram0        254:0    0  932M  0 disk [SWAP]
[root@mi3 ~]# cat /boot/extlinux/extlinux.conf 
LABEL   Arch Linux
LINUX   /boot/vmlinuz-linux-aarch64-flippy
INITRD  /boot/initramfs-linux-aarch64-flippy.img
FDT     /boot/dtbs/linux-aarch64-flippy/amlogic/meson-gxbb-p201.dtb
FDTOVERLAYS /boot/dtbs/overlays/meson-disable-ethernet-mac.dtbo /boot/dtbs/overlays/meson-gxbb-disable-usb1.dtbo
APPEND  blkdevparts=mmcblk2:-@1M(root) root=/dev/mmcblk2p1 rw audit=0

如你所见,内核可以通过命令行参数blkdevparts来直接声明分区,该参数的文档见kernel.org

然后,启动前环境,有几个不同的方案可以考虑:

  • 使用我的u-boot fork仓库源码,启用配置CONFIG_ENV_PARTITION,可以通过在u-boot的环境中这样声明一个与blkdevparts格式类似的变量,来规定分区:

    envparts_mmc1=-@1M(root)

    这个是我今天刚搞出来的u-boot分区支持,没有提交主线。上面信息来源的盒子就是这样启动的。

  • 在blkdevparts里多声明几个分区,存储内核等,启动前环境(主线u-boot也好,原厂u-boot也罢)直接从eMMC指定偏移读取内核等,可以参考我的博文
  • 用原厂u-boot。不使用blkdevparts,而是用打了我的这个patch,启用配置CONFIG_AMLOGIC_PARTITION的内核(这边的6.1.某个版本后就打了patch且启用了),设置内核命令行apt_blkdevs=mmcblk2来读取晶晨的私有分区表,再配合ampart来修改这个分区表。
  • 用主线u-boot,利用otg的USB gadget,或者直接原生网卡,从远程tftp服务器(可以是openwrt路由器)加载内核和dtb,然后直接挂载eMMC上的root

当然,上面所有的安装路线,都需要手操。我在这里只给出思路。

实际手操安装前,我建议你确定自己能在UEFI启动的x86-84设备上,使用efibootmgr手写启动项,不经安装向导,完成一次ArchLinux或者Debian的安装。我不希望被追问分区格式化之类的基础事项,如果你琢磨不透,直接放弃吧。。

太猛了,受教

cc66 commented 1 year ago

这个问题是可以解决的,第一扇区大部分都是0,没有意义。分区后,只要重新计算一下校验和即可。

晶晨搞GXBB(S905, S905-H)这代的时候把bootloader的位置定死在了eMMC用户区域(主线内核看到的mmcblk2)的第一个扇区起,这个位置和主流的分区格式(MBR和GPT)均冲突了。只要写MBR/GPT分区表,就会把bootloader损坏,砖机且无法启动。这么搞,是因为晶晨觉得自己搞出来的专有格式分区表(我的项目ampart可以读写这种分区表)给自己的原厂内核用就够了,完全没考虑到非安卓和非原厂内核的使用情景。

GXBB之后,GXM (S912) 和 GXL(S905X/L/D/W) 起, 他们把bootloader的位置改成了用户区域和启动区域均可以存放(主线内核看到的mmcblk2, mmcblk2boot0mmcblk2boot1),且是从第二个扇区开始存放,所以可以在eMMC上建立MBR分区表和GPT分区表了,这个仓库里的安装脚本就是在eMMC上创建MBR分区表来安装的,也因此只能在GXM/GXL之后的平台上安装。

但是,在GXBB上,安装到eMMC并非不可能(下面信息来自使用S905的小米盒子3C (MDZ-16-AA)):

[root@mi3 ~]# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk2      179:0    0  3.7G  0 disk 
└─mmcblk2p1  179:1    0  3.7G  0 part /
mmcblk2boot0 179:32   0    2M  1 disk 
mmcblk2boot1 179:64   0    2M  1 disk 
zram0        254:0    0  932M  0 disk [SWAP]
[root@mi3 ~]# cat /boot/extlinux/extlinux.conf 
LABEL   Arch Linux
LINUX   /boot/vmlinuz-linux-aarch64-flippy
INITRD  /boot/initramfs-linux-aarch64-flippy.img
FDT     /boot/dtbs/linux-aarch64-flippy/amlogic/meson-gxbb-p201.dtb
FDTOVERLAYS /boot/dtbs/overlays/meson-disable-ethernet-mac.dtbo /boot/dtbs/overlays/meson-gxbb-disable-usb1.dtbo
APPEND  blkdevparts=mmcblk2:-@1M(root) root=/dev/mmcblk2p1 rw audit=0

如你所见,内核可以通过命令行参数blkdevparts来直接声明分区,该参数的文档见kernel.org

然后,启动前环境,有几个不同的方案可以考虑:

  • 使用我的u-boot fork仓库源码,启用配置CONFIG_ENV_PARTITION,可以通过在u-boot的环境中这样声明一个与blkdevparts格式类似的变量,来规定分区:

    envparts_mmc1=-@1M(root)

    这个是我今天刚搞出来的u-boot分区支持,没有提交主线。上面信息来源的盒子就是这样启动的。

  • 在blkdevparts里多声明几个分区,存储内核等,启动前环境(主线u-boot也好,原厂u-boot也罢)直接从eMMC指定偏移读取内核等,可以参考我的博文
  • 用原厂u-boot。不使用blkdevparts,而是用打了我的这个patch,启用配置CONFIG_AMLOGIC_PARTITION的内核(这边的6.1.某个版本后就打了patch且启用了),设置内核命令行apt_blkdevs=mmcblk2来读取晶晨的私有分区表,再配合ampart来修改这个分区表。
  • 用主线u-boot,利用otg的USB gadget,或者直接原生网卡,从远程tftp服务器(可以是openwrt路由器)加载内核和dtb,然后直接挂载eMMC上的root

当然,上面所有的安装路线,都需要手操。我在这里只给出思路。

实际手操安装前,我建议你确定自己能在UEFI启动的x86-84设备上,使用efibootmgr手写启动项,不经安装向导,完成一次ArchLinux或者Debian的安装。我不希望被追问分区格式化之类的基础事项,如果你琢磨不透,直接放弃吧。。

7Ji commented 1 year ago

@cc66

这个问题是可以解决的,第一扇区大部分都是0,没有意义。分区后,只要重新计算一下校验和即可。

更新header内,0x50起的,0x10长的对header的sha256sum,可行,但这么搞,没有现成工具很容易算错,多次分区间如果忘记更新也很容易造成惨痛结果。所以我直接没写。

fanybook commented 1 year ago

已知的都不能

是 s905x3 也不能写入 emmc 么,我写完启动不了

7Ji commented 1 year ago

已知的都不能

是 s905x3 也不能写入 emmc 么,我写完启动不了

无关问题,开个新issue吧。这里说的是严格的无后缀S905

luodaoyi commented 1 year ago

N1 也刷不了么

7Ji commented 1 year ago

N1 也刷不了么

N1 是 GXL family 的 S905D

这里说的有问题的是 GXBB family 的 S905

luodaoyi commented 1 year ago

我写了好几次 拔掉u盘重启都是进入盒子的recovery 证明没有写入到emmc里面

cnteddybear commented 1 year ago

大佬好,我的盒子是BestTV R330L, s905l.已用burning tool刷安卓6.0。现在的问题是无法通过av孔复位启动TF卡或U盘, 也就是无法使用Armbian系统了(目前 s905只能在 TF/SD/USB 中使用), 目前burning tool能通过usb链接到盒子,并能烧写,有没有一个可以通过burning tool 烧写的镜像文件或者有什么方法能让盒子从U盘、TF卡启动? 谢谢!

ophub commented 1 year ago

看文档里写的

longfei12k commented 10 months ago

N1 也刷不了么

怎么样了,到底能不能刷入EMMC N1

3nyaww commented 4 months ago

N1 也刷不了么

怎么样了,到底能不能刷入EMMC N1

都不仔细看文的吗?上面说了这里讨论的是不带后缀的S905,N1 是S905D,可以刷入EMMC。