From f8022ab9e76da186889fcbb98e1675a80c90b258 Mon Sep 17 00:00:00 2001 From: Marc Schink Date: Mon, 6 Mar 2017 20:17:57 +0100 Subject: [PATCH] device: Add function to retrieve counter values Signed-off-by: Marc Schink --- libjaylink/device.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ libjaylink/libjaylink.h | 15 ++++++++++ 2 files changed, 95 insertions(+) diff --git a/libjaylink/device.c b/libjaylink/device.c index 8b4ad16..e14a304 100644 --- a/libjaylink/device.c +++ b/libjaylink/device.c @@ -43,6 +43,7 @@ #define CMD_GET_HW_STATUS 0x07 #define CMD_REGISTER 0x09 #define CMD_GET_HW_INFO 0xc1 +#define CMD_GET_COUNTERS 0xc2 #define CMD_GET_FREE_MEMORY 0xd4 #define CMD_GET_CAPS 0xe8 #define CMD_GET_EXT_CAPS 0xed @@ -615,6 +616,85 @@ JAYLINK_API int jaylink_get_hardware_info(struct jaylink_device_handle *devh, } /** + * Retrieve the counter values of a device. + * + * @note This function must only be used if the device has the + * #JAYLINK_DEV_CAP_GET_COUNTERS capability. + * + * @param[in,out] devh Device handle. + * @param[in] mask A bit field where each set bit represents a counter value to + * request. See #jaylink_counter for a description of the + * counters and their bit positions. + * @param[out] values Array to store the counter values on success. Its content + * is undefined on failure. The array must be large enough + * to contain at least as many elements as bits set in @p + * mask. + * + * @retval JAYLINK_OK Success. + * @retval JAYLINK_ERR_ARG Invalid arguments. + * @retval JAYLINK_ERR_TIMEOUT A timeout occurred. + * @retval JAYLINK_ERR_IO Input/output error. + * @retval JAYLINK_ERR Other error conditions. + * + * @since 0.2.0 + */ +JAYLINK_API int jaylink_get_counters(struct jaylink_device_handle *devh, + uint32_t mask, uint32_t *values) +{ + int ret; + struct jaylink_context *ctx; + uint8_t buf[5]; + unsigned int i; + unsigned int num; + unsigned int length; + + if (!devh || !mask || !values) + return JAYLINK_ERR_ARG; + + ctx = devh->dev->ctx; + num = 0; + + for (i = 0; i < 32; i++) { + if (mask & (1 << i)) + num++; + } + + length = num * sizeof(uint32_t); + ret = transport_start_write_read(devh, 5, length, true); + + if (ret != JAYLINK_OK) { + log_err(ctx, "transport_start_write_read() failed: %s.", + jaylink_strerror(ret)); + return ret; + } + + buf[0] = CMD_GET_COUNTERS; + buffer_set_u32(buf, mask, 1); + + ret = transport_write(devh, buf, 5); + + if (ret != JAYLINK_OK) { + log_err(ctx, "transport_write() failed: %s.", + jaylink_strerror(ret)); + return ret; + } + + ret = transport_read(devh, (uint8_t *)values, length); + + if (ret != JAYLINK_OK) { + log_err(ctx, "transport_read() failed: %s.", + jaylink_strerror(ret)); + return ret; + } + + for (i = 0; i < num; i++) + values[i] = buffer_get_u32((uint8_t *)values, + i * sizeof(uint32_t)); + + return JAYLINK_OK; +} + +/** * Retrieve the hardware version of a device. * * @note This function must only be used if the device has the diff --git a/libjaylink/libjaylink.h b/libjaylink/libjaylink.h index 9c34119..f3bb959 100644 --- a/libjaylink/libjaylink.h +++ b/libjaylink/libjaylink.h @@ -135,6 +135,8 @@ enum jaylink_device_capability { JAYLINK_DEV_CAP_SET_TARGET_POWER = 13, /** Device supports target interface selection. */ JAYLINK_DEV_CAP_SELECT_TIF = 17, + /** Device supports retrieval of counter values. */ + JAYLINK_DEV_CAP_GET_COUNTERS = 19, /** Device supports capturing of SWO trace data. */ JAYLINK_DEV_CAP_SWO = 23, /** Device supports file I/O operations. */ @@ -166,6 +168,17 @@ enum jaylink_hardware_info { JAYLINK_HW_INFO_ITARGET_PEAK = (1 << 3) }; +/** Device counters. */ +enum jaylink_counter { + /** Time the device is connected to a target in milliseconds. */ + JAYLINK_COUNTER_TARGET_TIME = (1 << 0), + /** + * Number of times the device was connected or disconnected from a + * target. + */ + JAYLINK_COUNTER_TARGET_CONNECTIONS = (1 << 1) +}; + /** Device hardware types. */ enum jaylink_hardware_type { /** J-Link. */ @@ -411,6 +424,8 @@ JAYLINK_API int jaylink_get_firmware_version( size_t *length); JAYLINK_API int jaylink_get_hardware_info(struct jaylink_device_handle *devh, uint32_t mask, uint32_t *info); +JAYLINK_API int jaylink_get_counters(struct jaylink_device_handle *devh, + uint32_t mask, uint32_t *values); JAYLINK_API int jaylink_get_hardware_version( struct jaylink_device_handle *devh, struct jaylink_hardware_version *version); -- 2.11.4.GIT