static int dlc5_get_tdo( cable_t *cable ) { parport_set_data( cable->link.port, (1 << PROG) | ( 0 << TCK ) ); PARAM_SIGNALS(cable) &= ~(CS_TDI | CS_TCK | CS_TMS); cable_wait( cable ); return (parport_get_status( cable->link.port ) >> TDO) & 1; }
static int dlc5_init( cable_t *cable ) { if (parport_open( cable->link.port )) return -1; PARAM_SIGNALS(cable) = CS_TRST; return 0; }
static void dlc5_clock( cable_t *cable, int tms, int tdi, int n ) { int i; tms = tms ? 1 : 0; tdi = tdi ? 1 : 0; for (i = 0; i < n; i++) { parport_set_data( cable->link.port, (1 << PROG) | (0 << TCK) | (tms << TMS) | (tdi << TDI) ); cable_wait( cable ); parport_set_data( cable->link.port, (1 << PROG) | (1 << TCK) | (tms << TMS) | (tdi << TDI) ); cable_wait( cable ); } PARAM_SIGNALS(cable) &= CS_TRST; PARAM_SIGNALS(cable) |= CS_TCK; PARAM_SIGNALS(cable) |= tms ? CS_TMS : 0; PARAM_SIGNALS(cable) |= tdi ? CS_TDI : 0; }
static int dlc5_set_signal( cable_t *cable, int mask, int val ) { int prev_sigs = PARAM_SIGNALS(cable); mask &= (CS_TDI | CS_TCK | CS_TMS); // only these can be modified if (mask != 0) { int data = 0; int sigs = (prev_sigs & ~mask) | (val & mask); data |= (sigs & CS_TDI) ? (1 << TDI) : 0; data |= (sigs & CS_TCK) ? (1 << TCK) : 0; data |= (sigs & CS_TMS) ? (1 << TMS) : 0; parport_set_data( cable->link.port, ( 1 << PROG ) | data ); PARAM_SIGNALS(cable) = sigs; } return prev_sigs; }
static int triton_init (urj_cable_t *cable) { if (urj_tap_parport_open (cable->link.port) != URJ_STATUS_OK) return URJ_STATUS_FAIL; PARAM_SIGNALS (cable) = URJ_POD_CS_TRST | URJ_POD_CS_RESET; urj_tap_parport_set_data (cable->link.port, (1 << TRST) | (1 << SRESET)); return URJ_STATUS_OK; }
static int triton_get_tdo (urj_cable_t *cable) { int trst = (PARAM_SIGNALS (cable) & URJ_POD_CS_TRST) ? 1 : 0; int sreset = (PARAM_SIGNALS (cable) & URJ_POD_CS_RESET) ? 1 : 0; int status; urj_tap_parport_set_data (cable->link.port, (trst << TRST) | (sreset << SRESET) | (0 << TCK)); PARAM_SIGNALS (cable) &= ~(URJ_POD_CS_TDI | URJ_POD_CS_TCK | URJ_POD_CS_TMS); urj_tap_cable_wait (cable); status = urj_tap_parport_get_status (cable->link.port); if (status == -1) return status; return (status >> TDO) & 1; }
static void triton_clock (urj_cable_t *cable, int tms, int tdi, int n) { int i; int trst = (PARAM_SIGNALS (cable) & URJ_POD_CS_TRST) ? 1 : 0; int sreset = (PARAM_SIGNALS (cable) & URJ_POD_CS_RESET) ? 1 : 0; tms = tms ? 1 : 0; tdi = tdi ? 1 : 0; for (i = 0; i < n; i++) { urj_tap_parport_set_data (cable->link.port, (trst << TRST) | (sreset << SRESET) | (0 << TCK) | (tms << TMS) | (tdi << TDI)); urj_tap_cable_wait (cable); urj_tap_parport_set_data (cable->link.port, (trst << TRST) | (sreset << SRESET) | (1 << TCK) | (tms << TMS) | (tdi << TDI)); urj_tap_cable_wait (cable); } PARAM_SIGNALS (cable) &= (URJ_POD_CS_TRST | URJ_POD_CS_RESET); PARAM_SIGNALS (cable) |= URJ_POD_CS_TCK; PARAM_SIGNALS (cable) |= tms ? URJ_POD_CS_TMS : 0; PARAM_SIGNALS (cable) |= tdi ? URJ_POD_CS_TDI : 0; }
static int triton_set_signal (urj_cable_t *cable, int mask, int val) { int prev_sigs = PARAM_SIGNALS (cable); mask &= (URJ_POD_CS_TDI | URJ_POD_CS_TCK | URJ_POD_CS_TMS | URJ_POD_CS_TRST | URJ_POD_CS_RESET); // only these can be modified if (mask != 0) { int data = 0; int sigs = (PARAM_SIGNALS (cable) & ~mask) | (val & mask); data |= (sigs & URJ_POD_CS_TDI) ? (1 << TDI) : 0; data |= (sigs & URJ_POD_CS_TCK) ? (1 << TCK) : 0; data |= (sigs & URJ_POD_CS_TMS) ? (1 << TMS) : 0; data |= (sigs & URJ_POD_CS_TRST) ? (1 << TRST) : 0; data |= (sigs & URJ_POD_CS_RESET) ? (1 << SRESET) : 0; urj_tap_parport_set_data (cable->link.port, data); PARAM_SIGNALS (cable) = sigs; } return prev_sigs; }