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

📄 new1.c

📁 Cirrus Logic公司的EP7312的LCD屏驱动
💻 C
字号:

//use uart to access arm bus  by zx

#include "ioregs.h" 
#include "cs8900.h"

void init_uart1(void)
{

IO_UBRLCR1 = (IO_UBRLCR1 & ~BRDIV) | BR_9600;
IO_UBRLCR1 = IO_UBRLCR1 | FIFOEN;
IO_UBRLCR1 = (IO_UBRLCR1 & ~WRDLEN) | (3<<WRDLEN_SHIFT);
IO_SYSCON1 |=  UART1EN;
}

void init_uart2(void)
{

IO_UBRLCR1 = (IO_UBRLCR1 & ~BRDIV) | BR_115200;
IO_UBRLCR1 = IO_UBRLCR1 | FIFOEN;
IO_UBRLCR1 = (IO_UBRLCR1 & ~WRDLEN) | (3<<WRDLEN_SHIFT);
IO_SYSCON1 |=  UART1EN;
}


static unsigned char get_char(void)
{
	while (IO_SYSFLG1 & URXFE1);
	return IO_UARTDR1 & 0xff;
}

static void put_char(unsigned char data)
{
/*
	if(data=='\n')
	{
		while (IO_SYSFLG1 & UTXFF1);
		IO_UARTDR1 = '\r';
	}
	else 
	{
		while (IO_SYSFLG1 & UTXFF1);
		IO_UARTDR1 = data;
	}
*/
		while (IO_SYSFLG1 & UTXFF1);
		IO_UARTDR1 = data;
}



static void put_num8(unsigned char i)
{
		put_char(((((i>>4) & 0x0f)  + '0')> '9' )? ((i>>4) & 0x0f) +'0'+7 : ((i>>4) & 0x0f) +'0' );
		put_char((((i & 0x0f)  + '0')> '9' )? (i & 0x0f) +'0'+7 : (i & 0x0f) +'0' );
}

static void put_num16(int i)
{
		put_num8((unsigned char)(( i>>8) & 0xff));
		put_num8( (unsigned char) (i & 0xff));
}

static void put_num32(long i)
{
		put_num16((unsigned int)(( i>>16) & 0xffff));
		put_num16( (unsigned int) (i & 0xffff));
}

void mymain(void);
void put_string(char *sp);
void flashled(void);
void speedled(void);
void flash_prog(unsigned long address,unsigned char data);
void test_flash();
unsigned int wait(unsigned char i);
void readout();
void writein();
void flashload();
void flash_erase();

unsigned long address;
unsigned long data;
unsigned long length;

void  C_vMain(void)
{

	unsigned char i;
	unsigned short j;	
	init_uart2();

	mymain();
/*
	while(1)
	{
		i=get_char();
		if(i==0xaa)
		{
			j=get_reg(0);
			put_num16(j);
//			put_char(j/256);
//			put_char(j%256);
	
			j=get_reg(2);
			put_num16(j);
//			put_char(j/256);
//			put_char(j%256);
						
		}
		else if(i==0x79)
			mymain();
		else put_char(i);
	}

*/
}

void put_string(char *sp)
{
	unsigned int i=0;
	while(sp[i]!=0)
		put_char(sp[i++]);
	 	
}

#define SYS_(offset)	(*(volatile unsigned long*)(offset))
#define SYSC_(offset)	(*(volatile unsigned char*)(offset))

#define SDRAM_BASE	0xC0000000
#define SDRAM_(offset)	(*(volatile unsigned long*)(SDRAM_BASE + offset))

void init_lcd()
{
	unsigned long address;
	unsigned long data;
	
	address=0x800002c0;
	data=0xf032695f;
	SYS_(address)=data;

	address=0x80000540;
	data=0x76543210;
	SYS_(address)=data;

	address=0x80000580;
	data=0xfedcba98;
	SYS_(address)=data;

	address=0x80000100;
	data=0x00001100;
	SYS_(address)=data;

	address=0x80000000;
	data=0x03000000;
	SYS_(address)=data;

	address=0x80000041;
	data=0xff;
	SYSC_(address)=data;
	
	address=0x80000001;
	data=0xff;
	SYSC_(address)=data;			
}

void mymain(void)
{
// Declare your local variables here
unsigned char scomm,sdata;

unsigned char *addrp;
unsigned char *datap;
unsigned long i,lcddata;

addrp=(unsigned char*)&address;
datap=(unsigned char*)&data;

init_uart2();
put_string("ok!\n");	//Start String
init_lcd();


for(i=0;i<320*240/2;i+=4)
{
	data=SYSC_(0x800+i);
	data+=SYSC_(0x800+i+1)<<8;
	data+=SYSC_(0x800+i+2)<<16;
	data+=SYSC_(0x800+i+3)<<24;
	SDRAM_(i)=data;		
}

while (1)
    {
      // Place your code here
	scomm=get_char();
	if(scomm==0xff)
	  	{
	  	scomm=get_char();
	  	if(scomm!=0xff)
	  		switch(scomm){
		  				  		
//		  		case 0xa0:addrp[0]=sdata;put_string("Set Addr0:");put_num32(address);put_string("h\n");break;
//				case 0xa1:addrp[1]=sdata;put_string("Set Addr1:");put_num32(address);put_string("h\n");break;
//				case 0xa2:addrp[2]=sdata;put_string("Set Addr2:");put_num32(address);put_string("h\n");break;
				case 0xa3:addrp[3]=sdata;put_string("Set Addr3:");put_num32(address);put_string("h\n");break;		  		

//				case 0xc0:datap[0]=sdata;put_string("Set Word0:");put_num32(data);put_string("h\n");break;
//				case 0xc1:datap[1]=sdata;put_string("Set Word1:");put_num32(data);put_string("h\n");break;
//				case 0xc2:datap[2]=sdata;put_string("Set Word2:");put_num32(data);put_string("h\n");break;
//				case 0xc3:datap[3]=sdata;put_string("Set Word3:");put_num32(data);put_string("h\n");break;




//				case 0xd0:put_string("Read Word:");put_num32(SYS_(address));put_string("h at ");put_num32(address);put_string("h\n");break;					
//				case 0xe0:SYS_(address)=data;put_string("Write Word:");put_num32(data);put_string("h at ");put_num32(address);put_string("h\n");break;					
//				case 0xd1:put_string("Read Word:");put_num32(SYS_(address));put_string("h at ");put_num32(address);put_string("h\n");address+=4;break;					
//				case 0xe1:SYS_(address)=data;put_string("Write Word:");put_num32(data);put_string("h at ");put_num32(address);put_string("h\n");address+=4;break;					
//				case 0xd2:put_string("Read Word:");put_num32(SYS_(address));put_string("h at ");put_num32(address);put_string("h\n");address-=4;break;					
//				case 0xe2:SYS_(address)=data;put_string("Write Word:");put_num32(data);put_string("h at ");put_num32(address);put_string("h\n");address-=4;break;					


//				case 0xda:put_string("Read Byte:");put_num8(SYSC_(address));put_string("h at ");put_num32(address);put_string("h\n");break;					
//				case 0xea:SYSC_(address)=data;put_string("Write Byte:");put_num8(data);put_string("h at ");put_num32(address);put_string("h\n");break;					
				case 0xdb:put_string("Read Byte:");put_num8(SYSC_(address));put_string("h at ");put_num32(address);put_string("h\n");address+=1;break;					
//				case 0xeb:SYSC_(address)=data;put_string("Write Byte:");put_num8(data);put_string("h at ");put_num32(address);put_string("h\n");address+=1;break;					
//				case 0xdc:put_string("Read Byte:");put_num8(SYSC_(address));put_string("h at ");put_num32(address);put_string("h\n");address-=1;break;					
//				case 0xec:SYSC_(address)=data;put_string("Write Byte:");put_num8(data);put_string("h at ");put_num32(address);put_string("h\n");address-=1;break;					

//				case 0xfe:flash_prog(address,data);put_string("Flash Program:");put_num8(data);put_string("h at ");put_num32(address);put_string("h\n");break;					
//				case 0xfc:test_flash();break;
				case 0xfc:readout();break;
				case 0xfd:writein();break;
//				case 0xfa:flashload();break;

//				case 0xf0:flashled();break;
//				case 0xf1:speedled();break;

		  		default:put_string("N/A!\n");
		  		}
		else sdata=0xff;
		}
	else sdata=scomm;
	}

}

