?? 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 + -