Files
raspberrypi/jtagproxy/msplaunchpad/jtagproxy.c
David Welch 259ad3212e This is a bit silly and fun, using an msp430 board, and taking jtag over serial
to debug programs on the raspberry pi.  It is slow but it happens to work
2012-07-07 01:32:59 -04:00

245 lines
6.2 KiB
C

#define USE_MSP_UART
//promicro board JP6 (right side)
//1
//2 gnd Awire
//3 reset
//4 vcc
//5
//6
//7
//8
//9 sck
//10 miso
//11 mosi
//12
//msp
//p1.4 to mosi
//p1.5 to miso
//p1.6 to sck
//p1.7 to reset
extern void asmdelay ( unsigned short );
#define WDTCTL (*((volatile unsigned short *)0x0120))
#define CALBC1_1MHZ (*((volatile unsigned char *)0x10FF))
#define CALDCO_1MHZ (*((volatile unsigned char *)0x10FE))
#define CALBC1_8MHZ (*((volatile unsigned char *)0x10FD))
#define CALDCO_8MHZ (*((volatile unsigned char *)0x10FC))
#define CALBC1_12MHZ (*((volatile unsigned char *)0x10FB))
#define CALDCO_12MHZ (*((volatile unsigned char *)0x10FA))
#define CALBC1_16MHZ (*((volatile unsigned char *)0x10F9))
#define CALDCO_16MHZ (*((volatile unsigned char *)0x10F8))
#define DCOCTL (*((volatile unsigned char *)0x56))
#define BCSCTL1 (*((volatile unsigned char *)0x57))
#define BCSCTL2 (*((volatile unsigned char *)0x58))
#define TACTL (*((volatile unsigned short *)0x0160))
#define TAR (*((volatile unsigned short *)0x0170))
#define TACCR0 (*((volatile unsigned short *)0x0172))
#define TACCTL0 (*((volatile unsigned short *)0x0162))
#ifdef USE_MSP_UART
#define UCA0CTL0 (*((volatile unsigned char *)0x060 ))
#define UCA0CTL1 (*((volatile unsigned char *)0x061 ))
#define UCA0BR0 (*((volatile unsigned char *)0x062 ))
#define UCA0BR1 (*((volatile unsigned char *)0x063 ))
#define UCA0MCTL (*((volatile unsigned char *)0x064 ))
#define UCA0STAT (*((volatile unsigned char *)0x065 ))
#define UCA0RXBUF (*((volatile unsigned char *)0x066 ))
#define UCA0TXBUF (*((volatile unsigned char *)0x067 ))
#define UCA0ABCTL (*((volatile unsigned char *)0x05D ))
#define UCA0IRTCTL (*((volatile unsigned char *)0x05E ))
#define UCA0IRRCTL (*((volatile unsigned char *)0x05F ))
#define IE2 (*((volatile unsigned char *)0x001 ))
#define UCA0IFG (*((volatile unsigned char *)0x003 ))
#endif
#define P1IN (*((volatile unsigned char *)0x0020))
#define P1OUT (*((volatile unsigned char *)0x0021))
#define P1DIR (*((volatile unsigned char *)0x0022))
#define P1REN (*((volatile unsigned char *)0x0027))
#define P1SEL (*((volatile unsigned char *)0x0026))
#define P1SEL2 (*((volatile unsigned char *)0x0041))
#define P2IN (*((volatile unsigned char *)0x0028))
#define P2OUT (*((volatile unsigned char *)0x0029))
#define P2DIR (*((volatile unsigned char *)0x002A))
#define P2REN (*((volatile unsigned char *)0x002F))
#define P2SEL (*((volatile unsigned char *)0x002E))
#define P2SEL2 (*((volatile unsigned char *)0x0042))
//TRST output p2.0
//TDI output p2.1
//TMS output p2.2
//TCK output p2.3
//TDO input p2.4
//SRST output p2.5
#define PIN_TRST 0
#define PIN_TDI 1
#define PIN_TMS 2
#define PIN_TCK 3
#define PIN_TDO 4
#define PIN_SRST 5
//-------------------------------------------------------------------
void uart_init ( void )
{
BCSCTL2 &=~0x06;
UCA0CTL0 = 0x00;
UCA0CTL1 = 0xC0;
UCA0BR0 = 0x08;
UCA0BR1 = 0x00;
UCA0MCTL = 0xB1;
UCA0STAT = 0x00;
UCA0ABCTL = 0x00;
IE2 = 0x00;
P1SEL |= 0x06;
P1SEL2 |= 0x06;
}
//-------------------------------------------------------------------
void uart_putc ( unsigned char c )
{
while((UCA0IFG&0x02)==0) continue;
UCA0TXBUF=c;
}
//-------------------------------------------------------------------
unsigned char uart_getc ( void )
{
while((UCA0IFG&0x01)==0) continue;
return(UCA0RXBUF);
}
//-------------------------------------------------------------------
void hexstrings ( unsigned short d )
{
//unsigned short ra;
unsigned short rb;
unsigned short rc;
rb=16;
while(1)
{
rb-=4;
rc=(d>>rb)&0xF;
if(rc>9) rc+=0x37; else rc+=0x30;
uart_putc(rc);
if(rb==0) break;
}
uart_putc(0x20);
}
//-------------------------------------------------------------------
void hexstring ( unsigned short d )
{
#ifdef USE_MSP_UART
hexstrings(d);
uart_putc(0x0D);
uart_putc(0x0A);
#endif
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
#define SET_MOSI P1OUT|=(1<<AVR_MOSI_PIN)
#define SET_SCK P1OUT|=(1<<AVR_SCK_PIN)
#define SET_RESET P1OUT|=(1<<AVR_RESET_PIN)
#define CLR_MOSI P1OUT&=~(1<<AVR_MOSI_PIN)
#define CLR_SCK P1OUT&=~(1<<AVR_SCK_PIN)
#define CLR_RESET P1OUT&=~(1<<AVR_RESET_PIN)
#define DELX 5
////-------------------------------------------------------------------
//unsigned short pdi_command ( unsigned short upper, unsigned short lower )
//{
//unsigned short ra,rb,rc;//,rd;
////hexstrings(upper); hexstring(lower);
//rb=upper;
//rc=0x0000;
////rd=0x0000;
//asmdelay(DELX);
//for(ra=0;ra<32;ra++)
//{
//if(ra==16)
//{
//rb=lower;
////rd=rc;
//}
//if(rb&0x8000) SET_MOSI; else CLR_MOSI; rb<<=1;
//rc<<=1; if(P1IN&(1<<AVR_MISO_PIN)) rc|=1;
//asmdelay(DELX);
//SET_SCK;
//asmdelay(DELX);
//asmdelay(DELX);
//CLR_SCK;
//asmdelay(DELX);
//}
//asmdelay(DELX);
////hexstrings(rd); hexstring(rc);
//return(rc);
//}
//-------------------------------------------------------------------
void longerdelay ( unsigned short a, unsigned short b )
{
unsigned short ra;
for(ra=0;ra<a;ra++) asmdelay(b);
}
//-------------------------------------------------------------------
int notmain ( void )
{
unsigned short ra;
unsigned short rb;
WDTCTL = 0x5A80;
// use calibrated clock
DCOCTL = 0x00;
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
uart_init();
ra=UCA0RXBUF;
P2DIR|=(1<<PIN_TRST) | (1<<PIN_TDI ) | (1<<PIN_TMS ) | (1<<PIN_TCK ) | (1<<PIN_SRST) ;
P2DIR&=~(1<<PIN_TDO);
P2OUT|=(1<<PIN_TRST) | (1<<PIN_SRST) ;
P2OUT&=(1<<PIN_TDI ) | (1<<PIN_TMS ) | (1<<PIN_TCK ) ;
while(1)
{
ra=uart_getc();
if(ra==0xFF)
{
rb=P2IN&(1<<PIN_TDO);
uart_putc(rb);
}
else
{
P2OUT=ra&0x2F;
}
}
return(0);
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------