rigol-ds: On DS1000 with firmware < 0.2.4, use legacy protocol.

Apparently the ASCII header containing length was only added in version
0.2.4.
This commit is contained in:
Bert Vermeulen 2014-01-21 12:54:24 +01:00
parent fcdebbe89c
commit 8dd0b290eb
3 changed files with 33 additions and 4 deletions

View File

@ -250,9 +250,10 @@ static int probe_port(const char *resource, const char *serialcomm, GSList **dev
struct sr_scpi_dev_inst *scpi;
struct sr_scpi_hw_info *hw_info;
struct sr_probe *probe;
long n[3];
unsigned int i;
const struct rigol_ds_model *model = NULL;
gchar *channel_name, *vendor;
gchar *channel_name, *vendor, **version;
*devices = NULL;
@ -295,7 +296,6 @@ static int probe_port(const char *resource, const char *serialcomm, GSList **dev
return SR_ERR_NA;
}
sr_scpi_hw_info_free(hw_info);
sr_scpi_close(scpi);
sdi->conn = scpi;
@ -308,6 +308,34 @@ static int probe_port(const char *resource, const char *serialcomm, GSList **dev
devc->limit_frames = 0;
devc->model = model;
devc->protocol = model->protocol;
/* DS1000 models with firmware before 0.2.4 used the old
* legacy protocol. */
if (model->series == RIGOL_DS1000) {
version = g_strsplit(hw_info->firmware_version, ".", 0);
do {
if (!version[0] || !version[1] || !version[2])
break;
if (version[0][0] == 0 || version[1][0] == 0 || version[2][0] == 0)
break;
for (i = 0; i < 3; i++) {
if (sr_atol(version[i], &n[i]) != SR_OK)
break;
}
if (i != 3)
break;
if (n[0] != 0 || n[1] > 2)
break;
if (n[1] == 2 && n[2] > 3)
break;
sr_dbg("Found DS1000 firmware < 0.2.4, using old protocol.");
devc->protocol = PROTOCOL_LEGACY;
} while(0);
g_strfreev(version);
}
sr_scpi_hw_info_free(hw_info);
for (i = 0; i < model->analog_channels; i++) {
if (!(channel_name = g_strdup_printf("CH%d", i + 1)))

View File

@ -460,7 +460,7 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
if (sr_scpi_read_begin(scpi) != SR_OK)
return TRUE;
if (devc->model->protocol == PROTOCOL_IEEE488_2) {
if (devc->protocol == PROTOCOL_IEEE488_2) {
sr_dbg("New block header expected");
len = rigol_ds_read_header(scpi);
if (len == -1)
@ -529,7 +529,7 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
/* Discard the terminating linefeed */
sr_scpi_read_data(scpi, (char *)devc->buffer, 1);
}
if (devc->model->protocol == PROTOCOL_IEEE488_2) {
if (devc->protocol == PROTOCOL_IEEE488_2) {
/* Prepare for possible next block */
devc->num_block_bytes = 0;
if (devc->data_source != DATA_SOURCE_LIVE)

View File

@ -93,6 +93,7 @@ enum wait_events {
struct dev_context {
/* Device model */
const struct rigol_ds_model *model;
enum rigol_protocol_flavor protocol;
/* Device properties */
const uint64_t (*timebases)[2];