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

📄 graph.c

📁 TMS320c6000系列DSP做图像处理的应用举例
💻 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 + -