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
6.11k stars 1.96k forks source link

添加对于allwinner H6的支持 #1110

Closed 13584452567 closed 1 year ago

13584452567 commented 1 year ago

我想为仓库添加泰奇猫的支持,但是它的uboot写入方式和现有的貌似不太兼容?下面是uboot的烧写命令 sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkX bs=8k seek=1 和rebuild里面的不太一样。

ophub commented 1 year ago

你知道的allwinner系列有几种常用的dd设置安排呢?

常用的u-boot方案有几个文件组合?一个spl文件这种是带用的方案?

现在的3列,可不可以放不同列代表不同dd方法?给allwinner的这3个列名按可辩识的命名改一下?

13584452567 commented 1 year ago

我知道的有两种文件排列,一种就是现在的u-boot-sunxi-with-spl.bin,另一种是sunxi-spl.bin和u-boot.itb(也可能是u-boot.bin)两个文件。 但是第一种我目前看到了好几种dd命令,有 dd if=u-boot-sunxi-with-spl.bin of=/dev/mmvblkX bs=1024 seek=8(香橙派,H3主控) dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblkX bs=8k seek=1(泰奇猫,H6主控) 第二种文件搭配方式有 dd if=sunxi-spl.bin of=/dev/mmcblkX bs=1024 seek=8 dd if=u-boot.bin of=/dev/mmcblkX bs=1024 seek=32(A13主控)

还看到有一种单文件使用的是u-boot.fex: dd if=u-boot.fex of=/dev/mmcblkX bs=1k seek=19096(A80主控) 可以参考这个官方的文档,貌似不同的芯片spl的载入地址都不太一样 https://linux-sunxi.org/BROM

13584452567 commented 1 year ago

感觉很难单靠文件名来执行,可能还需要在脚本内添加一个对于主控的判断来进行uboot的写入。

ophub commented 1 year ago

https://github.com/ophub/amlogic-s9xxx-armbian/commit/198e31b3d8cf68d60f9d905fb65913910d12280d

我把model_database.conf里的第5项改名为:BOOTABLE,由这个来区分使用哪个dd方法 seek8 : bs=1024 seek=8 seek1 : bs=1024 seek=1

如果 BOOTLOADER_IMG 和 MAINLINE_UBOOT 都添加了文件走2个dd的方法

13584452567 commented 1 year ago

bs=8k和bs=1024一样吗?我不是很清楚

13584452567 commented 1 year ago

哦,是我没反应过来。实际上H3和H6都是跳过8k,所以其实就和原先一样,用文件数量区分即可。

ophub commented 1 year ago

真抱歉,我刚找你的文件没了,又被覆盖了,晕倒,而且我把服务器的资源拉到本地,把我一上午修改的都覆盖了。 我的意思是设置一个参数如BOOTABLE,用他的值来区分走哪条dd语句。 你更正一下这个名字叫个什么好。

ophub commented 1 year ago

稍等我再更新一个错误,然后你再提交吧,我一会提交了回复你一下。

13584452567 commented 1 year ago

好的

ophub commented 1 year ago

我更新完了,你重新拉取提交下吧

ophub commented 1 year ago

看官方文档,对u-boot的介绍是1-2个文件,所以这3列, MAINLINE_UBOOT 和 BOOTLOADER_IMG 放u-boot文件,另外的列BOOTABLE用于区分用法。

model_database.conf里BOOTABLE 的 seek8和seek1是我暂时起的名字和赋予的值,是为了区分dd用哪个方法。 这个名字起的不好,变量名和赋值都不能代表本来的意思,你更新一下名称和赋值吧

13584452567 commented 1 year ago

翻阅了官方文档,对于SPL写入地址目前就3个,0x00000、 0x10000、 0x20000。 其中0x00000都是以前的主控,比如A10A20那些。比较特殊的,H3也是这个地址。可以命名为early(这样可能也不太好?这些都是32位的soc) 0x10000只看到A64是这样的,可以直接命名成A64。 比较新的主控比如H6,H616的SPL地址就是0x20000,可以直接命名为latest(或者aarch64)

有两个文件的话8KB处写入spl,40KB处写入u-boot proper。

全志对于SD卡和NAND的块大小设定貌似还不太一样,https://source.denx.de/u-boot/u-boot/-/commit/1f6f61fe4c7c9637e2c8b2960a08f106fbe01134 原话是:The size of the SPL must be a multiple of 8 KiB in NAND and a multiple of 512 bytes on the SD card

ophub commented 1 year ago
+---------------+---------------------+-----------------+--------------------------
:MODEL          :SPL_LOAD_ADDRRESS    :MAINLINE_UBOOT   :BOOTLOADER_IMG
+---------------+---------------------+-----------------+--------------------------
:Vplus-Cloud    :early                :                 :u-boot-sunxi-with-spl.bin
:TQC-A01        :latest               :                 :u-boot-sunxi-with-spl.bin
:xxx            :NA                   :u-boot.bin       :sunxi-spl.bin
+---------------+---------------------+-----------------+--------------------------

结合你的命名意见,你看看这么修改如何,这个参数叫 SPL_LOAD_ADDRESS 或者 SPL_ADDRRESS ,目前的2个盒子分别对应是 earlylatest,如果有2个的可以不赋值直接走2条dd命令。如果将来有 a64 使用单个u-boot文件的时候,使用这个备用选项。

13584452567 commented 1 year ago

很棒! 不过两个盒子虽然dd命令不一样,但是实际写入都是从8K开始写的,所以两个应该都是latest。 和官方文档里面一样写成SPL_LOAD_ADRESS吧

ophub commented 1 year ago
bs=8k seek=1    #读写8k大小,跳过1块,是跳过8k开始写入
bs=1024 seek=8  #读写1k大小,跳过8块,也是跳过8k开始写入

这2个dd命令的结果有什么区别?我晕了

13584452567 commented 1 year ago

应该没什么区别,我一开始也没反应过来。就结果来说都是把uboot写入到8KB处

ophub commented 1 year ago
dd --help
Usage: dd [OPERAND]...
  or:  dd OPTION
Copy a file, converting and formatting according to the operands.

  bs=BYTES        read and write up to BYTES bytes at a time (default: 512);
                  overrides ibs and obs
  cbs=BYTES       convert BYTES bytes at a time
  conv=CONVS      convert the file as per the comma separated symbol list
  count=N         copy only N input blocks
  ibs=BYTES       read up to BYTES bytes at a time (default: 512)
  if=FILE         read from FILE instead of stdin
  iflag=FLAGS     read as per the comma separated symbol list
  obs=BYTES       write BYTES bytes at a time (default: 512)
  of=FILE         write to FILE instead of stdout
  oflag=FLAGS     write as per the comma separated symbol list
  seek=N          skip N obs-sized blocks at start of output
  skip=N          skip N ibs-sized blocks at start of input
  status=LEVEL    The LEVEL of information to print to stderr;
                  'none' suppresses everything but error messages,
                  'noxfer' suppresses the final transfer statistics,
                  'progress' shows periodic transfer statistics

N and BYTES may be followed by the following multiplicative suffixes:
c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000, M=1024*1024, xM=M,
GB=1000*1000*1000, G=1024*1024*1024, and so on for T, P, E, Z, Y.
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

看文档是一样的,结果是等价的: 读取写入大小 * 块数 = 乘积 那不用判断了