瑞芯微Rockchip开发者社区
直播中

秋风宜人

13年用户 864经验值
擅长:基础元器件
私信 关注
[问答]

如何将rk3568_loader.bin烧写到eMMC中呢

如何将rk3568_loader.bin烧写到eMMC中呢?有哪些烧写步骤?

回帖(1)

谷菁

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

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

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



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

1). 板子启动到 MASKROM 状态

2). 下载 ROC-RK3568-PC 的 MiniLoaderAll.bin

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 save_boot_params


main.c :



//#include "led.h"
#include "types.h"
#include "setjmp.h"

static jmp_buf   brom_ctx    __section(".data");


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 save_boot_params(void)
{
    int tmp = setjmp(brom_ctx);
   
    if(0 == tmp)
    {
        static_delay(3); // 等待约30秒后
   
        longjmp(brom_ctx, 888888);
    }
    //save_boot_params_ret();

    // 直接返回2给bootrom
    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函数 save_boot_params()
这个跳转不改变 lr 寄存器的值, 所以如果 save_boot_params() 结束返回的话,
并不是返回到 rk3568tpl_start.S 中 "b save_boot_params" 的下一行指令,
而是最后一次改变 lr 寄存器的跳转处:这个跳转在 bootrom 代码中!



结合 rkuboot 中的源码注释,可以猜想得到,bootrom 应该有这样的代码:
1). copy tpl.bin into sram addr 0xfdcc1000
2). bl  0xfdcc1000
3). switch(x0)
      {
          case 1: ....
                search next bootable storage device
          case 2: ....
                continue running otg download codes under MASKROM MODE
      }

第3步的x0,就是 save_boot_params() 返回的 2。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分