diff --git a/pigpio.3 b/pigpio.3
index 25af5c9..1d0231c 100644
--- a/pigpio.3
+++ b/pigpio.3
@@ -2659,8 +2659,8 @@ handle: >=0, as returned by a call to \fBspiOpen\fP
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint spiWrite(unsigned handle, char *buf, unsigned count)\fP"
.IP "" 4
@@ -2684,8 +2684,8 @@ handle: >=0, as returned by a call to \fBspiOpen\fP
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint spiXfer(unsigned handle, char *txBuf, char *rxBuf, unsigned count)\fP"
.IP "" 4
@@ -2712,8 +2712,8 @@ handle: >=0, as returned by a call to \fBspiOpen\fP
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint serOpen(char *sertty, unsigned serBaud, unsigned serFlags)\fP"
.IP "" 4
@@ -4309,6 +4309,75 @@ The default setting (0) is that both interfaces are enabled.
Or in PI_DISABLE_FIFO_IF to disable the pipe interface.
Or in PI_DISABLE_SOCK_IF to disable the socket interface.
+.IP "\fBint gpioCustom1(unsigned arg1, unsigned arg2, char *argx, unsigned count)\fP"
+.IP "" 4
+This function is available for user customisation.
+
+.br
+
+.br
+It returns a single integer value.
+
+.br
+
+.br
+
+.EX
+ arg1: >=0
+.br
+ arg2: >=0
+.br
+ argx: extra (byte) arguments
+.br
+count: number of extra arguments
+.br
+
+.EE
+
+.br
+
+.br
+Returns >= 0 if OK, less than 0 indicates a user defined error.
+
+.IP "\fBint gpioCustom2(unsigned arg1, char *argx, unsigned count, char *retBuf, unsigned retMax)\fP"
+.IP "" 4
+This function is available for user customisation.
+
+.br
+
+.br
+It differs from gpioCustom1 in that it returns an array of bytes
+rather than just an integer.
+
+.br
+
+.br
+The returned value is an integer indicating the number of returned bytes.
+
+.EX
+ arg1: >=0
+.br
+ argx: extra (byte) arguments
+.br
+ count: number of extra arguments
+.br
+retBuf: buffer for returned bytes
+.br
+retMax: maximum number of bytes to return
+.br
+
+.EE
+
+.br
+
+.br
+Returns >= 0 if OK, less than 0 indicates a user defined error.
+
+.br
+
+.br
+The number of returned bytes must be retMax or less.
+
.IP "\fBint gpioCfgInternals(unsigned cfgWhat, int cfgVal)\fP"
.IP "" 4
Used to tune internal settings.
@@ -5643,7 +5712,7 @@ The hardware PWM dutycycle.
.br
.EX
-#define PI_HW_PWM_RANGE 1000
+#define PI_HW_PWM_RANGE 5000
.br
.EE
@@ -5662,7 +5731,7 @@ The hardware PWM frequency.
.EX
#define PI_HW_PWM_MIN_FREQ 5
.br
-#define PI_HW_PWM_MAX_FREQ 250000
+#define PI_HW_PWM_MAX_FREQ 50000
.br
.EE
@@ -6411,6 +6480,12 @@ A 16-bit word value.
#define PI_CMD_HP 86
.br
+.br
+#define PI_CMD_CF1 87
+.br
+#define PI_CMD_CF2 88
+.br
+
.br
#define PI_CMD_NOIB 99
.br
@@ -6617,9 +6692,9 @@ A 16-bit word value.
.br
#define PI_NOT_HPWM_GPIO -95 // gpio has no hardware PWM
.br
-#define PI_BAD_HPWM_FREQ -96 // hardware PWM frequency not 5-250K
+#define PI_BAD_HPWM_FREQ -96 // hardware PWM frequency not 5-50K
.br
-#define PI_BAD_HPWM_DUTY -97 // hardware PWM dutycycle not 0-1000
+#define PI_BAD_HPWM_DUTY -97 // hardware PWM dutycycle not 0-5000
.br
#define PI_BAD_HCLK_FREQ -98 // hardware clock frequency not 4689-25M
.br
@@ -6631,6 +6706,20 @@ A 16-bit word value.
.br
#define PI_BAD_STOPBITS -102 // serial (half) stop bits not 2-8
.br
+#define PI_MSG_TOOBIG -103 // socket/pipe message too big
+.br
+
+.br
+#define PI_PIGIF_ERR_0 -2000
+.br
+#define PI_PIGIF_ERR_99 -2099
+.br
+
+.br
+#define PI_CUSTOM_ERR_0 -3000
+.br
+#define PI_CUSTOM_ERR_999 -3999
+.br
.br
diff --git a/pigpio.c b/pigpio.c
index 803f2ea..8ccae64 100644
--- a/pigpio.c
+++ b/pigpio.c
@@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to
*/
-/* pigpio version 27 */
+/* pigpio version 28 */
#include
#include
@@ -283,9 +283,15 @@ bit 0 READ_LAST_NOT_SET_ERROR
} \
while (0)
-static volatile unsigned int piModel = 1;
-static volatile unsigned int PI_PERI_BASE = 0x20000000;
-static volatile unsigned int DMA_BUS_ADR = 0x40000000;
+#define PI_PERI_PHYS 0x7E000000
+
+static void *dummy = MAP_FAILED;
+
+static volatile uint32_t piModel = 1;
+
+static volatile uint32_t PI_PERI_BASE = 0x20000000;
+static volatile uint32_t DMA_BUS_ADR = 0x40000000;
+static volatile uint32_t DMA_BUS_CACHE = 0x00000000;
#define AUX_BASE (PI_PERI_BASE + 0x00215000)
#define CLK_BASE (PI_PERI_BASE + 0x00101000)
@@ -894,6 +900,9 @@ typedef struct
uint32_t emitFrags;
uint32_t maxSamples;
uint32_t numSamples;
+ uint32_t DMARestarts;
+ uint32_t DMAInits;
+ uint32_t dmaInitCbsCount;
} gpioStats_t;
typedef struct
@@ -1199,6 +1208,9 @@ static void intScriptBits(void);
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);
+
/* ======================================================================= */
@@ -1327,6 +1339,8 @@ static void myOffPageSlot(int pos, int * page, int * slot)
static void myLvsPageSlot(int pos, int * page, int * slot)
{
+// *page = pos%DMAI_PAGES;
+// *slot = pos/DMAI_PAGES;
*page = pos/LVS_PER_IPAGE;
*slot = pos%LVS_PER_IPAGE;
}
@@ -1335,6 +1349,8 @@ static void myLvsPageSlot(int pos, int * page, int * slot)
static void myTckPageSlot(int pos, int * page, int * slot)
{
+// *page = pos%DMAI_PAGES;
+// *slot = pos/DMAI_PAGES;
*page = pos/TCK_PER_IPAGE;
*slot = pos%TCK_PER_IPAGE;
}
@@ -2175,14 +2191,14 @@ static int wave2Cbs(unsigned wave_mode)
p->info = NORMAL_DMA |
DMA_DEST_DREQ |
DMA_PERIPHERAL_MAPPING(2);
- p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
else
{
p->info = NORMAL_DMA |
DMA_DEST_DREQ |
DMA_PERIPHERAL_MAPPING(5);
- p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
p->src = (uint32_t) (&dmaOPhys[0]->periphData) | DMA_BUS_ADR;
@@ -2203,7 +2219,7 @@ static int wave2Cbs(unsigned wave_mode)
p->info = NORMAL_DMA;
p->src = waveOOLPOadr(botOOL++) | DMA_BUS_ADR;
- p->dst = ((GPIO_BASE + (GPSET0*4)) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((GPIO_BASE + (GPSET0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->length = 4;
p->next = waveCbPOadr(botCB) | DMA_BUS_ADR;
}
@@ -2218,7 +2234,7 @@ static int wave2Cbs(unsigned wave_mode)
p->info = NORMAL_DMA;
p->src = waveOOLPOadr(botOOL++) | DMA_BUS_ADR;
- p->dst = ((GPIO_BASE + (GPCLR0*4)) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((GPIO_BASE + (GPCLR0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->length = 4;
p->next = waveCbPOadr(botCB) | DMA_BUS_ADR;
}
@@ -2230,7 +2246,7 @@ static int wave2Cbs(unsigned wave_mode)
p = rawWaveCBAdr(botCB++);
p->info = NORMAL_DMA;
- p->src = ((GPIO_BASE + (GPLEV0*4)) & 0x00ffffff) | 0x7e000000;
+ p->src = ((GPIO_BASE + (GPLEV0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->dst = waveOOLPOadr(--topOOL) | DMA_BUS_ADR;
p->length = 4;
p->next = waveCbPOadr(botCB) | DMA_BUS_ADR;
@@ -2243,7 +2259,7 @@ static int wave2Cbs(unsigned wave_mode)
p = rawWaveCBAdr(botCB++);
p->info = NORMAL_DMA;
- p->src = ((SYST_BASE + (SYST_CLO*4)) & 0x00ffffff) | 0x7e000000;
+ p->src = ((SYST_BASE + (SYST_CLO*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->dst = waveOOLPOadr(--topOOL) | DMA_BUS_ADR;
p->length = 4;
p->next = waveCbPOadr(botCB) | DMA_BUS_ADR;
@@ -2330,7 +2346,7 @@ static int wave2Cbs(unsigned wave_mode)
DMA_DEST_DREQ |
DMA_PERIPHERAL_MAPPING(2);
- p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
else
{
@@ -2338,7 +2354,7 @@ static int wave2Cbs(unsigned wave_mode)
DMA_DEST_DREQ |
DMA_PERIPHERAL_MAPPING(5);
- p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
p->src = (uint32_t) (&dmaOPhys[0]->periphData) | DMA_BUS_ADR;
@@ -2607,7 +2623,8 @@ int i2cWriteQuick(unsigned handle, unsigned bit)
if (bit > 1)
SOFT_ERROR(PI_BAD_PARAM, "bad bit (%d)", bit);
- err = my_smbus_access(i2cInfo[handle].fd, bit, 0, PI_I2C_SMBUS_QUICK, NULL);
+ err = my_smbus_access(
+ i2cInfo[handle].fd, bit, 0, PI_I2C_SMBUS_QUICK, NULL);
if (err < 0) return PI_I2C_WRITE_FAILED;
@@ -3117,7 +3134,7 @@ int i2cOpen(unsigned i2cBus, unsigned i2cAddr, unsigned i2cFlags)
system("/sbin/modprobe i2c_dev");
system("/sbin/modprobe i2c_bcm2708");
- usleep(100000);
+ myGpioDelay(100000);
if ((fd = open(dev, O_RDWR)) < 0)
{
@@ -3274,7 +3291,7 @@ static void spiGoA(
auxReg[AUX_SPI0_CNTL0_REG] =
AUXSPI_CNTL0_ENABLE | AUXSPI_CNTL0_CLR_FIFOS;
- usleep(10);
+ myGpioDelay(10);
auxReg[AUX_SPI0_CNTL0_REG] = AUXSPI_CNTL0_ENABLE | spiDefaults;
@@ -3438,15 +3455,12 @@ static void spiGo(
char *rxBuf,
unsigned count)
{
- DBG(0, "spiGo");
if (PI_SPI_FLAGS_GET_AUX_SPI(flags))
{
- DBG(0, "spiGoA");
spiGoA(speed, flags, txBuf, rxBuf, count);
}
else
{
- DBG(0, "spiGoS");
spiGoS(speed, flags, txBuf, rxBuf, count);
}
}
@@ -4037,8 +4051,7 @@ static unsigned dmaNowAtICB(void)
endTick = systReg[SYST_CLO];
if (endTick != startTick)
- gpioStats.cbTicks += (endTick - startTick);
- else gpioStats.cbTicks ++;
+ gpioStats.cbTicks += (endTick - startTick);
gpioStats.cbCalls++;
@@ -4179,7 +4192,7 @@ static void dmaGpioOnCb(int b, int pos)
p->info = NORMAL_DMA;
p->src = dmaGpioOnAdr(pos) | DMA_BUS_ADR;
- p->dst = ((GPIO_BASE + (GPSET0*4)) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((GPIO_BASE + (GPSET0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->length = 4;
p->next = dmaCbAdr(b+1) | DMA_BUS_ADR;
}
@@ -4193,7 +4206,7 @@ static void dmaTickCb(int b, int pos)
p = dmaCB2adr(b);
p->info = NORMAL_DMA;
- p->src = ((SYST_BASE + (SYST_CLO*4)) & 0x00ffffff) | 0x7e000000;
+ p->src = ((SYST_BASE + (SYST_CLO*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->dst = dmaTickAdr(pos) | DMA_BUS_ADR;
p->length = 4;
p->next = dmaCbAdr(b+1) | DMA_BUS_ADR;
@@ -4209,7 +4222,7 @@ static void dmaGpioOffCb(int b, int pos)
p->info = NORMAL_DMA;
p->src = dmaGpioOffAdr(pos) | DMA_BUS_ADR;
- p->dst = ((GPIO_BASE + (GPCLR0*4)) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((GPIO_BASE + (GPCLR0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->length = 4;
p->next = dmaCbAdr(b+1) | DMA_BUS_ADR;
}
@@ -4223,7 +4236,7 @@ static void dmaReadLevelsCb(int b, int pos)
p = dmaCB2adr(b);
p->info = NORMAL_DMA;
- p->src = ((GPIO_BASE + (GPLEV0*4)) & 0x00ffffff) | 0x7e000000;
+ p->src = ((GPIO_BASE + (GPLEV0*4)) & 0x00ffffff) | PI_PERI_PHYS;
p->dst = dmaReadLevelsAdr(pos) | DMA_BUS_ADR;
p->length = 4;
p->next = dmaCbAdr(b+1) | DMA_BUS_ADR;
@@ -4240,12 +4253,12 @@ static void dmaDelayCb(int b)
if (gpioCfg.clockPeriph == PI_CLOCK_PCM)
{
p->info = NORMAL_DMA | TIMED_DMA(2);
- p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PCM_BASE + PCM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
else
{
p->info = NORMAL_DMA | TIMED_DMA(5);
- p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | 0x7e000000;
+ p->dst = ((PWM_BASE + PWM_FIFO*4) & 0x00ffffff) | PI_PERI_PHYS;
}
p->src = dmaPwmDataAdr(b%DMAI_PAGES) | DMA_BUS_ADR;
@@ -4265,6 +4278,8 @@ static void dmaInitCbs(void)
DBG(DBG_STARTUP, "");
+ gpioStats.dmaInitCbsCount++;
+
b = -1;
level = 0;
@@ -4386,6 +4401,7 @@ static void * pthAlertThread(void *x)
int numSamples, d;
int b, n, v;
int err;
+ int stopped;
char fifo[32];
req.tv_sec = 0;
@@ -4407,8 +4423,35 @@ static void * pthAlertThread(void *x)
cycle = (oldSlot/PULSE_PER_CYCLE);
pulse = (oldSlot%PULSE_PER_CYCLE);
+ stopped = 0;
+
while (1)
{
+
+ if (dmaIn[DMA_CONBLK_AD])
+ {
+ if (stopped)
+ {
+ DBG(1, "****** GOING ******");
+ stopped = 0;
+ }
+ }
+ else
+ {
+ if (!stopped)
+ {
+ DBG(1, "****** 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++;
+ }
+
gpioStats.alertTicks++;
req.tv_nsec = 850000;
@@ -5161,6 +5204,13 @@ static void * pthFifoThread(void *x)
flags = fcntl(fileno(outFifo), F_GETFL, 0);
fcntl(fileno(outFifo), F_SETFL, flags | O_NONBLOCK);
+ /* don't start until DMA started */
+
+ while (!DMAstarted) myGpioDelay(1000);
+
+ myGpioDelay(20000); /* let DMA run for a while */
+
+
while (1)
{
if (fgets(buf, sizeof(buf), inpFifo) == NULL)
@@ -5382,6 +5432,12 @@ static void * pthSocketThread(void *x)
c = sizeof(struct sockaddr_in);
+ /* don't start until DMA started */
+
+ while (!DMAstarted) myGpioDelay(1000);
+
+ myGpioDelay(20000); /* let DMA run for a while */
+
while ((fdC =
accept(fdSock, (struct sockaddr *)&client, (socklen_t*)&c)))
{
@@ -5484,7 +5540,7 @@ static int initZaps
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_FIXED|MAP_LOCKED|MAP_NORESERVE,
fdMem,
- (uint32_t)dmaP[n] | 0x40000000
+ (uint32_t)dmaP[n] | DMA_BUS_CACHE
);
pageAdr2 += PAGE_SIZE;
@@ -5649,6 +5705,31 @@ 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));
+ }
+}
/* ----------------------------------------------------------------------- */
@@ -5740,8 +5821,6 @@ static int initDMAcbs(void)
for (i=0; i= DBG_DMACBS)
{
fprintf(stderr, "*** INPUT DMA CONTROL BLOCKS ***\n");
@@ -5945,8 +6024,6 @@ static void initDMAgo(volatile uint32_t *dmaAddr, uint32_t cbAddr)
DMA_PANIC_PRIORITY(8) |
DMA_PRIORITY(8) |
DMA_ACTIVATE;
-
- DMAstarted = 1;
}
/* ----------------------------------------------------------------------- */
@@ -6390,6 +6467,81 @@ 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;
@@ -6495,11 +6647,17 @@ int gpioInitialise(void)
pthSocketRunning = 1;
}
- initDMAgo((uint32_t *)dmaIn, (uint32_t)dmaIPhys[0]);
+ if (piModel == 1)
+ startPi1DMA();
+ else
+ startPi2DMA();
+
+ DMAstarted = 1;
return PIGPIO_VERSION;
}
+
/* ----------------------------------------------------------------------- */
void gpioTerminate(void)
@@ -6527,7 +6685,10 @@ void gpioTerminate(void)
if (gpioCfg.showStats)
{
- fprintf(stderr, "micros=%d\n", gpioCfg.clockMicros);
+ fprintf(stderr,
+ "micros=%d dmaInitCbs=%d DMA inits=%d DMA restarts=%d\n",
+ gpioCfg.clockMicros, gpioStats.dmaInitCbsCount,
+ gpioStats.DMAInits, gpioStats.DMARestarts);
fprintf(stderr, "samples %u maxSamples %u maxEmit %u emitFrags %u\n",
gpioStats.numSamples, gpioStats.maxSamples,
@@ -8914,41 +9075,53 @@ unsigned gpioHardwareRevision(void)
FILE * filp;
char buf[512];
char term;
+ int chars=4; /* number of chars in revision string */
DBG(DBG_USER, "");
if (rev) return rev;
+ piModel = 0;
+
filp = fopen ("/proc/cpuinfo", "r");
if (filp != NULL)
{
while (fgets(buf, sizeof(buf), filp) != NULL)
{
- if (!strncmp("model name", buf, 10))
+ if (piModel == 0)
{
- if (strstr (buf, "ARMv6") != NULL)
+ if (!strncasecmp("model name", buf, 10))
{
- piModel = 1;
- PI_PERI_BASE = 0x20000000;
- DMA_BUS_ADR = 0x40000000;
- }
- else if (strstr (buf, "ARMv7") != NULL)
- {
- piModel = 2;
- PI_PERI_BASE = 0x3F000000;
- DMA_BUS_ADR = 0xC0000000;
+ if (strstr (buf, "ARMv6") != NULL)
+ {
+ piModel = 1;
+ chars = 4;
+ PI_PERI_BASE = 0x20000000;
+ DMA_BUS_ADR = 0x40000000;
+ DMA_BUS_CACHE = 0x40000000;
+ }
+ else if (strstr (buf, "ARMv7") != NULL)
+ {
+ piModel = 2;
+ chars = 6;
+ PI_PERI_BASE = 0x3F000000;
+ DMA_BUS_ADR = 0xC0000000;
+ DMA_BUS_CACHE = 0x00000000;
+ }
}
}
- if (!strncmp("Revision", buf, 8))
+ if (!strncasecmp("revision", buf, 8))
{
- if (sscanf(buf+strlen(buf)-5, "%x%c", &rev, &term) == 2)
+ if (sscanf(buf+strlen(buf)-(chars+1),
+ "%x%c", &rev, &term) == 2)
{
if (term != '\n') rev = 0;
}
}
}
+
fclose(filp);
}
return rev;
diff --git a/pigpio.h b/pigpio.h
index 5b807a5..d47e5c0 100644
--- a/pigpio.h
+++ b/pigpio.h
@@ -31,7 +31,7 @@ For more information, please refer to
#include
#include
-#define PIGPIO_VERSION 27
+#define PIGPIO_VERSION 28
/*TEXT
diff --git a/pigpiod_if.3 b/pigpiod_if.3
index 0af3b82..c639793 100644
--- a/pigpiod_if.3
+++ b/pigpiod_if.3
@@ -1207,9 +1207,9 @@ daemon is started (option -t).
.EX
gpio: see descripton
.br
-PWMfreq: 0 (off) or 5-250K
+PWMfreq: 0 (off) or 5-50K
.br
-PWMduty: 0 (off) to 1000 (fully on).
+PWMduty: 0 (off) to 5000 (fully on).
.br
.EE
@@ -2671,8 +2671,8 @@ handle: >=0, as returned by a call to \fBspi_open\fP.
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint spi_write(unsigned handle, char *buf, unsigned count)\fP"
.IP "" 4
@@ -2696,8 +2696,8 @@ handle: >=0, as returned by a call to \fBspi_open\fP.
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint spi_xfer(unsigned handle, char *txBuf, char *rxBuf, unsigned count)\fP"
.IP "" 4
@@ -2724,8 +2724,8 @@ handle: >=0, as returned by a call to \fBspi_open\fP.
.br
.br
-Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or
-PI_SPI_XFER_FAILED.
+Returns the number of bytes transferred if OK, otherwise
+PI_BAD_HANDLE, PI_BAD_SPI_COUNT, or PI_SPI_XFER_FAILED.
.IP "\fBint serial_open(char *ser_tty, unsigned ser_baud, unsigned ser_flags)\fP"
.IP "" 4
@@ -2887,6 +2887,75 @@ handle: >=0, as returned by a call to \fBserial_open\fP.
Returns the number of bytes of data available (>=0) if OK,
otherwise PI_BAD_HANDLE.
+.IP "\fBint custom_1(unsigned arg1, unsigned arg2, char *argx, unsigned count)\fP"
+.IP "" 4
+This function is available for user customisation.
+
+.br
+
+.br
+It returns a single integer value.
+
+.br
+
+.br
+
+.EX
+ arg1: >=0
+.br
+ arg2: >=0
+.br
+ argx: extra (byte) arguments
+.br
+count: number of extra arguments
+.br
+
+.EE
+
+.br
+
+.br
+Returns >= 0 if OK, less than 0 indicates a user defined error.
+
+.IP "\fBint custom_2(unsigned arg1, char *argx, unsigned count, char *retBuf, unsigned retMax)\fP"
+.IP "" 4
+This function is available for user customisation.
+
+.br
+
+.br
+It differs from custom_1 in that it returns an array of bytes
+rather than just an integer.
+
+.br
+
+.br
+The return value is an integer indicating the number of returned bytes.
+
+.EX
+ arg1: >=0
+.br
+ argx: extra (byte) arguments
+.br
+ count: number of extra arguments
+.br
+retBuf: buffer for returned data
+.br
+retMax: maximum number of bytes to return
+.br
+
+.EE
+
+.br
+
+.br
+Returns >= 0 if OK, less than 0 indicates a user defined error.
+
+.br
+
+.br
+Note, the number of returned bytes will be retMax or less.
+
.IP "\fBint callback(unsigned user_gpio, unsigned edge, CBFunc_t f)\fP"
.IP "" 4
This function initialises a new callback.
diff --git a/pigs.1 b/pigs.1
index 6235830..78ff421 100644
--- a/pigs.1
+++ b/pigs.1
@@ -534,11 +534,11 @@ will be returned.
.br
.EX
-$ pigs hp 18 100 900
+$ pigs hp 18 100 4000 # 80% dutycycle
.br
.br
-$ pigs hp 19 100 100
+$ pigs hp 19 100 1000 # 20% dutycycle
.br
.br
@@ -546,7 +546,7 @@ $ pigs hp 19 1 100
.br
-96
.br
-ERROR: hardware PWM frequency not 5-250K
+ERROR: hardware PWM frequency not 5-50K
.br
.EE
diff --git a/x_pigs b/x_pigs
index 5a25b15..cd31214 100755
--- a/x_pigs
+++ b/x_pigs
@@ -1,6 +1,6 @@
#!/bin/bash
-VERSION=27
+VERSION=28
GPIO=4
diff --git a/x_pipe b/x_pipe
index f49dfc7..cfb4e86 100755
--- a/x_pipe
+++ b/x_pipe
@@ -1,6 +1,6 @@
#!/bin/bash
-VERSION=27
+VERSION=28
GPIO=4
@@ -159,6 +159,7 @@ read -t 1 s /dev/pigpio
+sleep 0.1
read -t 1 s