Wrote up post processing JTAG API. Not used yet, but reference implementation will be used in subsequent explanations of new scheme + patches to use it.

git-svn-id: svn://svn.berlios.de/openocd/trunk@1692 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe
2009-05-10 19:48:09 +00:00
parent 72acdac71a
commit 26526a80ea
2 changed files with 137 additions and 1 deletions

View File

@@ -76,6 +76,24 @@ const Jim_Nvp nvp_jtag_tap_event[] = {
int jtag_trst = 0;
int jtag_srst = 0;
#ifndef HAVE_JTAG_MINIDRIVER_H
struct jtag_callback_entry
{
struct jtag_callback_entry *next;
jtag_callback_t callback;
u8 *in;
jtag_callback_data_t data1;
jtag_callback_data_t data2;
};
static struct jtag_callback_entry *jtag_callback_queue_head = NULL;
static struct jtag_callback_entry *jtag_callback_queue_tail = NULL;
#endif
jtag_command_t *jtag_command_queue = NULL;
jtag_command_t **last_comand_pointer = &jtag_command_queue;
static jtag_tap_t *jtag_all_taps = NULL;
@@ -1434,7 +1452,46 @@ enum scan_type jtag_scan_type(scan_command_t *cmd)
return type;
}
int MINIDRIVER(interface_jtag_execute_queue)(void)
#ifndef HAVE_JTAG_MINIDRIVER_H
/* add callback to end of queue */
void jtag_add_callback3(jtag_callback_t callback, u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2)
{
struct jtag_callback_entry *entry=cmd_queue_alloc(sizeof(struct jtag_callback_entry));
entry->next=NULL;
entry->callback=callback;
entry->in=in;
entry->data1=data1;
entry->data2=data2;
if (jtag_callback_queue_head==NULL)
{
jtag_callback_queue_head=entry;
jtag_callback_queue_tail=entry;
} else
{
jtag_callback_queue_tail->next=entry;
jtag_callback_queue_tail=entry;
}
}
static int jtag_convert_to_callback3(u8 *in, jtag_callback_data_t data1, jtag_callback_data_t data2)
{
((jtag_callback1_t)data1)(in);
return ERROR_OK;
}
void jtag_add_callback(jtag_callback1_t callback, u8 *in)
{
jtag_add_callback3(jtag_convert_to_callback3, in, (jtag_callback_data_t)callback, 0);
}
#endif
#ifndef HAVE_JTAG_MINIDRIVER_H
int interface_jtag_execute_queue(void)
{
int retval;
@@ -1446,13 +1503,28 @@ int MINIDRIVER(interface_jtag_execute_queue)(void)
retval = jtag->execute_queue();
if (retval == ERROR_OK)
{
struct jtag_callback_entry *entry;
for (entry=jtag_callback_queue_head; entry!=NULL; entry=entry->next)
{
retval=entry->callback(entry->in, entry->data1, entry->data2);
if (retval!=ERROR_OK)
break;
}
}
cmd_queue_free();
jtag_callback_queue_head = NULL;
jtag_callback_queue_tail = NULL;
jtag_command_queue = NULL;
last_comand_pointer = &jtag_command_queue;
return retval;
}
#endif
void jtag_execute_queue_noclear(void)
{