Index: src/Avr.h =================================================================== RCS file: /cvsroot/uisp/uisp/src/Avr.h,v retrieving revision 1.1 diff -u -r1.1 Avr.h --- src/Avr.h 25 May 2002 17:59:46 -0000 1.1 +++ src/Avr.h 1 Jun 2002 20:48:56 -0000 @@ -35,6 +35,19 @@ #include "Global.h" +/* Virtual Addresses for fuse and lock bytes. These are used to map a + read/write of a byte in the fuse segment to the underlying operation. The + real address may be different, but should be hidden in the more specific + code. */ + +enum { + AVR_FUSE_LOW_ADDR = 0, + AVR_FUSE_HIGH_ADDR = 1, + AVR_CAL_ADDR = 2, + AVR_LOCK_ADDR = 3, + AVR_FUSE_EXT_ADDR = 4, +}; + /* Flags for device features: */ /* Old command (LB1=b7, LB2=b6) for Read Lock and Fuse Bits. */ Index: src/AvrAtmel.C =================================================================== RCS file: /cvsroot/uisp/uisp/src/AvrAtmel.C,v retrieving revision 1.1 diff -u -r1.1 AvrAtmel.C --- src/AvrAtmel.C 25 May 2002 17:59:46 -0000 1.1 +++ src/AvrAtmel.C 1 Jun 2002 20:49:01 -0000 @@ -217,28 +217,29 @@ else if (segment==SEG_FUSE) { TByte readback = 0xff; switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_RD)) readback = ReadFuseLowBits(); + /* FIXME: TRoth/2002-06-01: Move this down to AVR_LOCK_ADDR case. */ else if (TestFeatures(AVR_LOCK_RD76)) readback = ReadLockFuseBits(); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) readback = ReadFuseHighBits(); else Info (1, "Cannot read high fuse bits on this device. Returning 0xff\n"); break; - case 2: + case AVR_CAL_ADDR: if (TestFeatures(AVR_CAL_RD)) readback = ReadCalByte(0); else Info (1, "Cannot read calibration byte on this device. Returning 0xff\n"); break; - case 3: + case AVR_LOCK_ADDR: readback = ReadLockBits(); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) readback = ReadFuseExtBits(); else @@ -300,26 +301,26 @@ Info(3, "Write fuse/lock: byte %d = 0x%02X\n", (int) addr, (int) byte); switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_NEWWR)) WriteFuseLowBits(byte); else if (TestFeatures(AVR_FUSE_OLDWR)) WriteOldFuseBits(byte); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) WriteFuseHighBits(byte); else Info (1, "Cannot write high fuse bits on this device"); break; /* calibration byte (addr == 2) is read only */ - case 2: + case AVR_CAL_ADDR: Info (1, "Cannot write calibration byte. It is read-only.\n"); break; - case 3: + case AVR_LOCK_ADDR: WriteLockBits(byte); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) WriteFuseExtBits(byte); } Index: src/AvrDummy.C =================================================================== RCS file: /cvsroot/uisp/uisp/src/AvrDummy.C,v retrieving revision 1.1 diff -u -r1.1 AvrDummy.C --- src/AvrDummy.C 25 May 2002 17:59:46 -0000 1.1 +++ src/AvrDummy.C 1 Jun 2002 20:49:01 -0000 @@ -159,24 +159,25 @@ readback = eeprom[3]; } else if (segment==SEG_FUSE) { switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_RD)) readback = ReadFuseLowBits(); + /* FIXME: TRoth/2002-06-01: Move this down to AVR_LOCK_ADDR case. */ else if (TestFeatures(AVR_LOCK_RD76)) readback = ReadLockFuseBits(); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) readback = ReadFuseHighBits(); break; - case 2: + case AVR_CAL_ADDR: if (TestFeatures(AVR_CAL_RD)) readback = ReadCalByte(0); break; - case 3: + case AVR_LOCK_ADDR: readback = ReadLockBits(); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) readback = ReadFuseExtBits(); } @@ -396,21 +397,23 @@ Info(3, "Write fuse/lock: byte %d = 0x%02X\n", (int) addr, (int) byte); switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_NEWWR)) WriteFuseLowBits(byte); else if (TestFeatures(AVR_FUSE_OLDWR)) WriteOldFuseBits(byte); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) WriteFuseHighBits(byte); break; - /* calibration byte (addr == 2) is read only */ - case 3: + case AVR_CAL_ADDR: + /* calibration byte (addr == 2) is read only */ + break; + case AVR_LOCK_ADDR: WriteLockBits(byte); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) WriteFuseExtBits(byte); } Index: src/Main.C =================================================================== RCS file: /cvsroot/uisp/uisp/src/Main.C,v retrieving revision 1.2 diff -u -r1.2 Main.C --- src/Main.C 27 May 2002 02:41:01 -0000 1.2 +++ src/Main.C 1 Jun 2002 20:49:02 -0000 @@ -75,9 +75,12 @@ " [-dserial=device] [-dpart=name|no]\n" " [-dspeed=1200|2400|4800|9600|19200|38400|57600|115200]" "\n" -" [--upload] [--verify] [--erase] [--lock] [if=input_file]\n" +" [--upload] [--verify] [--erase] [if=input_file]\n" " [--download] [of=output_file]\n" -" [--segment=flash|eeprom|fuse] [--terminal]\n\n" +" [--segment=flash|eeprom|fuse] [--terminal]\n" +" [--rd_fuses] [--wr_fuse_l=byte] [--wr_fuse_h=byte]\n" +" [--wr_fuse_e=byte]\n" +//" [--wr_lock=blb12,blb11,blb02,blb01,lb2,lb1]\n\n" "Programming Methods:\n" " -dprog=avr910 Standard Atmel Serial Programmer/Atmel Low Cost Programmer\n" " pavr http://avr.jpk.co.nz/pavr/pavr.html\n" @@ -125,9 +128,17 @@ " --verify Verify \"input_file\" (processed after the --upload opt.)\n" " --download Download AVR memory to \"output_file\" or stdout.\n" " --erase Erase device.\n" -" --lock Write lock bits.\n" " --segment Set active segment (auto-select for AVA Motorola output)\n" "\n" +"Fuse/Lock Bit Operations:\n" +" --rd_fuses Read all fuses and print values to stdout\n" +" --wr_fuse_l Write fuse low byte\n" +" --wr_fuse_h Write fuse high byte\n" +" --wr_fuse_e Write fuse extended byte\n" +//" --wr_lock Write lock bits. Argument is a comma separated list of\n" +//" 1 or more of blb12, blb11, blb02, blb01, lb2, or lb1\n" +" --lock Write lock bits.\n" // will go away soon (hopefully) +"\n" "Files:\n" " if Input file for the --upload and --verify functions in\n" " Motorola S-records (S1 or S2) or 16 bit Intel format\n" @@ -272,6 +283,94 @@ if (GetCmdParam("--verify", false)){motintl.Read(val, false, true);} } + if (GetCmdParam("--rd_fuses",false)) + { + const char *old_seg = device->TellActiveSegment(); + device->SetSegment("fuse"); + + printf("\n"); + printf("Fuse Low Byte = 0x%02x\n", device->ReadByte(AVR_FUSE_LOW_ADDR)); + printf("Fuse High Byte = 0x%02x\n", device->ReadByte(AVR_FUSE_HIGH_ADDR)); + printf("Fuse Extended Byte = 0x%02x\n", device->ReadByte(AVR_FUSE_EXT_ADDR)); + printf("Lock Bits = 0x%02x\n", device->ReadByte(AVR_LOCK_ADDR)); + printf("Calibration Byte = 0x%02x -- Read Only\n", + device->ReadByte(AVR_CAL_ADDR)); + printf("\n"); + + device->SetSegment(old_seg); + } + + if ((val=GetCmdParam("--wr_fuse_l")) != NULL) + { + unsigned int bits; + const char *old_seg = device->TellActiveSegment(); + device->SetSegment("fuse"); + + if (sscanf(val, "%x", &bits) == 1) + { + device->WriteByte( AVR_FUSE_LOW_ADDR, (TByte)bits ); + printf("\nFuse Low Byte set to 0x02x\n", (TByte)bits); + } + else + throw Error_Device("Invalid argument for --wr_fuse_l."); + + device->SetSegment(old_seg); + } + + if ((val=GetCmdParam("--wr_fuse_h")) != NULL) + { + unsigned int bits; + const char *old_seg = device->TellActiveSegment(); + device->SetSegment("fuse"); + + if (sscanf(val, "%x", &bits) == 1) + { + device->WriteByte( AVR_FUSE_HIGH_ADDR, (TByte)bits ); + printf("\nFuse High Byte set to 0x02x\n", (TByte)bits); + } + else + throw Error_Device("Invalid argument for --wr_fuse_h."); + + device->SetSegment(old_seg); + } + + if ((val=GetCmdParam("--wr_fuse_e")) != NULL) + { + unsigned int bits; + const char *old_seg = device->TellActiveSegment(); + device->SetSegment("fuse"); + + if (sscanf(val, "%x", &bits) == 1) + { + device->WriteByte( AVR_FUSE_EXT_ADDR, (TByte)bits ); + printf("\nFuse Extended Byte set to 0x02x\n", (TByte)bits); + } + else + throw Error_Device("Invalid argument for --wr_fuse_e."); + + device->SetSegment(old_seg); + } + +#ifdef TROTH_NEW_WR_LOCK_BITS + /* FIXME: TRoth/2002-06-01: I need to put a lot more thought into how + setting the lock bits works. */ + + if ((val=GetCmdParam("--wr_lock")) != NULL) + { + unsigned int bits; + + if (sscanf(val, "%x", &bits) == 1) + { + device->WriteLockBits( (TByte)bits ); + printf("\nLock Bits set to 0x02x\n", (TByte)bits); + } + else + throw Error_Device("Invalid argument for --wr_lock."); + } +#endif + + /* TRoth/2002-06-01: This will go away when the above is properly + implemented. */ if (GetCmdParam("--lock", false)){device->WriteLockBits(0xFC);} /* enter terminal */ Index: src/Stk500.C =================================================================== RCS file: /cvsroot/uisp/uisp/src/Stk500.C,v retrieving revision 1.5 diff -u -r1.5 Stk500.C --- src/Stk500.C 30 May 2002 17:10:05 -0000 1.5 +++ src/Stk500.C 1 Jun 2002 20:49:02 -0000 @@ -166,34 +166,35 @@ { switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_RD)) val = ReadFuseLowBits(); + /* FIXME: TRoth/2002-06-01: Move this down to AVR_LOCK_ADDR case. */ else if (TestFeatures(AVR_LOCK_RD76)) val = ReadLockFuseBits(); else Info (1, "Cannot read low fuse bits on this device. Returning 0xff\n"); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) val = ReadFuseHighBits(); else Info (1, "Cannot read high fuse bits on this device. Returning 0xff\n"); break; - case 2: + case AVR_CAL_ADDR: if (TestFeatures(AVR_CAL_RD)) val = ReadCalFuseBits(0); else Info (1, "Cannot read calibration byte on this device. Returning 0xff\n"); break; - case 3: + case AVR_LOCK_ADDR: val = ReadLockFuseBits(); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) val = ReadFuseExtBits(); else @@ -222,7 +223,7 @@ { switch (addr) { - case 0: + case AVR_FUSE_LOW_ADDR: if (TestFeatures(AVR_FUSE_RD)) WriteFuseLowBits(byte); else if (TestFeatures(AVR_LOCK_RD76)) @@ -231,14 +232,14 @@ Info (1, "Cannot write low fuse bits on this device.\n"); break; - case 1: + case AVR_FUSE_HIGH_ADDR: if (TestFeatures(AVR_FUSE_HIGH)) WriteFuseHighBits(byte); else Info (1, "Cannot write high fuse bits on this device.\n"); break; - case 2: + case AVR_CAL_ADDR: /* TRoth/2002-05-29: Can any device write the cal byte? */ // if (TestFeatures(AVR_CAL_RD)) @@ -247,13 +248,13 @@ // Info (1, "Cannot write calibration byte on this device.\n"); break; - case 3: + case AVR_LOCK_ADDR: /* FIXME: TRoth/2002-05-29: Should there be a feature test here? This will be a duplicate operation if AVR_LOCK_RD76 is set. */ WriteLockFuseBits(byte); break; - case 4: + case AVR_FUSE_EXT_ADDR: if (TestFeatures(AVR_FUSE_EXT)) WriteFuseExtBits(byte); else