/* External interface functions */
static int opendous_execute_queue(void);
-static int opendous_speed(int speed);
-static int opendous_speed_div(int speed, int *khz);
-static int opendous_khz(int khz, int *jtag_speed);
static int opendous_init(void);
static int opendous_quit(void);
.name = "opendous",
.commands = opendous_command_handlers,
.execute_queue = opendous_execute_queue,
- .speed = opendous_speed,
- .speed_div = opendous_speed_div,
- .khz = opendous_khz,
.init = opendous_init,
.quit = opendous_quit,
};
return opendous_tap_execute();
}
-/* Sets speed in kHz. */
-static int opendous_speed(int speed)
-{
- if (speed <= OPENDOUS_MAX_SPEED) {
- /* one day... */
- return ERROR_OK;
- } else
- LOG_INFO("Requested speed %dkHz exceeds maximum of %dkHz, ignored", speed, OPENDOUS_MAX_SPEED);
-
- return ERROR_OK;
-}
-
-static int opendous_speed_div(int speed, int *khz)
-{
- *khz = speed;
-
- return ERROR_OK;
-}
-
-static int opendous_khz(int khz, int *jtag_speed)
-{
- *jtag_speed = khz;
- /* TODO: convert this into delay value for opendous */
-
- return ERROR_OK;
-}
-
static int opendous_init(void)
{
int check_cnt;
/* Move to appropriate scan state */
opendous_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
- opendous_state_move();
+ if (tap_get_state() != tap_get_end_state())
+ opendous_state_move();
+
opendous_end_state(saved_end_state);
/* Scan */
DEBUG_JTAG_IO("0x%02x 0x%02x", command, _data);
- usb_out_buffer[0] = (uint16_t) 2;
+ usb_out_buffer[0] = 2;
+ usb_out_buffer[1] = 0;
usb_out_buffer[2] = command;
usb_out_buffer[3] = _data;
void opendous_tap_ensure_space(int scans, int bits)
{
int available_scans = MAX_PENDING_SCAN_RESULTS - pending_scan_results_length;
+ int available_bits = OPENDOUS_TAP_BUFFER_SIZE / 2 - tap_length;
- if (scans > available_scans)
+ if ((scans > available_scans) || (bits > available_bits))
opendous_tap_execute();
}
unsigned char _tms = tms ? 1 : 0;
unsigned char _tdi = tdi ? 1 : 0;
+ opendous_tap_ensure_space(0, 1);
+
int tap_index = tap_length / 4;
int bits = (tap_length % 4) * 2;
for (j = 0, i = 0; j < byte_length;) {
- int recieve;
+ int receive;
int transmit = byte_length - j;
if (transmit > OPENDOUS_MAX_TAP_TRANSMIT) {
transmit = OPENDOUS_MAX_TAP_TRANSMIT;
- recieve = (OPENDOUS_MAX_TAP_TRANSMIT) / 2;
+ receive = (OPENDOUS_MAX_TAP_TRANSMIT) / 2;
usb_out_buffer[2] = JTAG_CMD_TAP_OUTPUT;
} else {
usb_out_buffer[2] = JTAG_CMD_TAP_OUTPUT | ((tap_length % 4) << 4);
- recieve = (transmit + 1) / 2;
+ receive = (transmit + 1) / 2;
}
usb_out_buffer[0] = (transmit + 1) & 0xff;
usb_out_buffer[1] = ((transmit + 1) >> 8) & 0xff;
memmove(usb_out_buffer + 3, tms_buffer + j, transmit);
- result = opendous_usb_message(opendous_jtag_handle, 3 + transmit, recieve);
- if (result != recieve) {
- LOG_ERROR("opendous_tap_execute, wrong result %d, expected %d", result, recieve);
+ result = opendous_usb_message(opendous_jtag_handle, 3 + transmit, receive);
+ if (result != receive) {
+ LOG_ERROR("opendous_tap_execute, wrong result %d, expected %d", result, receive);
return ERROR_JTAG_QUEUE_FAILED;
}
- memmove(tdo_buffer + i, usb_in_buffer, recieve);
- i += recieve;
+ memmove(tdo_buffer + i, usb_in_buffer, receive);
+ i += receive;
j += transmit;
}