📄 dm642main.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 + -