Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

感谢ophub大佬!分享一些关于晶晨amlogic盒子刷Armbian的奇怪但很可能有用的知识 #491

Closed
xcray opened this issue Aug 15, 2022 · 3 comments
Labels
documentation Improvements or additions to documentation essence Recommended essence posts

Comments

@xcray
Copy link

xcray commented Aug 15, 2022

这段时间折腾魔百盒,花了不少时间找各种文章看,也踩了不少坑,感觉有必要总结一下,对于还在迷茫的同学应该可以有些帮助。错误之处请大家指正!

  1. 首先,大写的“乱”字!不但是盒子硬件乱(同一个型号有多个版本而且没有文档说明的硬件)、软件乱(不同的安卓线刷包卡刷包差异很大、armbian版本众多),而且最坑人的是文章乱,很多文章作者自己根本没搞清楚、可能到处找教程各种试偶然刷成功了写个教程,却丢失或甚至故意隐瞒一些重要信息。。。反正是坑人没商量。
    最恶心的是大量质量低劣的所谓教程,作者还当作独家秘笈遮遮掩掩的不痛快说,甚至有的还想靠它赚钱。。。

由于乱,所以对于绝大多数想刷机的同学来说也就只能“试”,但是试的过程中如果能加上思考和分析,肯定可以避免一些坑。

  1. 关于镜像,对于同样的armbian系统版本和内核版本针对不同机型的镜像,99%以上的内容都是相同的。区别主要是对于启动的配置信息。所以可以随便下载,并且无论哪个镜像,直接启动安装的成功率都不高,大多数情况下都需要调整设置。甚至用于allwinner、rockchip的镜像,和amlogic的镜像也没有多大区别,因为内核和各种二进制文件对于arm都是通用的(现在主流是64位的是armv8),就像微软的windows可以同时用于intel和amd一样。

  2. 第一个关键点是dtb文件,这东西类似于x86平台上bios(cmos)中的硬件配置信息。这个没选对的话启动成功的可能性会很小,即使启动了也容易报错死机。dtb和内核版本相关,一般都是随着内核编译的(或者说内核源码包含dtb的源码)。不过一般都可以跨版本使用,有一定的后向前向兼容性。网上现成的dtb有时候不太好用,所以玩这些东西迟早要学会自己编辑源码自己编译。

  3. 第二个关键,也是最大的坑,就是u-boot。和常见的x86电脑不同,armbian启动靠的就是这个(已经是嵌入式Linux事实上的标准了)。
    这东西和内核的关系很密切,而且是整个armbian安装过程中最难最坑人的地方,必须选对才行。
    先不展开,记住主要用的较新的可分为两种:完整版(大多数文章作者包括ophub大佬有时不太准确地称之为主线mainline)和不完整版(也叫overload、chainload)。
    从版本新旧上来说,更正确一点的说法:主线指的是比较新的版本、非主线是很旧的版本(具体分界点在哪儿我也不知道);主线又分为完整版和不完整版(参考那个著名的e900v22c教程)。

  4. 第三个关键,内核。版本众多,更新快。这里分成两大类:

  • 5.10+(也就是5.10及以上的版本,但不包含5.15);现在最新的已经到了6.x;
  • 5.9-,也就是5.9及以下版本,包括5.15;现在流行的最低版本是5.4。
    安卓也是拿linux改的,但内核版本都比较低,好像没超过4.x?
    为啥5.15这么另类?经O大指点,这里的5.15内核原来是f大修改过的,不用新版-主线-uboot就可以启动的

内核和u-boot的关系,笼统地说,5.10+内核必须用主线uboot引导。换个说法,旧版uboot无法用于引导5.10+内核。反过来,旧版uboot只能用于引导5.9-内核;而主线uboot则可以用于引导4.16+版本的内核。

  1. armbian能顺利启动,内核和uboot的组合正确是必要条件(当然正确的dtb也是必要条件)。和内核可以适用于大多数arm不同,uboot和具体机型(硬件)又紧密相关,同一个cpu的都很少能互换,甚至两个同型号的盒子都不能通用。

  2. 还得回来说uboot。看过第4点估计就有人有疑问了:既然主线uboot那么好,干脆就只用主线不就好啦?道理上是没错,但前提是你得先能够找到正确的好用的主线uboot!
    不像内核是完全开源的,好找,即使找不到逼急了自己编译都行。而uboot则不一样,只有一部分是开源的,晶晨把着很关键的一部分死活不开源(这一点allwinner和rockchip值得表扬)。所以amlogic盒子找到好用的主线uboot,尤其是完整版主线uboot,那么可以说人品爆棚,成功也就剩下具体的安装动作了。
    好用的完整版主线u-boot属于可遇而不可求的珍品,除非有大神正好使用和你一样的盒子并且制作了这个珍品,抑或你自己就是大神自己会制作(可别不学好小家子气,放出来让大家共享)。

有这个珍品的情况下,启动过程简洁而迅速:

完整主线uboot=>任意4.16+内核

没有好用的完整版主线u-boot的情况下,写入emmc时不写bootloader就成了明智的选择(无奈的选择)。
但是5.10+内核又必须由主线uboot引导,怎么办?答案就是overload机制,就是把不完整版主线uboot文件拷贝到boot分区,改名为u-boot.ext(U盘)或u-boot.emmc(emmc)。

启动过程:

安卓uboot=>不完整版主线uboot(又叫overload)=>5.10+内核;
5.10+内核必须由主线uboot引导;有的uboot搭配部分版本内核有开机拿不到IP的问题(已有解决方案,见https://github.com/ophub/amlogic-s9xxx-armbian/issues/557);

  • 关于不完整版主线uboot,个人感觉chainload一词比overload更准确一点;

安卓uboot=>5.9-内核(包括修改版5.15);
有时会不认网卡、内存只能认一半(好像5.15.60解决了这一顽疾);如果没有问题,这应该是没有主线(无论完整版还是不完整版)的情况下的最佳方案。

如果有不认网卡内存认一半或1G的问题,那么解决方法就是加上overload,即:

安卓uboot=>不完整版主线uboot(又叫overload)=>4.16+~5.9-(含修改版5.15)内核;

换个角度:完整版主线uboot是利用dd命令写入到emmc的bootloader区域(开头部分)的;而不完整版主线uboot是存放在boot分区文件系统里的u-boot.emmc(emmc)或u-boot.ext(U盘)的、用cp/mv命令拷贝改名的文件。
什么?文件也可以用dd命令?您是大神!不过我得问问到底是啥好吃的让您给撑成这样?

  1. 理论说完了,具体该怎么干呢?我的建议是只能试着挑选,过程中如果有TTL会更加直观、高效:
  • 先拿U盘试,用5.15内核,不要overload,通过修改uEnv.txt然后重启挨个试出最合适的dtb。
  • 确定合适dtb后,再逐个测试uboot;
    把候选uboot逐个改名为u-boot.ext、重启,观察TTL。直到找出启动最顺畅最没问题的那个。
    这一步可以用5.10+内核,也可以用5.9-内核。
  • 如果没有合适的完整版主线u-boot,那就老老实实用5.9/5.15内核吧。
  • 如果现成的不合适,编辑/etc/amlogic_model_database.conf,加一行,把选出来的dtb和不完整版主线uboot写上;
    完整版主线uboot那个字段写NA。
  • 写入emmc,选自己知道正确的编号。因为指明了没有完整版主线uboot,所以不会写入bootloader。不放心的话加no。
  • 如果有不认网卡、内存少一半的情况,在emmc的启动分区添加u-boot.emmc(overload)。
  1. 完整版主线uboot怎么试?
    只能冒着变砖的风险写入emmc的bootloader区域,把emmc内原有的版本较低的安卓uboot覆盖掉。
    不成功便成仁,大不了重新线刷救砖而已。
@ophub
Copy link
Owner

ophub commented Aug 15, 2022

# Get kernel TEXT_OFFSET, For u-boot.ext and u-boot.emmc
# With TEXT_OFFSET patch is [ 0108 ], without TEXT_OFFSET patch is [ 0000 ]
K510="1"
[[ "$(hexdump -n 15 -x "/boot/zImage" 2>/dev/null | head -n 1 | awk '{print $7}')" == "0108" ]] && K510="0"

5.10及以后的内核上游做了调整,和之前的引导方式不同了。5.15原版也一样,f大加了TEXT_OFFSET补丁,采用了原来的方式。

u-boot在5.4/5.15下不需要,对于安装列表里己知的设备自己复制也可以,但未知设备会因为选择错误而无法启动。(仅限于复制,不要改名,改了名字就没这个文件了,在更新5.10/5.18/5.19等内核时会因为缺失而无法生成u-boot.emmc,无法启动)

@xcray
Copy link
Author

xcray commented Aug 15, 2022

哦,5.15原来是f大修改过的,怪我之前不了解。

另外,看来那个e900v22c教程属实该更新了

@ophub ophub closed this as completed Aug 16, 2022
@xcray
Copy link
Author

xcray commented Aug 19, 2022

最可恨的就是有些不完整版主线uboot(overload)在u盘上启动没问题,写到emmc就起不来!如果用ttl观察,很可能是不认emmc。
这个问题的可恨之处在于无法事先发现。
如果出现了这种情况,也不用重新线刷,把含有系统的u盘插上重新开机,还是可以起来的,甚至很可能起来后根系统还是emmc。这时候把内核切换到5.9-就可以了。
即便起来后根系统不是emmc而是u盘,也可以修复emmc的boot分区(还是换内核),而不用再完整地写一遍emmc。头和模块啥时候替换都行,或者重启后再切换一下内核。

@ophub ophub added documentation Improvements or additions to documentation essence Recommended essence posts labels Oct 27, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation essence Recommended essence posts
Projects
None yet
Development

No branches or pull requests

2 participants