- merged several changes from XScale
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 31 Jan 2007 10:59:20 +0000 (10:59 +0000)
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 31 Jan 2007 10:59:20 +0000 (10:59 +0000)
- complain about identify_chain scan with all bits one (jtag communication problem)
- add 0x80000 as a valid size for lpc2000_v2 flash banks (previously only the user accessible 0x7d000 were valid)

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

src/flash/lpc2000.c
src/jtag/gw16012.c
src/jtag/jtag.c
src/jtag/jtag.h
src/jtag/parport.c
src/openocd.c

index 16e20e2a6777db50bdbe3802bc43010bcbf1501f..f35c0ba0ebad3c72cced04502f159e660b94368a 100644 (file)
@@ -47,6 +47,8 @@
  * - 213x
  * - 214x
  * - 2101|2|3
+ * - 2364|6|8
+ * - 2378
  */
 
 int lpc2000_register_commands(struct command_context_s *cmd_ctx);
@@ -171,6 +173,7 @@ int lpc2000_build_sector_list(struct flash_bank_s *bank)
                        case 256 * 1024:
                                num_sectors = 15;
                                break;
+                       case 512 * 1024:
                        case 500 * 1024:
                                num_sectors = 27;
                                break;
index 6210a52c48821527901685a16ced649d48c766e5..218ac4c61e3b049ce7452d4cf37357bd92db4057 100644 (file)
 
 #include "jtag.h"
 
+#if 1
+#define _DEBUG_GW16012_IO_
+#endif
+
 /* system includes */
 
 /* system includes */
@@ -123,6 +127,10 @@ void gw16012_data(u8 value)
 {
        value = (value & 0x7f) | gw16012_msb;
        gw16012_msb ^= 0x80; /* toggle MSB */
+
+#ifdef _DEBUG_GW16012_IO_
+       DEBUG("%2.2x", value);
+#endif
        
        #if PARPORT_USE_PPDEV == 1
                ioctl(device_handle, PPWDATA, &value);
@@ -141,6 +149,10 @@ void gw16012_control(u8 value)
        {
                gw16012_control_value = value;
 
+#ifdef _DEBUG_GW16012_IO_
+               DEBUG("%2.2x", gw16012_control_value);
+#endif
+
                #if PARPORT_USE_PPDEV == 1
                        ioctl(device_handle, PPWCONTROL, &gw16012_control_value);
                #else
@@ -160,6 +172,10 @@ void gw16012_input(u8 *value)
        #else
                *value = inb(gw16012_port + 1);
        #endif
+
+#ifdef _DEBUG_GW16012_IO_
+       DEBUG("%2.2x", *value);
+#endif
 }
 
 /* (1) assert or (0) deassert reset lines */
@@ -211,6 +227,37 @@ void gw16012_state_move(void)
        cur_state = end_state;
 }
 
+void gw16012_path_move(pathmove_command_t *cmd)
+{
+       int num_states = cmd->num_states;
+       int state_count;
+
+       state_count = 0;
+       while (num_states)
+       {
+               gw16012_control(0x0); /* single-bit mode */
+               if (tap_transitions[cur_state].low == cmd->path[state_count])
+               {
+                       gw16012_data(0x0); /* TCK cycle with TMS low */
+               }
+               else if (tap_transitions[cur_state].high == cmd->path[state_count])
+               {
+                       gw16012_data(0x2); /* TCK cycle with TMS high */
+               }
+               else
+               {
+                       ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[state_count]]);
+                       exit(-1);
+               }
+               
+               cur_state = cmd->path[state_count];
+               state_count++;
+               num_states--;
+       }
+       
+       end_state = cur_state;
+}
+
 void gw16012_runtest(int num_cycles)
 {
        enum tap_state saved_end_state = end_state;
@@ -343,6 +390,12 @@ int gw16012_execute_queue(void)
                                        gw16012_end_state(cmd->cmd.statemove->end_state);
                                gw16012_state_move();
                                break;
+                       case JTAG_PATHMOVE:
+#ifdef _DEBUG_JTAG_IO_
+                               DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
+#endif
+                               gw16012_path_move(cmd->cmd.pathmove);
+                               break;
                        case JTAG_SCAN:
                                if (cmd->cmd.scan->end_state != -1)
                                        gw16012_end_state(cmd->cmd.scan->end_state);
index cc9f8dc4502368b3e68cc964c033f44ae01738fc..a3e8cff8dba11eb9703b0995979e7d69935dfc15 100644 (file)
@@ -95,6 +95,14 @@ tap_transition_t tap_transitions[16] =
        {TAP_SDS, TAP_RTI}              /* UI  */
 };
 
