X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fsysclk-lwla%2Fprotocol.c;h=45c0795210629e812f25981425a95b9666795447;hb=HEAD;hp=6c940ac253e17ce79f86799ba4ac065273bfb2de;hpb=7ed808179f5542c903a476266c4b175a6f2a18a7;p=libsigrok.git diff --git a/src/hardware/sysclk-lwla/protocol.c b/src/hardware/sysclk-lwla/protocol.c index 6c940ac2..45c07952 100644 --- a/src/hardware/sysclk-lwla/protocol.c +++ b/src/hardware/sysclk-lwla/protocol.c @@ -19,15 +19,10 @@ #include #include -#include "lwla.h" #include "protocol.h" +#include "lwla.h" -/* Status polling interval during acquisition. - */ -#define POLL_INTERVAL 100 /* ms */ - -/* Submit an already filled-in USB transfer. - */ +/* Submit an already filled-in USB transfer. */ static int submit_transfer(struct dev_context *devc, struct libusb_transfer *xfer) { @@ -44,8 +39,7 @@ static int submit_transfer(struct dev_context *devc, return SR_OK; } -/* Set up transfer for the next register in a write sequence. - */ +/* Set up transfer for the next register in a write sequence. */ static void next_reg_write(struct acquisition_state *acq) { struct regval *regval; @@ -60,8 +54,7 @@ static void next_reg_write(struct acquisition_state *acq) acq->xfer_out->length = 4 * sizeof(acq->xfer_buf_out[0]); } -/* Set up transfer for the next register in a read sequence. - */ +/* Set up transfer for the next register in a read sequence. */ static void next_reg_read(struct acquisition_state *acq) { unsigned int addr; @@ -74,8 +67,7 @@ static void next_reg_read(struct acquisition_state *acq) acq->xfer_out->length = 2 * sizeof(acq->xfer_buf_out[0]); } -/* Decode the response to a register read request. - */ +/* Decode the response to a register read request. */ static int read_reg_response(struct acquisition_state *acq) { uint32_t value; @@ -91,8 +83,7 @@ static int read_reg_response(struct acquisition_state *acq) return SR_OK; } -/* Enter a new state and submit the corresponding request to the device. - */ +/* Enter a new state and submit the corresponding request to the device. */ static int submit_request(const struct sr_dev_inst *sdi, enum protocol_state state) { @@ -101,7 +92,7 @@ static int submit_request(const struct sr_dev_inst *sdi, int ret; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; devc->state = state; @@ -127,8 +118,7 @@ static int submit_request(const struct sr_dev_inst *sdi, return submit_transfer(devc, acq->xfer_out); } -/* Evaluate and act on the response to a capture status request. - */ +/* Evaluate and act on the response to a capture status request. */ static void handle_status_response(const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -136,7 +126,7 @@ static void handle_status_response(const struct sr_dev_inst *sdi) unsigned int old_status; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; old_status = acq->status; if ((*devc->model->handle_response)(sdi) != SR_OK) { @@ -164,15 +154,14 @@ static void handle_status_response(const struct sr_dev_inst *sdi) } } -/* Evaluate and act on the response to a capture length request. - */ +/* Evaluate and act on the response to a capture length request. */ static void handle_length_response(const struct sr_dev_inst *sdi) { struct dev_context *devc; struct acquisition_state *acq; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; if ((*devc->model->handle_response)(sdi) != SR_OK) { devc->transfer_error = TRUE; @@ -195,8 +184,7 @@ static void handle_length_response(const struct sr_dev_inst *sdi) submit_request(sdi, STATE_READ_PREPARE); } -/* Evaluate and act on the response to a capture memory read request. - */ +/* Evaluate and act on the response to a capture memory read request. */ static void handle_read_response(const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -206,16 +194,17 @@ static void handle_read_response(const struct sr_dev_inst *sdi) unsigned int end_addr; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; /* Prepare session packet. */ - packet.type = SR_DF_LOGIC; + packet.type = SR_DF_LOGIC; packet.payload = &logic; logic.unitsize = (devc->model->num_channels + 7) / 8; - logic.data = acq->out_packet; + logic.data = acq->out_packet; end_addr = MIN(acq->mem_addr_next, acq->mem_addr_stop); acq->in_index = 0; + /* * Repeatedly call the model-specific read response handler until * all data received in the transfer has been accounted for. @@ -253,15 +242,14 @@ static void handle_read_response(const struct sr_dev_inst *sdi) submit_request(sdi, STATE_READ_FINISH); } -/* Destroy and unset the acquisition state record. - */ +/* Destroy and unset the acquisition state record. */ static void clear_acquisition_state(const struct sr_dev_inst *sdi) { struct dev_context *devc; struct acquisition_state *acq; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; devc->acquisition = NULL; @@ -272,20 +260,18 @@ static void clear_acquisition_state(const struct sr_dev_inst *sdi) } } -/* USB I/O source callback. - */ +/* USB I/O source callback. */ static int transfer_event(int fd, int revents, void *cb_data) { const struct sr_dev_inst *sdi; struct dev_context *devc; struct drv_context *drvc; struct timeval tv; - struct sr_datafeed_packet packet; int ret; (void)fd; - sdi = cb_data; + sdi = cb_data; devc = sdi->priv; drvc = sdi->driver->context; @@ -293,7 +279,7 @@ static int transfer_event(int fd, int revents, void *cb_data) return G_SOURCE_REMOVE; /* Handle pending USB events without blocking. */ - tv.tv_sec = 0; + tv.tv_sec = 0; tv.tv_usec = 0; ret = libusb_handle_events_timeout_completed(drvc->sr_ctx->libusb_ctx, &tv, NULL); @@ -320,28 +306,25 @@ static int transfer_event(int fd, int revents, void *cb_data) /* We are done, clean up and send end packet to session bus. */ clear_acquisition_state(sdi); - - packet.type = SR_DF_END; - packet.payload = NULL; - sr_session_send(sdi, &packet); + std_session_send_df_end(sdi); return G_SOURCE_REMOVE; } -/* USB output transfer completion callback. - */ +/* USB output transfer completion callback. */ static void LIBUSB_CALL transfer_out_completed(struct libusb_transfer *transfer) { const struct sr_dev_inst *sdi; struct dev_context *devc; struct acquisition_state *acq; - sdi = transfer->user_data; + sdi = transfer->user_data; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { - sr_err("Transfer to device failed: %d.", transfer->status); + sr_err("Transfer to device failed (state %d): %s.", + devc->state, libusb_error_name(transfer->status)); devc->transfer_error = TRUE; return; } @@ -392,17 +375,16 @@ static void LIBUSB_CALL transfer_out_completed(struct libusb_transfer *transfer) } } -/* USB input transfer completion callback. - */ +/* USB input transfer completion callback. */ static void LIBUSB_CALL transfer_in_completed(struct libusb_transfer *transfer) { const struct sr_dev_inst *sdi; struct dev_context *devc; struct acquisition_state *acq; - sdi = transfer->user_data; + sdi = transfer->user_data; devc = sdi->priv; - acq = devc->acquisition; + acq = devc->acquisition; if (transfer->status != LIBUSB_TRANSFER_COMPLETED) { sr_err("Transfer from device failed (state %d): %s.", @@ -454,8 +436,7 @@ static void LIBUSB_CALL transfer_in_completed(struct libusb_transfer *transfer) } } -/* Set up the acquisition state record. - */ +/* Set up the acquisition state record. */ static int init_acquisition_state(const struct sr_dev_inst *sdi) { struct dev_context *devc; @@ -463,7 +444,7 @@ static int init_acquisition_state(const struct sr_dev_inst *sdi) struct acquisition_state *acq; devc = sdi->priv; - usb = sdi->conn; + usb = sdi->conn; if (devc->acquisition) { sr_err("Acquisition still in progress?"); @@ -548,6 +529,7 @@ SR_PRIV int lwla_start_acquisition(const struct sr_dev_inst *sdi) struct drv_context *drvc; struct dev_context *devc; int ret; + const int poll_interval_ms = 100; drvc = sdi->driver->context; devc = sdi->priv; @@ -570,7 +552,7 @@ SR_PRIV int lwla_start_acquisition(const struct sr_dev_inst *sdi) return ret; } /* Register event source for asynchronous USB I/O. */ - ret = usb_source_add(sdi->session, drvc->sr_ctx, POLL_INTERVAL, + ret = usb_source_add(sdi->session, drvc->sr_ctx, poll_interval_ms, &transfer_event, (struct sr_dev_inst *)sdi); if (ret != SR_OK) { clear_acquisition_state(sdi); @@ -578,13 +560,13 @@ SR_PRIV int lwla_start_acquisition(const struct sr_dev_inst *sdi) } ret = submit_request(sdi, STATE_START_CAPTURE); - if (ret == SR_OK) { - /* Send header packet to the session bus. */ - ret = std_session_send_df_header(sdi, LOG_PREFIX); - } + if (ret == SR_OK) + ret = std_session_send_df_header(sdi); + if (ret != SR_OK) { usb_source_remove(sdi->session, drvc->sr_ctx); clear_acquisition_state(sdi); } + return ret; }