# programmer # # for programming parallel flash with a RPi # # parallel flash can be 16 or 8 bit wide # # Flash type: SST39SF010A # # needs external level conversion and 16-bit address register # # 20180508 import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) from time import sleep import re # for regular expression # GPIO names WE = 25 # enable write to flash when low ALE = 8 # enable write to ext addr register when low ENA = 24 # enable output of ext addr register when low CE = 3 # enable the flash chip(s) when low OE = 21 # enable output of flash chip(s) when low AD0 = 4 AD1 = 14 AD2 = 17 AD3 = 15 AD4 = 27 AD5 = 18 AD6 = 22 AD7 = 23 AD8 = 5 AD9 = 7 AD10 = 6 AD11 = 12 AD12 = 19 AD13 = 16 AD14 = 26 AD15 = 20 # end gpio names running=1 page=0x0000 sector=0x000 filename="" fileinfo=""; def set_inputs(): #set the RPi bus to inputs GPIO.setup(AD0 , GPIO.IN) GPIO.setup(AD1 , GPIO.IN) GPIO.setup(AD2 , GPIO.IN) GPIO.setup(AD3 , GPIO.IN) GPIO.setup(AD4 , GPIO.IN) GPIO.setup(AD5 , GPIO.IN) GPIO.setup(AD6 , GPIO.IN) GPIO.setup(AD7 , GPIO.IN) GPIO.setup(AD8 , GPIO.IN) GPIO.setup(AD9 , GPIO.IN) GPIO.setup(AD10 , GPIO.IN) GPIO.setup(AD11 , GPIO.IN) GPIO.setup(AD12 , GPIO.IN) GPIO.setup(AD13 , GPIO.IN) GPIO.setup(AD14 , GPIO.IN) GPIO.setup(AD15 , GPIO.IN) sleep(0.0001) def init_gpio(): set_inputs() GPIO.setup(WE, GPIO.OUT, initial = GPIO.HIGH) GPIO.setup(ALE, GPIO.OUT, initial = GPIO.HIGH) GPIO.setup(ENA, GPIO.OUT, initial = GPIO.HIGH) GPIO.setup(CE, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(OE, GPIO.OUT, initial = GPIO.LOW) def idle(): set_inputs() GPIO.output(WE, GPIO.HIGH) GPIO.output(ALE,GPIO.HIGH) GPIO.output(ENA,GPIO.HIGH) GPIO.output(CE, GPIO.LOW) GPIO.output(OE, GPIO.LOW) def out_databit(data,bitnr,ioname): GPIO.setup(ioname, GPIO.OUT) if (data & (0x01<>") char = char.lower() if (char=="r"): page_display() if (char=="i"): page = page + 0x0100 page_display() if (char=="d"): page = page - 0x0100 page_display() if (char=="m"): show_id() if (char=="x"): running=0 if (char=="p"): dofile("p") if (char=="v"): dofile("v") if (char=="f"): dir = "/home/pi/Downloads/" print("No need to enter extension (.hex) and directory ("+dir+")" ) str = input("filename: ") newname= dir + str +".hex" #check for 'time only' input: HMMS <0-2><0-9> if (len(str)==4): print("length=4") regex= re.compile("[a-z][0-5][0-9][a-z]") m = regex.match(str) if m: # if regex matches print("match ok") # so str is the new time code filename = filename.split(".")[0] # remove extension split = filename.split("_") # split old name in two sections lastpart = split[1][:-4] # remove last 4 chars firstpart = split[0] # construct new filename newname = firstpart+"_"+lastpart+str+".hex" filename = newname; fileinfo=file_info() if (char=="e"): erase_sector() idle() GPIO.cleanup(); print("end programmer")