📄 pingpongprocess.c
字号:
#if defined(__ADSPBF561__)
#include <cdefbf561.h>
#elif defined (__ADSPBF533__)
#include <cdefbf533.h>
#elif defined (__ADSPBF537__)
#include <cdefbf537.h>
#else
#error "processor not yet supported"
#endif
#include "PingPongProcess.h"
#define PP_XSIZE 320
#define PP_YSIZE 240
#define BUFFER_FILL_LINES 5
#define BUF_FILL_CYCLES (PP_YSIZE / (BUFFER_FILL_LINES * 2))
#define INT_BUF_SIZE (PP_XSIZE * BUFFER_FILL_LINES * 2)
#pragma align 4
section ("conversion_buffer_a") unsigned long g_acIntBufferIn[2][INT_BUF_SIZE / 4];
#pragma align 4
section ("conversion_buffer_b") unsigned long g_acIntBufferOut[2][INT_BUF_SIZE / 4];
void doPPprocessing (unsigned long pa_pcInBuffer, unsigned long pa_pcOutBuffer, T_PP_PROCESS_FUNCTION pa_fProcessor) {
// setup config and modifiy registers of first mdma channel
*pMDMA1_S0_CONFIG = 0x0028;//0x0024;
*pMDMA1_S0_X_COUNT = INT_BUF_SIZE / 4;
*pMDMA1_S0_X_MODIFY = 4;
*pMDMA1_D0_CONFIG = 0x002a;//0x0026;
*pMDMA1_D0_X_COUNT = INT_BUF_SIZE / 4;
*pMDMA1_D0_X_MODIFY = 4;
// setup config and modifiy registers of second mdma channel
*pMDMA1_S1_CONFIG = 0x0028;//0x0024;
*pMDMA1_S1_X_COUNT = INT_BUF_SIZE / 4;
*pMDMA1_S1_X_MODIFY = 4;
*pMDMA1_D1_CONFIG = 0x002a;//0x0026;
*pMDMA1_D1_X_COUNT = INT_BUF_SIZE / 4;
*pMDMA1_D1_X_MODIFY = 4;
// setup mdma to fill first yuv buffer
*pMDMA1_S0_START_ADDR = (unsigned long *)pa_pcInBuffer;
*pMDMA1_D0_START_ADDR = (unsigned long *)&g_acIntBufferIn[0];
// enable dma
*pMDMA1_S0_CONFIG |= 0x0001;
*pMDMA1_D0_CONFIG |= 0x0001;
register unsigned long *extYUVbufferStart = (unsigned long *)pa_pcInBuffer + INT_BUF_SIZE / 4;
register unsigned long *extRGBbufferStart = (unsigned long *)pa_pcOutBuffer;
register unsigned char cFillCycles = BUF_FILL_CYCLES;
// wait for finishing buffer filling
while ((*pMDMA1_D0_IRQ_STATUS & 0x0008) == 0x0008);
// disable dma
*pMDMA1_S0_CONFIG &= ~0x0001;
*pMDMA1_D0_CONFIG &= ~0x0001;
while (cFillCycles) {
// setup second mdma to fill second internal buffer
*pMDMA1_S1_START_ADDR = extYUVbufferStart;
*pMDMA1_D1_START_ADDR = (unsigned long *)&g_acIntBufferIn[1];
asm ("ssync;");
// enable dma
*pMDMA1_S1_CONFIG |= 0x0001;
*pMDMA1_D1_CONFIG |= 0x0001;
extYUVbufferStart += (INT_BUF_SIZE / 4);
// converting first internal in buffer to first internal out buffer
pa_fProcessor((unsigned char *)&g_acIntBufferIn[0], (unsigned char *)&g_acIntBufferOut[0], PP_XSIZE * BUFFER_FILL_LINES);
// start writing out first internal out buffer
*pMDMA1_S0_START_ADDR = (unsigned long *)&g_acIntBufferOut[0];
*pMDMA1_D0_START_ADDR = extRGBbufferStart;
asm ("ssync;");
// enable dma
*pMDMA1_S0_CONFIG |= 0x0001;
*pMDMA1_D0_CONFIG |= 0x0001;
extRGBbufferStart += (INT_BUF_SIZE / 4);
// wait for finishing second internal in buffer
while ((*pMDMA1_D1_IRQ_STATUS & 0x0008) == 0x0008);
*pMDMA1_S1_CONFIG &= ~ 0x0001;
*pMDMA1_D1_CONFIG &= ~ 0x0001;
// setup second mdma to fill first internal in buffer
*pMDMA1_S1_START_ADDR = extYUVbufferStart;
*pMDMA1_D1_START_ADDR = (unsigned long *)&g_acIntBufferIn[0];
asm ("ssync;");
// enable dma
*pMDMA1_S1_CONFIG |= 0x0001;
*pMDMA1_D1_CONFIG |= 0x0001;
extYUVbufferStart += (INT_BUF_SIZE / 4);
// converting second internal in buffer to second internal out buffer
pa_fProcessor((unsigned char *)&g_acIntBufferIn[1], (unsigned char *)&g_acIntBufferOut[1], PP_XSIZE * BUFFER_FILL_LINES);
// wait for finishing first out buffer emptying
while ((*pMDMA1_D0_IRQ_STATUS & 0x0008) == 0x0008);
// disable dma
*pMDMA1_S0_CONFIG &= ~0x0001;
*pMDMA1_D0_CONFIG &= ~0x0001;
// start writing out second out buffer
*pMDMA1_S0_START_ADDR = (unsigned long *)&g_acIntBufferOut[1];
*pMDMA1_D0_START_ADDR = extRGBbufferStart;
asm ("ssync;");
// enable dma
*pMDMA1_S0_CONFIG |= 0x0001;
*pMDMA1_D0_CONFIG |= 0x0001;
extRGBbufferStart += (INT_BUF_SIZE / 4);
// wait for finishing first internal in buffer filling
while ((*pMDMA1_D1_IRQ_STATUS & 0x0008) == 0x0008);
// disable dma
*pMDMA1_S1_CONFIG &=~0x0001;
*pMDMA1_D1_CONFIG &=~0x0001;
cFillCycles --;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -