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

📄 disfpga.c

📁 移植Nuclues_RTC到coldfire5307在diab下编译通过
💻 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 + -