]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/zeroplus-logic-cube/analyzer.c
hp-59306a: Initial HP 59306A driver.
[libsigrok.git] / src / hardware / zeroplus-logic-cube / analyzer.c
index aa5643ab7e80626dbc43340b5e2aa02e259899d4..0617d227467e840548a93c823678c89c0c199ca1 100644 (file)
@@ -62,7 +62,7 @@ enum {
        TRIGGER_STATUS5,
        TRIGGER_STATUS6,
        TRIGGER_STATUS7,
-       TRIGGER_STATUS8,
+       TRIGGER_EDGE,
 
        TRIGGER_COUNT0                  = 0x50,
        TRIGGER_COUNT1,
@@ -108,7 +108,8 @@ enum {
        READ_RAM_STATUS                 = 0xa0,
 };
 
-static int g_trigger_status[9] = { 0 };
+static int g_trigger_status[8] = { 0 };
+static int g_trigger_edge = 0;
 static int g_trigger_count = 1;
 static int g_filter_status[8] = { 0 };
 static int g_filter_enable = 0;
@@ -420,7 +421,7 @@ SR_PRIV void analyzer_read_start(libusb_device_handle *devh)
 }
 
 SR_PRIV int analyzer_read_data(libusb_device_handle *devh, void *buffer,
-                      unsigned int size)
+               unsigned int size)
 {
        return gl_read_bulk(devh, buffer, size);
 }
@@ -461,8 +462,9 @@ SR_PRIV void analyzer_configure(libusb_device_handle *devh)
        gl_reg_write(devh, CLOCK_SOURCE, 0x03);
 
        /* Set_Trigger_Status */
-       for (i = 0; i < 9; i++)
+       for (i = 0; i < 8; i++)
                gl_reg_write(devh, TRIGGER_STATUS0 + i, g_trigger_status[i]);
+       gl_reg_write(devh, TRIGGER_EDGE, g_trigger_edge);
 
        __analyzer_set_trigger_count(devh, g_trigger_count);
 
@@ -503,6 +505,9 @@ SR_PRIV int analyzer_add_triggers(const struct sr_dev_inst *sdi)
        if (!(trigger = sr_session_trigger_get(sdi->session)))
                return SR_OK;
 
+       memset(g_trigger_status, 0, sizeof(g_trigger_status));
+       g_trigger_edge = 0;
+
        for (l = trigger->stages; l; l = l->next) {
                stage = l->data;
                for (m = stage->matches; m; m = m->next) {
@@ -519,6 +524,15 @@ SR_PRIV int analyzer_add_triggers(const struct sr_dev_inst *sdi)
                        case SR_TRIGGER_ONE:
                                g_trigger_status[channel / 4] |= 1 << (channel % 4 * 2);
                                break;
+                       case SR_TRIGGER_RISING:
+                               g_trigger_edge = 0x40 | (channel & 0x1F);
+                               break;
+                       case SR_TRIGGER_FALLING:
+                               g_trigger_edge = 0x80 | (channel & 0x1F);
+                               break;
+                       case SR_TRIGGER_EDGE:
+                               g_trigger_edge = 0xc0 | (channel & 0x1F);
+                               break;
                        default:
                                sr_err("Unsupported match %d", match->match);
                                return SR_ERR;
@@ -555,7 +569,7 @@ SR_PRIV void analyzer_add_filter(int channel, int type)
        }
 
        g_filter_status[i] |=
-           1 << ((2 * channel) + (type == FILTER_LOW ? 1 : 0));
+               1 << ((2 * channel) + (type == FILTER_LOW ? 1 : 0));
 
        g_filter_enable = 1;
 }