www.pudn.com > Dm642_Encoder.rar > Dm642_Encoder.c


/******************************************************************/   
/*                TMS320DM642 IMAGE DATA COMPRESSION              */ 
/*                Dm642_Encoder.C                                 */ 
/******************************************************************/ 
#include "intr.h" 
#include "edma.h"  
#include "shen.h" 
#include "variable.h" 
#include "function.h" 
#include "mcbsp.h" 
#include "timer.h" 
 
unsigned char seridata[200],len=0; 
float fram_rate=0.055; 
int update_line=20,new_video=0,skip_line=0,skip_data=0,tmp_addr=0,sdata_num=0; 
void Init_EMIF(); 
void Init_GPIO(); 
void Init_INTR(); 
void Clr_INTR(); 
 
void Init_EMIF() 
{ 
	/*inint EMIFA*/ 
	*(int *)EMIFA_GCTL     = 0x000827fc;  
	*(int *)EMIFA_CE0      = 0x00000030;//0x00000030; //SDRAM 
	*(int *)EMIFA_CE1      = 0xffffff03; //FLASH 
	*(int *)EMIFA_CE2      = 0x22220822; //sram EMIF Speed:ECLKOUT1/(SETUP+STROB+HOLD):120MHz/(2+8+2)=12MHz 
	*(int *)EMIFA_CE3      = 0x10410320; //,0x10910321,0x11110421,sram 
	*(int *)EMIFA_SDRAMCTL = 0x5b116000;//0x47116000   
	*(int *)EMIFA_SDRAMREF = 0x0008061a; 
	*(int *)EMIFA_SDRAMEXT = 0x00054549; 
 
} 
void Init_GPIO() 
{   
	*(int*)GPEN=0xf9; 
	*(int*)GPDIR=0x00;//gpio0,3 used as input. 
	*(int*)GPVAL=0x0; 
	*(int*)CCFG=0x07;//4-way cache:3/4 sram 
} 
void Init_Timer() 
{ 
	TIMER1_PERIOD=0xffff;//0xc350; 
    TIMER1_CTRL=0x0385; 
	TIMER1_CTRL=(TIMER1_CTRL)|0x40; 
} 
void Init_INTR() 
{   
    *(int*)EXTPOL=0x00000000; 
//    INTR_ENABLE(CPU_INT4);//Interrupt of Uart Communication. 
//    INTR_ENABLE(CPU_INT5);//Interrupt of Read CCD image. 
    INTR_ENABLE(CPU_INT6);//Interrupt of Video Update. 
//    INTR_ENABLE(CPU_INT7);//Interrupt of Calculate the compression rate. 
    INTR_ENABLE(CPU_INT14); 
    intr_hook(Func_INT4,CPU_INT4); 
    intr_hook(Func_INT5,CPU_INT5); 
    intr_hook(Func_INT6,CPU_INT6); 
    intr_hook(Func_INT7,CPU_INT7); 
	intr_hook(Func_INT14,CPU_INT14); //Timer0 Count Interrupt 
    INTR_ENABLE(NMIE); 
    INTR_GLOBAL_ENABLE(); 
} 
////UART_RS422/////////// 
void UART_Init(void)//异步串口初始化 
{ 
	volatile int *p; 
	 
	p=(int*)0xA000000c;*p=0x80;//线性控制寄存器LCR BIT7=1 设置为除数锁存位<232> 
	p=(int*)0xA0000000;*p=0x4;//0x04;   //DLL=104 除数低有效位为104 (晶振频率为11.0592MHz,除数为36时,波特率为19200) 
 
	p=(int*)0xA0000004;*p=0x0;   //DLM=0 除数高有效位为0 
	 
	p=(int*)0xA000000c;*p=0x0b; /* LCR BIT7=0;8Bit数据;1Bit停止位;奇校验*/ 
 
	p=(int*)0xA0000010;*p=0x22; /*MCR 调制解调寄存器设置, 自动设置/RTS和/CTS.*/ 
 
	/* 设置FIFO 控制寄存器:  
    bit0=1: FIFO使能; 
	bit2,1=3: 重启动传输/接收FIFO, 自动清零; 
	bit5=1: 64byte FIFO MODE 
    bit7,6=00: 接收FIFO 1Byte触发; 
		   01: 接收FIFO 4Bytes触发; 
		   10: 接收FIFO 8Bytes触发; 
		   11: 接收FIFO 14Bytes触发; 
    bit3=0: 不选择DMA方式 */ 
	p=(int*)0xA0000008;*p=0x27;//? 
 
	/* 设置中断使能寄存器: 
    bit0=1: 接收数据有效中断使能*/ 
	p=(int*)0xA0000004;*p=0x1; 
	 
	return; 
} 
/* 
void Fast_Row_LDWT( unsigned char *in_data, unsigned char *out_data,short width,short high) 
{ 
	int i,j,k=0,h=0; 
	volatile short tp_val=0; 
	for(j=0;j245)?245:tp_val; 
		out_data[h++]=tp_val; 
		//out_data[h-1]=(out_data[h-1]<0)?0:out_data[h-1];//modify 
		k+=2;		 
		for(i=0;i245)?245:tp_val; 
			out_data[h++]=tp_val; 
			//out_data[h-1]=(out_data[h-1]<0)?0:out_data[h-1];//modify 
			k+=2; 
		} 
		tp_val=(((in_data[k+1]-in_data[k-2])/8)+((in_data[k-1]+in_data[k]*3)/4));		 
//		tp_val=(tp_val<0)?0:tp_val; 
		tp_val=(tp_val>245)?245:tp_val; 
		out_data[h++]=tp_val; 
		//out_data[h-1]=(out_data[h-1]<0)?0:out_data[h-1];//modify 
		k+=2; 
	} 
	return;	 
} 
void Fast_Col_LDWT( unsigned char *in_data, unsigned char *out_data,short width,short high) 
{ 
	int i,j,k=0,h=0,jj; 
	volatile short tp_val=0; 
	jj=2*width; 
	for(i=0;i245)?245:tp_val; 
		out_data[h++]=tp_val; 
		k+=1; 
	} 
	k+=width; 
	for(j=0;j245)?245:tp_val; 
			out_data[h++]=tp_val; 
			//out_data[h-1]=(out_data[h-1]<0)?0:out_data[h-1];//modify 
			k+=1; 
		} 
		k+=width;		 
	}	 
	for(i=0;i245)?245:tp_val; 
		out_data[h++]=tp_val; 
		k+=1; 
	} 
	return;	 
} 
*/ 
 
