--- trunk/src/svf/svf.c	2009-03-28 14:50:36.000000000 +0800
+++ backup/svf/svf.c	2009-04-02 18:13:28.000000000 +0800
@@ -139,8 +139,10 @@
 svf_para_t svf_para;
 const svf_para_t svf_para_init =
 {
-//	frequency,	ir_end_state,	dr_end_state,	runtest_run_state,	runtest_end_state,	trst_mode
-	0,			TAP_IDLE,		TAP_IDLE,		TAP_IDLE,			TAP_IDLE,			TRST_Z,
+//	frequency,	ir_end_state,	dr_end_state,	runtest_run_state,
+	0,			TAP_IDLE,		TAP_IDLE,		TAP_IDLE,
+//	runtest_end_state,	trst_mode
+	TAP_IDLE,			TRST_Z,
 //	hir_para
 //	{len,	data_mask,	tdi,	tdo,	mask,	smask},
 	{0,		0,			NULL,	NULL,	NULL,	NULL},
@@ -180,7 +182,8 @@
 static int svf_check_tdo(void);
 static int svf_add_check_para(u8 enabled, int buffer_offset, int bit_len);
 static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str);
-static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, 
+							  char **args, int argc);
 
 static int svf_fd = 0;
 static char *svf_command_buffer = NULL;
@@ -191,7 +194,9 @@
 static tap_state_t last_state = TAP_RESET;
 
 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT	(4 * 1024)
-static u8 *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL;
+static u8 *svf_tdi_buffer = NULL;
+static u8 *svf_tdo_buffer = NULL;
+static u8 *svf_mask_buffer = NULL;
 static int svf_buffer_index = 0, svf_buffer_size = 0;
 static int svf_quiet = 0;
 
@@ -200,7 +205,7 @@
 {
 	register_command(cmd_ctx, NULL, "svf", handle_svf_command,
 		COMMAND_EXEC, "run svf <file>");
-
+	
 	return ERROR_OK;
 }
 
@@ -231,19 +236,20 @@
 	}
 }
 
-static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, 
+							  char **args, int argc)
 {
 #define SVF_NUM_OF_OPTIONS			1
 	int command_num = 0, i;
 	int ret = ERROR_OK;
 	long long time_ago;
-
+	
 	if ((argc < 1) || (argc > (1 + SVF_NUM_OF_OPTIONS)))
 	{
 		command_print(cmd_ctx, "usage: svf <file> [quiet]");
 		return ERROR_FAIL;
 	}
-
+	
 	// parse variant
 	svf_quiet = 0;
 	for (i = 1; i < argc; i++)
@@ -255,43 +261,45 @@
 		else
 		{
 			LOG_ERROR("unknown variant for svf: %s", args[i]);
-
+			
 			// no need to free anything now
 			return ERROR_FAIL;
 		}
 	}
-
+	
 	if ((svf_fd = open(args[0], O_RDONLY)) < 0)
 	{
 		command_print(cmd_ctx, "file \"%s\" not found", args[0]);
-
+		
 		// no need to free anything now
 		return ERROR_FAIL;
 	}
-
+	
 	LOG_USER("svf processing file: \"%s\"", args[0]);
-
+	
 	// get time
 	time_ago = timeval_ms();
-
+	
 	// init
 	svf_line_number = 1;
 	svf_command_buffer_size = 0;
-
+	
 	svf_check_tdo_para_index = 0;
-	svf_check_tdo_para = malloc(sizeof(svf_check_tdo_para_t) * SVF_CHECK_TDO_PARA_SIZE);
+	svf_check_tdo_para = malloc(sizeof(svf_check_tdo_para_t) 
+								* SVF_CHECK_TDO_PARA_SIZE);
 	if (NULL == svf_check_tdo_para)
 	{
 		LOG_ERROR("not enough memory");
 		ret = ERROR_FAIL;
 		goto free_all;
 	}
-
+	
 	svf_buffer_index = 0;
 	// double the buffer size
