From: travisutk Date: Sun, 19 Jul 2009 13:14:52 +0000 (+0000) Subject: Writing of SPI Flash is more reliable. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=d0d48d9cdb77bee064236d148002f98f3c247121 Writing of SPI Flash is more reliable. I forgot to raise !CS. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@69 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/goodfet.spiflash b/client/goodfet.spiflash index 5c73eda..a04ed19 100755 --- a/client/goodfet.spiflash +++ b/client/goodfet.spiflash @@ -8,6 +8,7 @@ import sys; import binascii; +import array; from GoodFET import GoodFET; from intelhex import IntelHex; @@ -65,8 +66,6 @@ if(sys.argv[1]=="dump"): if(len(sys.argv)>4): stop=int(sys.argv[4],16); - - print "Dumping code from %06x to %06x as %s." % (start,stop,f); file = open(f, mode='wb') @@ -81,6 +80,29 @@ if(sys.argv[1]=="dump"): file.write(j); i+=1; file.close() +if(sys.argv[1]=="flash"): + f = sys.argv[2]; + start=0x0000; + stop=0x100000; #TODO, adjust this by the JEDEC size parameter. + if(len(sys.argv)>3): + start=int(sys.argv[3],16); + if(len(sys.argv)>4): + stop=int(sys.argv[4],16); + + print "Flashing code from %06x to %06x with %s." % (start,stop,f); + file = open(f, mode='rb') + + i=start; + bytes=file.read(); + while i<=stop: + client.SPIpokebyte(i,ord(bytes[i])); + + i+=1; + if(i%0x100==0): + print "Flashed %06x."%i; + file.close() + + if(sys.argv[1]=="erase"): client.SPIchiperase(); @@ -104,6 +126,8 @@ if(sys.argv[1]=="poke"): if(len(sys.argv)>3): val=int(sys.argv[3],16); print "Poking %06x to become %02x." % (start,val); - client.SPIpokebyte(start,val); - + + while client.SPIpeek(start)!=val: + client.SPIpokebyte(start,val); + print "Poked to %02x" % client.SPIpeek(start); diff --git a/firmware/apps/spi/spi.c b/firmware/apps/spi/spi.c index c58b4bc..e00d2aa 100644 --- a/firmware/apps/spi/spi.c +++ b/firmware/apps/spi/spi.c @@ -79,6 +79,7 @@ void spiflash_wrten(){ //! Grab the SPI flash status byte. unsigned char spiflash_status(){ unsigned char c; + P5OUT|=SS; //Raise !SS to end transaction. P5OUT&=~SS; //Drop !SS to begin transaction. spitrans8(0x05);//GET STATUS c=spitrans8(0xFF); @@ -99,6 +100,11 @@ void spihandle(unsigned char app, unsigned char verb, unsigned char len){ unsigned char i; + + + //Raise !SS to end transaction, just in case we forgot. + P5OUT|=SS; + switch(verb){ //PEEK and POKE might come later. case READ: @@ -127,8 +133,8 @@ void spihandle(unsigned char app, len=0x80;//128 byte chunk for(i=0;i