00001 #include "afw.h"
00002 #include <signal.h>
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 namespace afw{
00014
00015
00016
00017
00018
00019
00020
00021 void Init1836(void)
00022 {
00023 int i;
00024 int j;
00025 static unsigned char ucActive_LED = 0x01;
00026
00027
00028 *pFlashA_PortA_Data &= ~ucActive_LED;
00029 ssync();
00030
00031
00032 for (i=0; i<1000000; i++)
00033 asm volatile("nop;");
00034
00035
00036 *pFlashA_PortA_Data |= ucActive_LED;
00037 ssync();
00038
00039
00040 for (i=0; i<1000000; i++)
00041 asm volatile("nop;");
00042
00043
00044 *pSPI_FLG = FLS4;
00045
00046 *pSPI_BAUD = 16;
00047
00048
00049 *pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR;
00050
00051
00052
00053 *pDMA5_PERIPHERAL_MAP = 0x5000;
00054
00055
00056
00057 *pDMA5_CONFIG = WDSIZE_16;
00058
00059 *pDMA5_START_ADDR = (void *)sCodec1836TxRegs;
00060
00061 *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH;
00062
00063 *pDMA5_X_MODIFY = 2;
00064
00065
00066 *pDMA5_CONFIG |= DMAEN;
00067
00068 *pSPI_CTL |= SPE;
00069
00070
00071
00072
00073
00074
00075
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 void Init_Sport0(void)
00093 {
00094
00095
00096
00097 *pSPORT0_RCR1 = RFSR;
00098 *pSPORT0_RCR2 = SLEN_32;
00099
00100
00101
00102
00103 *pSPORT0_TCR1 = TFSR;
00104 *pSPORT0_TCR2 = SLEN_32;
00105
00106
00107 *pSPORT0_MTCS0 = 0x000000FF;
00108 *pSPORT0_MRCS0 = 0x000000FF;
00109
00110
00111 *pSPORT0_MCMC1 = 0x0000;
00112 *pSPORT0_MCMC2 = 0x101c;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 void Init_DMA(void)
00126 {
00127 int i, field;
00128
00129
00130
00131 *pDMA1_PERIPHERAL_MAP = 0x1000;
00132
00133
00134
00135 *pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | DI_SEL | FLOW_1 | DMA2D ;
00136
00137 *pDMA1_START_ADDR = (void *)iRxBuffer1;
00138
00139 *pDMA1_X_COUNT = 8* SAMPLES_PER_INTR;
00140
00141 *pDMA1_X_MODIFY = 4;
00142
00143 *pDMA1_Y_COUNT = 3;
00144
00145 *pDMA1_Y_MODIFY = 4;
00146
00147
00148
00149 *pDMA2_PERIPHERAL_MAP = 0x2000;
00150
00151
00152
00153 *pDMA2_CONFIG = WDSIZE_32 | FLOW_1 | DMA2D;
00154
00155 *pDMA2_START_ADDR = (void *)iTxBuffer1;
00156
00157 *pDMA2_X_COUNT = 8* SAMPLES_PER_INTR;
00158
00159 *pDMA2_X_MODIFY = 4;
00160
00161 *pDMA2_Y_COUNT = 3;
00162
00163 *pDMA2_Y_MODIFY = 4;
00164
00165 for ( i=0; i<SAMPLES_PER_INTR; i++ ){
00166 for ( field=0; field<3; field ++ ){
00167
00168 iRxBuffer1[field][i][INTERNAL_ADC_L0] = 0;
00169 iRxBuffer1[field][i][INTERNAL_ADC_R0] = 0;
00170 iRxBuffer1[field][i][INTERNAL_ADC_L1] = 0;
00171 iRxBuffer1[field][i][INTERNAL_ADC_R1] = 0;
00172 iTxBuffer1[field][i][INTERNAL_DAC_L0] = 0;
00173 iTxBuffer1[field][i][INTERNAL_DAC_R0] = 0;
00174 iTxBuffer1[field][i][INTERNAL_DAC_L1] = 0;
00175 iTxBuffer1[field][i][INTERNAL_DAC_R1] = 0;
00176 iTxBuffer1[field][i][INTERNAL_DAC_L2] = 0;
00177 iTxBuffer1[field][i][INTERNAL_DAC_R2] = 0;
00178 }
00179 }
00180 }
00181
00182
00183
00184
00185
00186
00187 void Init_Sport_Interrupts(void)
00188 {
00189
00190 *pSIC_IAR0 = 0xffffffff;
00191 *pSIC_IAR1 = 0xffffff2f;
00192 *pSIC_IAR2 = 0xffffffff;
00193
00194
00195
00196 interrupt(SIGIVG9, rxISR);
00197
00198
00199 *pSIC_IMASK = 0x00000200;
00200 ssync();
00201 }
00202
00203
00204
00205
00206
00207
00208 void startAudio(void)
00209 {
00210
00211 *pDMA2_CONFIG |= DMAEN;
00212 *pDMA1_CONFIG |= DMAEN;
00213
00214
00215 *pSPORT0_TCR1 |= TSPEN;
00216 *pSPORT0_RCR1 |= RSPEN;
00217 }
00218
00219
00220
00221
00222
00223
00224
00225 void init(void)
00226 {
00227 Init1836();
00228 Init_Sport0();
00229 Init_DMA();
00230 Init_Sport_Interrupts();
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 void rxISR( int signal )
00258 {
00259 static int field = 2;
00260 short leftIn[SAMPLES_PER_INTR], rightIn[SAMPLES_PER_INTR];
00261 short leftOut[SAMPLES_PER_INTR], rightOut[SAMPLES_PER_INTR];
00262
00263
00264 *pDMA1_IRQ_STATUS = 0x0001;
00265
00266
00267 if ( 2 == *pDMA2_CURR_Y_COUNT )
00268 field = 0;
00269 else
00270 field ++;
00271
00272 for ( int i=0; i<SAMPLES_PER_INTR; i++ ){
00273
00274 leftIn[i] = iRxBuffer1[field][i][INTERNAL_ADC_L0] >> 16;
00275 rightIn[i] = iRxBuffer1[field][i][INTERNAL_ADC_R0] >> 16;
00276 }
00277
00278 processData( leftIn, rightIn, leftOut, rightOut, SAMPLES_PER_INTR );
00279
00280 for ( int i=0; i<SAMPLES_PER_INTR; i++ ){
00281
00282 iTxBuffer1[field][i][INTERNAL_DAC_L0] = leftOut[i] << 16;
00283 iTxBuffer1[field][i][INTERNAL_DAC_R0] = rightOut[i] << 16;
00284 }
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 volatile short sCodec1836TxRegs[CODEC_1836_REGS_LENGTH] =
00304 {
00305 DAC_CONTROL_1 | 0x000,
00306 DAC_CONTROL_2 | 0x000,
00307 DAC_VOLUME_0 | 0x3ff,
00308 DAC_VOLUME_1 | 0x3ff,
00309 DAC_VOLUME_2 | 0x3ff,
00310 DAC_VOLUME_3 | 0x3ff,
00311 DAC_VOLUME_4 | 0x3ff,
00312 DAC_VOLUME_5 | 0x3ff,
00313 ADC_CONTROL_1 | 0x000,
00314 ADC_CONTROL_2 | 0x180,
00315 ADC_CONTROL_3 | 0x000
00316
00317 };
00318
00319 volatile int iTxBuffer1[3][SAMPLES_PER_INTR][8];
00320
00321 volatile int iRxBuffer1[3][SAMPLES_PER_INTR][8];
00322
00323
00324
00325 }