您尚未登录。

#1 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-10 14:22:18

@xboot
感谢,我今天想试一下,发现大佬已经写好了,这边d1-baremetal用spinand已经测试OK。

#2 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-09 15:23:09

xboot 说:

猜测,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这个我感觉很有可能。

#3 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-09 12:04:54

@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,这个跟上面这段话有点矛盾~

#4 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 20:17:09

xboot 说:

看这个帖子吧。
https://whycan.com/t_5527.html

我看了之后还有点疑问,现在的裸机程序是24k,我用xfel烧到spinand,xfel会写1k跳1k吗?如果不会的话,既然代码已经起来了,是不是说明d1的brom可以连续读取nand flash了?

#5 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 15:16:49

xboot 说:

@woolen
这个测试demo仅支持spi nor flash引导,如果要支持spi nand引导,需要做两个工作,一个是实现spi nand自拷贝,另一个是,一个page只能使用前2k,后面的需要空着。

spi nand flash 引导是有点特殊的。但只要满足这两个要求,就可以实现spi nand 自举了。

谢谢回复。
“一个page只能使用前2k,后面的需要空着” 这个我不太理解,能详细说一下吗?

#6 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 14:52:19

知道了,nand拷贝到mem的部分还没写,我自己改一下...

	if(d == BOOT_DEVICE_SPINOR)
	{
		mem = (void *)__image_start;
		size = __image_end - __image_start;

		sys_spinor_init();
		sys_spinor_read(0, mem, size);
		sys_spinor_exit();
	}
	else if(d == BOOT_DEVICE_SPINAND)
	{
	}

#7 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 13:55:42

cube 说:

日志贴出来看看

编译和烧录:

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.

#8 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 12:35:12

@cube
从代码里面直接编译出来的bin,有执行mksunxi的,而且ddr初始化的部分有打印的,应该是已经被加载到了sram然后执行了一部分?

#9 Re: 全志 SOC » 为方便大家研究全志RISCV D1芯片,花了点时间编写了一个精简版的裸机程序,方便大家学习参考。 » 2021-12-08 11:52:13

请问我用xfel工具直接在DDR中运行d1-baremetal.bin,可以正常运行,但是烧录到d1自带spinand的0地址后,重启只有ddr初始化成功的打印,没有main的count循环打印,这个正常吗?我测过从spinand读出来24k确认已经烧录成功了。

#11 Re: 全志 SOC » 想用自己的memcpy替代libc.a里面的memcpy » 2021-12-08 10:44:50

LDFLAGS+= -Wl,--defsym=malloc=myAlloc
或者使用--wrap选项。

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn