pipes: add documentation for pipes
[fw/openocd] / src / target / target.h
index 5f29e7f4526e77701ec614eb2ba80d799b2ba928..4a48e5aad6c08c892d16e57d9d3d3fde1b74e83c 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008,2009 Øyvind Harboe                            *
+ *   Copyright (C) 2007-2010 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
 #ifndef TARGET_H
 #define TARGET_H
 
-#include <stddef.h>
-
-#include "breakpoints.h"
-#include "algorithm.h"
-#include "command.h"
+#include <helper/types.h>
 
 struct reg;
 struct trace;
-struct command_context_s;
-
+struct command_context;
+struct breakpoint;
+struct watchpoint;
+struct mem_param;
+struct reg_param;
 
-/**
- * Cast a member of a structure out to the containing structure.
- * @param ptr The pointer to the member.
- * @param type The type of the container struct this is embedded in.
- * @param member The name of the member within the struct.
- *
- * This is a mechanism which is used throughout the Linux kernel.
- */
-#define container_of(ptr, type, member) ({                     \
-       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
-       (type *)( (char *)__mptr - offsetof(type,member) );})
 
 /*
  * TARGET_UNKNOWN = 0: we don't know anything about the target yet
@@ -72,15 +60,11 @@ enum target_state
        TARGET_DEBUG_RUNNING = 4,
 };
 
-extern const Jim_Nvp nvp_target_state[];
-
 enum nvp_assert {
        NVP_DEASSERT,
        NVP_ASSERT,
 };
 
-extern const Jim_Nvp nvp_assert[];
-
 enum target_reset_mode
 {
        RESET_UNKNOWN = 0,
@@ -89,8 +73,6 @@ enum target_reset_mode
        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,
@@ -102,16 +84,12 @@ enum target_debug_reason
        DBG_REASON_UNDEFINED = 6
 };
 
-extern const Jim_Nvp nvp_target_debug_reason[];
-
 enum target_endianess
 {
        TARGET_ENDIAN_UNKNOWN = 0,
        TARGET_BIG_ENDIAN = 1, TARGET_LITTLE_ENDIAN = 2
 };
 
-extern const Jim_Nvp nvp_target_endian[];
-
 struct working_area
 {
        uint32_t address;
@@ -129,7 +107,24 @@ struct target
        const char *cmd_name;                           /* tcl Name of target */
        int target_number;                                      /* DO NOT USE!  field to be removed in 2010 */
        struct jtag_tap *tap;                                   /* where on the jtag chain is this */
-       const char *variant;                            /* what varient of this chip is it? */
+       const char *variant;                            /* what variant of this chip is it? */
+
+       /**
+        * Indicates whether this target has been examined.
+        *
+        * Do @b not access this field directly, use target_was_examined()
+        * or target_set_examined().
+        */
+       bool examined;
+
+       /** true iff the  target is currently running a downloaded
+        *  "algorithm" instetad of arbitrary user code.  OpenOCD code
+        *  invoking algorithms is trusted to maintain correctness of
+        *  any cached state (e.g. for flash status), which arbitrary
+        *  code will have no reason to know about.
+        */
+       bool running_alg;
+
        struct target_event_action *event_action;
 
        int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
@@ -161,6 +156,14 @@ struct target
        long long halt_issued_time;                     /* Note time when halt was issued */
 };
 
+/** Returns the instance-specific name of the specified target. */
+static inline const char *target_name(struct target *target)
+{
+       return target->cmd_name;
+}
+
+const char *debug_reason_name(struct target *t);
+
 enum target_event
 {
        /* LD historical names
@@ -168,8 +171,6 @@ enum target_event
         * - 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,
 
        /* allow GDB to do stuff before others handle the halted event,
@@ -192,6 +193,7 @@ enum target_event
 
        TARGET_EVENT_RESET_START,
        TARGET_EVENT_RESET_ASSERT_PRE,
+       TARGET_EVENT_RESET_ASSERT,      /* C code uses this instead of SRST */
        TARGET_EVENT_RESET_ASSERT_POST,
        TARGET_EVENT_RESET_DEASSERT_PRE,
        TARGET_EVENT_RESET_DEASSERT_POST,
@@ -219,10 +221,13 @@ enum target_event
 
 struct target_event_action {
        enum target_event event;
-       Jim_Obj *body;
+       struct Jim_Interp *interp;
+       struct Jim_Obj *body;
        int has_percent;
        struct target_event_action *next;
- };
+};
+
+bool target_has_event_action(struct target *target, enum target_event event);
 
 struct target_event_callback
 {
@@ -241,13 +246,8 @@ struct target_timer_callback
        struct target_timer_callback *next;
 };
 
-int target_register_commands(struct command_context_s *cmd_ctx);
-int target_register_user_commands(struct command_context_s *cmd_ctx);
-int target_init(struct command_context_s *cmd_ctx);
+int target_register_commands(struct command_context *cmd_ctx);
 int target_examine(void);
-int handle_target(void *priv);
-int target_process_reset(struct command_context_s *cmd_ctx,
-               enum target_reset_mode reset_mode);
 
 int target_register_event_callback(
                int (*callback)(struct target *target,
@@ -269,7 +269,6 @@ int target_call_event_callbacks(struct target *target, enum target_event event);
  */
 int target_register_timer_callback(int (*callback)(void *priv),
                int time_ms, int periodic, void *priv);
-int target_unregister_timer_callback(int (*callback)(void *priv), void *priv);
 
 int target_call_timer_callbacks(void);
 /**
@@ -278,29 +277,37 @@ int target_call_timer_callbacks(void);
  */
 int target_call_timer_callbacks_now(void);
 
-struct target* get_current_target(struct command_context_s *cmd_ctx);
+struct target* get_current_target(struct command_context *cmd_ctx);
 struct target *get_target(const char *id);
 
 /**
- * Get the target name.
+ * Get the target type name.
  *
  * This routine is a wrapper for the target->type->name field.
+ * Note that this is not an instance-specific name for his target.
  */
-const char *target_get_name(struct target *target);
+const char *target_type_name(struct target *target);
 
 /**
- * Examine the specified @a target.
+ * Examine the specified @a target, letting it perform any
+ * initialization that requires JTAG access.
  *
  * This routine is a wrapper for target->type->examine.
  */
 int target_examine_one(struct target *target);
-/// @returns @c true if the target has been examined.
-bool target_was_examined(struct target *target);
-/// Sets the @c examined flag for the given target.
-void target_set_examined(struct target *target);
-/// Reset the @c examined flag for the given target.
-void target_reset_examined(struct target *target);
 
+/// @returns @c true if target_set_examined() has been called.
+static inline bool target_was_examined(struct target *target)
+{
+       return target->examined;
+}
+
+/// Sets the @c examined flag for the given target.
+/// Use in target->type->examine() after one-time setup is done.
+static inline void target_set_examined(struct target *target)
+{
+       target->examined = true;
+}
 
 /**
  * Add the @a breakpoint for @a target.
@@ -367,7 +374,18 @@ int target_read_memory(struct target *target,
                uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
 /**
  * Write @a count items of @a size bytes to the memory of @a target at
- * the @a address given.
+ * the @a address given. @a address must be aligned to @a size
+ * in target memory.
+ *
+ * The endianness is the same in the host and target memory for this
+ * function.
+ *
+ * \todo TODO:
+ * Really @a buffer should have been defined as "const void *" and
+ * @a buffer should have been aligned to @a size in the host memory.
+ *
+ * This is not enforced via e.g. assert's today and e.g. the
+ * target_write_buffer fn breaks this assumption.
  *
  * This routine is wrapper for target->type->write_memory.
  */
@@ -434,23 +452,23 @@ const char *target_state_name( struct target *target );
  */
 int target_alloc_working_area(struct target *target,
                uint32_t size, struct working_area **area);
+/* Same as target_alloc_working_area, except that no error is logged
+ * when ERROR_TARGET_RESOURCE_NOT_AVAILABLE is returned.
+ *
+ * This allows the calling code to *try* to allocate target memory
+ * and have a fallback to another behavior(slower?).
+ */
+int target_alloc_working_area_try(struct target *target,
+               uint32_t size, struct working_area **area);
 int target_free_working_area(struct target *target, struct working_area *area);
-int target_free_working_area_restore(struct target *target,
-               struct working_area *area, int restore);
 void target_free_all_working_areas(struct target *target);
-void target_free_all_working_areas_restore(struct target *target, int restore);
 
 extern struct target *all_targets;
 
-extern struct target_event_callback *target_event_callbacks;
-extern struct target_timer_callback *target_timer_callbacks;
-
 uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer);
 uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer);
-uint8_t  target_buffer_get_u8 (struct target *target, const uint8_t *buffer);
 void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value);
 void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value);
-void target_buffer_set_u8 (struct target *target, uint8_t *buffer, uint8_t  value);
 
 int target_read_u32(struct target *target, uint32_t address, uint32_t *value);
 int target_read_u16(struct target *target, uint32_t address, uint16_t *value);
@@ -463,7 +481,6 @@ int target_write_u8(struct target *target, uint32_t address, uint8_t value);
 int target_arch_state(struct target *target);
 
 void target_handle_event(struct target *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)
@@ -477,8 +494,6 @@ void target_all_handle_event(enum target_event e);
 #define ERROR_TARGET_NOT_RUNNING (-310)
 #define ERROR_TARGET_NOT_EXAMINED (-311)
 
-extern const Jim_Nvp nvp_error_target[];
-
-const char *target_strerror_safe(int err);
+extern bool get_target_reset_nag(void);
 
 #endif /* TARGET_H */