Add support for initial pin settings.
authorUwe Hermann <uwe@hermann-uwe.de>
Mon, 5 Jun 2017 22:09:45 +0000 (00:09 +0200)
committerUwe Hermann <uwe@hermann-uwe.de>
Mon, 5 Jun 2017 23:43:44 +0000 (01:43 +0200)
Adapt all tests that require it to use the old behaviour of assuming an
initial pin value of 0 (or whatever was previously hardcoded in the PD).
for now (this will likely see some changes later).

decoder/pdtest
decoder/runtc.c
decoder/test/ds1307/test.conf
decoder/test/i2c/test.conf
decoder/test/jitter/test.conf
decoder/test/parallel/test.conf
decoder/test/spdif/test.conf
decoder/test/swd/test.conf

index 1cc071f65c438682b39d00407afb165af597a3fd..e3509b967176730588183ac9c8388675c96bdb36 100755 (executable)
@@ -113,6 +113,7 @@ def parse_testfile(path, pd, tc, op_type, op_class):
                     'name': f.pop(0),
                     'channels': [],
                     'options': [],
+                    'initial_pins': [],
                 }
                 while len(f):
                     if len(f) == 1:
@@ -131,6 +132,12 @@ def parse_testfile(path, pd, tc, op_type, op_class):
                         pd_spec['channels'].append([opt, val])
                     elif a == 'option':
                         pd_spec['options'].append([opt, val])
+                    elif a == 'initial_pin':
+                        try:
+                            val = int(val)
+                        except:
+                            raise E_syntax
+                        pd_spec['initial_pins'].append([opt, val])
                     else:
                         raise E_syntax
                 tclist[-1]['pdlist'].append(pd_spec)
@@ -319,6 +326,8 @@ def run_tests(tests, fix=False):
                         args.extend(['-p', "%s=%d" % (label, channel)])
                     for option, value in spd['options']:
                         args.extend(['-o', "%s=%s" % (option, value)])
+                    for label, initial_pin in spd['initial_pins']:
+                        args.extend(['-N', "%s=%d" % (label, initial_pin)])
                 args.extend(['-i', os.path.join(dumps_dir, tc['input'])])
                 for op in tc['output']:
                     name = "%s/%s/%s" % (pd, tc['name'], op['type'])
@@ -486,6 +495,8 @@ def show_tests(tests):
                         print("    Channel %s=%d" % (label, channel))
                     for option, value in pd['options']:
                         print("    Option %s=%s" % (option, value))
+                    for label, initial_pin in pd['initial_pins']:
+                        print("    Initial pin %s=%d" % (label, initial_pin))
                 if 'stack' in tc:
                     print("  Stack: %s" % ' '.join(tc['stack']))
                 print("  Input: %s" % tc['input'])
index c31b7d3d1ddea03dda8e1c7c965013d6f800b3f6..ec8c812f745b031985eb392ed62ee02fe47e3216 100644 (file)
@@ -52,10 +52,16 @@ struct option {
        GVariant *value;
 };
 
