From: Paul Fertser Date: Fri, 15 Jul 2016 20:19:10 +0000 (+0300) Subject: Refactor and bugfix the delay adding code for analog capture X-Git-Tag: sigrok-firmware-fx2lafw-0.1.4~12 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=b93872aadb4d9aa576b9ce8d56dd2d0d8f953230;p=sigrok-firmware-fx2lafw.git Refactor and bugfix the delay adding code for analog capture 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 --- diff --git a/gpif-acquisition.c b/gpif-acquisition.c index 09a56ca8..dbf74036 100644 --- a/gpif-acquisition.c +++ b/gpif-acquisition.c @@ -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);