Загрузка данных
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <errno.h>
#include "sm.h"
#include "monitor.h"
#include "monitor_trdc.h"
#include "monitor_reg.h"
#include "dev_sm_api.h"
/* Defines */
/* Types */
/* Local Functions */
static void MONITOR_DisplayGlbac(uint32_t glbac);
static void MONITOR_DisplayBlkCfg(uint32_t mbc, uint32_t did, uint32_t mem,
uint32_t addr, uint32_t nblks);
static void MONITOR_DumpRegion(uint32_t addr, uint32_t len);
static void MONITOR_DisplayErr(uint32_t rdcId, uint32_t did,
uint32_t derrloc);
static void MONITOR_DisplayDErr(char rdcLabel, bool mrc, uint32_t inst,
TRDC_DERR_Type *derr);
static int32_t MONITOR_TrdcNameToBase(const char *trdcName,
uint32_t *trdcBase);
/* Local Variables */
/*--------------------------------------------------------------------------*/
/* TRDC command */
/*--------------------------------------------------------------------------*/
int32_t MONITOR_CmdTrdc(int32_t argc, const char * const argv[])
{
int32_t status = SM_ERR_SUCCESS;
uint32_t baseAddr;
const TRDC_MGR_Type *mgr;
uint32_t ldid = 0U, hdid = 15U;
/* Parse argument */
if (argc > 0)
{
status = MONITOR_TrdcNameToBase(argv[0], &baseAddr);
if (argc > 1)
{
uint32_t did = 0U;
errno = 0;
did = strtoul(argv[1], NULL, 0);
if (errno == 0)
{
ldid = did;
hdid = did;
}
}
}
else
{
status = SM_ERR_MISSING_PARAMETERS;
}
/* Probe for access */
if (status == SM_ERR_SUCCESS)
{
mgr = (TRDC_MGR_Type*) baseAddr;
uint32_t v = 0U;
uint32_t a = (uint32_t) &(mgr->TRDC_CR);
if (SystemMemoryProbe((void*) a, &v, 32U) != 0U)
{
status = SM_ERR_POWER;
}
}
/* Check DID range */
if (status == SM_ERR_SUCCESS)
{
uint32_t ndid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK)
>> TRDC_TRDC_HWCFG0_NDID_SHIFT);
if ((hdid < ldid) || (ldid >= ndid) || (hdid >= ndid))
{
status = SM_ERR_INVALID_PARAMETERS;
}
}
/* Dump TRDC */
if (status == SM_ERR_SUCCESS)
{
uint32_t v = 0U;
uint32_t ndid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NDID_MASK)
>> TRDC_TRDC_HWCFG0_NDID_SHIFT);
uint32_t nmstr = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMSTR_MASK)
>> TRDC_TRDC_HWCFG0_NMSTR_SHIFT);
uint32_t nmbc = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMBC_MASK)
>> TRDC_TRDC_HWCFG0_NMBC_SHIFT);
uint32_t nmrc = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_NMRC_MASK)
>> TRDC_TRDC_HWCFG0_NMRC_SHIFT);
uint32_t mid = ((mgr->TRDC_HWCFG0 & TRDC_TRDC_HWCFG0_MID_MASK)
>> TRDC_TRDC_HWCFG0_MID_SHIFT);
uint32_t did = ((mgr->TRDC_HWCFG1 & TRDC_TRDC_HWCFG1_DID_MASK)
>> TRDC_TRDC_HWCFG1_DID_SHIFT);
/* Tick wdog */
BOARD_WdogRefresh();
/* Display MGR info */
printf("CR: 0x%08X\n", mgr->TRDC_CR);
printf("HWCFG0: 0x%08X, MID=%u NMRC=%u NMBC=%u NMSTR=%u NDID=%u\n",
mgr->TRDC_HWCFG0, mid, nmrc, nmbc, nmstr, ndid);
printf("HWCFG1: 0x%08X, DID=%u\n",
mgr->TRDC_HWCFG1, did);
if (SystemMemoryProbe((void*) (uint32_t) &(mgr->TRDC_HWCFG2),
&v, 32U) == 0U)
{
if (v != 0U)
{
printf("HWCFG2: 0x%08X, PIDPn[31-00]=0x%08X\n", v, v);
}
}
if (SystemMemoryProbe((void*) (uint32_t) &(mgr->TRDC_HWCFG3),
&v, 32U) == 0U)
{
if (v != 0U)
{
printf("HWCFG3: 0x%08X, PIDPn[63-32]=0x%08X\n", v, v);
}
}
for (uint32_t mstr = 0U; mstr < nmstr; mstr++)
{
uint8_t ncm = ((mgr->DACFG[mstr] & TRDC_DACFG_NCM_MASK)
>> TRDC_DACFG_NCM_SHIFT);
uint8_t nmdar = ((mgr->DACFG[mstr] & TRDC_DACFG_NMDAR_MASK)
>> TRDC_DACFG_NMDAR_SHIFT);
/* Skip if not valid */
if (nmdar == 0U) { continue; }
printf("DACFG%u: 0x%02X, NCM=%u NMDAR=%u\n",
mstr, mgr->DACFG[mstr], ncm, nmdar);
}
printf("IDAU_CR: 0x%08X\n", mgr->TRDC_IDAU_CR);
printf("\n");
/* Print DAC */
for (uint32_t mstr = 0U; mstr < nmstr; mstr++)
{
uint8_t nmdar = ((mgr->DACFG[mstr] & TRDC_DACFG_NMDAR_MASK)
>> TRDC_DACFG_NMDAR_SHIFT);
for (uint32_t mdar = 0U; mdar < ((uint32_t) nmdar); mdar++)
{
uint32_t vld = ((mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_VLD_MASK)
>> TRDC_MDA_W_DFMT0_VLD_SHIFT);
uint32_t lk1 = ((mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_LK1_MASK)
>> TRDC_MDA_W_DFMT0_LK1_SHIFT);
uint32_t dfmt = ((mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_DFMT_MASK)
>> TRDC_MDA_W_DFMT0_DFMT_SHIFT);
uint32_t kpa = ((mgr->MDA[mstr][mdar]
& 0x10000000U)
>> 28U);
uint32_t sid = ((mgr->MDA[mstr][mdar]
& 0x0FC00000U)
>> 22U);
/* Skip if not valid */
if (vld == 0U) { continue; }
printf("MDA_W%u_%u_DFMT%u: 0x%08X, VLD=%u",
mdar, mstr, dfmt, mgr->MDA[mstr][mdar], vld);
if (lk1 != 0U)
{
printf(" LK1=%u", lk1);
}
if (dfmt == 0U)
{
uint32_t pe = ((mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_PE_MASK)
>> TRDC_MDA_W_DFMT0_PE_SHIFT);
if (pe != 0U)
{
printf(" PID=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_PID_MASK)
>> TRDC_MDA_W_DFMT0_PID_SHIFT);
printf(", PIDM=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_PIDM_MASK)
>> TRDC_MDA_W_DFMT0_PIDM_SHIFT);
printf(" PE=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_PE_MASK)
>> TRDC_MDA_W_DFMT0_PE_SHIFT);
}
printf(" SA=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_SA_MASK)
>> TRDC_MDA_W_DFMT0_SA_SHIFT);
printf(" DIDS=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_DIDS_MASK)
>> TRDC_MDA_W_DFMT0_DIDS_SHIFT);
}
else
{
printf(" DIDB=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT1_DIDB_MASK)
>> TRDC_MDA_W_DFMT1_DIDB_SHIFT);
printf(" SA=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT1_SA_MASK)
>> TRDC_MDA_W_DFMT1_SA_SHIFT);
printf(" PA=%u", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT1_PA_MASK)
>> TRDC_MDA_W_DFMT1_PA_SHIFT);
}
if (kpa != 0U)
{
printf(" KPA=%u", kpa);
}
if (sid != 0U)
{
printf(" SID=0x%02X", sid);
}
printf(" DID=%d\n", (mgr->MDA[mstr][mdar]
& TRDC_MDA_W_DFMT0_DID_MASK)
>> TRDC_MDA_W_DFMT0_DID_SHIFT);
}
}
/* Print MBC */
baseAddr += 0x10000U;
for (uint32_t mbc = 0U; mbc < nmbc; mbc++)
{
TRDC_MBC_Type *base = (TRDC_MBC_Type*) baseAddr;
uint32_t nblks[4];
/* Tick wdog */
BOARD_WdogRefresh();
printf("\n");
for (uint32_t mem = 0U; mem < 4U; mem++)
{
nblks[mem] = ((base->MEM[mem].GLBCFG
& TRDC_MBC_MEM_GLBCFG_NBLKS_MASK)
>> TRDC_MBC_MEM_GLBCFG_NBLKS_SHIFT);
if (nblks[mem] != 0U)
{
uint32_t size = ((base->MEM[mem].GLBCFG
& TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_MASK)
>> TRDC_MBC_MEM_GLBCFG_SIZE_LOG2_SHIFT);
/* Calc size in kbytes */
size = (1UL << size) / 1024U;
printf("MBC%u_MEM%u_GLBCFG: 0x%08X", mbc, mem,
base->MEM[mem].GLBCFG);
printf(", SIZE=%uK", size);
printf(" NBLKS=%u\n", nblks[mem]);
}
}
for (uint32_t ac = 0U; ac < 8U; ac++)
{
printf("MBC%u_MEMN_GLBAC%u: 0x%08X", mbc, ac,
base->GLBAC[ac]);
MONITOR_DisplayGlbac(base->GLBAC[ac]);
}
for (uint32_t d = ldid; d <= hdid; d++)
{
/* Tick wdog */
BOARD_WdogRefresh();
MONITOR_DisplayBlkCfg(mbc, d, 0U, (uint32_t)
&(base->DOM[d].MEM0_BLK_CFG),
nblks[0]);
for (uint32_t w = 0U; w < 16U; w++)
{
if (nblks[0] > (w * 32U))
{
printf("MBC%u_DOM%u_MEM0_BLK_NSE_W%u: ",
mbc, d, w);
if (d < 10U)
{
printf(" ");
}
printf("0x%08X\n",
base->DOM[d].MEM0_BLK_NSE[w]);
}
}
for (uint32_t mem = 1U; mem < 4U; mem++)
{
MONITOR_DisplayBlkCfg(mbc, d, mem, (uint32_t)
&(base->DOM[d].MEM[mem - 1U].BLK_CFG),
nblks[mem]);
for (uint32_t w = 0U; w < 2U; w++)
{
if (nblks[mem] > (w * 32U))
{
printf("MBC%u_DOM%u_MEM%u_BLK_NSE_W%u: ",
mbc, d, mem, w);
if (d < 10U)
{
printf(" ");
}
printf("0x%08X\n",
base->DOM[d].MEM[mem - 1U].BLK_NSE[w]);
}
}
}
}
baseAddr += 0x2000U;
}
/* Print MRC */
for (uint32_t mrc = 0U; mrc < nmrc; mrc++)
{
const TRDC_MRC_Type *base = (TRDC_MRC_Type*) baseAddr;
/* Tick wdog */
BOARD_WdogRefresh();
printf("\n");
uint32_t nrgns = ((base->GLBCFG
& TRDC_MRC_GLBCFG_NRGNS_MASK)
>> TRDC_MRC_GLBCFG_NRGNS_SHIFT);
printf("MRC%u_GLBCFG: 0x%08X", mrc, base->GLBCFG);
printf(", NRGNS=%u\n", nrgns);
for (uint32_t ac = 0U; ac < 8U; ac++)
{
printf("MRC%u_MEMN_GLBAC%u: 0x%08X", mrc, ac,
base->GLBAC[ac]);
MONITOR_DisplayGlbac(base->GLBAC[ac]);
}
for (uint32_t d = ldid; d <= hdid; d++)
{
/* Tick wdog */
BOARD_WdogRefresh();
for (uint32_t r = 0U; r < nrgns; r++)
{
uint32_t w0 = base->DOM[d].RGN[r].W0;
uint32_t w1 = base->DOM[d].RGN[r].W1;
uint32_t vld = ((w1
& TRDC_MRC_DOM0_RGD_W_VLD_MASK)
>> TRDC_MRC_DOM0_RGD_W_VLD_SHIFT);
if (vld != 0U)
{
printf("MRC%u_DOM%u_RGD%u_W0: 0x%08X", mrc, d, r,
w0);
printf(", START_ADDR=0x%08X", (w0
& TRDC_MRC_DOM0_RGD_W_STRT_ADDR_MASK));
printf(", MRACSEL=%u\n", (w0
& TRDC_MRC_DOM0_RGD_W_MRACSEL_MASK)
>> TRDC_MRC_DOM0_RGD_W_MRACSEL_SHIFT);
printf("MRC%u_DOM%u_RGD%u_W1: 0x%08X", mrc, d, r,
w1);
printf(", END_ADDR=0x%08X", (w1
& TRDC_MRC_DOM0_RGD_W_END_ADDR_MASK)
| 0x3FFFU);
printf(", NSE=%u", (w1
& TRDC_MRC_DOM0_RGD_W_NSE_MASK)
>> TRDC_MRC_DOM0_RGD_W_NSE_SHIFT);
printf(", VLD=%u\n", vld);
}
}
}
baseAddr += 0x1000U;
}
}
return status;
}