X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Fopenbench-logic-sniffer%2Fols.c;h=d4d17688c92bf72f298fe03057b857a11fb17630;hb=4362438f1e2da14d04678327c403f9d75c4c0a48;hp=2faadf6505a549598340fd71eb3c59699774de8c;hpb=4fe9a6da79561d82f2c88c39e222ae86c5507900;p=libsigrok.git diff --git a/hardware/openbench-logic-sniffer/ols.c b/hardware/openbench-logic-sniffer/ols.c index 2faadf65..d4d17688 100644 --- a/hardware/openbench-logic-sniffer/ols.c +++ b/hardware/openbench-logic-sniffer/ols.c @@ -46,7 +46,6 @@ #define O_NONBLOCK FIONBIO #endif - static int capabilities[] = { SR_HWCAP_LOGIC_ANALYZER, SR_HWCAP_SAMPLERATE, @@ -66,13 +65,11 @@ static struct sr_samplerates samplerates = { /* List of struct sr_serial_device_instance */ static GSList *device_instances = NULL; - - static int send_shortcommand(int fd, uint8_t command) { char buf[1]; - g_debug("ols: sending cmd 0x%.2x", command); + sr_dbg("ols: sending cmd 0x%.2x", command); buf[0] = command; if (serial_write(fd, buf, 1) != 1) return SR_ERR; @@ -84,7 +81,7 @@ static int send_longcommand(int fd, uint8_t command, uint32_t data) { char buf[5]; - g_debug("ols: sending cmd 0x%.2x data 0x%.8x", command, data); + sr_dbg("ols: sending cmd 0x%.2x data 0x%.8x", command, data); buf[0] = command; buf[1] = (data & 0xff000000) >> 24; buf[2] = (data & 0xff0000) >> 16; @@ -174,7 +171,12 @@ static struct ols_device *ols_device_new(void) { struct ols_device *ols; - ols = g_malloc0(sizeof(struct ols_device)); + /* TODO: Is 'ols' ever g_free()'d? */ + if (!(ols = g_try_malloc0(sizeof(struct ols_device)))) { + sr_err("ols: %s: ols malloc failed", __func__); + return NULL; + } + ols->trigger_at = -1; ols->probe_mask = 0xffffffff; ols->cur_samplerate = SR_KHZ(200); @@ -210,7 +212,8 @@ static struct sr_device_instance *get_metadata(int fd) tmp_str = g_string_new(""); while (serial_read(fd, &tmp_c, 1) == 1 && tmp_c != '\0') g_string_append_c(tmp_str, tmp_c); - g_debug("ols: got metadata key 0x%.2x value '%s'", key, tmp_str->str); + sr_dbg("ols: got metadata key 0x%.2x value '%s'", + key, tmp_str->str); switch (token) { case 0x01: /* Device name */ @@ -231,7 +234,8 @@ static struct sr_device_instance *get_metadata(int fd) g_string_append(version, tmp_str->str); break; default: - g_message("ols: unknown token 0x%.2x: '%s'", token, tmp_str->str); + sr_info("ols: unknown token 0x%.2x: '%s'", + token, tmp_str->str); break; } g_string_free(tmp_str, TRUE); @@ -241,7 +245,8 @@ static struct sr_device_instance *get_metadata(int fd) if (serial_read(fd, &tmp_int, 4) != 4) break; tmp_int = reverse32(tmp_int); - g_debug("ols: got metadata key 0x%.2x value 0x%.8x", key, tmp_int); + sr_dbg("ols: got metadata key 0x%.2x value 0x%.8x", + key, tmp_int); switch (token) { case 0x00: /* Number of usable probes */ @@ -264,7 +269,8 @@ static struct sr_device_instance *get_metadata(int fd) ols->protocol_version = tmp_int; break; default: - g_message("ols: unknown token 0x%.2x: 0x%.8x", token, tmp_int); + sr_info("ols: unknown token 0x%.2x: 0x%.8x", + token, tmp_int); break; } break; @@ -272,7 +278,8 @@ static struct sr_device_instance *get_metadata(int fd) /* 8-bit unsigned integer */ if (serial_read(fd, &tmp_c, 1) != 1) break; - g_debug("ols: got metadata key 0x%.2x value 0x%.2x", key, tmp_c); + sr_dbg("ols: got metadata key 0x%.2x value 0x%.2x", + key, tmp_c); switch (token) { case 0x00: /* Number of usable probes */ @@ -283,7 +290,8 @@ static struct sr_device_instance *get_metadata(int fd) ols->protocol_version = tmp_c; break; default: - g_message("ols: unknown token 0x%.2x: 0x%.2x", token, tmp_c); + sr_info("ols: unknown token 0x%.2x: 0x%.2x", + token, tmp_c); break; } break; @@ -301,7 +309,6 @@ static struct sr_device_instance *get_metadata(int fd) return sdi; } - static int hw_init(const char *deviceinfo) { struct sr_device_instance *sdi; @@ -311,6 +318,8 @@ static int hw_init(const char *deviceinfo) int devcnt, final_devcnt, num_ports, fd, ret, i; char buf[8], **device_names, **serial_params; + final_devcnt = 0; + if (deviceinfo) ports = g_slist_append(NULL, strdup(deviceinfo)); else @@ -318,9 +327,22 @@ static int hw_init(const char *deviceinfo) ports = list_serial_ports(); num_ports = g_slist_length(ports); - fds = calloc(1, num_ports * sizeof(GPollFD)); - device_names = malloc(num_ports * sizeof(char *)); - serial_params = malloc(num_ports * sizeof(char *)); + + if (!(fds = g_try_malloc0(num_ports * sizeof(GPollFD)))) { + sr_err("ols: %s: fds malloc failed", __func__); + goto hw_init_free_ports; /* TODO: SR_ERR_MALLOC. */ + } + + if (!(device_names = g_try_malloc(num_ports * sizeof(char *)))) { + sr_err("ols: %s: device_names malloc failed", __func__); + goto hw_init_free_fds; /* TODO: SR_ERR_MALLOC. */ + } + + if (!(serial_params = g_try_malloc(num_ports * sizeof(char *)))) { + sr_err("ols: %s: serial_params malloc failed", __func__); + goto hw_init_free_device_names; /* TODO: SR_ERR_MALLOC. */ + } + devcnt = 0; for (l = ports; l; l = l->next) { /* The discovery procedure is like this: first send the Reset @@ -333,7 +355,7 @@ static int hw_init(const char *deviceinfo) * we do all the sending first, then wait for all of them to * respond with g_poll(). */ - g_message("ols: probing %s...", (char *)l->data); + sr_info("ols: probing %s...", (char *)l->data); fd = serial_open(l->data, O_RDWR | O_NONBLOCK); if (fd != -1) { serial_params[devcnt] = serial_backup_params(fd); @@ -364,7 +386,6 @@ static int hw_init(const char *deviceinfo) /* 2ms isn't enough for reliable transfer with pl2303, let's try 10 */ usleep(10000); - final_devcnt = 0; g_poll(fds, devcnt, 1); for (i = 0; i < devcnt; i++) { @@ -398,7 +419,6 @@ static int hw_init(const char *deviceinfo) final_devcnt++; serial_close(fds[i].fd); fds[i].fd = 0; - } /* clean up after all the probing */ @@ -411,9 +431,12 @@ static int hw_init(const char *deviceinfo) free(device_names[i]); } - free(fds); - free(device_names); - free(serial_params); + g_free(serial_params); +hw_init_free_device_names: + g_free(device_names); +hw_init_free_fds: + g_free(fds); +hw_init_free_ports: g_slist_free(ports); return final_devcnt; @@ -563,7 +586,7 @@ static int hw_set_configuration(int device_index, int capability, void *value) if (*tmp_u64 < MIN_NUM_SAMPLES) return SR_ERR; ols->limit_samples = *tmp_u64; - g_message("ols: sample limit %" PRIu64, ols->limit_samples); + sr_info("ols: sample limit %" PRIu64, ols->limit_samples); ret = SR_OK; break; case SR_HWCAP_CAPTURE_RATIO: @@ -613,7 +636,12 @@ static int receive_data(int fd, int revents, void *user_data) */ sr_source_remove(fd); sr_source_add(fd, G_IO_IN, 30, receive_data, user_data); - ols->raw_sample_buf = malloc(ols->limit_samples * 4); + ols->raw_sample_buf = g_try_malloc(ols->limit_samples * 4); + if (!ols->raw_sample_buf) { + sr_err("ols: %s: ols->raw_sample_buf malloc failed", + __func__); + return FALSE; + } /* fill with 1010... for debugging */ memset(ols->raw_sample_buf, 0x82, ols->limit_samples * 4); } @@ -630,10 +658,11 @@ static int receive_data(int fd, int revents, void *user_data) return FALSE; ols->sample[ols->num_bytes++] = byte; - g_debug("ols: received byte 0x%.2x", byte); + sr_dbg("ols: received byte 0x%.2x", byte); if (ols->num_bytes == num_channels) { /* Got a full sample. */ - g_debug("ols: received sample 0x%.*x", ols->num_bytes * 2, (int) *ols->sample); + sr_dbg("ols: received sample 0x%.*x", + ols->num_bytes * 2, (int) *ols->sample); if (ols->flag_reg & FLAG_RLE) { /* * In RLE mode -1 should never come in as a @@ -644,7 +673,12 @@ static int receive_data(int fd, int revents, void *user_data) if (ols->sample[0] & 0x80 && !(ols->last_sample[0] & 0x80)) { count = (int)(*ols->sample) & 0x7fffffff; - buffer = g_malloc(count); + if (!(buffer = g_try_malloc(count))) { + sr_err("ols: %s: buffer malloc " + "failed", __func__); + return FALSE; + } + buflen = 0; for (i = 0; i < count; i++) { memcpy(buffer + buflen, ols->last_sample, 4); @@ -689,7 +723,7 @@ static int receive_data(int fd, int revents, void *user_data) } } memcpy(ols->sample, ols->tmp_sample, 4); - g_debug("ols: full sample 0x%.8x", (int) *ols->sample); + sr_dbg("ols: full sample 0x%.8x", (int) *ols->sample); } /* the OLS sends its sample buffer backwards. @@ -742,7 +776,7 @@ static int receive_data(int fd, int revents, void *user_data) packet.payload = ols->raw_sample_buf; sr_session_bus(user_data, &packet); } - free(ols->raw_sample_buf); + g_free(ols->raw_sample_buf); serial_flush(fd); serial_close(fd); @@ -768,6 +802,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) if (!(sdi = sr_get_device_instance(device_instances, device_index))) return SR_ERR; + ols = sdi->priv; if (sdi->status != SR_ST_ACTIVE) @@ -833,9 +868,9 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) delaycount = readcount; } - g_message("ols: setting samplerate to %" PRIu64 " Hz (divider %u, demux %s)", - ols->cur_samplerate, ols->cur_samplerate_divider, - ols->flag_reg & FLAG_DEMUX ? "on" : "off"); + sr_info("ols: setting samplerate to %" PRIu64 " Hz (divider %u, " + "demux %s)", ols->cur_samplerate, ols->cur_samplerate_divider, + ols->flag_reg & FLAG_DEMUX ? "on" : "off"); if (send_longcommand(sdi->serial->fd, CMD_SET_DIVIDER, reverse32(ols->cur_samplerate_divider)) != SR_OK) return SR_ERR; @@ -870,11 +905,18 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) sr_source_add(sdi->serial->fd, G_IO_IN, -1, receive_data, session_device_id); + if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) { + sr_err("ols: %s: packet malloc failed", __func__); + return SR_ERR_MALLOC; + } + + if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) { + sr_err("ols: %s: header malloc failed", __func__); + g_free(packet); + return SR_ERR_MALLOC; + } + /* Send header packet to the session bus. */ - packet = g_malloc(sizeof(struct sr_datafeed_packet)); - header = g_malloc(sizeof(struct sr_datafeed_header)); - if (!packet || !header) - return SR_ERR; packet->type = SR_DF_HEADER; packet->length = sizeof(struct sr_datafeed_header); packet->payload = (unsigned char *)header; @@ -885,6 +927,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id) header->num_logic_probes = NUM_PROBES; header->num_analog_probes = 0; sr_session_bus(session_device_id, packet); + g_free(header); g_free(packet); @@ -904,17 +947,17 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id) } struct sr_device_plugin ols_plugin_info = { - "ols", - "Openbench Logic Sniffer", - 1, - hw_init, - hw_cleanup, - hw_opendev, - hw_closedev, - hw_get_device_info, - hw_get_status, - hw_get_capabilities, - hw_set_configuration, - hw_start_acquisition, - hw_stop_acquisition, + .name = "ols", + .longname = "Openbench Logic Sniffer", + .api_version = 1, + .init = hw_init, + .cleanup = hw_cleanup, + .open = hw_opendev, + .close = hw_closedev, + .get_device_info = hw_get_device_info, + .get_status = hw_get_status, + .get_capabilities = hw_get_capabilities, + .set_configuration = hw_set_configuration, + .start_acquisition = hw_start_acquisition, + .stop_acquisition = hw_stop_acquisition, };