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:
Sebastian Reichel 2019-05-15 22:20:55 +02:00
parent 4d8338bb96
commit f6129c8f0c
5 changed files with 33 additions and 8 deletions

View File

@ -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"

View File

@ -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;

View File

@ -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)

View File

@ -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 {

View File

@ -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 */