TAP_SD/SI are now forbidden end states.
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 26 Mar 2008 13:29:48 +0000 (13:29 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 26 Mar 2008 13:29:48 +0000 (13:29 +0000)
jtag_add_reset() now returns void streamlining the API

git-svn-id: svn://svn.berlios.de/openocd/trunk@525 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/bitbang.c
src/jtag/jtag.c
src/jtag/jtag.h
src/target/arm7_9_common.c
src/target/cortex_m3.c

index 054faf503be0f5fff3cccb2fdf083733682d9323..a4e415c2ec8cff69c5de240ddffe67575bb629d9 100644 (file)
@@ -75,7 +75,7 @@ void bitbang_path_move(pathmove_command_t *cmd)
 {
        int num_states = cmd->num_states;
        int state_count;
-       int tms;
+       int tms = 0;
 
        state_count = 0;
        while (num_states)
@@ -138,7 +138,6 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
        enum tap_state saved_end_state = end_state;
        int bit_cnt;
-       int last_bit, last_bit_in;
        
        if (!((!ir_scan && (cur_state == TAP_SD)) || (ir_scan && (cur_state == TAP_SI))))
        {
@@ -151,7 +150,7 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
                bitbang_end_state(saved_end_state);
        }
 
-       for (bit_cnt = 0; bit_cnt < scan_size - 1; bit_cnt++)
+       for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)
        {
                /* if we're just reading the scan, but don't care about the output
                 * default to outputting 'low', this also makes valgrind traces more readable,
@@ -159,69 +158,48 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
                 */ 
                if ((type != SCAN_IN) && ((buffer[bit_cnt/8] >> (bit_cnt % 8)) & 0x1))
                {
-                       bitbang_interface->write(0, 0, 1);
-                       bitbang_interface->write(1, 0, 1);
+                       bitbang_interface->write(0, (bit_cnt==scan_size-1) ? 1 : 0, 1);
+                       bitbang_interface->write(1, (bit_cnt==scan_size-1) ? 1 : 0, 1);
                } else {
-                       bitbang_interface->write(0, 0, 0);
-                       bitbang_interface->write(1, 0, 0);
+                       bitbang_interface->write(0, (bit_cnt==scan_size-1) ? 1 : 0, 0);
+                       bitbang_interface->write(1, (bit_cnt==scan_size-1) ? 1 : 0, 0);
                }
                
                if (type != SCAN_OUT)
                {
+                       /*
+                       TDO should be sampled on the rising edge, and will change 
+                       on the falling edge. 
+                       
+                       Because there is no way to read the signal exactly at the rising edge,
+                       read after the rising edge.
+
+                       This is plain IEEE 1149 JTAG - nothing specific to the OpenOCD or its JTAG
+                       API. 
+                       */
                        if (bitbang_interface->read())
                                buffer[(bit_cnt)/8] |= 1 << ((bit_cnt) % 8);
                        else
                                buffer[(bit_cnt)/8] &= ~(1 << ((bit_cnt) % 8));
                }
        }
-
-       if ((type != SCAN_IN) && ((buffer[bit_cnt/8] >> (bit_cnt % 8)) & 0x1))
-               last_bit = 1;
-       else
-               last_bit = 0;
-
-       if ((ir_scan && (end_state == TAP_SI)) ||
-               (!ir_scan && (end_state == TAP_SD)))
-       {
-               bitbang_interface->write(0, 0, last_bit);
-               bitbang_interface->write(1, 0, last_bit);
-
-               if (type != SCAN_OUT)
-                       last_bit_in = bitbang_interface->read();
-
-               bitbang_interface->write(0, 0, last_bit);
-       }
+       
+       /* TAP_SD & TAP_SI are illegal end states, so we always transition to the pause
+        * state which is a legal stable state from which statemove will work.
+        *  
+        * Exit1 -> Pause 
+        */
+       bitbang_interface->write(0, 0, 0);
+       bitbang_interface->write(1, 0, 0);
+       bitbang_interface->write(0, 0, 0);
+       
+       if (ir_scan)
+               cur_state = TAP_PI;
        else
-       {
-               /* Shift-[ID]R -> Exit1-[ID]R */
-               bitbang_interface->write(0, 1, last_bit);
-               bitbang_interface->write(1, 1, last_bit);
-               
-               if (type != SCAN_OUT)
-                       last_bit_in = bitbang_interface->read();
-
-               /* Exit1-[ID]R -> Pause-[ID]R */
-               bitbang_interface->write(0, 0, 0);
-               bitbang_interface->write(1, 0, 0);
-               
-               if (cur_state == TAP_SI)
-                       cur_state = TAP_PI;
-               else
-                       cur_state = TAP_PD;
-
-               if (cur_state != end_state)
-                       bitbang_state_move();
-               else
-                       bitbang_interface->write(0, 0, 0);
-       }
-               
-       if (type != SCAN_OUT)
-       {
-               if (last_bit_in)
-                       buffer[(bit_cnt)/8] |= 1 << ((bit_cnt) % 8);
-               else
-                       buffer[(bit_cnt)/8] &= ~(1 << ((bit_cnt) % 8));
-       }
+               cur_state = TAP_PD;
+       
+       if (cur_state != end_state)
+               bitbang_state_move();
 }
 
 int bitbang_execute_queue(void)
index 463a1720e47322970ee59b3bd0232fc40b4de3eb..8f55ea0bff88c18181523a9d616037838ddc945b 100644 (file)
@@ -225,7 +225,7 @@ int jtag_speed_post_reset = 0;
 void jtag_add_statemove(enum tap_state endstate);
 void jtag_add_pathmove(int num_states, enum tap_state *path);
 void jtag_add_runtest(int num_cycles, enum tap_state endstate);
-int jtag_add_reset(int trst, int srst);
+void jtag_add_reset(int trst, int srst);
 void jtag_add_end_state(enum tap_state endstate);
 void jtag_add_sleep(u32 us);
 int jtag_execute_queue(void);
@@ -411,7 +411,7 @@ static void jtag_prelude(enum tap_state state)
        jtag_prelude1();
        
        if (state != -1)
-               cmd_queue_end_state = state;
+               jtag_add_end_state(state);
 
        cmd_queue_cur_state = cmd_queue_end_state;
 }
@@ -884,23 +884,18 @@ void jtag_add_runtest(int num_cycles, enum tap_state state)
                jtag_error=retval;
 }
 
-int jtag_add_reset(int req_trst, int req_srst)
+void jtag_add_reset(int req_trst, int req_srst)
 {
        int trst_with_tms = 0;
        int retval;
        
-       if (req_trst == -1)
-               req_trst = jtag_trst;
-       
-       if (req_srst == -1)
-               req_srst = jtag_srst;
-
        /* Make sure that jtag_reset_config allows the requested reset */
        /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
        if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (req_trst == 0))
        {
-               LOG_WARNING("requested reset would assert trst");
-               return ERROR_JTAG_RESET_WOULD_ASSERT_TRST;
+               LOG_ERROR("BUG: requested reset would assert trst");
+               jtag_error=ERROR_FAIL;
+               return;
        }
                
        /* if TRST pulls SRST, we reset with TAP T-L-R */
@@ -912,8 +907,9 @@ int jtag_add_reset(int req_trst, int req_srst)
        
        if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
        {
-               LOG_WARNING("requested nSRST assertion, but the current configuration doesn't support this");
-               return ERROR_JTAG_RESET_CANT_SRST;
+               LOG_ERROR("BUG: requested nSRST assertion, but the current configuration doesn't support this");
+               jtag_error=ERROR_FAIL;
+               return;
        }
        
        if (req_trst && !(jtag_reset_config & RESET_HAS_TRST))
@@ -929,7 +925,7 @@ int jtag_add_reset(int req_trst, int req_srst)
        if (retval!=ERROR_OK)
        {
                jtag_error=retval;
-               return retval;
+               return;
        }
 
        if (jtag_srst)
@@ -949,7 +945,7 @@ int jtag_add_reset(int req_trst, int req_srst)
                jtag_add_end_state(TAP_TLR);
                jtag_add_statemove(TAP_TLR);
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-               return ERROR_OK;
+               return;
        }
        
        if (jtag_trst)
@@ -970,7 +966,6 @@ int jtag_add_reset(int req_trst, int req_srst)
                if (jtag_ntrst_delay)
                        jtag_add_sleep(jtag_ntrst_delay * 1000);
        }
-       return ERROR_OK;
 }
 
 int MINIDRIVER(interface_jtag_add_reset)(int req_trst, int req_srst)
@@ -994,6 +989,10 @@ int MINIDRIVER(interface_jtag_add_reset)(int req_trst, int req_srst)
 void jtag_add_end_state(enum tap_state state)
 {
        cmd_queue_end_state = state;
+       if ((cmd_queue_end_state == TAP_SD)||(cmd_queue_end_state == TAP_SD))
+       {
+               LOG_ERROR("BUG: TAP_SD/SI can't be end state. Calling code should use a larger scan field");
+       }
 }
 
 int MINIDRIVER(interface_jtag_add_sleep)(u32 us)
index fca7c3500bddbb81ca04fc058db7d26e3880ecc5..4d482f063227f82b0a40d7082cbb05ad1333d8aa 100644 (file)
@@ -245,7 +245,11 @@ extern enum reset_types jtag_reset_config;
 extern int jtag_init(struct command_context_s *cmd_ctx);
 extern int jtag_register_commands(struct command_context_s *cmd_ctx);
 
-/* JTAG interface, can be implemented with a software or hardware fifo */
+/* JTAG interface, can be implemented with a software or hardware fifo
+ * 
+ * TAP_SD and TAP_SI are illegal end states. TAP_SD/SI as end states
+ * can be emulated by using a larger scan. 
+ */
 extern void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
@@ -294,16 +298,13 @@ extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
  */
 extern void jtag_add_runtest(int num_cycles, enum tap_state endstate);
 extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
-/* If it fails and one of the error messages below are returned, nothing is 
- * added to the queue and jtag_execute() won't return an error code.
- * 
- * ERROR_JTAG_RESET_WOULD_ASSERT_TRST
- * ERROR_JTAG_RESET_CANT_SRST
+/* Invoking jtag_add_reset() with unsupported combinations is
+ * not allowed and constitutes a bug in the calling code.
  * 
- * All other error codes will result in jtag_execute_queue() returning
- * an error.
+ * trst & srst must be 0 or 1. There is no way to 
+ * read the current reset state.
  */
-extern int jtag_add_reset(int trst, int srst);
+extern void jtag_add_reset(int trst, int srst);
 extern int interface_jtag_add_reset(int trst, int srst);
 extern void jtag_add_end_state(enum tap_state endstate);
 extern int interface_jtag_add_end_state(enum tap_state endstate);
@@ -357,8 +358,6 @@ extern int jtag_verify_capture_ir;
 #define ERROR_JTAG_NOT_IMPLEMENTED             (-102)
 #define ERROR_JTAG_TRST_ASSERTED               (-103)
 #define ERROR_JTAG_QUEUE_FAILED                        (-104)
-#define ERROR_JTAG_RESET_WOULD_ASSERT_TRST             (-105)
-#define ERROR_JTAG_RESET_CANT_SRST                             (-106)
 #define ERROR_JTAG_DEVICE_ERROR                        (-107)
 
 
index 4b393cc2b0fb8f583332f95b5c01099cf5513ac7..4208f38fa2d0e77f35619dcf97a50dfc62dd91ee 100644 (file)
@@ -735,10 +735,14 @@ int arm7_9_poll(target_t *target)
 
 int arm7_9_assert_reset(target_t *target)
 {
-       int retval;
-       
        LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
        
+       if (!(jtag_reset_config & RESET_HAS_SRST))
+       {
+               LOG_ERROR("Can't assert SRST");
+               return ERROR_FAIL;
+       }
+       
        if (target->state == TARGET_HALTED || target->state == TARGET_UNKNOWN)
        {
                /* if the target wasn't running, there might be working areas allocated */
@@ -746,46 +750,18 @@ int arm7_9_assert_reset(target_t *target)
                
                /* assert SRST and TRST */
                /* system would get ouf sync if we didn't reset test-logic, too */
-               if ((retval = jtag_add_reset(1, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_CANT_SRST)
-                       {
-                               return retval;
-                       }
-                       else
-                       {
-                               LOG_ERROR("unknown error");
-                               exit(-1);
-                       }
-               }
+               jtag_add_reset(1, 1);
+               
                jtag_add_sleep(5000);
-               if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
-                       {
-                               retval = jtag_add_reset(1, 1);
-                       }
-               }
+               
        }
-       else
+       
+       if (jtag_reset_config & RESET_SRST_PULLS_TRST)
        {
-               if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
-                       {
-                               retval = jtag_add_reset(1, 1);
-                       }
-                       
-                       if (retval == ERROR_JTAG_RESET_CANT_SRST)
-                       {
-                               return retval;
-                       }
-                       else if (retval != ERROR_OK)
-                       {
-                               LOG_ERROR("unknown error");
-                               exit(-1);
-                       }
-               }
+               jtag_add_reset(1, 1);
+       } else
+       {
+               jtag_add_reset(0, 1);
        }
        
        target->state = TARGET_RESET;
index aba15e7f547033160af1509e70a706b5d99b039c..aa67474508052eb9b8f1933797f7154b3d6cddc6 100644 (file)
@@ -701,13 +701,18 @@ int cortex_m3_step(struct target_s *target, int current, u32 address, int handle
 
 int cortex_m3_assert_reset(target_t *target)
 {
-       int retval;
        armv7m_common_t *armv7m = target->arch_info;
        cortex_m3_common_t *cortex_m3 = armv7m->arch_info;
        swjdp_common_t *swjdp = &cortex_m3->swjdp_info;
        
        LOG_DEBUG("target->state: %s", target_state_strings[target->state]);
        
+       if (!(jtag_reset_config & RESET_HAS_SRST))
+       {
+               LOG_ERROR("Can't assert SRST");
+               return ERROR_FAIL;
+       }
+
        ahbap_write_system_u32(swjdp, DCB_DCRDR, 0 );
        
        if (target->reset_mode == RESET_RUN)
@@ -727,46 +732,16 @@ int cortex_m3_assert_reset(target_t *target)
        {
                /* assert SRST and TRST */
                /* system would get ouf sync if we didn't reset test-logic, too */
-               if ((retval = jtag_add_reset(1, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_CANT_SRST)
-                       {
-                               return retval;
-                       }
-                       else
-                       {
-                               LOG_ERROR("unknown error");
-                               exit(-1);
-                       }
-               }
+               jtag_add_reset(1, 1);
                jtag_add_sleep(5000);
-               if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
-                       {
-                               retval = jtag_add_reset(1, 1);
-                       }
-               }
        }
-       else
+
+       if (jtag_reset_config & RESET_SRST_PULLS_TRST)
        {
-               if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
-               {
-                       if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
-                       {
-                               retval = jtag_add_reset(1, 1);
-                       }
-                       
-                       if (retval == ERROR_JTAG_RESET_CANT_SRST)
-                       {
-                               return retval;
-                       }
-                       else if (retval != ERROR_OK)
-                       {
-                               LOG_ERROR("unknown error");
-                               exit(-1);
-                       }
-               }
+               jtag_add_reset(1, 1);
+       } else
+       {
+               jtag_add_reset(0, 1);
        }
        
        target->state = TARGET_RESET;