#endif
#include "svf.h"
-
#include "jtag.h"
-#include "command.h"
-#include "log.h"
#include "time_support.h"
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include <sys/time.h>
-#include <time.h>
// SVF command
typedef enum
}
// print time
- command_print(cmd_ctx, "%d ms used", timeval_ms() - time_ago);
+ command_print(cmd_ctx, "%lld ms used", timeval_ms() - time_ago);
free_all:
static int svf_check_tdo(void)
{
- int i, j, byte_len, index;
+ int i, len, index;
for (i = 0; i < svf_check_tdo_para_index; i++)
{
- if (svf_check_tdo_para[i].enabled)
+ index = svf_check_tdo_para[i].buffer_offset;
+ len = svf_check_tdo_para[i].bit_len;
+ if ((svf_check_tdo_para[i].enabled)
+ && buf_cmp_mask(&svf_tdi_buffer[index], &svf_tdo_buffer[index], &svf_mask_buffer[index], len))
{
- byte_len = (svf_check_tdo_para[i].bit_len + 7) >> 3;
- index = svf_check_tdo_para[i].buffer_offset;
- for (j = 0; j < byte_len; j++)
+ unsigned bitmask;
+ unsigned received, expected, tapmask;
+ if (svf_check_tdo_para[i].bit_len >= 32)
{
- if ((svf_tdi_buffer[index + j] & svf_mask_buffer[index + j]) != svf_tdo_buffer[index + j])
- {
- LOG_ERROR("tdo check error at line %d, read = 0x%X, want = 0x%X, mask = 0x%X",
- svf_check_tdo_para[i].line_num,
- (*(int*)(svf_tdi_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1),
- (*(int*)(svf_tdo_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1),
- (*(int*)(svf_mask_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1));
- return ERROR_FAIL;
- }
+ bitmask = 0xFFFFFFFF;
}
+ else
+ {
+ bitmask = (1 << svf_check_tdo_para[i].bit_len) - 1;
+ }
+ memcpy(&received, svf_tdi_buffer + index, sizeof(unsigned));
+ memcpy(&expected, svf_tdo_buffer + index, sizeof(unsigned));
+ memcpy(&tapmask, svf_mask_buffer + index, sizeof(unsigned));
+ LOG_ERROR("tdo check error at line %d",
+ svf_check_tdo_para[i].line_num);
+ LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X",
+ received & bitmask,
+ expected & bitmask,
+ tapmask & bitmask);
+ return ERROR_FAIL;
}
}
svf_check_tdo_para_index = 0;
}
// not good to use this
-extern jtag_command_t** jtag_get_last_command_p(void);
extern void* cmd_queue_alloc(size_t size);
-extern jtag_command_t **last_comand_pointer;
+extern void jtag_queue_command(jtag_command_t * cmd);
static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
{
// tmp variable
int i_tmp;
- // not good to use this
- jtag_command_t **last_cmd;
-
// for RUNTEST
int run_count;
float min_time, max_time;
field.out_value = &svf_tdi_buffer[svf_buffer_index];
field.in_value = &svf_tdi_buffer[svf_buffer_index];
- field.in_check_value = NULL;
- field.in_check_mask = NULL;
- field.in_handler = NULL;
- field.in_handler_priv = NULL;
+
+
+
+
jtag_add_plain_dr_scan(1, &field, svf_para.dr_end_state);
svf_buffer_index += (i + 7) >> 3;
field.out_value = &svf_tdi_buffer[svf_buffer_index];
field.in_value = &svf_tdi_buffer[svf_buffer_index];
- field.in_check_value = NULL;
- field.in_check_mask = NULL;
- field.in_handler = NULL;
- field.in_handler_priv = NULL;
+
+
+
+
jtag_add_plain_ir_scan(1, &field, svf_para.ir_end_state);
svf_buffer_index += (i + 7) >> 3;
// enter into run_state if necessary
if (last_state != svf_para.runtest_run_state)
{
- last_cmd = jtag_get_last_command_p();
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->next = NULL;
- (*last_cmd)->type = JTAG_STATEMOVE;
- (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
- (*last_cmd)->cmd.statemove->end_state = svf_para.runtest_run_state;
-
- cmd_queue_end_state = cmd_queue_cur_state = (*last_cmd)->cmd.statemove->end_state;
+ jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+ jtag_queue_command(cmd);
+
+ cmd->type = JTAG_STATEMOVE;
+ cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
+ cmd->cmd.statemove->end_state = svf_para.runtest_run_state;
+
+ cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
}
// call jtag_add_clocks
if (svf_para.runtest_end_state != svf_para.runtest_run_state)
{
// move to end_state
- last_cmd = jtag_get_last_command_p();
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->next = NULL;
- (*last_cmd)->type = JTAG_STATEMOVE;
- (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
- (*last_cmd)->cmd.statemove->end_state = svf_para.runtest_end_state;
-
- cmd_queue_end_state = cmd_queue_cur_state = (*last_cmd)->cmd.statemove->end_state;
+ jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+ jtag_queue_command(cmd);
+ cmd->type = JTAG_STATEMOVE;
+ cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
+ cmd->cmd.statemove->end_state = svf_para.runtest_end_state;
+
+ cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
}
last_state = svf_para.runtest_end_state;
#else
if (svf_tap_state_is_stable(state))
{
// TODO: move to state
- last_cmd = jtag_get_last_command_p();
- *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
- last_comand_pointer = &((*last_cmd)->next);
- (*last_cmd)->next = NULL;
- (*last_cmd)->type = JTAG_STATEMOVE;
- (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
- (*last_cmd)->cmd.statemove->end_state = state;
-
- cmd_queue_end_state = cmd_queue_cur_state = (*last_cmd)->cmd.statemove->end_state;
+ jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+
+ jtag_queue_command(cmd);
+
+ cmd->type = JTAG_STATEMOVE;
+ cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
+ cmd->cmd.statemove->end_state = state;
+
+ cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
last_state = state;
LOG_DEBUG("\tmove to %s by state_move", svf_tap_state_name[state]);
// output debug info
if ((SIR == command) || (SDR == command))
{
+ int read_value;
+ memcpy(&read_value, svf_tdi_buffer, sizeof(int));
// in debug mode, data is from index 0
- LOG_DEBUG("\tTDO read = 0x%X", (*(int*)svf_tdi_buffer) & ((1 << (svf_check_tdo_para[0].bit_len)) - 1));
+ int read_mask = (1 << (svf_check_tdo_para[0].bit_len)) - 1;
+ LOG_DEBUG("\tTDO read = 0x%X", read_value & read_mask);
}
}
}