audio-preprocessing-fw: add UART_printf, change the CCS project file using relative...
[processor-sdk/audio-preprocessing.git] / realtime_demo_bios / k2g / src / main.c
1 /*\r
2  * Copyright (c) 2017, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  *\r
32  */\r
33 \r
34 /**\r
35  * \file      main.c\r
36  *\r
37  * \brief     Audio DC analog test main file\r
38  *\r
39  *  Audio analog test verifies the functionality of ADC and DAC available on\r
40  *  audio daughter card. During this test, data received from ADC will be\r
41  *  sent to DAC. There are two instances of DAC and ADC available on\r
42  *  audio daughter card. One ADC supports 4 analog channels and one DAC\r
43  *  supports 8 analog channels. Data received from one DAC shall be sent\r
44  *  to both the ADCs making 8 channel Rx/Tx. Each DAC should be validated\r
45  *  separately.\r
46  *\r
47  */\r
48 \r
49 #include "analog_test.h"\r
50 #include "board.h"\r
51 \r
52 /* System header files */\r
53 #include <xdc/std.h>\r
54 \r
55 #include <xdc/runtime/Error.h>\r
56 #include <xdc/runtime/System.h>\r
57 \r
58 /*----------------------------------------\r
59  * BIOS header files\r
60  *----------------------------------------*/\r
61 \r
62 #include <ti/sysbios/BIOS.h>            /* mandatory - if you call APIs like BIOS_start() */\r
63 \r
64 /* Portable data types */\r
65 #include <ti/mas/types/types.h>\r
66 #include <ti/mas/util/ecomem.h>\r
67 \r
68 #include "../../../common/components/fil.h"\r
69 #include "../../../common/components/sys.h"\r
70 \r
71 #include "ti/drv/uart/UART_stdio.h"\r
72 \r
73 /* Global System Configuration Structure */\r
74 sysConfig_t sysConfig = {\r
75   SYS_MICS_MAX,   /* #microphones */\r
76   SYS_VMICS_MAX,  /* #virtual microphones */\r
77   5,              /* 5ms ASNR delay */\r
78   { 12, 9, 6},    /* ASNR band1=12dB, band2=9dB, band3=6dB */\r
79   TRUE,           /* Enable ASNR */\r
80   FALSE,          /* Do not use file I/O to load files (must use GEL to load into memory) */\r
81   TRUE,           /* Use default angles for microphone configurations */\r
82   FALSE,           /* Enable VAD */\r
83   -50,            /* drc expansion knee point in dBm0 (dBFS is dBm0-3dB */\r
84   6,              /* drc max gain in dB */\r
85   FALSE           /* Disable DRC */\r
86 };\r
87 \r
88 /* Global FILE I/O Configuration Structure (must be configured even when file I/O not used */\r
89 filConfig_t filConfig = {\r
90   FIL_LENGTH_MAX,   /* number of samples to load from a file */\r
91   SYS_MICS_MAX,     /* number of files to use */\r
92   TRUE,             /* big endian */\r
93   FALSE,            /* do not wrap around */\r
94   40*SYS_FS_HZ      /* Process 40s of the signal (current mic input file length */\r
95 };\r
96 \r
97 /* Acoustic environment */\r
98 /* Room Size (X,Y,Z) in meters */\r
99 /*    5.2000    4.3000    2.7000  */\r
100 \r
101 /* Table size (X,Y,Z) in meters */\r
102 /*    3.0000    2.4000    0.7600  */\r
103 \r
104 /* "Echo" generating speaker position (X,Y,Z) in meters */\r
105 /*    0         2.1500    1.2172     180  -90   VM-9 */\r
106 \r
107 /* People positions (X,Y,Z) in meters and angles relative to the table and array  */\r
108 /*    1.8200    0.6452    1.2172  position#1  (person#1)   -123.6056 -146.3944 VM-7\r
109       2.8200    0.6452    1.2172  -not used-                -90.0000  180.0000 VM-6\r
110       3.8200    0.6452    1.2172              (person#2)    -56.3944  146.3944 VM-5\r
111       1.8200    3.6548    1.2172              (person#3)    123.6056  -33.6056 VM-11\r
112       2.8200    3.6548    1.2172  -not used-                 90.0000    0.0000 VM-0\r
113       3.8200    3.6548    1.2172  position#6  (person#4)     56.3944   33.6056 VM-1\r
114 */\r
115 \r
116 /* Microphone array mic positions (X,Y,Z) in meters */\r
117 /*    2.7922    2.1500    0.7600  mic#1 ("left" most)    180\r
118       2.8004    2.1304    0.7600                        -135\r
119       2.8200    2.1222    0.7600        ("lower" most)  -90\r
120       2.8396    2.1304    0.7600                        -45\r
121       2.8478    2.1500    0.7600        ("right" most)   0\r
122       2.8396    2.1696    0.7600                         45\r
123       2.8200    2.1778    0.7600        ("upper" most)   90\r
124       2.8004    2.1696    0.7600  mic#8                  135\r
125 */\r
126 /* Array Center = (2.82, 2.15, 0.76) (same as table center) */\r
127 \r
128 /* Noise source position (X,Y,Z) in meters */\r
129 /*    2.6000    2.1500    2.3000  */\r
130 \r
131 /* Initialize FILE I/O, system context */\r
132 static void system_init(void)\r
133 {\r
134   int err;\r
135 \r
136   err = sysCreate(&sysConfig);        /* Create system context */\r
137   SYS_CHECK_ERROR(err);\r
138 \r
139   err = sysPrintConfig(SYSM_SCOPE_STATIC|SYSM_SCOPE_DYNAMIC);\r
140   SYS_CHECK_ERROR(err);\r
141 \r
142 } /* system_init */\r
143 \r
144 /* ADC default configuration parameters */\r
145 CmbAdcConfig adcCfg =\r
146 {\r
147         80,                  /* ADC gain */\r
148         CMB_ADC_INL_SE_VINL1,    /* Left input mux for ADC1L */\r
149         CMB_ADC_INL_SE_VINL3,    /* Left input mux for ADC2L */\r
150         CMB_ADC_INR_SE_VINR1,    /* Right input mux for ADC1R */\r
151         CMB_ADC_INR_SE_VINR3,    /* Right input mux for ADC2R */\r
152         CMB_ADC_RX_WLEN_24BIT,   /* ADC word length */\r
153         CMB_ADC_DATA_FORMAT_I2S, /* ADC data format */\r
154         0\r
155 };\r
156 \r
157 /* DAC default configuration parameters */\r
158 CmbDacConfig  dacCfg =\r
159 {\r
160         CMB_DAC_AMUTE_CTRL_SCKI_LOST,   /* Amute event */\r
161         0,                          /* Amute control */\r
162         CMB_DAC_SAMPLING_MODE_AUTO,     /* Sampling mode */\r
163         CMB_DAC_DATA_FORMAT_I2S,        /* Data format */\r
164         0,                          /* Soft mute control */\r
165         CMB_DAC_ATTENUATION_WIDE_RANGE, /* Attenuation mode */\r
166         CMB_DAC_DEEMP_44KHZ,            /* De-emph control */\r
167         80                          /* Volume */\r
168 };\r
169 \r
170 typedef enum {\r
171     PADCONFIG_MUX_MODE_PRIMARY = 0,  /**< Primary pin mux mode    */\r
172     PADCONFIG_MUX_MODE_SECONDARY,    /**< Secondary pin mux mode  */\r
173     PADCONFIG_MUX_MODE_TERTIARY,     /**< Tertiary pin mux mode   */\r
174     PADCONFIG_MUX_MODE_QUATERNARY,   /**< Quaternary pin mux mode */\r
175     PADCONFIG_MUX_MODE_QUINARY,      /**< Quinary pin mux mode    */\r
176     PADCONFIG_MUX_MODE_SENARY        /**< Senary pin mux mode     */\r
177 \r
178 } PadCfgMuxMode;\r
179 \r
180 /*\r
181  * Function to enable the pinmux for the mcasp and i2c devices in the soc.\r
182  *\r
183  */\r
184 void pinMuxSetMode_local(uint32_t padCfgId, PadCfgMuxMode muxMode)\r
185 {\r
186         volatile uint32_t *padCfgBase;\r
187 \r
188     padCfgBase = &hBootCfg->PADCONFIG0;\r
189     CSL_FINS(*(padCfgBase + padCfgId), BOOTCFG_PADCONFIG0_MUXMODE, muxMode);\r
190 }\r
191 \r
192 void McaspDevice_init(void);\r
193 \r
194 /**\r
195  *  \brief    Initializes platform specific modules\r
196  *\r
197  *  This function initializes the modules like PLL, DDR, I2C etc\r
198  *  which are required for audio processing. Need to call this function\r
199  *  before doing any HW related operations.\r
200  *\r
201  *  \return    Cmb_EOK on Success or error code\r
202  */\r
203 Cmb_STATUS initPlatform(void)\r
204 {\r
205         Board_STATUS status = BOARD_SOK;\r
206         Board_initCfg arg = BOARD_INIT_PINMUX_CONFIG | BOARD_INIT_MODULE_CLOCK | BOARD_INIT_UART_STDIO;\r
207         status = Board_init(arg);\r
208 \r
209 #if 1\r
210         /* Configure McASP AUXCLK source as AUDIO_OSCCLK  */\r
211         hBootCfg->SERIALPORT_CLKCTL = 0;\r
212         /* Enable audio oscillator  */\r
213         hBootCfg->OSC_CTL = 0x200;      //SW2:SW1 = 01 (15 - 30 MHz)\r
214 \r
215         {\r
216                 int padCfg;\r
217                 for (padCfg = 139; padCfg <= 191; padCfg++)\r
218                 {\r
219                         pinMuxSetMode_local(padCfg, PADCONFIG_MUX_MODE_QUINARY);\r
220                 }\r
221         }\r
222 #endif\r
223 \r
224          // I2C init\r
225     /* Initialize all the I2C ports - Needed for different I2C devices on the board */\r
226         evmI2CInit(I2C_PORT_0);\r
227         evmI2CInit(I2C_PORT_1);\r
228         evmI2CInit(I2C_PORT_2);\r
229 \r
230         ///pinMuxSetMode(125, PADCONFIG_MUX_MODE_QUATERNARY);\r
231         ///gpioSetDirection(GPIO_PORT_1, 54, GPIO_OUT);\r
232         ///gpioSetOutput(GPIO_PORT_1, 54);\r
233 \r
234         /* Configure platform log messages to standard printf */\r
235     ///Cmb_write_configure(Cmb_WRITE_UART);\r
236 \r
237     /* Initialize UART */\r
238     ///Cmb_uart_init();\r
239     ///Cmb_uart_set_baudrate(115200);\r
240 \r
241     return(status);\r
242 }\r
243 \r
244 /**\r
245  *  \brief    Audio analog test main function\r
246  *\r
247  *  \return    none\r
248  */\r
249 void main (void)\r
250 {\r
251         Cmb_STATUS status;\r
252 \r
253         status = initPlatform();\r
254         if(status != Cmb_EOK)\r
255         {\r
256                 cmb_write("Platform Init Failed!\n");\r
257                 UART_printf("Platform Init Failed!\n");\r
258                 testRet(1);\r
259         }\r
260 \r
261         cmb_delay(10000);\r
262 \r
263 \r
264         system_init();      /* initialize system context, etc. */\r
265 \r
266         sysBfCreate();      /* Create beamformers */\r
267         sysAsnrCreate();    /* Create ASNR's */\r
268         sysMssCreate();     /* Create MSS */\r
269 #if (SYS_USE_DRC)\r
270         sysDrcCreate();     /* Create DRC */\r
271 #endif\r
272         ///sysVauCreate();     /* Create VAU */\r
273 \r
274 \r
275         cmb_write("\n******************************************\n");\r
276         cmb_write(  "        Audio Preprocessing Demo          \n");\r
277     cmb_write(  "******************************************\n");\r
278 \r
279     cmb_write("\nThis Demo Takes the Audio Input from 8 Mics from CMB\n");\r
280         cmb_write("Runs the BF+ASNR+MSS+DRC Signal Processing Chain on Mic1 through Mic7\n");\r
281         cmb_write("The Processed Audio Output will be Sent to Left Channels of K2G EVM On-Board Line-Out\n");\r
282         cmb_write("The Mic8 will be Sent to Right Channels of K2G EVM On-Board Line-Out\n");\r
283         cmb_write("Please Plug a Headphone to K2G EVM On-Board Line-Out\n");\r
284 \r
285         UART_printf("\n******************************************\n");\r
286         UART_printf(  "        Audio Preprocessing Demo          \n");\r
287         UART_printf(  "******************************************\n");\r
288 \r
289         UART_printf("\nThis Demo Takes the Audio Input from 8 Mics from CMB\n");\r
290         UART_printf("Runs the BF+ASNR+MSS+DRC Signal Processing Chain on Mic1 through Mic7\n");\r
291         UART_printf("The Processed Audio Output will be Sent to Left Channels of K2G EVM On-Board Line-Out\n");\r
292         UART_printf("The Mic8 will be Sent to Right Channels of K2G EVM On-Board Line-Out\n");\r
293         UART_printf("Please Plug a Headphone to K2G EVM On-Board Line-Out\n");\r
294 \r
295         /* Initialize McASP HW details */\r
296         McaspDevice_init();\r
297 \r
298         /* Configure eDMA module */\r
299         status = eDmaConfig();\r
300         if(status != Cmb_EOK)\r
301         {\r
302                 cmb_write("eDMA Configuration Failed!\n");\r
303                 UART_printf("eDMA Configuration Failed!\n");\r
304                 testRet(1);\r
305         }\r
306 \r
307         /* Initialize common audio configurations */\r
308         status = (Cmb_STATUS)cmb_AudioInit();\r
309         if(status != Cmb_EOK)\r
310         {\r
311                 cmb_write("Audio Init Failed!\n");\r
312                 UART_printf("Audio Init Failed!\n");\r
313                 testRet(1);\r
314         }\r
315 \r
316         /* reset Audio ADC module 0 */\r
317         status = cmb_AudioAdcReset(CMB_ADC_DEVICE_0);\r
318         cmb_delay(10000);\r
319         /* set PLL for Audio ADC module 0 */\r
320         status = cmb_AudioAdcSetPLL(CMB_ADC_DEVICE_0);\r
321         cmb_delay(200000);\r
322 \r
323         /* reset Audio ADC module 1 */\r
324         status = cmb_AudioAdcReset(CMB_ADC_DEVICE_1);\r
325         cmb_delay(10000);\r
326 \r
327         /* Initialize Audio ADC module */\r
328         status = audioAdcConfig(CMB_ADC_DEVICE_0, &adcCfg);\r
329         if(status != Cmb_EOK)\r
330         {\r
331                 cmb_write("Audio ADC0 Configuration Failed!\n");\r
332                 UART_printf("Audio ADC0 Configuration Failed!\n");\r
333                 testRet(1);\r
334         }\r
335         cmb_delay(10000);\r
336 \r
337         status = audioAdcConfig(CMB_ADC_DEVICE_1, &adcCfg);\r
338         if(status != Cmb_EOK)\r
339         {\r
340                 cmb_write("Audio ADC1 Configuration Failed!\n");\r
341                 UART_printf("Audio ADC1 Configuration Failed!\n");\r
342                 testRet(1);\r
343         }\r
344         cmb_delay(10000);\r
345 \r
346         /* Initialize McASP module */\r
347         status = mcaspAudioConfig();\r
348         if(status != Cmb_EOK)\r
349         {\r
350                 cmb_write("McASP Configuration Failed!\n");\r
351                 UART_printf("McASP Configuration Failed!\n");\r
352                 testRet(1);\r
353         }\r
354 \r
355         /* Start BIOS execution */\r
356         BIOS_start();\r
357 }\r
358 \r
359 /**\r
360  *  \brief    Configures audio DAC module\r
361  *\r
362  *  \return    none\r
363  */\r
364 #if CMB_AUDIO_DAC\r
365 void configAudioDAC(void)\r
366 {\r
367         Cmb_STATUS status;\r
368 \r
369         /* Initialize Audio DAC0 module */\r
370         status = audioDacConfig(CMB_DAC_DEVICE_0, &dacCfg);\r
371         if(status != Cmb_EOK)\r
372         {\r
373                 cmb_write("Audio DAC0 Configuration Failed!\n");\r
374                 UART_printf("Audio DAC0 Configuration Failed!\n");\r
375                 testRet(1);\r
376         }\r
377 }\r
378 #endif\r
379 \r
380 /* Nothing past this point */\r