⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pingpongprocess.c

📁 BlackFin与摄像头的接口程序
💻 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 + -