/* DMA CS Control and Status bits */
#define DMA_CHANNEL_RESET (1<<31)
+#define DMA_CHANNEL_ABORT (1<<30)
#define DMA_WAIT_ON_WRITES (1<<28)
#define DMA_PANIC_PRIORITY(x) ((x)<<20)
#define DMA_PRIORITY(x) ((x)<<16)
#define DMA_INTERRUPT_STATUS (1<< 2)
#define DMA_END_FLAG (1<< 1)
-#define DMA_ACTIVATE (1<< 0)
+#define DMA_ACTIVE (1<< 0)
/* DMA control block "info" field bits */
#define DMA_NO_WIDE_BURSTS (1<<26)
myGpioDelay(2000);
}
+static void initKillDMA(volatile uint32_t *dmaAddr)
+{
+ dmaAddr[DMA_CS] = DMA_CHANNEL_ABORT;
+ dmaAddr[DMA_CS] = 0;
+ dmaAddr[DMA_CS] = DMA_CHANNEL_RESET;
+
+ dmaAddr[DMA_CONBLK_AD] = 0;
+}
+
/* ----------------------------------------------------------------------- */
static void initDMAgo(volatile uint32_t *dmaAddr, uint32_t cbAddr)
{
DBG(DBG_STARTUP, "");
- dmaAddr[DMA_CS] = DMA_CHANNEL_RESET;
+ initKillDMA(dmaAddr);
dmaAddr[DMA_CS] = DMA_INTERRUPT_STATUS | DMA_END_FLAG;
dmaAddr[DMA_CS] = DMA_WAIT_ON_WRITES |
DMA_PANIC_PRIORITY(8) |
DMA_PRIORITY(8) |
- DMA_ACTIVATE;
+ DMA_ACTIVE;
}
/* ----------------------------------------------------------------------- */
/* reset DMA */
- if (dmaReg != MAP_FAILED) dmaIn[DMA_CS] = DMA_CHANNEL_RESET;
- if (dmaReg != MAP_FAILED) dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
+ if (dmaReg != MAP_FAILED)
+ {
+ initKillDMA(dmaIn);
+ initKillDMA(dmaOut);
+ }
#ifndef EMBEDDED_IN_VM
if ((gpioCfg.internals & PI_CFG_STATS) &&
PWMClockInited = 0;
}
- if (wave_mode < PI_WAVE_MODE_ONE_SHOT_SYNC)
- {
- dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
- dmaOut[DMA_CONBLK_AD] = 0;
- }
+ if (wave_mode < PI_WAVE_MODE_ONE_SHOT_SYNC) initKillDMA(dmaOut);
p = rawWaveCBAdr(waveInfo[wave_id].topCB);
PWMClockInited = 0;
}
- dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
- dmaOut[DMA_CONBLK_AD] = 0;
+ initKillDMA(dmaOut);
+
waveEndPtr = NULL;
endPtr = NULL;
CHECK_INITED;
- dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
- dmaOut[DMA_CONBLK_AD] = 0;
+ initKillDMA(dmaOut);
waveEndPtr = NULL;
CHECK(1, 1, v, 0, 0, "set mode, get mode");
gpioSetPullUpDown(GPIO, PI_PUD_UP);
+ gpioDelay(1); /* 1 micro delay to let GPIO reach level reliably */
v = gpioRead(GPIO);
CHECK(1, 2, v, 1, 0, "set pull up down, read");
gpioSetPullUpDown(GPIO, PI_PUD_DOWN);
+ gpioDelay(1); /* 1 micro delay to let GPIO reach level reliably */
v = gpioRead(GPIO);
CHECK(1, 3, v, 0, 0, "set pull up down, read");