extern jtag_interface_t ep93xx_interface;
#endif
+#if BUILD_AT91RM9200 == 1
+ extern jtag_interface_t at91rm9200_interface;
+#endif
+
jtag_interface_t *jtag_interfaces[] = {
#if BUILD_PARPORT == 1
&parport_interface,
#endif
#if BUILD_EP93XX == 1
&ep93xx_interface,
+#endif
+#if BUILD_AT91RM9200 == 1
+ &at91rm9200_interface,
#endif
NULL,
};
for (i=0; i < cmd->num_fields; i++)
{
- /* if neither in_value nor in_check_value are specified we don't have to examine this field */
- if (cmd->fields[i].in_value || cmd->fields[i].in_check_value)
+ /* if neither in_value, in_check_value nor in_handler
+ * are specified we don't have to examine this field
+ */
+ if (cmd->fields[i].in_value || cmd->fields[i].in_check_value || cmd->fields[i].in_handler)
{
int num_bits = cmd->fields[i].num_bits;
-
- if (cmd->fields[i].in_value)
- {
+ u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits);
+ #ifdef _DEBUG_JTAG_IO_
char *char_buf;
- buf_set_buf(buffer, bit_count, cmd->fields[i].in_value, 0, num_bits);
- char_buf = buf_to_char(cmd->fields[i].in_value, num_bits);
-#ifdef _DEBUG_JTAG_IO_
+
+ char_buf = buf_to_char(captured, num_bits);
DEBUG("fields[%i].in_value: %s", i, char_buf);
-#endif
free(char_buf);
+ #endif
+
+
+ if (cmd->fields[i].in_value)
+ {
+ buf_cpy(captured, cmd->fields[i].in_value, num_bits);
+
if (cmd->fields[i].in_handler)
{
if (cmd->fields[i].in_handler(cmd->fields[i].in_value, cmd->fields[i].in_handler_priv) != ERROR_OK)
}
}
}
+
+ /* no in_value specified, but a handler takes care of the scanned data */
+ if (cmd->fields[i].in_handler && (!cmd->fields[i].in_value))
+ {
+ if (cmd->fields[i].in_handler(captured, cmd->fields[i].in_handler_priv) != ERROR_OK)
+ {
+ /* TODO: error reporting */
+ WARNING("in_handler reported a failed check");
+ retval = ERROR_JTAG_QUEUE_FAILED;
+ }
+
+ }
if (cmd->fields[i].in_check_value)
{
free(in_check_value_char);
free(in_check_mask_char);
}
- free(captured);
}
+ free(captured);
}
bit_count += cmd->fields[i].num_bits;
}
for (i=0; i < cmd->num_fields; i++)
{
- if (cmd->fields[i].in_check_value || cmd->fields[i].in_value)
+ if (cmd->fields[i].in_check_value || cmd->fields[i].in_value || cmd->fields[i].in_handler)
type |= SCAN_IN;
if (cmd->fields[i].out_value)
type |= SCAN_OUT;