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》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章