nuttx-apps/netutils/connectedhomeip/0001-chip-add-compile-support-for-NuttX.patch
zhanghongyu ae59177279 matter: download chip and dependent source for open source version
The community version needs to dynamically fetch the matter source code at compile time and apply the required nuttx adaptation patch

Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
2023-11-23 00:19:37 -08:00

515 lines
18 KiB
Diff

From faaac5060c5e5f9ab23344d776b44440ca3f1706 Mon Sep 17 00:00:00 2001
From: zhanghongyu <zhanghongyu@xiaomi.com>
Date: Tue, 31 Oct 2023 11:01:50 +0800
Subject: [PATCH] chip: add compile support for NuttX
VELAPLATFO-11575
config/nuttx/chip-gn/BUILD.gn is the most important script, will output libchipnuttx.a file,
this file include all chip symbol we need.
The reference documentation for matter compilation
https://xiaomi.f.mioffice.cn/docx/doxk4GkrddACeNZokDg618UjZZb
Change-Id: Icbf140eb348dfa2ad769f76deac0abdc32618025
Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
---
build/config/compiler/BUILD.gn | 9 +++
config/nuttx/README.md | 8 +++
config/nuttx/chip-gn/.gn | 29 ++++++++++
config/nuttx/chip-gn/BUILD.gn | 57 +++++++++++++++++++
config/nuttx/chip-gn/args.gni | 32 +++++++++++
config/nuttx/chip-gn/toolchain/BUILD.gn | 33 +++++++++++
examples/lighting-app/linux/main.cpp | 2 +-
scripts/codegen.py | 1 +
src/inet/BUILD.gn | 5 ++
src/lib/core/CHIPError.h | 8 +--
src/platform/BUILD.gn | 8 +++
src/platform/Linux/BUILD.gn | 2 +-
src/platform/Linux/CHIPLinuxStorage.cpp | 2 +-
src/platform/Linux/ConnectivityUtils.cpp | 7 ++-
src/platform/Linux/ConnectivityUtils.h | 4 ++
.../Linux/DiagnosticDataProviderImpl.cpp | 4 ++
src/platform/Linux/Logging.cpp | 4 ++
src/platform/Linux/PlatformManagerImpl.cpp | 4 ++
src/platform/device.gni | 12 +++-
19 files changed, 220 insertions(+), 11 deletions(-)
create mode 100644 config/nuttx/README.md
create mode 100644 config/nuttx/chip-gn/.gn
create mode 100644 config/nuttx/chip-gn/BUILD.gn
create mode 100644 config/nuttx/chip-gn/args.gni
create mode 100644 config/nuttx/chip-gn/toolchain/BUILD.gn
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index b6ad67a649..1a590984a5 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -271,6 +271,15 @@ config("strict_warnings") {
cflags_cc = [ "-Wnon-virtual-dtor" ]
+ if (current_os == "nuttx") {
+ cflags -= [
+ "-Wshadow",
+ ]
+ cflags_cc -= [
+ "-Wnon-virtual-dtor",
+ ]
+ }
+
configs = []
ldflags = []
diff --git a/config/nuttx/README.md b/config/nuttx/README.md
new file mode 100644
index 0000000000..3cbdfc264e
--- /dev/null
+++ b/config/nuttx/README.md
@@ -0,0 +1,8 @@
+# Nuttx build and configuration files
+
+This directory contains build scripts and common configuration files used by
+CHIP Nuttx applications. It is structured as follows:
+
+| File/Folder | Contents |
+| ----------- | ----------------------------------------------------------------------------------------------------------------------------------- |
+| chip-gn | GN project used to build selected CHIP libraries with the _nuttx_ platform integration layer |
diff --git a/config/nuttx/chip-gn/.gn b/config/nuttx/chip-gn/.gn
new file mode 100644
index 0000000000..7233a3062b
--- /dev/null
+++ b/config/nuttx/chip-gn/.gn
@@ -0,0 +1,29 @@
+# Copyright (c) 2020 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+
+# The location of the build configuration file.
+buildconfig = "${build_root}/config/BUILDCONFIG.gn"
+
+# CHIP uses angle bracket includes.
+check_system_includes = true
+
+default_args = {
+ target_cpu = ""
+ target_os = "nuttx"
+
+ import("${chip_root}/config/nuttx/chip-gn/args.gni")
+}
diff --git a/config/nuttx/chip-gn/BUILD.gn b/config/nuttx/chip-gn/BUILD.gn
new file mode 100644
index 0000000000..c4b94ab171
--- /dev/null
+++ b/config/nuttx/chip-gn/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright (c) 2020 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/build.gni")
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/build/chip/tests.gni")
+
+assert(current_os == "nuttx")
+
+declare_args() {
+ chip_build_example_providers = false
+ chip_example_lighting = false
+}
+
+static_library("nuttx") {
+ output_name = "libchipnuttx"
+
+ public_deps = [
+ "${chip_root}/examples/platform/linux:app-main",
+ "${chip_root}/src/lib",
+ ]
+
+ if (chip_build_tests) {
+ public_deps += [ "${chip_root}/src:tests" ]
+ }
+
+ if (chip_build_example_providers) {
+ public_deps += [ "${chip_root}/examples/providers:device_info_provider" ]
+ }
+
+ if (chip_example_lighting) {
+ public_deps += [
+ "${chip_root}/examples/lighting-app/lighting-common",
+ "${chip_root}/examples/lighting-app/lighting-common:lighting-manager",
+ ]
+ }
+
+ output_dir = "${root_out_dir}/lib"
+
+ complete_static_lib = true
+}
+
+group("default") {
+ deps = [ ":nuttx" ]
+}
diff --git a/config/nuttx/chip-gn/args.gni b/config/nuttx/chip-gn/args.gni
new file mode 100644
index 0000000000..480dc26e9f
--- /dev/null
+++ b/config/nuttx/chip-gn/args.gni
@@ -0,0 +1,32 @@
+# Copyright (c) 2020 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build_overrides/chip.gni")
+
+import("${chip_root}/src/crypto/crypto.gni")
+
+chip_device_platform = "nuttx"
+
+chip_build_tests = false
+
+chip_project_config_include = ""
+chip_system_project_config_include = ""
+chip_ble_project_config_include = ""
+
+chip_crypto = "mbedtls"
+chip_external_mbedtls = true
+
+custom_toolchain = "${chip_root}/config/nuttx/chip-gn/toolchain:nuttx"
+
+pw_build_PIP_CONSTRAINTS = [ "${chip_root}/scripts/setup/constraints.txt" ]
diff --git a/config/nuttx/chip-gn/toolchain/BUILD.gn b/config/nuttx/chip-gn/toolchain/BUILD.gn
new file mode 100644
index 0000000000..576d96f607
--- /dev/null
+++ b/config/nuttx/chip-gn/toolchain/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright (c) 2020 Project CHIP Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import("//build/toolchain/gcc_toolchain.gni")
+import("//build_overrides/build.gni")
+
+declare_args() {
+ nuttx_ar = ""
+ nuttx_cc = ""
+ nuttx_cxx = ""
+}
+
+gcc_toolchain("nuttx") {
+ ar = nuttx_ar
+ cc = nuttx_cc
+ cxx = nuttx_cxx
+
+ toolchain_args = {
+ current_os = "nuttx"
+ is_clang = false
+ }
+}
diff --git a/examples/lighting-app/linux/main.cpp b/examples/lighting-app/linux/main.cpp
index 3bd27fddc0..21535c3bcd 100644
--- a/examples/lighting-app/linux/main.cpp
+++ b/examples/lighting-app/linux/main.cpp
@@ -93,7 +93,7 @@ void ApplicationShutdown()
}
}
-int main(int argc, char * argv[])
+extern "C" int main(int argc, char * argv[])
{
if (ChipLinuxAppInit(argc, argv) != 0)
{
diff --git a/scripts/codegen.py b/scripts/codegen.py
index 1f679ea614..1c6a1b1883 100755
--- a/scripts/codegen.py
+++ b/scripts/codegen.py
@@ -15,6 +15,7 @@
import logging
import sys
+sys.path.append('py_matter_idl')
import click
diff --git a/src/inet/BUILD.gn b/src/inet/BUILD.gn
index 3f81be8964..966aff5c08 100644
--- a/src/inet/BUILD.gn
+++ b/src/inet/BUILD.gn
@@ -148,4 +148,9 @@ static_library("inet") {
}
cflags = [ "-Wconversion" ]
+ if (current_os == "nuttx") {
+ cflags -= [
+ "-Wconversion",
+ ]
+ }
}
diff --git a/src/lib/core/CHIPError.h b/src/lib/core/CHIPError.h
index 1b621a694f..e67ce24eb9 100644
--- a/src/lib/core/CHIPError.h
+++ b/src/lib/core/CHIPError.h
@@ -374,13 +374,13 @@ public:
*
* This template ensures that the numeric value is constant and well-formed.
*/
- template <SdkPart PART, StorageType CODE>
+ template <SdkPart PART, StorageType SCODE>
struct SdkErrorConstant
{
static_assert(FitsInField(kSdkPartLength, to_underlying(PART)), "part is too large");
- static_assert(FitsInField(kSdkCodeLength, CODE), "code is too large");
- static_assert(MakeInteger(PART, CODE) != 0, "value is zero");
- static constexpr StorageType value = MakeInteger(PART, CODE);
+ static_assert(FitsInField(kSdkCodeLength, SCODE), "code is too large");
+ static_assert(MakeInteger(PART, SCODE) != 0, "value is zero");
+ static constexpr StorageType value = MakeInteger(PART, SCODE);
};
};
diff --git a/src/platform/BUILD.gn b/src/platform/BUILD.gn
index 7a7b6a81e6..4c3e2b2e30 100644
--- a/src/platform/BUILD.gn
+++ b/src/platform/BUILD.gn
@@ -297,6 +297,12 @@ if (chip_device_platform != "none" && chip_device_platform != "external") {
} else if (chip_device_platform == "stm32") {
device_layer_target_define = "STM32"
defines += [ "CHIP_DEVICE_LAYER_TARGET=stm32" ]
+ } else if (chip_device_platform == "nuttx") {
+ device_layer_target_define = "LINUX"
+ defines += [
+ "CHIP_DEVICE_LAYER_TARGET=Linux",
+ "CHIP_DEVICE_CONFIG_ENABLE_WIFI=${chip_enable_wifi}",
+ ]
} else {
device_layer_target_define = ""
}
@@ -559,6 +565,8 @@ if (chip_device_platform != "none") {
_platform_target = "ASR"
} else if (chip_device_platform == "stm32") {
_platform_target = "stm32"
+ } else if (chip_device_platform == "nuttx") {
+ _platform_target = "Linux"
} else {
assert(false, "Unknown chip_device_platform: ${chip_device_platform}")
}
diff --git a/src/platform/Linux/BUILD.gn b/src/platform/Linux/BUILD.gn
index a2cfa6b39c..f746a999a8 100644
--- a/src/platform/Linux/BUILD.gn
+++ b/src/platform/Linux/BUILD.gn
@@ -20,7 +20,7 @@ import("${build_root}/config/linux/pkg_config.gni")
import("${chip_root}/src/lib/core/core.gni")
import("${chip_root}/src/platform/device.gni")
-assert(chip_device_platform == "linux")
+assert(chip_device_platform == "linux" || chip_device_platform == "nuttx")
if (chip_use_pw_logging) {
import("//build_overrides/pigweed.gni")
diff --git a/src/platform/Linux/CHIPLinuxStorage.cpp b/src/platform/Linux/CHIPLinuxStorage.cpp
index 9a8afb59d7..52a8b778ce 100644
--- a/src/platform/Linux/CHIPLinuxStorage.cpp
+++ b/src/platform/Linux/CHIPLinuxStorage.cpp
@@ -198,7 +198,7 @@ CHIP_ERROR ChipLinuxStorage::WriteValue(const char * key, uint32_t val)
{
char buf[32];
- snprintf(buf, sizeof(buf), "%d", val);
+ snprintf(buf, sizeof(buf), "%" PRIu32, val);
return WriteValueStr(key, buf);
}
diff --git a/src/platform/Linux/ConnectivityUtils.cpp b/src/platform/Linux/ConnectivityUtils.cpp
index 2924d48612..7d5ce7e163 100644
--- a/src/platform/Linux/ConnectivityUtils.cpp
+++ b/src/platform/Linux/ConnectivityUtils.cpp
@@ -27,10 +27,15 @@
#include <arpa/inet.h>
#include <ifaddrs.h>
+#ifdef __NuttX__
+#include <nuttx/wireless/wireless.h>
+#include <nuttx/ethtool.h>
+#else
#include <linux/ethtool.h>
#include <linux/if_link.h>
#include <linux/sockios.h>
#include <linux/wireless.h>
+#endif
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
@@ -688,7 +693,7 @@ CHIP_ERROR ConnectivityUtils::GetEthPHYRate(const char * ifname, app::Clusters::
pHYRate = EmberAfPHYRateEnum::EMBER_ZCL_PHY_RATE_ENUM_RATE400_G;
break;
default:
- ChipLogError(DeviceLayer, "Undefined speed! (%d)\n", speed);
+ ChipLogError(DeviceLayer, "Undefined speed! (%" PRIu32 ")\n", speed);
err = CHIP_ERROR_READ_FAILED;
break;
};
diff --git a/src/platform/Linux/ConnectivityUtils.h b/src/platform/Linux/ConnectivityUtils.h
index e4884e935b..bd79ba44a3 100644
--- a/src/platform/Linux/ConnectivityUtils.h
+++ b/src/platform/Linux/ConnectivityUtils.h
@@ -26,8 +26,12 @@
#include <platform/DiagnosticDataProvider.h>
#include <platform/internal/CHIPDeviceLayerInternal.h>
+#ifdef __NuttX__
+#include <nuttx/wireless/wireless.h>
+#else
#include <linux/types.h> /* for "caddr_t" et al */
#include <linux/wireless.h>
+#endif
namespace chip {
namespace DeviceLayer {
diff --git a/src/platform/Linux/DiagnosticDataProviderImpl.cpp b/src/platform/Linux/DiagnosticDataProviderImpl.cpp
index f102b47b65..22bf514a47 100644
--- a/src/platform/Linux/DiagnosticDataProviderImpl.cpp
+++ b/src/platform/Linux/DiagnosticDataProviderImpl.cpp
@@ -35,10 +35,14 @@
#include <arpa/inet.h>
#include <dirent.h>
#include <ifaddrs.h>
+#ifdef __NuttX__
+#include <netpacket/netlink.h>
+#else
#include <linux/ethtool.h>
#include <linux/if_link.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
+#endif
#include <malloc.h>
#include <net/if.h>
#include <netinet/in.h>
diff --git a/src/platform/Linux/Logging.cpp b/src/platform/Linux/Logging.cpp
index 28a19a6a30..6617afd54e 100644
--- a/src/platform/Linux/Logging.cpp
+++ b/src/platform/Linux/Logging.cpp
@@ -49,7 +49,11 @@ void ENFORCE_FORMAT(3, 0) LogV(const char * module, uint8_t category, const char
flockfile(stdout);
printf("[%" PRIu64 ".%06" PRIu64 "][%lld:%lld] CHIP:%s: ", static_cast<uint64_t>(tv.tv_sec), static_cast<uint64_t>(tv.tv_usec),
+#ifdef __NuttX__
+ static_cast<long long>(getpid()), static_cast<long long>(gettid()), module);
+#else
static_cast<long long>(syscall(SYS_getpid)), static_cast<long long>(syscall(SYS_gettid)), module);
+#endif
vprintf(msg, v);
printf("\n");
fflush(stdout);
diff --git a/src/platform/Linux/PlatformManagerImpl.cpp b/src/platform/Linux/PlatformManagerImpl.cpp
index a1c83faf29..5a9afb1204 100644
--- a/src/platform/Linux/PlatformManagerImpl.cpp
+++ b/src/platform/Linux/PlatformManagerImpl.cpp
@@ -27,8 +27,12 @@
#include <arpa/inet.h>
#include <dirent.h>
#include <errno.h>
+#ifdef __NuttX__
+#include <netpacket/netlink.h>
+#else
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
+#endif
#include <net/if.h>
#include <netinet/in.h>
#include <unistd.h>
diff --git a/src/platform/device.gni b/src/platform/device.gni
index cf1dc07325..a9fc1b02d6 100644
--- a/src/platform/device.gni
+++ b/src/platform/device.gni
@@ -40,6 +40,8 @@ if (chip_device_platform == "auto") {
chip_device_platform = "webos"
} else if (current_os == "zephyr") {
chip_device_platform = "zephyr"
+ } else if (current_os == "nuttx") {
+ chip_device_platform = "nuttx"
} else {
chip_device_platform = "none"
}
@@ -89,7 +91,8 @@ declare_args() {
chip_device_platform == "ameba" || chip_device_platform == "webos" ||
chip_device_platform == "cc32xx" || chip_device_platform == "mw320" ||
chip_device_platform == "beken" || chip_device_platform == "mt793x" ||
- chip_device_platform == "asr" || chip_device_platform == "openiotsdk") {
+ chip_device_platform == "asr" || chip_device_platform == "openiotsdk" ||
+ chip_device_platform == "nuttx") {
chip_mdns = "minimal"
} else if (chip_device_platform == "darwin" ||
chip_device_platform == "cc13x2_26x2" ||
@@ -104,7 +107,8 @@ declare_args() {
# Enable Subscription persistence / resumption for CI and supported platforms
if (chip_device_platform == "darwin" || chip_device_platform == "linux" ||
chip_device_platform == "esp32" || chip_device_platform == "fake" ||
- chip_device_platform == "efr32" || chip_device_platform == "SiWx917") {
+ chip_device_platform == "efr32" || chip_device_platform == "SiWx917" ||
+ chip_device_platform == "nuttx") {
chip_persist_subscriptions = true
} else {
chip_persist_subscriptions = false
@@ -185,6 +189,8 @@ if (chip_device_platform == "cc13x2_26x2") {
_chip_device_layer = "openiotsdk"
} else if (chip_device_platform == "asr") {
_chip_device_layer = "ASR"
+} else if (chip_device_platform == "nuttx") {
+ _chip_device_layer = "Linux"
} else if (chip_device_platform == "stm32") {
_chip_device_layer = "stm32"
}
@@ -257,5 +263,5 @@ assert(
chip_device_platform == "bl702" || chip_device_platform == "bl702l" ||
chip_device_platform == "mt793x" || chip_device_platform == "SiWx917" ||
chip_device_platform == "openiotsdk" || chip_device_platform == "asr" ||
- chip_device_platform == "stm32",
+ chip_device_platform == "stm32" || chip_device_platform == "nuttx",
"Please select a valid value for chip_device_platform")
--
2.25.1