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

📄 dm642main.c

📁 dsp dm642中图像拉普拉斯锐化源码
💻 C
字号:
/********************************************************************/
/*  Copyright 2004 by SSD Incorporated.							*/
/*  All rights reserved. Property of SSD Incorporated.				*/
/*  Restricted rights to use, duplicate or disclose this code are	*/
/*  granted through contract.									    */
/*  															    */
/********************************************************************/
#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), 
};

static Uint8 saa7113_ta[]={
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
	0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,
	0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x58,
	0x59,0x5a,0x5b,0x5e
};

static Uint8 saa7113_tv[]={
	0x08,0xc3,0x33,0x00,0x00,0x0eb,0x0e0,0x0B8,
	0x01,0x7E,0x46,0x43,0x01,0x01,0x0F,0x00,
	0x0c,0xA7,0x00,0x00,0x00,0x00,0x02,0x00,
	0x54,0x07,0x80,0x00
};

I2C_Handle hdm642i2c;
int portNumber;

extern SA7121H_ConfParams sa7121hPAL[45];
extern SA7121H_ConfParams sa7121hNTSC[45];

/*图像句柄的声明*/
VP_Handle vpHchannel0;
VP_Handle vpHchannel1;
VP_Handle vpHchannel2;

/*确定图像的参数*/
int numPixels = 720;//每行720个像素
int numLines  = 576;//每帧576行(PAL)

/*确定处理的范围*/
/*A             */
/*              */
/*             D*/ 
int intAPixels = 190;
int intALines = 59;
int intDPixels = 530;
int intDLines = 229; 

/*******************/
/*****画矩形边框函数的声明*****/
void drawRectangle();
/*Laplacian锐化处理*/
void LaplacianSharp();

/*采集与显示缓冲区的首址*/
Uint32 capYbuffer  = 0x80000000;
Uint32 capCbbuffer = 0x800675c0;
Uint32 capCrbuffer = 0x8009b0a0;

Uint32 disYbuffer  = 0x80100000;
Uint32 disCbbuffer = 0x801675c0; 
Uint32 disCrbuffer = 0x8019b0a0;

Uint32 tempSrcYbuffer    = 0x80200000;   //临时
Uint32 tempDisYbuffer    = 0x80300000;   //临时

/*图像格式标志*/
Uint8 NTSCorPAL = 0;

extern far void vectors();
extern volatile Uint32 capNewFrame;
extern volatile Uint32 disNewFrame;

void main()
{
	int	i;
	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_reset(IRQ_EVT_VINT0);
    IRQ_reset(IRQ_EVT_VINT1);	
    /*打开一个数据拷贝的数据通路*/
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);	

	portNumber = 1;
	vpHchannel1 = bt656_8bit_ncfd(portNumber);
    
/*----------------------------------------------------------*/	
	/*进行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;
	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,0x0);

// SAA7113 初始化						   
	addrI2C = 0x48 >>1;

	for(i = 0;i<28 ;i++)
	{
		_IIC_write(hdm642i2c, addrI2C,saa7113_ta[i], saa7113_tv[i]);
	}	

	portNumber = 0;
	vpHchannel0 = bt656_8bit_ncfc(portNumber);
	bt656_capture_start(vpHchannel0);
	/*等待第一帧数据采集完成*/
	while(capNewFrame == 0){}
	/*将数据存入显示缓冲区,并清采集完成的标志*/
	capNewFrame =0;
	for(i=0;i<numLines;i++)
	{
		/*传送临时Y缓冲区*/
		DAT_copy((void *)(capYbuffer + i * numPixels), 
	             (void *)(tempSrcYbuffer + i * numPixels),
	             numPixels);
		/*传送临时Y缓冲区*/
		DAT_copy((void *)(capYbuffer + i * numPixels), 
	             (void *)(tempDisYbuffer + i * numPixels),
	             numPixels);
	 }

	/*Laplacian锐化处理*/
    LaplacianSharp(); 

    /*画边框*/    
    drawRectangle();
	 
	for(i=0;i<numLines;i++)
	{
		/*传送Y缓冲区*/
		DAT_copy((void *)(tempDisYbuffer + i * numPixels), 
	             (void *)(disYbuffer + i * numPixels),
	             numPixels);	  
	 }	 
	
	//清除彩色信号  
	for(i=0;i<0x33ae0;i++)
	{
	    *((Uint8 *)(disCrbuffer +i)) =0x80;
	    *((Uint8 *)(disCbbuffer +i)) =0x80;

	} 
	 
	/*启动显示模块*/
	bt656_display_start(vpHchannel1);
	/*建立显示的实时循环*/
	for(;;)
	{
		/*当采集区的数据已经采集好,而显示缓冲区的数据已空*/
		if((capNewFrame == 1)&&(disNewFrame == 1))
		{
			/*将数据装入显示缓冲区,并清采集完成的标志*/
			capNewFrame =0;
			disNewFrame =0;
			for(i=0;i<numLines;i++)
			{
				/*传送临时Y缓冲区*/
				DAT_copy((void *)(capYbuffer + i * numPixels), 
			             (void *)(tempSrcYbuffer + i * numPixels),
			             numPixels);	
				/*传送临时Y缓冲区*/
				DAT_copy((void *)(capYbuffer + i * numPixels), 
			             (void *)(tempDisYbuffer + i * numPixels),
			             numPixels);		  
			 }

		    			 
			/*Laplacian锐化处理*/
            LaplacianSharp(); 			 

		    /*画边框*/    
		    drawRectangle();
		    			 
			for(i=0;i<numLines;i++)
			{
				/*传送Y缓冲区*/
				DAT_copy((void *)(tempDisYbuffer + i * numPixels), 
			             (void *)(disYbuffer + i * numPixels),
			             numPixels);		
			 }
		}
		
	}
}

/*画矩形边框函数的定义*/
void drawRectangle()
{
    int i,j;
    /*画上边*/
    //奇数行
    for(i=intALines-4;i<intALines;i++)  
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}	
	
	//偶数行
	for(i=numLines/2+intALines-4;i<numLines/2+intALines;i++)  
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}


	/*画下边*/
	//奇数行
    for(i=intDLines;i<intDLines+4;i++)
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
	for(i=numLines/2+intDLines;i<numLines/2+intDLines+4;i++)
	{
	    for(j=intAPixels-6;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}	

	
	/*画左边*/
	//奇数行
    for(i=intALines;i<intDLines;i++)
	{
	    for(j=intAPixels-6;j<intAPixels;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
	for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
	{
	    for(j=intAPixels-6;j<intAPixels;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	
	/*画右边*/
	//奇数行
    for(i=intALines;i<intDLines;i++)
	{
	    for(j=intDPixels;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}
	
	//偶数行
    for(i=numLines/2+intALines;i<numLines/2+intDLines;i++)
	{
	    for(j=intDPixels;j<intDPixels+6;j++) 
	    {
	    	 *(Uint8 *)(tempDisYbuffer + i*numPixels + j) = 0x00;
	    }
	}
} 

/*Laplacian锐化处理*/
void LaplacianSharp()
{
	int i,j;
	int intTemp;	
	
	for(i=intALines;i<intDLines;i++)
	{
	    for(j=intAPixels;j<intDPixels;j++) 
	    {
	    	/*屏幕上奇数行进行处理*/	    	    
	    	intTemp = -(*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j-1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j+1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j-1))) + 
	    	     9*(*(Uint8 *)(tempSrcYbuffer + i*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j+1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + (j-1))) -
	     	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + (j+1)));
	  		
	  		if(intTemp<0)
	  		{
	  			intTemp = 0;
	  		}
	  		
	  		if(intTemp>255)
	  		{
	  			intTemp = 255;
	  		}
	    	
	    	*(Uint8 *)(tempDisYbuffer + i*numPixels + j) = intTemp; 
	    	
	    	/*屏幕上偶数行进行处理*/	    	    
	    	intTemp = -(*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + (j-1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + (j+1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j-1))) + 
	    	     9*(*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j+1))) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j-1))) -
	     	     (*(Uint8 *)(tempSrcYbuffer + i*numPixels + j)) - 
	    	     (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j+1)));
	  		
	  		if(intTemp<0)
	  		{
	  			intTemp = 0;
	  		}
	  		
	  		if(intTemp>255)
	  		{
	  			intTemp = 255;
	  		}
	    	
	    	*(Uint8 *)(tempDisYbuffer + (numLines/2+i)*numPixels + j) = intTemp; 	    	
	    	
	    }
	}				
}   

//======================================end=================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -