From 53f7a41d712ea632f433699ad64900fd23d42a89 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 14 Dec 2009 04:25:14 +0100 Subject: [PATCH] okay, here is a programmer (=kernel.py) which communicate to the pkernel running on the board. there are some operation done to the flash, however it isn't correct (nothing happens after a reset) note: atm you have to program the pkernel with a windows programmer. note: use simpleprg.mhx to test it. (on larger files it takes *very* long, due to a built-in debug delay ;)) todo: after pkernel works correctly, we have to reduce the .mhx size. when the mhx file is small enough we can use the bootrom hack to load it directly into ram. after that it should be done :) --- pkernel/SerialPort_linux.py | 1 + pkernel/kernel.py | 62 ++++++++++++++++--- pkernel/main.c | 115 +++++++++++++++++++++++++++++++----- 3 files changed, 155 insertions(+), 23 deletions(-) create mode 120000 pkernel/SerialPort_linux.py diff --git a/pkernel/SerialPort_linux.py b/pkernel/SerialPort_linux.py new file mode 120000 index 0000000..88212d9 --- /dev/null +++ b/pkernel/SerialPort_linux.py @@ -0,0 +1 @@ +../SerialPort_linux.py \ No newline at end of file diff --git a/pkernel/kernel.py b/pkernel/kernel.py index 20b3a36..91bbcc4 100755 --- a/pkernel/kernel.py +++ b/pkernel/kernel.py @@ -7,25 +7,69 @@ DEVICE="/dev/ttyUSB0" # baudrate used for communication with pkernel KERNEL_BAUDRATE=38400 +def recvByte(): + i = tty.read() + while len(i)==0: + time.sleep(0.01) + i = tty.read() + return ord(i) + +def sendByte(byte): + time.sleep(0.501) # just to get sure, wait 1ms + tty.write(chr(byte)) + tty.flush() + +def sendWord(word): + sendByte(word & 0xFF) + sendByte((word >> 8) & 0xFF) + +def sendDWord(dword): + sendByte(dword & 0xFF) + sendByte((dword >> 8) & 0xFF) + sendByte((dword >> 16) & 0xFF) + sendByte((dword >> 24) & 0xFF) + def pkernWRITE(address, size, data): + print "address:", hex(address), "size:", size # send WRITE command - sendByte(0x01) - if (recvByte() != 0xF1): - raise Exception - sendByte(0x03) - if (recvByte() != 0x83): + sendByte(0x13) + if (recvByte() != 0x37): raise Exception # tell desired address and size sendDWord(address) sendWord(size) + if (recvByte() != 0x04): + raise Exception + print "Received Metadata." + # write binary stream of data for i in range(0, size): sendByte(data[i]) - # get checksum - recvChecksum() + + if (recvByte() != 0x08): + raise Exception + print "Received Data." + + if (recvByte() != 0x18): + raise Exception + print "Erasing done." + + if (recvByte() != 0x28): + raise Exception + print "Flashing done." + + +class FlashSequence(object): + def __init__(self, address, data): + self.address = address + self.data = data + +# list of all our address/data pairs to flash +flashseqs = [] + print "Initializing serial port..." -tty = SerialPort(DEVICE, 500, KERNEL_BAUDRATE) +tty = SerialPort(DEVICE, 0, KERNEL_BAUDRATE) # check command line arguments if len(sys.argv) != 2: @@ -77,4 +121,6 @@ for seq in flashseqs: print "Flashing", len(seq.data), "bytes at address", hex(seq.address) pkernWRITE(seq.address, len(seq.data), seq.data) +sendByte(0x99); + print "Reset your board now to run code from Flash" diff --git a/pkernel/main.c b/pkernel/main.c index ff5a4da..3676387 100644 --- a/pkernel/main.c +++ b/pkernel/main.c @@ -3,35 +3,128 @@ #pragma section CODE=IRAM,attr=CODE -void increaseled(void) +#define BUFSIZE 0x20 +#define cleardata() memset(data,0,BUFSIZE) + +static void increaseled(void) { PDR14 = ~(((~PDR14)+1)%256); HWWD_CL = 0; } +static unsigned char recvbyte(void) +{ + return Getch4(); +} + +static unsigned short recvword(void) +{ + static unsigned char b1, b2; + static unsigned int ret; + b1 = recvbyte(); + b2 = recvbyte(); + ret = (b2 << 8) | b1; + return ret; +} + +static unsigned int recvdword(void) +{ + static unsigned char b1, b2, b3, b4; + static unsigned int ret; + b1 = recvbyte(); + b2 = recvbyte(); + b3 = recvbyte(); + b4 = recvbyte(); + ret = (b4 << 24) | (b3 << 16) | (b2 << 8) | b1; + return ret; +} + +static void halt(void) +{ + while(1) { + HWWD_CL = 0; + } +} + +static void panic(void) +{ + PDR14 = 0xff; + PDR14 = 0x22; + halt(); +} + void main(void) { - unsigned int i, baseaddr; - unsigned int toflash[] = {0x9b00, 0x0d4e, 0xcff1, 0x1601, 0x9b05, 0x04c7, 0xc106, 0x1656, 0xe0fb}; //len = 9 + unsigned int address; + unsigned short i, size; + unsigned char running = 1, data[BUFSIZE] = {0}; PORTEN = 0x3; /* enable I/O Ports */ /*Enable LEDs*/ DDR14 = 0xFF; - PDR14 = 0x00; - increaseled(); + PDR14 = 0xff; /*Initialize UART4*/ InitUart4(); -#if 1 + while(running) { + cleardata(); + increaseled(); + switch(recvbyte()) { + case 0x13: //receive + Putch4(0x37); + increaseled(); + + address = recvdword(); + increaseled(); + + size = recvword(); + increaseled(); + + Putch4(0x04); //Received Metadata. + PDR14 = 0xff; + for(i=0; i