]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/zeroplus-logic-cube/analyzer.c
zeroplus-logic-cube: Enable edge-triggering capabilities.
[libsigrok.git] / src / hardware / zeroplus-logic-cube / analyzer.c
index 94cf0689d2b1035c75246e8366168ec1b7812c44..2130692f589dacde768663c4d0cf7857d9127e13 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;
@@ -310,7 +311,7 @@ static int __analyzer_set_freq(libusb_device_handle *devh, int freq, int scale)
                {   1, FREQ_SCALE_KHZ, 64,  5,  5 },
                { 500, FREQ_SCALE_HZ,  64, 10,  5 },
                { 100, FREQ_SCALE_HZ,  68,  5,  8 },
-               {   0, 0,              0,   0,  0 }
+               ALL_ZERO
        };
 
        int i;
@@ -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);
 
@@ -519,6 +521,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 +566,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;
 }