retire jtag_add_dr_scan_now
[fw/openocd] / src / target / etb.c
index 5af9b910e628e9d93fd9fe1500b0fb0f00eef847..5f6e648e8c4104f1e004d8237542d9c7ca024ec7 100644 (file)
 #include "config.h"
 #endif
 
-#include <string.h>
-
 #include "arm7_9_common.h"
 #include "etb.h"
-#include "etm.h"
-
-#include "log.h"
-#include "types.h"
-#include "binarybuffer.h"
-#include "target.h"
-#include "register.h"
-#include "jtag.h"
 
-#include <stdlib.h>
 
 static char* etb_reg_list[] =
 {
@@ -58,6 +47,7 @@ static int handle_etb_config_command(struct command_context_s *cmd_ctx, char *cm
 static int etb_set_instr(etb_t *etb, u32 new_instr)
 {
        jtag_tap_t *tap;
+
        tap = etb->tap;
        if (tap==NULL)
                return ERROR_FAIL;
@@ -70,12 +60,8 @@ static int etb_set_instr(etb_t *etb, u32 new_instr)
                field.num_bits = tap->ir_length;
                field.out_value = calloc(CEIL(field.num_bits, 8), 1);
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
-               field.out_mask = NULL;
+
                field.in_value = NULL;
-               field.in_check_value = NULL;
-               field.in_check_mask = NULL;
-               field.in_handler = NULL;
-               field.in_handler_priv = NULL;
 
                jtag_add_ir_scan(1, &field, TAP_INVALID);
 
@@ -87,7 +73,7 @@ static int etb_set_instr(etb_t *etb, u32 new_instr)
 
 static int etb_scann(etb_t *etb, u32 new_scan_chain)
 {
-       if(etb->cur_scan_chain != new_scan_chain)
+       if (etb->cur_scan_chain != new_scan_chain)
        {
                scan_field_t field;
 
@@ -95,12 +81,8 @@ static int etb_scann(etb_t *etb, u32 new_scan_chain)
                field.num_bits = 5;
                field.out_value = calloc(CEIL(field.num_bits, 8), 1);
                buf_set_u32(field.out_value, 0, field.num_bits, new_scan_chain);
-               field.out_mask = NULL;
+
                field.in_value = NULL;
-               field.in_check_value = NULL;
-               field.in_check_mask = NULL;
-               field.in_handler = NULL;
-               field.in_handler_priv = NULL;
 
                /* select INTEST instruction */
                etb_set_instr(etb, 0x2);
@@ -159,6 +141,7 @@ reg_cache_t* etb_build_reg_cache(etb_t *etb)
 static int etb_get_reg(reg_t *reg)
 {
        int retval;
+
        if ((retval = etb_read_reg(reg)) != ERROR_OK)
        {
                LOG_ERROR("BUG: error scheduling etm register read");
@@ -174,6 +157,13 @@ static int etb_get_reg(reg_t *reg)
        return ERROR_OK;
 }
 
+
+static void etb_getbuf(u8 *in)
+{
+       *((u32 *)in)=buf_get_u32(in, 0, 32);
+}
+
+
 static int etb_read_ram(etb_t *etb, u32 *data, int num_frames)
 {
        scan_field_t fields[3];
@@ -186,39 +176,22 @@ static int etb_read_ram(etb_t *etb, u32 *data, int num_frames)
        fields[0].tap = etb->tap;
        fields[0].num_bits = 32;
        fields[0].out_value = NULL;
-       fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
-       fields[0].in_check_value = NULL;
-       fields[0].in_check_mask = NULL;
-       fields[0].in_handler = NULL;
-       fields[0].in_handler_priv = NULL;
 
        fields[1].tap = etb->tap;
        fields[1].num_bits = 7;
        fields[1].out_value = malloc(1);
        buf_set_u32(fields[1].out_value, 0, 7, 4);
-       fields[1].out_mask = NULL;
        fields[1].in_value = NULL;
-       fields[1].in_check_value = NULL;
-       fields[1].in_check_mask = NULL;
-       fields[1].in_handler = NULL;
-       fields[1].in_handler_priv = NULL;
 
        fields[2].tap = etb->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = malloc(1);
        buf_set_u32(fields[2].out_value, 0, 1, 0);
-       fields[2].out_mask = NULL;
        fields[2].in_value = NULL;
-       fields[2].in_check_value = NULL;
-       fields[2].in_check_mask = NULL;
-       fields[2].in_handler = NULL;
-       fields[2].in_handler_priv = NULL;
 
        jtag_add_dr_scan(3, fields, TAP_INVALID);
 
-       fields[0].in_handler = buf_to_u32_handler; /* deprecated! invoke this from user code! */
-
        for (i = 0; i < num_frames; i++)
        {
                /* ensure nR/W reamins set to read */
@@ -230,8 +203,10 @@ static int etb_read_ram(etb_t *etb, u32 *data, int num_frames)
                else
                        buf_set_u32(fields[1].out_value, 0, 7, 0);
 
-               fields[0].in_handler_priv = &data[i];
+               fields[0].in_value = (u8 *)(data+i);
                jtag_add_dr_scan(3, fields, TAP_INVALID);
+
+               jtag_add_callback(etb_getbuf, (u8 *)(data+i));
        }
 
        jtag_execute_queue();
@@ -257,34 +232,25 @@ int etb_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
        fields[0].tap = etb_reg->etb->tap;
        fields[0].num_bits = 32;
        fields[0].out_value = reg->value;
-       fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
-       fields[0].in_check_value = NULL;
-       fields[0].in_check_mask = NULL;
-       fields[0].in_handler = NULL;
-       fields[0].in_handler_priv = NULL;
+       fields[0].check_value = NULL;
+       fields[0].check_mask = NULL;
 
        fields[1].tap = etb_reg->etb->tap;
        fields[1].num_bits = 7;
        fields[1].out_value = malloc(1);
        buf_set_u32(fields[1].out_value, 0, 7, reg_addr);
-       fields[1].out_mask = NULL;
        fields[1].in_value = NULL;
-       fields[1].in_check_value = NULL;
-       fields[1].in_check_mask = NULL;
-       fields[1].in_handler = NULL;
-       fields[1].in_handler_priv = NULL;
+       fields[1].check_value = NULL;
+       fields[1].check_mask = NULL;
 
        fields[2].tap = etb_reg->etb->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = malloc(1);
        buf_set_u32(fields[2].out_value, 0, 1, 0);
-       fields[2].out_mask = NULL;
        fields[2].in_value = NULL;
-       fields[2].in_check_value = NULL;
-       fields[2].in_check_mask = NULL;
-       fields[2].in_handler = NULL;
-       fields[2].in_handler_priv = NULL;
+       fields[2].check_value = NULL;
+       fields[2].check_mask = NULL;
 
        jtag_add_dr_scan(3, fields, TAP_INVALID);
 
@@ -293,10 +259,10 @@ int etb_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
         */
        buf_set_u32(fields[1].out_value, 0, 7, 0x0);
        fields[0].in_value = reg->value;
+       fields[0].check_value = check_value;
+       fields[0].check_mask = check_mask;
 
-       jtag_set_check_value(fields+0, check_value, check_mask, NULL);
-
-       jtag_add_dr_scan(3, fields, TAP_INVALID);
+       jtag_add_dr_scan_check(3, fields, TAP_INVALID);
 
        free(fields[1].out_value);
        free(fields[2].out_value);
@@ -312,6 +278,7 @@ int etb_read_reg(reg_t *reg)
 int etb_set_reg(reg_t *reg, u32 value)
 {
        int retval;
+
        if ((retval = etb_write_reg(reg, value)) != ERROR_OK)
        {
                LOG_ERROR("BUG: error scheduling etm register write");
@@ -328,6 +295,7 @@ int etb_set_reg(reg_t *reg, u32 value)
 int etb_set_reg_w_exec(reg_t *reg, u8 *buf)
 {
        int retval;
+
        etb_set_reg(reg, buf_get_u32(buf, 0, reg->size));
 
        if ((retval = jtag_execute_queue()) != ERROR_OK)
@@ -354,36 +322,20 @@ int etb_write_reg(reg_t *reg, u32 value)
        fields[0].num_bits = 32;
        fields[0].out_value = malloc(4);
        buf_set_u32(fields[0].out_value, 0, 32, value);
-       fields[0].out_mask = NULL;
        fields[0].in_value = NULL;
-       fields[0].in_check_value = NULL;
-       fields[0].in_check_mask = NULL;
-       fields[0].in_handler = NULL;
-       fields[0].in_handler_priv = NULL;
 
        fields[1].tap = etb_reg->etb->tap;
        fields[1].num_bits = 7;
        fields[1].out_value = malloc(1);
        buf_set_u32(fields[1].out_value, 0, 7, reg_addr);
-       fields[1].out_mask = NULL;
        fields[1].in_value = NULL;
-       fields[1].in_check_value = NULL;
-       fields[1].in_check_mask = NULL;
-       fields[1].in_handler = NULL;
-       fields[1].in_handler_priv = NULL;
 
        fields[2].tap = etb_reg->etb->tap;
        fields[2].num_bits = 1;
        fields[2].out_value = malloc(1);
        buf_set_u32(fields[2].out_value, 0, 1, 1);
-       fields[2].out_mask = NULL;
-       fields[2].in_value = NULL;
-       fields[2].in_check_value = NULL;
-       fields[2].in_check_mask = NULL;
-       fields[2].in_handler = NULL;
-       fields[2].in_handler_priv = NULL;
 
-       jtag_add_dr_scan(3, fields, TAP_INVALID);
+       fields[2].in_value = NULL;
 
        free(fields[0].out_value);
        free(fields[1].out_value);
@@ -435,12 +387,12 @@ static int handle_etb_config_command(struct command_context_s *cmd_ctx, char *cm
        }
 
        tap = jtag_TapByString( args[1] );
-       if( tap == NULL ){
+       if (tap == NULL)
+       {
                command_print(cmd_ctx, "Tap: %s does not exist", args[1] );
                return ERROR_FAIL;
        }
 
-
        if (arm7_9->etm_ctx)
        {
                etb_t *etb = malloc(sizeof(etb_t));