diff --git a/pigpio.c b/pigpio.c
index 24fe287..409b981 100644
--- a/pigpio.c
+++ b/pigpio.c
@@ -25,7 +25,7 @@ OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to
*/
-/* pigpio version 73 */
+/* pigpio version 74 */
/* include ------------------------------------------------------- */
@@ -3242,7 +3242,7 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
unsigned numIn2, numOut;
- uint32_t tNow, tNext1, tNext2, tDelay;
+ uint32_t tNow, tNext1, tNext2, tDelay, tMax;
rawWave_t *in2, *out;
@@ -3253,6 +3253,7 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
out = wf[1-wfcur];
tNow = 0;
+ tMax = 0;
if (!numIn1) tNext1 = -1; else tNext1 = 0;
if (!numIn2) tNext2 = -1; else tNext2 = 0;
@@ -3275,6 +3276,7 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
out[outPos].flags = in1[inPos1].flags;
tNext1 = tNow + in1[inPos1].usDelay; ++inPos1;
+ if (tMax < tNext1) tMax = tNext1;
}
else if (tNext2 < tNext1)
{
@@ -3292,6 +3294,7 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
out[outPos].flags = in2[inPos2].flags;
tNext2 = tNow + in2[inPos2].usDelay; ++inPos2;
+ if (tMax < tNext2) tMax = tNext2;
}
else
{
@@ -3310,6 +3313,8 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
tNext1 = tNow + in1[inPos1].usDelay; ++inPos1;
tNext2 = tNow + in2[inPos2].usDelay; ++inPos2;
+ if (tMax < tNext1) tMax = tNext1;
+ if (tMax < tNext2) tMax = tNext2;
}
if (tNext1 <= tNext2) { tDelay = tNext1 - tNow; tNow = tNext1; }
@@ -3342,6 +3347,13 @@ int rawWaveAddGeneric(unsigned numIn1, rawWave_t *in1)
}
+ if (tNow < tMax)
+ {
+ /* extend previous delay */
+ out[outPos-1].usDelay += (tMax - tNow);
+ tNow = tMax;
+ }
+
if ((outPos < numOut) && (outPos < level))
{
wfStats.micros = tNow;
@@ -8159,7 +8171,8 @@ static void initReleaseResources(void)
int initInitialise(void)
{
- int rev, i, model;
+ int i;
+ unsigned rev, model;
struct sockaddr_in server;
struct sockaddr_in6 server6;
char * portStr;
@@ -8207,13 +8220,27 @@ int initInitialise(void)
7=Unknown
8=Pi3B
9=Zero
+ 12=Zero W
+ 13=Pi3B+
+ 14=Pi3A+
+ 17=Pi4B
*/
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 if (model == 6
+ || model ==10
+ || model ==16) gpioMask = PI_DEFAULT_UPDATE_MASK_COMPUTE;
+
+ else if (model == 8
+ || model ==13
+ || model ==14) gpioMask = PI_DEFAULT_UPDATE_MASK_PI3B;
+
+ else if (model == 9
+ || model ==12) gpioMask = PI_DEFAULT_UPDATE_MASK_ZERO;
+
+ else if (model ==17) gpioMask = PI_DEFAULT_UPDATE_MASK_PI4B;
else gpioMask = PI_DEFAULT_UPDATE_MASK_UNKNOWN;
}
@@ -8292,7 +8319,7 @@ int initInitialise(void)
}
server6.sin6_port = htons(port);
- int opt;
+ int opt = 1;
setsockopt(fdSock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (bind(fdSock,(struct sockaddr *)&server6, sizeof(server6)) < 0)
SOFT_ERROR(PI_INIT_FAILED, "bind to port %d failed (%m)", port);
@@ -8307,7 +8334,7 @@ int initInitialise(void)
SOFT_ERROR(PI_INIT_FAILED, "socket failed (%m)");
else
{
- int opt;
+ int opt = 1;
setsockopt(fdSock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
}
server.sin_family = AF_INET;
@@ -13431,13 +13458,14 @@ 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
+M 0=256 1=512 2=1024 3=2GB 4=4GB
-B 0=Sony 1=Egoman 2=Embest 3=Unknown 4=Embest
+B 0=Sony 1=Egoman 2=Embest 3=Sony Japan 4=Embest 5=Stadium
-P 0=2835, 1=2836, 2=2837
+P 0=2835, 1=2836, 2=2837 3=2711
-T 0=A 1=B 2=A+ 3=B+ 4=Pi2B 5=Alpha 6=Compute Module 7=Unknown 8=Pi3B 9=Zero
+T 0=A 1=B 2=A+ 3=B+ 4=Pi2B 5=Alpha 6=CM1 8=Pi3B 9=Zero a=CM3 c=Zero W
+ d=3B+ e=3A+ 10=CM3+ 11=4B
R PCB board revision
@@ -13455,157 +13483,119 @@ unsigned gpioHardwareRevision(void)
if (rev) return rev;
- piCores = 0;
-
filp = fopen ("/proc/cpuinfo", "r");
+
if (filp != NULL)
{
while (fgets(buf, sizeof(buf), filp) != NULL)
{
- if (piCores == 0)
- {
- if (!strncasecmp("model name", buf, 10))
- {
- if (strstr (buf, "ARMv6") != NULL)
- {
- piCores = 1;
- pi_peri_phys = 0x20000000;
- pi_dram_bus = 0x40000000;
- pi_mem_flag = 0x0C;
- }
- else if (strstr (buf, "ARMv7") != NULL)
- {
- 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;
- }
- }
- }
-
- if (!strncasecmp("hardware\t: BCM", buf, 14))
- {
- int bcmno = atoi(buf+14);
- if ((bcmno == 2708) ||
- (bcmno == 2709) ||
- (bcmno == 2710) ||
- (bcmno == 2835) ||
- (bcmno == 2836) ||
- (bcmno == 2837))
- {
- pi_ispi = 1;
- }
- }
-
if (!strncasecmp("revision\t:", buf, 10))
{
if (sscanf(buf+10, "%x%c", &rev, &term) == 2)
{
if (term != '\n') rev = 0;
- else rev &= 0xFFFFFF; /* mask out warranty bit */
- switch (rev&0xFFF0) /* just interested in BCM model */
- {
- case 0x3110: /* Pi4B */
- piCores = 4;
- pi_peri_phys = 0xFE000000;
- pi_dram_bus = 0xC0000000;
- pi_mem_flag = 0x04;
- pi_is_2711 = 1;
- pi_ispi = 1;
- clk_osc_freq = CLK_OSC_FREQ_2711;
- clk_plld_freq = CLK_PLLD_FREQ_2711;
- hw_pwm_max_freq = PI_HW_PWM_MAX_FREQ_2711;
- hw_clk_min_freq = PI_HW_CLK_MIN_FREQ_2711;
- hw_clk_max_freq = PI_HW_CLK_MAX_FREQ_2711;
-
- fclose(filp);
- if (!gpioMaskSet)
- {
- gpioMaskSet = 1;
- gpioMask = PI_DEFAULT_UPDATE_MASK_PI4B;
- }
- return rev;
- break;
- }
}
}
}
-
fclose(filp);
+ }
- /*
- Raspberry pi 3 running arm64 don't put all the
- information we need in /proc/cpuinfo, but we can
- get it elsewhere.
- */
+ /* (some) arm64 operating systems get revision number here */
- if (!pi_ispi)
+ if (rev == 0)
+ {
+ DBG(DBG_USER, "searching /proc/device-tree for revision");
+ filp = fopen ("/proc/device-tree/system/linux,revision", "r");
+
+ if (filp != NULL)
{
- filp = fopen ("/proc/device-tree/model", "r");
- if (filp != NULL)
+ uint32_t tmp;
+ if (fread(&tmp,1 , 4, filp) == 4)
{
- if (fgets(buf, sizeof(buf), filp) != NULL)
- {
- if (!strncmp("Raspberry Pi 3", buf, 14))
- {
- pi_ispi = 1;
- piCores = 4;
- pi_peri_phys = 0x3F000000;
- pi_dram_bus = 0xC0000000;
- pi_mem_flag = 0x04;
- }
- else if (!strncmp("Raspberry Pi 4 Model B", buf, 22))
- {
- pi_ispi = 1;
- piCores = 4;
- pi_peri_phys = 0xFE000000;
- pi_dram_bus = 0xC0000000;
- pi_mem_flag = 0x04;
- pi_is_2711 = 1;
- clk_osc_freq = CLK_OSC_FREQ_2711;
- clk_plld_freq = CLK_PLLD_FREQ_2711;
- hw_pwm_max_freq = PI_HW_PWM_MAX_FREQ_2711;
- hw_clk_min_freq = PI_HW_CLK_MIN_FREQ_2711;
- hw_clk_max_freq = PI_HW_CLK_MAX_FREQ_2711;
- if (!gpioMaskSet)
- {
- gpioMaskSet = 1;
- gpioMask = PI_DEFAULT_UPDATE_MASK_PI4B;
- }
- }
- }
- fclose(filp);
+ /*
+ for some reason the value returned by reading
+ this /proc entry seems to be big endian,
+ convert it.
+ */
+ rev = ntohl(tmp);
+ rev &= 0xFFFFFF; /* mask out warranty bit */
}
}
+ fclose(filp);
+ }
- if (rev == 0)
+ piCores = 0;
+ pi_ispi = 0;
+ rev &= 0xFFFFFF; /* mask out warranty bit */
+
+ /* Decode revision code */
+
+ if ((rev & 0x800000) == 0) /* old rev code */
+ {
+ if (rev < 0x0016) /* all BCM2835 */
{
- filp = fopen ("/proc/device-tree/system/linux,revision", "r");
- if (filp != NULL)
- {
- uint32_t tmp;
- if (fread(&tmp,1 , 4, filp) == 4)
- {
- /*
- for some reason the value returned by reading
- this /proc entry seems to be big endian,
- convert it.
- */
- rev = ntohl(tmp);
- rev &= 0xFFFFFF; /* mask out warranty bit */
- }
- }
- fclose(filp);
+ pi_ispi = 1;
+ piCores = 1;
+ pi_peri_phys = 0x20000000;
+ pi_dram_bus = 0x40000000;
+ pi_mem_flag = 0x0C;
+ }
+ else
+ {
+ DBG(DBG_ALWAYS, "unknown revision=%x", rev);
+ rev = 0;
}
}
+ else /* new rev code */
+ {
+ switch ((rev >> 12) & 0xF) /* just interested in BCM model */
+ {
+
+ case 0x0: /* BCM2835 */
+ pi_ispi = 1;
+ piCores = 1;
+ pi_peri_phys = 0x20000000;
+ pi_dram_bus = 0x40000000;
+ pi_mem_flag = 0x0C;
+ break;
+
+ case 0x1: /* BCM2836 */
+ case 0x2: /* BCM2837 */
+ pi_ispi = 1;
+ piCores = 4;
+ pi_peri_phys = 0x3F000000;
+ pi_dram_bus = 0xC0000000;
+ pi_mem_flag = 0x04;
+ break;
+
+ case 0x3: /* BCM2711 */
+ pi_ispi = 1;
+ piCores = 4;
+ pi_peri_phys = 0xFE000000;
+ pi_dram_bus = 0xC0000000;
+ pi_mem_flag = 0x04;
+ pi_is_2711 = 1;
+ clk_osc_freq = CLK_OSC_FREQ_2711;
+ clk_plld_freq = CLK_PLLD_FREQ_2711;
+ hw_pwm_max_freq = PI_HW_PWM_MAX_FREQ_2711;
+ hw_clk_min_freq = PI_HW_CLK_MIN_FREQ_2711;
+ hw_clk_max_freq = PI_HW_CLK_MAX_FREQ_2711;
+ break;
+
+ default:
+ DBG(DBG_ALWAYS, "unknown rev code (%x)", rev);
+ rev=0;
+ pi_ispi = 0;
+ break;
+ }
+ }
+
+ DBG(DBG_USER, "revision=%x", rev);
+ DBG(DBG_USER, "pi_peri_phys=%x", pi_peri_phys);
+ DBG(DBG_USER, "pi_dram_bus=%x", pi_dram_bus);
+ DBG(DBG_USER, "pi_mem_flag=%x", pi_mem_flag);
+
return rev;
}
diff --git a/pigpio.h b/pigpio.h
index b6547e3..9f12497 100644
--- a/pigpio.h
+++ b/pigpio.h
@@ -30,7 +30,7 @@ For more information, please refer to
#include
#include
-#define PIGPIO_VERSION 73
+#define PIGPIO_VERSION 74
/*TEXT