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

📄 mdtest.c

📁 凌阳32位单片机开发的小游戏
💻 C
字号:
#include "..\SysLib_Basic\Include\Sys_Register.h"
//#include "PPUDrv.h"
#include "..\SysLib_Extend\Include\Csi.h"

#define LDM_EN		0x80000000
#define LDM_IRQEN	0x40000000
#define LDM_MIU2LDM	0x00000000
#define LDM_LDM2MIU	0x20000000
#define LDM_BYTE	0x00000000
#define LDM_HWORD	0x04000000
#define LDM_WORD	0x08000000
#define LDM_BURST	0x0C000000


unsigned int old_yuv, md_frame_int;
int framecnt;

// For LDM Memory Declare
//unsigned int diff_buf_ldm[1200] __attribute__ ((section (".ar_LDM")));
//unsigned int cc_buf_ldm[75] __attribute__ ((section (".ar_LDM")));
unsigned int diff_buf_ldm[1200];
unsigned int cc_buf_ldm[75];

void fill_square(unsigned int fb_start, unsigned int x, unsigned int y, unsigned int size, unsigned int color, unsigned int qvga);

void cc_init(void);

/* void posi_tst (void) {
	
	old_yuv = 0;
	
	// Set 320,240 as position hit coordinate 
	*P_CSI_MD_POS = (240<<16)|320;
	
	*P_CSI_IRQEN = *P_CSI_IRQEN|POS_HIT;
	
	while (1);
}
 */
