From 5847d5c0991ba3d8b00fe11125aca5f74f72bc9d Mon Sep 17 00:00:00 2001 From: Alexander Simon Date: Wed, 7 Aug 2019 13:36:37 +0200 Subject: [PATCH 1/2] Add support for RPi4 Model B running arm64 Linux --- pigpio.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pigpio.c b/pigpio.c index a41a3d7..6dba0d8 100644 --- a/pigpio.c +++ b/pigpio.c @@ -13528,6 +13528,25 @@ unsigned gpioHardwareRevision(void) 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); From 55d8b880fca26ccf4b897bca1fe66796b9972345 Mon Sep 17 00:00:00 2001 From: Alexander Simon Date: Wed, 7 Aug 2019 13:39:18 +0200 Subject: [PATCH 2/2] Fix network communication on arm64 Base messages consist of four uint32 integers. Wrongly, integers are declared as a four-element uintptr_t array. The 16 bytes are written directly by recv(). This works great for arm32, but on arm64 uintptr_t is 64 bit (8 bytes). This patch reads four 32-bit integers and writes them into the uintptr_t array. --- pigpio.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pigpio.c b/pigpio.c index 6dba0d8..d78afd6 100644 --- a/pigpio.c +++ b/pigpio.c @@ -6953,6 +6953,7 @@ static void *pthSocketThreadHandler(void *fdC) { int sock = *(int*)fdC; uintptr_t p[10]; + uint32_t tmp; int opt; char buf[CMD_MAX_EXTENSION]; @@ -6964,7 +6965,21 @@ static void *pthSocketThreadHandler(void *fdC) while (1) { - if (recv(sock, p, 16, MSG_WAITALL) != 16) break; + if (sizeof(uintptr_t) == 8) + { + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[0] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[1] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[2] = (uintptr_t)tmp; + if (recv(sock, &tmp, 4, MSG_WAITALL) != 4) break; + p[3] = (uintptr_t)tmp; + } + else + { + if (recv(sock, p, 16, MSG_WAITALL) != 16) break; + } if (p[3]) {