#define O_NONBLOCK FIONBIO
#endif
-
static int capabilities[] = {
SR_HWCAP_LOGIC_ANALYZER,
SR_HWCAP_SAMPLERATE,
/* 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;
{
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;
{
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);
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 */
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);
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 */
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;
/* 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 */
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;
return sdi;
}
-
static int hw_init(const char *deviceinfo)
{
struct sr_device_instance *sdi;
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
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
* 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);
/* 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++) {
final_devcnt++;
serial_close(fds[i].fd);
fds[i].fd = 0;
-
}
/* clean up after all the probing */
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;
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:
*/
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);
}
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
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);
}
}
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.
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);
if (!(sdi = sr_get_device_instance(device_instances, device_index)))
return SR_ERR;
+
ols = sdi->priv;
if (sdi->status != SR_ST_ACTIVE)
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;
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;
header->num_logic_probes = NUM_PROBES;
header->num_analog_probes = 0;
sr_session_bus(session_device_id, packet);
+
g_free(header);
g_free(packet);
}
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,
};