]> sigrok.org Git - sigrok-firmware-fx2lafw.git/commitdiff
Refactor and bugfix the delay adding code for analog capture
authorPaul Fertser <redacted>
Fri, 15 Jul 2016 20:19:10 +0000 (23:19 +0300)
committerUwe Hermann <redacted>
Wed, 10 Aug 2016 13:11:10 +0000 (15:11 +0200)
There're two essential modifications in this change:

1. Fix timing for capture frequencies less than 200 kHz;
2. Sample ADC output after CLK is set low, as per the TLC5510
datasheet.

The second point is also important as the capture state sets CLK low,
so with the previous code there might have been a very short glitch on
this line during capture. Not confirmed by measurements, but it's
cleaner this way.

Signed-off-by: Paul Fertser <redacted>
gpif-acquisition.c

index 09a56ca837a7890c11de42e71eaf546352e27b75..dbf740366f1a31d7003984ba2adaae653eb2983a 100644 (file)
@@ -212,27 +212,29 @@ bool gpif_acquisition_start(const struct cmd_start_acquisition *cmd)
                           bmGSTATE | bmIFGPIF;
        }
 
+       /* Populate delay states */
+       if ((cmd->sample_delay_h == 0 && cmd->sample_delay_l == 0) ||
+           cmd->sample_delay_h >= 6)
+               return false;
+
        if (cmd->flags & CMD_START_FLAGS_CLK_CTL2) {
-               uint8_t delay_1, delay_2;
+               uint8_t delay_1, delay_2 = cmd->sample_delay_l;
 
                /* We need a pulse where the CTL1 and CTL2 pins
-                * alternate states. */
-
-               /* Make the low pulse shorter then the high pulse. */
-               delay_2 = cmd->sample_delay_l >> 2;
-               /* Work around >12MHz case resulting in a 0 delay low pulse. */
-               if (delay_2 == 0)
-                       delay_2 = 1;
-               delay_1 = cmd->sample_delay_l - delay_2;
-
+                * alternate states */
+               if (cmd->sample_delay_h) {
+                       for (i = 0; i < cmd->sample_delay_h; i++)
+                               gpif_make_delay_state(pSTATE++, 0, 0x06);
+               } else {
+                       delay_1 = delay_2 / 2;
+                       delay_2 -= delay_1;
+                       gpif_make_delay_state(pSTATE++, delay_1, 0x06);
+               }
+
+               /* cmd->sample_delay_l is always non-zero for the
+                * supported rates */
                gpif_make_delay_state(pSTATE++, delay_2, 0x00);
-               gpif_make_delay_state(pSTATE++, delay_1, 0x06);
        } else {
-               /* Populate delay states. */
-               if ((cmd->sample_delay_h == 0 && cmd->sample_delay_l == 0) ||
-                       cmd->sample_delay_h >= 6)
-                       return false;
-
                for (i = 0; i < cmd->sample_delay_h; i++)
                        gpif_make_delay_state(pSTATE++, 0, 0x00);