BOOTLOADER
Main Page
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
bootloader
drivers
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
22
IIS_CONTROL
IisCtrl
;
23
24
void
F_IisInit
(
void
);
25
void
F_IisSvc
(
void
);
26
INT8U
F_IisStatusCheck
(
void
);
27
INT8U
F_IisInUseCheck
(
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
64
F_Uda1341Initial
(
UDA_PLAY_MODE
);
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
70
rIISPSR
=
CodecParam
[IisCtrl.
CodecIndex
].
PreScaler
;
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)+
73
((
TestAudioCtrl
.
WaveFormat
.
BitPerSample
>>4)<<3)+
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
83
i=(
DMA2_HANDSHAKE_MODE
|
DMA2_SYNC_APB
|
DMA2_DONE_GEN_INT
|
84
DMA2_TSZ_UNIT
|
DMA2_SINGLE_SVC
|
DMA2_HW_TRIG
|
85
DMA2_RELOAD_OFF
|
DMA2_DSZ_16b
)|(
DMA2_IISSDO
<<24);
86
F_Dma2DisrccSet
(IisCtrl.
Id
,(
DMA2_SRC_LOC_AHB
|
DMA2_SRC_ADDR_INC
));
87
F_Dma2DisrcSet
(IisCtrl.
Id
,(
INT32U
)
WaveData
[1].
pData
);
88
F_Dma2DidstcSet
(IisCtrl.
Id
,(
DMA2_DST_LOC_APB
|
DMA2_DST_ADDR_FIXED
));
89
F_Dma2DidstSet
(IisCtrl.
Id
,(
INT32U
)
IISFIFO
);
90
F_Dma2DconSet
(IisCtrl.
Id
,(i|(WaveData[1].BufferLength/2)));
91
F_Dma2TriggerModeSet
(
TestDmaCtrl
.
Id
,
DMA2_TRIGGER_HW
);
92
//F_Dma2LengthSet(IisCtrl.Id,WaveData[1].BufferLength/2);
93
F_Dma2IsrHookFunctionSet
(IisCtrl.
Id
,(
INT32U
)
IisDma2Isr
);
//pISR_DMA2=(INT32U)IisDma2Isr;
94
F_SysEnableIrq
(
BIT_DMA2
);
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
104
if
(IisCtrl.
WaveBlockIndex
>=
TestAudioCtrl
.
WaveBlockCount
){
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
);
110
F_SysDisableIrq
(
BIT_DMA2
);
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
}
134
INT8U
F_IisStatusCheck
(
void
){
135
if
(IisCtrl.
State
==
IisIdleState
)
return
TRUE
;
136
else
return
FALSE
;
137
}
138
INT8U
F_IisInUseCheck
(
void
){
139
if
(IisCtrl.
InUse
==
TRUE
)
return
TRUE
;
// resource is in use
140
else
return
FALSE
;
// resource is not in use
141
}
142
INT8U
F_IisAllocate
(
INT16U
UserId){
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
}
150
INT8U
F_IisRelease
(
INT16U
UserId){
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
}
160
INT8U
F_IisReset
(
INT16U
UserId){
161
if
((IisCtrl.
InUse
==
TRUE
)&&(IisCtrl.
UserId
==UserId)){
162
IisCtrl.
State
=
IisIdleState
;
163
return
TRUE
;
164
}
165
else
return
FALSE
;
166
}
167
INT8U
F_IisPlay
(
INT16U
UserId){
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
}
176
INT8U
F_IisRecord
(
INT16U
UserId){
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
}
185
INT8U
F_IisStop
(
INT16U
UserId,
INT8U
Data){
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
){
197
if
(IisCtrl.
WaveBlockIndex
<
TestAudioCtrl
.
WaveBlockCount
){
198
F_Dma2DisrcSet
(IisCtrl.
Id
,(
INT32U
)
WaveData
[IisCtrl.
WaveBlockIndex
].
pData
);
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)
203
if
(IisCtrl.
WaveBlockIndex
>=
TestAudioCtrl
.
WaveBlockCount
){
204
IisCtrl.
WaveBlockIndex
=1;
205
}
206
#endif
207
F_Dma2Start
(IisCtrl.
Id
);
208
}
209
}
210
else
if
(IisCtrl.
Mode
==
IIS_MODE_RECORD
){}
211
}
212
Generated on Wed Jun 13 2012 00:03:08 for BOOTLOADER by
1.8.1.1