]> sigrok.org Git - libsigrok.git/commitdiff
More cleanup. Communication with mso19 is working, but its not triggering. Need to...
authorlelazary <redacted>
Sat, 5 Jan 2013 17:29:00 +0000 (09:29 -0800)
committerUwe Hermann <redacted>
Tue, 8 Jan 2013 00:00:13 +0000 (01:00 +0100)
hardware/link-mso19/api.c
hardware/link-mso19/protocol.c
hardware/link-mso19/protocol.h

index 5dd5045d153944b205e3133f6925a9991ebd5045..c6d92fd15d9756a8c705d7ed82e804e5c529b017 100644 (file)
@@ -19,9 +19,6 @@
 
 #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,
@@ -43,25 +40,28 @@ SR_PRIV const char *mso19_probe_names[NUM_PROBES + 1] = {
 /*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,
 };
 
@@ -165,7 +165,7 @@ static GSList *hw_scan(GSList *options)
                }
                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;
@@ -206,13 +206,17 @@ static GSList *hw_scan(GSList *options)
       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
@@ -357,12 +361,7 @@ static int hw_info_get(int info_id, const void **data,
 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;
@@ -395,12 +394,6 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
        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;
   
   
@@ -438,19 +431,23 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
        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;
@@ -461,6 +458,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
        /* END of config hardware part */
 
        /* with trigger */
+  printf("arm\n");
        ret = mso_arm(sdi);
        if (ret != SR_OK)
                return ret;
@@ -471,13 +469,16 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi,
 //             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;
index 6f4be15b9cae187c828e8eb8852c7db7545dd74f..1b20ac9b0124ebdf21b493e696071fb8988fc9b5 100644 (file)
  */
 
 #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;
@@ -91,7 +136,7 @@ SR_PRIV int mso_configure_trigger(struct sr_dev_inst *sdi)
        /* 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)
@@ -176,7 +221,6 @@ SR_PRIV int mso_parse_serial(const char *iSerial, const char *iProduct,
                return SR_ERR;
        devc->hwmodel = u4;
        devc->hwrev = u5;
-       devc->serial = u6;
        devc->vbit = u1 / 10000;
        if (devc->vbit == 0)
                devc->vbit = 4.19195;
@@ -196,59 +240,42 @@ SR_PRIV int mso_parse_serial(const char *iSerial, const char *iProduct,
        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));
 }
 
@@ -291,6 +318,10 @@ SR_PRIV int mso_configure_rate(struct sr_dev_inst *sdi, uint32_t rate)
                        return ret;
                }
        }
+
+  if (ret != SR_OK)
+               sr_err("Unsupported rate.");
+
        return ret;
 }
 
@@ -324,16 +355,13 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
        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;
@@ -402,4 +430,5 @@ SR_PRIV int mso_receive_data(int fd, int revents, void *cb_data)
        packet.type = SR_DF_END;
        sr_session_send(devc->session_dev_id, &packet);
 
+  return TRUE;
 }
index 2c603a24e95535ded292278d3819110ce2a8e70d..9ce1de3b883ed617421b69e62a0e90af50d7ff28 100644 (file)
 #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'
@@ -140,8 +129,9 @@ SR_PRIV int mso_read_buffer(struct sr_dev_inst *sdi);
 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);
 
@@ -224,21 +214,4 @@ static uint16_t la_threshold_map[] = {
        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