* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <eputils.h>
#include <fx2regs.h>
#include <fx2macros.h>
#include <delay.h>
#include <fx2lafw.h>
#include <gpif-acquisition.h>
+bit gpif_acquiring;
+
static void gpif_reset_waveforms(void)
{
int i;
/* Initialize flowstate registers (not used by us). */
gpif_init_flowstates();
+
+ /* Reset the status */
+ gpif_acquiring = FALSE;
}
void gpif_acquisition_start(const struct cmd_start_acquisition *cmd)
/* Populate S0 */
pSTATE = &GPIF_WAVE_DATA;
+
+ /* DELAY
+ * Delay cmd->sample_delay clocks.
+ */
pSTATE[0] = cmd->sample_delay;
+
+ /* OPCODE
+ * SGL=0, GIN=0, INCAD=0, NEXT=0, DATA=1, DP=0
+ * Collect data in this state.
+ */
pSTATE[8] = 0x02;
+
+ /* OUTPUT
+ * OE[0:3]=0, CTL[0:3]=0
+ */
pSTATE[16] = 0x00;
+
+ /* LOGIC FUNCTION
+ * Not used
+ */
pSTATE[24] = 0x00;
- /* Populate S1 */
+ /* Populate S1 - the decision point */
pSTATE = &GPIF_WAVE_DATA + 1;
- pSTATE[0] = 0x00;
- pSTATE[8] = 0x01;
+
+ /* BRANCH
+ * Branch to IDLE if condition is true, back to S0 otherwise
+ */
+ pSTATE[0] = (7 << 3) | (0 << 0);
+
+ /* OPCODE
+ * SGL=0, GIN=0, INCAD=0, NEXT=0, DATA=0, DP=1
+ */
+ pSTATE[8] = (1 << 0);
+
+ /* OUTPUT
+ * OE[0:3]=0, CTL[0:3]=0
+ */
pSTATE[16] = 0x00;
- pSTATE[24] = 0x36;
- SYNCDELAY();
+ /* LOGIC FUNCTION
+ * Evaluate if the FIFO full flag is set.
+ * LFUNC=0 (AND), TERMA=6 (FIFO Flag), TERMB=6 (FIFO Flag)
+ */
+ pSTATE[24] = (6 << 3) | (6 << 0);
/* Execute the whole GPIF waveform once */
gpif_set_tc16(1);
/* Perform the initial GPIF read. */
gpif_fifo_read(GPIF_EP2);
+
+ /* Update the status */
+ gpif_acquiring = TRUE;
+}
+
+void gpif_poll(void)
+{
+ /* Detect if acquisition has completed */
+ if(gpif_acquiring && (GPIFTRIG & 0x80))
+ {
+ /* Activate NAK-ALL to avoid race conditions */
+ FIFORESET = 0x80;
+ SYNCDELAY();
+
+ /* Switch to manual mode */
+ EP2FIFOCFG = 0;
+ SYNCDELAY();
+
+ /* Reset EP2 */
+ FIFORESET = 0x02;
+ SYNCDELAY();
+
+ /* Return to auto mode */
+ EP2FIFOCFG = bmAUTOIN;
+ SYNCDELAY();
+
+ /* Release NAK-ALL */
+ FIFORESET = 0x00;
+ SYNCDELAY();
+
+ gpif_acquiring = FALSE;
+ }
}