📄 mdtest.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 + -