/* * (C) Copyright 2002 * Custom IDEAS, Inc. <www.cideas.com> * Jon Diekema <diekema@cideas.com> * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include <common.h> #include <ioports.h> #include <mpc8260.h> #include <asm/cpm_8260.h> #include <configs/sacsng.h> #include "clkinit.h" DECLARE_GLOBAL_DATA_PTR; int Daq64xSampling = 0; void Daq_BRG_Reset(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; volatile uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; *brg_ptr |= CPM_BRG_RST; *brg_ptr &= ~CPM_BRG_RST; } void Daq_BRG_Disable(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; volatile uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; *brg_ptr &= ~CPM_BRG_EN; } void Daq_BRG_Enable(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; volatile uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; *brg_ptr |= CPM_BRG_EN; } uint Daq_BRG_Get_Div16(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; if (*brg_ptr & CPM_BRG_DIV16) { /* DIV16 active */ return (TRUE); } else { /* DIV16 inactive */ return (FALSE); } } void Daq_BRG_Set_Div16(uint brg, uint div16) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; if (div16) { /* DIV16 active */ *brg_ptr |= CPM_BRG_DIV16; } else { /* DIV16 inactive */ *brg_ptr &= ~CPM_BRG_DIV16; } } uint Daq_BRG_Get_Count(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; uint brg_cnt; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; /* Get the clock divider * * Note: A clock divider of 0 means divide by 1, * therefore we need to add 1 to the count. */ brg_cnt = (*brg_ptr & CPM_BRG_CD_MASK) >> CPM_BRG_DIV16_SHIFT; brg_cnt++; if (*brg_ptr & CPM_BRG_DIV16) { brg_cnt *= 16; } return (brg_cnt); } void Daq_BRG_Set_Count(uint brg, uint brg_cnt) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; /* * Note: A clock divider of 0 means divide by 1, * therefore we need to subtract 1 from the count. */ if (brg_cnt > 4096) { /* Prescale = Divide by 16 */ *brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK) | (((brg_cnt / 16) - 1) << CPM_BRG_DIV16_SHIFT); *brg_ptr |= CPM_BRG_DIV16; } else { /* Prescale = Divide by 1 */ *brg_ptr = (*brg_ptr & ~CPM_BRG_CD_MASK) | ((brg_cnt - 1) << CPM_BRG_DIV16_SHIFT); *brg_ptr &= ~CPM_BRG_DIV16; } } uint Daq_BRG_Get_ExtClk(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; return ((*brg_ptr & CPM_BRG_EXTC_MASK) >> CPM_BRG_EXTC_SHIFT); } char* Daq_BRG_Get_ExtClk_Description(uint brg) { uint extc; extc = Daq_BRG_Get_ExtClk(brg); switch (brg + 1) { case 1: case 2: case 5: case 6: { switch (extc) { case 0: { return ("BRG_INT"); } case 1: { return ("CLK3"); } case 2: { return ("CLK5"); } } return ("??1245??"); } case 3: case 4: case 7: case 8: { switch (extc) { case 0: { return ("BRG_INT"); } case 1: { return ("CLK9"); } case 2: { return ("CLK15"); } } return ("??3478??"); } } return ("??9876??"); } void Daq_BRG_Set_ExtClk(uint brg, uint extc) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; brg_ptr = (uint *)&immr->im_brgc1; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg -= 4; } brg_ptr += brg; *brg_ptr = (*brg_ptr & ~CPM_BRG_EXTC_MASK) | ((extc << CPM_BRG_EXTC_SHIFT) & CPM_BRG_EXTC_MASK); } uint Daq_BRG_Rate(uint brg) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint *brg_ptr; uint brg_cnt; uint brg_freq = 0; brg_ptr = (uint *)&immr->im_brgc1; brg_ptr += brg; if (brg >= 5) { brg_ptr = (uint *)&immr->im_brgc5; brg_ptr += (brg - 4); } brg_cnt = Daq_BRG_Get_Count(brg); switch (Daq_BRG_Get_ExtClk(brg)) { case CPM_BRG_EXTC_CLK3: case CPM_BRG_EXTC_CLK5: { brg_freq = brg_cnt; break; } default: { brg_freq = (uint)BRG_INT_CLK / brg_cnt; } } return (brg_freq); } uint Daq_Get_SampleRate(void) { /* * Read the BRG's to return the actual sample rate. */ return (Daq_BRG_Rate(MCLK_BRG) / (MCLK_DIVISOR * SCLK_DIVISOR)); } void Daq_Init_Clocks(int sample_rate, int sample_64x) { volatile ioport_t *iopa = ioport_addr((immap_t *)CONFIG_SYS_IMMR, 0 /* port A */); uint mclk_divisor; /* MCLK divisor */ int flag; /* Interrupt state */ /* Save off the clocking data */ Daq64xSampling = sample_64x; /* * Limit the sample rate to some sensible values. */ if (sample_rate > MAX_64x_SAMPLE_RATE) { sample_rate = MAX_64x_SAMPLE_RATE; } if (sample_rate < MIN_SAMPLE_RATE) { sample_rate = MIN_SAMPLE_RATE; } /* * Initialize the MCLK/SCLK/LRCLK baud rate generators. */ /* Setup MCLK */ Daq_BRG_Set_ExtClk(MCLK_BRG, CPM_BRG_EXTC_BRGCLK); /* Setup SCLK */ # ifdef RUN_SCLK_ON_BRG_INT Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_BRGCLK); # else Daq_BRG_Set_ExtClk(SCLK_BRG, CPM_BRG_EXTC_CLK9); # endif /* Setup LRCLK */ # ifdef RUN_LRCLK_ON_BRG_INT Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_BRGCLK); # else Daq_BRG_Set_ExtClk(LRCLK_BRG, CPM_BRG_EXTC_CLK5); # endif /* * Dynamically adjust MCLK based on the new sample rate. */ /* Compute the divisors */ mclk_divisor = BRG_INT_CLK / (sample_rate * MCLK_DIVISOR * SCLK_DIVISOR); /* * Disable interrupt and save the current state */ flag = disable_interrupts(); /* Setup MCLK */ Daq_BRG_Set_Count(MCLK_BRG, mclk_divisor); /* Setup SCLK */ # ifdef RUN_SCLK_ON_BRG_INT Daq_BRG_Set_Count(SCLK_BRG, mclk_divisor * MCLK_DIVISOR); # else Daq_BRG_Set_Count(SCLK_BRG, MCLK_DIVISOR); # endif # ifdef RUN_LRCLK_ON_BRG_INT Daq_BRG_Set_Count(LRCLK_BRG, mclk_divisor * MCLK_DIVISOR * SCLK_DIVISOR); # else Daq_BRG_Set_Count(LRCLK_BRG, SCLK_DIVISOR); # endif /* * Restore the Interrupt state */ if (flag) { enable_interrupts(); } /* Enable the clock drivers */ iopa->pdat &= ~SLRCLK_EN_MASK; } void Daq_Stop_Clocks(void) { #ifdef TIGHTEN_UP_BRG_TIMING volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; register uint mclk_brg; /* MCLK BRG value */ register uint sclk_brg; /* SCLK BRG value */ register uint lrclk_brg; /* LRCLK BRG value */ unsigned long flag; /* Interrupt flags */ #endif # ifdef TIGHTEN_UP_BRG_TIMING /* * Obtain MCLK BRG reset/disabled value */ # if (MCLK_BRG == 0) mclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 1) mclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 2) mclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 3) mclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 4) mclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 5) mclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 6) mclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (MCLK_BRG == 7) mclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif /* * Obtain SCLK BRG reset/disabled value */ # if (SCLK_BRG == 0) sclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 1) sclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 2) sclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 3) sclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 4) sclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 5) sclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 6) sclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (SCLK_BRG == 7) sclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif /* * Obtain LRCLK BRG reset/disabled value */ # if (LRCLK_BRG == 0) lrclk_brg = (*IM_BRGC1 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 1) lrclk_brg = (*IM_BRGC2 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 2) lrclk_brg = (*IM_BRGC3 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 3) lrclk_brg = (*IM_BRGC4 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 4) lrclk_brg = (*IM_BRGC5 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 5) lrclk_brg = (*IM_BRGC6 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 6) lrclk_brg = (*IM_BRGC7 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif # if (LRCLK_BRG == 7) lrclk_brg = (*IM_BRGC8 | CPM_BRG_RST) & ~CPM_BRG_EN; # endif /* * Disable interrupt and save the current state */ flag = disable_interrupts(); /* * Set reset on MCLK BRG */ # if (MCLK_BRG == 0) *IM_BRGC1 = mclk_brg; # endif # if (MCLK_BRG == 1) *IM_BRGC2 = mclk_brg; # endif # if (MCLK_BRG == 2) *IM_BRGC3 = mclk_brg; # endif # if (MCLK_BRG == 3) *IM_BRGC4 = mclk_brg; # endif # if (MCLK_BRG == 4) *IM_BRGC5 = mclk_brg; # endif # if (MCLK_BRG == 5) *IM_BRGC6 = mclk_brg; # endif # if (MCLK_BRG == 6) *IM_BRGC7 = mclk_brg; # endif # if (MCLK_BRG == 7) *IM_BRGC8 = mclk_brg; # endif /* * Set reset on SCLK BRG */ # if (SCLK_BRG == 0) *IM_BRGC1 = sclk_brg; # endif # if (SCLK_BRG == 1) *IM_BRGC2 = sclk_brg; # endif # if (SCLK_BRG == 2) *IM_BRGC3 = sclk_brg; # endif # if (SCLK_BRG == 3) *IM_BRGC4 = sclk_brg; # endif # if (SCLK_BRG == 4) *IM_BRGC5 = sclk_brg; # endif # if (SCLK_BRG == 5) *IM_BRGC6 = sclk_brg; # endif # if (SCLK_BRG == 6) *IM_BRGC7 = sclk_brg; # endif # if (SCLK_BRG == 7) *IM_BRGC8 = sclk_brg; # endif /* * Set reset on LRCLK BRG */ # if (LRCLK_BRG == 0) *IM_BRGC1 = lrclk_brg; # endif # if (LRCLK_BRG == 1) *IM_BRGC2 = lrclk_brg; # endif # if (LRCLK_BRG == 2) *IM_BRGC3 = lrclk_brg; # endif # if (LRCLK_BRG == 3) *IM_BRGC4 = lrclk_brg; # endif # if (LRCLK_BRG == 4) *IM_BRGC5 = lrclk_brg; # endif # if (LRCLK_BRG == 5) *IM_BRGC6 = lrclk_brg; # endif # if (LRCLK_BRG == 6) *IM_BRGC7 = lrclk_brg; # endif # if (LRCLK_BRG == 7) *IM_BRGC8 = lrclk_brg; # endif /* * Clear reset on MCLK BRG */ # if (MCLK_BRG == 0) *IM_BRGC1 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 1) *IM_BRGC2 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 2) *IM_BRGC3 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 3) *IM_BRGC4 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 4) *IM_BRGC5 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 5) *IM_BRGC6 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 6) *IM_BRGC7 = mclk_brg & ~CPM_BRG_RST; # endif # if (MCLK_BRG == 7) *IM_BRGC8 = mclk_brg & ~CPM_BRG_RST; # endif /* * Clear reset on SCLK BRG */ # if (SCLK_BRG == 0) *IM_BRGC1 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 1) *IM_BRGC2 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 2) *IM_BRGC3 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 3) *IM_BRGC4 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 4) *IM_BRGC5 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 5) *IM_BRGC6 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 6) *IM_BRGC7 = sclk_brg & ~CPM_BRG_RST; # endif # if (SCLK_BRG == 7) *IM_BRGC8 = sclk_brg & ~CPM_BRG_RST; # endif /* * Clear reset on LRCLK BRG */ # if (LRCLK_BRG == 0) *IM_BRGC1 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 1) *IM_BRGC2 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 2) *IM_BRGC3 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 3) *IM_BRGC4 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 4) *IM_BRGC5 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 5) *IM_BRGC6 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 6) *IM_BRGC7 = lrclk_brg & ~CPM_BRG_RST; # endif # if (LRCLK_BRG == 7) *IM_BRGC8 = lrclk_brg & ~CPM_BRG_RST; # endif /* * Restore the Interrupt state */ if (flag) { enable_interrupts(); } # else /* * Reset the clocks */ Daq_BRG_Reset(MCLK_BRG); Daq_BRG_Reset(SCLK_BRG); Daq_BRG_Reset(LRCLK_BRG); # endif } void Daq_Start_Clocks(int sample_rate) { #ifdef TIGHTEN_UP_BRG_TIMING volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; register uint mclk_brg; /* MCLK BRG value */ register uint sclk_brg; /* SCLK BRG value */ register uint temp_lrclk_brg; /* Temporary LRCLK BRG value */ register uint real_lrclk_brg; /* Permanent LRCLK BRG value */ uint lrclk_brg; /* LRCLK BRG value */ unsigned long flags; /* Interrupt flags */ uint sclk_cnt; /* SCLK count */ uint delay_cnt; /* Delay count */ #endif # ifdef TIGHTEN_UP_BRG_TIMING /* * Obtain the enabled MCLK BRG value */ # if (MCLK_BRG == 0) mclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 1) mclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 2) mclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 3) mclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 4) mclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 5) mclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 6) mclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (MCLK_BRG == 7) mclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif /* * Obtain the enabled SCLK BRG value */ # if (SCLK_BRG == 0) sclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 1) sclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 2) sclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 3) sclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 4) sclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 5) sclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 6) sclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (SCLK_BRG == 7) sclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif /* * Obtain the enabled LRCLK BRG value */ # if (LRCLK_BRG == 0) lrclk_brg = (*IM_BRGC1 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 1) lrclk_brg = (*IM_BRGC2 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 2) lrclk_brg = (*IM_BRGC3 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 3) lrclk_brg = (*IM_BRGC4 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 4) lrclk_brg = (*IM_BRGC5 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 5) lrclk_brg = (*IM_BRGC6 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 6) lrclk_brg = (*IM_BRGC7 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif # if (LRCLK_BRG == 7) lrclk_brg = (*IM_BRGC8 & ~CPM_BRG_RST) | CPM_BRG_EN; # endif /* Save off the real LRCLK value */ real_lrclk_brg = lrclk_brg; /* Obtain the current SCLK count */ sclk_cnt = ((sclk_brg & 0x00001FFE) >> 1) + 1; /* Compute the delay as a function of SCLK count */ delay_cnt = ((sclk_cnt / 4) - 2) * 10 + 6; if (DaqSampleRate == 43402) { delay_cnt++; } /* Clear out the count */ temp_lrclk_brg = sclk_brg & ~0x00001FFE; /* Insert the count */ temp_lrclk_brg |= ((delay_cnt + (sclk_cnt / 2) - 1) << 1) & 0x00001FFE; /* * Disable interrupt and save the current state */ flag = disable_interrupts(); /* * Enable MCLK BRG */ # if (MCLK_BRG == 0) *IM_BRGC1 = mclk_brg; # endif # if (MCLK_BRG == 1) *IM_BRGC2 = mclk_brg; # endif # if (MCLK_BRG == 2) *IM_BRGC3 = mclk_brg; # endif # if (MCLK_BRG == 3) *IM_BRGC4 = mclk_brg; # endif # if (MCLK_BRG == 4) *IM_BRGC5 = mclk_brg; # endif # if (MCLK_BRG == 5) *IM_BRGC6 = mclk_brg; # endif # if (MCLK_BRG == 6) *IM_BRGC7 = mclk_brg; # endif # if (MCLK_BRG == 7) *IM_BRGC8 = mclk_brg; # endif /* * Enable SCLK BRG */ # if (SCLK_BRG == 0) *IM_BRGC1 = sclk_brg; # endif # if (SCLK_BRG == 1) *IM_BRGC2 = sclk_brg; # endif # if (SCLK_BRG == 2) *IM_BRGC3 = sclk_brg; # endif # if (SCLK_BRG == 3) *IM_BRGC4 = sclk_brg; # endif # if (SCLK_BRG == 4) *IM_BRGC5 = sclk_brg; # endif # if (SCLK_BRG == 5) *IM_BRGC6 = sclk_brg; # endif # if (SCLK_BRG == 6) *IM_BRGC7 = sclk_brg; # endif # if (SCLK_BRG == 7) *IM_BRGC8 = sclk_brg; # endif /* * Enable LRCLK BRG (1st time - temporary) */ # if (LRCLK_BRG == 0) *IM_BRGC1 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 1) *IM_BRGC2 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 2) *IM_BRGC3 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 3) *IM_BRGC4 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 4) *IM_BRGC5 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 5) *IM_BRGC6 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 6) *IM_BRGC7 = temp_lrclk_brg; # endif # if (LRCLK_BRG == 7) *IM_BRGC8 = temp_lrclk_brg; # endif /* * Enable LRCLK BRG (2nd time - permanent) */ # if (LRCLK_BRG == 0) *IM_BRGC1 = real_lrclk_brg; # endif # if (LRCLK_BRG == 1) *IM_BRGC2 = real_lrclk_brg; # endif # if (LRCLK_BRG == 2) *IM_BRGC3 = real_lrclk_brg; # endif # if (LRCLK_BRG == 3) *IM_BRGC4 = real_lrclk_brg; # endif # if (LRCLK_BRG == 4) *IM_BRGC5 = real_lrclk_brg; # endif # if (LRCLK_BRG == 5) *IM_BRGC6 = real_lrclk_brg; # endif # if (LRCLK_BRG == 6) *IM_BRGC7 = real_lrclk_brg; # endif # if (LRCLK_BRG == 7) *IM_BRGC8 = real_lrclk_brg; # endif /* * Restore the Interrupt state */ if (flag) { enable_interrupts(); } # else /* * Enable the clocks */ Daq_BRG_Enable(LRCLK_BRG); Daq_BRG_Enable(SCLK_BRG); Daq_BRG_Enable(MCLK_BRG); # endif } void Daq_Display_Clocks(void) { volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; uint mclk_divisor; /* Detected MCLK divisor */ uint sclk_divisor; /* Detected SCLK divisor */ printf("\nBRG:\n"); if (immr->im_brgc4 != 0) { printf("\tbrgc4\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, MCLK\n", immr->im_brgc4, (uint)&(immr->im_brgc4), Daq_BRG_Get_Count(3), Daq_BRG_Get_ExtClk(3), Daq_BRG_Get_ExtClk_Description(3)); } if (immr->im_brgc8 != 0) { printf("\tbrgc8\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SCLK\n", immr->im_brgc8, (uint)&(immr->im_brgc8), Daq_BRG_Get_Count(7), Daq_BRG_Get_ExtClk(7), Daq_BRG_Get_ExtClk_Description(7)); } if (immr->im_brgc6 != 0) { printf("\tbrgc6\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, LRCLK\n", immr->im_brgc6, (uint)&(immr->im_brgc6), Daq_BRG_Get_Count(5), Daq_BRG_Get_ExtClk(5), Daq_BRG_Get_ExtClk_Description(5)); } if (immr->im_brgc1 != 0) { printf("\tbrgc1\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SMC1\n", immr->im_brgc1, (uint)&(immr->im_brgc1), Daq_BRG_Get_Count(0), Daq_BRG_Get_ExtClk(0), Daq_BRG_Get_ExtClk_Description(0)); } if (immr->im_brgc2 != 0) { printf("\tbrgc2\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SMC2\n", immr->im_brgc2, (uint)&(immr->im_brgc2), Daq_BRG_Get_Count(1), Daq_BRG_Get_ExtClk(1), Daq_BRG_Get_ExtClk_Description(1)); } if (immr->im_brgc3 != 0) { printf("\tbrgc3\t0x%08x @ 0x%08x, %5d count, %d extc, %8s, SCC1\n", immr->im_brgc3, (uint)&(immr->im_brgc3), Daq_BRG_Get_Count(2), Daq_BRG_Get_ExtClk(2), Daq_BRG_Get_ExtClk_Description(2)); } if (immr->im_brgc5 != 0) { printf("\tbrgc5\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n", immr->im_brgc5, (uint)&(immr->im_brgc5), Daq_BRG_Get_Count(4), Daq_BRG_Get_ExtClk(4), Daq_BRG_Get_ExtClk_Description(4)); } if (immr->im_brgc7 != 0) { printf("\tbrgc7\t0x%08x @ 0x%08x, %5d count, %d extc, %8s\n", immr->im_brgc7, (uint)&(immr->im_brgc7), Daq_BRG_Get_Count(6), Daq_BRG_Get_ExtClk(6), Daq_BRG_Get_ExtClk_Description(6)); } # ifdef RUN_SCLK_ON_BRG_INT mclk_divisor = Daq_BRG_Rate(MCLK_BRG) / Daq_BRG_Rate(SCLK_BRG); # else mclk_divisor = Daq_BRG_Get_Count(SCLK_BRG); # endif # ifdef RUN_LRCLK_ON_BRG_INT sclk_divisor = Daq_BRG_Rate(SCLK_BRG) / Daq_BRG_Rate(LRCLK_BRG); # else sclk_divisor = Daq_BRG_Get_Count(LRCLK_BRG); # endif printf("\nADC/DAC Clocking (%d/%d):\n", sclk_divisor, mclk_divisor); printf("\tMCLK %8d Hz, or %3dx SCLK, or %3dx LRCLK\n", Daq_BRG_Rate(MCLK_BRG), mclk_divisor, mclk_divisor * sclk_divisor); # ifdef RUN_SCLK_ON_BRG_INT printf("\tSCLK %8d Hz, or %3dx LRCLK\n", Daq_BRG_Rate(SCLK_BRG), sclk_divisor); # else printf("\tSCLK %8d Hz, or %3dx LRCLK\n", Daq_BRG_Rate(MCLK_BRG) / mclk_divisor, sclk_divisor); # endif # ifdef RUN_LRCLK_ON_BRG_INT printf("\tLRCLK %8d Hz\n", Daq_BRG_Rate(LRCLK_BRG)); # else # ifdef RUN_SCLK_ON_BRG_INT printf("\tLRCLK %8d Hz\n", Daq_BRG_Rate(SCLK_BRG) / sclk_divisor); # else printf("\tLRCLK %8d Hz\n", Daq_BRG_Rate(MCLK_BRG) / (mclk_divisor * sclk_divisor)); # endif # endif printf("\n"); }