Duane Ellis: "target as an [tcl] object" feature.
[openocd.git] / src / target / target.h
index 6ce8fee9fccca1ca51f6566e9e2b10cece11d39f..c6f6beddc12f8bdced3842f14bbbbd7033e70014 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                      *
+ *   oyvind.harboe@zylin.com                                               *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -52,25 +55,25 @@ enum target_state
        TARGET_DEBUG_RUNNING = 4,
 };
 
-extern char *target_state_strings[];
+extern const Jim_Nvp nvp_target_state[];
 
-enum daemon_startup_mode
-{
-       DAEMON_ATTACH,          /* simply attach to the target */
-       DAEMON_RESET,           /* reset target (behaviour defined by reset_mode */
+enum nvp_assert {
+       NVP_DEASSERT,
+       NVP_ASSERT,
 };
 
-extern enum daemon_startup_mode startup_mode;
+extern const Jim_Nvp nvp_assert[];
 
 enum target_reset_mode
 {
-       RESET_RUN = 0,          /* reset and let target run */
-       RESET_HALT = 1,         /* reset and halt target out of reset */
-       RESET_INIT = 2,         /* reset and halt target out of reset, then run init script */
-       RESET_RUN_AND_HALT = 3, /* reset and let target run, halt after n milliseconds */
-       RESET_RUN_AND_INIT = 4, /* reset and let target run, halt after n milliseconds, then run init script */
+       RESET_UNKNOWN = 0,
+       RESET_RUN = 1,          /* reset and let target run */
+       RESET_HALT = 2,         /* reset and halt target out of reset */
+       RESET_INIT = 3,         /* reset and halt target out of reset, then run init script */
 };
 
+extern const Jim_Nvp nvp_reset_mode[];
+
 enum target_debug_reason
 {
        DBG_REASON_DBGRQ = 0,
@@ -82,14 +85,15 @@ enum target_debug_reason
        DBG_REASON_UNDEFINED = 6
 };
 
-extern char *target_debug_reason_strings[];
+extern const Jim_Nvp nvp_target_debug_reason[];
 
 enum target_endianess
 {
-       TARGET_BIG_ENDIAN = 0, TARGET_LITTLE_ENDIAN = 1
+       TARGET_ENDIAN_UNKNOWN=0,
+       TARGET_BIG_ENDIAN = 1, TARGET_LITTLE_ENDIAN = 2
 };
 
-extern char *target_endianess_strings[];
+extern const Jim_Nvp nvp_target_endian[];
 
 struct target_s;
 
@@ -106,6 +110,8 @@ typedef struct working_area_s
 typedef struct target_type_s
 {
        char *name;
+       
+       int examined;
 
        /* poll current target status */
        int (*poll)(struct target_s *target);
@@ -130,9 +136,15 @@ typedef struct target_type_s
         * assert_reset() can therefore make no assumptions whatsoever about the
         * state of the target 
         * 
+        * Before assert_reset() for the target is invoked, a TRST/tms and
+        * chain validation is executed. TRST should not be asserted
+        * during target assert unless there is no way around it due to
+        * the way reset's are configured.
+        * 
         */
        int (*assert_reset)(struct target_s *target);
        int (*deassert_reset)(struct target_s *target);
+       int (*soft_reset_halt_imp)(struct target_s *target);
        int (*soft_reset_halt)(struct target_s *target);
        
        /* target register access for gdb.
@@ -150,27 +162,70 @@ typedef struct target_type_s
        * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
        * count: number of items of <size>
        */
+       int (*read_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
        int (*read_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+       int (*write_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
        int (*write_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
        
        /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
        int (*bulk_write_memory)(struct target_s *target, u32 address, u32 count, u8 *buffer);
        
        int (*checksum_memory)(struct target_s *target, u32 address, u32 count, u32* checksum);
+       int (*blank_check_memory)(struct target_s *target, u32 address, u32 count, u32* blank);
        
-       /* target break-/watchpoint control 
-       * rw: 0 = write, 1 = read, 2 = access
-       */
+       /* 
+        * target break-/watchpoint control 
+        * rw: 0 = write, 1 = read, 2 = access
+        * 
+        * Target must be halted while this is invoked as this
+        * will actually set up breakpoints on target.
+        * 
+        * The breakpoint hardware will be set up upon adding the first breakpoint.
+        * 
+        * Upon GDB connection all breakpoints/watchpoints are cleared.
+        */
        int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
+       
+       /* remove breakpoint. hw will only be updated if the target is currently halted.
+        * However, this method can be invoked on unresponsive targets.
+        */
        int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
        int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
+       /* remove watchpoint. hw will only be updated if the target is currently halted.
+        * However, this method can be invoked on unresponsive targets.
+        */
        int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
 
        /* target algorithm support */
+       int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
        int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
-       
-       int (*register_commands)(struct command_context_s *cmd_ctx);
-       int (*target_command)(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+
+       int (*register_commands)(struct command_context_s *cmd_ctx);    
+
+       /* called when target is created */
+       int (*target_create)( struct target_s *target, Jim_Interp *interp );
+
+       /* called for various config parameters */
+       /* returns JIM_CONTINUE - if option not understood */
+       /* otherwise: JIM_OK, or JIM_ERR, */
+       int (*target_jim_configure)( struct target_s *target, Jim_GetOptInfo *goi );
+
+       /* target commands specifically handled by the target */
+       /* returns JIM_OK, or JIM_ERR, or JIM_CONTINUE - if option not understood */
+       int (*target_jim_commands)( struct target_s *target, Jim_GetOptInfo *goi );
+
+       /* invoked after JTAG chain has been examined & validated. During
+        * this stage the target is examined and any additional setup is
+        * performed.
+        * 
+        * invoked every time after the jtag chain has been validated/examined
+        */
+       int (*examine)(struct target_s *target);
+       /* Set up structures for target.
+        *  
+        * It is illegal to talk to the target at this stage as this fn is invoked
+        * before the JTAG chain has been examined/verified
+     */
        int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
        int (*quit)(void);
        
@@ -179,18 +234,22 @@ typedef struct target_type_s
        
 } target_type_t;
 
+// forward decloration
+typedef struct target_event_action_s target_event_action_t;
+
 typedef struct target_s
 {
        target_type_t *type;                            /* target type definition (name, access functions) */
-       enum target_reset_mode reset_mode;      /* what to do after a reset */
-       int run_and_halt_time;                          /* how long the target should run after a run_and_halt reset */
-       char *reset_script;                                     /* script file to initialize the target after a reset */
-       char *post_halt_script;                         /* script file to execute after the target halted */
-       char *pre_resume_script;                        /* script file to execute before the target resumed */
-       char *gdb_program_script;                       /* script file to execute before programming vis gdb */
+       const char *cmd_name;               /* tcl Name of target */
+       int target_number;                  /* generaly, target index but may not be in order */
+       int chain_position;                 /* where on the jtag chain is this */
+       const char *variant;                /* what varient of this chip is it? */
+       enum target_reset_mode reset_mode;  /* how should this target be reset */
+       target_event_action_t *event_action;
+
+       int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
        u32 working_area;                                       /* working area (initialized RAM). Evaluated 
-                                                                                  upon first allocation from virtual/physical address.
-                                                                                 */
+                                                                                  upon first allocation from virtual/physical address. */
        u32 working_area_virt;                          /* virtual address */
        u32 working_area_phys;                          /* physical address */
        u32 working_area_size;                          /* size in bytes */
@@ -211,14 +270,58 @@ typedef struct target_s
 
 enum target_event
 {
-       TARGET_EVENT_HALTED,            /* target entered debug state from normal execution or reset */
-       TARGET_EVENT_RESUMED,           /* target resumed to normal execution */
-       TARGET_EVENT_RESET,                     /* target entered reset */
-       TARGET_EVENT_DEBUG_HALTED,      /* target entered debug state, but was executing on behalf of the debugger */
-       TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */
-       TARGET_EVENT_GDB_PROGRAM        /* target about to be be programmed by gdb */
+       // OLD historical names
+       //  - Prior to the great TCL change
+       //  - June/July/Aug 2008
+       //  - Duane Ellis
+       TARGET_EVENT_OLD_gdb_program_config,
+       TARGET_EVENT_OLD_pre_reset,
+       TARGET_EVENT_OLD_post_reset,
+       TARGET_EVENT_OLD_pre_resume,
+
+       TARGET_EVENT_HALTED,            /* target entered debug state from normal execution or reset */
+       TARGET_EVENT_RESUMED,           /* target resumed to normal execution */
+       TARGET_EVENT_RESUME_START,
+       TARGET_EVENT_RESUME_END,
+
+       TARGET_EVENT_RESET_START,
+       TARGET_EVENT_RESET_ASSERT_PRE,
+       TARGET_EVENT_RESET_ASSERT_POST,
+       TARGET_EVENT_RESET_DEASSERT_PRE,
+       TARGET_EVENT_RESET_DEASSERT_POST,
+       TARGET_EVENT_RESET_HALT_PRE,
+       TARGET_EVENT_RESET_HALT_POST,
+       TARGET_EVENT_RESET_WAIT_PRE,
+       TARGET_EVENT_RESET_WAIT_POST,
+       TARGET_EVENT_RESET_INIT,
+       TARGET_EVENT_RESET_END,
+
+
+       TARGET_EVENT_DEBUG_HALTED,      /* target entered debug state, but was executing on behalf of the debugger */
+       TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */
+
+       TARGET_EVENT_EXAMINE_START,
+       TARGET_EVENT_EXAMINE_END,
+       
+
+       TARGET_EVENT_GDB_ATTACH,
+       TARGET_EVENT_GDB_DETACH,
+
+       TARGET_EVENT_GDB_FLASH_ERASE_START,
+       TARGET_EVENT_GDB_FLASH_ERASE_END,
+       TARGET_EVENT_GDB_FLASH_WRITE_START,
+       TARGET_EVENT_GDB_FLASH_WRITE_END,
 };
 
+extern const Jim_Nvp nvp_target_event[];
+
+struct target_event_action_s {
+       enum target_event event;
+       Jim_Obj *body;
+       int      has_percent;
+       target_event_action_t *next;
+ };
+
 typedef struct target_event_callback_s
 {
        int (*callback)(struct target_s *target, enum target_event event, void *priv);
@@ -239,12 +342,15 @@ typedef struct target_timer_callback_s
 extern int target_register_commands(struct command_context_s *cmd_ctx);
 extern int target_register_user_commands(struct command_context_s *cmd_ctx);
 extern int target_init(struct command_context_s *cmd_ctx);
-extern int target_init_reset(struct command_context_s *cmd_ctx);
+extern int target_examine(void);
 extern int handle_target(void *priv);
-extern int target_process_reset(struct command_context_s *cmd_ctx);
+extern int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode);
 
 extern int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
 extern int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv);
+extern int target_poll(target_t *target);
+extern int target_resume(target_t *target, int current, u32 address, int handle_breakpoints, int debug_execution);
+extern int target_halt(target_t *target);
 extern int target_call_event_callbacks(target_t *target, enum target_event event);
 
 /* The period is very approximate, the callback can happen much more often 
@@ -252,11 +358,11 @@ extern int target_call_event_callbacks(target_t *target, enum target_event event
  */
 extern int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv);
 extern int target_unregister_timer_callback(int (*callback)(void *priv), void *priv);
-extern int target_call_timer_callbacks();
+extern int target_call_timer_callbacks(void);
 /* invoke this to ensure that e.g. polling timer callbacks happen before
  * a syncrhonous command completes.
  */
-extern int target_call_timer_callbacks_now();
+extern int target_call_timer_callbacks_now(void);
 
 extern target_t* get_current_target(struct command_context_s *cmd_ctx);
 extern int get_num_by_target(target_t *query_target);
@@ -265,6 +371,8 @@ extern target_t* get_target_by_num(int num);
 extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);
 extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);
 extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc);
+extern int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank);
+extern int target_wait_state(target_t *target, enum target_state state, int ms);
 
 /* DANGER!!!!!
  * 
@@ -283,16 +391,17 @@ extern int target_free_working_area_restore(struct target_s *target, working_are
 extern int target_free_all_working_areas(struct target_s *target);
 extern int target_free_all_working_areas_restore(struct target_s *target, int restore);
 
-
-extern target_t *targets;
+extern target_t *all_targets;
 
 extern target_event_callback_t *target_event_callbacks;
 extern target_timer_callback_t *target_timer_callbacks;
 
 extern u32 target_buffer_get_u32(target_t *target, u8 *buffer);
 extern u16 target_buffer_get_u16(target_t *target, u8 *buffer);
+extern u8  target_buffer_get_u8 (target_t *target, u8 *buffer);
 extern void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value);
 extern void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value);
+extern void target_buffer_set_u8 (target_t *target, u8 *buffer, u8  value);
 
 int target_read_u32(struct target_s *target, u32 address, u32 *value);
 int target_read_u16(struct target_s *target, u32 address, u16 *value);
@@ -304,6 +413,10 @@ int target_write_u8(struct target_s *target, u32 address, u8 value);
 /* Issues USER() statements with target state information */
 int target_arch_state(struct target_s *target);
 
+void target_handle_event( target_t *t, enum target_event e);
+void target_all_handle_event( enum target_event e );
+
+
 #define ERROR_TARGET_INVALID   (-300)
 #define ERROR_TARGET_INIT_FAILED (-301)
 #define ERROR_TARGET_TIMEOUT   (-302)
@@ -313,5 +426,18 @@ int target_arch_state(struct target_s *target);
 #define ERROR_TARGET_DATA_ABORT        (-307)
 #define ERROR_TARGET_RESOURCE_NOT_AVAILABLE    (-308)
 #define ERROR_TARGET_TRANSLATION_FAULT (-309)
+#define ERROR_TARGET_NOT_RUNNING (-310)
+#define ERROR_TARGET_NOT_EXAMINED (-311)
+
+extern const Jim_Nvp nvp_error_target[];
+extern const char *target_strerror_safe( int err );
 
 #endif /* TARGET_H */
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */

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)