rigol-ds: Add initial Rigol MSO5000 support.
This adds basic support for the Rigol MSO5000 series. It has the same problems as the DS4000 series: Live capture provides one digital channel per byte. Buffered memory returns the data compressed (one byte has 8 digital channels), but the banks are read separately. It's not possible to read uint16.
This commit is contained in:
parent
4d8338bb96
commit
f6129c8f0c
|
@ -206,6 +206,9 @@ ATTRS{idVendor}=="1ab1", ATTRS{idProduct}=="0641", ENV{ID_SIGROK}="1"
|
||||||
# Rigol DP800 series
|
# Rigol DP800 series
|
||||||
ATTRS{idVendor}=="1ab1", ATTRS{idProduct}=="0e11", ENV{ID_SIGROK}="1"
|
ATTRS{idVendor}=="1ab1", ATTRS{idProduct}=="0e11", ENV{ID_SIGROK}="1"
|
||||||
|
|
||||||
|
# Rigol MSO5000 series
|
||||||
|
ATTRS{idVendor}=="1ab1", ATTRS{idProduct}=="0515", ENV{ID_SIGROK}="1"
|
||||||
|
|
||||||
# Rohde&Schwarz HMO series mixed-signal oscilloscope (previously branded Hameg) VCP/USBTMC mode
|
# Rohde&Schwarz HMO series mixed-signal oscilloscope (previously branded Hameg) VCP/USBTMC mode
|
||||||
ATTRS{idVendor}=="0aad", ATTRS{idProduct}=="0117", ENV{ID_SIGROK}="1"
|
ATTRS{idVendor}=="0aad", ATTRS{idProduct}=="0117", ENV{ID_SIGROK}="1"
|
||||||
ATTRS{idVendor}=="0aad", ATTRS{idProduct}=="0118", ENV{ID_SIGROK}="1"
|
ATTRS{idVendor}=="0aad", ATTRS{idProduct}=="0118", ENV{ID_SIGROK}="1"
|
||||||
|
|
|
@ -183,6 +183,7 @@ enum series {
|
||||||
DSO1000B,
|
DSO1000B,
|
||||||
DS1000Z,
|
DS1000Z,
|
||||||
DS4000,
|
DS4000,
|
||||||
|
MSO5000,
|
||||||
MSO7000A,
|
MSO7000A,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -212,6 +213,8 @@ static const struct rigol_ds_series supported_series[] = {
|
||||||
{50, 1}, {1, 1000}, 12, 1200, 12000000},
|
{50, 1}, {1, 1000}, 12, 1200, 12000000},
|
||||||
[DS4000] = {VENDOR(RIGOL), "DS4000", PROTOCOL_V4, FORMAT_IEEE488_2,
|
[DS4000] = {VENDOR(RIGOL), "DS4000", PROTOCOL_V4, FORMAT_IEEE488_2,
|
||||||
{1000, 1}, {1, 1000}, 14, 1400, 0},
|
{1000, 1}, {1, 1000}, 14, 1400, 0},
|
||||||
|
[MSO5000] = {VENDOR(RIGOL), "MSO5000", PROTOCOL_V5, FORMAT_IEEE488_2,
|
||||||
|
{1000, 1}, {500, 1000000}, 10, 1000, 0},
|
||||||
[MSO7000A] = {VENDOR(AGILENT), "MSO7000A", PROTOCOL_V4, FORMAT_IEEE488_2,
|
[MSO7000A] = {VENDOR(AGILENT), "MSO7000A", PROTOCOL_V4, FORMAT_IEEE488_2,
|
||||||
{50, 1}, {2, 1000}, 10, 1000, 8000000},
|
{50, 1}, {2, 1000}, 10, 1000, 8000000},
|
||||||
};
|
};
|
||||||
|
@ -276,6 +279,12 @@ static const struct rigol_ds_model supported_models[] = {
|
||||||
{SERIES(DS1000Z), "MSO1074Z-S", {5, 1000000000}, CH_INFO(4, true), std_cmd},
|
{SERIES(DS1000Z), "MSO1074Z-S", {5, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
{SERIES(DS1000Z), "MSO1104Z-S", {5, 1000000000}, CH_INFO(4, true), std_cmd},
|
{SERIES(DS1000Z), "MSO1104Z-S", {5, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
{SERIES(DS4000), "DS4024", {1, 1000000000}, CH_INFO(4, false), std_cmd},
|
{SERIES(DS4000), "DS4024", {1, 1000000000}, CH_INFO(4, false), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5072", {1, 1000000000}, CH_INFO(2, true), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5074", {1, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5102", {1, 1000000000}, CH_INFO(2, true), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5104", {1, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5204", {1, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
|
{SERIES(MSO5000), "MSO5354", {1, 1000000000}, CH_INFO(4, true), std_cmd},
|
||||||
/* TODO: Digital channels are not yet supported on MSO7000A. */
|
/* TODO: Digital channels are not yet supported on MSO7000A. */
|
||||||
{SERIES(MSO7000A), "MSO7034A", {2, 1000000000}, CH_INFO(4, false), mso7000a_cmd},
|
{SERIES(MSO7000A), "MSO7034A", {2, 1000000000}, CH_INFO(4, false), mso7000a_cmd},
|
||||||
};
|
};
|
||||||
|
@ -871,6 +880,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
|
||||||
struct sr_datafeed_packet packet;
|
struct sr_datafeed_packet packet;
|
||||||
gboolean some_digital;
|
gboolean some_digital;
|
||||||
GSList *l;
|
GSList *l;
|
||||||
|
char *cmd;
|
||||||
|
|
||||||
scpi = sdi->conn;
|
scpi = sdi->conn;
|
||||||
devc = sdi->priv;
|
devc = sdi->priv;
|
||||||
|
@ -913,9 +923,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
|
||||||
}
|
}
|
||||||
if (ch->enabled != devc->digital_channels[ch->index]) {
|
if (ch->enabled != devc->digital_channels[ch->index]) {
|
||||||
/* Enabled channel is currently disabled, or vice versa. */
|
/* Enabled channel is currently disabled, or vice versa. */
|
||||||
if (rigol_ds_config_set(sdi,
|
if (devc->model->series->protocol >= PROTOCOL_V5)
|
||||||
devc->model->series->protocol >= PROTOCOL_V3 ?
|
cmd = ":LA:DISP D%d,%s";
|
||||||
":LA:DIG%d:DISP %s" : ":DIG%d:TURN %s", ch->index,
|
else if (devc->model->series->protocol >= PROTOCOL_V3)
|
||||||
|
cmd = ":LA:DIG%d:DISP %s";
|
||||||
|
else
|
||||||
|
cmd = ":DIG%d:TURN %s";
|
||||||
|
|
||||||
|
if (rigol_ds_config_set(sdi, cmd, ch->index,
|
||||||
ch->enabled ? "ON" : "OFF") != SR_OK)
|
ch->enabled ? "ON" : "OFF") != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
devc->digital_channels[ch->index] = ch->enabled;
|
devc->digital_channels[ch->index] = ch->enabled;
|
||||||
|
|
|
@ -370,6 +370,7 @@ SR_PRIV int rigol_ds_capture_start(const struct sr_dev_inst *sdi)
|
||||||
break;
|
break;
|
||||||
case PROTOCOL_V3:
|
case PROTOCOL_V3:
|
||||||
case PROTOCOL_V4:
|
case PROTOCOL_V4:
|
||||||
|
case PROTOCOL_V5:
|
||||||
if (rigol_ds_config_set(sdi, ":WAV:FORM BYTE") != SR_OK)
|
if (rigol_ds_config_set(sdi, ":WAV:FORM BYTE") != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
if (devc->data_source == DATA_SOURCE_LIVE) {
|
if (devc->data_source == DATA_SOURCE_LIVE) {
|
||||||
|
@ -382,7 +383,7 @@ SR_PRIV int rigol_ds_capture_start(const struct sr_dev_inst *sdi)
|
||||||
if (devc->model->series->protocol == PROTOCOL_V3) {
|
if (devc->model->series->protocol == PROTOCOL_V3) {
|
||||||
if (rigol_ds_config_set(sdi, ":WAV:MODE RAW") != SR_OK)
|
if (rigol_ds_config_set(sdi, ":WAV:MODE RAW") != SR_OK)
|
||||||
return SR_ERR;
|
return SR_ERR;
|
||||||
} else if (devc->model->series->protocol == PROTOCOL_V4) {
|
} else if (devc->model->series->protocol >= PROTOCOL_V4) {
|
||||||
num_channels = 0;
|
num_channels = 0;
|
||||||
|
|
||||||
/* Channels 3 and 4 are multiplexed with D0-7 and D8-15 */
|
/* Channels 3 and 4 are multiplexed with D0-7 and D8-15 */
|
||||||
|
@ -477,6 +478,7 @@ SR_PRIV int rigol_ds_channel_start(const struct sr_dev_inst *sdi)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROTOCOL_V4:
|
case PROTOCOL_V4:
|
||||||
|
case PROTOCOL_V5:
|
||||||
if (ch->type == SR_CHANNEL_ANALOG) {
|
if (ch->type == SR_CHANNEL_ANALOG) {
|
||||||
if (rigol_ds_config_set(sdi, ":WAV:SOUR CHAN%d",
|
if (rigol_ds_config_set(sdi, ":WAV:SOUR CHAN%d",
|
||||||
ch->index + 1) != SR_OK)
|
ch->index + 1) != SR_OK)
|
||||||
|
@ -736,7 +738,7 @@ SR_PRIV int rigol_ds_receive(int fd, int revents, void *cb_data)
|
||||||
// TODO: For the MSO1000Z series, we need a way to express that
|
// TODO: For the MSO1000Z series, we need a way to express that
|
||||||
// this data is in fact just for a single channel, with the valid
|
// this data is in fact just for a single channel, with the valid
|
||||||
// data for that channel in the LSB of each byte.
|
// data for that channel in the LSB of each byte.
|
||||||
logic.unitsize = devc->model->series->protocol == PROTOCOL_V4 ? 1 : 2;
|
logic.unitsize = devc->model->series->protocol >= PROTOCOL_V4 ? 1 : 2;
|
||||||
logic.data = devc->buffer;
|
logic.data = devc->buffer;
|
||||||
packet.type = SR_DF_LOGIC;
|
packet.type = SR_DF_LOGIC;
|
||||||
packet.payload = &logic;
|
packet.payload = &logic;
|
||||||
|
@ -849,9 +851,12 @@ SR_PRIV int rigol_ds_get_dev_cfg(const struct sr_dev_inst *sdi)
|
||||||
sr_dbg("Logic analyzer %s, current digital channel state:",
|
sr_dbg("Logic analyzer %s, current digital channel state:",
|
||||||
devc->la_enabled ? "enabled" : "disabled");
|
devc->la_enabled ? "enabled" : "disabled");
|
||||||
for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) {
|
for (i = 0; i < ARRAY_SIZE(devc->digital_channels); i++) {
|
||||||
cmd = g_strdup_printf(
|
if (devc->model->series->protocol >= PROTOCOL_V5)
|
||||||
devc->model->series->protocol >= PROTOCOL_V3 ?
|
cmd = g_strdup_printf(":LA:DISP? D%d", i);
|
||||||
":LA:DIG%d:DISP?" : ":DIG%d:TURN?", i);
|
else if (devc->model->series->protocol >= PROTOCOL_V3)
|
||||||
|
cmd = g_strdup_printf(":LA:DIG%d:DISP?", i);
|
||||||
|
else
|
||||||
|
cmd = g_strdup_printf(":DIG%d:TURN?", i);
|
||||||
res = sr_scpi_get_bool(sdi->conn, cmd, &devc->digital_channels[i]);
|
res = sr_scpi_get_bool(sdi->conn, cmd, &devc->digital_channels[i]);
|
||||||
g_free(cmd);
|
g_free(cmd);
|
||||||
if (res != SR_OK)
|
if (res != SR_OK)
|
||||||
|
|
|
@ -42,6 +42,7 @@ enum protocol_version {
|
||||||
PROTOCOL_V2, /* DS1000 */
|
PROTOCOL_V2, /* DS1000 */
|
||||||
PROTOCOL_V3, /* DS2000, DSO1000 */
|
PROTOCOL_V3, /* DS2000, DSO1000 */
|
||||||
PROTOCOL_V4, /* DS1000Z */
|
PROTOCOL_V4, /* DS1000Z */
|
||||||
|
PROTOCOL_V5, /* MSO5000 */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum data_format {
|
enum data_format {
|
||||||
|
|
|
@ -107,6 +107,7 @@ static struct usbtmc_blacklist blacklist_remote[] = {
|
||||||
{ 0x1ab1, 0x0588 }, /* Rigol DS1000 series */
|
{ 0x1ab1, 0x0588 }, /* Rigol DS1000 series */
|
||||||
{ 0x1ab1, 0x04b0 }, /* Rigol DS2000 series */
|
{ 0x1ab1, 0x04b0 }, /* Rigol DS2000 series */
|
||||||
{ 0x1ab1, 0x04b1 }, /* Rigol DS4000 series */
|
{ 0x1ab1, 0x04b1 }, /* Rigol DS4000 series */
|
||||||
|
{ 0x1ab1, 0x0515 }, /* Rigol MSO5000 series */
|
||||||
{ 0x0957, 0x0588 }, /* Agilent DSO1000 series (rebadged Rigol DS1000) */
|
{ 0x0957, 0x0588 }, /* Agilent DSO1000 series (rebadged Rigol DS1000) */
|
||||||
{ 0x0b21, 0xffff }, /* All Yokogawa devices */
|
{ 0x0b21, 0xffff }, /* All Yokogawa devices */
|
||||||
{ 0xf4ec, 0xffff }, /* All Siglent SDS devices */
|
{ 0xf4ec, 0xffff }, /* All Siglent SDS devices */
|
||||||
|
|
Loading…
Reference in New Issue