上电之后大致的顺序是这样的:
● Boot ROM 起来,加载片内 SRAM 里的一小段代码
● TF-A(ARM Trusted Firmware)和 U-Boot 依次跑起来,初始化 DDR
● U-Boot 阶段,如果检测到 M0 固件存在,会把编译好的 M0 二进制拷贝到约定好的一块内存区域,然后通过 CRU(Clock & Reset Unit)里的复位控制寄存器把 M0 核心的复位释放掉
● M0 上的 RT-Thread 这时候就已经开始跑了,Linux 内核这时候可能还在往下走
● U-Boot 继续拉起 Linux 内核,Linux 里加载对应的 remoteproc 驱动,"认领"已经在跑的 M0 核心(也可以配置成 Linux 起来之后才由 remoteproc 驱动去拉起 M0,两种模式 RK 系列都支持)
我们项目里用的是 U-Boot 阶段就拉起 M0 的方式,好处是电机控制这种对启动时间敏感的功能,不用等 Linux 那几秒钟的启动流程跑完就已经在工作了,客户机床一上电,M0 上的急停检测、限位保护逻辑立刻生效,不用等 Linux 桌面出来才有保护。
U-Boot 里大致的操作是这样(具体命令因 SDK 版本略有差异,这里是简化后的示意):
=> cp.b 0x60000000 0x00110000 0x20000
=> m0_boot 0x00110000