]> sigrok.org Git - libsigrok.git/commitdiff
kingst-la2016: adjust register layout in acquisition configuration
authorGerhard Sittig <redacted>
Sun, 23 Jan 2022 16:03:11 +0000 (17:03 +0100)
committerGerhard Sittig <redacted>
Sun, 6 Feb 2022 17:53:53 +0000 (18:53 +0100)
The FPGA register space to configure acquisition parameters is unusual
in the sense that some 34bit values are kept in 40bit registers, while
other 32bit values are kept in 24bit registers (stores MSB only). This
answers the question how to communicate a limit of 10 billion samples
in a 32bit register (a doubt about the previous implementation). :)

Reported-By: Kevin Grant <redacted> in github PR 169
src/hardware/kingst-la2016/protocol.c

index 808ac820def99219b025e3d560f44c2e065742ef..8602147badc8655c8f01c5b5cce15219d479c976 100644 (file)
@@ -636,18 +636,28 @@ static int set_sample_config(const struct sr_dev_inst *sdi)
        pre_trigger_memory = LA2016_PRE_MEM_LIMIT_BASE;
        pre_trigger_memory *= devc->capture_ratio;
        pre_trigger_memory /= 100;
-       pre_trigger_memory &= 0xffffff00ul; /* Funny register layout. */
 
        sr_dbg("Set sample config: %" PRIu64 "kHz, %" PRIu64 " samples.",
                devc->cur_samplerate / 1000, devc->limit_samples);
        sr_dbg("Capture ratio %" PRIu64 "%%, count %" PRIu64 ", mem %" PRIu64 ".",
                devc->capture_ratio, pre_trigger_samples, pre_trigger_memory);
 
+       /*
+        * The acquisition configuration occupies a total of 16 bytes:
+        * - A 34bit total samples count limit (up to 10 billions) that
+        *   is kept in a 40bit register.
+        * - A 34bit pre-trigger samples count limit (up to 10 billions)
+        *   in another 40bit register.
+        * - A 32bit pre-trigger memory space limit (in bytes) of which
+        *   the upper 24bits are kept in an FPGA register.
+        * - A 16bit clock divider which gets applied to the maximum
+        *   samplerate of the device.
+        * - An 8bit register of unknown meaning. Currently always 0.
+        */
        wrptr = buf;
-       write_u32le_inc(&wrptr, devc->limit_samples);
-       write_u8_inc(&wrptr, 0);
-       write_u32le_inc(&wrptr, pre_trigger_samples);
-       write_u32le_inc(&wrptr, pre_trigger_memory);
+       write_u40le_inc(&wrptr, devc->limit_samples);
+       write_u40le_inc(&wrptr, pre_trigger_samples);
+       write_u24le_inc(&wrptr, pre_trigger_memory >> 8);
        write_u16le_inc(&wrptr, divider_u16);
        write_u8_inc(&wrptr, 0);
        ret = ctrl_out(sdi, CMD_FPGA_SPI, REG_SAMPLING, 0, buf, wrptr - buf);