我想实现D1开发板的裸机程序(即不运行任何操作系统),试着用了xboot大神的xfel工具,但这个工具暂时还不支持将程序烧录至nand中,所以只好寻求别的办法,看了D1的启动流程,主要是芯片内部的bootRoM->spl->opensbi+uboot->linux,因为这里想实现的是裸机程序,所以我的想法是bootROM->spl->自己的工程,请问这个方法有可行性吗?求指点。
离线
请问tf卡的格式和大小有要求吗
离线
请问把 boot0 烧到 tf 卡的 8k 偏移位置,是这样烧写的吗
离线
D1的sram大小是32K,和boot0相关的.bin文件,大小均超过了32K,
离线
刚找了一下,没找到SRAM A0
离线
是不是还有一个 SRAM A0?
怎么办呢
离线
March 说:哇酷小二 说:是不是还有一个 SRAM A0?
怎么办呢
感觉那个N-BROM 0x0 - 0xBFFFF 48k 应该是SRAM
不知道里面具体的机制是啥, 猜测这个是brom把boot0加载到这个位置?
这个N-BROM 0x0 - 0xBFFFF不是BROM程序的位置吗?
离线
离线
我先试试烧录到TF卡把,我的TF卡是64G的,还得重买卡,对了 为什么要烧录到TF卡得8K的偏移位置啊
离线
那个boot0的bin文件大小不都接近64G了嘛
离线
不好意了 打错字了
离线
成功将boot0烧到tf中,和直接用xfel运行boot0现象是一样的。 ,在初始化DDR停止了。
离线
成功将boot0烧到tf中,和直接用xfel运行boot0现象是一样的。https://whycan.com/files/members/6619/捕获_20210611-1730.png https://whycan.com/files/members/6619/捕获_20210611-1731.png,在初始化DDR停止了。
https://whycan.com/t_6638.html#p64370
仿照这个修改试一试
离线
串口我已经改过来了
离线
串口我已经改过来了
https://github.com/xboot/xfel/blob/master/payloads/d1/d1-ddr/source/start.S
或者修改boot0,照xboot这个代码初始化一下
ddr_param:
.word 792
.word 3
.word 0x7b7bfb
.word 0x01
.word 0x000010d2
.word 0x0000
.word 0x1c70
.word 0x042
.word 0x18
.word 0x0
.word 0x004A2195
.word 0x02423190
.word 0x0008B061
.word 0xB4787896
.word 0x0
.word 0x48484848
.word 0x00000048
.word 0x1620121e
.word 0x0
.word 0x0
.word 0x0
.word 0x00870000
.word 0x00000024
.word 0x34050100
.word 0, 0, 0, 0, 0, 0, 0, 0
reset:
addi sp, sp, -16
sd ra, 8(sp)
sd s0, 0(sp)
addi s0, sp, 16
call sys_uart_init
call sys_clock_init
la a0, ddr_param
call sys_dram_init
离线
我试试
离线
成功将boot0烧到tf中,和直接用xfel运行boot0现象是一样的。https://whycan.com/files/members/6619/捕获_20210611-1730.png https://whycan.com/files/members/6619/捕获_20210611-1731.png,在初始化DDR停止了。
烧这个试一试:
boot0_sdcard_sun20iw1p1.bin
离线
@哇酷小二
现象是一样的
离线
我去试试看
离线
我去试试看
请问楼主解决了吗
离线
超过32K的话,将初始化用到的函数,数据,指定编译到到前面32K的位置。
link文件参考这个修改。
.text :
{
PROVIDE(__image_start = .);
PROVIDE(__text_start = .);
PROVIDE(__spl_start = .);
KEEP(*(.text.start))
. = ALIGN(8);
*(.text.utils)
PROVIDE(__ddr_bin_start = .);
KEEP(*(.ddr.bin))
PROVIDE(__ddr_bin_end = .);
*/sys-*.o(.text*)
*\\libc.a:*memcpy.o(.text*)
*\\libc.a:*memset.o(.text*)
PROVIDE(__spl_end = .);
*(.entry)
*(.text.vectors)
*(.text*)
*(.iplt)
*(.note.gnu.build-id)
PROVIDE(__text_end = .);
} > ram
PROVIDE(__spl_size = __spl_end - __spl_start);
startup.s文件参考这个修改
.section .text.start
.global _start
.global __Vectors
_start:
/* Boot head information for BROM */
jal x0, reset
//.long 0x0300006f // pc += 0x30
.byte 'e', 'G', 'O', 'N', '.', 'B', 'T', '0'
.long 0x12345678 /* checksum */
.long __spl_size /* spl size */
.long 0x30 /* boot header size */
.long 0x30303033 /* boot header version */
.long 0x00020000 /* return value */
.long 0x00020000 /* run address */
.long 0x0 /* eGON version */
.byte 0x00, 0x00, 0x00, 0x00 /* platform information - 8byte */
.byte 0x34, 0x2e, 0x30, 0x00
这样就能避开32K的限制。
我刚开始开发D1S的lvgl程序时都没用到spl。
最近编辑记录 dick2945 (2022-10-16 00:00:34)
离线