📄 graph.c
字号:
#include "graph.h"
#include "mtv.h"
#include "dtv.h"
#define ICETEK6711ALED (*(unsigned int *)0x90202018)
#define ICETEK6711ASW (*(unsigned int *)0x90202014)
cregister unsigned int IER,IFR,CSR,ICR,ISTP;
void initInterrupt(void);
#define DMA1_DEST_CTRL *(int *)0x1840058
#define DMA1_PRIMARY_CTRL *(int *)0x1840040
#define DMA1_SECONDDARY_CTRL *(int *)0x1840048
#define DMA1_SRC_CTRL *(int *)0x1840050
#define DMA1_TRANS_CTRL *(int *)0x1840060
#define MTVFPGA_PGM 0xa030010c
#define FPAG_DATA 0xa0300114
#define SYS_STATE 0xa0300020
#define I2C_REG 0xa0300004
#define SYSRREG 0xA020000c
#define UART_BASE_ADDR 0xa0300000
#define OFFSET 4
#define RBR 0xa0300000
#define THR 0xa0300000
#define IIER 0xa0300004
#define IIR 0xa0300008
#define FCR 0xa0300008
#define LCR 0xa030000c
#define MCR 0xa0300010
#define LSR 0xa0300014
#define MSR 0xa0300018
#define SCR 0xa030001c
#define DLL 0xa0300000
#define DLM 0xa0300004
#define VIDEO_READBUFFER 0xa01a0000
#define VIDEO_WRITEBUFFER 0xa01c0000
#define HOST_WRITEADD_SET 0xa01e0600
#define HOST_READADD_SET 0xa01e0610
#define HOST_WRITEADD_CLR 0xa01e0700
#define HOST_READADD_CLR 0xa01e0710
#define TST_SRC 0x80001000
#define VOCTR 0x0a020003c
#define VICTR 0x0a010003c
#define VOUTCTR 0x0a020003c
#define VINCTR 0x0a010003c
#define VOUTMASK 0x07fffffff
#define VOUTENABLE 0x80000000
#define DSPWBMASK 0x0ffffcfff
#define DSPWB0 0x0000
#define DSPWB1 0x1000
#define DSPWB2 0x2000
#define DSPWB3 0x3000
#define VOBMASK 0x0ffffcfff
#define VOB0 0x00
#define VOB1 0x10
#define VOB2 0x20
#define VOB3 0x30
#define TVMASK 0x0fffffffd
#define TVENABLE 2
#define TRANSPARENCEMASK 0x0fffffffe
#define TRANSPARENCE 1
#define VINMASK 0x07fffffff
#define VINENABLE 0x80000000
#define DSPRMASK 0x0fffcffff
#define DSPRB0 0x00000
#define DSPRB1 0x10000
#define DSPRB2 0x20000
#define DSPRB3 0x30000
#define VIMASK 0x0fffffcff
#define VIB0 0x000
#define VIB1 0x100
#define VIB2 0x200
#define VIB3 0x300
#define DMATARGETADDRESS 0x80040000
#define SCREENWIDTH 720
#define SCREENHEIGHT 576
#define BUFFERHEIGHT 620
#define SCREENWIDTHWORD 180
#define BUFFERWIDTH 768
#define BUFFERWIDTHWORD 192
#define REVERSERANGEX 48
#define REVERSERANGEY 144
#define HISTOGRAMSTEP 32
#define HISTOGRAMHIGH 128
#define HISTOGRAMPOSITIONX 32
#define HISTOGRAMPOSITIONY 500
#define GRAYRANGEX 30
#define GRAYRANGEY 144
#define GRAYWINDOWRANGEX 30
#define GRAYWINDOWRANGEY 144
#define HISTOENHANCERANGEX 30
#define HISTOENHANCERANGEY 144
#define FUNCTIONNUMBER 5
#define FUNCREVERSE 0
#define FUNCHISTOGRAM 1
#define FUNCGRAY 2
#define FUNCGRAYWINDOW 3
#define FUNCYUV 4
#define DISPCTR 0x0a01ffffc
#define DISPRDR 0x0a01e0610
#define DISPWER 0x0a01e0600
#define DISPADD 0x0a01c0000
#define CACHECFG (*(unsigned int *)0x01840000)
#define L1PFBAR (*(unsigned int *)0x01844020)
#define L1DFBAR (*(unsigned int *)0x01844030)
#define SIGNSOURCEADDRESS 0x00000400
#define SIGNTARGETADDRESS 0x00000500
void InitDSP();
void InitIDKM();
void VideoProcess();
void ReadVideo();
void WriteImage();
void DrawLine(int x0, int y0, int x1, int y1, unsigned char color);
void PutPixel(int x,int y,unsigned char color);
unsigned int uCtrlVideoIn[2],uCtrlVideoOut[2];
unsigned int *pVideoInCtrlRegister,*pVideoOutCtrlRegister;
int nInStatus,nOutStatus,nVideoReady,nReadingVideo;
int nXH;
unsigned int nPositionX,nPositionY,dx,dy,nTimeCount,nShow;
unsigned char *pScreenBuffer;
float fHisto[256];
unsigned int *pW,*pW2,*pSignSource,*pSignTarget;
unsigned int uW,uW1,uW2;
int nI,nJ,nK,x0,y0,x1,y1;
float fW;
unsigned char cW,*pW1;
unsigned int uSign[32],lut[256],uLed;
unsigned int uImgAddress[2],uImgAddress1[2],uImgAddress2[2],uImgAddress3[2],uImgAdd;
int bColor,nProcessingImage;
int main()
{
InitDSP();
ICETEK6711ALED=0;
ICETEK6711ALED=0x10000000;
uImgAddress[0]=0x80040000; uImgAddress1[0]=0x8007fc00;
uImgAddress[1]=0x80140000; uImgAddress1[1]=0x8017fc00;
uImgAddress2[0]=0x800acc00; uImgAddress3[0]=0x800e2c00;
uImgAddress2[1]=0x801acc00; uImgAddress3[1]=0x801e2c00;
uImgAdd=0; bColor=1;
pSignSource=(unsigned int *)SIGNSOURCEADDRESS;
pSignTarget=(unsigned int *)SIGNTARGETADDRESS;
(*pSignSource)=1; (*pSignTarget)=0;
for ( nXH=0;nXH<2;nXH++ )
{
InitIDKM();
DelayMSEC(50);
ICETEK6711ALED=( nXH==0 )?0x20000000:0x40000000;
}
CSR=0x100;
IER=1;
ICR=0xffff;
for ( nXH=0;nXH<32;nXH++ ) uSign[31-nXH]=(1<<nXH);
pVideoInCtrlRegister=(unsigned int *)VINCTR;
pVideoOutCtrlRegister=(unsigned int *)VOUTCTR;
nInStatus=nOutStatus=0;
nVideoReady=nReadingVideo=0;
ICETEK6711ALED=0x80000000;
uCtrlVideoOut[0]=0|VOUTENABLE|DSPWB0|VOB1; //初始状态:允许输出,dsp写bank2,视频输出bank3,不直通,不透明
uCtrlVideoIn[0]=0|VINENABLE|DSPRB1|VIB0; //初始状态:允许输入,dsp读bank1,视频输入bank0
uCtrlVideoOut[1]=0|VOUTENABLE|DSPWB1|VOB0; //允许输出,dsp写bank3,视频输出bank2,不直通,不透明
uCtrlVideoIn[1]=0|VINENABLE|DSPRB0|VIB1; //允许输入,dsp读bank0,视频输入bank1
(*pVideoInCtrlRegister)=uCtrlVideoIn[0];
(*pVideoOutCtrlRegister)=uCtrlVideoOut[0];
// InitSys();
// initSYS();
*(unsigned int *)EMIF_GCR = 0x3300;
*(unsigned int *)EMIF_SDCTRL = 0x14424000;
*(unsigned int *)EMIF_SDRP = 0x61a;
*(unsigned int *)EMIF_SDEXT= 0x54529;
*(unsigned int *)EMIF_CE0 = 0x30;
*(unsigned int *)EMIF_CE1 = CE1_32;
*(unsigned int *)EMIF_CE2 = 0x00800421;
*(unsigned int *)EMIF_CE3 = CE3_32;
Init_DTVFPGA(0);
*(unsigned int *)MTV_WDMA_ADD = 0x0000ffff;
*(unsigned int *)MTV_WDMA_PARAM = 0x0000ff00;
*(unsigned int *)MTV_RDMA_ADD = 0x0000ffff;
*(unsigned int *)MTV_RDMA_PARAM = 0x00001808;
*(unsigned int *)DTV_WDMA_ADD = 0x0005ffff;
*(unsigned int *)DTV_WDMA_PARAM = 0x00001808;
*(unsigned int *)DTV_RDMA_ADD = 0x0000fff0;
*(unsigned int *)DTV_RDMA_PARAM = 0x00001808;
nPositionX=nPositionY=0;
dx=dy=1;
pScreenBuffer=(unsigned char*)uImgAddress[1-uImgAdd];
nShow=0;
nProcessingImage=0;
initInterrupt(); //中断初始化,开INT4中断
uLed=0;
ICETEK6711ALED=uLed;
while ( 1 )
{
VideoProcess();
}
}
void VideoProcess()
{
if ( nVideoReady )
{
nProcessingImage=1;
ReadVideo();
for ( nI=0;nI<REVERSERANGEY;nI++ )
{
pW=(unsigned int*)uImgAddress[1-uImgAdd]+(nI+nPositionY)*BUFFERWIDTHWORD+nPositionX;
for ( nJ=0;nJ<REVERSERANGEX;nJ++,pW++)
{
(*pW)=~(*pW);
}
}
nPositionX+=dx; if ( (nPositionX<=0)||((nPositionX+REVERSERANGEX)>=(SCREENWIDTHWORD-1)) ) dx=-dx;
nPositionY+=dy; if ( (nPositionY<=0)||(nPositionY+REVERSERANGEY)>=(SCREENHEIGHT-1) ) dy=-dy;
WriteImage();
nTimeCount++;
if ( nTimeCount>500 )
{
nTimeCount=0;
}
if ( (nTimeCount%25)==0 )
{
uLed^=0x10000000;
ICETEK6711ALED=uLed;
}
uImgAdd=1-uImgAdd;
nVideoReady=0;
nProcessingImage=0;
}
}
#pragma CODE_SECTION(in1,".text3")
void interrupt in1( void)//中断响应函数
{
if ( !nProcessingImage )
{
nInStatus=1-nInStatus;
(*pVideoInCtrlRegister)=uCtrlVideoIn[nInStatus];
}
if ( nProcessingImage )
{
uLed^=0x80000000;
ICETEK6711ALED=uLed;
}
nVideoReady=1;
}
#pragma CODE_SECTION(initInterrupt,".text3")
void initInterrupt(void)
{
CSR=CSR&0xfffffffe; // 关中断
ISTP=0x00000c00;
EIP=0x0f;
ICR=0xff;
IER=0x13;
CSR=CSR|1; // 开中断
}
#pragma CODE_SECTION(InitDSP,".text3")
void InitDSP(void)
{
*(unsigned int *)EMIF_GCR = 0x3300; /* EMIF global control */
*(unsigned int *)EMIF_SDCTRL = 0x63116000;
*(unsigned int *)EMIF_SDRP = 0x61a; /* EMIF SDRM refresh period */
*(unsigned int *)EMIF_SDEXT= 0x54529; /* EMIF SDRM extension */
*(unsigned int *)EMIF_CE0 = 0x30; /* EMIF CE0 control */
*(unsigned int *)EMIF_CE1 = 0xFFFFFF23; /* EMIF CE1 control, 32bit */
*(unsigned int *)EMIF_CE2 = 0xFFFFFF33;
*(unsigned int *)EMIF_CE3 = 0xFFFFFF33; /* EMIF CE3 control */
CACHECFG=0;
L1PFBAR=L1DFBAR=0x10000;
}
#pragma CODE_SECTION(ReadVideo,".text3")
void ReadVideo()
{
nReadingVideo=1;
*(unsigned volatile int *)MTV_RDMA_ADD = 0x0000ffff;
*(unsigned volatile int *)MTV_RDMA_PARAM = 0x00001808;
*(unsigned volatile int *)MTV_RDMA_CSR = 1;
*(unsigned volatile int *)MTV_RDMA_CSR = 0;
*(unsigned int *)EMIF_CE2 = 0x00800421; // --40MHz
*(unsigned int *)DMA15_OPT = 0x203a0003; // Signal=0x05
*(unsigned int *)DMA15_SRC = MTV_RDMA_DAT;
*(unsigned int *)DMA15_CNT = 0x0ff00;
*(unsigned int *)DMA15_DST = uImgAddress[uImgAdd];
*(unsigned int *)DMA15_IDX = 0;
*(unsigned int *)DMA15_LNK = 0;
*(unsigned int *)DMA15_ELERLD=0x0ff0000f0;
*(unsigned int *)DMA10_OPT = 0x203b0003;
*(unsigned int *)DMA10_SRC = MTV_RDMA_DAT;
*(unsigned int *)DMA10_CNT = 0x0b400;
*(unsigned int *)DMA10_DST = uImgAddress1[uImgAdd]; //0x80040000+0XFF00*4;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x0b4000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
*(unsigned int *)ESR = 0x8000;
(*pSignSource)=0x0cd123;
if ( bColor )
{
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
*(unsigned volatile int *)MTV_RDMA_ADD = 0x8000ffff;
*(unsigned volatile int *)MTV_RDMA_PARAM = 0x00000c04;
*(unsigned volatile int *)MTV_RDMA_CSR = 1;
*(unsigned volatile int *)MTV_RDMA_CSR = 0;
*(unsigned int *)DMA10_OPT = 0x203b0003;
*(unsigned int *)DMA10_SRC = MTV_RDMA_DAT;
*(unsigned int *)DMA10_CNT = 0x0d800;
*(unsigned int *)DMA10_DST = uImgAddress3[uImgAdd]-4; //0x80040000+0XFF00*4;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x108;//0x0d8000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
*(unsigned int *)ESR = 0x400;
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
*(unsigned volatile int *)MTV_RDMA_ADD = 0x0c000ffff;
*(unsigned volatile int *)MTV_RDMA_PARAM = 0x00000c04;
*(unsigned volatile int *)MTV_RDMA_CSR = 1;
*(unsigned volatile int *)MTV_RDMA_CSR = 0;
*(unsigned int *)DMA10_OPT = 0x203b0003;
*(unsigned int *)DMA10_SRC = MTV_RDMA_DAT;
*(unsigned int *)DMA10_CNT = 0x0d800;
*(unsigned int *)DMA10_DST = uImgAddress2[uImgAdd]-4; //0x80040000+0XFF00*4;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x108;//0x0d8000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
*(unsigned int *)ESR = 0x400;
}
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
// nVideoReady=1;
nReadingVideo=0;
}
#pragma CODE_SECTION(WriteImage,".text4")
void WriteImage()
{
*(unsigned volatile int *)DTV_WDMA_ADD = 0x0004ffff;
*(unsigned volatile int *)DTV_WDMA_PARAM = 0x0001808;
*(unsigned volatile int *)DTV_WDMA_CSR = 1;
*(unsigned volatile int *)DTV_WDMA_CSR = 0;
*(unsigned int *)EMIF_CE2 =( bColor )?(0x1800421):(0x1900421); // --40MHz
*(unsigned int *)DMA15_OPT = 0x211a0003;
*(unsigned int *)DMA15_SRC = uImgAddress[1-uImgAdd];
*(unsigned int *)DMA15_CNT = 0x00ff00;
*(unsigned int *)DMA15_DST = DTV_WDMA_DAT;
*(unsigned int *)DMA15_IDX = 0;
*(unsigned int *)DMA15_LNK = 0;
*(unsigned int *)DMA15_ELERLD=0x0ff0000f0;
*(unsigned int *)DMA10_OPT = 0x211b0003;
*(unsigned int *)DMA10_SRC = uImgAddress1[1-uImgAdd];
*(unsigned int *)DMA10_CNT = 0x0b400;
*(unsigned int *)DMA10_DST = DTV_WDMA_DAT;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x0b4000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
(*pSignSource)=0x0cd123;
*(unsigned int *)ESR = 0x8000;
if ( bColor )
{
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
*(unsigned volatile int *)DTV_WDMA_ADD = 0x08002ffff;
*(unsigned volatile int *)DTV_WDMA_PARAM = 0x00000c04;
*(unsigned volatile int *)DTV_WDMA_CSR = 1;
*(unsigned volatile int *)DTV_WDMA_CSR = 0;
*(unsigned int *)DMA10_OPT = 0x211b0003;
*(unsigned int *)DMA10_SRC = uImgAddress2[1-uImgAdd];
*(unsigned int *)DMA10_CNT = 0x0d800;
*(unsigned int *)DMA10_DST = DTV_WDMA_DAT;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x108;//0x0d8000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
*(unsigned int *)ESR = 0x400;
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
*(unsigned volatile int *)DTV_WDMA_ADD = 0x0c002ffff;
*(unsigned volatile int *)DTV_WDMA_PARAM = 0x00000c04;
*(unsigned volatile int *)DTV_WDMA_CSR = 1;
*(unsigned volatile int *)DTV_WDMA_CSR = 0;
*(unsigned int *)DMA10_OPT = 0x211b0003;
*(unsigned int *)DMA10_SRC = uImgAddress3[1-uImgAdd];
*(unsigned int *)DMA10_CNT = 0x0d800;
*(unsigned int *)DMA10_DST = DTV_WDMA_DAT;
*(unsigned int *)DMA10_IDX = 0;
*(unsigned int *)DMA10_LNK = 0;
*(unsigned int *)DMA10_ELERLD=0x108;//0x0b4000108;
*(unsigned int *)DMA11_OPT = 0x21100001;
*(unsigned int *)DMA11_SRC = SIGNSOURCEADDRESS;
*(unsigned int *)DMA11_CNT = 1;
*(unsigned int *)DMA11_DST = SIGNTARGETADDRESS;
*(unsigned int *)DMA11_IDX = 0;
*(unsigned int *)DMA11_LNK = 0;
*(unsigned int *)DMA11_ELERLD=0x000010000;
*(unsigned int *)CCER = 0x0c00;
*(unsigned int *)ESR = 0x400;
}
while ( (*pSignTarget)==0 );
(*pSignTarget)=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -