| /* |
| * (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"); |
| } |