V29
authorjoan <joan@abyz.me.uk>
Sat, 14 Feb 2015 21:34:20 +0000 (21:34 +0000)
committerjoan <joan@abyz.me.uk>
Sat, 14 Feb 2015 21:34:20 +0000 (21:34 +0000)
pigpio.c
pigpio.h
x_pigs
x_pipe

index 8ccae64e99cbf5fce99b1be96a292bcdc896a0d6..b3da40795e3ad6f742a08b846218da38b61e0807 100644 (file)
--- a/pigpio.c
+++ b/pigpio.c
@@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 For more information, please refer to <http://unlicense.org/>
 */
 
-/* pigpio version 28 */
+/* pigpio version 29 */
 
 #include <stdio.h>
 #include <string.h>
@@ -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,
index d47e5c0bbfb371e786858a012e01bd126977e6cf..53c6b0691dd0eaed55d9b4e1a7b9bdafae2fc9df 100644 (file)
--- a/pigpio.h
+++ b/pigpio.h
@@ -31,7 +31,7 @@ For more information, please refer to <http://unlicense.org/>
 #include <stdint.h>
 #include <pthread.h>
 
-#define PIGPIO_VERSION 28
+#define PIGPIO_VERSION 29
 
 /*TEXT
 
diff --git a/x_pigs b/x_pigs
index cd312143d45be885d2a15de8012332b89adfb51b..f4242fb5b4309ccb8bde2f227f72649d23f4912e 100755 (executable)
--- 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 cfb4e86f6e7f261b6da87c6894a654164f41b206..f83a3e9cf1a8775e8c1ed5a50f84a4a28704012c 100755 (executable)
--- a/x_pipe
+++ b/x_pipe
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-VERSION=28
+VERSION=29
 
 GPIO=4