📄 boot_led.c
字号:
/*
* ============================================================================
*
* TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
*
* Property of Texas Instruments
* For Unrestricted Internal Use Only
* Unauthorized reproduction and/or distribution is strictly prohibited.
* This product is protected under copyright law and trade secret law as an unpublished work.
* Created 2003, (C) Copyright 2003 Texas Instruments. All rights reserved.
*
* test:
*
* Filename: boot_led.c
*
* project: Neptune
*
* Description:
*
* =============================================================================
*/
/*============================= SPY RESULT DESCRIPTION ==========================
*
*
*
*
/*========================== END OF SPY RESULT DESCRIPTION ======================
/* ============================================================================
* STANDARD INCLUDE FILE
* =============================================================================
*/
#include "global_types.h"
#include "intvecs.h"
//#include "clkrst.h"
#include "interrupt_mapping.h"
#include "led_inth.h"
#include "clkm1.h"
#include "led_bootled.h"
#include "gpio.h"
#include "result_led.h"
#include "led_testbench.h"
// ******* PROVISOIRE ED to compile **************
#define OFFSET_CS( cs) ((cs) * 0x800)
// Define a RHEA module address
#define DEF_RHEA( rhea, strobe, cs)\
(rhea##_RHEA_STROBE_##strobe + OFFSET_CS(cs))
#define PERSEUS_CONF_ADDR DEF_RHEA(PRIVATE, 1, 2) // 0xFFFE1000
#define ICR_BASE_ADDR DEF_RHEA(PUBLIC, 0, 23) // 0xFFFBB800
#define PCC_ULPD_BASE_ADDR_ARM DEF_RHEA(PRIVATE, 1, 1) // 0xFFFE0800
#define ICR_INT 4 // WWWANING: FALSE: to compile
// ************************************************
#define SVC_STK_SIZ 0x80
#define FIQ_STK_SIZ 0x40
#define IRQ_STK_SIZ 0x50
#define ABORT_STK_SIZ 0x3F
#pragma DATA_SECTION (svcStack, ".spvstk" )
unsigned char svcStack[SVC_STK_SIZ];
#pragma DATA_SECTION (fiqStack, ".fiqstk" )
unsigned char fiqStack[FIQ_STK_SIZ];
#pragma DATA_SECTION (irqStack, ".irqstk" )
unsigned char irqStack[IRQ_STK_SIZ];
#pragma DATA_SECTION (abortStack, ".abtstk" )
unsigned char abortStack[ABORT_STK_SIZ];
UWORD16 *spy = (UWORD16 *)0x20000040;
// ************************************************
// taken as is from clkrst.h for code size reduction purposes
// ************************************************
#define SET_IN_IDLE TRUE
#define SET_NOT_IDLE FALSE
#define IDLE_INT_WKUP TRUE
typedef enum {
TIMARM_MODULE_IDLE, APIARM_MODULE_IDLE, DPLLARM_MODULE_IDLE, LIFARM_MODULE_IDLE,
HSABARM_MODULE_IDLE, LBARM_MODULE_IDLE, LCDARM_MODULE_IDLE, PERARM_MODULE_IDLE,
XORPARM_MODULE_IDLE, WDTARM_MODULE_IDLE, ALL_IDLE
} MODULE_IDLE_NAME_t;
// ************************************************
void BOOT_BasicA9 ( void )
{
//------------------------------------------------------------
//-- Miscellaneous initializations --
//------------------------------------------------------------
// Set Supervisor Stack
INT_Set_SVC_Stack((void*)svcStack, SVC_STK_SIZ);
INT_EnableFIQ((void*) fiqStack, FIQ_STK_SIZ);
INT_EnableIRQ((void*) irqStack, IRQ_STK_SIZ);
INT_Set_AbortD_Stack((void*) abortStack, ABORT_STK_SIZ);
}
void wait_for_interrupt(void);
//-----------------------------------------------------------------------------
// NAME : CLKRST_ConfigIdleModule --
// DESCRIPTION : put or remove a module from idle mode --
// PARAMETERS :
// State=SET_IN_IDLE or SET_NOT_IDLE for each module
// RETURN VALUE : None. --
// LIMITATIONS : taken as is from clkrst.c for code size purposes
//-----------------------------------------------------------------------------
void LEDCLKRST_ConfigIdleModule(MODULE_IDLE_NAME_t Module2Set, BOOL State )
{
switch(Module2Set)
{
case TIMARM_MODULE_IDLE :
{
SetGroupBits16(ARM_IDLECT1_REG,IDLTIM_ARM_POS,IDLTIM_ARM_NUMB,State);
break;
}
case APIARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLAPI_ARM_POS,IDLAPI_ARM_NUMB,State);
break;
}
case DPLLARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLDPLL_ARM_POS,IDLDPLL_ARM_NUMB,State);
break;
}
case LIFARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLIF_ARM_POS,IDLIF_ARM_NUMB,State);
break;
}
case HSABARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDL_HSAB_ARM_POS,IDL_HSAB_ARM_NUMB,State);
break;
}
case LBARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLLB_ARM_POS,IDLLB_ARM_NUMB,State);
break;
}
case LCDARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLLLCD_ARM_POS,IDLLLCD_ARM_NUMB,State);
break;
}
case PERARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLPER_ARM_POS,IDLPER_ARM_NUMB,State);
break;
}
case XORPARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLXORP_ARM_POS,IDLXORP_ARM_NUMB,State);
break;
}
case WDTARM_MODULE_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,IDLWDT_ARM_POS,IDLWDT_ARM_NUMB,State);
break;
}
case ALL_IDLE:
{
SetGroupBits16(ARM_IDLECT1_REG,0,10,0x3FF);
break;
}
default :
{
break;
}
}
}
//-----------------------------------------------------------------------------
// NAME : LEDCLKRST_SetIdle
// DESCRIPTION : Launch the idle mode
// PARAMETERS : IdleMode IDLE_PIN_WKUP or IDLE_INT_WKUP
//
// RETURN VALUE : None. --
// LIMITATIONS : None --
//-----------------------------------------------------------------------------
void LEDCLKRST_SetIdle(BOOL IdleMode)
{
SetGroupBits16(ARM_IDLECT1_REG,WKUP_MODE_POS,WKUP_MODE_NUMB,IdleMode);
SetGroupBits16(ARM_IDLECT1_REG,IDL_CLKOUT_ARM_POS,IDL_CLKOUT_ARM_NUMB,SET_IN_IDLE);
}
void BOOT_SleepArm9(void)
{
//MPU_S cuts all clock
LEDCLKRST_ConfigIdleModule(TIMARM_MODULE_IDLE, SET_IN_IDLE);
LEDCLKRST_ConfigIdleModule(LCDARM_MODULE_IDLE, SET_IN_IDLE);
LEDCLKRST_ConfigIdleModule(PERARM_MODULE_IDLE, SET_IN_IDLE);
LEDCLKRST_ConfigIdleModule(XORPARM_MODULE_IDLE, SET_IN_IDLE);
LEDCLKRST_ConfigIdleModule(WDTARM_MODULE_IDLE, SET_IN_IDLE);
LEDCLKRST_SetIdle(IDLE_INT_WKUP);
INT_SetSupervisor();
wait_for_interrupt();
INT_SetUser();
}
void BOOT_ConfigureGpioLed(UWORD32 gpio_base_addr) {
UWORD16 syncpin;
UWORD8 wakeintsrc, syncintsrc;
// Configure & Enable interrupts on GPIO IRQ
syncintsrc = 14; //(CTE_SYNC_INTSRC_TESTCASE & 0xFF);
// Configure & Enable interrupts on Wakeup IRQ
wakeintsrc = 78; //(CTE_WAKE_INTSRC_TESTCASE & 0xFF);
LEDINTH_InitLevel(syncintsrc, // Interrupt map 14.
INTH_IRQ,
INTH_HIGHEST_PRIORITY,
INTH_LOW_LEVEL_SENSITIVE);
LEDINTH_EnableOneIt(syncintsrc, INTH_IRQ);
LEDINTH_InitLevel(wakeintsrc, // Interrupt map 78.
INTH_IRQ,
INTH_HIGHEST_PRIORITY,
INTH_LOW_LEVEL_SENSITIVE);
LEDINTH_EnableOneIt(wakeintsrc, INTH_IRQ);
// Configure interrupt of OMAP LED mode
LEDINTH_InitLevel(LEV2_IRQ_INT, // Interrupt map 0.
INTH_IRQ,
INTH_HIGHEST_PRIORITY,
INTH_LOW_LEVEL_SENSITIVE);
LEDINTH_EnableOneIt(LEV2_IRQ_INT, INTH_IRQ);
syncpin = 13; //CTE_GPIO_SYNC_PIN;
GPIO_SetIrqEna1Pin(gpio_base_addr, syncpin);
GPIO_SetWakeupEnableBit(gpio_base_addr, syncpin);
}
void BOOT_InitLed(void)
{
UWORD16 LED_Result, LDO_BYPASS, DPLLLOCK_TIMEOUT, LDOSTDY_TIMEOUT, dft_read_write;
UWORD32 value, gpio_base_addr;
UWORD16 i = 0;
UWORD16 j = 0;
#define LED_RES_DPLL_TIMEOUT 0xDEAF
#define LED_RES_LDO_TIMEOUT 0xFADE
/*
// Update DFT_READ, DFT_WRITE and VBOX_EN according to CTE_T_SWITCH_VALUE
dft_read_write = CTE_T_SWITCH_VALUE;
if ((dft_read_write & 0x1) == 1) { // Set DFT_READ and DFT_WRITE by software
value = PERSEUS2_CONF_PRODUCTION_ID_REG;
value |= (1 << PERSEUS2_CONF_PRODUCTION_ID_REG_VBOX_EN_POS); // set VBOX_EN bit
PERSEUS2_CONF_PRODUCTION_ID_REG = value;
value = PERSEUS2_CONF_PRODUCTION_ID_REG;
value &= ~(1 << PERSEUS2_CONF_PRODUCTION_ID_REG_DFT_WRITE_OMAP_POS);
value &= ~(1 << PERSEUS2_CONF_PRODUCTION_ID_REG_DFT_READ_OMAP_POS);
value |= (((dft_read_write & 0x2) >> 1) << PERSEUS2_CONF_PRODUCTION_ID_REG_DFT_WRITE_OMAP_POS); // set DFT_WRITE
value |= (((dft_read_write & 0x4) >> 2) << PERSEUS2_CONF_PRODUCTION_ID_REG_DFT_READ_OMAP_POS); // set DFT_READ
PERSEUS2_CONF_PRODUCTION_ID_REG = value;
}
*/
/* // clock tree initialization
// Set the synchronous scalable mode from fully synchronous mode
ARM_SYSST_REG = CTE_SYNC_BYPASS_MODE;
// Set clock divider: ARM=DSP=LCD run at DPLL1 freq, TC=PERI runs at DPLL/2.
// Disable the DSP_CK activation during reset, ARM inth run at ARM/2 clk.
ARM_CKCTL_REG = CTE_ARM_CLK_CONTROL;
// LDO_STEADY bit 6 of POWER_CTRL_REG (@=0xFFFE0850) register in the ULPD.
LDO_BYPASS = CTE_LDO_STDY_BYPASS;
if (LDO_BYPASS == 0x0) {
LDOSTDY_TIMEOUT = CTE_ULPD_TIMEOUT_VALUE;
while((!(PCC_ULPD_POWER_CTRL_REG & 0x40)) && (i < LDOSTDY_TIMEOUT)) {
i++;
}
// Spy dump if LDO_STEADY times out
if (i >= LDOSTDY_TIMEOUT) {
DumpStop_LED(LED_RES_LDO_TIMEOUT);
}
}
// Disable DPLL first if already enabled
ClearBitIndex(CLKRST_DPLLCTL1, PLL_ENABLE_POS);
// Sets DPLL_ON or DPLL_OFF
// Sets DPLL ratio, enable DPLL, with 384 clk cycles timeout
CLKRST_DPLLCTL1 = CTE_DPLL1_BYPASS_VALUE;
// check lock only if dpll isn't in bypass
if ((CLKRST_DPLLCTL1 & 0x0010) != 0x0)
{
DPLLLOCK_TIMEOUT = CTE_DPLL_TIMEOUT_VALUE;
do
{
j++;
}
while((!(CLKRST_DPLLCTL1 & 0x1)) && (j < DPLLLOCK_TIMEOUT));
// Spy dump if dpll times out
if (j >= DPLLLOCK_TIMEOUT)
{
// switch off the dpll
CLKRST_DPLLCTL1 = 0x2000;
DumpStop_LED(LED_RES_DPLL_TIMEOUT);
}
}
/*
// initialize interrupt to manage GPIO at the end of test
gpio_base_addr = (CTE_GPIO_ADDR_LSB + (65536*CTE_GPIO_ADDR_MSB));
BOOT_ConfigureGpioLed(gpio_base_addr);
*/
// Set the location address of the result area values into the class Result
// and then Set the automatic index to the first position
LED_ResSetLocation((UWORD32)&spy);
// The spy result location size is fixed at 256 bytes.
// The spy location initialization value is 0xBABE
// InitSPYramspace(SPY_SRAM_ADDR);
LED_ResInitResult();
// Tester signaling
LED_SetExec();
}
void BOOT_LedBootA9 ( void )
{
BOOT_InitLed();
// init stack, interrupt & sdram
BOOT_BasicA9();
//------------------------------------------------------------
//-- Release GSM_S's reset after configuring ICR --
//-- ARM7 (from Samson) should start from external --
//-- memory re-mapped to CS2 thanks to TCIF and ICR. --
//-- ARM9 and ARM7 will use shared external memories --
//------------------------------------------------------------
// BOOT_InitIcrTcif();
//------------------------------------------------------------
//-- sleep ARM9 to decrease simulation time --
//-- ARM9 is waked up by Interrupt sent by ICR --
//------------------------------------------------------------
BOOT_SleepArm9();
}
void BOOT_LedBootBasicA9()
{
BOOT_InitLed();
// init stack, interrupt & sdram
BOOT_BasicA9();
}
// END OF FILE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -