This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA3MD:在 SBL 中引导期间调用 AMMUConfigPage (SOC_IPU1_UNCAHE_MMU_base、&pageConfig)会使 CPU 崩溃

Guru**** 649970 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/983028/tda3md-calling-ammuconfigpage-soc_ipu1_unicache_mmu_base-pageconfig-during-boot-in-sbl-crashes-cpu

器件型号:TDA3MD

您好!

我们有一个存储在 NOR 存储器中的 SBL、它工作正常。 SBL 的大小约为210kB。 当调试另一个问题时、我尝试通过添加一些虚拟数据来增大 SBL 的大小、以便二进制文件超过256KB。 一旦我超过此值、配置 Ammu 时、执行就会停止。 只要 SBL 的大小低于256KB 就没有问题。

导致问题的实际呼叫就是这样。 是否有任何建议导致 SBL 大小增加的原因? 根据文档、图像尺寸可高达504kB。

/*中等页面转换
* RBL 映射的页面第0页:p.a. 0x40300000至 V.A.0x00300000
* SBL 重新映射第一个中等页面,因此通过 RBL 清除第一页映射
*/
pageConfig.ammuPageType = Ammu_page_type_medium;
pageConfig.ammuPageNum = 1U;
pageConfig.RegVal = 0U
;pageConfig.regphysicalAddress=0U;pageConfig.PagephysicalAddress=0U;pageConfig.PagephysicalAddress=0U;page.

AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig); 

此代码取自 tda3xx/src/sbl/ti/boot/sbl_auto/sbl_utils/src/tda3xx/sbL_utils_tda3xx.c、函数为 void SBLUutilsConfigIPU1DefaultAMMU (void)

额外信息。 我们在 XTDA3SXXBDABFQ1上运行、链接器文件如下所示。

/**
*\file lnk_tda3xx_M4_NOR.cmd
*
\brief 此文件包含辅助
*引导加载程序(SBL)在 tda3xx SoC 的 NOR 引导模式下使用的系统内存映射。
*
*\版权所有(C) 2014德州仪器(TI)公司-
* http://www.ti.com/
*/

-stack 0x1000 //软件栈大小*/
-heap 0x1000 //堆区域大小*/

/*指定系统内存映射*/

内存
{
IRAM_MEM:org = 0x00000000 len = 0x4000 // IRAM *
/ OCMCRAM1_0: org = 0x00300000 len = 0x00000100 // OCMC RAM 映射
到0x40300000 */
OCMCRAM1_1:org = 0x00300100 len = 0x00000100 // OCMC RAM 映射
到0x40300100 */
OCMCRAM1_2:org = 0x40300200
len = 0x00000100 // OCMC RAM *= 0x0030000000100 */ OCMCRAM1_2:org = 0x40300* OMCRAM1_RAM = 0x40000300*= 0x400003001:
org = 0x00300400 len = 0x0007FC00 // OCMC RAM 映射
到0x40300300 */
NOT_0:org = 0x08000000 len = 0x00000200 // NOR 内存寄存器1
- NOR Init 代码*/
NOT_1:org = 0x08000200 len = 0x00000100 //

NOR 内存寄存器2 - IPU Core1 Init *: org = 0x08000300 len = 0x03FFFD00 /* NOR Memory Region3
- Common */
}

//*指定段分配到内存*/

SECTIONS
{
.intvecs:load > NOT_2
.intc_text:load > NOR_2
.SBL_init:load > NOR_0
.ipu1_init:load > NOR_1
.init:load:NOT_1 .init: load > nor_2

.text:load > nor_2 /* code */
.data:load = nor_2,run = OCMCRAM1_3
load_start (dataLoadStart)
load_end (dataLoadEnd)
run_start (dataRunStart)
.const:load > nor_2 /*全局常量*/
.cinit:load > bss_2:load
load > OCMCRAM1_3 //未初始化或零初始化*//
*全局和静态变量*/
run_start (bssStart)
run_end (bssEnd)
.stack:load > OCMCRAM1_3 /*软件系统堆栈*/
run_start (stackStart)
run_end (stackEnd)
.plt:load > ocMCRAM1_2:
>OCMDR_2 .img .load:>OCM_2

LOAD > OCMCRAM1_4
.tesoc_img:LOAD > OCMCRAM1_3

} 

