页次: 1
猜测,brom里面自动搜索spi nand flash 有效spl,这个是合理的,而且也很有可能就是这样,但很有可能,D1 的brom是每个page读取2k,这样对于2k page的spi nand flash就无需留空了。
我重新用PhoenixSuit烧录了一个tina的固件(spl是64k),从spinand读一下内容发现spl在每个block上(0x0、0x20000、0x40000、0x60000...)都有一份,应该是为了防止坏块做的多备份,brom会从前往后找到可用的spl来加载。(不知道为什么我之前的spl备份是在0x10000上而且后面没有,暂时先不纠结了)
把d1-baremetal.bin再烧录spinand的0x0位置上,启动的就是d1-baremetal.bin。D1的brom每个page读取2k这个我感觉很有可能。
@xboot
我的板子只有spinand,加上了get_boot_device,处理一下返回值输出到串口,也确认是BOOT_DEVICE_SPINAND。flash型号是出厂的那个MX35LF2GE4AD,看了下page是2k。
然后做了点实验,对d1-baremetal.bin做了修改:crc替换一个字节、magic替换一个字节、bin末尾替换一个字节,这样分别生成了3个bin并用xfel烧录到spinand的0地址,发现启动都没有被brom加载。不过brom加载了64k偏移位置的另一个spl,怀疑是之前我用PhoneixSuit烧录的固件在nand的64k位置备份了一个spl,把这段再换掉就起不来了。(之前很疑惑起的spl打印不是我编的,在另外帖子看到下面的话然后去dump了一下flash内容发现64k位置还有一个spl)
Some SoCs can also boot from SPI NAND flash. Here the BROM tries to read a valid first stage bootloader starting from page number 0, 32, 64, 96, 128, 160, 192 and 224. It only reads the first 1024 bytes from every page.
所以我得出的结论是brom对spinand的magic和crc都是有校验的,并且看起来不是每个页只读1K,这个跟上面这段话有点矛盾~
我看了之后还有点疑问,现在的裸机程序是24k,我用xfel烧到spinand,xfel会写1k跳1k吗?如果不会的话,既然代码已经起来了,是不是说明d1的brom可以连续读取nand flash了?
日志贴出来看看
编译和烧录:
woolen@ubuntu:/disk4/allwinner_d1/d1-baremetal$ make CROSS=riscv64-unknown-elf-
[AS] source/start.S
[AS] source/memcpy.S
[AS] source/memset.S
[CC] source/sys-clock.c
[CC] source/sys-dram.c
[CC] source/sys-uart.c
[CC] source/sys-spinor.c
[CC] source/main.c
[CC] source/sys-jtag.c
[CC] source/sys-copyself.c
[LD] Linking output/d1-baremetal.elf
[OC] Objcopying output/d1-baremetal.bin
copy from `output/d1-baremetal.elf' [elf64-littleriscv] to `output/d1-baremetal.bin' [binary]
Make header information for brom booting
The bootloader head has been fixed, spl size is 24576 bytes.
woolen@ubuntu:/disk4/allwinner_d1/d1-baremetal$ xfel version
AWUSBFEX soc=0x00185900(D1/F133) 0x00000001 ver=0x0001 0x44 0x08 scratchpad=0x00045000
woolen@ubuntu:/disk4/allwinner_d1/d1-baremetal$ xfel spinand write 0x0 output/d1-baremetal.bin
100% [================================================] 24.000 KB, 246.427 KB/s
重新上电后串口打印,只有ddr的部分。
DRAM only have internal ZQ!!
get_pmu_exist() = 4294967295
ddr_efuse_type: 0x0
[AUTO DEBUG] two rank and full DQ!
ddr_efuse_type: 0x0
[AUTO DEBUG] rank 0 row = 15
[AUTO DEBUG] rank 0 bank = 8
[AUTO DEBUG] rank 0 page size = 2 KB
[AUTO DEBUG] rank 1 row = 15
[AUTO DEBUG] rank 1 bank = 8
[AUTO DEBUG] rank 1 page size = 2 KB
rank1 config same as rank0
DRAM BOOT DRIVE INFO: %s
DRAM CLK = 792 MHz
DRAM Type = 3 (2:DDR2,3:DDR3)
DRAMC ZQ value: 0x7b7bfb
DRAM ODT value: 0x42.
ddr_efuse_type: 0x0
DRAM SIZE =1024 M
DRAM simple test OK.
页次: 1