📄 audio.c
字号:
/*
* DSP/BIOS by Degrees (SPRA591) for DSK6711 and DSK6211
*
* ======== audio.c ========
*/
#include <std.h>
#include <log.h>
#include <stdio.h>
#include <csl.h>
#include <csl_edma.h>
#include <csl_irq.h>
#include <csl_mcbsp.h>
#include <fir_gen.h>
#include "audio.h"
volatile int inputReadyFlag = 0; /* Set when RX buffer is full */
volatile int outputReadyFlag = 0; /* Set when TX buffer is ready for new data */
volatile int edmaBufferMask = 0; /* Mask indicates which buffers are ready */
volatile int filterEnable = 0; /* Change to 1 to enable filtering */
volatile int filterSelect = 5; /* 0-8 selects one of nine filter coefficients */
MCBSP_Handle hMcbsp;
EDMA_Handle hEdmaTx;
EDMA_Handle hEdmaRx;
/* Global Variables */
short pingRX[BUFSIZE];
short pongRX[BUFSIZE];
short pingTX[BUFSIZE];
short pongTX[BUFSIZE];
/* Function Prototypes */
void processBuffer(void);
/* External References */
extern short filterCoeff[FILTERS][COEFFS];
/* LOG Object created by the Configuration Tool */
extern far LOG_Obj trace;
/*
* ======== main ========
*/
void main(void)
{
int date = 25;
BIOS_start();
CSL_init(); /* Initialize CSL */
initApplication(); /* Initialize Peripherals */
interruptsEnable(); /* Enable EDMA and Global Interrupts */
LOG_printf(&trace, "Why do computer scientists celebrate Halloween and Christmas \
on the same day? Because oct %o equals dec %d.\n", date, date);
while (1) {
if (inputReadyFlag && outputReadyFlag) {
inputReadyFlag = 0; /* Reset flags */
outputReadyFlag = 0;
processBuffer(); /* Process Data */
}
IDL_run();
}
}
/*
* ======== processBuffer ========
*/
void processBuffer(void)
{
short *processSrc;
short *processDst;
int gie;
int i;
/*
* Disable interrupts to avoid possible
* race condition with edmaISR which also
* changes edmaBufferMask
*/
gie = IRQ_globalDisable();
if (edmaBufferMask & RXPINGMASK) {
processSrc = (short *)&pingRX[0]; /* Set-up Source */
/* Reprogram EDMA with pongRX as destination */
EDMA_configArgs(
hEdmaRx,
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0X5),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
MCBSP_getRcvAddr(hMcbsp),
PRESENT,
(Uint32)&pongRX[HISTORY],
EDMA_IDX_DEFAULT,
EDMA_RLD_DEFAULT
);
/*
* Program QDMA to transfer data at end of full buffer to
* beginning of next buffer for filtering purposes
*/
EDMA_qdmaConfigArgs(
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO,
EDMA_OPT_TCC_OF(0X0),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
(Uint32)&pingRX[PRESENT],
HISTORY,
(Uint32)&pongRX[0],
EDMA_IDX_DEFAULT
);
}
else if (edmaBufferMask & RXPONGMASK) {
processSrc = (short *)&pongRX[0];
/* Reprogram EDMA with pingRX as destination */
EDMA_configArgs(
hEdmaRx,
EDMA_OPT_RMK(
EDMA_OPT_PRI_HIGH,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_NONE,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0X4),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
MCBSP_getRcvAddr(hMcbsp),
PRESENT,
(Uint32)&pingRX[HISTORY],
EDMA_IDX_DEFAULT,
EDMA_RLD_DEFAULT
);
/*
* Program QDMA to transfer data at end of full buffer to
* beginning of next buffer for filtering purposes
*/
EDMA_qdmaConfigArgs(
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_INC,
EDMA_OPT_TCINT_NO,
EDMA_OPT_TCC_OF(0X0),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
(Uint32)&pongRX[PRESENT],
HISTORY,
(Uint32)&pingRX[0],
EDMA_IDX_DEFAULT
);
}
if (edmaBufferMask & TXPONGMASK) {
processDst = (short *)&pongTX[HISTORY]; /* Set-up Dest */
/* Reprogram EDMA with pingTX as source */
EDMA_configArgs(
hEdmaTx,
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_NONE,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0X7),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
(Uint32)&pingTX[HISTORY],
PRESENT,
MCBSP_getXmtAddr(hMcbsp),
EDMA_IDX_DEFAULT,
EDMA_RLD_DEFAULT
);
}
else if (edmaBufferMask & TXPINGMASK) {
processDst = (short *)&pingTX[HISTORY];
/* Reprogram EDMA with pongTX as source */
EDMA_configArgs(
hEdmaTx,
EDMA_OPT_RMK(
EDMA_OPT_PRI_LOW,
EDMA_OPT_ESIZE_16BIT,
EDMA_OPT_2DS_NO,
EDMA_OPT_SUM_INC,
EDMA_OPT_2DD_NO,
EDMA_OPT_DUM_NONE,
EDMA_OPT_TCINT_YES,
EDMA_OPT_TCC_OF(0X6),
EDMA_OPT_LINK_NO,
EDMA_OPT_FS_NO),
(Uint32)&pongTX[HISTORY],
PRESENT,
MCBSP_getXmtAddr(hMcbsp),
EDMA_IDX_DEFAULT,
EDMA_RLD_DEFAULT
);
}
edmaBufferMask = 0; /* Clear ISR edma flag */
IRQ_globalRestore(gie); /* Restore global interrupts */
if (filterEnable == 0) { /* Loop-Back if filter off */
for (i = 0; i < PRESENT; i++) {
processDst[i] = ((0xfffe)&processSrc[i]);
}
}
else { /* Apply filter function */
fir_gen(processSrc, (short *)&filterCoeff[filterSelect][0], processDst,
COEFFS, PRESENT);
}
/* 0 least significant bit for transfer to codec */
/* for ( i = 0; i < PRESENT; i++ ) {
processDst[i] &= 0xfffe;
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -