summaryrefslogtreecommitdiff
path: root/pigpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'pigpio.c')
-rw-r--r--pigpio.c172
1 files changed, 101 insertions, 71 deletions
diff --git a/pigpio.c b/pigpio.c
index 68e1451..0bd05f9 100644
--- 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 16 */
+/* pigpio version 17 */
#include <stdio.h>
#include <string.h>
@@ -51,6 +51,7 @@ For more information, please refer to <http://unlicense.org/>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/socket.h>
+#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <linux/spi/spidev.h>
@@ -812,12 +813,6 @@ struct my_smbus_ioctl_data
union my_smbus_data *data;
};
-struct my_rdwr_ioctl_data
-{
- struct i2c_msg *msgs; /* pointers to msgs */
- uint32_t nmsgs; /* number of msgs */
-};
-
/* --------------------------------------------------------------- */
/* initialise once then preserve */
@@ -984,6 +979,28 @@ static int gpioNotifyOpenInBand(int fd);
/* ======================================================================= */
+static char * myTimeStamp()
+{
+ static struct timeval last;
+ static char buf[32];
+ struct timeval now;
+
+ struct tm tmp;
+
+ gettimeofday(&now, NULL);
+
+ if (now.tv_sec != last.tv_sec)
+ {
+ localtime_r(&now.tv_sec, &tmp);
+ strftime(buf, sizeof(buf), "%F %T", &tmp);
+ last.tv_sec = now.tv_sec;
+ }
+
+ return buf;
+}
+
+/* ----------------------------------------------------------------------- */
+
static int my_smbus_access(
int fd, char rw, uint8_t cmd, int size, union my_smbus_data *data)
{
@@ -997,6 +1014,8 @@ static int my_smbus_access(
return ioctl(fd, PI_I2C_SMBUS, &args);
}
+/* ----------------------------------------------------------------------- */
+
static char *myBuf2Str(unsigned count, char *buf)
{
static char str[64];
@@ -1014,6 +1033,8 @@ static char *myBuf2Str(unsigned count, char *buf)
return str;
}
+/* ----------------------------------------------------------------------- */
+
static void myGpioSleep(int seconds, int micros)
{
struct timespec ts, rem;
@@ -1045,28 +1066,6 @@ static uint32_t myGpioDelay(uint32_t micros)
/* ----------------------------------------------------------------------- */
-static char * myTimeStamp()
-{
- static struct timeval last;
- static char buf[32];
- struct timeval now;
-
- struct tm tmp;
-
- gettimeofday(&now, NULL);
-
- if (now.tv_sec != last.tv_sec)
- {
- localtime_r(&now.tv_sec, &tmp);
- strftime(buf, sizeof(buf), "%F %T", &tmp);
- last.tv_sec = now.tv_sec;
- }
-
- return buf;
-}
-
-/* ----------------------------------------------------------------------- */
-
static void myCreatePipe(char * name, int perm)
{
unlink(name);
@@ -1743,12 +1742,12 @@ static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
/* ======================================================================= */
-rawCbs_t * rawWaveCBAdr(int n)
+rawCbs_t * rawWaveCBAdr(int cbNum)
{
int page, slot;
- page = n/CBS_PER_OPAGE;
- slot = n%CBS_PER_OPAGE;
+ page = cbNum/CBS_PER_OPAGE;
+ slot = cbNum%CBS_PER_OPAGE;
return &dmaOVirt[page]->cb[slot];
}
@@ -1861,7 +1860,7 @@ static int errCBsOOL(int cb, int botOOL, int topOOL)
/* ----------------------------------------------------------------------- */
-static int wave2Cbs(unsigned mode)
+static int wave2Cbs(unsigned wave_mode)
{
int botCB=waveOutBotCB, botOOL=waveOutBotOOL, topOOL=waveOutTopOOL;
@@ -2000,7 +1999,7 @@ static int wave2Cbs(unsigned mode)
if (p != NULL)
{
- if (mode == PI_WAVE_MODE_ONE_SHOT)
+ if (wave_mode == PI_WAVE_MODE_ONE_SHOT)
p->next = 0;
else p->next = waveCbPOadr(repeatCB) | DMA_BUS_ADR;
}
@@ -2485,8 +2484,12 @@ int i2cReadBlockData(unsigned handle, unsigned reg, char *buf)
return PI_I2C_READ_FAILED;
else
{
- for (i=1; i<=data.block[0]; i++) buf[i-1] = data.block[i];
- return data.block[0];
+ if (data.block[0] <= PI_I2C_SMBUS_BLOCK_MAX)
+ {
+ for (i=0; i<data.block[0]; i++) buf[i] = data.block[i+1];
+ return data.block[0];
+ }
+ else return PI_I2C_READ_FAILED;
}
}
@@ -2558,12 +2561,17 @@ int i2cBlockProcessCall(
for (i=1; i<=count; i++) data.block[i] = buf[i-1];
data.block[0] = count;
if (my_smbus_access(
- i2cInfo[handle].fd, PI_I2C_SMBUS_WRITE, reg, PI_I2C_SMBUS_BLOCK_PROC_CALL, &data))
+ i2cInfo[handle].fd, PI_I2C_SMBUS_WRITE, reg,
+ PI_I2C_SMBUS_BLOCK_PROC_CALL, &data))
return PI_I2C_READ_FAILED;
else
{
- for (i=1; i<=data.block[0]; i++) buf[i-1] = data.block[i];
- return data.block[0];
+ if (data.block[0] <= PI_I2C_SMBUS_BLOCK_MAX)
+ {
+ for (i=0; i<data.block[0]; i++) buf[i] = data.block[i+1];
+ return data.block[0];
+ }
+ else return PI_I2C_READ_FAILED;
}
}
@@ -2604,8 +2612,12 @@ int i2cReadI2CBlockData(
return PI_I2C_READ_FAILED;
else
{
- for (i = 1; i <= data.block[0]; i++) buf[i-1] = data.block[i];
- return data.block[0];
+ if (data.block[0] <= PI_I2C_SMBUS_I2C_BLOCK_MAX)
+ {
+ for (i=0; i<data.block[0]; i++) buf[i] = data.block[i+1];
+ return data.block[0];
+ }
+ else return PI_I2C_READ_FAILED;
}
}
@@ -4122,11 +4134,10 @@ static void *pthScript(void *x)
s = x;
- s->run_state = PI_SCRIPT_HALTED;
-
- while (s->request != PI_SCRIPT_DELETE)
+ while ((volatile int)s->request != PI_SCRIPT_DELETE)
{
pthread_mutex_lock(&s->pthMutex);
+ s->run_state = PI_SCRIPT_HALTED;
pthread_cond_wait(&s->pthCond, &s->pthMutex);
pthread_mutex_unlock(&s->pthMutex);
@@ -4137,8 +4148,8 @@ static void *pthScript(void *x)
PC = 0;
SP = 0;
- while ((s->request == PI_SCRIPT_RUN ) &&
- (s->run_state == PI_SCRIPT_RUNNING))
+ while (((volatile int)s->request == PI_SCRIPT_RUN ) &&
+ (s->run_state == PI_SCRIPT_RUNNING))
{
instr = s->script.instr[PC];
@@ -4150,7 +4161,11 @@ static void *pthScript(void *x)
if (instr.opt[2] == CMD_VAR) instr.p[2] = s->script.var[p2o];
else if (instr.opt[2] == CMD_PAR) instr.p[2] = s->script.par[p2o];
-
+/*
+ fprintf(stderr, "PC=%d cmd=%d p1o=%d p1=%d p2o=%d p2=%d\n",
+ PC, instr.p[0], p1o, instr.p[1], p2o, instr.p[2]);
+ fflush(stderr);
+*/
if (instr.p[0] < 100)
{
if (instr.p[3])
@@ -4323,7 +4338,8 @@ static void *pthScript(void *x)
}
- if (s->request == PI_SCRIPT_HALT) s->run_state = PI_SCRIPT_HALTED;
+ if ((volatile int)s->request == PI_SCRIPT_HALT)
+ s->run_state = PI_SCRIPT_HALTED;
}
@@ -4462,11 +4478,15 @@ static void * pthFifoThread(void *x)
break;
case 6:
- if (res < 0) fprintf(outFifo, "%d\n", res);
- else if (res > 0)
+ fprintf(outFifo, "%d", res);
+ if (res > 0)
{
- fwrite(v, 1, res, outFifo);
+ for (i=0; i<res; i++)
+ {
+ fprintf(outFifo, " %d", v[i]);
+ }
}
+ fprintf(outFifo, "\n");
break;
case 7:
@@ -4499,10 +4519,15 @@ static void *pthSocketThreadHandler(void *fdC)
{
int sock = *(int*)fdC;
uint32_t p[10];
+ int opt;
char buf[CMD_MAX_EXTENSION];
free(fdC);
+ /* Disable the Nagle algorithm. */
+ opt = 1;
+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(int));
+
while (1)
{
if (recv(sock, p, 16, MSG_WAITALL) != 16) break;
@@ -4544,6 +4569,10 @@ static void *pthSocketThreadHandler(void *fdC)
else
{
p[3] = gpioNotifyOpenInBand(sock);
+
+ /* Enable the Nagle algorithm. */
+ opt = 0;
+ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(int));
}
write(sock, p, 16);
@@ -5617,7 +5646,8 @@ int gpioInitialise(void)
if (i == 0) gpioMask = PI_DEFAULT_UPDATE_MASK_R0;
else if (i < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_R1;
- else gpioMask = PI_DEFAULT_UPDATE_MASK_R2;
+ else if (i < 16) gpioMask = PI_DEFAULT_UPDATE_MASK_R2;
+ else gpioMask = PI_DEFAULT_UPDATE_MASK_R3;
gpioMaskSet = 1;
}
@@ -6191,11 +6221,12 @@ int gpioWaveAddGeneric(unsigned numPulses, gpioPulse_t *pulses)
/* ----------------------------------------------------------------------- */
-int gpioWaveAddSerial(unsigned gpio,
- unsigned bbBaud,
- unsigned offset,
- unsigned numChar,
- char *str)
+int gpioWaveAddSerial
+ (unsigned gpio,
+ unsigned bbBaud,
+ unsigned offset,
+ unsigned numChar,
+ char *str)
{
int i, b, p, lev, c, v;
@@ -6489,7 +6520,7 @@ int gpioWaveDelete(unsigned wave_id)
/* ----------------------------------------------------------------------- */
-int gpioWaveTxStart(unsigned mode)
+int gpioWaveTxStart(unsigned wave_mode)
{
/* This function is deprecated and will be removed. */
@@ -6497,12 +6528,12 @@ int gpioWaveTxStart(unsigned mode)
int cb, i;
- DBG(DBG_USER, "mode=%d", mode);
+ DBG(DBG_USER, "wave_mode=%d", wave_mode);
CHECK_INITED;
- if (mode > PI_WAVE_MODE_REPEAT)
- SOFT_ERROR(PI_BAD_WAVE_MODE, "bad wave mode (%d)", mode);
+ if (wave_mode > PI_WAVE_MODE_REPEAT)
+ SOFT_ERROR(PI_BAD_WAVE_MODE, "bad wave mode (%d)", wave_mode);
if (wfc[wfcur] == 0) return 0;
@@ -6523,7 +6554,7 @@ int gpioWaveTxStart(unsigned mode)
waveOutCount = 0;
- cb = wave2Cbs(mode);
+ cb = wave2Cbs(wave_mode);
if (gpioCfg.dbgLevel >= DBG_SLOW_TICK)
{
@@ -6539,21 +6570,21 @@ int gpioWaveTxStart(unsigned mode)
/* ----------------------------------------------------------------------- */
-int gpioWaveTxSend(unsigned wave_id, unsigned mode)
+int gpioWaveTxSend(unsigned wave_id, unsigned wave_mode)
{
rawCbs_t *p=NULL;
static int secondaryClockInited = 0;
- DBG(DBG_USER, "wave_id=%d mode=%d", wave_id, mode);
+ DBG(DBG_USER, "wave_id=%d wave_mode=%d", wave_id, wave_mode);
CHECK_INITED;
if (wave_id >= waveOutCount)
SOFT_ERROR(PI_BAD_WAVE_ID, "bad wave id (%d)", wave_id);
- if (mode > PI_WAVE_MODE_REPEAT)
- SOFT_ERROR(PI_BAD_WAVE_MODE, "bad wave mode (%d)", mode);
+ if (wave_mode > PI_WAVE_MODE_REPEAT)
+ SOFT_ERROR(PI_BAD_WAVE_MODE, "bad wave mode (%d)", wave_mode);
if (!secondaryClockInited)
{
@@ -6563,7 +6594,7 @@ int gpioWaveTxSend(unsigned wave_id, unsigned mode)
p = rawWaveCBAdr(waveInfo[wave_id].topCB);
- if (mode == PI_WAVE_MODE_ONE_SHOT) p->next = 0;
+ if (wave_mode == PI_WAVE_MODE_ONE_SHOT) p->next = 0;
else p->next = waveCbPOadr(waveInfo[wave_id].botCB+1) | DMA_BUS_ADR;
dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
@@ -7358,7 +7389,7 @@ int gpioStoreScript(char *script)
if (status == 0)
{
s->request = PI_SCRIPT_HALT;
- s->run_state = PI_SCRIPT_HALTED;
+ s->run_state = PI_SCRIPT_INITING;
pthread_cond_init(&s->pthCond, NULL);
pthread_mutex_init(&s->pthMutex, NULL);
@@ -7519,7 +7550,8 @@ int gpioDeleteScript(unsigned script_id)
gpioStopThread(gpioScript[script_id].pthIdp);
- if (gpioScript[script_id].script.par) free(gpioScript[script_id].script.par);
+ if (gpioScript[script_id].script.par)
+ free(gpioScript[script_id].script.par);
gpioScript[script_id].script.par = NULL;
@@ -7949,8 +7981,6 @@ int gpioCfgInternals(unsigned cfgWhat, int cfgVal)
DBG(DBG_USER, "cfgWhat=%u, cfgVal=%d", cfgWhat, cfgVal);
- CHECK_NOT_INITED;
-
/*
133084774
207081315