导致崩溃的整个函数。 如果已注释出有故障的呼叫、则该呼叫之后还有其他导致错误的呼叫。

void SBLUtilsConfigIPU1DefaultAMMU (void)
{
ammuPageConfig_t pageConfig ={0U};
uint32_t INDEX;

//大页面转换
* RBL 映射的页面:第0页:p.a. 0x08000000至 VA. 0x08000000
* SBL 重新映射剩余大页面、因此按 VRL 清除页面

映
射*// pageallocalu.pageConfig = 0U.page.PageAddress = 0U.page.PageConfig = 0U.PageConfig = rgallyagure.PageConfig = 0U.PageAddress


对于(索引= 1U;索引< Ammu_NUM_LARGE_PAGES;索引++)
{
pageConfig.ammuPageNum =索引;
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);
}

//第一个大页面映射:p.a. 0x40000000U V.A 0x40000000U */
pageConfig.ammuPageType = Ammu_page_type_large;
pageConfig.amuPageNum = 1U;
policyConfig.RegVal = sbagle_amma_amagle_am1u_amagle_amddr_am1_agle_amagle_am1u_amagle1

;page1 amddr_am_amagle_amagle_amagle_amagle_amagle_am1u_amagle_amagle_amagle_am1u_agle1;page1 amagle_am_
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第二大页面映射:p.a. 0x80000000U V.A 0x80000000U */
page Config.ammuPageType = Ammu_page_type_large;
pageConfig.ammuPageNum = 2U;
policyConfig.RegVal = SBML_arge_sepage2
;amagle_amagle_amagle_amddr_ap_ap_amagle_amagle_amagle_amagle_amagle.xx
= 2;page2 amagle_amagle_amagle_amagle_amddr_am_am_amagle_ap_amagle_ap_amagle_ap_amagle_ap_amagle
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第三大页面映射:p.a. 0x80000000U V.A 0xA0000000U */
pageConfig.ammuPageType = Ammu_page_type_large;
pageConfig.ammuPageNum = 3U;
policyConfig.RegVal = sbagram_amagle_am3mu_amddr_am_agle_amagle_am3_amagle_amagle_amagle_am3mu_axx

;page_amagle_amddr_am3_am_am_am_amagle_ap_am_amagle_ap_amagle_axx = 3_am_amagle_am_am_amu_
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//中等页面转换
*由 RBL 映射的页面第0页:p.a. 0x40300000至 V.A.0x00300000
* SBL 重新映射第一个媒体页面,因此按 RBL 清除第一页映射
*/
pageConfig.ammuPageType = amagicalPage0U_PageConfig


= amage.PageNum;page.PageConfig=page=page.Page0U.Page.PageNum = Page.Page.Page.PageNum =页面;Page.Page.Page.Page.Page.Page.PageNum =.Page.Page.Page.PageNum =

AMMUConfigPage (SOC_IPU1_UNICACMED_MMU_base、&pageConfig);

//第一个媒体页面映射:p.a. 0x55020000U V.A 0x000000U */
page Config.ammuPageType = Ammu_page_type_medium;
pageConfig.amuPageNum = 1U;
pageConfig.policyRegVal = SBL_amudu_1u_amdma_1_amddr_am1_ag_am1u_amagram_am1u_amag1u_ma_ma_amddr_1;page1 am1_amagu_ap_am1u_amdma_am1u_agu_ma_am1u_agu_am1u_ma_amdma_am1u_agu.


AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//小页转换
*设计映射的页面第一页:p.a. 0x55080000至 V.A. 0x40000000
*更改此页的策略以映射16 KB 而不是4 KB
* SBL 在第一个媒体页面中重新映射 IPU RAM。 清除 ROM 和 RAM 映射*
由 RBL 完成
*
pageConfig.ammuPageType = Ammu_page_type_small;
pageConfig.policyRegVal = 0U;
pageConfig.physicalAddress = 0U;
pageConfig.logicalAddress = 0U;
for (index = 0U;index < Ammu_NUM_SMAL_PAGES;index++)
{
if (1U!=索引)
{
pageConfig.ammuPageNum =索引;
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);
}
}

//第0个小页映射:p.a. 0x43300000U VA. 0x63300000U */
pageConfig.amumuPageType = Ammu_page_type_small;
pageConfig.policyRegVal = SBL_utils_TDA3XX_Ammu_small_PAGE0_policy;pageConfig.ammu_http_utils_ma_tddr_ma_ma_ma_agure.ap_a0_amagram_agram_agram_agram_ma_ma_ma_address0
;pageConfig_ap_am_amagram_ap_ap_ma_ma_ma_ap_amagure_a0_ma_amagram_ma_ap_


AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第一个小页映射:p.a. 0x55080000U VA. 0x40000000U */
page Config.ammuPageType = Ammu_page_type_small;
pageConfig.policyRegVal = SBL_utils_TDA3XX_amagle_amagle_amagle_1


;page1 = Ammu_amagle_amagle_1;pageConfig = amagle_amagle_amagle_amagle_amagle_1;page1;page1 = amagle_agle_am_amagle_amagle_agle_agle_agle_agle_amagle_agle_amagle1
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第二个小页映射:p.a. 0x43304000U VA. 0x63304000U */
pageConfig.ammuPageType = Ammu_page_type_small;
pageConfig.regVal = SBL_utils_TDA3XX_Ammu_Page2

;sbagle_am_amagle_amagle_address_am2_amagle_amagle_amagle_amagle_amagle_amagle_amagle_amagle_amagle.xx;pageConfig = AmpageConfig.ap_ap_am_am_agle_agle_ap_ap_agle_agle_ap_agle_agle_am

AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第三个小页映射:p.a. 0x42081000U VA. 0x62081000U */
page Config.ammuPageType = Ammu_page_type_small;pageConfig.reguls=SBL_utils_TDA3XX_amagle_am3mu_ategure_am_am_PageADDR_3mu_ampage_ampage_ampage3;
pageConfig = Amul_ature_PageConfig_ature_ategure_Page_am_3_am_ampage_ampage_address_ampage_am_ampage_ampage3;page_ature_ategure_am_ampage3;page_ature_am_am_



AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第4个小页映射:p.a. 0x4208B000U VA. 0x6208B000U */
page Config.ammuPageType = Ammu_page_type_small;
pageConfig Config.reguls=SBL_utils_TDA3XX_ammu_page4


;page_amagle_amulation_am_amagle_4_amagle_mu_mu_amagle_amagle_amagle_mu_mu_mu_mu_4;page= amul_amagle_am_amagle_agle_amagle_amagle_mu_agle_mu_mu_mu_am
AMMUConfigPage (SOC_IPU1_UNCH_MMU_base、&pageConfig);

//第5个小页映射:p.a. 0x4208C000U VA. 0x6208C000U */
pageConfig.amMUPageType = AmADDR_PAGE_TYP_TYPE;
pageConfig.PageRegVal = 0x4208C000_TDA3CU_TDAmu *


;page5 Amul_Amultrag_ADDR_ADDR_5_page5;page_Amulation_Ampage_ADDR_5_Ampage_ADDR_5_Ampage_5_Amulation_5;page_Ampage_Amulation_Ampage_Ampage_ADDR_address_mu_mu_mu_mu_mu_mu_page
AMMUConfigPage (SOC_IPU1_UNCH_MMU_base、&pageConfig);

