* 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;
/* Contains RDY* pin values. Read-only according to TRM. */
GPIFREADYSTAT = 0;
+
+ /* Make GPIF stop on transcation count not flag */
+ EP2GPIFPFSTOP = (0 << 0);
}
static void gpif_init_addr_pins(void)
/* Initialize flowstate registers (not used by us). */
gpif_init_flowstates();
+
+ /* Reset the status */
+ gpif_acquiring = FALSE;
}
-void gpif_acquisition_start(void)
+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
/* Populate S0 */
pSTATE = &GPIF_WAVE_DATA;
- pSTATE[0] = 0x01;
+
+ /* 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;
- pSTATE[16] = 0x00;
- pSTATE[24] = 0x36;
- /* Populate Reserved Words */
- pSTATE = &GPIF_WAVE_DATA + 7;
- pSTATE[0] = 0x07;
- pSTATE[8] = 0x00;
+ /* 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] = 0x3f;
- 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;
+ }
}