void diff16x16_tst (int qvga) {

	unsigned int diff_buf[1200];
	unsigned int i, j, k;
	
	unsigned int diff_value;
	
	// Bit 31 is MD/Frame Buffer Control Signal
//	*P_CSI_MD_SADDR = (unsigned int)diff_buf;
	
//	*P_CSI_MD_CR = MD_DIFF|SAMP_16|FRAME_1|(0x10<<9);
	
//	md_frame_int = 0;
	
//	*P_CSI_IRQEN = *P_CSI_IRQEN|MD_FRAME;
//  *P_CSI_IRQEN |= FRAME_LOSS|MD_FRAME|MD_UF;

	// Setup Sensor's FB Address
//	*P_CSI_TG_FBSADDR0 = 0x00100000;
//	*P_CSI_TG_FBSADDR1 = 0x00200000;
//	*P_CSI_TG_FBSADDR2 = 0x00200000;

	while (1) {
		
		while (md_frame_int == 0);
		md_frame_int = 0;

		// Move DIFF Buffer to LDM
		*P_LDM_MIU_START = (unsigned int)diff_buf;
		*P_LDM_MIU_END = (unsigned int)diff_buf + 1200;
		*P_LDM_START = (unsigned int)diff_buf_ldm;
		*P_LDM_END = (unsigned int)diff_buf_ldm + 1200;
		
//		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_WORD;
		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_BURST;
		
		while (*P_LDM_STATUS == 0);
		*P_LDM_STATUS = 0x80000000;
		*P_LDM_CTRL = 0;
		
		// Check All 16x16 blocks Points
		if (qvga) {
			k=0;
			for (i=0;i<15;i++) {
				for (j=0;j<20;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0x80300000, j*16, i*16, 16, 0xFFFFFFFF, 1);
					else
						fill_square(0x80300000, j*16, i*16, 16, 0x00000000, 1);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
		} else {
			k=0;
			for (i=0;i<30;i++) {
				for (j=0;j<40;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0x80300000, j*16, i*16, 16, 0xFFFFFFFF, 0);
					else
						fill_square(0x80300000, j*16, i*16, 16, 0x00000000, 0);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
		}
	};
}

/* void diff8x8_tst (int qvga) {

	unsigned int diff_buf[1200];
	unsigned int i, j, k;
	
	unsigned int diff_value;
	
	// Bit 31 is MD/Frame Buffer Control Signal
	*P_CSI_MD_SADDR = (unsigned int)diff_buf;
	
	*P_CSI_MD_CR = MD_DIFF|SAMP_8|FRAME_1|(0x10<<9);
	
	md_frame_int = 0;
	
//	*P_CSI_IRQEN = *P_CSI_IRQEN|MD_FRAME;
    *P_CSI_IRQEN = FRAME_LOSS|MD_FRAME|FRAME_END;

	// Setup Sensor's FB Address
	*P_CSI_TG_FBSADDR0 = 0x00100000;
	*P_CSI_TG_FBSADDR1 = 0x00200000;
	*P_CSI_TG_FBSADDR2 = 0x00200000;

	// Clear Frame Buffer 3
//	for (i=0;i<(640*480*2);i=i+4)
//		*(volatile unsigned int*)(0x80300000 + i) = 0x0;

	while (1) {
		
		while (md_frame_int == 0);
		md_frame_int = 0;
		framecnt = 0;
		
		// Move DIFF Buffer to LDM
		*P_LDM_MIU_START = (unsigned int)diff_buf;
		*P_LDM_MIU_END = (unsigned int)diff_buf + 4800;
		*P_LDM_START = (unsigned int)diff_buf_ldm;
		*P_LDM_END = (unsigned int)diff_buf_ldm + 4800;
		
//		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_WORD;
		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_BURST;
		
		while (*P_LDM_STATUS == 0);
		*P_LDM_STATUS = 0x80000000;
		*P_LDM_CTRL = 0;

		// Check All 8x8 blocks Points
		if (qvga) {
			k=0;
			for (i=0;i<30;i++) {
				for (j=0;j<40;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0xA0300000, j*8, i*8, 8, 0xFFFFFFFF, 1);
					else
						fill_square(0xA0300000, j*8, i*8, 8, 0x00000000, 1);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
		} else {
			k=0;
			for (i=0;i<60;i++) {
				for (j=0;j<80;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0xA0300000, j*8, i*8, 8, 0xFFFFFFFF, 0);
					else
						fill_square(0xA0300000, j*8, i*8, 8, 0x00000000, 0);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
		}
//		print2("framecnt = ", 1, framecnt);
	};
}

void cc16x16_tst (int qvga) {

	unsigned int diff_buf[300];
	unsigned int cc_buf[75];
	unsigned int i, j, k;
		
	unsigned int diff_value, cc_value;
	
	cc_init();
		
	// Bit 31 is MD/Frame Buffer Control Signal
	*P_CSI_MD_SADDR = (unsigned int)diff_buf;
	*P_CSI_MD_SADDR1 = (unsigned int)cc_buf;
	
	*P_CSI_MD_CR = MD_CC|SAMP_16|FRAME_1|(0x04<<9);
	
	// Set 320,240 as position hit coordinate 
	//*P_CSI_MD_POS = (240<<16)|320;

	md_frame_int = 0;
	
//	*P_CSI_IRQEN = *P_CSI_IRQEN|MD_FRAME;
    *P_CSI_IRQEN = FRAME_LOSS|MD_FRAME|FRAME_END;

	// Setup Sensor's FB Address
	*P_CSI_TG_FBSADDR0 = 0x00300000;
	*P_CSI_TG_FBSADDR1 = 0x00300000;
	*P_CSI_TG_FBSADDR2 = 0x00300000;

	// Setup TV Buffer Start Address
	*P_TV_START_ADR1 = 0x00300000;
	*P_TV_START_ADR2 = 0x00300000;
	*P_TV_START_ADR3 = 0x00300000;

	// Clear Frame Buffer 3
	for (i=0;i<(640*480*2);i=i+4) {
		*(volatile unsigned int*)(0x80200000 + i) = 0x0;
		*(volatile unsigned int*)(0x80300000 + i) = 0x0;
	}
	
	while (1) {
		
		while (md_frame_int == 0);
		md_frame_int = 0;
		framecnt = 0;
		
		// Move DIFF Buffer to LDM
		*P_LDM_MIU_START = (unsigned int)diff_buf;
		*P_LDM_MIU_END = (unsigned int)diff_buf + 1200;
		*P_LDM_START = (unsigned int)diff_buf_ldm;
		*P_LDM_END = (unsigned int)diff_buf_ldm + 1200;
		
//		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_WORD;
		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_BURST;
		
		while (*P_LDM_STATUS == 0);
		*P_LDM_STATUS = 0x80000000;
		*P_LDM_CTRL = 0;

		// Move CC Buffer to LDM
		*P_LDM_MIU_START = (unsigned int)cc_buf;
		*P_LDM_MIU_END = (unsigned int)cc_buf + 300;
		*P_LDM_START = (unsigned int)cc_buf_ldm;
		*P_LDM_END = (unsigned int)cc_buf_ldm + 300;
		
//		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_WORD;
		*P_LDM_CTRL = LDM_EN|LDM_MIU2LDM|LDM_BURST;
		
		while (*P_LDM_STATUS == 0);
		*P_LDM_STATUS = 0x80000000;
		*P_LDM_CTRL = 0;

		// Check All 8x8 blocks Points
		if (qvga) {
			// Diff Test Region
			k=0;
			for (i=0;i<15;i++) {
				for (j=0;j<20;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0x80200000, j*16, i*16, 16, 0xFFFFFFFF, 1);
					else
						fill_square(0x80200000, j*16, i*16, 16, 0x00000000, 1);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
			k=0;
			for (i=0;i<15;i++) {
				for (j=0;j<20;j++) {
					if ((k&0xF) == 0)
						cc_value = cc_buf_ldm[(k/16)];
					
					switch (cc_value & 0x3) {
						case (0):
						fill_square(0x80300000, j*16, i*16, 16, 0x00000000, 1);
						break;
						case (1):	// Blue
						fill_square(0x80300000, j*16, i*16, 16, 0x001F001F, 1);
						break;
						case (2):	// Green
						fill_square(0x80300000, j*16, i*16, 16, 0x07E007E0, 1);
						break;
						case (3):	// Red
						fill_square(0x80300000, j*16, i*16, 16, 0xF800F800, 1);
						break;
					}
					k++;
					diff_value = (diff_value>>1);
					cc_value = (cc_value>>2);
				}
			}
		} else {
			k=0;
			for (i=0;i<30;i++) {
				for (j=0;j<40;j++) {
					if ((k&0x3) == 0)
						diff_value = diff_buf_ldm[(k/4)]&0xF;
					
					if ((diff_value & 0x1) != 0)
						fill_square(0x80300000, j*16, i*16, 16, 0xFFFFFFFF, 0);
					else
						{}//fill_square(0x80200000, j*16, i*16, 16, 0x00000000, 0);
						
					k++;
					diff_value = (diff_value>>1);
				}
			}
			k=0;
			for (i=0;i<30;i++) {
				for (j=0;j<40;j++) {
					if ((k&0xF) == 0)
						cc_value = cc_buf_ldm[(k/16)];
					
					switch (cc_value & 0x3) {
						case (0):
						//fill_square(0x80300000, j*16, i*16, 16, 0x00000000, 0);
						break;
						case (1):	// Blue
						fill_square(0x80300000, j*16, i*16, 16, 0x001F001F, 0);
						break;
						case (2):	// Green
						fill_square(0x80300000, j*16, i*16, 16, 0x07E007E0, 0);
						break;
						case (3):	// Red
						fill_square(0x80300000, j*16, i*16, 16, 0xF800F800, 0);
						break;
					}
					k++;
					diff_value = (diff_value>>1);
					cc_value = (cc_value>>2);
				}
			}
		}
//		print2("framecnt = ", 1, framecnt);
//		print3("RGB = ", 0, *P_CSI_MD_RGB);
	};
}

void cc_init(void) {

	unsigned int cc_idx[8][8];
	
	unsigned int i, j;
	
	unsigned int reg_set[8];
	
	// 0 is color other than RGB	
	for (i=0;i<8;i++) {
		for (j=0;j<8;j++)
			cc_idx[i][j] = 0;
	}

	// Define Blue Region	
	//cc_idx[0][0] = 1;cc_idx[0][1] = 1;cc_idx[0][2] = 1;
	//cc_idx[1][0] = 1;cc_idx[1][1] = 1;cc_idx[1][2] = 1;
	cc_idx[0][0] = 1;cc_idx[0][1] = 1;cc_idx[0][2] = 1;cc_idx[0][3] = 1;
//	cc_idx[1][0] = 1;cc_idx[1][1] = 1;cc_idx[1][2] = 1;cc_idx[1][3] = 1;
	cc_idx[1][0] = 1;cc_idx[1][1] = 1;cc_idx[1][2] = 1;
	cc_idx[2][2] = 1;

	// Define Green Region
	cc_idx[0][4] = 2;cc_idx[0][5] = 2;cc_idx[0][6] = 2;cc_idx[0][7] = 2;
	cc_idx[1][4] = 2;cc_idx[1][5] = 2;cc_idx[1][6] = 2;cc_idx[1][7] = 2;
	cc_idx[2][4] = 2;cc_idx[2][5] = 2;cc_idx[2][6] = 2;cc_idx[2][7] = 2;

	// Define Red Region
	cc_idx[6][0] = 3;cc_idx[6][1] = 3;
	cc_idx[7][0] = 3;cc_idx[7][1] = 3;cc_idx[7][2] = 3;

	*P_CSI_MD_CTABLE0 =  cc_idx[0][0]      + (cc_idx[0][1]<<2)  + (cc_idx[0][2]<<4)  + (cc_idx[0][3]<<6) +
	                    (cc_idx[0][4]<<8)  + (cc_idx[0][5]<<10) + (cc_idx[0][6]<<12) + (cc_idx[0][7]<<14) +
	                    (cc_idx[1][0]<<16) + (cc_idx[1][1]<<18) + (cc_idx[1][2]<<20) + (cc_idx[1][3]<<22) +
	                    (cc_idx[1][4]<<24) + (cc_idx[1][5]<<26) + (cc_idx[1][6]<<28) + (cc_idx[1][7]<<30);

	*P_CSI_MD_CTABLE1 =  cc_idx[2][0]      + (cc_idx[2][1]<<2)  + (cc_idx[2][2]<<4)  + (cc_idx[2][3]<<6) +
	                    (cc_idx[2][4]<<8)  + (cc_idx[2][5]<<10) + (cc_idx[2][6]<<12) + (cc_idx[2][7]<<14) +
	                    (cc_idx[3][0]<<16) + (cc_idx[3][1]<<18) + (cc_idx[3][2]<<20) + (cc_idx[3][3]<<22) +
	                    (cc_idx[3][4]<<24) + (cc_idx[3][5]<<26) + (cc_idx[3][6]<<28) + (cc_idx[3][7]<<30);

	*P_CSI_MD_CTABLE2 =  cc_idx[4][0]      + (cc_idx[4][1]<<2)  + (cc_idx[4][2]<<4)  + (cc_idx[4][3]<<6) +
	                    (cc_idx[4][4]<<8)  + (cc_idx[4][5]<<10) + (cc_idx[4][6]<<12) + (cc_idx[5][0]<<14) +
	                    (cc_idx[5][1]<<16) + (cc_idx[5][2]<<18) + (cc_idx[5][3]<<20) + (cc_idx[5][4]<<22) +
	                    (cc_idx[5][5]<<24) + (cc_idx[6][0]<<26) + (cc_idx[6][1]<<28) + (cc_idx[6][2]<<30);

	*P_CSI_MD_CTABLE3 =  cc_idx[6][3]      + (cc_idx[6][4]<<2)  + (cc_idx[7][0]<<4)  + (cc_idx[7][1]<<6) +
	                    (cc_idx[7][2]<<8)  + (cc_idx[7][3]<<10);
		

	*P_CSI_MD_REG1 = (0xFB<<24) + (0x08<<16) + (0xFD<<8) + 0x08; //(-5, 8, -3, 8)
	*P_CSI_MD_REG2 = (0xFB<<24) + (0x0F<<16) + (0xFD<<8) + 0x0F; //(-5, 15, -3, 15)
	*P_CSI_MD_REG3 = (0xFB<<24) + (0x12<<16) + (0xFD<<8) + 0x14; //(-5, 18, -3, 20)

	*P_CSI_MD_TH = (0x30<<24) + (0x30<<16) + (0x24<<8) + 0x3C; //(48, 48, 36, 60)

}

 */
// Fill Square Area in a frame buffer
// (x, y) is left-top corner of the square
void fill_square(unsigned int fb_start, unsigned int x, unsigned int y, unsigned int size, unsigned int color, unsigned int qvga) {
	
	int i, j;
	unsigned int start_addr;
	unsigned int size2;
//	fb_start = fb_start & 0x8fffffff;

	if (qvga)
		start_addr = fb_start + (y*640) + x*2;
	else
		start_addr = fb_start + (y*1280) + x*2;
	
	// Update Frame Buffer only when it is not the same color
	if (*(unsigned int*)(start_addr) != color) {

		size2 = size * 2;
		for (i=0;i<size;i++) {
			for (j=0;j<size2;j=j+4) {
				*(unsigned int*)(start_addr + j) = color;
			}
			if (qvga)
				start_addr += 640;
			else
				start_addr += 1280;
		}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -