📄 new1.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 + -