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 文件

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

  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后可以,修改如下:

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

 

 

参考

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

《Rockchip_RK3399TRM》

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值