Eveything seems to work now except for triggers.

This commit is contained in:
lelazary 2013-01-05 18:12:45 -08:00 committed by Uwe Hermann
parent 4db2aaffe7
commit 5a24e89ca4
3 changed files with 88 additions and 50 deletions

View File

@ -41,27 +41,7 @@ SR_PRIV const char *mso19_probe_names[NUM_PROBES + 1] = {
static const struct sr_samplerates samplerates = { static const struct sr_samplerates samplerates = {
SR_HZ(100), SR_HZ(100),
SR_MHZ(200), SR_MHZ(200),
SR_HZ(1), SR_HZ(100),
//SR_HZ(100),
//SR_HZ(200),
//SR_HZ(500),
//SR_KHZ(1),
//SR_KHZ(2),
//SR_KHZ(5),
//SR_KHZ(10),
//SR_KHZ(20),
//SR_KHZ(50),
//SR_KHZ(100),
//SR_KHZ(200),
//SR_KHZ(500),
//SR_MHZ(1),
//SR_MHZ(2),
//SR_MHZ(5),
//SR_MHZ(10),
//SR_MHZ(20),
//SR_MHZ(50),
//SR_MHZ(100),
//SR_MHZ(200),
NULL, NULL,
}; };
@ -70,8 +50,6 @@ static struct sr_dev_driver *di = &link_mso19_driver_info;
static int hw_init(struct sr_context *sr_ctx) static int hw_init(struct sr_context *sr_ctx)
{ {
printf("Init driver\n");
struct drv_context *drvc; struct drv_context *drvc;
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) { if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
@ -86,19 +64,11 @@ static int hw_init(struct sr_context *sr_ctx)
static GSList *hw_scan(GSList *options) static GSList *hw_scan(GSList *options)
{ {
//struct sr_hwopt *opt;
//struct sr_probe *probe;
//GPollFD probefd;
//int ret, i;
//char buf[8];
//struct udev *udev;
int i; int i;
(void)options; (void)options;
GSList *devices = NULL; GSList *devices = NULL;
sr_info("Checking for link mso19\n");
const char* conn = NULL; const char* conn = NULL;
const char* serialcomm = NULL; const char* serialcomm = NULL;
GSList *l; GSList *l;
@ -154,6 +124,7 @@ static GSList *hw_scan(GSList *options)
char path[32]; char path[32];
snprintf(path, sizeof(path), "/dev/%s", sysname); snprintf(path, sizeof(path), "/dev/%s", sysname);
conn = path;
size_t s = strcspn(iProduct, " "); size_t s = strcspn(iProduct, " ");
char product[32]; char product[32];
@ -217,21 +188,17 @@ static GSList *hw_scan(GSList *options)
sdi->probes = g_slist_append(sdi->probes, probe); sdi->probes = g_slist_append(sdi->probes, probe);
} }
printf("Add the context\n");
//Add the driver //Add the driver
struct drv_context *drvc = di->priv; struct drv_context *drvc = di->priv;
drvc->instances = g_slist_append(drvc->instances, sdi); drvc->instances = g_slist_append(drvc->instances, sdi);
devices = g_slist_append(devices, sdi); devices = g_slist_append(devices, sdi);
} }
printf("Return devices\n");
return devices; return devices;
} }
static GSList *hw_dev_list(void) static GSList *hw_dev_list(void)
{ {
printf("Dev list\n");
struct drv_context *drvc; struct drv_context *drvc;
drvc = di->priv; drvc = di->priv;
@ -241,7 +208,6 @@ static GSList *hw_dev_list(void)
static int hw_dev_open(struct sr_dev_inst *sdi) static int hw_dev_open(struct sr_dev_inst *sdi)
{ {
printf("Dev opewn\n");
struct dev_context *devc; struct dev_context *devc;
devc = sdi->priv; devc = sdi->priv;
@ -287,7 +253,6 @@ static int hw_dev_close(struct sr_dev_inst *sdi)
static int hw_cleanup(void) static int hw_cleanup(void)
{ {
printf("*Dev clearup\n");
GSList *l; GSList *l;
struct sr_dev_inst *sdi; struct sr_dev_inst *sdi;
struct drv_context *drvc; struct drv_context *drvc;
@ -326,8 +291,6 @@ static int hw_info_get(int info_id, const void **data,
{ {
struct dev_context *devc; struct dev_context *devc;
printf("Get info\n");
switch (info_id) { switch (info_id) {
case SR_DI_HWCAPS: case SR_DI_HWCAPS:
*data = hwcaps; *data = hwcaps;
@ -403,10 +366,10 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
if (sdi->status != SR_ST_ACTIVE) if (sdi->status != SR_ST_ACTIVE)
return SR_ERR; return SR_ERR;
//TODO if (ols_configure_probes(sdi) != SR_OK) { if (mso_configure_probes(sdi) != SR_OK) {
//TODO sr_err("Failed to configure probes."); sr_err("Failed to configure probes.");
//TODO return SR_ERR; return SR_ERR;
//TODO } }
/* /*
* Enable/disable channel groups in the flag register according to the * Enable/disable channel groups in the flag register according to the
@ -511,7 +474,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
/* TODO: This stops acquisition on ALL devices, ignoring dev_index. */ /* TODO: This stops acquisition on ALL devices, ignoring dev_index. */
static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data)
{ {
printf("Accuqstion stop\n");
/* Avoid compiler warnings. */ /* Avoid compiler warnings. */
(void)cb_data; (void)cb_data;

View File

@ -335,11 +335,13 @@ SR_PRIV int mso_check_trigger(struct sr_serial_dev_inst *serial, uint8_t *info)
int ret; int ret;
sr_dbg("Requesting trigger state."); sr_dbg("Requesting trigger state.");
printf("Send Controll message\n");
ret = mso_send_control_message(serial, ARRAY_AND_SIZE(ops)); ret = mso_send_control_message(serial, ARRAY_AND_SIZE(ops));
if (info == NULL || ret != SR_OK) if (info == NULL || ret != SR_OK)
return ret; return ret;
printf("REad buffer\n");
uint8_t buf = 0; uint8_t buf = 0;
if (serial_read(serial, &buf, 1) != 1) /* FIXME: Need timeout */ if (serial_read(serial, &buf, 1) != 1) /* FIXME: Need timeout */
ret = SR_ERR; ret = SR_ERR;
@ -377,19 +379,23 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
uint8_t in[1024]; uint8_t in[1024];
size_t s = serial_read(devc->serial, in, sizeof(in)); size_t s = serial_read(devc->serial, in, sizeof(in));
if (s <= 0) if (s <= 0)
return FALSE; return FALSE;
/* No samples */ /* Check if we triggered, then send a command that we are ready
* to read the data */
if (devc->trigger_state != MSO_TRIGGER_DATAREADY) { if (devc->trigger_state != MSO_TRIGGER_DATAREADY) {
devc->trigger_state = in[0]; devc->trigger_state = in[0];
printf("Got %c for trigger \n", in[0]);
if (devc->trigger_state == MSO_TRIGGER_DATAREADY) { if (devc->trigger_state == MSO_TRIGGER_DATAREADY) {
printf("Trigger is ready %c\n", MSO_TRIGGER_DATAREADY);
mso_read_buffer(sdi); mso_read_buffer(sdi);
devc->buffer_n = 0; devc->buffer_n = 0;
} else { } else {
mso_check_trigger(devc->serial, NULL); mso_check_trigger(devc->serial, NULL);
} }
return FALSE; return TRUE;
} }
/* the hardware always dumps 1024 samples, 24bits each */ /* the hardware always dumps 1024 samples, 24bits each */
@ -398,8 +404,9 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
devc->buffer_n += s; devc->buffer_n += s;
} }
if (devc->buffer_n < 3072) if (devc->buffer_n < 3072)
return FALSE; return TRUE;
printf("Got samples, write out the data\n");
/* do the conversion */ /* do the conversion */
uint8_t logic_out[1024]; uint8_t logic_out[1024];
double analog_out[1024]; double analog_out[1024];
@ -416,6 +423,7 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
logic.length = 1024; logic.length = 1024;
logic.unitsize = 1; logic.unitsize = 1;
logic.data = logic_out; logic.data = logic_out;
printf("Send Data\n");
sr_session_send(cb_data, &packet); sr_session_send(cb_data, &packet);
// Dont bother fixing this yet, keep it "old style" // Dont bother fixing this yet, keep it "old style"
@ -427,8 +435,75 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
sr_session_send(ctx->session_dev_id, &packet); sr_session_send(ctx->session_dev_id, &packet);
*/ */
packet.type = SR_DF_END; //printf("Send END\n");
sr_session_send(devc->session_dev_id, &packet); //packet.type = SR_DF_END;
//sr_session_send(devc->session_dev_id, &packet);
// serial_flush(devc->serial);
// abort_acquisition(sdi);
// serial_close(devc->serial);
return FALSE;
printf("REturn \n");
return TRUE; return TRUE;
} }
SR_PRIV int mso_configure_probes(const struct sr_dev_inst *sdi)
{
struct dev_context *devc;
struct sr_probe *probe;
GSList *l;
int probe_bit, stage, i;
char *tc;
/*
devc = sdi->priv;
for (i = 0; i < NUM_TRIGGER_STAGES; i++) {
devc->la_trigger_mask[i] = 0;
devc->la_trigger[i] = 0;
}
stage = -1;
for (l = sdi->probes; l; l = l->next) {
probe = (struct sr_probe *)l->data;
if (probe->enabled == FALSE)
continue;
//if (probe->index > 7)
// devc->sample_wide = TRUE;
probe_bit = 1 << (probe->index);
if (!(probe->trigger))
continue;
//Configure trigger mask and value.
stage = 0;
for (tc = probe->trigger; *tc; tc++) {
devc->trigger_mask[stage] |= probe_bit;
if (*tc == '1')
devc->trigger_value[stage] |= probe_bit;
stage++;
if (stage > NUM_TRIGGER_STAGES)
return SR_ERR;
}
}
*/
//if (stage == -1)
// /*
// * We didn't configure any triggers, make sure acquisition
// * doesn't wait for any.
// */
// devc->trigger_stage = TRIGGER_FIRED;
//else
// devc->trigger_stage = 0;
return SR_OK;
}

View File

@ -133,6 +133,7 @@ SR_PRIV inline uint16_t mso_calc_raw_from_mv(struct dev_context *devc);
SR_PRIV int mso_reset_fsm(struct sr_dev_inst *sdi); SR_PRIV int mso_reset_fsm(struct sr_dev_inst *sdi);
SR_PRIV int mso_toggle_led(struct sr_dev_inst *sdi, int state); SR_PRIV int mso_toggle_led(struct sr_dev_inst *sdi, int state);
SR_PRIV int mso_configure_probes(const struct sr_dev_inst *sdi);
SR_PRIV void stop_acquisition(const struct sr_dev_inst *sdi); SR_PRIV void stop_acquisition(const struct sr_dev_inst *sdi);
/////////////////////// ///////////////////////