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;
}
}