+/*
+ * Implementor's note: The local write buffer's size shall suffice for
+ * any know FPGA register transaction that is involved in the supported
+ * feature set of this sigrok device driver. If the length check trips,
+ * that's a programmer's error and needs adjustment in the complete call
+ * stack of the respective code path.
+ */
+SR_PRIV int sigma_write_register(struct dev_context *devc,
+ uint8_t reg, uint8_t *data, size_t len)
+{
+ uint8_t buf[80], *wrptr;
+ size_t idx;
+
+ if (2 + 2 * len > sizeof(buf)) {
+ sr_err("Short write buffer for %zu bytes to reg %u.", len, reg);
+ return SR_ERR_BUG;
+ }
+
+ wrptr = buf;
+ write_u8_inc(&wrptr, REG_ADDR_LOW | (reg & 0xf));
+ write_u8_inc(&wrptr, REG_ADDR_HIGH | (reg >> 4));
+ for (idx = 0; idx < len; idx++) {
+ write_u8_inc(&wrptr, REG_DATA_LOW | (data[idx] & 0xf));
+ write_u8_inc(&wrptr, REG_DATA_HIGH_WRITE | (data[idx] >> 4));
+ }
+
+ return sigma_write_sr(devc, buf, wrptr - buf);
+}
+
+SR_PRIV int sigma_set_register(struct dev_context *devc,
+ uint8_t reg, uint8_t value)
+{
+ return sigma_write_register(devc, reg, &value, sizeof(value));
+}
+
+static int sigma_read_register(struct dev_context *devc,
+ uint8_t reg, uint8_t *data, size_t len)
+{
+ uint8_t buf[3], *wrptr;
+ int ret;
+
+ wrptr = buf;
+ write_u8_inc(&wrptr, REG_ADDR_LOW | (reg & 0xf));
+ write_u8_inc(&wrptr, REG_ADDR_HIGH | (reg >> 4));
+ write_u8_inc(&wrptr, REG_READ_ADDR);
+ ret = sigma_write_sr(devc, buf, wrptr - buf);
+ if (ret != SR_OK)
+ return ret;
+
+ return sigma_read_sr(devc, data, len);