X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=frprog.py;h=d99f48fc63cd87be463da9f795ebfda2b0b820d0;hb=31898950d88ea5a8565c83126b0f02a63cbbbc3a;hp=a92b0fb9f2a5af2a776485151c5bebb997ee806e;hpb=b580c9fce4cc4e51d411e09eff79af6c17519600;p=pyfrprog.git diff --git a/frprog.py b/frprog.py index a92b0fb..d99f48f 100755 --- a/frprog.py +++ b/frprog.py @@ -2,8 +2,6 @@ import sys, time from SerialPort_linux import * -# serial device to communicate with -DEVICE="/dev/ttyUSB0" # baudrate used for initialization INIT_BAUDRATE=9600 # baudrate used for communication with the internal bootloader after init @@ -14,8 +12,12 @@ KERNEL_BAUDRATE=115200 # contains the last received checksum from a READ, WRITE or CHECKSUM command last_checksum = 0 +class FlashSequence(object): + def __init__(self, address, data): + self.address = address + self.data = data + def sendByte(byte): - time.sleep(0.001) # just to get sure, wait 1ms tty.write(chr(byte)) def sendWord(word): @@ -36,7 +38,7 @@ def recvChecksum(): last_checksum = recvByte() last_checksum |= (recvByte() << 8) -def cmdREAD(address, size): +def bootromREAD(address, size): # send READ command sendByte(0x01) if (recvByte() != 0xF1): @@ -55,7 +57,7 @@ def cmdREAD(address, size): recvChecksum() return data -def cmdWRITE(address, size, data): +def bootromWRITE(address, size, data): # send WRITE command sendByte(0x01) if (recvByte() != 0xF1): @@ -73,7 +75,7 @@ def cmdWRITE(address, size, data): recvChecksum() # TODO: test this function! -def cmdCALL(address): +def bootromCALL(address): # send CALL command sendByte(0x01) if (recvByte() != 0xF1): @@ -87,7 +89,7 @@ def cmdCALL(address): #return recvByte() # TODO: test this function! -def cmdCHECKSUM(): +def bootromCHECKSUM(): # call CHECKSUM command sendByte(0x01) if (recvByte() != 0xF1): @@ -98,7 +100,7 @@ def cmdCHECKSUM(): # get checksum recvChecksum() -def cmdBAUDRATE(baudrate): +def bootromBAUDRATE(baudrate): # send BAUDRATE command sendByte(0x01) if (recvByte() != 0xF1): @@ -126,7 +128,6 @@ def pkernERASE(address, size): if (recvByte() != 0x18): raise Exception - def pkernWRITE(address, size, data): # send WRITE command sendByte(0x13) @@ -143,12 +144,6 @@ def pkernWRITE(address, size, data): if (recvByte() != 0x28): raise Exception - -class FlashSequence(object): - def __init__(self, address, data): - self.address = address - self.data = data - def readMHXFile(filename): # desired mhx filename fp = open(filename, "r") retval = [] # returns a list of FlashSequence objects @@ -182,181 +177,102 @@ def readMHXFile(filename): # desired mhx filename fp.close() return retval - -# check command line arguments -if len(sys.argv) != 3: - print "Usage: " + sys.argv[0] + " [pkernel mhx-file] [target mhx-file]" - sys.exit(1) - -# read in data from mhx-files before starting -try: - bootloaderseqs = readMHXFile(sys.argv[1]) - pkernelseqs = readMHXFile(sys.argv[2]) -except IOError as error: - print sys.argv[0] + ": Error - couldn't open file " + error.filename + "!" - sys.exit(1) - -print "Initializing serial port..." -tty = SerialPort(DEVICE, 100, INIT_BAUDRATE) - -print "Please press RESET on your board..." - -while True: - tty.write('V') - tty.flush() - try: - if tty.read() == 'F': - break - except SerialPortException: - # timeout happened, who cares ;-) - pass - -print "OK, trying to set baudrate..." -# set baudrate -cmdBAUDRATE(BOOTLOADER_BAUDRATE) -tty = SerialPort(DEVICE, 100, BOOTLOADER_BAUDRATE) - -print "Transfering pkernel program to IRAM", -# let the fun begin! -for seq in bootloaderseqs: - if(seq.address <= 0x40000): - addr = seq.address - else: - continue - #print "RAMing", len(seq.data), "bytes at address", hex(addr) - cmdWRITE(addr, len(seq.data), seq.data) - tty.flush() - sys.stdout.write(".") - sys.stdout.flush() -print - -# execute our pkernel finally and set pkernel conform baudrate -cmdCALL(0x30000) -time.sleep(0.5) # just to get sure that the pkernel is really running! -del tty -tty = SerialPort(DEVICE, None, KERNEL_BAUDRATE) - -print "Performing ChipErase..." -pkernCHIPERASE() -print "Chip erasing done." - -print "Flashing", -for seq in pkernelseqs: - # skip seqs only consisting of 0xffs - seqset = list(set(seq.data)) - if len(seqset) == 1 and seqset[0] == 0xff: - continue - #print "Flashing", len(seq.data), "bytes at address", hex(seq.address) - pkernWRITE(seq.address, len(seq.data), seq.data) - tty.flush() - sys.stdout.write(".") - sys.stdout.flush() -print -print "Flashing done." - -sendByte(0x97) # exit and restart -print "Program was started. Have fun!" - -# some tests here....... -""" -# execute (existing) program in ram -cmdCALL(0x00033ffc) -sys.exit(0) -""" - -# read something from the IRAM -#print cmdREAD(0x00030000, 32) - -#data = [] -#for i in range(0, 32): -# data.append(i) -#cmdWRITE(0x00030000, 32, data) - - -""" -# write something to the begin of the IRAM -data_wr = [] -checksum = 0 -for i in range(0, 0x400): - value = i%256 - data_wr.append(value) - checksum = (checksum + value) % (2**16) - -print "Calculated checksum:", checksum -print "Writing", data_wr, "to the IRAM..." -cmdWRITE(0x00030000, len(data_wr), data_wr) -print "Received Checksum:", last_checksum -print - -print "Reading from the IRAM again..." -data_re = cmdREAD(0x00030000, len(data_wr)) -print "Received data:", data_re, "Checksum:", last_checksum -""" - -""" -# see whats in the iram at the moment -data_wr = [] -print "Reading from the IRAM..." -data_re = cmdREAD(0x00030000, 0x10000-4) -print "Received data:", data_re, "Checksum:", last_checksum -""" - -""" -# see whats in the dram at the moment -data_wr = [] -print "Reading from the DRAM..." -data_re = cmdREAD(0x0002C000, 0x10000-0xC000-4) -print "Received data:", data_re, "Checksum:", last_checksum -""" - -""" -# blank the iram -data_wr = [] -for i in range(0, 0x10000-4): - value = 0 - data_wr.append(value) - -print "Writing", data_wr, "to the IRAM..." -cmdWRITE(0x00030000, len(data_wr), data_wr) -print "Received Checksum:", last_checksum -print -""" - -""" -# blank the dram -data_wr = [] -for i in range(0, 0x10000-0xC000-4): - value = 0 - data_wr.append(value) - -print "Writing", data_wr, "to the DRAM..." -cmdWRITE(0x0002C000, len(data_wr), data_wr) -print "Received Checksum:", last_checksum -print -""" - -""" -# write some data in the iram and try to execute it -data_wr =[ - 0x9B,0x00, - 0x0D,0x4e, - 0xcf,0xf1, - 0x16,0x01, - 0x9b,0x05, - 0x04,0xc7, - 0xc1,0x06, - 0x16,0x56, - 0xe0,0xfb, #branch - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, #nop - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0, - 0x9f,0xa0,0x9f,0xa0,0x9f,0xa0] -print "Writing", data_wr, "to the IRAM..." -cmdWRITE(0x00030000, len(data_wr), data_wr) -print "Received Checksum:", last_checksum -print -cmdCALL(0x00030000) -""" +def main(argv=None): + # check command line arguments + if argv is None: + argv = sys.argv + + if len(argv) == 2 and (argv[1] == "-v" or argv[1] == "--version"): + print "Version: %VERSION%" + return 0 + + if len(argv) != 2 and len(argv) != 4: + print "Usage: " + argv[0] + " [-d DEVICE]" + return 1 + + # standard serial device to communicate with + DEVICE="/dev/ttyUSB0" + if len(argv) == 4: + DEVICE = argv[3] + + # read in data from mhx-files before starting + try: + try: + bootloaderseqs = readMHXFile("pkernel/pkernel.mhx") + except IOError as error1: + bootloaderseqs = readMHXFile("%PREFIX%/share/frprog/pkernel.mhx") + pkernelseqs = readMHXFile(argv[1]) + except IOError as error: + print argv[0] + ": Error - couldn't open file " + error.filename + "!" + return 1 + + print "Initializing serial port..." + global tty + tty = SerialPort(DEVICE, 100, INIT_BAUDRATE) + + print "Please press RESET on your board..." + + while True: + tty.write('V') + tty.flush() + try: + if tty.read() == 'F': + break + except SerialPortException: + # timeout happened, who cares ;-) + pass + + starttime = time.time() # save time at this point for evaluating the duration at the end + + print "OK, trying to set baudrate..." + # set baudrate + bootromBAUDRATE(BOOTLOADER_BAUDRATE) + time.sleep(0.1) # just to get sure that the bootloader is really running in new baudrate mode! + del tty + tty = SerialPort(DEVICE, 100, BOOTLOADER_BAUDRATE) + + print "Transfering pkernel program to IRAM", + # let the fun begin! + for seq in bootloaderseqs: + if(seq.address <= 0x40000): + addr = seq.address + else: + continue + #print "RAMing", len(seq.data), "bytes at address", hex(addr) + bootromWRITE(addr, len(seq.data), seq.data) + tty.flush() + sys.stdout.write(".") + sys.stdout.flush() + print + + # execute our pkernel finally and set pkernel conform baudrate + bootromCALL(0x30000) + time.sleep(0.1) # just to get sure that the pkernel is really running! + del tty + tty = SerialPort(DEVICE, None, KERNEL_BAUDRATE) + + print "Performing ChipErase..." + pkernCHIPERASE() + + print "Flashing", + for seq in pkernelseqs: + # skip seqs only consisting of 0xffs + seqset = list(set(seq.data)) + if len(seqset) == 1 and seqset[0] == 0xff: + continue + #print "Flashing", len(seq.data), "bytes at address", hex(seq.address) + pkernWRITE(seq.address, len(seq.data), seq.data) + tty.flush() + sys.stdout.write(".") + sys.stdout.flush() + print + + duration = time.time() - starttime + print "Procedure complete, took", round(duration, 2), "seconds." + + sendByte(0x97) # exit and restart + print "Program was started. Have fun!" + + +if __name__ == '__main__': + sys.exit(main())