//第6个小页映射:p.a. 0x4883A000U VA. 0x6883A000U */
pageConfig.AMMUPageType = AMADDR_PAGE_PAGE_MAP_SIMPLE_ADDRVAL
= AM6_PAGE_AMADDR_PAGE_MEM_MEM_SIMPLE_ADDR_PLE_PAGE6_ADDR_PEST_PLEADDR_PAGE_ADDR_PAGE_ADDR_MINEST_PEST_PLET.xx = AM_ADDR_ADDR_PAGE_PAGE_ADDR_ADDR_PEST_PLE_ADDR_PAGE_EST_PEST_PLE_ADDR_ADDR_EST_PLET.xx =



AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第七个小页映射:p.a. 0x420A0000U VA. 0x620A0000U */
page Config.ammuPageType = Ammu_page_type_small;
pageConfig Config.RegVal = SBL_utils_TDA3XX_page_ammu_7_agle_amagle_amagle_amagle_7_amagle_amagle_amagle_amagle7


;pageConfig = AM3mu_amagle_amagle_am_am_amagle_am_amagle_ap_agle_agle_agle_ap_amagle7;page_agle_ap_am_am_amagle
AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);

//第八个小页映射:p.a. 0x42086000U VA. 0x62086000U */
page Config.ammuPageType = Ammu_page_type_small;pageConfig.reguls=SBL_utils_TDA3XX_page8_ammu_agle_amagle_amagle_ADDR_8_am18_amagle_agle_am_amagle_amagle_agle_mu.xx;
pageConfig.ADDR_agle_am_agle_am_am_agle_agle_am_agle_am_agle_agle_am_agle_am_agle_am_agle_am_am



AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marco:

    您是否仍面临此问题?

    我认为问题可能是由于以下原因造成的。   它 是中等大小的页面、因此它只映射了256KB 的 OCMC 内存。 超过256KB 的存储器将无法访问。  

    /* Medium Page Translations
       * Pages mapped by RBL 0th page: P.A. 0x40300000 to V.A. 0x00300000
       * SBL re-maps 1st medium page, so clear 1st page mapping by RBL
       */
      pageConfig.ammuPageType = AMMU_PAGE_TYPE_MEDIUM;
      pageConfig.ammuPageNum = 1U;
      pageConfig.policyRegVal = 0U;
      pageConfig.physicalAddress = 0U;
      pageConfig.logicalAddress = 0U;
      AMMUConfigPage(SOC_IPU1_UNICACHE_MMU_BASE, &pageConfig);
    In order to use entire 512KB OCMC memory, you will need to use two medium pages and map it entirely. 
    Regards,
    Brijesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Brijesh、

    我设法将 SBL 的大小缩小到256KB 以下、因此我不必担心这个问题。

    但我想知道是什么问题、并且您将我设置为正确的方向、Rom Boot Loader (RBL)显然会将所有512KB 映射到介质页面。 但是、一旦我清除 RBL 映射、就会发生错误。 如果我没有触摸 SBL 中的媒体映射、并将我要执行的媒体映射移动到小页面、就可以正常工作。

    我只有一个小页面未使用、因此现在我需要弄清楚它是否足以支持16KB 而不是先前配置的128KB。 但是、如果我的 SBL 超过256K 字节、这是一个问题。

    因此、不是将该介质页映射到逻辑地址0。

    pageConfig.ammuPageType = Ammu_page_type_medium;
    pageConfig.ammuPageNum = 1U
    pageConfig.PolicyRegVal = 0x00010009U
    pageConfig.logicalAddress = 0x00000000U
    pageConfig.physicalAddress = 0x55020000U
    AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);


    我映射了这个小页面。

    pageConfig.ammuPageType = Ammu_page_type_small;
    pageConfig.ammuPageNum = 9
    pageConfig.PolicyRegVal = 0x0001000BU
    pageConfig.logicalAddress = 0x00000000U
    pageConfig.physicalAddress = 0x55020000U
    AMMUConfigPage (SOC_IPU1_UNICACHE_MMU_base、&pageConfig);