/*
void flashled()
{
	IO_PDDDR = IO_PDDDR & 0xfffffffe;
	IO_PDDR = IO_PDDR ^ 0x01;
}

void speedled()
{
	unsigned int i,j,k,s=0;
	for(i=0;i<50;i++)
	{
		for(j=0;j<1000;j++) 
			for(k=0;k<1000;k++) s=s+k;
		flashled();
	}
}
*/
void flash_erase()
{
	SYSC_(0x70005555)=0xaa;
	wait(1);
	SYSC_(0x70002aaa)=0x55;
	wait(1);
	SYSC_(0x70005555)=0x80;
	wait(1);
	SYSC_(0x70005555)=0xaa;
	wait(1);
	SYSC_(0x70002aaa)=0x55;
	wait(1);
	SYSC_(0x70005555)=0x10;
	wait(1);	
	while((SYSC_(0x70000000)& 0x80)==0);
}

void flash_prog(unsigned long address,unsigned char data)
{
	SYSC_(0x70005555)=0xaa;
	wait(1);
//	put_num8(0xaa);
	SYSC_(0x70002aaa)=0x55;
	wait(1);
//	put_num8(0x55);
	SYSC_(0x70005555)=0xa0;
	wait(1);	
//	put_num8(0xa0);
	SYSC_(address)=data;
	while(SYSC_(address)!=data);
//	put_num8(data);
}
/*
void test_flash()
{
	unsigned long index=0;
	unsigned long data;
	put_string("P2D\n");
	for(index=0;index<4;index++)
	{
		data=get_char();
		data=(data<<8)+get_char();
		data=(data<<8)+get_char();
		data=(data<<8)+get_char();
		SDRAM_(index*4)=data;
	}
	put_string("F Add\n");
	data=get_char();
	for(index=0;index<4;index++)
	{
		flash_prog(0x70000000+index*4+(data<<8),SDRAM_(index*4)>>24);
		flash_prog(0x70000001+index*4+(data<<8),(SDRAM_(index*4)>>16) & 0xff);
		flash_prog(0x70000002+index*4+(data<<8),(SDRAM_(index*4)>>8) & 0xff);
		flash_prog(0x70000003+index*4+(data<<8),SDRAM_(index*4)& 0xff);		
	}
	put_string("OK\n");
}
*/
void writein()
{
	unsigned long i,data;

	put_string("Len:\n");
	length=get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();
	for(i=0;i<length;i+=4)
	{
		data=get_char();
		data+=get_char()<<8;
		data+=get_char()<<16;
		data+=get_char()<<24;
//		data=(data<<8)+get_char();
//		data=(data<<8)+get_char();
//		data=(data<<8)+get_char();
		SDRAM_(i)=data;
	}
	put_string("Ok!\n");	
}
void readout()
{
	unsigned long i;
	put_string("Add:\n");
	address=get_char();
	address=(address<<8)+get_char();
	address=(address<<8)+get_char();
	address=(address<<8)+get_char();
	put_string("Len:\n");
	length=get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();
	length=(length<<8)+get_char();
	for(i=0;i<length;i++)
		put_char(SYSC_(address+i));	
}

void flashload()
{
	unsigned long i;
	writein();
	flash_erase();
	for(i=0;i<length;i+=4)
	{
		data=SDRAM_(i);
		flash_prog((0x70000000+i),data & 0xff);
		flash_prog((0x70000001+i),(data>>8) & 0xff);
		flash_prog((0x70000002+i),(data>>16) & 0xff);
		flash_prog((0x70000003+i),(data>>24) & 0xff);						
	}
	put_string("Done!\n");
}

unsigned int wait(unsigned char i)
{
	unsigned int sum=0;
	for(;i>0;i--)
		sum+=i;
	return(sum);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -