/*H***************************************************************************** * * $Archive:: $ * $Revision:: $ * $Date:: $ * $Author:: $ * * DESCRIPTION: * contains the initialization funcitons and the functions that control the * LED of the TMS320C5410. * * GLOBALS * * PUBLIC FUNCTIONS: * * PRIVATE FUNCTIONS: * * USAGE/LIMITATIONS: * * NOTES: * * By: Patrick Cresap * *H***************************************************************************/ #define evm5410_c /*---- compilation control switches ----------------------------------------*/ /***************************************************************************** * INCLUDE FILES *****************************************************************************/ /*---- system and platform files -------------------------------------------*/ /*---- program files -------------------------------------------------------*/ #include "evm54102.h" /***************************************************************************** * EXTERNAL REFERENCE *****************************************************************************/ /*---- data declarations ---------------------------------------------------*/ /*---- function prototypes -------------------------------------------------*/ /***************************************************************************** * PUBLIC DECLARATIONS *****************************************************************************/ #define C548_CLKMD_ADDR 0x58 #define PLL_REG 0x58 #define PLLMUL 0xF000 #define PLLDIV 0x0800 #define PLLCNT 0x07F8 #define PLLOFF 0x0004 #define PLLNDIV 0x0002 #define PLLSTAT 0x0001 #define pll_frequency(x) ((x/10)*10) #define SWWSR 0x0028 #define BSCR 0x0029 /*---- Clock Mode ----------------------------------------------------------*/ typedef struct c5xx_cmod { unsigned short clkmd; /* Clock-mode register */ }C5XX_CMOD; /*---- data declarations ---------------------------------------------------*/ static int toggle = 0; /***************************************************************************** * PRIVATE DECLARATIONS *****************************************************************************/ /*---- context -------------------------------------------------------------*/ /*---- data declarations ---------------------------------------------------*/ /*---- function prototypes -------------------------------------------------*/ /*---- macros --------------------------------------------------------------*/ /***************************************************************************** * PUBLIC FUNCTION DEFINITIONS *****************************************************************************/ void InitCPU(unsigned short frequency) { unsigned short setvalue = 0; /*-------------------------------------------------------------------*/ /* Re-Initialize the PLL to 100 Megahertz */ /*-------------------------------------------------------------------*/ frequency = pll_frequency(frequency); C5XX_PllSetFrequency( frequency ); /* set to 100 MHZ */ /* sets the wait states depending on the frequency */ if ( frequency <= 50 ) { PLOW_WAIT( setvalue, 0 ); PHIGH_WAIT( setvalue, 0 ); DLOW_WAIT( setvalue, 0 ); DHIGH_WAIT( setvalue, 0 ); IOALL_WAIT( setvalue, 7 ); } else if ( frequency <=80 ) { PLOW_WAIT( setvalue, 1 ); PHIGH_WAIT( setvalue, 1 ); DLOW_WAIT( setvalue, 1 ); DHIGH_WAIT( setvalue, 1 ); IOALL_WAIT( setvalue, 7 ); } else if ( frequency <=100 ) { PLOW_WAIT( setvalue, 2 ); PHIGH_WAIT( setvalue, 2 ); DLOW_WAIT( setvalue, 2 ); DHIGH_WAIT( setvalue, 2 ); IOALL_WAIT( setvalue, 7 ); } /* sets the XPA bit of the wait state (SWWSR) to 1 for extend memory*/ #if defined( EXTENDED_MEMORY ) setvalue |= 0x8000; #endif SetWaitStates( &setvalue ); setvalue = 0x0002; SetBankSwitch( &setvalue ); } /*F*************************************************************************** * NAME: void PLL_SetFrequency( int Frequency ) * * DESCRIPTION: Set C548 PLL frequency * * INPUTS: * PARAMETERS: * int Frequency Frequency in MHZ, 10, 60,80,90,100 * * GLOBALS: * * OUTPUTS: * PARAMETERS: * * GLOBALS: * * RETURN: * UINT16 RetValue ; Value read from the ADC * * NOTES: * Default is 60MHz * *F***************************************************************************/ int C5XX_PllSetFrequency( int Frequency ) { int ClkFreq; unsigned int ClkModeSet; C5XX_CMOD * pClkMode = (C5XX_CMOD *)C548_CLKMD_ADDR; ClkFreq = Frequency; asm(" NOP"); asm(" NOP"); asm(" NOP"); switch ( ClkFreq ) { case 10: ClkModeSet = PLL_LOCK_INIT10; break; case 20: ClkModeSet = PLL_LOCK_INIT20; break; case 30: ClkModeSet = PLL_LOCK_INIT30; break; case 40: ClkModeSet = PLL_LOCK_INIT40; break; case 50: ClkModeSet = PLL_LOCK_INIT50; break; case 60: ClkModeSet = PLL_LOCK_INIT60; break; case 70: ClkModeSet = PLL_LOCK_INIT70; break; case 80: ClkModeSet = PLL_LOCK_INIT80; break; case 90: ClkModeSet = PLL_LOCK_INIT90; break; case 100: ClkModeSet = PLL_LOCK_INIT100; break; default: ClkModeSet = PLL_LOCK_INIT60; break; } /* Save current clockmode * Set clock mode to DIV before setting PLL * Delay for switch (should poll status * Set PLL mode. * Delay for lock time Can also poll for lock */ pClkMode->clkmd = PLL_DIV_INIT; waitloop( 0x100 ); pClkMode->clkmd = ClkModeSet; waitloop( 0x100 ); return( 0 ); } unsigned short waitloop( volatile unsigned short loopval ) { volatile unsigned short j; j = loopval; while( loopval ) { j+=loopval; loopval--; } return( j ); } void SetWaitStates( unsigned short *waitval ) { unsigned short waitstate; waitstate = *waitval; *(unsigned short *)SWWSR = waitstate; asm(" NOP"); asm(" NOP"); asm(" NOP"); } void SetBankSwitch( unsigned short *bankval ) { unsigned short bankctl; bankctl = *bankval; *(unsigned short *)BSCR = bankctl; asm(" NOP"); asm(" NOP"); asm(" NOP"); } void SetXF(void ) { asm(" NOP"); asm(" NOP"); asm(" NOP"); asm(" SSBX 1,0Dh"); asm(" NOP"); asm(" NOP"); } void ClrXF(void ) { asm(" NOP"); asm(" NOP"); asm(" NOP"); asm(" RSBX 1,0Dh"); asm(" NOP"); asm(" NOP"); } void ToggleXF( void ) { if ( toggle ) { ClrXF(); toggle = 0; } else { SetXF(); toggle = 1; } }