Files
kernel-tenderloin-3.0/drivers/misc/a6/low_level_funcs.c
2012-02-26 16:42:59 -06:00

242 lines
5.8 KiB
C

#include "a6_host_adapter.h"
#include "low_level_funcs.h"
// declarations for active implementation mappings used by the sbw code...
extern uint16_t (*SetSBWTCK)(void);
extern uint16_t (*ClrSBWTCK)(void);
extern uint16_t (*SetSBWTDIO)(void);
extern uint16_t (*ClrSBWTDIO)(void);
extern uint16_t (*SetInSBWTDIO)(void);
extern uint16_t (*SetOutSBWTDIO)(void);
extern uint16_t (*GetSBWTDIO)(void);
extern uint16_t (*SetSBWAKEUP)(void);
extern uint16_t (*ClrSBWAKEUP)(void);
extern void (*delay)(uint32_t delay_us);
//
byte tdo_bit; //holds the value of TDO-bit
byte TCLK_saved = 1; // holds the last value of TCLK before entering a JTAG sequence
/****************************************************************************/
/* Function declarations which have to be programmed by the user for use */
/* with hosts other than the MSP430F149. */
/* */
/* The following MSP430F149-specific code can be used as a reference as to */
/* how to implement the required JTAG communication on additional hosts. */
/****************************************************************************/
//-------------------------------
// combinations of sbw-cycles (TMS, TDI, TDO)
void TMSL_TDIL(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSL TDIL TDOsbw
EnableInterrupts(flags);
}
//---------------------------------
void TMSH_TDIL(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSH TDIL TDOsbw
EnableInterrupts(flags);
}
//------------------------------------
void TMSL_TDIH(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSL TDIH TDOsbw
EnableInterrupts(flags);
}
//-------------------------------------
void TMSH_TDIH(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSH TDIH TDOsbw
EnableInterrupts(flags);
}
//------------------------------------
void TMSL_TDIH_TDOrd(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSL TDIH TDO_RD
EnableInterrupts(flags);
}
//------------------------------------
void TMSL_TDIL_TDOrd(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSL TDIL TDO_RD
EnableInterrupts(flags);
}
//------------------------------------
void TMSH_TDIH_TDOrd(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSH TDIH TDO_RD
EnableInterrupts(flags);
}
//------------------------------------
void TMSH_TDIL_TDOrd(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
TMSH TDIL TDO_RD
EnableInterrupts(flags);
}
//----------------------------------------------
// enters with TCLK_saved and exits with TCLK = 0
void ClrTCLK_sbw(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
if (TCLK_saved)
{
TMSLDH
}
else
{
TMSL
}
ClrSBWTDIO();
TDIL TDOsbw //ExitTCLK
TCLK_saved = 0;
EnableInterrupts(flags);
}
//----------------------------------------------
// enters with TCLK_saved and exits with TCLK = 1
void SetTCLK_sbw(void)
{
unsigned long flags = 0;
DisableInterrupts(flags);
if (TCLK_saved)
{
TMSLDH
}
else
{
TMSL
}
SetSBWTDIO();
TDIH TDOsbw //ExitTCLK
TCLK_saved = 1;
EnableInterrupts(flags);
}
//----------------------------------------------------------------------------
/* Shift a value into TDI (MSB first) and simultaneously shift out a value
from TDO (MSB first).
Arguments: word Format (number of bits shifted, 8 (F_BYTE), 16 (F_WORD),
20 (F_ADDR) or 32 (F_LONG))
unsigned long Data (data to be shifted into TDI)
Result: unsigned long (scanned TDO value)
*/
unsigned long AllShifts(word Format, unsigned long Data)
{
unsigned long TDOword = 0x00000000;
unsigned long MSB = 0x00000000;
word i;
//unsigned long flags = 0;
//DisableInterrupts(flags);
switch(Format)
{
case F_BYTE: MSB = 0x00000080;
break;
case F_WORD: MSB = 0x00008000;
break;
case F_ADDR: MSB = 0x00080000;
break;
case F_LONG: MSB = 0x80000000;
break;
default: // this is an unsupported format, function will just return 0
//EnableInterrupts(flags);
return TDOword;
}
// shift in bits
for (i = Format; i > 0; i--)
{
if (i == 1) // last bit requires TMS=1; TDO one bit before TDI
{
((Data & MSB) == 0) ? TMSH_TDIL_TDOrd() : TMSH_TDIH_TDOrd();
}
else
{
((Data & MSB) == 0) ? TMSL_TDIL_TDOrd() : TMSL_TDIH_TDOrd();
}
Data <<= 1;
if (tdo_bit)
TDOword++;
if (i > 1)
TDOword <<= 1; // TDO could be any port pin
}
TMSH_TDIH(); // update IR
if (TCLK_saved)
{
TMSL_TDIH();
}
else
{
TMSL_TDIL();
}
// de-scramble bits on a 20bit shift
if(Format == F_ADDR)
{
TDOword = ((TDOword << 16) + (TDOword >> 4)) & 0x000FFFFF;
}
//EnableInterrupts(flags);
return(TDOword);
}
void DrvSignals(void)
{
SetSBWTDIO();
ClrSBWTCK();
}
void RlsSignals(void)
{
SetSBWTDIO();
ClrSBWTCK();
}
void InitTarget(void)
{
DrvSignals();
}
void ReleaseTarget(void)
{
RlsSignals();
}
/****************************************************************************/
/* END OF SOURCE FILE */
/****************************************************************************/