X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fzeroplus-logic-cube%2Fanalyzer.c;h=0617d227467e840548a93c823678c89c0c199ca1;hb=44f0adb65cfec90c0cbc6292ada335a5b80d533d;hp=aa5643ab7e80626dbc43340b5e2aa02e259899d4;hpb=1b4aedc06f4ea5e63c604bf37e5c95c592fab73a;p=libsigrok.git diff --git a/src/hardware/zeroplus-logic-cube/analyzer.c b/src/hardware/zeroplus-logic-cube/analyzer.c index aa5643ab..0617d227 100644 --- a/src/hardware/zeroplus-logic-cube/analyzer.c +++ b/src/hardware/zeroplus-logic-cube/analyzer.c @@ -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; }