From 5de98ed56ce11fefd5122bad5ed504b384ba0fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 12 Mar 2023 22:27:26 +0100 Subject: [PATCH] [realtek-ambz] Selectively update GCC to v10.3.1 --- builder/frameworks/realtek-ambz-sdk.py | 2 + platform.json | 15 +++--- platform.py | 44 +++++++++++++--- platform/realtek-ambz/fixups/cmsis.h | 50 +++++++++++++++++++ platform/realtek-ambz/fixups/machine/endian.h | 21 ++++++++ 5 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 platform/realtek-ambz/fixups/cmsis.h create mode 100644 platform/realtek-ambz/fixups/machine/endian.h diff --git a/builder/frameworks/realtek-ambz-sdk.py b/builder/frameworks/realtek-ambz-sdk.py index 328cefe..6c81a32 100644 --- a/builder/frameworks/realtek-ambz-sdk.py +++ b/builder/frameworks/realtek-ambz-sdk.py @@ -35,6 +35,7 @@ env.Append( "-MMD", "-fno-exceptions", "-fno-rtti", + "-Wno-psabi", ], CPPDEFINES=[ # LibreTuya configuration @@ -49,6 +50,7 @@ env.Append( ("ERRNO", "1"), # for LwIP "MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED", # enable PSK in mbedTLS # "MBEDTLS_DEBUG_C", + "MBED_PERIPHERALNAMES_H", # see fixups/cmsis.h ], LINKFLAGS=[ "-mcpu=cortex-m4", diff --git a/platform.json b/platform.json index 380f9ed..f95acd5 100644 --- a/platform.json +++ b/platform.json @@ -44,9 +44,9 @@ "optional": true, "version": "https://github.com/libretuya/framework-realtek-amb1#v2022.06.21", "toolchains": { - "x86_64": "gccarmnoneeabi@~1.50401.0", - "arm": "gccarmnoneeabi@~1.50401.0", - "arm64": "gccarmnoneeabi@~1.50401.0" + "any": "gccarmnoneeabi@~1.50201.0", + "arm": "gccarmnoneeabi@~1.100301.0", + "linux_x86_64": "gccarmnoneeabi@~1.100301.0" }, "libraries": { "lwip": [ @@ -59,9 +59,7 @@ "optional": true, "version": "https://github.com/libretuya/framework-realtek-ambz2#v2022.11.17", "toolchains": { - "x86_64": "gccarmnoneeabi@~1.100301.0", - "arm": "gccarmnoneeabi@~1.100301.0", - "arm64": "gccarmnoneeabi@~1.100301.0" + "any": "gccarmnoneeabi@~1.100301.0" } }, "framework-beken-bdk": { @@ -69,9 +67,8 @@ "optional": true, "version": "https://github.com/libretuya/framework-beken-bdk#v2021.06.07", "toolchains": { - "x86_64":"gccarmnoneeabi@~1.40804.0", - "arm": "gccarmnoneeabi@~1.40803.0", - "arm64": "gccarmnoneeabi@~1.40803.0" + "any":"gccarmnoneeabi@~1.40804.0", + "arm": "gccarmnoneeabi@~1.40803.0" }, "libraries": { "lwip": [ diff --git a/platform.py b/platform.py index 08d082a..2951a8e 100644 --- a/platform.py +++ b/platform.py @@ -137,6 +137,33 @@ def find_pkg_root(self, path: str, spec: PackageSpec): return path +def get_os_specifiers(): + system = platform.system().lower() + arch = platform.machine().lower() + if not arch: # issue #4353 + arch = "x86" + bits = platform.architecture()[0] + if "aarch64" in arch: + arch = "arm" + bits = 64 + elif "arm" in arch: + arch = "arm" + bits = 32 + elif "64" not in arch: + arch = "x86" + bits = 32 + else: + arch = "x86" + bits = 64 + return [ + f"{system}_{arch}_{bits}", # linux_x86_64 + f"{system}_{bits}", # linux_64 + system, # windows + arch, # arm + "any", + ] + + class LibretuyaPlatform(PlatformBase): boards_base: Dict[str, dict] = {} custom_opts: Dict[str, object] = {} @@ -176,12 +203,17 @@ class LibretuyaPlatform(PlatformBase): # set specific compiler versions if "toolchains" in package_obj: toolchains = package_obj["toolchains"] - if "arm" in platform.machine(): - (toolchain, version) = toolchains["arm"].split("@") - elif "aarch64" in platform.machine(): - (toolchain, version) = toolchains["arm64"].split("@") - else: - (toolchain, version) = toolchains["x86_64"].split("@") + toolchain_version = None + specifiers = get_os_specifiers() + for spec in specifiers: + toolchain_version = toolchains.get(spec) + if toolchain_version: + break + if not toolchain_version: + raise RuntimeError( + f"Toolchain not found for the current platform: {specifiers}" + ) + (toolchain, version) = toolchain_version.split("@") self.packages[f"toolchain-{toolchain}"]["version"] = version # mark framework SDK as required diff --git a/platform/realtek-ambz/fixups/cmsis.h b/platform/realtek-ambz/fixups/cmsis.h new file mode 100644 index 0000000..13c6af5 --- /dev/null +++ b/platform/realtek-ambz/fixups/cmsis.h @@ -0,0 +1,50 @@ +/* Copyright (c) Kuba SzczodrzyƄski 2023-03-12. */ + +// Fix for PeripheralNames.h producing errors on GCC newer than 5.x.x. +// The struct pointer casts are replaced with register addresses, which fixes compilation. +// On older versions, this change doesn't make any difference. +// MBED_PERIPHERALNAMES_H is defined in the SDK builder, to eliminate PeripheralNames.h completely. + +#include_next "cmsis.h" + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + UART_0 = (int)UART0_REG_BASE, + UART_1 = (int)UART1_REG_BASE, + UART_2 = (int)UART2_REG_BASE, +} UARTName; + +typedef enum { + ADC0_0 = 0, + ADC0_1, + ADC0_2, + ADC0_3 +} ADCName; + +typedef enum { + SPI_0 = (int)SPI0_REG_BASE, + SPI_1 = (int)SPI1_REG_BASE, +} SPIName; + +typedef enum { + I2C_0 = (int)I2C0_REG_BASE, + I2C_1 = (int)I2C1_REG_BASE, +} I2CName; + +typedef enum { + PWM_0 = 1, + PWM_1, + PWM_2, + PWM_3, + PWM_4, + PWM_5 +} PWMName; + +#ifdef __cplusplus +} +#endif diff --git a/platform/realtek-ambz/fixups/machine/endian.h b/platform/realtek-ambz/fixups/machine/endian.h new file mode 100644 index 0000000..e81cb62 --- /dev/null +++ b/platform/realtek-ambz/fixups/machine/endian.h @@ -0,0 +1,21 @@ +/* Copyright (c) Kuba SzczodrzyƄski 2023-03-12. */ + +#include_next + +#pragma once + +// GCC versions newer than 5.x.x specify the LITTLE_ENDIAN macro +// as an alias to _LITTLE_ENDIAN (which in turn holds the actual numeric value). +// Realtek's rtl8711b_crypto.h redefines _LITTLE_ENDIAN as a macro without +// any value, which makes comparisons like '#if BYTE_ORDER == LITTLE_ENDIAN' impossible. + +#if __GNUC__ > 5 +#undef _LITTLE_ENDIAN +#undef _BIG_ENDIAN +#undef LITTLE_ENDIAN +#undef BIG_ENDIAN +#undef BYTE_ORDER +#define LITTLE_ENDIAN 1234 +#define BIG_ENDIAN 4321 +#define BYTE_ORDER LITTLE_ENDIAN +#endif