-//GoodFET JTAG Application
-//Handles basic I/O
+/*! \file jtag.c
+ \author Travis Goodspeed <travis at radiantmachines.com>
+ \brief Low-level JTAG
+*/
-//Higher level left to client application.
#include "platform.h"
#include "command.h"
P5DIR|=MOSI+SCK+TMS;
P5DIR&=~MISO;
P5OUT|=0xFFFF;
+ P5OUT=0;
P4DIR|=TST;
P2DIR|=RST;
+ msdelay(100);
}
int savedtclk=0;
unsigned long jtagtransn(unsigned long word,
unsigned int bitcount){
unsigned int bit;
+ //0x8000
+ unsigned long high=0x8000;
+
+ if(bitcount==20)
+ high=0x80000;
+ if(bitcount==16)
+ high= 0x8000;
+
SAVETCLK;
for (bit = 0; bit < bitcount; bit++) {
/* write MOSI on trailing edge of previous clock */
- if (word & 0x8000)
+ if (word & high)
{SETMOSI;}
else
{CLRMOSI;}
/* read MISO on trailing edge */
word |= READMISO;
}
- RESTORETCLK;
-
- // exit state
- CLRTCK;
- SETTCK;
- // update state
- CLRTMS;
- CLRTCK;
- SETTCK;
- 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;
+ if(bitcount==20){
+ word = ((word << 16) | (word >> 4)) & 0x000FFFFF;
}
+
RESTORETCLK;
// exit state
SETTCK;
return word;
-}*/
+}
+
//! Stop JTAG, release pins
void jtag_stop(){
unsigned int drwidth=20;
//! Shift all bits of the DR.
-unsigned long jtag_dr_shift(unsigned long in){
+unsigned long jtag_dr_shift20(unsigned long in){
// idle
SETTMS;
CLRTCK;
SETTCK;
// shift DR, then idle
- return(jtagtransn(in,drwidth));
+ return(jtagtransn(in,20));
}
//! Shift 16 bits of the DR.
unsigned int jtag_dr_shift16(unsigned int in){
- //This name is deprecated, kept around to find 16-bit dependent code.
- return jtag_dr_shift(in);
+ // idle
+ SETTMS;
+ CLRTCK;
+ SETTCK;
+ // select DR
+ CLRTMS;
+ CLRTCK;
+ SETTCK;
+ // capture IR
+ CLRTCK;
+ SETTCK;
+
+ // shift DR, then idle
+ return(jtagtransn(in,16));
}
//! 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: