X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fsysclk-lwla%2Fprotocol.c;h=5a1522fc9e60e50bfd050d0e15930c437a71788c;hb=3a322bbc3b0f4d79a79cffac00aeb05ff69ce535;hp=c8434049a738e6736e2869e8a3a4aa0fd19ecfa5;hpb=f3f19d1131025b68d29a11273b627c83d748e7ea;p=libsigrok.git diff --git a/src/hardware/sysclk-lwla/protocol.c b/src/hardware/sysclk-lwla/protocol.c index c8434049..5a1522fc 100644 --- a/src/hardware/sysclk-lwla/protocol.c +++ b/src/hardware/sysclk-lwla/protocol.c @@ -17,8 +17,9 @@ * along with this program. If not, see . */ -#include "protocol.h" +#include #include +#include "protocol.h" /* Bit mask for the RLE repeat-count-follows flag. */ #define RLE_FLAG_LEN_FOLLOWS ((uint64_t)1 << 35) @@ -65,7 +66,7 @@ static int capture_setup(const struct sr_dev_inst *sdi) uint64_t divider_count; uint64_t trigger_mask; uint64_t memory_limit; - uint16_t command[3 + 10*4]; + uint16_t command[3 + (10 * 4)]; devc = sdi->priv; acq = devc->acquisition; @@ -109,10 +110,10 @@ static int capture_setup(const struct sr_dev_inst *sdi) switch (devc->cfg_trigger_slope) { case EDGE_POSITIVE: trigger_mask |= (uint64_t)1 << 35; - break; + break; case EDGE_NEGATIVE: trigger_mask |= (uint64_t)1 << 34; - break; + break; } command[19] = LWLA_WORD_0(trigger_mask); @@ -131,10 +132,10 @@ static int capture_setup(const struct sr_dev_inst *sdi) command[25] = LWLA_WORD_2(memory_limit); command[26] = LWLA_WORD_3(memory_limit); - /* Fill remaining 64-bit words with zeroes. */ - memset(&command[27], 0, 16 * sizeof(uint16_t)); + /* Fill remaining words with zeroes. */ + memset(&command[27], 0, sizeof(command) - 27 * sizeof(command[0])); - return lwla_send_command(sdi->conn, command, G_N_ELEMENTS(command)); + return lwla_send_command(sdi->conn, command, ARRAY_SIZE(command)); } /* Issue a register write command as an asynchronous USB transfer. @@ -304,7 +305,7 @@ static void process_capture_length(const struct sr_dev_inst *sdi) sr_dbg("%zu words in capture buffer.", acq->mem_addr_fill); - if (acq->mem_addr_fill > 0 && sdi->status == SR_ST_ACTIVE) + if (acq->mem_addr_fill > 0 && !devc->cancel_requested) issue_read_start(sdi); else issue_read_end(sdi); @@ -326,16 +327,16 @@ static void issue_stop_capture(const struct sr_dev_inst *sdi) regvals = devc->reg_write_seq; - regvals[0].reg = REG_CMD_CTRL2; + regvals[0].reg = REG_LONG_ADDR; regvals[0].val = 10; - regvals[1].reg = REG_CMD_CTRL3; + regvals[1].reg = REG_LONG_LOW; regvals[1].val = 0; - regvals[2].reg = REG_CMD_CTRL4; + regvals[2].reg = REG_LONG_HIGH; regvals[2].val = 0; - regvals[3].reg = REG_CMD_CTRL1; + regvals[3].reg = REG_LONG_STROBE; regvals[3].val = 0; regvals[4].reg = REG_DIV_BYPASS; @@ -582,7 +583,7 @@ static void end_acquisition(struct sr_dev_inst *sdi) struct dev_context *devc; struct sr_datafeed_packet packet; - drvc = sdi->driver->priv; + drvc = sdi->driver->context; devc = sdi->priv; if (devc->state == STATE_IDLE) @@ -598,13 +599,12 @@ static void end_acquisition(struct sr_dev_inst *sdi) lwla_free_acquisition_state(devc->acquisition); devc->acquisition = NULL; - - sdi->status = SR_ST_ACTIVE; + devc->cancel_requested = FALSE; } /* USB output transfer completion callback. */ -static void receive_transfer_out(struct libusb_transfer *transfer) +static void LIBUSB_CALL receive_transfer_out(struct libusb_transfer *transfer) { struct sr_dev_inst *sdi; struct dev_context *devc; @@ -630,7 +630,7 @@ static void receive_transfer_out(struct libusb_transfer *transfer) submit_transfer(devc, devc->acquisition->xfer_in); break; case STATE_STOP_CAPTURE: - if (sdi->status == SR_ST_ACTIVE) + if (!devc->cancel_requested) request_capture_length(sdi); else end_acquisition(sdi); @@ -658,7 +658,7 @@ static void receive_transfer_out(struct libusb_transfer *transfer) /* USB input transfer completion callback. */ -static void receive_transfer_in(struct libusb_transfer *transfer) +static void LIBUSB_CALL receive_transfer_in(struct libusb_transfer *transfer) { struct sr_dev_inst *sdi; struct dev_context *devc; @@ -714,25 +714,25 @@ SR_PRIV int lwla_init_device(const struct sr_dev_inst *sdi) if (ret != SR_OK) return ret; - ret = lwla_write_reg(sdi->conn, REG_CMD_CTRL2, 100); + ret = lwla_write_reg(sdi->conn, REG_LONG_ADDR, 100); if (ret != SR_OK) return ret; - ret = lwla_read_reg(sdi->conn, REG_CMD_CTRL1, &value); + ret = lwla_read_reg(sdi->conn, REG_LONG_STROBE, &value); if (ret != SR_OK) return ret; sr_dbg("Received test word 0x%08X back.", value); if (value != 0x12345678) return SR_ERR; - ret = lwla_read_reg(sdi->conn, REG_CMD_CTRL4, &value); + ret = lwla_read_reg(sdi->conn, REG_LONG_HIGH, &value); if (ret != SR_OK) return ret; sr_dbg("Received test word 0x%08X back.", value); if (value != 0x12345678) return SR_ERR; - ret = lwla_read_reg(sdi->conn, REG_CMD_CTRL3, &value); + ret = lwla_read_reg(sdi->conn, REG_LONG_LOW, &value); if (ret != SR_OK) return ret; sr_dbg("Received test word 0x%08X back.", value); @@ -742,65 +742,18 @@ SR_PRIV int lwla_init_device(const struct sr_dev_inst *sdi) return ret; } -SR_PRIV int lwla_convert_trigger(const struct sr_dev_inst *sdi) -{ - struct dev_context *devc; - struct sr_trigger *trigger; - struct sr_trigger_stage *stage; - struct sr_trigger_match *match; - const GSList *l, *m; - uint64_t channel_index; - - devc = sdi->priv; - - devc->trigger_mask = 0; - devc->trigger_values = 0; - devc->trigger_edge_mask = 0; - - if (!(trigger = sr_session_trigger_get(sdi->session))) - return SR_OK; - - if (g_slist_length(trigger->stages) > 1) { - sr_err("This device only supports 1 trigger stage."); - return SR_ERR; - } - - for (l = trigger->stages; l; l = l->next) { - stage = l->data; - for (m = stage->matches; m; m = m->next) { - match = m->data; - if (!match->channel->enabled) - /* Ignore disabled channels with a trigger. */ - continue; - channel_index = (uint64_t)1 << match->channel->index; - devc->trigger_mask |= channel_index; - switch (match->match) { - case SR_TRIGGER_ONE: - devc->trigger_values |= channel_index; - break; - case SR_TRIGGER_RISING: - devc->trigger_values |= channel_index; - /* Fall through for edge mask. */ - case SR_TRIGGER_FALLING: - devc->trigger_edge_mask |= channel_index; - break; - } - } - } - - return SR_OK; -} - /* Select the LWLA clock configuration. If the clock source changed from * the previous setting, this will download a new bitstream to the FPGA. */ SR_PRIV int lwla_set_clock_config(const struct sr_dev_inst *sdi) { struct dev_context *devc; + struct drv_context *drvc; int ret; enum clock_config choice; devc = sdi->priv; + drvc = sdi->driver->context; if (sdi->status == SR_ST_INACTIVE) choice = CONF_CLOCK_NONE; @@ -813,7 +766,8 @@ SR_PRIV int lwla_set_clock_config(const struct sr_dev_inst *sdi) if (choice != devc->cur_clock_config) { devc->cur_clock_config = CONF_CLOCK_NONE; - ret = lwla_send_bitstream(sdi->conn, bitstream_map[choice]); + ret = lwla_send_bitstream(drvc->sr_ctx, sdi->conn, + bitstream_map[choice]); if (ret == SR_OK) devc->cur_clock_config = choice; return ret; @@ -879,22 +833,22 @@ SR_PRIV int lwla_setup_acquisition(const struct sr_dev_inst *sdi) regvals[1].reg = REG_MEM_CTRL2; regvals[1].val = 1; - regvals[2].reg = REG_CMD_CTRL2; + regvals[2].reg = REG_LONG_ADDR; regvals[2].val = 10; - regvals[3].reg = REG_CMD_CTRL3; + regvals[3].reg = REG_LONG_LOW; regvals[3].val = 0x74; - regvals[4].reg = REG_CMD_CTRL4; + regvals[4].reg = REG_LONG_HIGH; regvals[4].val = 0; - regvals[5].reg = REG_CMD_CTRL1; + regvals[5].reg = REG_LONG_STROBE; regvals[5].val = 0; regvals[6].reg = REG_DIV_BYPASS; regvals[6].val = acq->bypass_clockdiv; - ret = lwla_write_regs(usb, regvals, G_N_ELEMENTS(regvals)); + ret = lwla_write_regs(usb, regvals, ARRAY_SIZE(regvals)); if (ret != SR_OK) return ret; @@ -923,26 +877,26 @@ SR_PRIV int lwla_start_acquisition(const struct sr_dev_inst *sdi) libusb_fill_bulk_transfer(acq->xfer_out, usb->devhdl, EP_COMMAND, (unsigned char *)acq->xfer_buf_out, 0, &receive_transfer_out, - (struct sr_dev_inst *)sdi, USB_TIMEOUT); + (struct sr_dev_inst *)sdi, USB_TIMEOUT_MS); libusb_fill_bulk_transfer(acq->xfer_in, usb->devhdl, EP_REPLY, (unsigned char *)acq->xfer_buf_in, sizeof acq->xfer_buf_in, &receive_transfer_in, - (struct sr_dev_inst *)sdi, USB_TIMEOUT); + (struct sr_dev_inst *)sdi, USB_TIMEOUT_MS); regvals = devc->reg_write_seq; - regvals[0].reg = REG_CMD_CTRL2; + regvals[0].reg = REG_LONG_ADDR; regvals[0].val = 10; - regvals[1].reg = REG_CMD_CTRL3; + regvals[1].reg = REG_LONG_LOW; regvals[1].val = 1; - regvals[2].reg = REG_CMD_CTRL4; + regvals[2].reg = REG_LONG_HIGH; regvals[2].val = 0; - regvals[3].reg = REG_CMD_CTRL1; + regvals[3].reg = REG_LONG_STROBE; regvals[3].val = 0; devc->reg_write_pos = 0; @@ -959,11 +913,7 @@ SR_PRIV struct acquisition_state *lwla_alloc_acquisition_state(void) { struct acquisition_state *acq; - acq = g_try_new0(struct acquisition_state, 1); - if (!acq) { - sr_err("Acquisition state malloc failed."); - return NULL; - } + acq = g_malloc0(sizeof(struct acquisition_state)); acq->xfer_in = libusb_alloc_transfer(0); if (!acq->xfer_in) { @@ -1008,7 +958,7 @@ SR_PRIV int lwla_receive_data(int fd, int revents, void *cb_data) sdi = cb_data; devc = sdi->priv; - drvc = sdi->driver->priv; + drvc = sdi->driver->context; if (!devc || !drvc) return FALSE; @@ -1024,7 +974,7 @@ SR_PRIV int lwla_receive_data(int fd, int revents, void *cb_data) /* If no event flags are set the timeout must have expired. */ if (revents == 0 && devc->state == STATE_STATUS_WAIT) { - if (sdi->status == SR_ST_STOPPING) + if (devc->cancel_requested) issue_stop_capture(sdi); else request_capture_status(sdi);