#概述
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 文件
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)
复位撤销
CRU_SOFTRST_CON11
在uboot下查看DDR M0的地址0x00080000,可以看到地M0的固件已经加载到这个目录下。
=> md.b 0x0080000 300
可以在uboot下完成上面时钟设置和复位撤销两项操作,M0就会启动了。
#问题处理
#M0部分代码失效
使用中发现M0的部分代码失效了,没有执行,原因是被优化掉了。
makefile中将编译等级由O3调整为O1,否则过度优化,有些代码会失效。
#kernel中M0停止
原因是clk-rk3399.c中没有保持cm0的时钟常开;增加CLK_IGNORE_UNUSED后可以,修改如下:
同时可以将复位撤销操作移到最终的应用来,以免M0的相关初始化,经过kernel被重置而失效了。
参考
《Rockchip-Developer-Guide-linux4.4-MCU》
《Rockchip_RK3399TRM》