RK3399 M0 调试-启动

#概述

RK3399内部集成一个Cortex-M3,两个Cortex-M0;

其一PMU M0为ATF所用,其二Perilp M0开放给客户使用。

Cortex-M0采用ARMv6-M结构,基于一个高集成度、低功耗的32位处理器内核;它采用冯·诺伊曼结构,基于16位的Thumb指令集,并包含Thumb-2技术。

Cortex-M3采用ARMv7-M结构,为32位处理器内核。它采用哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行不悖。

我们要使用的就是Perilp M0,可以用于实现一些实时性较高的操作,比如GPIO的脉宽输出。

 

#启动说明

#打包设置

RK3399以miniloader + ATF + u-boot的方式启动,采用这种启动方式,通常将MCU代码编译生成的BIN和ATF的BIN一起打包为trust.img。

在修改rkbin/RKTRUST/RK3399TRUST.ini 文件

RK3399 M0 调试-启动_第1张图片

BL30: M0 bin固件

BL31: ATF固件

分别对照ini配置文件是目录,放置好各个固件。

需要保证miniloader和ATF支持M0的运行;

文件中的ADDR=0x00080000 就是M0固件会被搬运到DDR的地址。

#地址映射

M0的外设寄存器地址与3399的地址会有一定的偏移;

默认配置为

M0地址 = 原地址 - 0xB8000000;

比如GPIO3是0xFF788000,那M0的操作地址就是0x47788000。

#相关寄存器

时钟配置

CRU 0xFF760000

CRU_CLKSEL_CON24(偏移0x0160)

RK3399 M0 调试-启动_第2张图片

 

复位撤销

CRU_SOFTRST_CON11

RK3399 M0 调试-启动_第3张图片

  1. 在uboot下查看DDR M0的地址0x00080000,可以看到地M0的固件已经加载到这个目录下。

=> md.b 0x0080000 300

  1. 可以在uboot下完成上面时钟设置和复位撤销两项操作,M0就会启动了。

#问题处理

#M0部分代码失效

使用中发现M0的部分代码失效了,没有执行,原因是被优化掉了。

makefile中将编译等级由O3调整为O1,否则过度优化,有些代码会失效。

#kernel中M0停止

原因是clk-rk3399.c中没有保持cm0的时钟常开;增加CLK_IGNORE_UNUSED后可以,修改如下:

RK3399 M0 调试-启动_第4张图片

同时可以将复位撤销操作移到最终的应用来,以免M0的相关初始化,经过kernel被重置而失效了。

 

 

参考

《Rockchip-Developer-Guide-linux4.4-MCU》

《Rockchip_RK3399TRM》

你可能感兴趣的:(RK3399)