+struct initial_pin_info {
+       char *name;
+       int value;
+};
+
 struct pd {
        const char *name;
        GSList *channels;
        GSList *options;
+       GSList *initial_pins;
 };
 
 struct output {
@@ -142,6 +148,7 @@ static void usage(const char *msg)
        printf("  -P <protocol decoder>\n");
        printf("  -p <channelname=channelnum> (optional)\n");
        printf("  -o <channeloption=value> (optional)\n");
+       printf("  -N <channelname=initial-pin-value> (optional)\n");
        printf("  -i <input file>\n");
        printf("  -O <output-pd:output-type[:output-class]>\n");
        printf("  -f <output file> (optional)\n");
@@ -375,13 +382,15 @@ static int run_testcase(const char *infile, GSList *pdlist, struct output *op)
        struct option *option;
        GVariant *gvar;
        GHashTable *channels, *opts;
-       GSList *pdl, *l, *devices;
+       GSList *pdl, *l, *l2, *devices;
        int idx, i;
        int max_channel;
        char **decoder_class;
        struct sr_session *sr_sess;
        gboolean is_number;
        const char *s;
+       GArray *initial_pins;
+       struct initial_pin_info *initial_pin;
 
        if (op->outfile) {
                if ((op->outfd = open(op->outfile, O_CREAT|O_WRONLY, 0600)) == -1) {
@@ -477,6 +486,28 @@ static int run_testcase(const char *infile, GSList *pdlist, struct output *op)
                        g_hash_table_destroy(channels);
                }
 
+               /* Set initial pins. */
+               if (pd->initial_pins) {
+                       initial_pins = g_array_sized_new(FALSE, TRUE, sizeof(uint8_t),
+                                               di->dec_num_channels);
+                       g_array_set_size(initial_pins, di->dec_num_channels);
+                       memset(initial_pins->data, SRD_INITIAL_PIN_SAME_AS_SAMPLE0,
+                               di->dec_num_channels);
+
+                       for (l = pd->channels, idx = 0; l; l = l->next, idx++) {
+                               channel = l->data;
+                               for (l2 = pd->initial_pins; l2; l2 = l2->next) {
+                                       initial_pin = l2->data;
+                                       if (!strcmp(initial_pin->name, channel->name))
+                                               initial_pins->data[idx] = initial_pin->value;
+                               }
+                       }
+
+                       if (srd_inst_initial_pins_set_all(di, initial_pins) != SRD_OK)
+                               return FALSE;
+                       g_array_free(initial_pins, TRUE);
+               }
+
                /*
                 * If this is not the first decoder in the list, stack it
                 * on top of the previous one.
@@ -768,6 +799,7 @@ int main(int argc, char **argv)
        struct output *op;
        int ret, c;
        char *opt_infile, **kv, **opstr;
+       struct initial_pin_info *initial_pin;
 
        op = malloc(sizeof(struct output));
        op->pd = NULL;
@@ -781,7 +813,7 @@ int main(int argc, char **argv)
        opt_infile = NULL;
        pd = NULL;
        coverage = NULL;
-       while ((c = getopt(argc, argv, "dP:p:o:i:O:f:c:S")) != -1) {
+       while ((c = getopt(argc, argv, "dP:p:o:N:i:O:f:c:S")) != -1) {
                switch (c) {
                case 'd':
                        debug = TRUE;
@@ -789,11 +821,12 @@ int main(int argc, char **argv)
                case 'P':
                        pd = g_malloc(sizeof(struct pd));
                        pd->name = g_strdup(optarg);
-                       pd->channels = pd->options = NULL;
+                       pd->channels = pd->options = pd->initial_pins = NULL;
                        pdlist = g_slist_append(pdlist, pd);
                        break;
                case 'p':
                case 'o':
+               case 'N':
                        if (g_slist_length(pdlist) == 0) {
                                /* No previous -P. */
                                ERR("Syntax error at '%s'", optarg);
@@ -812,13 +845,19 @@ int main(int argc, char **argv)
                                channel->channel = strtoul(kv[1], NULL, 10);
                                /* Apply to last PD. */
                                pd->channels = g_slist_append(pd->channels, channel);
-                       } else {
+                       } else if (c == 'o') {
                                option = malloc(sizeof(struct option));
                                option->key = g_strdup(kv[0]);
                                option->value = g_variant_new_string(kv[1]);
                                g_variant_ref_sink(option->value);
                                /* Apply to last PD. */
                                pd->options = g_slist_append(pd->options, option);
+                       } else {
+                               initial_pin = malloc(sizeof(struct initial_pin_info));
+                               initial_pin->name = g_strdup(kv[0]);
+                               initial_pin->value = strtoul(kv[1], NULL, 10);
+                               /* Apply to last PD. */
+                               pd->initial_pins = g_slist_append(pd->initial_pins, initial_pin);
                        }
                        break;
                case 'i':
index 8bf06501a9e3a9797c58a4340a25ad0146548e3a..052ed5d9c63a0ee64c8a778ee2ffaee0ff8bb24c 100644 (file)
@@ -1,5 +1,5 @@
 test rtc_ds1307_200khz
-       protocol-decoder i2c channel scl=0 channel sda=1
+       protocol-decoder i2c channel scl=0 channel sda=1 initial_pin scl=1 initial_pin sda=1
        protocol-decoder ds1307
        stack i2c ds1307
        input i2c/rtc_dallas_ds1307/rtc_ds1307_200khz.sr
index ed5535fd0bada31abf21639052a4e29317e75211..c9e7e5e7c1533f75c241b60df59b6ed1267a310c 100644 (file)
@@ -1,5 +1,5 @@
 test rtc
-       protocol-decoder i2c channel scl=0 channel sda=1
+       protocol-decoder i2c channel scl=0 channel sda=1 initial_pin scl=1 initial_pin sda=1
        input i2c/rtc_dallas_ds1307/rtc_ds1307_200khz.sr
        output i2c annotation class data-read match rtc_ds1307_200khz_data_read.output
        output i2c annotation class data-write match rtc_ds1307_200khz_data_write.output
index 102938d557c3311975ee0786ca3322a5f581fbf2..e61cb6265762079244224adc11b0e5dd60d735f3 100644 (file)
@@ -1,5 +1,5 @@
 test toim4243
-       protocol-decoder jitter channel clk=3 channel sig=2 option clk_polarity=falling option sig_polarity=falling
+       protocol-decoder jitter channel clk=3 channel sig=2 option clk_polarity=falling option sig_polarity=falling initial_pin clk=0
        input uart/toim4243/toim4243_10byte_send_snippet.sr
        output jitter annotation match toim4243.output
        output jitter binary class ascii-float match toim4243.bin_ascii_float
index b6dd18c6f93e4575f7115f5942fc8025a05281c4..cf59c30220a5babc49850bcc12ac9066cbd927fa 100644 (file)
@@ -1,5 +1,5 @@
 test incremental_8ch_short_noclock
-       protocol-decoder parallel channel d0=0 channel d1=1 channel d2=2 channel d3=3 channel d4=4 channel d5=5 channel d6=6 channel d7=7
+       protocol-decoder parallel channel d0=0 channel d1=1 channel d2=2 channel d3=3 channel d4=4 channel d5=5 channel d6=6 channel d7=7 initial_pin d0=0 initial_pin d1=1 initial_pin d2=2
        input misc/demo/incremental_8ch_short.sr
        output parallel annotation match incremental_8ch_short_noclock.output
        output parallel python match incremental_8ch_short_noclock.python
@@ -11,7 +11,7 @@ test incremental_8ch_short_clock
        output parallel python match incremental_8ch_short_clock.python
 
 test incremental_8ch_long_noclock
-       protocol-decoder parallel channel d0=0 channel d1=1 channel d2=2 channel d3=3 channel d4=4 channel d5=5 channel d6=6 channel d7=7
+       protocol-decoder parallel channel d0=0 channel d1=1 channel d2=2 channel d3=3 channel d4=4 channel d5=5 channel d6=6 channel d7=7 initial_pin d0=0 initial_pin d1=1 initial_pin d2=2
        input misc/demo/incremental_8ch_long.sr
        output parallel annotation match incremental_8ch_long_noclock.output
        output parallel python match incremental_8ch_long_noclock.python
index cb63b0d2ece1fb094ebe8a7aca141f1f18f4bdcf..539f56537a05212733675155d3cb510fcae7722d 100644 (file)
@@ -4,6 +4,6 @@ test exception_samplerate
        output spdif exception match SamplerateError
 
 test 2ch-16bit-48khz
-       protocol-decoder spdif channel data=0
+       protocol-decoder spdif channel data=0 initial_pin data=0
        input spdif/2ch-16bit-48khz/2ch-16bit-48khz.sr
        output spdif annotation match 2ch-16bit-48khz.output
index 95140bd416a5d633cda068967855bfbea60d41bb..519a07176b6e4d5b97b0d193849282f0f95bb088 100644 (file)
@@ -1,29 +1,29 @@
 test ftdi_openocd_init_write_0xabbabeeb
-       protocol-decoder swd channel swclk=0 channel swdio=1
+       protocol-decoder swd channel swclk=0 channel swdio=1 initial_pin swclk=0 initial_pin swdio=0
        input swd/ftdi_openocd/init_write_0xabbabeeb.sr
        output swd annotation match ftdi_openocd/init_write_0xabbabeeb.output
        output swd python match ftdi_openocd/init_write_0xabbabeeb.python
 
 test ftdi_openocd_init_noreply
-       protocol-decoder swd channel swclk=0 channel swdio=1
+       protocol-decoder swd channel swclk=0 channel swdio=1 initial_pin swclk=0 initial_pin swdio=0
        input swd/ftdi_openocd/init_noreply.sr
        output swd annotation match ftdi_openocd/init_noreply.output
        output swd python match ftdi_openocd/init_noreply.python
 
 test ftdi_openocd_init_wait_fault
-       protocol-decoder swd channel swclk=0 channel swdio=1
+       protocol-decoder swd channel swclk=0 channel swdio=1 initial_pin swclk=0 initial_pin swdio=0
        input swd/ftdi_openocd/init_wait_fault.sr
        output swd annotation match ftdi_openocd/init_wait_fault.output
        output swd python match ftdi_openocd/init_wait_fault.python
 
 test stlink_init_write_0xabbabeeb
-       protocol-decoder swd channel swclk=0 channel swdio=1
+       protocol-decoder swd channel swclk=0 channel swdio=1 initial_pin swclk=0 initial_pin swdio=0
        input swd/stlink_openocd/init_write_0xabbabeeb.sr
        output swd annotation match stlink_openocd/init_write_0xabbabeeb.output
        output swd python match stlink_openocd/init_write_0xabbabeeb.python
 
 test stlink_wait_retry
-       protocol-decoder swd channel swclk=0 channel swdio=1
+       protocol-decoder swd channel swclk=0 channel swdio=1 initial_pin swclk=0 initial_pin swdio=0
        input swd/stlink_openocd/wait_retry.sr
        output swd annotation match stlink_openocd/wait_retry.output
        output swd python match stlink_openocd/wait_retry.python
@@ -31,7 +31,7 @@ test stlink_wait_retry
 # With the strict_start option set, this capture doesn't include a LINERESET
 # so output is empty.
 test stlink_wait_retry
-       protocol-decoder swd channel swclk=0 channel swdio=1 option strict_start=yes
+       protocol-decoder swd channel swclk=0 channel swdio=1 option strict_start=yes initial_pin swclk=0 initial_pin swdio=0
        input swd/stlink_openocd/wait_retry.sr
        output swd annotation match stlink_openocd/empty.output
        output swd python match stlink_openocd/empty.python