Beginnings of info flash support. It isn't very good.
[goodfet] / firmware / apps / jtag / jtag.c
index cf9199d..d0d2118 100644 (file)
@@ -1,10 +1,6 @@
 /*! \file jtag.c
   \author Travis Goodspeed <travis at radiantmachines.com>
-  
-  This is an implementation of the low-level JTAG functions
-  for the GoodFET project at http://goodfet.sf.net/
-  
-  See the license file for details of proper use.
+  \brief Low-level JTAG
 */
 
 
 void jtagsetup(){
   P5DIR|=MOSI+SCK+TMS;
   P5DIR&=~MISO;
+  /*
   P5OUT|=0xFFFF;
   P5OUT=0;
+  */
   P4DIR|=TST;
   P2DIR|=RST;
   msdelay(100);
@@ -40,20 +38,17 @@ unsigned char jtagtrans8(unsigned char byte){
     if(bit==7)
       SETTMS;//TMS high on last bit to exit.
     
-    CLRTCK;
-    SETTCK;
-     /* read MISO on trailing edge */
+    TCKTOCK;
+    /* read MISO on trailing edge */
     byte |= READMISO;
   }
   RESTORETCLK;
   
   // exit state
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // update state
   CLRTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   
   return byte;
 }
@@ -63,7 +58,7 @@ unsigned long jtagtransn(unsigned long word,
                         unsigned int bitcount){
   unsigned int bit;
   //0x8000
-  unsigned long high;
+  unsigned long high=0x8000;
   
   if(bitcount==20)
     high=0x80000;
@@ -83,8 +78,7 @@ unsigned long jtagtransn(unsigned long word,
     if(bit==bitcount-1)
       SETTMS;//TMS high on last bit to exit.
     
-    CLRTCK;
-    SETTCK;
+    TCKTOCK;
     /* read MISO on trailing edge */
     word |= READMISO;
   }
@@ -96,50 +90,14 @@ unsigned long jtagtransn(unsigned long word,
   RESTORETCLK;
   
   // exit state
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // update state
   CLRTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   
   return word;
 }
 
-/*
-//! Shift 16 bits in and out.
-unsigned int jtagtrans16(unsigned int word){ //REMOVEME
-  unsigned int bit;
-  SAVETCLK;
-  
-  for (bit = 0; bit < 16; bit++) {
-    // write MOSI on trailing edge of previous clock 
-    if (word & 0x8000)
-      {SETMOSI;}
-    else
-      {CLRMOSI;}
-    word <<= 1;
-    
-    if(bit==15)
-      SETTMS;//TMS high on last bit to exit.
-    
-    CLRTCK;
-    SETTCK;
-    // read MISO on trailing edge 
-    word |= READMISO;
-  }
-  RESTORETCLK;
-  
-  // exit state
-  CLRTCK;
-  SETTCK;
-  // update state
-  CLRTMS;
-  CLRTCK;
-  SETTCK;
-  
-  return word;
-}*/
 
 //! Stop JTAG, release pins
 void jtag_stop(){
@@ -147,20 +105,17 @@ void jtag_stop(){
   P4OUT=0;
 }
 
-unsigned int drwidth=20;
+unsigned int drwidth=16;
 //! Shift all bits of the DR.
 unsigned long jtag_dr_shift20(unsigned long in){
   // idle
   SETTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // select DR
   CLRTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // capture IR
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   
   // shift DR, then idle
   return(jtagtransn(in,20));
@@ -171,37 +126,50 @@ unsigned long jtag_dr_shift20(unsigned long in){
 unsigned int jtag_dr_shift16(unsigned int in){
   // idle
   SETTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // select DR
   CLRTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // capture IR
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   
   // shift DR, then idle
   return(jtagtransn(in,16));
 }
 
+//! Shift native width of the DR
+unsigned long jtag_dr_shiftadr(unsigned long in){
+  unsigned long out=0;
+  
+  // idle
+  SETTMS;
+  TCKTOCK;
+  // select DR
+  CLRTMS;
+  TCKTOCK;
+  // capture IR
+  TCKTOCK;
+
+  
+  out=jtagtransn(in,drwidth);
+  
+  // shift DR, then idle
+  return(out);
+}
+
 
 //! Shift 8 bits of the IR.
 unsigned char jtag_ir_shift8(unsigned char in){
   // idle
   SETTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // select DR
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // select IR
   CLRTMS;
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   // capture IR
-  CLRTCK;
-  SETTCK;
+  TCKTOCK;
   
   // shift IR, then idle.
   return(jtagtrans8(in));
@@ -210,7 +178,7 @@ unsigned char jtag_ir_shift8(unsigned char in){
 //! Handles a monitor command.
 void jtaghandle(unsigned char app,
               unsigned char verb,
-              unsigned char len){
+              unsigned long len){
   switch(verb){
     //START handled by specific JTAG
   case STOP: