devc = beaglelogic_devc_alloc();
+ devc->beaglelogic = &beaglelogic_native_ops;
+
+ /* Fill the channels */
for (i = 0; i < maxch; i++)
sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE,
channel_names[i]);
struct dev_context *devc = sdi->priv;
/* Open BeagleLogic */
- if (beaglelogic_open_nonblock(devc))
+ if (devc->beaglelogic->open(devc))
return SR_ERR;
/* Set fd and local attributes */
devc->pollfd.revents = 0;
/* Get the default attributes */
- beaglelogic_get_samplerate(devc);
- beaglelogic_get_sampleunit(devc);
- beaglelogic_get_buffersize(devc);
- beaglelogic_get_bufunitsize(devc);
+ devc->beaglelogic->get_samplerate(devc);
+ devc->beaglelogic->get_sampleunit(devc);
+ devc->beaglelogic->get_buffersize(devc);
+ devc->beaglelogic->get_bufunitsize(devc);
/* Set the triggerflags to default for continuous capture unless we
* explicitly limit samples using SR_CONF_LIMIT_SAMPLES */
devc->triggerflags = BL_TRIGGERFLAGS_CONTINUOUS;
- beaglelogic_set_triggerflags(devc);
+ devc->beaglelogic->set_triggerflags(devc);
/* Map the kernel capture FIFO for reads, saves 1 level of memcpy */
- if (beaglelogic_mmap(devc) != SR_OK) {
+ if (devc->beaglelogic->mmap(devc) != SR_OK) {
sr_err("Unable to map capture buffer");
- beaglelogic_close(devc);
+ devc->beaglelogic->close(devc);
return SR_ERR;
}
struct dev_context *devc = sdi->priv;
/* Close the memory mapping and the file */
- beaglelogic_munmap(devc);
- beaglelogic_close(devc);
+ devc->beaglelogic->munmap(devc);
+ devc->beaglelogic->close(devc);
return SR_OK;
}
switch (key) {
case SR_CONF_SAMPLERATE:
devc->cur_samplerate = g_variant_get_uint64(data);
- return beaglelogic_set_samplerate(devc);
+ return devc->beaglelogic->set_samplerate(devc);
case SR_CONF_LIMIT_SAMPLES:
tmp_u64 = g_variant_get_uint64(data);
devc->limit_samples = tmp_u64;
devc->buffersize /
(SAMPLEUNIT_TO_BYTES(devc->sampleunit) * 1000000));
}
- return beaglelogic_set_triggerflags(devc);
+ return devc->beaglelogic->set_triggerflags(devc);
case SR_CONF_CAPTURE_RATIO:
devc->capture_ratio = g_variant_get_uint64(data);
break;
static int dev_acquisition_start(const struct sr_dev_inst *sdi)
{
struct dev_context *devc = sdi->priv;
+ GSList *l;
struct sr_trigger *trigger;
+ struct sr_channel *channel;
/* Clear capture state */
devc->bytes_read = 0;
devc->offset = 0;
/* Configure channels */
- devc->sampleunit = g_slist_length(sdi->channels) > 8 ?
- BL_SAMPLEUNIT_16_BITS : BL_SAMPLEUNIT_8_BITS;
- beaglelogic_set_sampleunit(devc);
+ devc->sampleunit = BL_SAMPLEUNIT_8_BITS;
+
+ for (l = sdi->channels; l; l = l->next) {
+ channel = l->data;
+ if (channel->index >= 8 && channel->enabled)
+ devc->sampleunit = BL_SAMPLEUNIT_16_BITS;
+ }
+ devc->beaglelogic->set_sampleunit(devc);
/* Configure triggers & send header packet */
if ((trigger = sr_session_trigger_get(sdi->session))) {
std_session_send_df_header(sdi);
/* Trigger and add poll on file */
- beaglelogic_start(devc);
+ devc->beaglelogic->start(devc);
sr_session_source_add_pollfd(sdi->session, &devc->pollfd,
BUFUNIT_TIMEOUT_MS(devc), beaglelogic_receive_data,
(void *)sdi);
struct dev_context *devc = sdi->priv;
/* Execute a stop on BeagleLogic */
- beaglelogic_stop(devc);
+ devc->beaglelogic->stop(devc);
/* lseek to offset 0, flushes the cache */
lseek(devc->fd, 0, SEEK_SET);