Station P2(ROC-RK3568-PC) 裸机开发7_裸机代码

整理出的第一份能运行的代码,下载链接如下(2022/02/10 更新为免积分下载)。

StationP2(ROC-RK3568-PC)裸机开发之最简裸机代码

Station P2(ROC-RK3568-PC) 最简裸机代码
没啥功能, 被 SoC bootrom 加载到 internal_sram 0xfdcc1000 处运行,
等待一定时间后,又返回 bootrom 运行。

make.sh 里面的 rkbin/tools/boot_merger 在这里下载:

https://github.com/rockchip-linux/rkbin

编译得到 rk3568_loader.bin,
使用 RKDevTool_Release_v2.84 工具烧写到板了上的 eMMC 内。

RKDevTool_Release_v2.84 使用的的地址配置如下图所未:

Station P2(ROC-RK3568-PC) 裸机开发7_裸机代码_第1张图片


烧写到 spinor flash 也可以运行(RKDevTool 默认是烧到 spinor flash,无需特殊操作)
        但不建议烧到 spinor 中!!
烧写到 eMMC 也可以运行,但因为要切换目标存储,步骤比较繁琐,具体如下:

1). 板子启动到 MASKROM 状态

2). 下载 ROC-RK3568-PC 的 MiniLoaderAll.bin
      https://www.t-firefly.com/doc/download/107.html
3). 在 RKDevTool 在高级功能界面,点击 "Boot:" 对应的右边三个点的按钮,
      选择前面下载的 MiniLoaderAll.bin,点击对应最右边的下载按钮,
      这个操作是把 MiniLoaderAll.bin 下载到内存运行,不需要重启设备,
4). 点击 "读取存储列表" 按钮,右边的列表中就会显示出来板子上的存储设备,
      (0) 结尾的是板子上有的存储
      (x) 结尾的是板子上没有的存储
      (√) 结尾的是当前选中的存储
5). 在列出来的存储清单中,选择 "Emmc(0)",再点击 "切换存储",
      切换成功清单中的 "Emmc(0)" 会变成 "Emmc(√)"
6). 回到 RKDevTool 第一页的 "下载镜像" 界面,点击 "run" ,即是烧到 eMMC 中。

rk3568tpl_start.S :

.text
.global  _start
_start:
    b tpl_main

main.c : 

static void static_delay(int nSecondWait)
{
    if(nSecondWait < 0) return;
    
    volatile unsigned long int i,j;
    for(i=nSecondWait;i>0;i--)
        for(j=200000;j>0;j--);    
}

int tpl_main(void)
{
    static_delay(13); // 等待约13秒后

    return 2;
}

rk3568tpl.lds

SECTIONS {
    . = 0xfdcc1000;
    . = ALIGN(8);
    .text : 
    { 
        rk3568tpl_start.o(.text)
        *(.text) 
    }
    .rodata ALIGN(8) : {*(.rodata*)} 
    .data   ALIGN(8) : { *(.data) }
    
    . = ALIGN(8);
    __bss_start = .;
    .bss   ALIGN(8)  : { *(.bss)  *(COMMON) }
    __bss_end = .;
}

rk3568tpl_start.S 中只有一行代码, 无状态跳转到C函数 tpl_main()
这个跳转不改变 lr 寄存器的值, 所以如果 tpl_main() 结束返回的话,
并不是返回到 rk3568tpl_start.S 中 "b  tpl_main" 的下一行指令,
而是最后一次改变 lr 寄存器的跳转处:这个跳转在 bootrom 代码中!


结合 rkuboot 中的源码注释及实际测试,可以猜想得到,bootrom 应该有这样的代码:

设置栈指针,然后在各个存储中查找可启动的 Loader
while(nRetry < 5)
{
         copy tpl.bin into sram addr 0xfdcc1000
         bl  0xfdcc1000
}
继续执行bootrom中的代码。

即:
bootrom 会做5次重试, 都被返回的话,会继续执行bootrom code让设备处于MASKROM模式。 

你可能感兴趣的:(Station,裸机开发,单片机,嵌入式硬件,arm开发)