typedef struct jtag_interface_s
{
+ /// The name of the JTAG interface driver.
char* name;
- /* queued command execution
+ /**
+ * Execute queued commands.
+ * @returns ERROR_OK on success, or an error code on failure.
*/
int (*execute_queue)(void);
- /* interface initalization
+ /**
+ * Set the interface speed.
+ * @param speed The new interface speed setting.
+ * @returns ERROR_OK on success, or an error code on failure.
*/
int (*speed)(int speed);
+
+ /**
+ * The interface driver may register additional commands to expose
+ * additional features not covered by the standard command set.
+ * @param cmd_ctx The context in which commands should be registered.
+ * @returns ERROR_OK on success, or an error code on failure.
+ */
int (*register_commands)(struct command_context_s* cmd_ctx);
+
+ /**
+ * Interface driver must initalize any resources and connect to a
+ * JTAG device.
+ * @returns ERROR_OK on success, or an error code on failure.
+ */
int (*init)(void);
+
+ /**
+ * Interface driver must tear down all resources and disconnect from
+ * the JTAG device.
+ * @returns ERROR_OK on success, or an error code on failure.
+ */
int (*quit)(void);
- /* returns JTAG maxium speed for KHz. 0=RTCK. The function returns
+ /**
+ * Returns JTAG maxium speed for KHz. 0=RTCK. The function returns
* a failure if it can't support the KHz/RTCK.
*
* WARNING!!!! if RTCK is *slow* then think carefully about
* whether you actually want to support this in the driver.
* Many target scripts are written to handle the absence of RTCK
* and use a fallback kHz TCK.
+ * @returns ERROR_OK on success, or an error code on failure.
*/
int (*khz)(int khz, int* jtag_speed);
- /* returns the KHz for the provided JTAG speed. 0=RTCK. The function returns
- * a failure if it can't support the KHz/RTCK. */
+ /**
+ * Calculate the clock frequency (in KHz) for the given @a speed.
+ * @param speed The desired interface speed setting.
+ * @param khz On return, contains the speed in KHz (0 for RTCK).
+ * @returns ERROR_OK on success, or an error code if the
+ * interface cannot support the specified speed (KHz or RTCK).
+ */
int (*speed_div)(int speed, int* khz);
- /* Read and clear the power dropout flag. Note that a power dropout
- * can be transitionary, easily much less than a ms.
+ /**
+ * Read and clear the power dropout flag. Note that a power dropout
+ * can be transitionary, easily much less than a ms.
*
- * So to find out if the power is *currently* on, you must invoke
- * this method twice. Once to clear the power dropout flag and a
- * second time to read the current state.
+ * To find out if the power is *currently* on, one must invoke this
+ * method twice. Once to clear the power dropout flag and a second
+ * time to read the current state. The default implementation
+ * never reports power dropouts.
*
- * Currently the default implementation is never to detect power dropout.
+ * @returns ERROR_OK on success, or an error code on failure.
*/
int (*power_dropout)(int* power_dropout);
- /* Read and clear the srst asserted detection flag.
+ /**
+ * Read and clear the srst asserted detection flag.
+ *
+ * Like power_dropout this does *not* read the current
+ * state. SRST assertion is transitionary and may be much
+ * less than 1ms, so the interface driver must watch for these
+ * events until this routine is called.
*
- * NB!!!! like power_dropout this does *not* read the current
- * state. srst assertion is transitionary and *can* be much
- * less than 1ms.
+ * @param srst_asserted On return, indicates whether SRST has
+ * been asserted.
+ * @returns ERROR_OK on success, or an error code on failure.
*/
int (*srst_asserted)(int* srst_asserted);
} jtag_interface_t;