ArduinoAm29F010

Changeset

29:ad17e0dbe227
2015-08-09 Paul Boddie raw files shortlog changelog graph Fixed address high portion initialisation in read and write operations. Added missing erase and program operation support for 17-bit addresses. Updated the upload script to support 17-bit addresses.
ArduinoAm29F010.cpp (file) upload.py (file)
     1.1 --- a/ArduinoAm29F010.cpp	Sun Aug 09 19:08:15 2015 +0200
     1.2 +++ b/ArduinoAm29F010.cpp	Sun Aug 09 19:51:29 2015 +0200
     1.3 @@ -170,7 +170,10 @@
     1.4          i = 2;
     1.5      }
     1.6      else
     1.7 +    {
     1.8 +        high = 0;
     1.9          i = 1;
    1.10 +    }
    1.11  
    1.12      high |= (fromHex(buffer[i]) << 4) + (fromHex(buffer[i+1]));
    1.13      low = (fromHex(buffer[i+2]) << 4) + (fromHex(buffer[i+3]));
    1.14 @@ -188,7 +191,10 @@
    1.15          i = 2;
    1.16      }
    1.17      else
    1.18 +    {
    1.19 +        high = 0;
    1.20          i = 1;
    1.21 +    }
    1.22  
    1.23      high |= (fromHex(buffer[i]) << 4) + (fromHex(buffer[i+1]));
    1.24      low = (fromHex(buffer[i+2]) << 4) + (fromHex(buffer[i+3]));
    1.25 @@ -238,10 +244,10 @@
    1.26  {
    1.27      int high;
    1.28  
    1.29 -    // 3-bit number shifted to A16...A14 with A16 discarded.
    1.30 -    // Thus, only sectors from 0 to 3 are supported.
    1.31 +    // 3-bit number shifted to A16...A14.
    1.32 +    // Thus, only sectors from 0 to 7 are supported.
    1.33  
    1.34 -    high = (fromHex(buffer[1]) << 6) & 0xff;
    1.35 +    high = (fromHex(buffer[1]) << 6) & 0x1ff;
    1.36  
    1.37      for (int i = 0; i < 5; i++)
    1.38      {
    1.39 @@ -256,11 +262,22 @@
    1.40  
    1.41  bool program(const char buffer[])
    1.42  {
    1.43 -    int high, low, data;
    1.44 +    int high, low, data, i;
    1.45  
    1.46 -    high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
    1.47 -    low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
    1.48 -    data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
    1.49 +    if (nread > 7)
    1.50 +    {
    1.51 +        high = fromHex(buffer[1]) << 8;
    1.52 +        i = 2;
    1.53 +    }
    1.54 +    else
    1.55 +    {
    1.56 +        high = 0;
    1.57 +        i = 1;
    1.58 +    }
    1.59 +
    1.60 +    high |= (fromHex(buffer[i]) << 4) + (fromHex(buffer[i+1]));
    1.61 +    low = (fromHex(buffer[i+2]) << 4) + (fromHex(buffer[i+3]));
    1.62 +    data = (fromHex(buffer[i+4]) << 4) + (fromHex(buffer[i+5]));
    1.63  
    1.64      for (int i = 0; i < 3; i++)
    1.65      {
     2.1 --- a/upload.py	Sun Aug 09 19:08:15 2015 +0200
     2.2 +++ b/upload.py	Sun Aug 09 19:51:29 2015 +0200
     2.3 @@ -84,13 +84,13 @@
     2.4          addr = (sector << 14) | i
     2.5  
     2.6          if not verify_only:
     2.7 -            writeToPort("P%04x%02x\n" % (addr, value))
     2.8 +            writeToPort("P%05x%02x\n" % (addr, value))
     2.9              resp = readFromPort()
    2.10              if resp != "P":
    2.11                  print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp)
    2.12                  return False
    2.13          else:
    2.14 -            writeToPort("R%04x\n" % addr)
    2.15 +            writeToPort("R%05x\n" % addr)
    2.16              resp = readFromPort()
    2.17              if resp != "%02X" % value and resp != "%X" % value:
    2.18                  print >>sys.stderr, "Verify of location %04x failed: %s" % (addr, resp)