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>
+ /* 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) {
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
/* 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_2, 0x00);
- gpif_make_delay_state(pSTATE++, delay_1, 0x06);
- /* 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);
for (i = 0; i < cmd->sample_delay_h; i++)
gpif_make_delay_state(pSTATE++, 0, 0x00);