/* 
void Fast_Row_LDWT( unsigned char *in_data, unsigned char *out_data,short width,short high) 
{ 
	int i,j,k=0,h=0; 
	volatile short tp_val=0; 
	for(j=0;j>3;//w_tinp0 
	com_val=*(int*)0xA0000000; 
	if(head_num==0) 
	{ 
	  if(com_val==0x7e) 
	  {	 
	     header[head_num++]=0x7e; 
	  }		 
	} 
	else 
	{ 
	    if(head_num<4) 
	       header[head_num++]=com_val;	        
	    else if(head_num==4) 
	    { 
	       header[head_num++]=com_val; 
	       if((header[2]==0x2e)&(header[3]==0xeb)&(header[4]==0x90)&(xuantong==0)) 
	       	  com_stat=0x01;  //command byte 
	       else if((header[2]==0x3c)&(header[3]==0xeb)&(header[4]==0x90)&(xuantong==0)) 
	       	  com_stat=0x02;  //note byte 
	       else if((header[2]==0x3c)&(header[3]==0x09)&(header[4]==0xd7)&(xuantong==0)) 
	       {  //反馈工作信息 
//	       	  Fast_Row_LDWT((unsigned char *)0x00040000,(unsigned char*)0x80000000,4096,80);	   
	          cmp_begin=((*(int*)GPVAL)&0x01); 
	          work_stat[0]=0x3c; 
	          work_stat[1]=0; 
	          work_stat[1]|=POST_start; 
	          work_stat[1]|=(POST_start<<1); 
	          work_stat[1]|=(TRANSMIT_re<<2); 
	          work_stat[1]|=(TRANSMIT_start<<3); 
	          work_stat[1]|=((!cmp_begin)<<4); 
	          work_stat[1]|=((!cmp_begin)<<5); 
	          work_stat[1]|=(TESTIMG_stop<<6); 
	          work_stat[1]|=(TESTIMG_start<<7); 
	          work_stat[2]=turnon_tab;//自检信息 
	          *(int*)TIMER0_CTL=*(int*)TIMER0_CTL|0x4;//置发送有效 
	          for(i=0;i<12;i++)  //12 
	          	Delay(); 
	          UART_Write485(work_stat,3);//info request 
	          for(i=0;i<1800;i++) 
	          	Delay(); 
	          *(int*)TIMER0_CTL=*(int*)TIMER0_CTL&0xfb;//置发送无效 
	          head_num=0; 
	          if(POST_start==1) 
	          {	 
	          	POST(); 
	          	POST_start=0; 
	          } 
	       } 
	       else 
	       {   
	          head_num=0; 
	       	  com_stat=0; 
	       } 
	    } 
	    else 
	    { 
	       if(com_stat==0x01) 
	       { 
	          ctr_command=com_val; 
	          switch (ctr_command) 
	          { 
	            case 0xc2 : POST_start=1;break;	                   
	           // case 0xd8 : POST_stop=1;break; 
	            case 0xe9 : TRANSMIT_start=1;break; 
	            case 0x5a : TESTIMG_start=1;TESTIMG_stop=0;;break; 
	            case 0x2b : TESTIMG_stop=1;TESTIMG_start=0;break; 
	            case 0x61 : TRANSMIT_re=1;break; 
	            default   : break; 
	          } 
	          head_num=0; 
	          com_stat=0;	          	 
	       } 
	       else if(com_stat==0x02) 
	       { 
	          header[head_num++]=com_val; 
	          if(head_num>=55) 
	           {  
	             head_num=0; 
	             com_stat=0; 
	             note_ready=1; 
	             //cmp_ratio=header[54]; 
	      /*       //注释信息转换 
	             note_tmp1=(header[5]*256+header[6]);//任务代号 
	             note_info[0]=((note_tmp1/1000)<<4)+(note_tmp1%1000)/100; 
	             note_info[1]=(((note_tmp1%100)/10)<<4)+(note_tmp1%10); 
	             note_tmp1=((header[7]*256+header[8])*256)+header[9];//年月日 
	             note_info[2]=(note_tmp1/10000)<<1; 
	             note_info[3]=(note_tmp1%10000)/100; 
	             note_info[4]=(note_tmp1%100); 
	             note_tmp1=((header[10]*256+header[11])*256)+header[12];//时分秒 
	             note_info[5]=(note_tmp1/10000)<<3; 
	             note_info[6]=(note_tmp1%10000)/100; 
	             note_info[7]=(note_tmp1%100); 
	             switch (header[13])//类型标志 
		          	{ 
		            case 0x01 : note_info[8]=0x72;break;	                   
		            case 0x02 : note_info[8]=0x72;break; 
		            case 0x03 : note_info[8]=0x27;break; 
		            case 0x04 : note_info[8]=0x39;break; 
		            case 0x05 : note_info[8]=0x9c;break; 
		            case 0x06 : note_info[8]=0x93;break; 
		            case 0x07 : note_info[8]=0xc9;break; 
		            default   : break; 
		          	} 
		         */ 
		         //行和帧记数 
		         //header[14]=line_cnt/256; 
		         //header[15]=line_cnt%256; 
		         //header[16]=frame_cnt/256; 
		         //header[17]=frame_cnt%256; 
		          
	           } 
	       }    
	    } 
	   	         
	       
	} 
	 
} 
 
//////////////////////////////////////////////////////////// 
 
void Wavelet_Tranform() 
{	 
	int i,j; 
	int *p1,*p2; 
    //Horizontal Transform 
/*    for(i=0;i<384;i++) 
    {	 
		Edma_Transfer((0x00040000-4),(0x84000000+i*0x8000-4),0x2000+1,0x61301000); 
		//Edma_Transfer(0x00048000,0x84000000+i*0x8000,0x2000,0x01301000); 
//		p1=(int*)(0x84000000+i*0x8000-4096); 
//		p2=(int*)(0x00040000); 
//		for(j=0;j<9126;j++) p2[j]=p1[j]; 
		Fast_Row_LDWT((unsigned char *)0x00040000,(unsigned char*)0x00060000,4096,8); 
		Edma_Transfer(0x85000000+i*0x4000,0x00060000,0x1000+1,0x61301000); 
//		p1=(int*)(0x00060000+2048); 
//		p2=(int*)(0x85000000+i*0x4000); 
//		for(j=0;j<4608;j++) p2[j]=p1[j]; 
	}*/		 
	//Vertical Transform 
	for(i=0;i<16;i++)	 
	{ 
		for(j=0;j<3072;j++) 
		{ 
			Edma_Transfer(0x00040000+j*128,0x85000000+i*128+j*2048,0x20,0x61301000); 
		} 
		Fast_Col_LDWT((unsigned char *)0x00040000,(unsigned char *)0x000a0000,128,3072); 
		for(j=0;j<1536;j++) 
		{	 
	    	Edma_Transfer(0x86000000+i*128+j*2048,0x000a0000+j*128,0x20,0x61301000); 
		}       
	} 	 
} 
void Data_Arrange() 
{ 
	int i,j,k,tmp_i,tmp_j,tmp_k; 
	unsigned char *p1,*p2; 
	 
	p2=(unsigned char *)(0x60000); 
	for(j=0;j<3072;j++) 
		{ 
			tmp_j=0x800c0000+j*4096; 
			tmp_i=0x60000; 
			for(i=0;i<4;i++) 
			{ 
				*(int*)CIPRL=*(int*)CIPRL|0x01; 
			    *(int*)QDMA_SRC =   tmp_j+i; 
				*(int*)QDMA_DST =   tmp_i+i*1024; 
				*(int*)QDMA_CNT =   0x400;    //<64kByte. 
				*(int*)QDMA_IDX =   0x00000004; 
				*(int*)QDMA_S_OPT = 0x73301000; 
				while(GET_FIELD(CIPRL,0,1)!=1){}		 
			} 
			p2[0]=p2[1]=p2[2]; 
			p2[1024]=p2[1025]=p2[1026]; 
			p2[2048]=p2[2049]=p2[2050]; 
			p2[3072]=p2[3073]=p2[3074]; 
			Edma_Transfer(0x84000000+j*4096,0x60000,0x400,0x61301000); 
			 
		} 
		p1=(unsigned char *)(0x84000000); 
		p2=(unsigned char *)(0x82000000); 
		for(j=0;j<384;j++) 
		{ 
			tmp_j=j*0x8000; 
			tmp_i=j*512; 
			for(i=0;i<512;i++) 
				p2[tmp_i+i]=p1[tmp_j+8*i]; 
		} 
		Edma_Transfer(0x81000000,0x81030000,0xc000,0x61301000); 
		Edma_Transfer(0x81030000,0x82000000,0xc000,0x61301000); 
		 
		new_video=1; 
		skip_line=0; 
}     
void Process() //Main process program(DWT,Send Coeff) 
{ 
	volatile int i,j,*p1,*p2; 
 
   if(new_data==1) // The New Data 
   { 
   	//数据重排和抽样 
   	Data_Arrange(); 
    //1.DWT 
	Wavelet_Tranform(); 
	//2.Send Wavelet Coefficient to O-E DSP. 
	if(dsp_sel==0) 
	{ 
		for(i=0;i<96;i++) 
		{ 
		    *(int*)0xb0010000=0x01; 
		    *(int*)0xb0010004=i; 
		   	Edma_Transfer(0xb0000000,0x86000000+i*0x8000,0x2000,0x61301000); 
		    *(int*)0xa0100000=0x00; //Send Interrupt of Coeff to Odd Dsp. 
		    while((GET_FIELD(DP_FLG,0,1))!=0x00) {}//Test the Flag of O-Dsp Read Completion. 
		} 
	} 
	else 
	{ 
	    for(i=0;i<96;i++) 
		{ 
		    *(int*)0xb0110000=0x1; 
		    *(int*)0xb0110004=i; 
		   	Edma_Transfer(0xb0100000,0x86000000+i*0x8000,0x2000,0x61301000); 
		    *(int*)0xa0200000=0x00; //Send Interrupt of Coeff to Even Dsp. 
		    while((*(int*)0xb0110000)!=0x00){}//Test the Flag of E-Dsp Read Completion. 
		}	 
	}		 
	new_data=0; //clear the flag. 
//	INTR_ENABLE(CPU_INT5); 
  }	 
   	  
} 
 
 
interrupt void Func_INT5()  // Read The Original Image Data 
{ 
	//Read the CCD image data to IDRAM 
	 
} 
interrupt void Func_INT4()  // 
{    
	UART_Communication();	        
} 
interrupt void Func_INT6() //  
{ 
   
     
} 
interrupt void Func_INT7() 
{ 
	//CR_count++; 
	data_cnt=0; 
} 
interrupt void Func_INT14()  //Timer Count 
{    
	p_count++; 
        
} 
void main() 
{    
 
     int i,j,k,*p,*p3,*p4,tmp_i,tmp_j,tmp_k; 
     unsigned char *p1,*p2,*para; 
     cmp_begin=1; 
	  
	 //ISTP=0x00; 
//	 ISTP=0x400; //for Boot_Load 
//     Init_GPIO(); 
     Init_EMIF(); 
//     Init_Timer(); 
//     UART_Init();	     
     Init_INTR();     
p1=(unsigned char *)0x80000000;		 
	while(1) 
    {  
 
	for(i=0;i<64000;i++) 
		p1[i]=i; 
	}  
}