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

📄 qxd-dm642main.c

📁 非常有价值的深圳市奇想达QXD-DM642开发板中提供的四路视频分屏显示源码
💻 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 + -