📄 disfpga.c
字号:
#include "mcf5307.h"
#include "cpld.h"
#include "DSTNver2.h"
#define FPGA_SIZE_SERIAL 0x577B //;179160 bits = 22395 Bytes(0x577B)
#define DIS_CLEAR_MEMORY (IO_BASE_ADDR + OUT_DIS_FPGA_PROG)
#define DIS_CLKDATA (IO_BASE_ADDR + OUT_DIS_FPGA_DATA)
#define DIS_DONE (IO_BASE_ADDR + IN_DIS_FPGA_DONE)
#define DONE_OK 0x01
#define INIT_OK 0x02
#define DIS_BASE_ADDRESS 0x30600000
#define DIS_END_ADDRESS 0x12C00
//if succeed,return 1;fail return 0
//slave serial mode
unsigned char disfpga(void)// unsigned char *datp )
{
unsigned char *DisData,tmp,result;
unsigned char *FpgaProg,*FpgaData,*FpgaState;
unsigned short i,j,k;
FpgaProg = (unsigned char *)DIS_CLEAR_MEMORY;
FpgaData = (unsigned char *)DIS_CLKDATA;
FpgaState = (unsigned char *)DIS_DONE;
DisData = DSTNdata + 0x48;//skip file head,offaddress=0x48
//step one:memory clear:/program:1->0->1
*FpgaData=0x02; //set CCLK=1
*FpgaProg=0x01; // send a high level to pin PROG
*FpgaProg=0x01;
for(i=100;i;i--);
*FpgaProg=0x00; // send a low level to pin PROG
*FpgaProg=0x00;
for(i=150;i;i--); //delay some time
*FpgaProg=0x01; // send a high level to pin PROG
for(i=250;i;i--); //delay some time
i=500;
do
{
i--;
if(i==0) return 0; //wait no low ,fail
} while (!(*FpgaState & INIT_OK) ); //wait until /INIT=1
for(i = 0xFFFF;i;i --); //delay some time 55-275 us
for(i = 0xFFFF;i;i --);
for(i = 0xFFFF;i;i --);
//lead code(12 bits)+length count(24 bits)+Fill Bits(4 bits)
//Now:/PROG=1,/INIT=1,DONE=0
result=0;
for(i=FPGA_SIZE_SERIAL;i;i --) //write data to FPGA
{
tmp=*DisData++;
for(j=8;j;j--)
{
if(tmp & 0x80) //set CCLK=0,set Data
*FpgaData=0x01;
else
*FpgaData=0x00;
for(k=2;k;k--); //CCLK low time >45 ns
if(tmp & 0x80) //set CCLK=1,keep Data
*FpgaData=0x03;
else
*FpgaData=0x02;
tmp<<=1; //next bit
//for(k=2;k;k--); //CCLK high time >45 ns
if(!(*FpgaState & INIT_OK) ) //test /INIT = low ,fail
{
k=0;
return 0;
}
if( *FpgaState & DONE_OK ) //test DONE = high ,(C1)
{ //DONE goes high at counter 179153.
result++; //i=1;j=6
k=1; //succeed,loop suspend?
}
}
}
//Now:/PROG=1,/INIT=1,DONE=1
//postamble code = 0x7F
//Start-up begin(Start-up Bytes=0xFF)
//post-amble,(C2),I/Os Become active.
*FpgaData=0x01;
for(k=6;k;k--);
*FpgaData=0x03;
for(k=6;k;k--);
//Start-up,GSR is released.
*FpgaData=0x01;
for(k=6;k;k--);
*FpgaData=0x03;
for(k=6;k;k--);
*FpgaData=0x01;
for(k=6;k;k--);
*FpgaData=0x03;
for(k=6;k;k--);
*FpgaData=0x00;
for(k=6;k;k--);
*FpgaData=0x02;
for(k=6;k;k--);
*FpgaData=0x04; //off data
// finish configuration
i = 5000 ;
do
{
i--;
if(i == 0) return 0; //wait no low ,fail
} while ( !(*FpgaState & DONE_OK) ); //wait until DONE = 1
return 1;
}
void clr_dstn_vram(void)
{
unsigned long int ivram;
unsigned short int *Cramp,idelay;
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS);
for (ivram=75*1024/2;ivram;ivram--)
{
idelay++;
*Cramp ++ = 0; //clear screen
}
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS + 0x40000);
for (ivram=75*1024/2;ivram;ivram--)
{
idelay++;
*Cramp ++ = 0; //clear screen
}
}
void clr_tft_vram(void)
{
unsigned long int ivram;
unsigned short int *Cramp,idelay;
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS);
for (ivram=75*1024;ivram;ivram--)
{
*Cramp ++ = 0; //clear screen
}
}
unsigned char set_4dot(unsigned short int x,unsigned short int y,unsigned short int color)
{
unsigned short int *Cramp,tmp1,tmp2,tmpcolor;
unsigned long int idot;
tmp1=x/4;
tmp2=x-4*tmp1;
idot=160*y+tmp1;
if(tmp2==1)
tmpcolor=color<<4;
else if(tmp2==2)
tmpcolor=color<<8;
else if(tmp2==3)
tmpcolor=color<<12;
else
tmpcolor=color;
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS + 2*idot);
tmpcolor = (*Cramp) | tmpcolor;
*Cramp = tmpcolor;
}
unsigned char Cramp1[20];
unsigned char set_2dot(unsigned short int x,unsigned short int y,unsigned char color)
{
unsigned short int tmp1,tmp2;
unsigned char *Cramp,tmpcolor;
unsigned long int idot;
//x=0--639
//y=0--479
tmp1=x/2;
tmp2=x-2*tmp1;
idot=320*y+tmp1;
if(tmp2==1)
tmpcolor=color<<4;
else
tmpcolor=color;
Cramp=(unsigned char *)(DIS_BASE_ADDRESS + idot);
tmpcolor = (*Cramp) | tmpcolor;
Cramp1[2] = tmpcolor;
*Cramp = Cramp1[2];
}
unsigned char set_dot(unsigned short int x,unsigned short int y,unsigned short int color)
{
unsigned short int *Cramp,idot,tmp1,tmp2,tmpcolor;
tmp1=x/4;
tmp2=x-4*tmp1;
if(y<240)
idot=160*y+tmp1;
else
idot=160*(y-240)+tmp1;
if(tmp2==1)
tmpcolor=color<<4;
else if(tmp2==2)
tmpcolor=color<<8;
else if(tmp2==3)
tmpcolor=color<<12;
else
tmpcolor=color;
if(y<240)
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS + 2*idot);
else
Cramp=(unsigned short int *)(DIS_BASE_ADDRESS + 0x40000 + 2*idot);
tmpcolor = (*Cramp) | tmpcolor;
*Cramp = tmpcolor;
}
void test_dstn_dot(unsigned short int color)
{
unsigned short int x,y;
for(y=0;y<480;y++)
{
for(x=0;x<640;x++)
set_dot(x,y,color);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -