OSDN Git Service

Sメーター周りを修正
[trx-305dsp/dsp.git] / hirado / kernel / tools / blackfin-vdsp / talkthrough_ezkit_bf533 / run_ad1836_task.c
1 #include "t_services.h"\r
2 #include "s_services.h"\r
3 #include <cdefBF533.h>\r
4 #include "ad1836a.h"\r
5 \r
6 \r
7 \r
8 #define pFLASHA_PORTA_OUT ((volatile unsigned char * )0x20270004)\r
9 #define pFLASHA_PORTA_DIR ((volatile unsigned char * )0x20270006)\r
10 \r
11 \r
12 struct DMA_DESCRIPTOR{\r
13     struct DMA_DESCRIPTOR * next;\r
14     void * start;\r
15     unsigned short config;\r
16     unsigned short x_count;\r
17     short x_modify;\r
18 };\r
19 \r
20 \r
21 // CODEC \8f\89\8aú\89»\83f\81[\83^\97ñ\r
22 static short sCodec1836TxRegs[] =\r
23 {                                   \r
24                     DAC_CONTROL_1   | 0x000,\r
25                     DAC_CONTROL_2   | 0x000,\r
26                     DAC_VOLUME_0    | 0x3ff,\r
27                     DAC_VOLUME_1    | 0x3ff,\r
28                     DAC_VOLUME_2    | 0x3ff,\r
29                     DAC_VOLUME_3    | 0x3ff,\r
30                     DAC_VOLUME_4    | 0x3ff,\r
31                     DAC_VOLUME_5    | 0x3ff,\r
32                     ADC_CONTROL_1   | 0x000,\r
33                     ADC_CONTROL_2   | 0x180,\r
34                     ADC_CONTROL_3   | 0x000\r
35                     \r
36 };\r
37 \r
38 // \83I\81[\83f\83B\83I\83o\83b\83t\83@\r
39 // 1\83T\83\93\83v\83\8b\82 \82½\82è8\83f\81[\83^\82ð\93]\91\97\82·\82é\81B\83_\83u\83\8b\83o\83b\83t\83@\8d\\90¬\82È\82Ì\82Å\82³\82ç\82É\82»\82Ì2\94{\95K\97v\r
40 static struct CODEC_BUFFER TxBuffer[2], RxBuffer[2];\r
41 \r
42 static struct DMA_DESCRIPTOR tDescA, tDescB, rDescA, rDescB;\r
43 \r
44 void run_ad1836_task(VP_INT extinf)\r
45 {\r
46     ena_int( INTNO_SPI );           // SPI DMA\8a\84\82è\8d\9e\82Ý\83}\83X\83N\82ð\82Í\82¸\82· \r
47     ena_int( INTNO_SPORT0_RX );     // SPORT0 DMA\8a\84\82è\8d\9e\82Ý\83}\83X\83N\82ð\82Í\82¸\82· \r
48 \r
49 //--------------------------------------------------------\r
50 //          AD1836\82Ì\83\8a\83Z\83b\83\r
51 //\r
52     *pFLASHA_PORTA_DIR |= 0x01;     // CODEC \83\8a\83Z\83b\83g\90M\8d\86\82ð\8fo\97Í\82É   \r
53     *pFLASHA_PORTA_OUT &= 0xFE;     // CODEC \83\8a\83Z\83b\83g\82ð\83A\83T\81[\83\r
54     tslp_tsk( 1 );                  // \83\8a\83Z\83b\83g=L\83p\83\8b\83X\82ð\8dì\82é \r
55     *pFLASHA_PORTA_OUT |= 0x01;     // CODEC \83\8a\83Z\83b\83g\82ð\83f\83A\83T\81[\83\r
56     tslp_tsk( 1 );                  // \83\8a\83Z\83b\83g\82©\82ç\82Ì\89ñ\95\9c\8e\9e\8aÔ\82ð\97^\82¦\82é \r
57 \r
58 //--------------------------------------------------------\r
59 //          SPI\90Ý\92è \r
60 //  \r
61     // PF4\82ÍAD1836\82ÌSPI SS\83s\83\93 \r
62     *pSPI_FLG = FLS4;\r
63     // SPI\83r\83b\83g\83\8c\81[\83g = SCLK/(2*SPIBAUD) :\82¨\82æ\82» 2MHz  \r
64     *pSPI_BAUD = 32;\r
65     // SPI DMA \8f\91\82«\8d\9e\82Ý\82É\82æ\82é\83g\83\8a\83K, 16bit \83f\81[\83^, MSB first, \83}\83X\83^\r
66     *pSPI_CTL = TIMOD | SIZE | MSTR;\r
67 \r
68     \r
69     \r
70 //--------------------------------------------------------\r
71 //           SPI DMA \90Ý\92è \r
72 //\r
73     // 16bit \83f\81[\83^\81A\83\81\83\82\83\8a\82©\82ç\93Ç\82Ý\8fo\82µ\81A\8fI\97¹\8cã\8a\84\82è\8d\9e\82Ý\r
74     *pDMA5_CONFIG = WDSIZE_16 | DI_EN;\r
75     // CODEC \8f\89\8aú\89»\95\8e\9a\97ñ\82Ì\83A\83h\83\8c\83\r
76     *pDMA5_START_ADDR = sCodec1836TxRegs;\r
77     // DMA \93]\91\97\83J\83E\83\93\83\r
78     *pDMA5_X_COUNT = sizeof( sCodec1836TxRegs ) / sizeof( short );\r
79     // DMA \91\9d\95ª \r
80     *pDMA5_X_MODIFY = sizeof( short );\r
81     \r
82 \r
83 //--------------------------------------------------------\r
84 //           SPI \8aJ\8en\r
85     // DMA \8aJ\8e\r
86     *pDMA5_CONFIG |= DMAEN;\r
87     // SPI \8aJ\8e\r
88     *pSPI_CTL |= SPE;\r
89 \r
90     \r
91     // DMA\91\97\8fo\8fI\97¹\82ð\91Ò\82 \r
92     wai_sem( spi_sem );\r
93     // DMA\8fI\97¹\82ÍSPI\91\97\90M\8fI\97¹\82Å\82Í\82È\82¢\82Ì\82Å\81A\82¿\82å\82Á\82Æ\91Ò\82 \r
94     tslp_tsk( 1 );\r
95 \r
96 //--------------------------------------------------------\r
97 //      SPORT0 \90Ý\92è \r
98 //          \83}\83\8b\83`\83`\83\83\83\93\83l\83\8b\82Ì\8fê\8d\87\81A\8fí\82É SPORTx_yCR1.LATFS = 0\r
99     // Sport0 \8eó\90M\90Ý\92è \r
100     // \8aO\95\94\83N\83\8d\83b\83N, \8aO\95\94\93¯\8aú\90M\8d\86, MSB\83t\83@\81[\83X\83\r
101     // 32-bit \83f\81[\83\r
102     *pSPORT0_RCR1 = RFSR;\r
103     *pSPORT0_RCR2 = 31;     // \83f\81[\83^\92· 32\r
104     \r
105     // Sport0 \91\97\90M\90Ý\92è\r
106     // \8aO\95\94\83N\83\8d\83b\83N, \8aO\95\94\93¯\8aú\90M\8d\86, MSB\83t\83@\81[\83X\83\r
107     // 32\83r\83b\83g\83f\81[\83\r
108     *pSPORT0_TCR1 = TFSR;\r
109     *pSPORT0_TCR2 = 31;     // \83f\81[\83^\92· 32 \r
110     \r
111     // \83t\83\8c\81[\83\80\82 \82½\82è8\83X\83\8d\83b\83g\82Ì\83f\81[\83^\82ð\91\97\8eó\82Å\8eg\82¤ \r
112     *pSPORT0_MTCS0 = 0x000000FF;\r
113     *pSPORT0_MRCS0 = 0x000000FF;\r
114     \r
115     // \83}\83\8b\83`\83`\83\83\83\93\83l\83\8b\90Ý\92è\r
116     *pSPORT0_MCMC1 = 0x0000; // \83I\83t\83Z\83b\83g = 0, \83E\83C\83\93\83h\83E\83T\83C\83Y = 8\r
117     *pSPORT0_MCMC2 = 0x1000 | MCMEN | MCDRXPE | MCDTXPE; // MFD = 1;\r
118 \r
119 //--------------------------------------------------------\r
120 //          SPORT DMA \90Ý\92è \r
121 //\r
122     // DMA1\90Ý\92è (SPORT0 RX)\r
123     rDescA.next = &rDescB;\r
124     rDescA.start = RxBuffer[0].data;\r
125     rDescA.config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN;   // Large List, 7 short word.\r
126     rDescA.x_count = 8 * SAMPLE_PER_INTR;\r
127     rDescA.x_modify = 4;\r
128     \r
129     rDescB.next = &rDescA;\r
130     rDescB.start = RxBuffer[1].data;\r
131     rDescB.config = 0x7700 | WNR | WDSIZE_32 | DI_EN | DMAEN;   // Large List, 7 short word.\r
132     rDescB.x_count = 8 * SAMPLE_PER_INTR;\r
133     rDescB.x_modify = 4;\r
134     \r
135     \r
136     // DMA2\90Ý\92è (SPORT0 TX)\r
137     tDescA.next = &tDescB;\r
138     tDescA.start = TxBuffer[0].data;\r
139     tDescA.config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.\r
140     tDescA.x_count = 8 * SAMPLE_PER_INTR;\r
141     tDescA.x_modify = 4;\r
142     \r
143     tDescB.next = &tDescA;\r
144     tDescB.start = TxBuffer[1].data;\r
145     tDescB.config = 0x7700 | WDSIZE_32 | DMAEN; // Large List, 7 short word.\r
146     tDescB.x_count = 8 * SAMPLE_PER_INTR;\r
147     tDescB.x_modify = 4;\r
148 \r
149 \r
150     *pDMA2_NEXT_DESC_PTR = &tDescA;\r
151     *pDMA1_NEXT_DESC_PTR = &rDescA;\r
152     *pDMA2_CONFIG = 0x7700 | WDSIZE_32;\r
153     *pDMA1_CONFIG = 0x7700 | WNR | WDSIZE_32;\r
154     \r
155     \r
156 //--------------------------------------------------------\r
157 //           SPORT0 \8aJ\8en\r
158     // DMA \8aJ\8e\r
159     *pDMA2_CONFIG |= DMAEN;\r
160     *pDMA1_CONFIG |= DMAEN;\r
161     asm("ssync;");\r
162     // SPORT2 \8aJ\8e\r
163     *pSPORT0_TCR1 |= TSPEN;\r
164     *pSPORT0_RCR1 |= RSPEN;\r
165 \r
166 //\r
167 \r
168     while( 1 ){\r
169         int sample, slot, bufTx, bufRx;\r
170         struct CODEC_BUFFER * BufToBeTransmit; \r
171     \r
172                 // \8eó\90MDMA\8fI\97¹\8a\84\82è\8d\9e\82Ý\82Æ\93¯\8aú\r
173         wai_sem( sport0_sem);\r
174     \r
175                 // \83v\83\8d\83Z\83b\83T\82ª\8eg\82Á\82Ä\82æ\82¢\83o\83b\83t\83@\82ð\8a\84\82è\8fo\82· \r
176         bufTx = ( &tDescA == *pDMA2_NEXT_DESC_PTR) ? 0 : 1;\r
177         bufRx = ( &rDescA == *pDMA1_NEXT_DESC_PTR) ? 0 : 1;\r
178                 \r
179         \r
180         processData(&RxBuffer[bufRx], &TxBuffer[bufTx]);\r
181                 \r
182     }\r
183 \r
184 }\r
185 \r