From be8beba544f95fb30631003e1b41587878e2572f Mon Sep 17 00:00:00 2001 From: joan Date: Tue, 8 Mar 2016 14:28:15 +0000 Subject: [PATCH] V48 --- command.c | 6 +- pigpio.3 | 78 +++++++++++----- pigpio.c | 231 ++++++++++++++++++++++++++++++++++-------------- pigpio.h | 69 +++++++++------ pigpio.py | 6 +- pigpiod.1 | 75 +++++++++++++--- pigpiod.c | 8 +- setup.py | 2 +- x_pigpio.c | 16 ++-- x_pigpio.py | 31 +++++-- x_pigpiod_if.c | 16 ++-- x_pigpiod_if2.c | 16 ++-- x_pigs | 22 ++++- x_pipe | 24 ++++- 14 files changed, 426 insertions(+), 174 deletions(-) diff --git a/command.c b/command.c index 32619ba..eb7c47e 100644 --- a/command.c +++ b/command.c @@ -26,7 +26,7 @@ For more information, please refer to */ /* -This version is for pigpio version 47+ +This version is for pigpio version 48+ */ #include @@ -394,7 +394,7 @@ static errInfo_t errInfo[]= {PI_BAD_CHANNEL , "DMA channel not 0-14"}, {PI_BAD_SOCKET_PORT , "socket port not 1024-30000"}, {PI_BAD_FIFO_COMMAND , "unknown fifo command"}, - {PI_BAD_SECO_CHANNEL , "DMA secondary channel not 0-6"}, + {PI_BAD_SECO_CHANNEL , "DMA secondary channel not 0-14"}, {PI_NOT_INITIALISED , "function called before gpioInitialise"}, {PI_INITIALISED , "function called after gpioInitialise"}, {PI_BAD_WAVE_MODE , "waveform mode not 0-1"}, @@ -455,7 +455,7 @@ static errInfo_t errInfo[]= {PI_UNKNOWN_COMMAND , "unknown command"}, {PI_SPI_XFER_FAILED , "spi xfer/read/write failed"}, {PI_BAD_POINTER , "bad (NULL) pointer"}, - {PI_NO_AUX_SPI , "need a B+ for auxiliary SPI"}, + {PI_NO_AUX_SPI , "no auxiliary SPI on Pi A or B"}, {PI_NOT_PWM_GPIO , "GPIO is not in use for PWM"}, {PI_NOT_SERVO_GPIO , "GPIO is not in use for servo pulses"}, {PI_NOT_HCLK_GPIO , "GPIO has no hardware clock"}, diff --git a/pigpio.3 b/pigpio.3 index cc7264d..7f06865 100644 --- a/pigpio.3 +++ b/pigpio.3 @@ -5260,7 +5260,7 @@ Configures pigpio to use the specified DMA channels. .EX primaryChannel: 0-14 .br -secondaryChannel: 0-6 +secondaryChannel: 0-14 .br .EE @@ -5269,7 +5269,27 @@ secondaryChannel: 0-6 .br The default setting is to use channel 14 for the primary channel and -channel 5 for the secondary channel. +channel 6 for the secondary channel. + +.br + +.br +The secondary channel is only used for the transmission of waves. + +.br + +.br +If possible use one of channels 0 to 6 for the secondary channel +(a full channel). + +.br + +.br +A full channel only requires one DMA control block regardless of the +length of a pulse delay. Channels 7 to 14 (lite channels) require +one DMA control block for each 16383 microseconds of delay. I.e. +a 10 second pulse delay requires one control block on a full channel +and 611 control blocks on a lite channel. .IP "\fBint gpioCfgPermissions(uint64_t updateMask)\fP" .IP "" 4 @@ -5289,22 +5309,26 @@ updateMask: bit (1< */ -/* pigpio version 47 */ +/* pigpio version 48 */ /* include ------------------------------------------------------- */ @@ -365,9 +365,11 @@ bit 0 READ_LAST_NOT_SET_ERROR #define DMA_BURST_LENGTH(x) ((x)<<12) #define DMA_SRC_IGNORE (1<<11) #define DMA_SRC_DREQ (1<<10) +#define DMA_SRC_WIDTH (1<< 9) #define DMA_SRC_INC (1<< 8) #define DMA_DEST_IGNORE (1<< 7) #define DMA_DEST_DREQ (1<< 6) +#define DMA_DEST_WIDTH (1<< 5) #define DMA_DEST_INC (1<< 4) #define DMA_WAIT_RESP (1<< 3) @@ -375,6 +377,9 @@ bit 0 READ_LAST_NOT_SET_ERROR #define DMA_DEBUG_FIFO_ERR (1<<1) #define DMA_DEBUG_RD_LST_NOT_SET_ERR (1<<0) +#define DMA_LITE_FIRST 7 +#define DMA_LITE_MAX 0xfffc + #define PWM_CTL 0 #define PWM_STA 1 #define PWM_DMAC 2 @@ -742,6 +747,8 @@ Assumes two counters per block. Each counter 4 * 16 (16^4=65536) #define PI_WF_MICROS 1 +#define BPD 4 + #define MAX_REPORT 120 #define MAX_SAMPLE 4000 @@ -1123,7 +1130,7 @@ typedef struct /* initialise once then preserve */ -static volatile uint32_t piModel = 1; +static volatile uint32_t piCores = 0; static volatile uint32_t pi_peri_phys = 0x20000000; static volatile uint32_t pi_dram_bus = 0x40000000; static volatile uint32_t pi_mem_flag = 0x0C; @@ -1655,7 +1662,7 @@ static void spinWhileStarting(void) { while (runState == PI_STARTING) { - if (piModel == 1) myGpioDelay(1000); + if (piCores == 1) myGpioDelay(1000); else flushMemory(); } } @@ -2603,6 +2610,17 @@ static void waveBitDelay bitDelay[i] = diff; } +static int waveDelayCBs(uint32_t delay) +{ + uint32_t cbs; + + if (!delay) return 0; + if (gpioCfg.DMAsecondaryChannel < DMA_LITE_FIRST) return 1; + cbs = BPD * delay / DMA_LITE_MAX; + if ((BPD * delay) % DMA_LITE_MAX) cbs++; + return cbs; +} + /* ----------------------------------------------------------------------- */ static void waveCBsOOLs(int *numCBs, int *numBOOLs, int *numTOOLs) @@ -2628,7 +2646,8 @@ static void waveCBsOOLs(int *numCBs, int *numBOOLs, int *numTOOLs) if (waves[i].gpioOff) {numCB++; numBOOL++;} if (waves[i].flags & WAVE_FLAG_READ) {numCB++; numTOOL++;} if (waves[i].flags & WAVE_FLAG_TICK) {numCB++; numTOOL++;} - if (waves[i].usDelay) {numCB++; } + + numCB += waveDelayCBs(waves[i].usDelay); } *numCBs = numCB; @@ -2646,17 +2665,19 @@ static int wave2Cbs(unsigned wave_mode, int *CB, int *BOOL, int *TOOL) rawCbs_t *p=NULL; - unsigned i, half, repeatCB; + unsigned i, repeatCB; unsigned numWaves; + unsigned delayCBs, dcb; + + uint32_t delayLeft; + rawWave_t * waves; numWaves = wfc[wfcur]; waves = wf [wfcur]; - half = PI_WF_MICROS/2; - /* add delay cb at start of DMA */ p = rawWaveCBAdr(botCB++); @@ -2675,7 +2696,7 @@ static int wave2Cbs(unsigned wave_mode, int *CB, int *BOOL, int *TOOL) } p->src = (uint32_t) (&dmaOBus[0]->periphData); - p->length = 4 * 20 / PI_WF_MICROS; /* 20 micros delay */ + p->length = BPD * 20 / PI_WF_MICROS; /* 20 micros delay */ p->next = waveCbPOadr(botCB); repeatCB = botCB; @@ -2732,24 +2753,41 @@ static int wave2Cbs(unsigned wave_mode, int *CB, int *BOOL, int *TOOL) if (waves[i].usDelay) { - p = rawWaveCBAdr(botCB++); + delayLeft = waves[i].usDelay; - /* use the secondary clock */ + delayCBs = waveDelayCBs(delayLeft); - if (gpioCfg.clockPeriph != PI_CLOCK_PCM) + for (dcb=0; dcbinfo = NORMAL_DMA | TIMED_DMA(2); - p->dst = PCM_TIMER; - } - else - { - p->info = NORMAL_DMA | TIMED_DMA(5); - p->dst = PWM_TIMER; - } + p = rawWaveCBAdr(botCB++); - p->src = (uint32_t) (&dmaOBus[0]->periphData); - p->length = 4 * ((waves[i].usDelay+half)/PI_WF_MICROS); - p->next = waveCbPOadr(botCB); + /* use the secondary clock */ + + if (gpioCfg.clockPeriph != PI_CLOCK_PCM) + { + p->info = NORMAL_DMA | TIMED_DMA(2); + p->dst = PCM_TIMER; + } + else + { + p->info = NORMAL_DMA | TIMED_DMA(5); + p->dst = PWM_TIMER; + } + + p->src = (uint32_t) (&dmaOBus[0]->periphData); + + p->length = BPD * delayLeft / PI_WF_MICROS; + + if ((gpioCfg.DMAsecondaryChannel >= DMA_LITE_FIRST) && + (p->length > DMA_LITE_MAX)) + { + p->length = DMA_LITE_MAX; + } + + delayLeft -= (p->length / BPD); + + p->next = waveCbPOadr(botCB); + } } } @@ -2940,7 +2978,7 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1) out[outPos].usDelay = tDelay; - cbs++; /* one cb for delay */ + cbs += waveDelayCBs(tDelay); if (out[outPos].gpioOn) cbs++; /* one cb if gpio on */ @@ -4301,7 +4339,7 @@ int spiOpen(unsigned spiChan, unsigned baud, unsigned spiFlags) if (PI_SPI_FLAGS_GET_AUX_SPI(spiFlags)) { if (gpioHardwareRevision() < 16) - SOFT_ERROR(PI_NO_AUX_SPI, "no auxiliary SPI, need a A+/B+"); + SOFT_ERROR(PI_NO_AUX_SPI, "no auxiliary SPI on Pi A or B"); i = PI_NUM_AUX_SPI_CHANNEL; } @@ -5567,7 +5605,6 @@ static void alertEmit( } else { - gpioCfg.internals |= PI_CFG_STATS; gpioStats.shortPipeWrite++; DBG(DBG_ALWAYS, "emitted %d, asked for %d", err/sizeof(gpioReport_t), max_emits); @@ -5608,7 +5645,6 @@ static void alertEmit( } else { - gpioCfg.internals |= PI_CFG_STATS; gpioStats.shortPipeWrite++; DBG(DBG_ALWAYS, "emitted %d, asked for %d", err/sizeof(gpioReport_t), emit); @@ -7505,7 +7541,7 @@ static void initReleaseResources(void) int initInitialise(void) { - int rev, i; + int rev, i, model; struct sockaddr_in server; char * portStr; unsigned port; @@ -7531,11 +7567,32 @@ int initInitialise(void) if (!gpioMaskSet) { - if (rev == 0) gpioMask = PI_DEFAULT_UPDATE_MASK_R0; + if (rev == 0) gpioMask = PI_DEFAULT_UPDATE_MASK_UNKNOWN; else if (rev == 17) gpioMask = PI_DEFAULT_UPDATE_MASK_COMPUTE; - else if (rev < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_R1; - else if (rev < 16) gpioMask = PI_DEFAULT_UPDATE_MASK_R2; - else gpioMask = PI_DEFAULT_UPDATE_MASK_R3; + else if (rev < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_B1; + else if (rev < 16) gpioMask = PI_DEFAULT_UPDATE_MASK_A_B2; + else + { + model = (rev >> 4) & 0xFF; + + /* model + 0=A 1=B + 2=A+ 3=B+ + 4=Pi2B + 5=Alpha + 6=Compute Module + 7=Unknown + 8=Pi3B + 9=Zero + */ + if (model < 2) gpioMask = PI_DEFAULT_UPDATE_MASK_A_B2; + else if (model < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_APLUS_BPLUS; + else if (model == 4) gpioMask = PI_DEFAULT_UPDATE_MASK_PI2B; + else if (model == 6) gpioMask = PI_DEFAULT_UPDATE_MASK_COMPUTE; + else if (model == 8) gpioMask = PI_DEFAULT_UPDATE_MASK_PI3B; + else if (model == 9) gpioMask = PI_DEFAULT_UPDATE_MASK_ZERO; + else gpioMask = PI_DEFAULT_UPDATE_MASK_UNKNOWN; + } gpioMaskSet = 1; } @@ -9118,7 +9175,7 @@ int gpioWaveChain(char *buf, unsigned bufSize) int cb, chaincb; rawCbs_t *p; int i, wid, cmd, loop, counters; - unsigned cycles; + unsigned cycles, delayCBs, dcb, delayLeft; uint32_t repeat, next, *endPtr; int stk_pos[10], stk_lev=0; @@ -9159,7 +9216,7 @@ int gpioWaveChain(char *buf, unsigned bufSize) } p->src = (uint32_t) (&dmaOBus[0]->periphData); - p->length = 4 * 20 / PI_WF_MICROS; /* 20 micros delay */ + p->length = BPD * 20 / PI_WF_MICROS; /* 20 micros delay */ p->next = waveCbPOadr(chainGetCB(cb)); counters = 0; @@ -9275,29 +9332,45 @@ int gpioWaveChain(char *buf, unsigned bufSize) if (cycles) { - chaincb = chainGetCB(cb++); - - if (chaincb < 0) - SOFT_ERROR(PI_CHAIN_TOO_BIG, "chain is too long (%d)", cb); - - p = rawWaveCBAdr(chaincb); - - /* use the secondary clock */ - - if (gpioCfg.clockPeriph != PI_CLOCK_PCM) + delayLeft = cycles; + delayCBs = waveDelayCBs(delayLeft); + for (dcb=0; dcbinfo = NORMAL_DMA | TIMED_DMA(2); - p->dst = PCM_TIMER; - } - else - { - p->info = NORMAL_DMA | TIMED_DMA(5); - p->dst = PWM_TIMER; - } + chaincb = chainGetCB(cb++); - p->src = (uint32_t) (&dmaOBus[0]->periphData); - p->length = 4 * cycles / PI_WF_MICROS; - p->next = waveCbPOadr(chainGetCB(cb)); + if (chaincb < 0) + SOFT_ERROR( + PI_CHAIN_TOO_BIG, "chain is too long (%d)", cb); + + p = rawWaveCBAdr(chaincb); + + /* use the secondary clock */ + + if (gpioCfg.clockPeriph != PI_CLOCK_PCM) + { + p->info = NORMAL_DMA | TIMED_DMA(2); + p->dst = PCM_TIMER; + } + else + { + p->info = NORMAL_DMA | TIMED_DMA(5); + p->dst = PWM_TIMER; + } + + p->src = (uint32_t) (&dmaOBus[0]->periphData); + + p->length = BPD * delayLeft / PI_WF_MICROS; + + if ((gpioCfg.DMAsecondaryChannel >= DMA_LITE_FIRST) && + (p->length > DMA_LITE_MAX)) + { + p->length = DMA_LITE_MAX; + } + + delayLeft -= (p->length / BPD); + + p->next = waveCbPOadr(chainGetCB(cb)); + } } } else if (cmd == 3) /* repeat loop forever */ @@ -11506,6 +11579,28 @@ unsigned gpioVersion(void) /* ----------------------------------------------------------------------- */ +/* +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 +5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + +W W S M M M B B B B P P P P T T T T T T T T R R R R + +W warranty void if either bit is set + +S 0=old (bits 0-22 are revision number) 1=new (following fields apply) + +M 0=256 1=512 2=1024 + +B 0=Sony 1=Egoman 2=Embest 3=Unknown 4=Embest + +P 0=2835, 1=2836, 2=2837 + +T 0=A 1=B 2=A+ 3=B+ 4=Pi2B 5=Alpha 6=Compute Module 7=Unknown 8=Pi3B 9=Zero + +R PCB board revision + +*/ + unsigned gpioHardwareRevision(void) { static unsigned rev = 0; @@ -11513,13 +11608,12 @@ 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; + piCores = 0; filp = fopen ("/proc/cpuinfo", "r"); @@ -11527,22 +11621,27 @@ unsigned gpioHardwareRevision(void) { while (fgets(buf, sizeof(buf), filp) != NULL) { - if (piModel == 0) + if (piCores == 0) { if (!strncasecmp("model name", buf, 10)) { if (strstr (buf, "ARMv6") != NULL) { - piModel = 1; - chars = 4; + piCores = 1; pi_peri_phys = 0x20000000; pi_dram_bus = 0x40000000; pi_mem_flag = 0x0C; } else if (strstr (buf, "ARMv7") != NULL) { - piModel = 2; - chars = 6; + piCores = 4; + pi_peri_phys = 0x3F000000; + pi_dram_bus = 0xC0000000; + pi_mem_flag = 0x04; + } + else if (strstr (buf, "ARMv8") != NULL) + { + piCores = 4; pi_peri_phys = 0x3F000000; pi_dram_bus = 0xC0000000; pi_mem_flag = 0x04; @@ -11550,10 +11649,9 @@ unsigned gpioHardwareRevision(void) } } - if (!strncasecmp("revision", buf, 8)) + if (!strncasecmp("revision\t:", buf, 10)) { - if (sscanf(buf+strlen(buf)-(chars+1), - "%x%c", &rev, &term) == 2) + if (sscanf(buf+10, "%x%c", &rev, &term) == 2) { if (term != '\n') rev = 0; } @@ -11633,11 +11731,12 @@ int gpioCfgDMAchannels(unsigned primaryChannel, unsigned secondaryChannel) CHECK_NOT_INITED; - if (primaryChannel > PI_MAX_PRIMARY_CHANNEL) + if (primaryChannel > PI_MAX_DMA_CHANNEL) SOFT_ERROR(PI_BAD_PRIM_CHANNEL, "bad primary channel (%d)", primaryChannel); - if (secondaryChannel > PI_MAX_SECONDARY_CHANNEL) + if ((secondaryChannel > PI_MAX_DMA_CHANNEL) || + (secondaryChannel == primaryChannel)) SOFT_ERROR(PI_BAD_SECO_CHANNEL, "bad secondary channel (%d)", secondaryChannel); diff --git a/pigpio.h b/pigpio.h index b759488..7cbf9b7 100644 --- a/pigpio.h +++ b/pigpio.h @@ -31,7 +31,7 @@ For more information, please refer to #include #include -#define PIGPIO_VERSION 47 +#define PIGPIO_VERSION 48 /*TEXT @@ -726,9 +726,6 @@ typedef void *(gpioThreadFunc_t) (void *); #define PI_MIN_DMA_CHANNEL 0 #define PI_MAX_DMA_CHANNEL 14 -#define PI_MAX_PRIMARY_CHANNEL 14 -#define PI_MAX_SECONDARY_CHANNEL 6 - /* port */ #define PI_MIN_SOCKET_PORT 1024 @@ -3705,11 +3702,22 @@ Configures pigpio to use the specified DMA channels. . . primaryChannel: 0-14 -secondaryChannel: 0-6 +secondaryChannel: 0-14 . . The default setting is to use channel 14 for the primary channel and -channel 5 for the secondary channel. +channel 6 for the secondary channel. + +The secondary channel is only used for the transmission of waves. + +If possible use one of channels 0 to 6 for the secondary channel +(a full channel). + +A full channel only requires one DMA control block regardless of the +length of a pulse delay. Channels 7 to 14 (lite channels) require +one DMA control block for each 16383 microseconds of delay. I.e. +a 10 second pulse delay requires one control block on a full channel +and 611 control blocks on a lite channel. D*/ @@ -3723,13 +3731,14 @@ GPIO specified by the mask. updateMask: bit (1< */ /* -This version is for pigpio version 43+ +This version is for pigpio version 48+ */ #include @@ -90,7 +90,7 @@ void usage() " -b value, gpio sample buffer in milliseconds, default 120\n" \ " -c value, library internal settings, default 0\n" \ " -d value, primary DMA channel, 0-14, default 14\n" \ - " -e value, secondary DMA channel, 0-6, default 5\n" \ + " -e value, secondary DMA channel, 0-14, default 6\n" \ " -f, disable fifo interface, default enabled\n" \ " -k, disable socket interface, default enabled\n" \ " -l, localhost socket only default all interfaces\n" \ @@ -149,14 +149,14 @@ static void initOpts(int argc, char *argv[]) case 'd': i = getNum(optarg, &err); - if ((i >= PI_MIN_DMA_CHANNEL) && (i <= PI_MAX_PRIMARY_CHANNEL)) + if ((i >= PI_MIN_DMA_CHANNEL) && (i <= PI_MAX_DMA_CHANNEL)) DMAprimaryChannel = i; else fatal("invalid -d option (%d)", i); break; case 'e': i = getNum(optarg, &err); - if ((i >= PI_MIN_DMA_CHANNEL) && (i <= PI_MAX_SECONDARY_CHANNEL)) + if ((i >= PI_MIN_DMA_CHANNEL) && (i <= PI_MAX_DMA_CHANNEL)) DMAsecondaryChannel = i; else fatal("invalid -e option (%d)", i); break; diff --git a/setup.py b/setup.py index e7ae279..16a18fa 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from distutils.core import setup setup(name='pigpio', - version='1.29', + version='1.30', author='joan', author_email='joan@abyz.co.uk', maintainer='joan', diff --git a/x_pigpio.c b/x_pigpio.c index 50212b0..5431301 100644 --- a/x_pigpio.c +++ b/x_pigpio.c @@ -1,5 +1,5 @@ /* -gcc -o x_pigpio x_pigpio.c -lpigpio -lrt -lpthread +gcc -Wall -pthread -o x_pigpio x_pigpio.c -lpigpio sudo ./x_pigpio *** WARNING ************************************************ @@ -45,7 +45,7 @@ void CHECK(int t, int st, int got, int expect, int pc, char *desc) void t0() { - printf("Version.\n"); + printf("\nTesting pigpio C I/F\n"); printf("pigpio version %d.\n", gpioVersion()); @@ -392,7 +392,8 @@ To the lascivious pleasing of a lute.\n\ wid = gpioWaveCreate(); e = gpioWaveTxSend(wid, PI_WAVE_MODE_REPEAT); - CHECK(5, 3, e, 9, 0, "wave tx repeat"); + if (e < 14) CHECK(5, 3, e, 9, 0, "wave tx repeat"); + else CHECK(5, 3, e, 19, 0, "wave tx repeat"); oc = t5_count; time_sleep(5); @@ -413,7 +414,8 @@ To the lascivious pleasing of a lute.\n\ wid = gpioWaveCreate(); e = gpioWaveTxSend(wid, PI_WAVE_MODE_ONE_SHOT); - CHECK(5, 8, e, 6811, 0, "wave tx start"); + if (e < 6964) CHECK(5, 8, e, 6811, 0, "wave tx start"); + else CHECK(5, 8, e, 7116, 0, "wave tx start"); CHECK(5, 9, 0, 0, 0, "NOT APPLICABLE"); @@ -447,10 +449,12 @@ To the lascivious pleasing of a lute.\n\ CHECK(5, 18, c, 12000, 0, "wave get max pulses"); c = gpioWaveGetCbs(); - CHECK(5, 19, c, 6810, 0, "wave get cbs"); + if (e < 6963) CHECK(5, 19, c, 6810, 0, "wave get cbs"); + else CHECK(5, 19, c, 7115, 0, "wave get cbs"); c = gpioWaveGetHighCbs(); - CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + if (e < 6963) CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + else CHECK(5, 20, c, 7115, 0, "wave get high cbs"); c = gpioWaveGetMaxCbs(); CHECK(5, 21, c, 25016, 0, "wave get max cbs"); diff --git a/x_pigpio.py b/x_pigpio.py index 9136f48..37459d3 100755 --- a/x_pigpio.py +++ b/x_pigpio.py @@ -45,14 +45,14 @@ def CHECK(t, st, got, expect, pc, desc): def t0(): - print("Version.") + print("\nTesting pigpio Python module {}".format(pigpio.VERSION)) + + print("Python {}".format(sys.version.replace("\n", " "))) print("pigpio version {}.".format(pi.get_pigpio_version())) print("Hardware revision {}.".format(pi.get_hardware_revision())) - print("Python version {}.".format(sys.version.replace("\n", " "))) - def t1(): print("Mode/PUD/read/write tests.") @@ -361,7 +361,10 @@ To the lascivious pleasing of a lute. wid = pi.wave_create() e = pi.wave_send_repeat(wid) - CHECK(5, 3, e, 9, 0, "wave send repeat") + if e < 14: + CHECK(5, 3, e, 9, 0, "wave send repeat") + else: + CHECK(5, 3, e, 19, 0, "wave send repeat") oc = t5_count time.sleep(5) @@ -380,7 +383,10 @@ To the lascivious pleasing of a lute. wid = pi.wave_create() e = pi.wave_send_once(wid) - CHECK(5, 8, e, 6811, 0, "wave send once") + if e < 6964: + CHECK(5, 8, e, 6811, 0, "wave send once") + else: + CHECK(5, 8, e, 7116, 0, "wave send once") oc = t5_count time.sleep(3) @@ -417,7 +423,10 @@ To the lascivious pleasing of a lute. CHECK(5, 18, c, 12000, 0, "wave get max pulses") c = pi.wave_get_cbs() - CHECK(5, 19, c, 6810, 0, "wave get cbs") + if c < 6963: + CHECK(5, 19, c, 6810, 0, "wave get cbs") + else: + CHECK(5, 19, c, 7115, 0, "wave get cbs") CHECK(5, 20, 0, 0, 0, "NOT APPLICABLE") @@ -434,7 +443,10 @@ To the lascivious pleasing of a lute. CHECK(5, 24, w1, 0, 0, "wave create") e = pi.wave_send_repeat(w1) - CHECK(5, 25, e, 9, 0, "wave send repeat") + if e < 14: + CHECK(5, 25, e, 9, 0, "wave send repeat") + else: + CHECK(5, 25, e, 19, 0, "wave send repeat") oc = t5_count time.sleep(5) @@ -451,7 +463,10 @@ To the lascivious pleasing of a lute. CHECK(5, 29, w2, 1, 0, "wave create") e = pi.wave_send_once(w2) - CHECK(5, 30, e, 6811, 0, "wave send once") + if e < 6964: + CHECK(5, 30, e, 6811, 0, "wave send once") + else: + CHECK(5, 30, e, 7116, 0, "wave send once") oc = t5_count time.sleep(3) diff --git a/x_pigpiod_if.c b/x_pigpiod_if.c index df2af4b..cc58d2f 100644 --- a/x_pigpiod_if.c +++ b/x_pigpiod_if.c @@ -1,5 +1,5 @@ /* -gcc -o x_pigpiod_if x_pigpiod_if.c -lpigpiod_if -lrt -lpthread +gcc -Wall -pthread -o x_pigpiod_if x_pigpiod_if.c -lpigpiod_if ./x_pigpiod_if *** WARNING ************************************************ @@ -42,7 +42,7 @@ void CHECK(int t, int st, int got, int expect, int pc, char *desc) void t0() { - printf("Version.\n"); + printf("\nTesting pigpiod C I/F 1\n"); printf("pigpio version %d.\n", get_pigpio_version()); @@ -360,7 +360,8 @@ To the lascivious pleasing of a lute.\n\ wid = wave_create(); e = wave_send_repeat(wid); - CHECK(5, 3, e, 9, 0, "wave tx repeat"); + if (e < 14) CHECK(5, 3, e, 9, 0, "wave tx repeat"); + else CHECK(5, 3, e, 19, 0, "wave tx repeat"); oc = t5_count; time_sleep(5.05); @@ -379,7 +380,8 @@ To the lascivious pleasing of a lute.\n\ wid = wave_create(); e = wave_send_once(wid); - CHECK(5, 8, e, 6811, 0, "wave tx start"); + if (e < 6964) CHECK(5, 8, e, 6811, 0, "wave tx start"); + else CHECK(5, 8, e, 7116, 0, "wave tx start"); oc = t5_count; time_sleep(3); @@ -419,10 +421,12 @@ To the lascivious pleasing of a lute.\n\ CHECK(5, 18, c, 12000, 0, "wave get max pulses"); c = wave_get_cbs(); - CHECK(5, 19, c, 6810, 0, "wave get cbs"); + if (c < 6963) CHECK(5, 19, c, 6810, 0, "wave get cbs"); + else CHECK(5, 19, c, 7115, 0, "wave get cbs"); c = wave_get_high_cbs(); - CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + if (c < 6963) CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + else CHECK(5, 20, c, 7115, 0, "wave get high cbs"); c = wave_get_max_cbs(); CHECK(5, 21, c, 25016, 0, "wave get max cbs"); diff --git a/x_pigpiod_if2.c b/x_pigpiod_if2.c index 5e18469..8747c1a 100644 --- a/x_pigpiod_if2.c +++ b/x_pigpiod_if2.c @@ -1,5 +1,5 @@ /* -gcc -o x_pigpiod_if2 x_pigpiod_if2.c -lpigpiod_if2 -lpthread +gcc -Wall -pthread -o x_pigpiod_if2 x_pigpiod_if2.c -lpigpiod_if2 ./x_pigpiod_if2 *** WARNING ************************************************ @@ -42,7 +42,7 @@ void CHECK(int t, int st, int got, int expect, int pc, char *desc) void t0(int pi) { - printf("Version.\n"); + printf("\nTesting pigpiod C I/F 2\n"); printf("pigpio version %d.\n", get_pigpio_version(pi)); @@ -364,7 +364,8 @@ To the lascivious pleasing of a lute.\n\ wid = wave_create(pi); e = wave_send_repeat(pi, wid); - CHECK(5, 3, e, 9, 0, "wave tx repeat"); + if (e < 14) CHECK(5, 3, e, 9, 0, "wave tx repeat"); + else CHECK(5, 3, e, 19, 0, "wave tx repeat"); oc = t5_count; time_sleep(5.05); @@ -383,7 +384,8 @@ To the lascivious pleasing of a lute.\n\ wid = wave_create(pi); e = wave_send_once(pi, wid); - CHECK(5, 8, e, 6811, 0, "wave tx start"); + if (e < 6964) CHECK(5, 8, e, 6811, 0, "wave tx start"); + else CHECK(5, 8, e, 7116, 0, "wave tx start"); oc = t5_count; time_sleep(3); @@ -423,10 +425,12 @@ To the lascivious pleasing of a lute.\n\ CHECK(5, 18, c, 12000, 0, "wave get max pulses"); c = wave_get_cbs(pi); - CHECK(5, 19, c, 6810, 0, "wave get cbs"); + if (c < 6963) CHECK(5, 19, c, 6810, 0, "wave get cbs"); + else CHECK(5, 19, c, 7115, 0, "wave get cbs"); c = wave_get_high_cbs(pi); - CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + if (c < 6963) CHECK(5, 20, c, 6810, 0, "wave get high cbs"); + else CHECK(5, 20, c, 7115, 0, "wave get high cbs"); c = wave_get_max_cbs(pi); CHECK(5, 21, c, 25016, 0, "wave get max cbs"); diff --git a/x_pigs b/x_pigs index adaa1eb..1435493 100755 --- a/x_pigs +++ b/x_pigs @@ -19,7 +19,8 @@ GPIO=25 # of tests indicate a problem. # -echo "Testing pigs I/F" +echo +echo "Testing pigpio pigs" s=$(pigs pigpv) echo "pigpio version $s" @@ -250,8 +251,13 @@ s=$(pigs wvag 16 0 5000000 0 16 5000000) if [[ $s = 310 ]]; then echo "WVAG ok"; else echo "WVAG fail ($s)"; fi w=$(pigs wvcre) if [[ $w -ge 0 ]]; then echo "WVCRE ok"; else echo "WVCRE fail ($s)"; fi + s=$(pigs wvtx $w) -if [[ $s = 621 ]]; then echo "WVTX ok"; else echo "WVTX fail ($s)"; fi +if [[ ($s = 621) || ($s = 1137) ]] +then echo "WVTX ok" +else echo "WVTX fail ($s)" +fi + s=$(pigs wvbsy) if [[ $s = 1 ]]; then echo "WVBSY-a ok"; else echo "WVBSY-a fail ($s)"; fi sleep 1 @@ -262,7 +268,11 @@ if [[ $s = "" ]]; then echo "WVHLT ok"; else echo "WVHLT fail ($s)"; fi s=$(pigs wvbsy) if [[ $s = 0 ]]; then echo "WVBSY-c ok"; else echo "WVBSY-c fail ($s)"; fi s=$(pigs wvtxr $w) -if [[ $s = 621 ]]; then echo "WVTXR ok"; else echo "WVTXR fail ($s)"; fi +if [[ ($s = 621) || ($s = 1137) ]] +then echo "WVTXR ok" +else echo "WVTXR fail ($s)" +fi + s=$(pigs wvbsy) if [[ $s = 1 ]]; then echo "WVBSY-d ok"; else echo "WVBSY-d fail ($s)"; fi s=$(pigs wvhlt) @@ -271,7 +281,11 @@ s=$(pigs wvbsy) if [[ $s = 0 ]]; then echo "WVBSY-e ok"; else echo "WVBSY-e fail ($s)"; fi s=$(pigs wvsc 0) -if [[ $s = 620 ]]; then echo "WVSC-a ok"; else echo "WVSC-a fail ($s)"; fi +if [[ ($s = 620) || ($s = 933) ]] +then echo "WVSC-a ok" +else echo "WVSC-a fail ($s)" +fi + s=$(pigs wvsc 1) if [[ $s -ge 620 ]]; then echo "WVSC-b ok"; else echo "WVSC-b fail ($s)"; fi s=$(pigs wvsc 2) diff --git a/x_pipe b/x_pipe index 4b39afc..b74f523 100755 --- a/x_pipe +++ b/x_pipe @@ -18,7 +18,8 @@ GPIO=25 # of tests indicate a problem. # -echo "Testing pipe I/F" +echo +echo "Testing pigpio pipe I/F" echo "pigpv" >/dev/pigpio read -t 1 s /dev/pigpio read -t 1 s /dev/pigpio read -t 1 s /dev/pigpio read -t 1 s /dev/pigpio read -t 1 s /dev/pigpio read -t 1 s /dev/pigpio read -t 1 s