BOOTLOADER
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
iis.c
Go to the documentation of this file.
1 //===================================
2 // Project: MyS3c2410
3 // Author: Book Chen
4 // function: IIS use DMA2 to play audio wave
5 //===================================
6 #include "includes.h"
7 
8 #define IisIdleState 0
9 #define IisPlayState0 1
10 #define IisPlayState1 2
11 #define IisPlayState2 3
12 #define IisPlayState3 4
13 #define IisPlayState4 5
14 #define IisPlayState5 6
15 #define IisRecordState 7
16 
17 #define PLAY_DMA_ATTR ((AUDIO_PLAY_DEV<<16)|SRC_LOC_AHB|SRC_ADDR_INC|DST_LOC_APB|DST_ADDR_FIXED|REQ_IISDO)
18 #define PLAY_DMA_MODE (HANDSHAKE_MODE|SYNC_APB|DONE_GEN_INT|TSZ_UNIT|SINGLE_SVC|HW_TRIG|RELOAD_OFF|DSZ_16b)
19 #define REC_DMA_ATTR ((AUDIO_REC_DEV<<16)|SRC_LOC_APB|SRC_ADDR_FIXED|DST_LOC_AHB|DST_ADDR_INC|REQ_IISDI)
20 #define REC_DMA_MODE (HANDSHAKE_MODE|SYNC_APB|DONE_GEN_INT|TSZ_UNIT|SINGLE_SVC|HW_TRIG|RELOAD_OFF|DSZ_16b)
21 
23 
24 void F_IisInit(void);
25 void F_IisSvc(void);
28 INT8U F_IisAllocate(INT16U UserId);
29 INT8U F_IisRelease(INT16U UserId);
30 INT8U F_IisReset(INT16U UserId);
31 INT8U F_IisPlay(INT16U UserId);
32 INT8U F_IisRecord(INT16U UserId);
33 INT8U F_IisStop(INT16U UserId,INT8U Data);
34 void __irq IisDma2Isr(void);
35 
36 void F_IisInit(void){
37  // hardware initial
38  rGPBUP = rGPBUP & ~(0x7<<2) | (0x7<<2); //The pull up function is disabled GPB[4:2] 1 1100
39  rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB[4:2]=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)
40  rGPEUP = rGPEUP & ~(0x1f) | 0x1f; //The pull up function is disabled GPE[4:0] 1 1111
41  rGPECON = rGPECON & ~(0x3ff) | 0x2aa; //GPE[4:0]=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK
42  rIISCON=0x00000100; // iis control register
43  rIISMOD=0x00000000; // iis mode register
44  rIISPSR=0x00000000; // iis prescaler register
45  rIISFCON=0x00000000; // iis fifo control register
46  rIISFIFO=0x0000; // iis fifo register...16 bit
47  // variable initial
48  IisCtrl.State=IisIdleState;
49  IisCtrl.Id=ID_IIS;
50  IisCtrl.InUse=FALSE;
51  IisCtrl.WaveBlockIndex=1;
52  IisCtrl.Mode=IIS_MODE_PLAY;
53 }
54 void F_IisSvc(void){
55  INT32U i;
56 
57  switch(IisCtrl.State){
58  case IisIdleState:
59  return;
60  case IisPlayState0:
61  if(F_Dma2InUseCheck()==TRUE) return;
62  F_Dma2Allocate(IisCtrl.Id); // allocate dma2 for IIS play use
63  // UDA1341 hardware initial
65  F_Uda1341VolumnAdjust(50000);
66  // IIS hardware initial
67  //IisCtrl.PreMPLLCON=rMPLLCON; // save rMPLLCON
68  //F_ClockSystemClockChange(CodecParam[IisCtrl.CodecIndex].Mpll);
69  rCLKCON|=0x20000; // enable IIS clock
71  rIISCON=(1<<5)+(0<<4)+(0<<3)+(1<<2)+(1<<1); //Tx DMA enable[5], Rx idle[2], Prescaler enable[1]
72  rIISMOD=(0<<8)+(2<<6)+(0<<5)+(1<<4)+
74  (CodecParam[IisCtrl.CodecIndex].Offset<<2)+(1<<0);
75  rIISFCON=(1<<15)+(1<<13);
76  rIISCON|=0x1;
77  // DMA2 hardware initial
78  //i=(DMA2_HANDSHAKE_MODE|DMA2_SYNC_APB|DMA2_DONE_GEN_INT|DMA2_TSZ_UNIT|DMA2_SINGLE_SVC|DMA2_HW_TRIG|DMA2_RELOAD_OFF|DMA2_DSZ_16b)|(DMA2_IISSDO<<24);
79  //i=(DMA2_HANDSHAKE_MODE|DMA2_SYNC_APB|DMA2_DONE_GEN_INT|
80  // DMA2_TSZ_UNIT|DMA2_SINGLE_SVC|DMA2_HW_TRIG|
81  // DMA2_RELOAD_OFF|DMA2_DSZ_16b)|(DMA2_IISSDO<<24);
82 
87  F_Dma2DisrcSet(IisCtrl.Id,(INT32U)WaveData[1].pData);
89  F_Dma2DidstSet(IisCtrl.Id,(INT32U)IISFIFO);
90  F_Dma2DconSet(IisCtrl.Id,(i|(WaveData[1].BufferLength/2)));
92  //F_Dma2LengthSet(IisCtrl.Id,WaveData[1].BufferLength/2);
93  F_Dma2IsrHookFunctionSet(IisCtrl.Id,(INT32U)IisDma2Isr); //pISR_DMA2=(INT32U)IisDma2Isr;
95  F_Dma2Start(IisCtrl.Id); // start dma
96  IisCtrl.State=IisPlayState1;
97  return;
98  case IisPlayState1:
99  #if(IIS_RUN_FOREVER==1)
100  if(IisCtrl.WaveBlockIndex>=TestAudioCtrl.WaveBlockCount){ // do in isr, wait finish here
101  IisCtrl.WaveBlockIndex=1;
102  }
103  #else
105  rIISCON=0x0; //IIS Interface stop
106  rIISFCON=0x0; //For FIFO flush
107  rCLKCON&=~0x20000; //disable IIS colock
108  //F_ClockSystemClockChange(IisCtrl.PreMPLLCON); // (92<<12)|(4<<4)|1
109  F_Dma2Release(IisCtrl.Id);
111  IisCtrl.State=IisIdleState;
112  }
113  #endif
114  //IisCtrl.State=IisPlayState2;
115  return;
116  case IisPlayState2:
117  IisCtrl.State=IisPlayState3;
118  return;
119  case IisPlayState3:
120  IisCtrl.State=IisPlayState4;
121  return;
122  case IisPlayState4:
123  IisCtrl.State=IisPlayState5;
124  return;
125  case IisPlayState5:
126  IisCtrl.State=IisIdleState;
127  return;
128  case IisRecordState:
129  return;
130  default:
131  return;
132  }
133 }
135  if(IisCtrl.State==IisIdleState) return TRUE;
136  else return FALSE;
137 }
139  if(IisCtrl.InUse==TRUE) return TRUE; // resource is in use
140  else return FALSE; // resource is not in use
141 }
143  if(IisCtrl.InUse==TRUE) return FALSE;
144  else{
145  IisCtrl.InUse=TRUE;
146  IisCtrl.UserId=UserId;
147  return TRUE; // resource is allocated
148  }
149 }
151  if(IisCtrl.InUse==TRUE){
152  if(IisCtrl.UserId==UserId){
153  IisCtrl.InUse=FALSE;
154  return TRUE; // resource is relased
155  }
156  else return FALSE; // resource is not relased
157  }
158  else return TRUE; // resource is relased before
159 }
161  if((IisCtrl.InUse==TRUE)&&(IisCtrl.UserId==UserId)){
162  IisCtrl.State=IisIdleState;
163  return TRUE;
164  }
165  else return FALSE;
166 }
168  if((IisCtrl.InUse==TRUE)&&(IisCtrl.UserId==UserId)){
169  IisCtrl.WaveBlockIndex=1; // no set 0, WaveBlockIndex++ in isr
170  IisCtrl.Mode=IIS_MODE_PLAY; // wave out
171  IisCtrl.State=IisPlayState0; //
172  return TRUE;
173  }
174  else return FALSE;
175 }
177  if((IisCtrl.InUse==TRUE)&&(IisCtrl.UserId==UserId)){
178  IisCtrl.WaveBlockIndex=1; // no set 0, WaveBlockIndex++ in isr
179  IisCtrl.Mode=IIS_MODE_RECORD;
180  IisCtrl.State=IisRecordState;
181  return TRUE;
182  }
183  else return FALSE;
184 }
186  if((IisCtrl.InUse==TRUE)&&(IisCtrl.UserId==UserId)){
187  IisCtrl.State=IisIdleState;
188  if(Data==TRUE) rIISCON&=~1; // stop iis
189  else rIISCON|=1; // start iis
190  return TRUE;
191  }
192  else return FALSE;
193 }
194 void __irq IisDma2Isr(void){
195  ClearPending(BIT_DMA2); //Clear pending bit
196  if(IisCtrl.Mode==IIS_MODE_PLAY){
199  F_Dma2DidstSet(IisCtrl.Id,(INT32U)IISFIFO);
200  F_Dma2LengthSet(IisCtrl.Id,WaveData[IisCtrl.WaveBlockIndex].BufferLength/2);
201  IisCtrl.WaveBlockIndex++;
202  #if(IIS_RUN_FOREVER==1)
204  IisCtrl.WaveBlockIndex=1;
205  }
206  #endif
207  F_Dma2Start(IisCtrl.Id);
208  }
209  }
210  else if(IisCtrl.Mode==IIS_MODE_RECORD){}
211 }
212