diff --git a/pigpio.c b/pigpio.c index 8ccae64..b3da407 100644 --- a/pigpio.c +++ b/pigpio.c @@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to */ -/* pigpio version 28 */ +/* pigpio version 29 */ #include #include @@ -285,8 +285,6 @@ bit 0 READ_LAST_NOT_SET_ERROR #define PI_PERI_PHYS 0x7E000000 -static void *dummy = MAP_FAILED; - static volatile uint32_t piModel = 1; static volatile uint32_t PI_PERI_BASE = 0x20000000; @@ -742,6 +740,8 @@ static volatile uint32_t DMA_BUS_CACHE = 0x00000000; #define PI_MASH_MAX_FREQ 23800000 +#define FLUSH_PAGES 1024 + /* --------------------------------------------------------------- */ typedef void (*callbk_t) (); @@ -901,7 +901,6 @@ typedef struct uint32_t maxSamples; uint32_t numSamples; uint32_t DMARestarts; - uint32_t DMAInits; uint32_t dmaInitCbsCount; } gpioStats_t; @@ -1209,7 +1208,6 @@ static int gpioNotifyOpenInBand(int fd); static void initHWClk (int clkCtl, int clkDiv, int clkSrc, int divI, int divF, int MASH); static void initDMAgo(volatile uint32_t *dmaAddr, uint32_t cbAddr); -static void flushDMA(void); /* ======================================================================= */ @@ -1392,6 +1390,41 @@ static int myPermit(unsigned gpio) return 0; } +static void flushMemory(void) +{ + static int val = 0; + + void *dummy; + + dummy = mmap( + 0, (FLUSH_PAGES*PAGE_SIZE), + PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_SHARED|MAP_ANONYMOUS|MAP_NORESERVE|MAP_LOCKED, + -1, 0); + + if (dummy == MAP_FAILED) + { + DBG(DBG_STARTUP, "mmap dummy failed (%m)"); + } + else + { + memset(dummy, val++, (FLUSH_PAGES*PAGE_SIZE)); + memset(dummy, val++, (FLUSH_PAGES*PAGE_SIZE)); + munmap(dummy, FLUSH_PAGES*PAGE_SIZE); + } +} + +/* ----------------------------------------------------------------------- */ + +static void waitForDMAstarted(void) +{ + while (!DMAstarted) + { + if (piModel == 1) myGpioDelay(1000); + else flushMemory(); + } +} + /* ----------------------------------------------------------------------- */ static int myDoCommand(uint32_t *p, unsigned bufSize, char *buf) @@ -4408,9 +4441,7 @@ static void * pthAlertThread(void *x) /* don't start until DMA started */ - while (!DMAstarted) myGpioDelay(1000); - - myGpioDelay(20000); /* let DMA run for a while */ + waitForDMAstarted(); reportedLevel = gpioReg[GPLEV0]; @@ -4432,7 +4463,7 @@ static void * pthAlertThread(void *x) { if (stopped) { - DBG(1, "****** GOING ******"); + DBG(DBG_STARTUP, "****** GOING ******"); stopped = 0; } } @@ -4440,16 +4471,21 @@ static void * pthAlertThread(void *x) { if (!stopped) { - DBG(1, "****** STOPPED ******"); + DBG(DBG_STARTUP, "****** STOPPED ******"); stopped = 1; } - dmaInitCbs(); - flushDMA(); - myGpioDelay(5000); /* let DMA run for a while */ - initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]); - myGpioDelay(5000); /* let DMA run for a while */ - oldSlot = 0; - gpioStats.DMARestarts++; + + myGpioDelay(5000); + + if (DMAstarted) + { + dmaInitCbs(); + flushMemory(); + initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]); + myGpioDelay(5000); /* let DMA run for a while */ + oldSlot = dmaCurrentSlot(dmaNowAtICB()); + gpioStats.DMARestarts++; + } } gpioStats.alertTicks++; @@ -5206,10 +5242,7 @@ static void * pthFifoThread(void *x) /* don't start until DMA started */ - while (!DMAstarted) myGpioDelay(1000); - - myGpioDelay(20000); /* let DMA run for a while */ - + waitForDMAstarted(); while (1) { @@ -5434,9 +5467,7 @@ static void * pthSocketThread(void *x) /* don't start until DMA started */ - while (!DMAstarted) myGpioDelay(1000); - - myGpioDelay(20000); /* let DMA run for a while */ + waitForDMAstarted(); while ((fdC = accept(fdSock, (struct sockaddr *)&client, (socklen_t*)&c))) @@ -5672,6 +5703,10 @@ static int initDMAblock(int pagemapFd, int block) memset((void *)dmaBloc[block], 0, (PAGES_PER_BLOCK*PAGE_SIZE)); + memset((void *)dmaBloc[block], 0xFF, (PAGES_PER_BLOCK*PAGE_SIZE)); + + memset((void *)dmaBloc[block], 0, (PAGES_PER_BLOCK*PAGE_SIZE)); + pageNum = block * PAGES_PER_BLOCK; dmaVirt[pageNum] = mmap( @@ -5705,32 +5740,6 @@ static int initDMAblock(int pagemapFd, int block) return 0; } -#define FLUSH_PAGES 1000 - -static void flushDMA(void) -{ - static int val = 0; - - if (dummy != MAP_FAILED) munmap(dummy, FLUSH_PAGES*PAGE_SIZE); - - dummy = MAP_FAILED; - - dummy = mmap( - 0, (FLUSH_PAGES*PAGE_SIZE), - PROT_READ|PROT_WRITE|PROT_EXEC, - MAP_SHARED|MAP_ANONYMOUS|MAP_NORESERVE|MAP_LOCKED, - -1, 0); - - if (dummy == MAP_FAILED) - { - DBG(0, "mmap dummy failed (%m)"); - } - else - { - memset(dummy, val++, (FLUSH_PAGES*PAGE_SIZE)); - } -} - /* ----------------------------------------------------------------------- */ static int initDMAcbs(void) @@ -5985,7 +5994,6 @@ static void initClock(int mainClock) clkSrc = CLK_CTL_SRC_PLLD; clkDivI = 50 * micros; /* 10 MHz - 1 MHz */ - //if (!mainClock) clkDivI = 40 * micros; clkBits = BITS; /* 10/BITS MHz - 1/BITS MHz */ clkDivF = 0; clkMash = 0; @@ -6467,81 +6475,6 @@ void rawDumpScript(unsigned script_id) /* ======================================================================= */ -void startPi1DMA(void) -{ - dmaInitCbs(); - - flushDMA(); - - initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]); - - gpioStats.DMAInits++; -} - -void startPi2DMA(void) -{ - int i, running, looped, firstCB, passedFirst; - - for (i=0; i<150; i++) - { - dmaInitCbs(); - - flushDMA(); - } - - running = 0; - - while (!running) - { - dmaInitCbs(); - flushDMA(); - - initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]); - - gpioStats.DMAInits++; - - myGpioDelay(20000); - i = dmaNowAtICB(); - - if (i) - { - firstCB = i; - - passedFirst = 0; - - looped = 0; - - while (looped < 10) - { - dmaInitCbs(); - flushDMA(); - - myGpioDelay(1000); - i = dmaNowAtICB(); - - if (i < firstCB) - { - if (i) - { - if (passedFirst) - { - looped++; - running = 1; - passedFirst = 0; - } - } - else - { - running = 0; - looped = 1000; - } - } - else passedFirst = 1; - } - } - } -} - int gpioInitialise(void) { int i; @@ -6647,10 +6580,15 @@ int gpioInitialise(void) pthSocketRunning = 1; } - if (piModel == 1) - startPi1DMA(); - else - startPi2DMA(); + myGpioDelay(10000); + + dmaInitCbs(); + + flushMemory(); + + initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]); + + myGpioDelay(20000); DMAstarted = 1; @@ -6672,23 +6610,19 @@ void gpioTerminate(void) { /* reset DMA */ + DMAstarted = 0; + dmaIn[DMA_CS] = DMA_CHANNEL_RESET; dmaOut[DMA_CS] = DMA_CHANNEL_RESET; - /* reset PWM */ - - pwmReg[PWM_CTL] = 0; - libInitialised = 0; - DMAstarted = 0; - if (gpioCfg.showStats) { fprintf(stderr, - "micros=%d dmaInitCbs=%d DMA inits=%d DMA restarts=%d\n", + "micros=%d dmaInitCbs=%d DMA restarts=%d\n", gpioCfg.clockMicros, gpioStats.dmaInitCbsCount, - gpioStats.DMAInits, gpioStats.DMARestarts); + gpioStats.DMARestarts); fprintf(stderr, "samples %u maxSamples %u maxEmit %u emitFrags %u\n", gpioStats.numSamples, gpioStats.maxSamples, diff --git a/pigpio.h b/pigpio.h index d47e5c0..53c6b06 100644 --- a/pigpio.h +++ b/pigpio.h @@ -31,7 +31,7 @@ For more information, please refer to #include #include -#define PIGPIO_VERSION 28 +#define PIGPIO_VERSION 29 /*TEXT diff --git a/x_pigs b/x_pigs index cd31214..f4242fb 100755 --- a/x_pigs +++ b/x_pigs @@ -1,6 +1,6 @@ #!/bin/bash -VERSION=28 +VERSION=29 GPIO=4 @@ -197,7 +197,7 @@ s=$(pigs m $GPIO w) if [[ $s = "" ]]; then echo "SLR-d ok"; else echo "SLR-d fail ($s)"; fi s=$(pigs wvgo) if [[ $s = 191 ]]; then echo "SLR-e ok"; else echo "SLR-e fail ($s)"; fi -sleep 0.1 +sleep 0.2 s=$(pigs slr $GPIO 100) e="15 109 121 32 110 97 109 101 32 105 115 32 106 111 97 110" if [[ $s = $e ]] diff --git a/x_pipe b/x_pipe index cfb4e86..f83a3e9 100755 --- a/x_pipe +++ b/x_pipe @@ -1,6 +1,6 @@ #!/bin/bash -VERSION=28 +VERSION=29 GPIO=4