chipcon 1111 flash fixes, arm7 jtag fixes and improvements
authordodge-this <dodge-this@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Fri, 3 Sep 2010 17:00:20 +0000 (17:00 +0000)
committerdodge-this <dodge-this@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Fri, 3 Sep 2010 17:00:20 +0000 (17:00 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@719 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFETARM7.py
client/GoodFETCC.py
firmware/apps/chipcon/chipcon.c
firmware/apps/jtag/jtagarm7.c
firmware/include/jtagarm7.h

index 9eb7d0d..81a8aef 100644 (file)
@@ -40,7 +40,7 @@ OK    = 0x7F
 IR_SHIFT =                  0x80
 DR_SHIFT =                  0x81
 RESETTAP =                  0x82
-RESETTARGET =               0x86
+RESETTARGET =               0x83
 GET_REGISTER =              0x87
 SET_REGISTER =              0x88
 DEBUG_INSTR =               0x89
@@ -504,6 +504,7 @@ class GoodFETARM(GoodFET):
         WARNING: Addresses must be word-aligned!
         """
         regs = self.ARMget_registers()
+        self.ARMset_registers([0xdeadbeef for x in xrange(14)], 0xe)
         output = []
         count = wordcount
         while (wordcount > 0):
@@ -575,7 +576,28 @@ class GoodFETARM(GoodFET):
                   0x02 : "force dbgrq",
                   0x01 : "force dbgack"
                   }
-                  
+    def ARMgetChipID(self):
+        chipid = self.ARMreadMem(SF_CHIP_ID,1)
+        return chipid[0]
+    def ARMwriteFirmware(self, firmware):
+        self.halt()
+        chipid = self.ARMgetChipID()
+        # FIXME: initialize PLL or EBI
+        self.ARMmassErase(chipid)
+        self.ARMset_regCPSR(PM_svc)   # set supervisor mode
+        # FIXME: download the "flash identifier" program into target RAM
+        self.ARMsetPC(PROGGYBASE)
+        self.release()
+        # get manufacturer crap through DCC (really??  screw this...)
+        self.halt()
+        if (self.ARMget_regCPSR() & PM_svc != PM_svc):
+            raise Exception("No longer in Supervisor mode after firmware upload")
+        # FIXME: download the downloader program into target RAM
+        self.ARMsetPC(PROGGYBASE)
+        self.release()
+        # FIXME: use DCC to upload the new firmware
+    def ARMresettarget(self, delay=10):
+        return self.writecmd(0x13,RESETTARGET,2, [ delay&0xff, (delay>>8)&0xff ] )
     def ARMchain0(self, address, bits=0x819684c054, data=0):
         bulk = chop(address,4)
         bulk.extend(chop(bits,8))
index 344d9a5..e6016fc 100644 (file)
@@ -169,6 +169,7 @@ class GoodFETCC(GoodFET):
     
 
     CCversions={0x0100:"cc1110",
+                0x1100:"cc1111",
                 0x8500:"cc2430",
                 0x8900:"cc2431",
                 0x8100:"cc2510",
@@ -177,6 +178,7 @@ class GoodFETCC(GoodFET):
                 0xB500:"cc2531",
                 0xFF00:"CCmissing"};
     CCpagesizes={0x01: 1024, #"CC1110",
+                 0x11: 1024, #"CC1111",
                  0x85: 2048, #"CC2430",
                  0x89: 2048, #"CC2431",
                  0x81: 1024, #"CC2510",
@@ -189,7 +191,8 @@ class GoodFETCC(GoodFET):
     def CCidentstr(self):
         ident=self.CCident();
         chip=self.CCversions.get(ident&0xFF00);
-        return "%s/r%02x" % (chip, ident&0xFF); 
+        pagesize=self.CCpagesizes.get(ident>0xFF);
+        return "%s/r%0.4x/ps0x%0.4x" % (chip, ident,pagesize); 
     def CCident(self):
         """Get a chipcon's ID."""
         self.writecmd(self.APP,0x8B,0,None);
@@ -203,7 +206,7 @@ class GoodFETCC(GoodFET):
         size=self.CCpagesizes.get(chip);
         if(size<10):
             print "ERROR: Pagesize undefined.";
-            print "chip=%02x" %chip;
+            print "chip=%0.4x" %chip;
             sys.exit(1);
             #return 2048;
         return size;
index 4b0e0df..d2f70ac 100644 (file)
@@ -344,6 +344,7 @@ unsigned short cc_get_chip_id(){
   //Find the flash word size.
   switch(cmddata[0]){
   case 0x01://CC1110
+  case 0x11://CC1111
   case 0x81://CC2510
   case 0x91://CC2511
     //debugstr("2 bytes/flash word");
index c0dda8d..f674510 100644 (file)
@@ -284,9 +284,12 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len
     txdata(app,verb,4);
     break;
   case JTAG_RESETTARGET:
+    //FIXME: BORKEN
+    debugstr("RESET TARGET");
     CLRTST;
-    delay(10);
+    delay(cmddataword[0]);
     SETTST;
+    txdata(app,verb,4);
     break;
 
 
index 921deea..38555b8 100644 (file)
@@ -86,7 +86,6 @@ The least significant bit of the instruction register is scanned in and scanned
 
 
 //JTAGARM7TDMI commands
-#define JTAGARM7_RESETTARGET                0x86
 #define JTAGARM7_GET_REGISTER               0x87
 #define JTAGARM7_SET_REGISTER               0x88
 #define JTAGARM7_DEBUG_INSTR                0x89