📄 frame_get.c
字号:
#include"init.h"
#include"camera_drive.h"
///for dam buffers;
dma_descriptor DMA_ARRAY[2];
dsect(l1a,4,rw) unsigned char in_buf1[512*2];
dsect(l1b,4,rw) unsigned char in_buf2[512*2];
dsect(l1b,4,rw) unsigned char out_buf1[512*3*2];
dsect(l1b,4,rw) unsigned char out_buf2[512*3*2];
unsigned int in_buf1_add=&in_buf1[0];
unsigned int in_buf2_add=&in_buf2[0];
EX_INTERRUPT_HANDLER(MEM_COPY_ISR)
{
*pMDMA_D0_IRQ_STATUS=0x000f;//清除本次中断
*pMDMA_S0_CONFIG=0x0000;
*pMDMA_D0_CONFIG=0x0000;
asm("nop;");
}
void sdram_copy_init()
{
//read from mem
*pMDMA_S0_START_ADDR=&(buffer[0]);
*pMDMA_S0_X_COUNT=256*4;
*pMDMA_S0_X_MODIFY=1;
*pMDMA_S0_Y_COUNT=1;
*pMDMA_S0_Y_MODIFY=1;
*pMDMA_S0_PERIPHERAL_MAP=0x0040;
//write to mem
*pMDMA_D0_START_ADDR=TESTBUFFER;
*pMDMA_D0_X_COUNT=256*4;
*pMDMA_D0_X_MODIFY=1;
*pMDMA_D0_Y_COUNT=1;
*pMDMA_D0_Y_MODIFY=1;
*pMDMA_D0_PERIPHERAL_MAP=0x0040;
//ISR
*pSIC_IAR2&=0xff0fffff;
*pSIC_IAR2|=0x00400000;//real time IVG=11;
*pSIC_IMASK|=0x00200000;//enable mem stream0 interrupt
register_handler(ik_ivg11, MEM_COPY_ISR);
}
void sdram_copy_start(unsigned char *inbuffer,unsigned char *outbuffer)
{
}
EX_INTERRUPT_HANDLER(DMA0_ISR)
{
static int count=0;
unsigned short i;
unsigned char r,g,b;
unsigned char y,u,v;
//*pFIO_FLAG_S = 0x0008;
*pDMA0_IRQ_STATUS=0x000f;//清除本次中断
if(count++>240)
{
count=0;
return;
}
if(((int)(*pDMA0_START_ADDR)&0x00100000))
{
//inbuffer=in_buf1_add;
//cinbuffer=in_buf2_add;
//outbuffer=&out_buf1[0];
//coutbuffer=&out_buf2[0];
//copy to sdram
*pMDMA_S0_START_ADDR=out_buf2;//cinbuffer;
*pMDMA_D0_START_ADDR=TESTBUFFER+count*256*4;
*pMDMA_S0_CONFIG=0x00a1;
*pMDMA_D0_CONFIG=0x00a3;
/*//raw to rgb
for(i=0;i<256;i++)
{
b=*(in_buf1+i*2);
g=*(in_buf1+i*2+1);
r=*(in_buf1+512+i*2+1);
*(out_buf1+i*3)=b;
*(out_buf1+i*3+1)=g;
*(out_buf1+i*3+2)=r;
} */
//row to vyuy 422
/*for(i=0;i<256;i++)
{
b=*(in_buf1+i*2);
g=*(in_buf1+i*2+1);
r=*(in_buf1+512+i*2+1);
y=(unsigned char)((234*(int)r+601*g+117*b)>>10);
u=((unsigned short)y+256-b)>>1;
v=((unsigned short)y+256-r)>>1;
*(out_buf1+i*4)=u;
*(out_buf1+i*4+1)=y;
*(out_buf1+i*4+2)=v;
*(out_buf1+i*4+3)=y;
}*/
}
else
{
//inbuffer=in_buf2_add;
//cinbuffer=in_buf1_add;
//outbuffer=&out_buf2[0];
//coutbuffer=&out_buf1[0];
//copy to sdram
*pMDMA_S0_START_ADDR=out_buf1;//cinbuffer;
*pMDMA_D0_START_ADDR=TESTBUFFER+count*256*4;
*pMDMA_S0_CONFIG=0x00a1;
*pMDMA_D0_CONFIG=0x00a3;
/*//raw to rgb
for(i=0;i<256;i++)
{
b=*(in_buf2+i*2);
g=*(in_buf2+i*2+1);
r=*(in_buf2+512+i*2+1);
*(out_buf2+i*3)=b;
*(out_buf2+i*3+1)=g;
*(out_buf2+i*3+2)=r;
}*/
//row to vyuy 422
/*for(i=0;i<256;i++)
{
b=*(in_buf2+i*2);
g=*(in_buf2+i*2+1);
r=*(in_buf2+512+i*2+1);
y=(unsigned char)((234*(int)r+601*g+117*b)>>10);
u=((unsigned short)y+256-b)>>1;
v=((unsigned short)y+256-r)>>1;
*(out_buf2+i*4)=0;
*(out_buf2+i*4+1)=0;
*(out_buf2+i*4+2)=0;
*(out_buf2+i*4+3)=0;
}*/
}
}
void get_one_frame()
{
unsigned short test2;
unsigned short status;
int i;
//start cameara
//i2c_write(0x09,test1);
i2c_write(0x0c,0x0001);
//i2c_write(0x7f,0x26aa);
//i2c_write(0x7f,0x3000);
//i2c_write(0x7f,0x2800);
i2c_write(0x7f,0x0000);
//i2c_write(0x7f,0x3800);
i2c_write(0x72,0x0000);
i2c_write(0x05,94);
i2c_write(0x06,45);
i2c_write(0x03,480);
i2c_write(0x04,720);
test2=i2c_read(0x00);
//clear sdram
for(i=0;i<512*480*3;i++)
*(TESTBUFFER+i)=0;
//ppi init;
*pPPI_DELAY=0;
*pPPI_COUNT=IMG_WIDTH-1;
*pPPI_FRAME=IMG_HEIGHT;
*pPPI_CONTROL=0x402d&0xfffe;//0x402d;//0x404d;//0x00ad; not start;
//dma init;
DMA_ARRAY[0].NDPL=(unsigned short)(&DMA_ARRAY[1]);
DMA_ARRAY[0].SAL=(unsigned short)(in_buf1_add);
DMA_ARRAY[0].SAH=(unsigned short)((in_buf1_add)>>16);
DMA_ARRAY[1].NDPL=(unsigned short)(&DMA_ARRAY[0]);
DMA_ARRAY[1].SAL=(unsigned short)(in_buf2_add);
DMA_ARRAY[1].SAH=(unsigned short)((in_buf2_add)>>16);
*pDMA0_CURR_DESC_PTR=&DMA_ARRAY[0];
*pDMA0_START_ADDR=in_buf1_add;
*pDMA0_X_COUNT=512*2;
*pDMA0_X_MODIFY=1;
*pDMA0_Y_COUNT=1;
*pDMA0_Y_MODIFY=1;
*pDMA0_NEXT_DESC_PTR=&DMA_ARRAY[1];
*pDMA0_PERIPHERAL_MAP=0x0000;
*pDMA0_CONFIG=0x63a2;// stop DMA
sdram_copy_init();
//isr
*pSIC_IAR1&=0xfffffff0;
*pSIC_IAR1|=0x00000001;//real time IVG=8;
*pSIC_IMASK|=0x00000100;//enable dma0 interrupt
register_handler(ik_ivg8, DMA0_ISR);
//start ppi trans
*pPPI_CONTROL=0x402d;
*pDMA0_CONFIG=0x63a3;// start DMA
asm("nop;");
}
/*void mem2mem_copy()
{
int i;
for(i=0;i<100;i++)
buffer[i]=(char)i;
//read from mem
*pMDMA_S0_START_ADDR=&(buffer[0]);
*pMDMA_S0_X_COUNT=100;
*pMDMA_S0_X_MODIFY=1;
*pMDMA_S0_Y_COUNT=1;
*pMDMA_S0_Y_MODIFY=1;
*pMDMA_S0_PERIPHERAL_MAP=0x0040;
//write to mem
*pMDMA_D0_START_ADDR=TESTBUFFER;
*pMDMA_D0_X_COUNT=100;
*pMDMA_D0_X_MODIFY=1;
*pMDMA_D0_Y_COUNT=1;
*pMDMA_D0_Y_MODIFY=1;
*pMDMA_D0_PERIPHERAL_MAP=0x0040;
//ISR
*pSIC_IAR2&=0xff0fffff;
*pSIC_IAR2|=0x00400000;//real time IVG=11;
*pSIC_IMASK|=0x00200000;//enable mem stream0 interrupt
register_handler(ik_ivg11, MEM_COPY_ISR);
//start DMA
*pMDMA_S0_CONFIG=0x00a1;
*pMDMA_D0_CONFIG=0x00a3;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -