35 #define SWO_CMD_START 0x64 36 #define SWO_CMD_STOP 0x65 37 #define SWO_CMD_READ 0x66 38 #define SWO_CMD_GET_SPEEDS 0x6e 40 #define SWO_PARAM_MODE 0x01 41 #define SWO_PARAM_BAUDRATE 0x02 42 #define SWO_PARAM_READ_SIZE 0x03 43 #define SWO_PARAM_BUFFER_SIZE 0x04 45 #define SWO_ERR 0x80000000 79 if (!devh || !baudrate || !size)
89 log_err(ctx,
"transport_start_write_read() failed: %s.",
95 buf[1] = SWO_CMD_START;
98 buf[3] = SWO_PARAM_MODE;
102 buf[9] = SWO_PARAM_BAUDRATE;
106 buf[15] = SWO_PARAM_BUFFER_SIZE;
114 log_err(ctx,
"transport_write() failed: %s.",
122 log_err(ctx,
"transport_read() failed: %s.",
130 log_err(ctx,
"Failed to start capture: 0x%x.", status);
170 log_err(ctx,
"transport_start_write_read() failed: %s.",
176 buf[1] = SWO_CMD_STOP;
182 log_err(ctx,
"transport_write() failed: %s.",
190 log_err(ctx,
"transport_read() failed: %s.",
198 log_err(ctx,
"Failed to stop capture: 0x%x.", status);
239 if (!devh || !buffer || !length)
246 log_err(ctx,
"transport_start_write_read() failed: %s.",
252 buf[1] = SWO_CMD_READ;
255 buf[3] = SWO_PARAM_READ_SIZE;
263 log_err(ctx,
"transport_write() failed: %s.",
271 log_err(ctx,
"transport_read() failed: %s.",
280 log_err(ctx,
"Received %u bytes but only %u bytes were " 281 "requested.", tmp, *length);
291 log_err(ctx,
"transport_start_read() failed: %s.",
299 log_err(ctx,
"transport_read() failed: %s.",
306 log_err(ctx,
"Failed to read data: 0x%x.", status);
364 log_err(ctx,
"transport_start_write_read() failed: %s.",
370 buf[1] = SWO_CMD_GET_SPEEDS;
373 buf[3] = SWO_PARAM_MODE;
381 log_err(ctx,
"transport_write() failed: %s.",
389 log_err(ctx,
"transport_read() failed: %s.",
397 log_err(ctx,
"Failed to retrieve speed information: 0x%x.",
405 log_err(ctx,
"Unexpected number of bytes received: %u.",
414 log_err(ctx,
"transport_start_read() failed: %s.",
422 log_err(ctx,
"transport_read() failed: %s.",
431 log_err(ctx,
"Minimum frequency divider is zero.");
438 log_err(ctx,
"Maximum frequency divider is less than minimum " 439 "frequency divider.");
447 log_err(ctx,
"Maximum prescaler is less than minimum " JAYLINK_API int jaylink_swo_read(struct jaylink_device_handle *devh, uint8_t *buffer, uint32_t *length)
Read SWO trace data.
JAYLINK_PRIV int transport_read(struct jaylink_device_handle *devh, uint8_t *buffer, size_t length)
Read data from a device.
uint32_t freq
Base frequency in Hz.
JAYLINK_PRIV void log_err(const struct jaylink_context *ctx, const char *format,...)
JAYLINK_PRIV uint32_t buffer_get_u32(const uint8_t *buffer, size_t offset)
Read a 32-bit unsigned integer value from a buffer.
uint32_t max_div
Maximum frequency divider.
jaylink_swo_mode
Serial Wire Output (SWO) capture modes.
Serial Wire Output (SWO) speed information.
Opaque structure representing a libjaylink context.
JAYLINK_API int jaylink_swo_start(struct jaylink_device_handle *devh, enum jaylink_swo_mode mode, uint32_t baudrate, uint32_t size)
Start SWO capture.
Internal libjaylink header file.
struct jaylink_context * ctx
libjaylink context.
JAYLINK_API int jaylink_swo_stop(struct jaylink_device_handle *devh)
Stop SWO capture.
size_t size
Size of the control block search area.
JAYLINK_PRIV int transport_start_read(struct jaylink_device_handle *devh, size_t length)
Start a read operation for a device.
Opaque structure representing a handle of a device.
Public libjaylink header file to be used by applications.
Universal Asynchronous Receiver Transmitter (UART).
JAYLINK_API const char * jaylink_strerror(int error_code)
Return a human-readable description of a libjaylink error code.
static struct jaylink_device_handle * devh
JAYLINK_API int jaylink_swo_get_speeds(struct jaylink_device_handle *devh, enum jaylink_swo_mode mode, struct jaylink_swo_speed *speed)
Retrieve SWO speeds.
uint32_t max_prescaler
Maximum prescaler.
uint32_t min_prescaler
Minimum prescaler.
#define JAYLINK_API
Macro to mark public libjaylink API symbol.
struct jaylink_device * dev
Device instance.
JAYLINK_PRIV int transport_start_write_read(struct jaylink_device_handle *devh, size_t write_length, size_t read_length, bool has_command)
Start a write and read operation for a device.
Device: unspecified error.
JAYLINK_PRIV int transport_write(struct jaylink_device_handle *devh, const uint8_t *buffer, size_t length)
Write data to a device.
uint32_t min_div
Minimum frequency divider.
JAYLINK_PRIV void buffer_set_u32(uint8_t *buffer, uint32_t value, size_t offset)
Write a 32-bit unsigned integer value to a buffer.