www.pudn.com > SEEDVPM642_audio.rar > csl_pll.h
/******************************************************************************\ * Step 1. Copyright (C) 2001 Texas Instruments Incorporated. * All Rights Reserved *------------------------------------------------------------------------------ * FILENAME...... csl_pll.h * DATE CREATED.. 10/29/2001 * LAST MODIFIED. 11/30/2001 * 11/30/2003 Modified PLL_init() sequence to fix the PLL * initialization problem \******************************************************************************/ /******************************************************************************\ * Step 2. Private Macros - Include files - PLL_SUPPORT \******************************************************************************/ #ifndef _CSL_PLL_H_ #define _CSL_PLL_H_ #include#include #include #if (PLL_SUPPORT) /******************************************************************************\ * Step 3. scope and inline control macros \******************************************************************************/ #ifdef __cplusplus #define CSLAPI extern "C" far #else #define CSLAPI extern far #endif #undef USEDEFS #undef IDECL #undef IDEF #ifdef _PLL_MOD_ #define IDECL CSLAPI #define USEDEFS #define IDEF #else #ifdef _INLINE #define IDECL static inline #define USEDEFS #define IDEF static inline #else #define IDECL CSLAPI #endif #endif /******************************************************************************\ * Step 4. global macro declarations \******************************************************************************/ #define PLL_DIV0 0 #define PLL_DIV1 1 #define PLL_DIV2 2 #define PLL_DIV3 3 /*****************************************************************************\ * Step 5. global typedef declarations * Example : Config structure * typedef struct { * Uint32 rg1; * Uint32 rg2; * } PLL_Config; \******************************************************************************/ typedef struct{ Uint32 pllcsr; Uint32 pllm; Uint32 plldiv0; Uint32 plldiv1; Uint32 plldiv2; Uint32 plldiv3; Uint32 oscdiv1; }PLL_Config; typedef struct { Uint32 mdiv; Uint32 d0ratio; Uint32 d1ratio; Uint32 d2ratio; Uint32 d3ratio; Uint32 od1ratio; }PLL_Init; /******************************************************************************\ * Step 6. global variable declarations \******************************************************************************/ /* private vars */ extern far Uint32 _PLL_divAddr[4]; /******************************************************************************\ * Step 7. global function declarations \******************************************************************************/ /* Private functions (If applicable)*/ static void plldelay(Uint32 count); /* API functions (Non-Inline function : Source file) */ CSLAPI void PLL_wait100(); CSLAPI Uint32 PLL_wait1(); /******************************************************************************\ * Step 8. inline function declarations ( IDECL keyword) \******************************************************************************/ IDECL void PLL_config(PLL_Config *config); IDECL void PLL_configArgs(Uint32 pllcsr, Uint32 pllm, Uint32 plldiv0, Uint32 plldiv1, Uint32 plldiv2, Uint32 plldiv3,Uint32 oscdiv1); IDECL void PLL_getConfig(PLL_Config *config); IDECL void PLL_init(PLL_Init *init); IDECL void PLL_pwrdwn(); IDECL void PLL_operational(); IDECL void PLL_enable(); IDECL void PLL_bypass(); IDECL void PLL_reset(); IDECL void PLL_deassert(); IDECL Uint32 PLL_clkTest(); IDECL void PLL_enablePllDiv(Uint32 divId); IDECL void PLL_disablePllDiv(Uint32 divId); IDECL void PLL_enableOscDiv(); IDECL void PLL_disableOscDiv(); IDECL void PLL_setMultiplier(Uint32 val); IDECL void PLL_setPllRatio(Uint32 divId,Uint32 val); IDECL void PLL_setOscRatio(Uint32 val); IDECL Uint32 PLL_getMultiplier(); IDECL Uint32 PLL_getPllRatio(Uint32 divnum); IDECL Uint32 PLL_getOscRatio(); /******************************************************************************\ * Step 9. inline function definitions ( #if USEDEF - IDEF keywords) \******************************************************************************/ #ifdef USEDEFS /*----------------------------------------------------------------------------*/ IDEF void PLL_pwrdwn(){ PLL_FSETS(PLLCSR,PLLEN,BYPASS); /* Bypass mode PLLEN = 0 */ PLL_FSETS(PLLCSR,PLLPWRDN,YES); /* PwrDwn mode */ } /*----------------------------------------------------------------------------*/ IDEF void PLL_operational(){ PLL_FSETS(PLLCSR,PLLPWRDN,NO); /* Operational mode */ PLL_FSETS(PLLDIV0,D0EN,ENABLE); /* Enable D0 path */ PLL_FSETS(PLLCSR,PLLEN,ENABLE); /* Enable PLLEN = 1 */ } /*----------------------------------------------------------------------------*/ IDEF void PLL_enable(){ PLL_FSETS(PLLCSR,PLLEN,ENABLE); /* Bypass mode PLLEN = 1 */ } /*----------------------------------------------------------------------------*/ IDEF void PLL_bypass(){ PLL_FSETS(PLLCSR,PLLEN,BYPASS); /* Bypass mode PLLEN = 0 */ } /*----------------------------------------------------------------------------*/ IDEF Uint32 PLL_clkTest(){ return(PLL_FGET(PLLCSR,STABLE)); } /*----------------------------------------------------------------------------*/ IDEF void PLL_reset(){ PLL_FSETS(PLLCSR,PLLRST,1); /* reset mode */ } /*----------------------------------------------------------------------------*/ IDEF void PLL_deassert(){ PLL_FSETS(PLLCSR,PLLRST,0); /* deassert PLL */ } /*----------------------------------------------------------------------------*/ IDEF void PLL_enablePllDiv(Uint32 divId){ (*(volatile Uint32*) _PLL_divAddr[divId]) |=(0x00008000u); } /*----------------------------------------------------------------------------*/ IDEF void PLL_disablePllDiv(Uint32 divId){ (*(volatile Uint32*) _PLL_divAddr[divId]) &=~(0x00008000u); } /*----------------------------------------------------------------------------*/ IDEF void PLL_enableOscDiv(){ PLL_FSET(OSCDIV1,OD1EN,1); } /*----------------------------------------------------------------------------*/ IDEF void PLL_disableOscDiv(){ PLL_FSET(OSCDIV1,OD1EN,0); } /*----------------------------------------------------------------------------*/ IDEF void PLL_setPllRatio(Uint32 divId, Uint32 val){ Uint32 tmp= ((*(volatile Uint32*) _PLL_divAddr[divId]) & 0xFFFFFFE0u); (*(volatile Uint32*) _PLL_divAddr[divId]) =(val | tmp ); } /*----------------------------------------------------------------------------*/ IDEF void PLL_setOscRatio(Uint32 val){ PLL_FSET(OSCDIV1,RATIO,val); } /*----------------------------------------------------------------------------*/ IDEF void PLL_setMultiplier(Uint32 val){ PLL_FSET(PLLM,PLLM,val); } /*----------------------------------------------------------------------------*/ IDEF Uint32 PLL_getPllRatio(Uint32 divId){ return (Uint32)((*(volatile Uint32*) _PLL_divAddr[divId]) & 0x0000001Fu); } /*----------------------------------------------------------------------------*/ IDEF Uint32 PLL_getOscRatio(){ return(PLL_FGET(OSCDIV1,RATIO)); } /*----------------------------------------------------------------------------*/ IDEF Uint32 PLL_getMultiplier(){ return(PLL_FGET(PLLM,PLLM)); } /*----------------------------------------------------------------------------*/ IDEF void PLL_init(PLL_Init *init) { Uint32 gie ; gie = IRQ_globalDisable(); PLL_FSETS(PLLCSR,PLLEN,BYPASS); /* Bypass mode PLLEN = 0 */ plldelay(20); PLL_FSETS(PLLCSR,PLLRST,1); /* reset mode */ plldelay(20); // Set main multiplier/divisor PLL_RSET(PLLM,init->mdiv); PLL_RSET(PLLDIV0, PLL_PLLDIV0_RMK(0,init->d0ratio)); PLL_RSET(OSCDIV1,PLL_OSCDIV1_RMK(0,init->od1ratio)); // Set DSP clock PLL_RSET(PLLDIV1,PLL_PLLDIV1_RMK(0,init->d1ratio)); // Set EMIF clock PLL_RSET(PLLDIV3,PLL_PLLDIV3_RMK(0,init->d3ratio)); plldelay(20); // Take PLL out of reset PLL_FSETS(PLLCSR,PLLRST,0); plldelay(1500); // Enable PLL PLL_FSETS(PLLCSR,PLLEN,ENABLE); plldelay(20); IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void PLL_config(PLL_Config *config) { Uint32 gie; volatile Uint32 *base; register Uint32 x0,x1,x2,x3,x4,x5,x6; gie = IRQ_globalDisable(); x0 = config->pllcsr; x1 = config->pllm; x2 = config->plldiv0; x3 = config->plldiv1; x4 = config->plldiv2; x5 = config->plldiv3; x6 = config->oscdiv1; base = (volatile Uint32 *)(_PLL_BASE_ADDR); base[_PLL_PLLM_OFFSET] = x1; base[_PLL_PLLDIV0_OFFSET] = x2; base[_PLL_PLLDIV1_OFFSET] = x3; base[_PLL_PLLDIV2_OFFSET] = x4; base[_PLL_PLLDIV3_OFFSET] = x5; base[_PLL_OSCDIV1_OFFSET] = x6; base[_PLL_PLLCSR_OFFSET] = x0; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void PLL_configArgs(Uint32 pllcsr, Uint32 pllm, Uint32 plldiv0, Uint32 plldiv1, Uint32 plldiv2, Uint32 plldiv3,Uint32 oscdiv1){ Uint32 gie; volatile Uint32 *base; gie = IRQ_globalDisable(); base = (volatile Uint32 *)(_PLL_BASE_ADDR); base[_PLL_PLLM_OFFSET] = pllm; base[_PLL_PLLDIV0_OFFSET] = plldiv0; base[_PLL_PLLDIV1_OFFSET] = plldiv1; base[_PLL_PLLDIV2_OFFSET] = plldiv2; base[_PLL_PLLDIV3_OFFSET] = plldiv3; base[_PLL_OSCDIV1_OFFSET] = oscdiv1; base[_PLL_PLLCSR_OFFSET] = pllcsr; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ IDEF void PLL_getConfig(PLL_Config *config) { Uint32 gie; volatile Uint32 *base; register Uint32 x0,x1,x2,x3,x4,x5,x6; gie = IRQ_globalDisable(); base = (volatile Uint32 *)(_PLL_BASE_ADDR); x0 = base[_PLL_PLLCSR_OFFSET]; x1 = base[_PLL_PLLM_OFFSET]; x2 = base[_PLL_PLLDIV0_OFFSET]; x3 = base[_PLL_PLLDIV1_OFFSET]; x4 = base[_PLL_PLLDIV2_OFFSET]; x5 = base[_PLL_PLLDIV3_OFFSET]; x6 = base[_PLL_OSCDIV1_OFFSET]; config->pllcsr = x0; config->pllm = x1; config->plldiv0 = x2; config->plldiv1 = x3; config->plldiv2 = x4; config->plldiv3 = x5; config->oscdiv1 = x6; IRQ_globalRestore(gie); } /*----------------------------------------------------------------------------*/ #endif /* USEDEFS */ /* Local software delay function */ static void plldelay(Uint32 count){ Uint32 i = count; while(i--){ asm(" NOP 1"); } } /******************************************************************************\ * Step 10. #endif for PLL_SUPPORT and CSL_PLL_H Macro + Footer \******************************************************************************/ #endif /* PLL_SUPPORT */ #endif /* _CSL_PLL_H_ */ /******************************************************************************\ * End of csl_module.h \******************************************************************************/