- jtag minidriver work in progress
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 26 Feb 2008 06:25:22 +0000 (06:25 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 26 Feb 2008 06:25:22 +0000 (06:25 +0000)
- svn:eol-style=native. Let's see how that works out :-)

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

src/jtag/jtag.c
src/jtag/jtag.h

index 5ec8297d246f565fb3836bb9a67c443d0edf80c2..eb4a245aa7b54dac15e2eb8eb751ad588de1da9e 100644 (file)
 #include "string.h"
 #include <unistd.h>
 
+#ifndef INTERFACE
+/* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
+#define INTERFACE(a) a
+#endif
+
+
+/* note that this is not marked as static as it must be available from outside jtag.c for those 
+   that implement the jtag_xxx() minidriver layer 
+*/
+int jtag_error=ERROR_OK; 
+
+
 char* tap_state_strings[16] =
 {
        "tlr", 
@@ -381,17 +393,38 @@ void cmd_queue_free()
 
 int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
 {
-       jtag_command_t **last_cmd;
-       jtag_device_t *device;
-       int i, j;
-       int scan_size = 0;
-
        if (jtag_trst == 1)
        {
                WARNING("JTAG command queued, while TRST is low (TAP in reset)");
+               jtag_error=ERROR_JTAG_TRST_ASSERTED;
                return ERROR_JTAG_TRST_ASSERTED;
        }
 
+       if (state != -1)
+               cmd_queue_end_state = state;
+
+       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
+               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
+       
+       if (cmd_queue_end_state == TAP_TLR)
+               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
+       
+       cmd_queue_cur_state = cmd_queue_end_state;
+       
+       int retval=interface_jtag_add_ir_scan(num_fields, fields, state);
+       if (retval!=ERROR_OK)
+               jtag_error=retval;
+       return retval;
+}
+
+int INTERFACE(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+{      
+       jtag_command_t **last_cmd;
+       jtag_device_t *device;
+       int i, j;
+       int scan_size = 0;
+
+
        last_cmd = jtag_get_last_command_p();
        
        /* allocate memory for a new list member */
@@ -406,18 +439,7 @@ int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
        (*last_cmd)->cmd.scan->num_fields = jtag_num_devices;   /* one field per device */
        (*last_cmd)->cmd.scan->fields = cmd_queue_alloc(jtag_num_devices * sizeof(scan_field_t));
        (*last_cmd)->cmd.scan->end_state = state;
-               
-       if (state != -1)
-               cmd_queue_end_state = state;
 
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-       
-       cmd_queue_cur_state = cmd_queue_end_state;
-               
        for (i = 0; i < jtag_num_devices; i++)
        {
                int found = 0;
@@ -680,23 +702,12 @@ int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state
 }
 int jtag_add_statemove(enum tap_state state)
 {
-       jtag_command_t **last_cmd = jtag_get_last_command_p();
-       
        if (jtag_trst == 1)
        {
                WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               return ERROR_JTAG_TRST_ASSERTED;
+               return jtag_error=ERROR_JTAG_TRST_ASSERTED;
        }
 
-       /* allocate memory for a new list member */
-       *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;
-       
        if (state != -1)
                cmd_queue_end_state = state;
 
@@ -707,6 +718,23 @@ int jtag_add_statemove(enum tap_state state)
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
                        
        cmd_queue_cur_state = cmd_queue_end_state;
+
+       return interface_jtag_add_statemove(state);
+}
+
+int INTERFACE(interface_jtag_add_statemove)(enum tap_state state)
+{
+       jtag_command_t **last_cmd = jtag_get_last_command_p();
+       
+       /* allocate memory for a new list member */
+       *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;
+       
        
        return ERROR_OK;
 }
@@ -753,16 +781,10 @@ int jtag_add_pathmove(int num_states, enum tap_state *path)
        return ERROR_OK;
 }
 
-int jtag_add_runtest(int num_cycles, enum tap_state state)
+int INTERFACE(interface_jtag_add_runtest)(int num_cycles, enum tap_state state)
 {
        jtag_command_t **last_cmd = jtag_get_last_command_p();
        
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               return ERROR_JTAG_TRST_ASSERTED;
-       }
-
        /* allocate memory for a new list member */
        *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
        (*last_cmd)->next = NULL;
@@ -773,6 +795,18 @@ int jtag_add_runtest(int num_cycles, enum tap_state state)
        (*last_cmd)->cmd.runtest->num_cycles = num_cycles;
        (*last_cmd)->cmd.runtest->end_state = state;
        
+       return ERROR_OK;
+}
+
+int jtag_add_runtest(int num_cycles, enum tap_state state)
+{
+       if (jtag_trst == 1)
+       {
+               jtag_error=ERROR_JTAG_QUEUE_FAILED;
+               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
+               return ERROR_JTAG_TRST_ASSERTED;
+       }
+       
        if (state != -1)
                cmd_queue_end_state = state;
 
@@ -784,14 +818,14 @@ int jtag_add_runtest(int num_cycles, enum tap_state state)
                        
        cmd_queue_cur_state = cmd_queue_end_state;
        
-       return ERROR_OK;
+       /* executed by sw or hw fifo */
+       return interface_jtag_add_runtest(num_cycles, state);
 }
 
 int jtag_add_reset(int req_trst, int req_srst)
 {
        int trst_with_tms = 0;
-       
-       jtag_command_t **last_cmd = jtag_get_last_command_p();
+       int retval;
        
        if (req_trst == -1)
                req_trst = jtag_trst;
@@ -802,7 +836,9 @@ int jtag_add_reset(int req_trst, int req_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))
-               return ERROR_JTAG_RESET_WOULD_ASSERT_TRST;
+       {
+               return jtag_error=ERROR_JTAG_RESET_WOULD_ASSERT_TRST;
+       }
                
        /* if TRST pulls SRST, we reset with TAP T-L-R */
        if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_trst == 1)) && (req_srst == 0))
@@ -814,7 +850,7 @@ int jtag_add_reset(int req_trst, int req_srst)
        if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
        {
                ERROR("requested nSRST assertion, but the current configuration doesn't support this");
-               return ERROR_JTAG_RESET_CANT_SRST;
+               return jtag_error=ERROR_JTAG_RESET_CANT_SRST;
        }
        
        if (req_trst && !(jtag_reset_config & RESET_HAS_TRST))
@@ -822,16 +858,6 @@ int jtag_add_reset(int req_trst, int req_srst)
                req_trst = 0;
                trst_with_tms = 1;
        }
-       
-       /* allocate memory for a new list member */
-       *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
-       (*last_cmd)->next = NULL;
-       last_comand_pointer = &((*last_cmd)->next);
-       (*last_cmd)->type = JTAG_RESET;
-
-       (*last_cmd)->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
-       (*last_cmd)->cmd.reset->trst = req_trst;
-       (*last_cmd)->cmd.reset->srst = req_srst;
 
        jtag_trst = req_trst;
        jtag_srst = req_srst;
@@ -849,17 +875,6 @@ int jtag_add_reset(int req_trst, int req_srst)
        
        if (trst_with_tms)
        {
-               last_cmd = &((*last_cmd)->next);
-               
-               /* allocate memory for a new list member */
-               *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
-               (*last_cmd)->next = NULL;
-               last_comand_pointer = &((*last_cmd)->next);
-               (*last_cmd)->type = JTAG_STATEMOVE;
-
-               (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
-               (*last_cmd)->cmd.statemove->end_state = TAP_TLR;
-               
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
                cmd_queue_cur_state = TAP_TLR;
                cmd_queue_end_state = TAP_TLR;
@@ -885,7 +900,34 @@ int jtag_add_reset(int req_trst, int req_srst)
                                jtag_add_sleep(jtag_ntrst_delay * 1000);
                }
        }
+       retval = interface_jtag_add_reset(req_trst, req_srst);
+       if (retval!=ERROR_OK)
+               jtag_error=retval;
+       
+       if (trst_with_tms)
+       {
+               jtag_add_statemove(TAP_TLR);
+       }
+       
+       return retval;
+       
+}
+
+int INTERFACE(interface_jtag_add_reset)(int req_trst, int req_srst)
+{
+       jtag_command_t **last_cmd = jtag_get_last_command_p();
 
+       /* allocate memory for a new list member */
+       *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+       (*last_cmd)->next = NULL;
+       last_comand_pointer = &((*last_cmd)->next);
+       (*last_cmd)->type = JTAG_RESET;
+
+       (*last_cmd)->cmd.reset = cmd_queue_alloc(sizeof(reset_command_t));
+       (*last_cmd)->cmd.reset->trst = req_trst;
+       (*last_cmd)->cmd.reset->srst = req_srst;
+
+       
        return ERROR_OK;
 }
 
@@ -1107,7 +1149,7 @@ enum scan_type jtag_scan_type(scan_command_t *cmd)
        return type;
 }
 
-int jtag_execute_queue(void)
+int INTERFACE(interface_jtag_execute_queue)(void)
 {
        int retval;
 
@@ -1118,6 +1160,18 @@ int jtag_execute_queue(void)
        jtag_command_queue = NULL;
        last_comand_pointer = &jtag_command_queue;
 
+       jtag_error=ERROR_OK;
+
+       return retval;
+}
+
+int jtag_execute_queue(void)
+{
+       int retval=interface_jtag_execute_queue();
+       if (retval!=ERROR_OK)
+               return retval;
+       retval=jtag_error;
+       jtag_error=ERROR_OK;
        return retval;
 }
 
index 95a86e65aa1d35c12608fe9f51f9fdb004d8ae6a..0c9c3675a8587d78314398456fd2f1ce3c3f205e 100644 (file)
@@ -77,12 +77,13 @@ typedef struct scan_field_s
        u8 *out_mask;           /* only masked bits care */
        u8 *in_value;           /* pointer to a 32-bit memory location to take data scanned out */
        /* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage  */
-       u8 *in_check_value;             /* used to validate scan results */ 
-       u8 *in_check_mask;              /* check specified bits against check_value */
+       u8 *in_check_value;     /* used to validate scan results */ 
+       u8 *in_check_mask;      /* check specified bits against check_value */
        in_handler_t in_handler;            /* process received buffer using this handler */
        void *in_handler_priv;  /* additional information for the in_handler */
 } scan_field_t;
 
+
 enum scan_type
 {
        /* IN: from device to host, OUT: from host to device */
@@ -244,9 +245,13 @@ extern int jtag_register_commands(struct command_context_s *cmd_ctx);
 
 /* JTAG interface, can be implemented with a software or hardware fifo */
 extern int 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 int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 extern int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
 /* execute a state transition within the JTAG standard, but the exact path
  * path that is taken is undefined. Many implementations use precisely
  * 7 clocks to perform a transition, but it could be more or less
@@ -266,16 +271,22 @@ extern int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap
  *   side effects.
  */
 extern int jtag_add_statemove(enum tap_state endstate);
+extern int interface_jtag_add_statemove(enum tap_state endstate);
 /* A list of unambigious single clock state transitions, not
  * all drivers can support this, but it is required for e.g.
  * XScale and Xilinx support
  */
 extern int jtag_add_pathmove(int num_states, enum tap_state *path);
+extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
 /* cycle precisely num_cycles in the TAP_RTI state */
 extern int jtag_add_runtest(int num_cycles, enum tap_state endstate);
+extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
 extern int jtag_add_reset(int trst, int srst);
+extern int interface_jtag_add_reset(int trst, int srst);
 extern int jtag_add_end_state(enum tap_state endstate);
+extern int inteface_jtag_add_end_state(enum tap_state endstate);
 extern int jtag_add_sleep(u32 us);
+extern int interface_jtag_add_sleep(u32 us);
 /*
  * For software FIFO implementations, the queued commands can be executed 
  * during this call or earlier. A sw queue might decide to push out
@@ -297,6 +308,8 @@ extern int jtag_add_sleep(u32 us);
  * at some time between the jtag_add_xxx() fn call and jtag_execute_queue().  
  */
 extern int jtag_execute_queue(void);
+/* can be implemented by hw+sw */
+extern int interface_jtag_execute_queue(void);
 
 /* JTAG support functions */
 extern void jtag_set_check_value(scan_field_t *field, u8 *value,  u8 *mask, error_handler_t *in_error_handler);
@@ -323,4 +336,6 @@ extern int jtag_verify_capture_ir;
 #define ERROR_JTAG_RESET_WOULD_ASSERT_TRST             (-105)
 #define ERROR_JTAG_RESET_CANT_SRST                             (-106)
 #define ERROR_JTAG_DEVICE_ERROR                        (-107)
+
+
 #endif /* JTAG_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)