nuttx-apps/netutils/connectedhomeip/0001-chip-add-compile-support-for-NuttX.patch

515 lines
18 KiB
Diff
Raw Normal View History

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