SYS_cpuClock.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002                            C   M O D U L E   F I L E
00003 
00004     Copyright (c) 2003 Neuros Audio LLC, All rights reserved.
00005 
00006 ******************************************************************************/
00007 
00016 
00017 /*-- HEADER FILE INCLUDES ---------------------------------------------------*/
00018 #include "sys_clock.h"
00019 
00020 /*-- LOCAL DEFINITIONS ------------------------------------------------------*/
00021 
00022 #define BASE_TIMER_RATE     (200)         /* Hz, sytem starts up at 100MHz, 5ms */
00023 #define BASE_TIMER_RATE_INV (0x4c4b4000L) /* 5,000,000ns * 256 */
00024 
00025 /*-- STATIC DATA ------------------------------------------------------------*/
00026 
00027 /*-- GLOBAL DATA ------------------------------------------------------------*/
00028 //UINT32 CPU_clock;                       // Active CPU clock.
00029 UINT16 TIM_resolution;                // TIMER resolution.
00030 
00031 /*-- FUNCTIONS --------------------------------------------------------------*/
00032 #pragma CODE_SECTION(SYS_clockSetup, ".sram0_resident")
00039 void SYS_clockSetup(CLOCK_MODE eMode)
00040 {   
00041     UINT32 CPU_clock;   
00042     
00043     // This is to remember what clock state it was.
00044     static CLOCK_MODE   actvClockMode = Invalid_ClockMode;
00045     
00046     if(actvClockMode == eMode)
00047     {
00048         return;
00049     }
00050         
00051     CLKMD = 0xF000;
00052     
00053     while(CLKMD&0x0001);            
00054     
00055     CLKMD = eMode;  
00056 
00057     // Set the system timer to a constant rate even though 
00058     // the DSP clock can change. 
00059     CPU_clock = (UINT32)SYS_getCPUClock();
00060     
00061     // calculate the total divide ratio for the desired 
00062     // system timer rate.
00063     #if 1 /* TINT rate = 1/( (1+PRD)*(1+TDDR)*tc ). TDDR is fixed to 15. */
00064     PRD = (CPU_clock / ( (UINT32)(BASE_TIMER_RATE * 16) ) ) - 1;                        
00065     #else
00066     PRD = (CPU_clock / ( (UINT32)(BASE_TIMER_RATE * 10) ) ) - 1;
00067     #endif  
00068 
00069     // restart the timer.
00070     TCR |= 0x2F;        
00071 
00072     // TIM_resolution, ns/tick in 11.4 format.
00073     TIM_resolution = ((UINT32)(BASE_TIMER_RATE_INV/(PRD+1))+ 0x8)>>4;
00074     
00075     actvClockMode = eMode;
00076 }
00077 
00078 #pragma CODE_SECTION(SYS_getCPUClock, ".sram0_resident")
00085 UINT32 SYS_getCPUClock( void ) 
00086 {
00087     UINT16 Multiplier, PLLMUL, Divider; 
00088     UINT16 PLLNDIV, PLLDIV;
00089         
00090     
00091     // Read back CLKMOD register value.
00092     PLLMUL = CLKMD >> 12;   
00093     
00094     PLLDIV = (CLKMD >> 11) & 0x1;   
00095     
00096     PLLNDIV = (CLKMD >> 1) & 0x1;
00097     
00098     Divider = 1;
00099     
00100     Multiplier = 1; 
00101     
00102     if (PLLDIV && PLLNDIV)
00103     {   
00104         Multiplier = (PLLMUL & 0x01)?  PLLMUL / 4 : (PLLMUL + 1) / 2;
00105     }
00106     
00107     else if (!PLLNDIV)
00108     {
00109         // This is the /2 or /4 modes.
00110         Divider = (PLLMUL == 15)? 4 : 2;
00111     }
00112     
00113     else 
00114     {
00115 
00116         if (PLLMUL != 15) Multiplier = PLLMUL + 1;
00117     }
00118 
00119     return((UINT32)((UINT32)(SYSTEM_CLOCK * Multiplier)) / Divider);
00120 }
00121 
00122 
00123 /*****************************************************************************
00124                 Neuros Audio LLC. Confidential Proprietary
00125  *****************************************************************************/

Generated on Wed Jan 19 01:12:43 2005 for neuros-firmware by  doxygen 1.3.9.1