#include "protocol.h"
-#define SERIALCOMM "460800/8n1" //Default communication params
-#define SERIALCONN "/dev/ttyUSB0" //Default communication params
-
static const int hwcaps[] = {
SR_HWCAP_LOGIC_ANALYZER,
SR_HWCAP_SAMPLERATE,
/*supported samplerates */
static const struct sr_samplerates samplerates = {
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),
+ SR_HZ(1),
+ //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,
};
}
strncpy(product, iProduct, s);
product[s] = 0;
- strcpy(manufacturer, iProduct + s);
+ strcpy(manufacturer, iProduct + s + 1);
//Create the device context and set its params
struct dev_context *devc;
return devices;
}
- //sdi->index = 0;
sdi->driver = di;
sdi->priv = devc;
- //sdi->model = "
- //sdi->version = "Testing1234";
- //struct sr_probe *probe;
- //sdi->probes = g_slist_append(sdi->probes, probe);
+
+ for (i = 0; i < NUM_PROBES; i++) {
+ struct sr_probe *probe;
+ if (!(probe = sr_probe_new(i, SR_PROBE_LOGIC, TRUE,
+ mso19_probe_names[i])))
+ return 0;
+ sdi->probes = g_slist_append(sdi->probes, probe);
+ }
+
printf("Add the context\n");
//Add the driver
static int hw_dev_config_set(const struct sr_dev_inst *sdi, int hwcap,
const void *value)
{
- struct dev_context *devc;
int ret;
- const uint64_t *tmp_u64;
-
- printf("Config set\n");
- devc = sdi->priv;
if (sdi->status != SR_ST_ACTIVE)
return SR_ERR;
struct sr_datafeed_header *header;
struct sr_datafeed_meta_logic meta;
struct dev_context *devc;
- uint32_t trigger_config[4];
- uint32_t data;
- uint16_t readcount, delaycount;
- uint8_t changrp_mask;
- int num_channels;
- int i;
int ret = SR_ERR;
devc->ctlbase1 &= 0x7f;
// devc->ctlbase1 |= devc->acdcmode;
+ printf("Configure rate\n");
ret = mso_configure_rate(sdi, devc->cur_rate);
if (ret != SR_OK)
return ret;
/* set dac offset */
+ printf("Configure dac\n");
ret = mso_dac_out(sdi, devc->dac_offset);
if (ret != SR_OK)
return ret;
+ printf("Configure threshold level\n");
ret = mso_configure_threshold_level(sdi);
if (ret != SR_OK)
return ret;
+ printf("Configure trigger\n");
ret = mso_configure_trigger(sdi);
if (ret != SR_OK)
return ret;
/* END of config hardware part */
/* with trigger */
+ printf("arm\n");
ret = mso_arm(sdi);
if (ret != SR_OK)
return ret;
// return ret;
/* Start acquisition on the device. */
- mso_check_trigger(sdi, &devc->trigger_state);
- ret = mso_check_trigger(sdi, NULL);
+ printf("Check trigger\n");
+ mso_check_trigger(devc->serial, &devc->trigger_state);
+ ret = mso_check_trigger(devc->serial, NULL);
if (ret != SR_OK)
return ret;
+ printf("Source add\n");
sr_source_add(devc->serial->fd, G_IO_IN, -1, mso_receive_data, cb_data);
+ printf("Create packet\n");
if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) {
sr_err("Datafeed packet malloc failed.");
return SR_ERR_MALLOC;
*/
#include "protocol.h"
+#include <arpa/inet.h>
extern SR_PRIV struct sr_dev_driver link_mso19_driver_info;
static struct sr_dev_driver *di = &link_mso19_driver_info;
+SR_PRIV int mso_send_control_message(struct sr_serial_dev_inst *serial,
+ uint16_t payload[], int n)
+{
+ int i, w, ret, s = n * 2 + sizeof(mso_head) + sizeof(mso_foot);
+ char *p, *buf;
+
+ ret = SR_ERR;
+
+ if (serial->fd < 0)
+ goto ret;
+
+ if (!(buf = g_try_malloc(s))) {
+ sr_err("Failed to malloc message buffer.");
+ ret = SR_ERR_MALLOC;
+ goto ret;
+ }
+
+ p = buf;
+ memcpy(p, mso_head, sizeof(mso_head));
+ p += sizeof(mso_head);
+
+ for (i = 0; i < n; i++) {
+ *(uint16_t *) p = htons(payload[i]);
+ p += 2;
+ }
+ memcpy(p, mso_foot, sizeof(mso_foot));
+
+ w = 0;
+ while (w < s) {
+ ret = serial_write(serial, buf + w, s - w);
+ if (ret < 0) {
+ ret = SR_ERR;
+ goto free;
+ }
+ w += ret;
+ }
+ ret = SR_OK;
+free:
+ g_free(buf);
+ret:
+ return ret;
+}
+
+
SR_PRIV int mso_configure_trigger(struct sr_dev_inst *sdi)
{
struct dev_context *devc = sdi->priv;
/* Select the default config bank */
ops[15] = mso_trans(REG_CTL2, devc->ctlbase2);
- return mso_send_control_message(sdi, ARRAY_AND_SIZE(ops));
+ return mso_send_control_message(devc->serial, ARRAY_AND_SIZE(ops));
}
SR_PRIV int mso_configure_threshold_level(struct sr_dev_inst *sdi)
return SR_ERR;
devc->hwmodel = u4;
devc->hwrev = u5;
- devc->serial = u6;
devc->vbit = u1 / 10000;
if (devc->vbit == 0)
devc->vbit = 4.19195;
return SR_OK;
}
-SR_PRIV int mso_send_control_message(struct sr_serial_dev_inst *serial,
- uint16_t payload[], int n)
+SR_PRIV int mso_reset_adc(struct sr_dev_inst *sdi)
{
- int i, w, ret, s = n * 2 + sizeof(mso_head) + sizeof(mso_foot);
- char *p, *buf;
-
- ret = SR_ERR;
+ struct dev_context *devc = sdi->priv;
+ uint16_t ops[2];
- if (serial->fd < 0)
- goto ret;
+ ops[0] = mso_trans(REG_CTL1, (devc->ctlbase1 | BIT_CTL1_RESETADC));
+ ops[1] = mso_trans(REG_CTL1, devc->ctlbase1);
+ devc->ctlbase1 |= BIT_CTL1_ADC_UNKNOWN4;
- if (!(buf = g_try_malloc(s))) {
- sr_err("Failed to malloc message buffer.");
- ret = SR_ERR_MALLOC;
- goto ret;
- }
+ sr_dbg("Requesting ADC reset.");
+ return mso_send_control_message(devc->serial, ARRAY_AND_SIZE(ops));
+}
- p = buf;
- memcpy(p, mso_head, sizeof(mso_head));
- p += sizeof(mso_head);
+SR_PRIV int mso_reset_fsm(struct sr_dev_inst *sdi)
+{
+ struct dev_context *devc = sdi->priv;
+ uint16_t ops[1];
- for (i = 0; i < n; i++) {
- *(uint16_t *) p = htons(payload[i]);
- p += 2;
- }
- memcpy(p, mso_foot, sizeof(mso_foot));
+ devc->ctlbase1 |= BIT_CTL1_RESETFSM;
+ ops[0] = mso_trans(REG_CTL1, devc->ctlbase1);
- w = 0;
- while (w < s) {
- ret = serial_write(serial, buf + w, s - w);
- if (ret < 0) {
- ret = SR_ERR;
- goto free;
- }
- w += ret;
- }
- ret = SR_OK;
-free:
- g_free(buf);
-ret:
- return ret;
+ sr_dbg("Requesting ADC reset.");
+ return mso_send_control_message(devc->serial, ARRAY_AND_SIZE(ops));
}
-SR_PRIV int mso_reset_adc(struct sr_dev_inst *sdi)
+SR_PRIV int mso_toggle_led(struct sr_dev_inst *sdi, int state)
{
struct dev_context *devc = sdi->priv;
- uint16_t ops[2];
+ uint16_t ops[1];
- ops[0] = mso_trans(REG_CTL1, (devc->ctlbase1 | BIT_CTL1_RESETADC));
- ops[1] = mso_trans(REG_CTL1, devc->ctlbase1);
- devc->ctlbase1 |= BIT_CTL1_ADC_UNKNOWN4;
+ devc->ctlbase1 &= ~BIT_CTL1_LED;
+ if (state)
+ devc->ctlbase1 |= BIT_CTL1_LED;
+ ops[0] = mso_trans(REG_CTL1, devc->ctlbase1);
- sr_dbg("Requesting ADC reset.");
+ sr_dbg("Requesting LED toggle.");
return mso_send_control_message(devc->serial, ARRAY_AND_SIZE(ops));
}
return ret;
}
}
+
+ if (ret != SR_OK)
+ sr_err("Unsupported rate.");
+
return ret;
}
struct sr_datafeed_packet packet;
struct sr_datafeed_logic logic;
struct sr_dev_inst *sdi;
- struct drv_context *drvc;
- struct dev_context *devc;
GSList *l;
- int num_channels, offset, i, j;
- unsigned char byte;
+ int i;
- drvc = di->priv;
+ struct drv_context *drvc = di->priv;
/* Find this device's devc struct by its fd. */
- devc = NULL;
+ struct dev_context *devc = NULL;
for (l = drvc->instances; l; l = l->next) {
sdi = l->data;
devc = sdi->priv;
packet.type = SR_DF_END;
sr_session_send(devc->session_dev_id, &packet);
+ return TRUE;
}
#define NUM_PROBES 8
#define NUM_TRIGGER_STAGES 4
#define TRIGGER_TYPES "01"
-#define SERIAL_SPEED B115200
+#define SERIALCOMM "460800/8n1/flow=2"
+#define SERIALCONN "/dev/ttyUSB0"
#define CLOCK_RATE SR_MHZ(100)
#define MIN_NUM_SAMPLES 4
-
-///* Bitmasks for CMD_FLAGS */
-//#define FLAG_DEMUX 0x01
-//#define FLAG_FILTER 0x02
-//#define FLAG_CHANNELGROUP_1 0x04
-//#define FLAG_CHANNELGROUP_2 0x08
-//#define FLAG_CHANNELGROUP_3 0x10
-//#define FLAG_CHANNELGROUP_4 0x20
-//#define FLAG_CLOCK_EXTERNAL 0x40
-//#define FLAG_CLOCK_INVERTED 0x80
-//#define FLAG_RLE 0x0100
-
#define MSO_TRIGGER_UNKNOWN '!'
#define MSO_TRIGGER_UNKNOWN1 '1'
#define MSO_TRIGGER_UNKNOWN2 '2'
SR_PRIV int mso_arm(struct sr_dev_inst *sdi);
SR_PRIV int mso_force_capture(struct sr_dev_inst *sdi);
SR_PRIV int mso_dac_out(struct sr_dev_inst *sdi, uint16_t val);
-SR_PRIV int mso_configure_rate(struct sr_dev_inst *sdi, uint32_t rate);
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_toggle_led(struct sr_dev_inst *sdi, int state);
SR_PRIV void stop_acquisition(const struct sr_dev_inst *sdi);
0x8fff,
};
-
-//SR_PRIV extern const char *ols_probe_names[NUM_PROBES + 1];
-//
-//SR_PRIV int send_shortcommand(struct sr_serial_dev_inst *serial,
-// uint8_t command);
-//SR_PRIV int send_longcommand(struct sr_serial_dev_inst *serial,
-// uint8_t command, uint32_t data);
-//SR_PRIV int ols_configure_probes(const struct sr_dev_inst *sdi);
-//SR_PRIV uint32_t reverse16(uint32_t in);
-//SR_PRIV uint32_t reverse32(uint32_t in);
-//SR_PRIV struct dev_context *ols_dev_new(void);
-//SR_PRIV struct sr_dev_inst *get_metadata(struct sr_serial_dev_inst *serial);
-//SR_PRIV int ols_set_samplerate(const struct sr_dev_inst *sdi,
-// uint64_t samplerate,
-// const struct sr_samplerates *samplerates);
-//SR_PRIV int ols_receive_data(int fd, int revents, void *cb_data);
-
#endif