-	// in case current command cannot be commited, and next command is a bit scan command
-	// here is 32K bits for this big scan command, it should be enough
-	// buffer will be reallocated if buffer size is not enough
+	// in case current command cannot be commited, 
+	// and next command is a bit scan command.
+	// here is 32K bits for this big scan command, it should be enough.
+	// buffer will be reallocated if buffer size is not enough.
 	svf_tdi_buffer = (u8 *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
 	if (NULL == svf_tdi_buffer)
 	{
@@ -314,7 +322,7 @@
 		goto free_all;
 	}
 	svf_buffer_size = 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT;
-
+	
 	memcpy(&svf_para, &svf_para_init, sizeof(svf_para));
 	for (i = 0; i < dimof(svf_tap_state_name); i++)
 	{
@@ -322,7 +330,7 @@
 	}
 	// TAP_RESET
 	jtag_add_tlr();
-
+	
 	while ( ERROR_OK == svf_read_command_from_file(svf_fd) )
 	{
 		if (ERROR_OK != svf_run_command(cmd_ctx, svf_command_buffer))
@@ -341,15 +349,15 @@
 	{
 		ret = ERROR_FAIL;
 	}
-
+	
 	// print time
 	command_print(cmd_ctx, "%d ms used", timeval_ms() - time_ago);
-
+	
 free_all:
-
+	
 	close(svf_fd);
 	svf_fd = 0;
-
+	
 	// free buffers
 	if (svf_command_buffer)
 	{
@@ -380,23 +388,25 @@
 	}
 	svf_buffer_index = 0;
 	svf_buffer_size = 0;
-
+	
 	svf_free_xxd_para(&svf_para.hdr_para);
 	svf_free_xxd_para(&svf_para.hir_para);
 	svf_free_xxd_para(&svf_para.tdr_para);
 	svf_free_xxd_para(&svf_para.tir_para);
 	svf_free_xxd_para(&svf_para.sdr_para);
 	svf_free_xxd_para(&svf_para.sir_para);
-
+	
 	if (ERROR_OK == ret)
 	{
-		command_print(cmd_ctx, "svf file programmed successfully for %d commands", command_num);
+		command_print(cmd_ctx, 
+					  "svf file programmed successfully for %d commands", 
+					  command_num);
 	}
 	else
 	{
 		command_print(cmd_ctx, "svf file programmed failed");
 	}
-
+	
 	return ret;
 }
 
@@ -405,7 +415,7 @@
 {
 	char ch, *tmp_buffer = NULL;
 	int cmd_pos = 0, cmd_ok = 0, slash = 0, comment = 0;
-
+	
 	while (!cmd_ok && (read(fd, &ch, 1) > 0) )
 	{
 		switch(ch)
@@ -438,7 +448,9 @@
 			{
 				if (cmd_pos >= svf_command_buffer_size - 1)
 				{
-					tmp_buffer = (char*)malloc(svf_command_buffer_size + SVFP_CMD_INC_CNT);		// 1 more byte for '\0'
+					// 1 more byte for '\0'
+					tmp_buffer = (char*)malloc(svf_command_buffer_size 
+												+ SVFP_CMD_INC_CNT);
 					if (NULL == tmp_buffer)
 					{
 						LOG_ERROR("not enough memory");
@@ -446,7 +458,8 @@
 					}
 					if (svf_command_buffer_size > 0)
 					{
-						memcpy(tmp_buffer, svf_command_buffer, svf_command_buffer_size);
+						memcpy(tmp_buffer, svf_command_buffer, 
+							   svf_command_buffer_size);
 					}
 					if (svf_command_buffer != NULL)
 					{
@@ -473,10 +486,11 @@
 	}
 }
 
-static int svf_parse_cmd_string(char *str, int len, char **argus, int *num_of_argu)
+static int svf_parse_cmd_string(char *str, int len, char **argus, 
+								int *num_of_argu)
 {
 	int pos = 0, num = 0, space_found = 1;
-
+	
 	while (pos < len)
 	{
 		switch(str[pos])
@@ -502,15 +516,16 @@
 		}
 		pos++;
 	}
-
+	
 	*num_of_argu = num;
-
+	
 	return ERROR_OK;
 }
 
 static int svf_tap_state_is_stable(tap_state_t state)
 {
-	return ((TAP_RESET == state) || (TAP_IDLE == state) || (TAP_DRPAUSE == state) || (TAP_IRPAUSE == state));
+	return ((TAP_RESET == state) || (TAP_IDLE == state) 
+			|| (TAP_DRPAUSE == state) || (TAP_IRPAUSE == state));
 }
 
 static int svf_tap_state_is_valid(tap_state_t state)
@@ -521,7 +536,7 @@
 static int svf_find_string_in_array(char *str, char **strs, int num_of_element)
 {
 	int i;
-
+	
 	for (i = 0; i < num_of_element; i++)
 	{
 		if (!strcmp(str, strs[i]))
@@ -535,8 +550,9 @@
 static int svf_adjust_array_length(u8 **arr, int orig_bit_len, int new_bit_len)
 {
 	int new_byte_len = (new_bit_len + 7) >> 3;
-
-	if ((NULL == *arr) || (((orig_bit_len + 7) >> 3) < ((new_bit_len + 7) >> 3)))
+	
+	if ((NULL == *arr) 
+		|| (((orig_bit_len + 7) >> 3) < ((new_bit_len + 7) >> 3)))
 	{
 		if (*arr != NULL)
 		{
@@ -554,17 +570,18 @@
 	return ERROR_OK;
 }
 
-static int svf_copy_hexstring_to_binary(char *str, u8 **bin, int orig_bit_len, int bit_len)
+static int svf_copy_hexstring_to_binary(char *str, u8 **bin, int orig_bit_len, 
+										int bit_len)
 {
 	int i, str_len = strlen(str), str_byte_len = (bit_len + 3) >> 2, loop_cnt;
 	u8 ch, need_write = 1;
-
+	
 	if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len))
 	{
 		LOG_ERROR("fail to adjust length of array");
 		return ERROR_FAIL;
 	}
-
+	
 	if (str_byte_len > str_len)
 	{
 		loop_cnt = str_byte_len;
@@ -573,7 +590,7 @@
 	{
 		loop_cnt = str_len;
 	}
-
+	
 	for (i = 0; i < loop_cnt; i++)
 	{
 		if (i < str_len)
@@ -597,11 +614,12 @@
 		{
 			ch = 0;
 		}
-
+		
 		// check valid
 		if (i >= str_byte_len)
 		{
-			// all data written, other data should be all '0's and needn't to be written
+			// all data written, other data should be all '0's 
+			// and needn't to be written
 			need_write = 0;
 			if (ch != 0)
 			{
@@ -618,7 +636,7 @@
 				return ERROR_FAIL;
 			}
 		}
-
+		
 		if (need_write)
 		{
 			// write bin
@@ -635,32 +653,38 @@
 			}
 		}
 	}
-
+	
 	return ERROR_OK;
 }
 
 static int svf_check_tdo(void)
 {
-	int i, j, byte_len, index;
-
+	int i, j, len, index, mask;
+	
 	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++)
+			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;
-				}
+				mask = 0xFFFFFFFF;
+			}
+			else
+			{
+				mask = (1 << svf_check_tdo_para[i].bit_len) - 1;
 			}
+			
+			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", 
+					  (*(int*)(svf_tdi_buffer + index)) & mask, 
+					  (*(int*)(svf_tdo_buffer + index)) & mask, 
+					  (*(int*)(svf_mask_buffer + index)) & mask);
+			return ERROR_FAIL;
 		}
 	}
 	svf_check_tdo_para_index = 0;
@@ -675,13 +699,13 @@
 		LOG_ERROR("toooooo many operation undone");
 		return ERROR_FAIL;
 	}
-
+	
 	svf_check_tdo_para[svf_check_tdo_para_index].line_num = svf_line_number;
 	svf_check_tdo_para[svf_check_tdo_para_index].bit_len = bit_len;
 	svf_check_tdo_para[svf_check_tdo_para_index].enabled = enabled;
 	svf_check_tdo_para[svf_check_tdo_para_index].buffer_offset = buffer_offset;
 	svf_check_tdo_para_index++;
-
+	
 	return ERROR_OK;
 }
 
@@ -695,9 +719,9 @@
 	{
 		return ERROR_FAIL;
 	}
-
+	
 	svf_buffer_index = 0;
-
+	
 	return ERROR_OK;
 }
 
@@ -710,13 +734,13 @@
 {
 	char *argus[256], command;
 	int num_of_argu = 0, i;
-
+	
 	// 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;
@@ -726,18 +750,20 @@
 	scan_field_t field;
 	// for STATE
 	tap_state_t *path = NULL, state;
-
+	
 	if (!svf_quiet)
 	{
 		LOG_USER("%s", svf_command_buffer);
 	}
-
-	if (ERROR_OK != svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu))
+	
+	if (ERROR_OK 
+		!= svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu))
 	{
 		return ERROR_FAIL;
 	}
-
-	command = svf_find_string_in_array(argus[0], (char **)svf_command_name, dimof(svf_command_name));
+	
+	command = svf_find_string_in_array(argus[0], (char **)svf_command_name, 
+									   dimof(svf_command_name));
 	switch(command)
 	{
 	case ENDDR:
@@ -747,18 +773,21 @@
 			LOG_ERROR("invalid parameter of %s", argus[0]);
 			return ERROR_FAIL;
 		}
-		i_tmp = svf_find_string_in_array(argus[1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
+		i_tmp = svf_find_string_in_array(argus[1], (char **)svf_tap_state_name, 
+										 dimof(svf_tap_state_name));
 		if (svf_tap_state_is_stable(i_tmp))
 		{
 			if (command == ENDIR)
 			{
 				svf_para.ir_end_state = i_tmp;
-				LOG_DEBUG("\tir_end_state = %s", svf_tap_state_name[svf_para.ir_end_state]);
+				LOG_DEBUG("\tir_end_state = %s", 
+						  svf_tap_state_name[svf_para.ir_end_state]);
 			}
 			else
 			{
 				svf_para.dr_end_state = i_tmp;
-				LOG_DEBUG("\tdr_end_state = %s", svf_tap_state_name[svf_para.dr_end_state]);
+				LOG_DEBUG("\tdr_end_state = %s", 
+						  svf_tap_state_name[svf_para.dr_end_state]);
 			}
 		}
 		else
@@ -793,7 +822,8 @@
 			// TODO: set jtag speed to
 			if (svf_para.frequency > 0)
 			{
-				command_run_linef(cmd_ctx, "jtag_khz %d", (int)svf_para.frequency / 1000);
+				command_run_linef(cmd_ctx, "jtag_khz %d", 
+								  (int)svf_para.frequency / 1000);
 				LOG_DEBUG("\tfrequency = %f", svf_para.frequency);
 			}
 		}
@@ -829,7 +859,8 @@
 		xxr_para_tmp->data_mask = 0;
 		for (i = 2; i < num_of_argu; i += 2)
 		{
-			if ((strlen(argus[i + 1]) < 3) || (argus[i + 1][0] != '(') || (argus[i + 1][strlen(argus[i + 1]) - 1] != ')'))
+			if ((strlen(argus[i + 1]) < 3) || (argus[i + 1][0] != '(') 
+				|| (argus[i + 1][strlen(argus[i + 1]) - 1] != ')'))
 			{
 				LOG_ERROR("data section error");
 				return ERROR_FAIL;
@@ -865,19 +896,25 @@
 				LOG_ERROR("unknow parameter: %s", argus[i]);
 				return ERROR_FAIL;
 			}
-			if (ERROR_OK != svf_copy_hexstring_to_binary(&argus[i + 1][1], pbuffer_tmp, i_tmp, xxr_para_tmp->len))
+			if (ERROR_OK != svf_copy_hexstring_to_binary(
+										&argus[i + 1][1], pbuffer_tmp, i_tmp, 
+										xxr_para_tmp->len))
 			{
 				LOG_ERROR("fail to parse hex value");
 				return ERROR_FAIL;
 			}
-			LOG_DEBUG("\t%s = 0x%X", argus[i], (**(int**)pbuffer_tmp) & ((1 << (xxr_para_tmp->len)) - 1));
+			LOG_DEBUG("\t%s = 0x%X", argus[i], 
+					(**(int**)pbuffer_tmp) & ((1 << (xxr_para_tmp->len)) - 1));
 		}
-		// If a command changes the length of the last scan of the same type and the MASK parameter is absent,
+		// If a command changes the length of the last scan of the same type 
+		// and the MASK parameter is absent,
 		// the mask pattern used is all cares
-		if (!(xxr_para_tmp->data_mask & XXR_MASK) && (i_tmp != xxr_para_tmp->len))
+		if (!(xxr_para_tmp->data_mask & XXR_MASK) 
+			&& (i_tmp != xxr_para_tmp->len))
 		{
 			// MASK not defined and length changed
-			if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, i_tmp, xxr_para_tmp->len))
+			if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, 
+													i_tmp, xxr_para_tmp->len))
 			{
 				LOG_ERROR("fail to adjust length of array");
 				return ERROR_FAIL;
@@ -888,7 +925,8 @@
 		if (SDR == command)
 		{
 			// check buffer size first, reallocate if necessary
-			i = svf_para.hdr_para.len + svf_para.sdr_para.len + svf_para.tdr_para.len;
+			i = svf_para.hdr_para.len + svf_para.sdr_para.len 
+				+ svf_para.tdr_para.len;
 			if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
 			{
 #if 1
@@ -897,7 +935,7 @@
 				return ERROR_FAIL;
 #else
 				u8 *buffer_tmp;
-
+				
 				// reallocate buffer
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
@@ -909,7 +947,7 @@
 				// svf_tdi_buffer isn't NULL here
 				free(svf_tdi_buffer);
 				svf_tdi_buffer = buffer_tmp;
-
+				
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
 				{
@@ -920,7 +958,7 @@
 				// svf_tdo_buffer isn't NULL here
 				free(svf_tdo_buffer);
 				svf_tdo_buffer = buffer_tmp;
-
+				
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
 				{
@@ -931,41 +969,59 @@
 				// svf_mask_buffer isn't NULL here
 				free(svf_mask_buffer);
 				svf_mask_buffer = buffer_tmp;
-
+				
 				buffer_tmp = NULL;
 				svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
 #endif
 			}
-
+			
 			// assemble dr data
 			i = 0;
-			buf_set_buf(svf_para.hdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
+			buf_set_buf(svf_para.hdr_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.hdr_para.len);
 			i += svf_para.hdr_para.len;
-			buf_set_buf(svf_para.sdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
+			buf_set_buf(svf_para.sdr_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.sdr_para.len);
 			i += svf_para.sdr_para.len;
-			buf_set_buf(svf_para.tdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
+			buf_set_buf(svf_para.tdr_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.tdr_para.len);
 			i += svf_para.tdr_para.len;
-
+			
 			// add check data
 			if (svf_para.sdr_para.data_mask & XXR_TDO)
 			{
 				// assemble dr mask data
 				i = 0;
-				buf_set_buf(svf_para.hdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
+				buf_set_buf(svf_para.hdr_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.hdr_para.len);
 				i += svf_para.hdr_para.len;
-				buf_set_buf(svf_para.sdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
+				buf_set_buf(svf_para.sdr_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.sdr_para.len);
 				i += svf_para.sdr_para.len;
-				buf_set_buf(svf_para.tdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
+				buf_set_buf(svf_para.tdr_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.tdr_para.len);
 				i += svf_para.tdr_para.len;
 				// assemble dr check data
 				i = 0;
-				buf_set_buf(svf_para.hdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
+				buf_set_buf(svf_para.hdr_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.hdr_para.len);
 				i += svf_para.hdr_para.len;
-				buf_set_buf(svf_para.sdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
+				buf_set_buf(svf_para.sdr_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.sdr_para.len);
 				i += svf_para.sdr_para.len;
-				buf_set_buf(svf_para.tdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
+				buf_set_buf(svf_para.tdr_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.tdr_para.len);
 				i += svf_para.tdr_para.len;
-
+				
 				svf_add_check_para(1, svf_buffer_index, i);
 			}
 			else
@@ -982,14 +1038,15 @@
 			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;
 			last_state = svf_para.dr_end_state;
 		}
 		else if (SIR == command)
 		{
 			// check buffer size first, reallocate if necessary
-			i = svf_para.hir_para.len + svf_para.sir_para.len + svf_para.tir_para.len;
+			i = svf_para.hir_para.len + svf_para.sir_para.len 
+				+ svf_para.tir_para.len;
 			if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
 			{
 #if 1
@@ -998,7 +1055,7 @@
 				return ERROR_FAIL;
 #else
 				u8 *buffer_tmp;
-
+				
 				// reallocate buffer
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
@@ -1010,7 +1067,7 @@
 				// svf_tdi_buffer isn't NULL here
 				free(svf_tdi_buffer);
 				svf_tdi_buffer = buffer_tmp;
-
+				
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
 				{
@@ -1021,7 +1078,7 @@
 				// svf_tdo_buffer isn't NULL here
 				free(svf_tdo_buffer);
 				svf_tdo_buffer = buffer_tmp;
-
+				
 				buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
 				if (NULL == buffer_tmp)
 				{
@@ -1032,41 +1089,59 @@
 				// svf_mask_buffer isn't NULL here
 				free(svf_mask_buffer);
 				svf_mask_buffer = buffer_tmp;
-
+				
 				buffer_tmp = NULL;
 				svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
 #endif
 			}
-
+			
 			// assemble ir data
 			i = 0;
-			buf_set_buf(svf_para.hir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hir_para.len);
+			buf_set_buf(svf_para.hir_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.hir_para.len);
 			i += svf_para.hir_para.len;
-			buf_set_buf(svf_para.sir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sir_para.len);
+			buf_set_buf(svf_para.sir_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.sir_para.len);
 			i += svf_para.sir_para.len;
-			buf_set_buf(svf_para.tir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tir_para.len);
+			buf_set_buf(svf_para.tir_para.tdi, 0, 
+						&svf_tdi_buffer[svf_buffer_index], i, 
+						svf_para.tir_para.len);
 			i += svf_para.tir_para.len;
-
+			
 			// add check data
 			if (svf_para.sir_para.data_mask & XXR_TDO)
 			{
 				// assemble dr mask data
 				i = 0;
-				buf_set_buf(svf_para.hir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hir_para.len);
+				buf_set_buf(svf_para.hir_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.hir_para.len);
 				i += svf_para.hir_para.len;
-				buf_set_buf(svf_para.sir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sir_para.len);
+				buf_set_buf(svf_para.sir_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.sir_para.len);
 				i += svf_para.sir_para.len;
-				buf_set_buf(svf_para.tir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tir_para.len);
+				buf_set_buf(svf_para.tir_para.mask, 0, 
+							&svf_mask_buffer[svf_buffer_index], i, 
+							svf_para.tir_para.len);
 				i += svf_para.tir_para.len;
 				// assemble dr check data
 				i = 0;
-				buf_set_buf(svf_para.hir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hir_para.len);
+				buf_set_buf(svf_para.hir_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.hir_para.len);
 				i += svf_para.hir_para.len;
-				buf_set_buf(svf_para.sir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sir_para.len);
+				buf_set_buf(svf_para.sir_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.sir_para.len);
 				i += svf_para.sir_para.len;
-				buf_set_buf(svf_para.tir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tir_para.len);
+				buf_set_buf(svf_para.tir_para.tdo, 0, 
+							&svf_tdo_buffer[svf_buffer_index], i, 
+							svf_para.tir_para.len);
 				i += svf_para.tir_para.len;
-
+				
 				svf_add_check_para(1, svf_buffer_index, i);
 			}
 			else
@@ -1083,7 +1158,7 @@
 			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;
 			last_state = svf_para.ir_end_state;
 		}
@@ -1094,8 +1169,11 @@
 		return ERROR_FAIL;
 		break;
 	case RUNTEST:
-		// RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
-		// RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state]
+		// RUNTEST [run_state] run_count run_clk 
+		// [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
+		// or
+		// RUNTEST [run_state] min_time SEC 
+		// [MAXIMUM max_time SEC] [ENDSTATE end_state]
 		if ((num_of_argu < 3) && (num_of_argu > 11))
 		{
 			LOG_ERROR("invalid parameter of %s", argus[0]);
@@ -1107,16 +1185,20 @@
 		max_time = 0;
 		i = 1;
 		// run_state
-		i_tmp = svf_find_string_in_array(argus[i], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
+		i_tmp = svf_find_string_in_array(argus[i], 
+										 (char **)svf_tap_state_name, 
+										 dimof(svf_tap_state_name));
 		if (svf_tap_state_is_valid(i_tmp))
 		{
 			if (svf_tap_state_is_stable(i_tmp))
 			{
 				svf_para.runtest_run_state = i_tmp;
-
-				// When a run_state is specified, the new  run_state becomes the default end_state
+				
+				// When a run_state is specified, 
+				// the new  run_state becomes the default end_state
 				svf_para.runtest_end_state = i_tmp;
-				LOG_DEBUG("\trun_state = %s", svf_tap_state_name[svf_para.runtest_run_state]);
+				LOG_DEBUG("\trun_state = %s", 
+						  svf_tap_state_name[svf_para.runtest_run_state]);
 				i++;
 			}
 			else
@@ -1149,7 +1231,8 @@
 			i += 2;
 		}
 		// MAXIMUM max_time SEC
-		if (((i + 3) <= num_of_argu) && !strcmp(argus[i], "MAXIMUM") && !strcmp(argus[i + 2], "SEC"))
+		if (((i + 3) <= num_of_argu) && !strcmp(argus[i], "MAXIMUM") 
+			&& !strcmp(argus[i + 2], "SEC"))
 		{
 			max_time = atof(argus[i + 1]);
 			LOG_DEBUG("\tmax_time = %fs", max_time);
@@ -1158,11 +1241,14 @@
 		// ENDSTATE end_state
 		if (((i + 2) <= num_of_argu) && !strcmp(argus[i], "ENDSTATE"))
 		{
-			i_tmp = svf_find_string_in_array(argus[i + 1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
+			i_tmp = svf_find_string_in_array(argus[i + 1], 
+											 (char **)svf_tap_state_name, 
+											 dimof(svf_tap_state_name));
 			if (svf_tap_state_is_stable(i_tmp))
 			{
 				svf_para.runtest_end_state = i_tmp;
-				LOG_DEBUG("\tend_state = %s", svf_tap_state_name[svf_para.runtest_end_state]);
+				LOG_DEBUG("\tend_state = %s", 
+						  svf_tap_state_name[svf_para.runtest_end_state]);
 			}
 			else
 			{
@@ -1192,15 +1278,18 @@
 					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;
+					(*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;
 				}
-
+				
 				// call jtag_add_clocks
 				jtag_add_clocks(run_count);
-
+				
 				if (svf_para.runtest_end_state != svf_para.runtest_run_state)
 				{
 					// move to end_state
@@ -1209,27 +1298,33 @@
 					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;
+					(*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;
 				}
 				last_state = svf_para.runtest_end_state;
 #else
 				if (svf_para.runtest_run_state != TAP_IDLE)
 				{
 					// RUNTEST can only executed in TAP_IDLE
-					LOG_ERROR("cannot runtest in %s state", svf_tap_state_name[svf_para.runtest_run_state]);
+					LOG_ERROR("cannot runtest in %s state", 
+							  svf_tap_state_name[svf_para.runtest_run_state]);
 					return ERROR_FAIL;
 				}
-
+				
 				jtag_add_runtest(run_count, svf_para.runtest_end_state);
 #endif
 			}
 		}
 		else
 		{
-			LOG_ERROR("fail to parse parameter of RUNTEST, %d out of %d is parsed", i, num_of_argu);
+			LOG_ERROR(
+				"fail to parse parameter of RUNTEST, %d out of %d is parsed", 
+				i, num_of_argu);
 			return ERROR_FAIL;
 		}
 		break;
@@ -1243,7 +1338,8 @@
 		if (num_of_argu > 2)
 		{
 			// STATE pathstate1 ... stable_state
-			path = (tap_state_t *)malloc((num_of_argu - 1) * sizeof(tap_state_t));
+			path = (tap_state_t *)malloc((num_of_argu - 1) 
+										  * sizeof(tap_state_t));
 			if (NULL == path)
 			{
 				LOG_ERROR("not enough memory");
@@ -1253,10 +1349,14 @@
 			i_tmp = 1;			// path is from patameter 1
 			for (i = 0; i < num_of_argu; i++)
 			{
-				path[i] = svf_find_string_in_array(argus[i_tmp++], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
+				path[i] = svf_find_string_in_array(
+												argus[i_tmp++], 
+												(char **)svf_tap_state_name, 
+												dimof(svf_tap_state_name));
 				if (!svf_tap_state_is_valid(path[i]))
 				{
-					LOG_ERROR("%s is not valid state", svf_tap_state_name[path[i]]);
+					LOG_ERROR("%s is not valid state", 
+							  svf_tap_state_name[path[i]]);
 					return ERROR_FAIL;
 				}
 				if (TAP_RESET == path[i])
@@ -1279,15 +1379,18 @@
 					// TODO: call path_move
 					jtag_add_pathmove(num_of_argu, path);
 					last_state = path[num_of_argu - 1];
-					LOG_DEBUG("\tmove to %s by path_move", svf_tap_state_name[path[num_of_argu - 1]]);
+					LOG_DEBUG("\tmove to %s by path_move", 
+							  svf_tap_state_name[path[num_of_argu - 1]]);
 				}
 				else
 				{
-					LOG_ERROR("%s is not valid state", svf_tap_state_name[path[num_of_argu - 1]]);
+					LOG_ERROR("%s is not valid state", 
+							  svf_tap_state_name[path[num_of_argu - 1]]);
 					return ERROR_FAIL;
 				}
 			}
-			// no need to keep this memory, in jtag_add_pathmove, path will be duplicated
+			// no need to keep this memory, 
+			// in jtag_add_pathmove, path will be duplicated
 			if (NULL != path)
 			{
 				free(path);
@@ -1297,7 +1400,9 @@
 		else
 		{
 			// STATE stable_state
-			state = svf_find_string_in_array(argus[1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
+			state = svf_find_string_in_array(argus[1], 
+											 (char **)svf_tap_state_name, 
+											 dimof(svf_tap_state_name));
 			if (svf_tap_state_is_stable(state))
 			{
 				// TODO: move to state
@@ -1306,13 +1411,16 @@
 				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 = 
+							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;
+				
+				cmd_queue_end_state = cmd_queue_cur_state = 
+							(*last_cmd)->cmd.statemove->end_state;
 				last_state = state;
-
-				LOG_DEBUG("\tmove to %s by state_move", svf_tap_state_name[state]);
+				
+				LOG_DEBUG("\tmove to %s by state_move", 
+						  svf_tap_state_name[state]);
 			}
 			else
 			{
@@ -1334,7 +1442,9 @@
 			{
 				return ERROR_FAIL;
 			}
-			i_tmp = svf_find_string_in_array(argus[1], (char **)svf_trst_mode_name, dimof(svf_trst_mode_name));
+			i_tmp = svf_find_string_in_array(argus[1], 
+											 (char **)svf_trst_mode_name, 
+											 dimof(svf_trst_mode_name));
 			switch (i_tmp)
 			{
 			case TRST_ON:
@@ -1352,7 +1462,8 @@
 				return ERROR_FAIL;
 			}
 			svf_para.trst_mode = i_tmp;
-			LOG_DEBUG("\ttrst_mode = %s", svf_trst_mode_name[svf_para.trst_mode]);
+			LOG_DEBUG("\ttrst_mode = %s", 
+					  svf_trst_mode_name[svf_para.trst_mode]);
 		}
 		else
 		{
@@ -1365,7 +1476,7 @@
 		return ERROR_FAIL;
 		break;
 	}
-
+	
 	if (debug_level >= LOG_LVL_DEBUG)
 	{
 		// for convenient debugging, execute tap if possible
@@ -1377,12 +1488,24 @@
 			{
 				return ERROR_FAIL;
 			}
-
+			
 			// output debug info
 			if ((SIR == command) || (SDR == command))
 			{
+				u32 bit_mask;
+				
+				if (svf_check_tdo_para[0].bit_len >= 32)
+				{
+					bit_mask = 0xFFFFFFFF;
+				}
+				else
+				{
+					bit_mask = (1 << (svf_check_tdo_para[0].bit_len)) - 1;
+				}
+				
 				// 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));
+				LOG_DEBUG("\tTDO read = 0x%X", 
+						  (*(int*)svf_tdi_buffer) & bit_mask);
 			}
 		}
 	}
@@ -1390,13 +1513,14 @@
 	{
 		// for fast executing, execute tap if necessary
 		// half of the buffer is for the next command
-		if (((svf_buffer_index >= SVF_MAX_BUFFER_SIZE_TO_COMMIT) || (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE / 2)) && \
-			(((command != STATE) && (command != RUNTEST)) || \
-			((command == STATE) && (num_of_argu == 2))))
+		if ((	(svf_buffer_index >= SVF_MAX_BUFFER_SIZE_TO_COMMIT) 
+				|| (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE / 2)) 
+			&& (((command != STATE) && (command != RUNTEST)) 
+				|| ((command == STATE) && (num_of_argu == 2))))
 		{
 			return svf_execute_tap();
 		}
 	}
-
+	
 	return ERROR_OK;
 }
