233 lines
5.7 KiB
C
233 lines
5.7 KiB
C
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|
|
|
|
extern void PUT32 ( unsigned int, unsigned int );
|
|
extern void PUT16 ( unsigned int, unsigned int );
|
|
extern void PUT8 ( unsigned int, unsigned int );
|
|
extern unsigned int GET32 ( unsigned int );
|
|
extern void BRANCHTO ( unsigned int );
|
|
extern void dummy ( unsigned int );
|
|
|
|
#define ARM_TIMER_CTL 0x2000B408
|
|
#define ARM_TIMER_CNT 0x2000B420
|
|
|
|
#define GPFSEL1 0x20200004
|
|
#define GPSET0 0x2020001C
|
|
#define GPCLR0 0x20200028
|
|
#define GPPUD 0x20200094
|
|
#define GPPUDCLK0 0x20200098
|
|
|
|
#define AUX_ENABLES 0x20215004
|
|
#define AUX_MU_IO_REG 0x20215040
|
|
#define AUX_MU_IER_REG 0x20215044
|
|
#define AUX_MU_IIR_REG 0x20215048
|
|
#define AUX_MU_LCR_REG 0x2021504C
|
|
#define AUX_MU_MCR_REG 0x20215050
|
|
#define AUX_MU_LSR_REG 0x20215054
|
|
#define AUX_MU_MSR_REG 0x20215058
|
|
#define AUX_MU_SCRATCH 0x2021505C
|
|
#define AUX_MU_CNTL_REG 0x20215060
|
|
#define AUX_MU_STAT_REG 0x20215064
|
|
#define AUX_MU_BAUD_REG 0x20215068
|
|
|
|
//GPIO14 TXD0 and TXD1
|
|
//GPIO15 RXD0 and RXD1
|
|
//------------------------------------------------------------------------
|
|
unsigned int uart_recv ( void )
|
|
{
|
|
while(1)
|
|
{
|
|
if(GET32(AUX_MU_LSR_REG)&0x01) break;
|
|
}
|
|
return(GET32(AUX_MU_IO_REG)&0xFF);
|
|
}
|
|
//------------------------------------------------------------------------
|
|
void uart_send ( unsigned int c )
|
|
{
|
|
while(1)
|
|
{
|
|
if(GET32(AUX_MU_LSR_REG)&0x20) break;
|
|
}
|
|
PUT32(AUX_MU_IO_REG,c);
|
|
}
|
|
//------------------------------------------------------------------------
|
|
void hexstrings ( unsigned int d )
|
|
{
|
|
//unsigned int ra;
|
|
unsigned int rb;
|
|
unsigned int rc;
|
|
|
|
rb=32;
|
|
while(1)
|
|
{
|
|
rb-=4;
|
|
rc=(d>>rb)&0xF;
|
|
if(rc>9) rc+=0x37; else rc+=0x30;
|
|
uart_send(rc);
|
|
if(rb==0) break;
|
|
}
|
|
uart_send(0x20);
|
|
}
|
|
//------------------------------------------------------------------------
|
|
void hexstring ( unsigned int d )
|
|
{
|
|
hexstrings(d);
|
|
uart_send(0x0D);
|
|
uart_send(0x0A);
|
|
}
|
|
//------------------------------------------------------------------------
|
|
unsigned char xstring[256];
|
|
//------------------------------------------------------------------------
|
|
int notmain ( void )
|
|
{
|
|
unsigned int ra;
|
|
//unsigned int rb;
|
|
unsigned int rx;
|
|
unsigned int addr;
|
|
unsigned int block;
|
|
unsigned int state;
|
|
|
|
unsigned int crc;
|
|
|
|
PUT32(AUX_ENABLES,1);
|
|
PUT32(AUX_MU_IER_REG,0);
|
|
PUT32(AUX_MU_CNTL_REG,0);
|
|
PUT32(AUX_MU_LCR_REG,3);
|
|
PUT32(AUX_MU_MCR_REG,0);
|
|
PUT32(AUX_MU_IER_REG,0);
|
|
PUT32(AUX_MU_IIR_REG,0xC6);
|
|
PUT32(AUX_MU_BAUD_REG,270);
|
|
ra=GET32(GPFSEL1);
|
|
ra&=~(7<<12); //gpio14
|
|
ra|=2<<12; //alt5
|
|
ra&=~(7<<15); //gpio15
|
|
ra|=2<<15; //alt5
|
|
PUT32(GPFSEL1,ra);
|
|
PUT32(GPPUD,0);
|
|
for(ra=0;ra<150;ra++) dummy(ra);
|
|
PUT32(GPPUDCLK0,(1<<14)|(1<<15));
|
|
for(ra=0;ra<150;ra++) dummy(ra);
|
|
PUT32(GPPUDCLK0,0);
|
|
PUT32(AUX_MU_CNTL_REG,3);
|
|
|
|
PUT32(ARM_TIMER_CTL,0x00F90000);
|
|
PUT32(ARM_TIMER_CTL,0x00F90200);
|
|
|
|
hexstring(0x12345678);
|
|
|
|
//SOH 0x01
|
|
//ACK 0x06
|
|
//NAK 0x15
|
|
//EOT 0x04
|
|
|
|
//block numbers start with 1
|
|
|
|
//132 byte packet
|
|
//starts with SOH
|
|
//block number byte
|
|
//255-block number
|
|
//128 bytes of data
|
|
//checksum byte (whole packet)
|
|
//a single EOT instead of SOH when done, send an ACK on it too
|
|
|
|
block=1;
|
|
addr=0;
|
|
state=0;
|
|
rx=GET32(ARM_TIMER_CNT);
|
|
while(1)
|
|
{
|
|
ra=GET32(ARM_TIMER_CNT);
|
|
if((ra-rx)>=4000000)
|
|
{
|
|
uart_send(0x15);
|
|
rx+=4000000;
|
|
}
|
|
if((GET32(AUX_MU_LSR_REG)&0x01)==0) continue;
|
|
xstring[state]=GET32(AUX_MU_IO_REG)&0xFF;
|
|
rx=GET32(ARM_TIMER_CNT);
|
|
if(state==0)
|
|
{
|
|
if(xstring[state]==0x04)
|
|
{
|
|
uart_send(0x06);
|
|
BRANCHTO(0);
|
|
break;
|
|
}
|
|
}
|
|
switch(state)
|
|
{
|
|
case 0:
|
|
{
|
|
if(xstring[state]==0x01)
|
|
{
|
|
crc=xstring[state];
|
|
state++;
|
|
}
|
|
else
|
|
{
|
|
//state=0;
|
|
uart_send(0x15);
|
|
}
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
if(xstring[state]==block)
|
|
{
|
|
crc+=xstring[state];
|
|
state++;
|
|
}
|
|
else
|
|
{
|
|
state=0;
|
|
uart_send(0x15);
|
|
}
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
if(xstring[state]==(0xFF-xstring[state-1]))
|
|
{
|
|
crc+=xstring[state];
|
|
state++;
|
|
}
|
|
else
|
|
{
|
|
uart_send(0x15);
|
|
state=0;
|
|
}
|
|
break;
|
|
}
|
|
case 131:
|
|
{
|
|
crc&=0xFF;
|
|
if(xstring[state]==crc)
|
|
{
|
|
for(ra=0;ra<128;ra++)
|
|
{
|
|
PUT8(addr++,xstring[ra+3]);
|
|
}
|
|
uart_send(0x06);
|
|
block=(block+1)&0xFF;
|
|
}
|
|
else
|
|
{
|
|
uart_send(0x15);
|
|
}
|
|
state=0;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
crc+=xstring[state];
|
|
state++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
//-------------------------------------------------------------------------
|
|
//-------------------------------------------------------------------------
|