⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot_led.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 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 + -