+char* jtag_event_strings[] =
+{
+       "SRST asserted",
+       "TRST asserted",
+       "SRST released",
+       "TRST released"
+};
+
 enum tap_state end_state = TAP_TLR;
 enum tap_state cur_state = TAP_TLR;
 int jtag_trst = 0;
@@ -184,6 +192,18 @@ char* jtag_interface = NULL;
 int jtag_speed = -1;
 
 /* forward declarations */
+int jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+int jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+int jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+int jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+int jtag_add_statemove(enum tap_state endstate);
+int jtag_add_pathmove(int num_states, enum tap_state *path);
+int jtag_add_runtest(int num_cycles, enum tap_state endstate);
+int jtag_add_reset(int trst, int srst);
+int jtag_add_end_state(enum tap_state endstate);
+int jtag_add_sleep(u32 us);
+int jtag_execute_queue(void);
+int jtag_cancel_queue(void);
 
 /* jtag commands */
 int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -255,7 +275,7 @@ int jtag_call_event_callbacks(enum jtag_event event)
 {
        jtag_event_callback_t *callback = jtag_event_callbacks;
        
-       DEBUG("jtag event: %i", event);
+       DEBUG("jtag event: %s", jtag_event_strings[event]);
        
        while (callback)
        {
@@ -1128,7 +1148,8 @@ int jtag_examine_chain()
        int i;
        int bit_count;
        int device_count = 0;
-       u8 valid = 0x0;
+       u8 zero_check = 0x0;
+       u8 one_check = 0xff;
        
        field.device = 0;
        field.num_bits = sizeof(idcode_buffer) * 8;
@@ -1150,11 +1171,12 @@ int jtag_examine_chain()
        
        for (i = 0; i < JTAG_MAX_CHAIN_SIZE * 4; i++)
        {
-               valid |= idcode_buffer[i];
+               zero_check |= idcode_buffer[i];
+               one_check &= idcode_buffer[i];
        }
        
-       /* if there wasn't a single non-zero bit, the scan isn't valid */
-       if (!valid)
+       /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
+       if ((zero_check == 0x00) || (one_check == 0xff))
        {
                ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
                exit(-1);
index 7ad38278029006cc3677b67706e1cef6ca84d147..ad038ae5f03f98ee6a44a086632e87bc65172a67 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "command.h"
 
-#if 0
+#if 1
 #define _DEBUG_JTAG_IO_
 #endif
 
@@ -199,6 +199,8 @@ enum jtag_event
        JTAG_TRST_RELEASED,
 };
 
+extern char* jtag_event_strings[];
+
 extern int jtag_trst;
 extern int jtag_srst;
 
index 9485f7d9d61f4f24b44edaa64bd7eb3c0eeb2782..83006d866e9040e46018de8b699e3b7abfd035df 100644 (file)
@@ -99,7 +99,7 @@ cable_t cables[] =
        { "dlc5",                               0x10, 0x00, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x10 },
        { "triton",                             0x80, 0x08, 0x04, 0x01, 0x02, 0x00, 0x00, 0x80, 0x00 },
        { "lattice",                    0x40, 0x10, 0x04, 0x02, 0x01, 0x08, 0x00, 0x00, 0x18 },
-       { "flashlink",                  0x20, 0x10, 0x02, 0x01, 0x04, 0x20,0x30, 0x20, 0x00 },
+       { "flashlink",                  0x20, 0x10, 0x02, 0x01, 0x04, 0x20, 0x30, 0x20, 0x00 },
        { NULL,                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
 };
 
index 502e9740e368249a572644a56ba026a145a7b53f..f10c1a98c97bb7d488a74d975a682ed4097b32ef 100644 (file)
@@ -18,7 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#define OPENOCD_VERSION "Open On-Chip Debugger (2006-01-26 13:30 CET)"
+#define OPENOCD_VERSION "Open On-Chip Debugger (2007-01-31 12:00 CET)"
 
 #ifdef HAVE_CONFIG_H
 #include "config.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)