From: Joel Holdsworth Date: Thu, 19 Apr 2012 20:00:16 +0000 (+0100) Subject: Moved GPIF state generator code into helper functions X-Git-Tag: sigrok-firmware-fx2lafw-0.1.0~26 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=7dfad4cbb5d105ea49114d3134711a24bc2bf742;p=sigrok-firmware-fx2lafw.git Moved GPIF state generator code into helper functions --- diff --git a/gpif-acquisition.c b/gpif-acquisition.c index 0f9cfbe1..07825b42 100644 --- a/gpif-acquisition.c +++ b/gpif-acquisition.c @@ -132,48 +132,13 @@ void gpif_init_la(void) gpif_acquiring = FALSE; } -void gpif_acquisition_start(const struct cmd_start_acquisition *cmd) +static void gpif_make_delay_data_state(volatile BYTE *pSTATE, uint8_t delay) { - xdata volatile BYTE *pSTATE; - - /* Ensure GPIF is idle before reconfiguration. */ - while (!(GPIFTRIG & 0x80)); - - /* Set IFCONFIG to the correct clock source. */ - if (cmd->flags & CMD_START_FLAGS_CLK_48MHZ) { - IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE | bmASYNC | - bmGSTATE | bmIFGPIF; - } else { - IFCONFIG = bmIFCLKSRC | bmIFCLKOE | bmASYNC | - bmGSTATE | bmIFGPIF; - } - - /* GPIF terminology: DP = decision point, NDP = non-decision-point */ - - /* - * Populate WAVEDATA. - * - * This is the basic algorithm implemented in our GPIF state machine: - * - * State 0: NDP: Sample the FIFO data bus. - * State 1: DP: If EP2 is full, go to state 7 (the IDLE state), i.e., - * end the current waveform. Otherwise, go to state 0 again, - * i.e., sample data until EP2 is full. - * State 2: Unused. - * State 3: Unused. - * State 4: Unused. - * State 5: Unused. - * State 6: Unused. - */ - - /* Populate S0. */ - pSTATE = &GPIF_WAVE_DATA; - /* * DELAY * Delay cmd->sample_delay clocks. */ - pSTATE[0] = cmd->sample_delay; + pSTATE[0] = delay; /* * OPCODE @@ -193,10 +158,10 @@ void gpif_acquisition_start(const struct cmd_start_acquisition *cmd) * Not used. */ pSTATE[24] = 0x00; +} - /* Populate S1 - the decision point. */ - pSTATE = &GPIF_WAVE_DATA + 1; - +static void gpid_make_dp_state(volatile BYTE *pSTATE) +{ /* * BRANCH * Branch to IDLE if condition is true, back to S0 otherwise. @@ -221,6 +186,47 @@ void gpif_acquisition_start(const struct cmd_start_acquisition *cmd) * LFUNC=0 (AND), TERMA=6 (FIFO Flag), TERMB=6 (FIFO Flag) */ pSTATE[24] = (6 << 3) | (6 << 0); +} + +void gpif_acquisition_start(const struct cmd_start_acquisition *cmd) +{ + xdata volatile BYTE *pSTATE; + + /* Ensure GPIF is idle before reconfiguration. */ + while (!(GPIFTRIG & 0x80)); + + /* Set IFCONFIG to the correct clock source. */ + if (cmd->flags & CMD_START_FLAGS_CLK_48MHZ) { + IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE | bmASYNC | + bmGSTATE | bmIFGPIF; + } else { + IFCONFIG = bmIFCLKSRC | bmIFCLKOE | bmASYNC | + bmGSTATE | bmIFGPIF; + } + + /* GPIF terminology: DP = decision point, NDP = non-decision-point */ + + /* + * Populate WAVEDATA. + * + * This is the basic algorithm implemented in our GPIF state machine: + * + * State 0: NDP: Sample the FIFO data bus. + * State 1: DP: If EP2 is full, go to state 7 (the IDLE state), i.e., + * end the current waveform. Otherwise, go to state 0 again, + * i.e., sample data until EP2 is full. + * State 2: Unused. + * State 3: Unused. + * State 4: Unused. + * State 5: Unused. + * State 6: Unused. + */ + + /* Populate S0 */ + gpif_make_delay_data_state(&GPIF_WAVE_DATA, cmd->sample_delay); + + /* Populate S1 - the decision point. */ + gpid_make_dp_state(&GPIF_WAVE_DATA + 1); /* Execute the whole GPIF waveform once. */ gpif_set_tc16(1);