📄 qxd-dm642main.c
字号:
/********************************************************************/
/* 深圳市奇想达科技有限公司QXD-DM642开发板四路视频 */
/* 实时分屏显示源程序, */
/* http://www.szqxd.com */
/********************************************************************/
#include <csl.h>
#include <csl_emifa.h>
#include <csl_i2c.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_dat.h>
#include "iic.h"
#include "vportcap.h"
#include "vportdis.h"
#include "sa7121h.h"
/*DM642的IIC的设置结构*/
I2C_Config DM642IIC_Config = {
0,
0,
(20-5),
(20-5),
1,
0,
0x4ea0,
(75-1),
};
I2C_Handle hdm642i2c;
int portNumber;
extern SA7121H_ConfParams sa7121hPAL[45];
extern SA7121H_ConfParams sa7121hNTSC[45];
Uint8 misc_ctrl = 0x6D;
Uint8 output_format = 0x47;
// 地址为0 for cvbs port1,选择复合信号做为输入
Uint8 input_sel = 0x00;
/*地址为0xf,将Pin27设置成为CAPEN功能*/
Uint8 pin_cfg = 0x02;
/*地址为1B*/
Uint8 chro_ctrl_2 = 0x14;
/*图像句柄的声明*/
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;
/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines = 576;//每帧576行(PAL)
/*采集与显示缓冲区的首址*/
Uint32 capYbufferc = 0x80300000;
Uint32 capCbbufferc = 0x803675c0;
Uint32 capCrbufferc = 0x8039b0a0;
Uint32 capYbufferd = 0x80400000;
Uint32 capCbbufferd = 0x804675c0;
Uint32 capCrbufferd = 0x8049b0a0;
Uint32 disYbuffer = 0x80100000;
Uint32 disCbbuffer = 0x801675c0;
Uint32 disCrbuffer = 0x8019b0a0;
Uint32 tempYbuffer = 0x80500000;
Uint32 tempCbbuffer = 0x805675c0;
Uint32 tempCrbuffer = 0x8059b0a0;
#pragma DATA_SECTION(tempSpace, ".tempSpace")
Uint8 tempSpace[720*72];
/*图像格式标志*/
Uint8 NTSCorPAL = 0;
extern far void vectors();
extern volatile Uint32 capNewFrame;
extern volatile Uint32 capNewFrameb;
extern volatile Uint32 disNewFrame;
void main()
{
int i;
int j;
int k;
Uint8 addrI2C;
/*-------------------------------------------------------*/
/* perform all initializations */
/*-------------------------------------------------------*/
DM642_init();
/*----------------------------------------------------------*/
/*中断向量表的初始化*/
//Point to the IRQ vector table
IRQ_setVecs(vectors);
IRQ_nmiEnable();
IRQ_globalEnable();
IRQ_map(IRQ_EVT_VINT0, 11);
IRQ_map(IRQ_EVT_VINT1, 12);
IRQ_map(IRQ_EVT_VINT2, 10);
IRQ_reset(IRQ_EVT_VINT0);
IRQ_reset(IRQ_EVT_VINT1);
IRQ_reset(IRQ_EVT_VINT2);
/*打开一个数据拷贝的数据通路*/
DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
/*----------------------------------------------------------*/
/*进行IIC的初始化*/
hdm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
I2C_config(hdm642i2c,&DM642IIC_Config);
/*----------------------------------------------------------*/
GPIO_RSET(GPGC,0x0);/*将GPIO0不做为GPINT使用*/
GPIO_RSET(GPDIR,0x1);/*将GPIO0做为输出*/
GPIO_RSET(GPVAL,0x1);/*GPIO0输出为高,选择IIC1总线,配置*/
NTSCorPAL = 0;
portNumber = 0;
vpHchannel0 = bt656_8bit_ncfd(portNumber);
addrI2C = 0x88 >>1;
for(i =0; i<43; i++)
{
if(NTSCorPAL == 1)
{
_IIC_write(hdm642i2c,
addrI2C,
(sa7121hNTSC[i].regsubaddr),
(sa7121hNTSC[i].regvule));
}
else
{
_IIC_write(hdm642i2c,
addrI2C,
(sa7121hPAL[i].regsubaddr),
(sa7121hPAL[i].regvule));
}
}
GPIO_RSET(GPVAL,0x1);
//TVP5150第一路初始化已删
//TVP5150第二路初始化已删
//TVP5150第三路初始化
addrI2C = 0xB8 >>1;
_IIC_write(hdm642i2c, addrI2C,0x00, input_sel);
_IIC_write(hdm642i2c, addrI2C,0x03, misc_ctrl);
_IIC_write(hdm642i2c, addrI2C,0x0D, output_format);
_IIC_write(hdm642i2c, addrI2C,0x0F, pin_cfg);
_IIC_write(hdm642i2c, addrI2C,0x1B, chro_ctrl_2);
//TVP5150第四路初始化
addrI2C = 0xBA >>1;
_IIC_write(hdm642i2c, addrI2C,0x00, input_sel);
_IIC_write(hdm642i2c, addrI2C,0x03, misc_ctrl);
_IIC_write(hdm642i2c, addrI2C,0x0D, output_format);
_IIC_write(hdm642i2c, addrI2C,0x0F, pin_cfg);
_IIC_write(hdm642i2c, addrI2C,0x1B, chro_ctrl_2);
portNumber = 2;
vpHchannel2 = bt656_8bit_ncfc2(portNumber);
bt656_capture_start(vpHchannel2);
/*启动显示模块*/
bt656_display_start(vpHchannel0);
/*建立显示的实时循环*/
for(;;)
{
//////第一路视频已删
for(i=0;i<4;i++)
{
}
//////第二路视频已删
for(i=0;i<4;i++)
{
}
//////第三路视频
for(i=0;i<4;i++)
{
if(i<2)
{
for(j=i*144;j<(i+1)*144;j++)
{
DAT_copy((void *)(capYbufferc + j * numPixels),
(void *)(tempSpace + ((j-i*144)/2)* numPixels), numPixels);
j++;
}
for(j=i*72;j<(i+1)*72;j++)
for(k=0;k<720;k++)
{
*(Uint8 *)(disYbuffer +(j+144) *numPixels +(k/2))= *(Uint8 *)(tempSpace+(j-i*72)*numPixels+k);
k++;
}
}
else
{
for(j=i*144;j<(i+1)*144;j++)
{
DAT_copy((void *)(capYbufferc + j * numPixels),
(void *)(tempSpace + ((j-i*144)/2)* numPixels), numPixels);
j++;
}
for(j=144+i*72;j<144+(i+1)*72;j++)
for(k=0;k<720;k++)
{
*(Uint8 *)(disYbuffer +(j+144) *numPixels +(k/2))= *(Uint8 *)(tempSpace+(j-i*72-144)*numPixels+k);
k++;
}
}
}
for(i=0;i<2;i++)
{
if(i<1)
{
for(j=0;j<288;j++)
{
DAT_copy((void *)(capCbbufferc + j * numPixels/2),
(void *)(tempSpace + (j/2)* numPixels/2), numPixels/2);
j++;
}
for(j=0;j<144;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCbbuffer +(j+144)*numPixels/2 +(k/2))= *(Uint8 *)(tempSpace+j*numPixels/2+k);
k++;
}
for(j=0;j<288;j++)
{
DAT_copy((void *)(capCrbufferc + j * numPixels/2),
(void *)(tempSpace + (j/2)* numPixels/2), numPixels/2);
j++;
}
for(j=0;j<144;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCrbuffer +(j+144)*numPixels/2 +(k/2))= *(Uint8 *)(tempSpace+j*numPixels/2+k);
k++;
}
}
else
{
for(j=288;j<576;j++)
{
DAT_copy((void *)(capCbbufferc + j * numPixels/2),
(void *)(tempSpace + ((j-288)/2)* numPixels/2), numPixels/2);
j++;
}
for(j=288;j<432;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCbbuffer +(j+144)*numPixels/2 +(k/2))= *(Uint8 *)(tempSpace+(j-288)*numPixels/2+k);
k++;
}
for(j=288;j<576;j++)
{
DAT_copy((void *)(capCrbufferc + j * numPixels/2),
(void *)(tempSpace + ((j-288)/2)* numPixels/2), numPixels/2);
j++;
}
for(j=288;j<432;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCrbuffer +(j+144)*numPixels/2 +(k/2))= *(Uint8 *)(tempSpace+(j-288)*numPixels/2+k);
k++;
}
}
}
//////第四路视频
for(i=0;i<4;i++)
{
if(i<2)
{
for(j=i*144;j<(i+1)*144;j++)
{
DAT_copy((void *)(capYbufferd + j * numPixels),
(void *)(tempSpace + ((j-i*144)/2)* numPixels), numPixels);
j++;
}
for(j=i*72;j<(i+1)*72;j++)
for(k=0;k<720;k++)
{
*(Uint8 *)(disYbuffer +(j+144) *numPixels+360 +(k/2))= *(Uint8 *)(tempSpace+(j-i*72)*numPixels+k);
k++;
}
}
else
{
for(j=i*144;j<(i+1)*144;j++)
{
DAT_copy((void *)(capYbufferd + j * numPixels),
(void *)(tempSpace + ((j-i*144)/2)* numPixels), numPixels);
j++;
}
for(j=144+i*72;j<144+(i+1)*72;j++)
for(k=0;k<720;k++)
{
*(Uint8 *)(disYbuffer +(j+144) *numPixels+360 +(k/2))= *(Uint8 *)(tempSpace+(j-i*72-144)*numPixels+k);
k++;
}
}
}
for(i=0;i<2;i++)
{
if(i<1)
{
for(j=0;j<288;j++)
{
DAT_copy((void *)(capCbbufferd + j * numPixels/2),
(void *)(tempSpace + (j/2)* numPixels/2), numPixels/2);
j++;
}
for(j=0;j<144;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCbbuffer +(j+144)*numPixels/2+180 +(k/2))= *(Uint8 *)(tempSpace+j*numPixels/2+k);
k++;
}
for(j=0;j<288;j++)
{
DAT_copy((void *)(capCrbufferd + j * numPixels/2),
(void *)(tempSpace + (j/2)* numPixels/2), numPixels/2);
j++;
}
for(j=0;j<144;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCrbuffer +(j+144)*numPixels/2+180 +(k/2))= *(Uint8 *)(tempSpace+j*numPixels/2+k);
k++;
}
}
else
{
for(j=288;j<576;j++)
{
DAT_copy((void *)(capCbbufferd + j * numPixels/2),
(void *)(tempSpace + ((j-288)/2)* numPixels/2), numPixels/2);
j++;
}
for(j=288;j<432;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCbbuffer +(j+144)*numPixels/2+180 +(k/2))= *(Uint8 *)(tempSpace+(j-288)*numPixels/2+k);
k++;
}
for(j=288;j<576;j++)
{
DAT_copy((void *)(capCrbufferd + j * numPixels/2),
(void *)(tempSpace + ((j-288)/2)* numPixels/2), numPixels/2);
j++;
}
for(j=288;j<432;j++)
for(k=0;k<360;k++)
{
*(Uint8 *)(disCrbuffer +(j+144)*numPixels/2+180 +(k/2))= *(Uint8 *)(tempSpace+(j-288)*numPixels/2+k);
k++;
}
}
}
}
}
/********************************************************************/
/* 深圳市奇想达科技有限公司QXD-DM642开发板四路视频 */
/* 实时分屏显示源程序, */
/* http://www.szqxd.com */
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -