summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2025-01-16 10:46:37 +0700
committerhathach <[email protected]>2025-01-21 16:28:29 +0700
commit91214b46142186b6c30ea468779c7ad39e1bc605 (patch)
tree96840e9d26c5eff4330dae31ad2ce401ff1c9b99
parentc8130afe9bb7365adc076c98059b869bfcaf2ecf (diff)
zephyr
-rw-r--r--.west/config6
-rw-r--r--examples/build_system/cmake/toolchain/common.cmake4
-rw-r--r--examples/device/board_test/CMakeLists.txt22
-rw-r--r--examples/device/board_test/src/main.c54
-rw-r--r--examples/device/cdc_msc/CMakeLists.txt26
-rw-r--r--examples/west.yml12
-rw-r--r--hw/bsp/board_api.h38
-rw-r--r--hw/bsp/family_support.cmake121
-rw-r--r--hw/bsp/nrf/boards/pca10056/board.cmake6
-rw-r--r--hw/bsp/nrf/family.c16
-rw-r--r--hw/bsp/nrf/family.cmake28
-rw-r--r--hw/bsp/nrf/nrfx_glue.h20
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/osal/osal.h2
-rw-r--r--src/osal/osal_zephyr.h123
-rw-r--r--src/tusb_option.h1
16 files changed, 371 insertions, 110 deletions
diff --git a/.west/config b/.west/config
new file mode 100644
index 000000000..2518007f6
--- /dev/null
+++ b/.west/config
@@ -0,0 +1,6 @@
+[manifest]
+path = examples
+file = west.yml
+
+[zephyr]
+base = lib/zephyr
diff --git a/examples/build_system/cmake/toolchain/common.cmake b/examples/build_system/cmake/toolchain/common.cmake
index 688715914..ce97664d5 100644
--- a/examples/build_system/cmake/toolchain/common.cmake
+++ b/examples/build_system/cmake/toolchain/common.cmake
@@ -13,8 +13,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# pass TOOLCHAIN_CPU to
-set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR)
-include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_PROCESSOR}.cmake)
+set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_CPU)
+include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_CPU}.cmake)
# ----------------------------------------------------------------------------
# Compile flags
diff --git a/examples/device/board_test/CMakeLists.txt b/examples/device/board_test/CMakeLists.txt
index 837b4996a..adcc3ba3d 100644
--- a/examples/device/board_test/CMakeLists.txt
+++ b/examples/device/board_test/CMakeLists.txt
@@ -5,6 +5,11 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
# gets PROJECT name for the example (e.g. <BOARD>-<DIR_NAME>)
family_get_project_name(PROJECT ${CMAKE_CURRENT_LIST_DIR})
+if (BUILD_ZEPHYR)
+ set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})
+ find_package(Zephyr REQUIRED HINTS ${TOP}/lib/zephyr)
+endif ()
+
project(${PROJECT} C CXX ASM)
# Checks this example is valid for the family and initializes the project
@@ -15,18 +20,27 @@ if(FAMILY STREQUAL "espressif")
return()
endif()
-add_executable(${PROJECT})
+if (BUILD_ZEPHYR)
+ set(EXE_NAME app)
+else()
+ set(EXE_NAME ${PROJECT})
+ add_executable(${EXE_NAME})
+endif()
# Example source
-target_sources(${PROJECT} PUBLIC
+target_sources(${EXE_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
)
# Example include
-target_include_directories(${PROJECT} PUBLIC
+target_include_directories(${EXE_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# Configure compilation flags and libraries for the example without RTOS.
# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.
-family_configure_device_example(${PROJECT} noos)
+if (BUILD_ZEPHYR)
+ family_configure_device_example(${EXE_NAME} zephyr)
+else()
+ family_configure_device_example(${EXE_NAME} noos)
+endif()
diff --git a/examples/device/board_test/src/main.c b/examples/device/board_test/src/main.c
index 2269d45f1..321f6638a 100644
--- a/examples/device/board_test/src/main.c
+++ b/examples/device/board_test/src/main.c
@@ -23,6 +23,7 @@
*
*/
+#if 1
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -51,7 +52,7 @@ int main(void) {
// Blink and print every interval ms
if (!(board_millis() - start_ms < interval_ms)) {
- board_uart_write(HELLO_STR, strlen(HELLO_STR));
+ // board_uart_write(HELLO_STR, strlen(HELLO_STR));
start_ms = board_millis();
@@ -60,12 +61,57 @@ int main(void) {
}
// echo
- uint8_t ch;
- if (board_uart_read(&ch, 1) > 0) {
- board_uart_write(&ch, 1);
+ // uint8_t ch;
+ // if (board_uart_read(&ch, 1) > 0) {
+ // board_uart_write(&ch, 1);
+ // }
+ }
+}
+
+#else
+#include <stdio.h>
+#include <zephyr/kernel.h>
+#include <zephyr/drivers/gpio.h>
+
+/* 1000 msec = 1 sec */
+#define SLEEP_TIME_MS 200
+
+/* The devicetree node identifier for the "led0" alias. */
+#define LED0_NODE DT_ALIAS(led0)
+
+/*
+ * A build error on this line means your board is unsupported.
+ * See the sample documentation for information on how to fix this.
+ */
+static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
+
+int main(void)
+{
+ int ret;
+ bool led_state = true;
+
+ if (!gpio_is_ready_dt(&led)) {
+ return 0;
+ }
+
+ ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
+ if (ret < 0) {
+ return 0;
+ }
+
+ while (1) {
+ ret = gpio_pin_toggle_dt(&led);
+ if (ret < 0) {
+ return 0;
}
+
+ led_state = !led_state;
+ printf("LED state: %s\n", led_state ? "ON" : "OFF");
+ k_msleep(SLEEP_TIME_MS);
}
+ return 0;
}
+#endif
#if TUSB_MCU_VENDOR_ESPRESSIF
void app_main(void) {
diff --git a/examples/device/cdc_msc/CMakeLists.txt b/examples/device/cdc_msc/CMakeLists.txt
index fa7090807..754c5deb0 100644
--- a/examples/device/cdc_msc/CMakeLists.txt
+++ b/examples/device/cdc_msc/CMakeLists.txt
@@ -6,6 +6,11 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)
# gets PROJECT name for the example (e.g. <BOARD>-<DIR_NAME>)
family_get_project_name(PROJECT ${CMAKE_CURRENT_LIST_DIR})
+if (BUILD_ZEPHYR)
+ set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})
+ find_package(Zephyr REQUIRED HINTS ${TOP}/lib/zephyr)
+endif ()
+
project(${PROJECT} C CXX ASM)
# Checks this example is valid for the family and initializes the project
@@ -16,20 +21,29 @@ if(FAMILY STREQUAL "espressif")
return()
endif()
-add_executable(${PROJECT})
+if (BUILD_ZEPHYR)
+ set(EXE_NAME app)
+else()
+ set(EXE_NAME ${PROJECT})
+ add_executable(${EXE_NAME})
+endif()
# Example source
-target_sources(${PROJECT} PUBLIC
+target_sources(${EXE_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c
${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c
)
# Example include
-target_include_directories(${PROJECT} PUBLIC
+target_include_directories(${EXE_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
-# Configure compilation flags and libraries for the example... see the corresponding function
-# in hw/bsp/FAMILY/family.cmake for details.
-family_configure_device_example(${PROJECT} noos)
+# Configure compilation flags and libraries for the example without RTOS.
+# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.
+if (BUILD_ZEPHYR)
+ family_configure_device_example(${EXE_NAME} zephyr)
+else()
+ family_configure_device_example(${EXE_NAME} noos)
+endif()
diff --git a/examples/west.yml b/examples/west.yml
new file mode 100644
index 000000000..4e2160202
--- /dev/null
+++ b/examples/west.yml
@@ -0,0 +1,12 @@
+manifest:
+ remotes:
+ - name: zephyrproject-rtos
+ url-base: https://github.com/zephyrproject-rtos
+ projects:
+ - name: zephyr
+ remote: zephyrproject-rtos
+ revision: v4.0.0
+ path: lib/zephyr
+ import: true
+ self:
+ path: .
diff --git a/hw/bsp/board_api.h b/hw/bsp/board_api.h
index eaee1ee97..9cdbbf0d3 100644
--- a/hw/bsp/board_api.h
+++ b/hw/bsp/board_api.h
@@ -38,22 +38,24 @@ extern "C" {
#include "tusb.h"
-#if CFG_TUSB_OS == OPT_OS_FREERTOS
-#if TUSB_MCU_VENDOR_ESPRESSIF
- // ESP-IDF need "freertos/" prefix in include path.
- // CFG_TUSB_OS_INC_PATH should be defined accordingly.
- #include "freertos/FreeRTOS.h"
- #include "freertos/semphr.h"
- #include "freertos/queue.h"
- #include "freertos/task.h"
- #include "freertos/timers.h"
-#else
- #include "FreeRTOS.h"
- #include "semphr.h"
- #include "queue.h"
- #include "task.h"
- #include "timers.h"
-#endif
+#if CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #include <zephyr/kernel.h>
+#elif CFG_TUSB_OS == OPT_OS_FREERTOS
+ #if TUSB_MCU_VENDOR_ESPRESSIF
+ // ESP-IDF need "freertos/" prefix in include path.
+ // CFG_TUSB_OS_INC_PATH should be defined accordingly.
+ #include "freertos/FreeRTOS.h"
+ #include "freertos/semphr.h"
+ #include "freertos/queue.h"
+ #include "freertos/task.h"
+ #include "freertos/timers.h"
+ #else
+ #include "FreeRTOS.h"
+ #include "semphr.h"
+ #include "queue.h"
+ #include "task.h"
+ #include "timers.h"
+ #endif
#endif
// Define the default baudrate
@@ -124,6 +126,10 @@ static inline uint32_t board_millis(void) {
// Implement your own board_millis() in any of .c file
uint32_t board_millis(void);
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+static inline uint32_t board_millis(void) {
+ return k_uptime_get_32();
+}
#else
#error "board_millis() is not implemented for this OS"
#endif
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index ddb17cbb0..3820bb51a 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -73,34 +73,39 @@ if (NOT NO_WARN_RWX_SEGMENTS_SUPPORTED)
set(NO_WARN_RWX_SEGMENTS_SUPPORTED 1)
endif()
-set(WARNING_FLAGS_GNU
- -Wall
- -Wextra
- -Werror
- -Wfatal-errors
- -Wdouble-promotion
- -Wstrict-prototypes
- -Wstrict-overflow
- -Werror-implicit-function-declaration
- -Wfloat-equal
- -Wundef
- -Wshadow
- -Wwrite-strings
- -Wsign-compare
- -Wmissing-format-attribute
- -Wunreachable-code
- -Wcast-align
- -Wcast-function-type
- -Wcast-qual
- -Wnull-dereference
- -Wuninitialized
- -Wunused
- -Wreturn-type
- -Wredundant-decls
- )
+#set(WARNING_FLAGS_GNU
+# -Wall
+# -Wextra
+# -Werror
+# -Wfatal-errors
+# -Wdouble-promotion
+# -Wstrict-prototypes
+# -Wstrict-overflow
+# -Werror-implicit-function-declaration
+# -Wfloat-equal
+# -Wundef
+# -Wshadow
+# -Wwrite-strings
+# -Wsign-compare
+# -Wmissing-format-attribute
+# -Wunreachable-code
+# -Wcast-align
+# -Wcast-function-type
+# -Wcast-qual
+# -Wnull-dereference
+# -Wuninitialized
+# -Wunused
+# -Wreturn-type
+# -Wredundant-decls
+# )
set(WARNING_FLAGS_IAR "")
+#if (BUILD_ZEPHYR)
+# set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})
+# find_package(Zephyr REQUIRED HINTS ${TOP}/lib/zephyr)
+#endif ()
+
#-------------------------------------------------------------
# Functions
#-------------------------------------------------------------
@@ -216,7 +221,7 @@ function(family_configure_common TARGET RTOS)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND NO_WARN_RWX_SEGMENTS_SUPPORTED)
- target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
+# target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
endif ()
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
@@ -244,12 +249,12 @@ function(family_configure_common TARGET RTOS)
endif ()
# run size after build
- find_program(SIZE_EXE ${CMAKE_SIZE})
- if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
- add_custom_command(TARGET ${TARGET} POST_BUILD
- COMMAND ${SIZE_EXE} $<TARGET_FILE:${TARGET}>
- )
- endif ()
+# find_program(SIZE_EXE ${CMAKE_SIZE})
+# if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
+# add_custom_command(TARGET ${TARGET} POST_BUILD
+# COMMAND ${SIZE_EXE} $<TARGET_FILE:${TARGET}>
+# )
+# endif ()
endfunction()
# Add tinyusb to example
@@ -272,6 +277,8 @@ function(family_add_tinyusb TARGET OPT_MCU RTOS)
if (RTOS STREQUAL "freertos")
target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_OS=OPT_OS_FREERTOS)
+ elseif (RTOS STREQUAL "zephyr")
+ target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_OS=OPT_OS_ZEPHYR)
endif ()
# tinyusb's CMakeList.txt
@@ -280,6 +287,8 @@ function(family_add_tinyusb TARGET OPT_MCU RTOS)
if (RTOS STREQUAL "freertos")
# link tinyusb with freeRTOS kernel
target_link_libraries(${TARGET}-tinyusb PUBLIC freertos_kernel)
+ elseif (RTOS STREQUAL "zephyr")
+ target_include_directories(${TARGET}-tinyusb PUBLIC ${ZEPHYR_BASE}/include)
endif ()
# use max3421 as host controller
@@ -353,33 +362,33 @@ endfunction()
# RPI specific: refactor later
#----------------------------------
function(family_add_default_example_warnings TARGET)
- target_compile_options(${TARGET} PUBLIC
- -Wall
- -Wextra
- -Werror
- -Wfatal-errors
- -Wdouble-promotion
- -Wfloat-equal
- # FIXME commented out because of https://github.com/raspberrypi/pico-sdk/issues/1468
- #-Wshadow
- -Wwrite-strings
- -Wsign-compare
- -Wmissing-format-attribute
- -Wunreachable-code
- -Wcast-align
- -Wcast-qual
- -Wnull-dereference
- -Wuninitialized
- -Wunused
- -Wredundant-decls
- #-Wstrict-prototypes
- #-Werror-implicit-function-declaration
- #-Wundef
- )
+# target_compile_options(${TARGET} PUBLIC
+# -Wall
+# -Wextra
+# -Werror
+# -Wfatal-errors
+# -Wdouble-promotion
+# -Wfloat-equal
+# # FIXME commented out because of https://github.com/raspberrypi/pico-sdk/issues/1468
+# #-Wshadow
+# -Wwrite-strings
+# -Wsign-compare
+# -Wmissing-format-attribute
+# -Wunreachable-code
+# -Wcast-align
+# -Wcast-qual
+# -Wnull-dereference
+# -Wuninitialized
+# -Wunused
+# -Wredundant-decls
+# #-Wstrict-prototypes
+# #-Werror-implicit-function-declaration
+# #-Wundef
+# )
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND NO_WARN_RWX_SEGMENTS_SUPPORTED)
- target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
+# target_link_options(${TARGET} PUBLIC "LINKER:--no-warn-rwx-segments")
endif()
# GCC 10
diff --git a/hw/bsp/nrf/boards/pca10056/board.cmake b/hw/bsp/nrf/boards/pca10056/board.cmake
index cc370aac8..85314f3bc 100644
--- a/hw/bsp/nrf/boards/pca10056/board.cmake
+++ b/hw/bsp/nrf/boards/pca10056/board.cmake
@@ -2,3 +2,9 @@ set(MCU_VARIANT nrf52840)
function(update_board TARGET)
endfunction()
+
+#board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000")
+#include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
+#include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)
diff --git a/hw/bsp/nrf/family.c b/hw/bsp/nrf/family.c
index f3132eeb1..2c3413b9e 100644
--- a/hw/bsp/nrf/family.c
+++ b/hw/bsp/nrf/family.c
@@ -67,6 +67,8 @@
#define NRFX_VER 3
#endif
+extern void nrfx_isr(const void *irq_handler);
+
//--------------------------------------------------------------------+
// Forward USB interrupt events to TinyUSB IRQ Handler
//--------------------------------------------------------------------+
@@ -137,8 +139,22 @@ void board_init(void) {
// Button
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
+#if CFG_TUSB_OS == OPT_OS_NONE
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #ifdef CONFIG_HAS_HW_NRF_USBREG
+ // IRQ_CONNECT(USBREGULATOR_IRQn, DT_IRQ(DT_INST(0, nordic_nrf_clock), priority), nrfx_isr, nrfx_usbreg_irq_handler, 0);
+ // irq_enable(USBREGULATOR_IRQn);
+ #endif
+
+ // IRQ_CONNECT(CLOCK_POWER_IRQn, 0, nrfx_isr, nrfx_power_irq_handler, 0);
+
+ /* USB device controller access from devicetree */
+ // #define DT_DRV_COMPAT nordic_nrf_usbd
+ // IRQ_CONNECT(DT_INST_IRQN(0), DT_INST_IRQ(0, priority), nrfx_isr, nrf_usbd_common_irq_handler, 0);
+
+#endif
// UART
#if NRFX_VER <= 2
diff --git a/hw/bsp/nrf/family.cmake b/hw/bsp/nrf/family.cmake
index 7a433d82d..0dfc7579c 100644
--- a/hw/bsp/nrf/family.cmake
+++ b/hw/bsp/nrf/family.cmake
@@ -8,10 +8,10 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# toolchain set up
if (MCU_VARIANT STREQUAL "nrf5340_application")
- set(CMAKE_SYSTEM_PROCESSOR cortex-m33 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
set(JLINK_DEVICE nrf5340_xxaa_app)
else ()
- set(CMAKE_SYSTEM_PROCESSOR cortex-m4 CACHE INTERNAL "System Processor")
+ set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL "System Processor")
set(JLINK_DEVICE ${MCU_VARIANT}_xxaa)
endif ()
@@ -113,12 +113,16 @@ endfunction()
function(family_configure_example TARGET RTOS)
family_configure_common(${TARGET} ${RTOS})
- # Board target
- add_board_target(board_${BOARD})
+ if (BUILD_ZEPHYR)
+ #target_link_libraries(board_${BOARD} PUBLIC zephyr_interface kernel)
+ elseif ()
+ # Board target
+ add_board_target(board_${BOARD})
+ endif ()
#---------- Port Specific ----------
# These files are built for each example since it depends on example's tusb_config.h
- target_sources(${TARGET} PUBLIC
+ target_sources(${TARGET} PRIVATE
# BSP
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
@@ -132,16 +136,20 @@ function(family_configure_example TARGET RTOS)
# Add TinyUSB target and port source
family_add_tinyusb(${TARGET} OPT_MCU_NRF5X ${RTOS})
- target_sources(${TARGET}-tinyusb PUBLIC
+ target_sources(${TARGET}-tinyusb PRIVATE
${TOP}/src/portable/nordic/nrf5x/dcd_nrf5x.c
)
- target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
- # Link dependencies
- target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+ if (BUILD_ZEPHYR)
+ target_link_libraries(${TARGET}-tinyusb PUBLIC zephyr_interface kernel)
+ target_link_libraries(${TARGET} PUBLIC ${TARGET}-tinyusb)
+ elseif ()
+ target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
+ target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
+ endif ()
# Flashing
- family_add_bin_hex(${TARGET})
+ #family_add_bin_hex(${TARGET})
family_flash_jlink(${TARGET})
# family_flash_adafruit_nrfutil(${TARGET})
endfunction()
diff --git a/hw/bsp/nrf/nrfx_glue.h b/hw/bsp/nrf/nrfx_glue.h
index ef756c670..bc3b3689b 100644
--- a/hw/bsp/nrf/nrfx_glue.h
+++ b/hw/bsp/nrf/nrfx_glue.h
@@ -1,7 +1,9 @@
/*
- * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA
+ * Copyright (c) 2017 - 2024, Nordic Semiconductor ASA
* All rights reserved.
*
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
@@ -60,14 +62,14 @@ extern "C" {
/**
* @brief Macro for placing a runtime assertion.
*
- * @param expression Expression to evaluate.
+ * @param expression Expression to be evaluated.
*/
#define NRFX_ASSERT(expression)
/**
* @brief Macro for placing a compile time assertion.
*
- * @param expression Expression to evaluate.
+ * @param expression Expression to be evaluated.
*/
#define NRFX_STATIC_ASSERT(expression)
@@ -76,8 +78,8 @@ extern "C" {
/**
* @brief Macro for setting the priority of a specific IRQ.
*
- * @param irq_number IRQ number.
- * @param priority Priority to set.
+ * @param irq_number IRQ number.
+ * @param priority Priority to be set.
*/
#define NRFX_IRQ_PRIORITY_SET(irq_number, priority) _NRFX_IRQ_PRIORITY_SET(irq_number, priority)
static inline void _NRFX_IRQ_PRIORITY_SET(IRQn_Type irq_number,
@@ -158,14 +160,10 @@ static inline bool _NRFX_IRQ_IS_PENDING(IRQn_Type irq_number)
return (NVIC_GetPendingIRQ(irq_number) == 1);
}
-/**
- * @brief Macro for entering into a critical section.
- */
+/** @brief Macro for entering into a critical section. */
#define NRFX_CRITICAL_SECTION_ENTER()
-/**
- * @brief Macro for exiting from a critical section.
- */
+/** @brief Macro for exiting from a critical section. */
#define NRFX_CRITICAL_SECTION_EXIT()
//------------------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e8488166e..1d2f37b2d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -45,7 +45,7 @@ function(add_tinyusb TARGET)
target_compile_options(${TARGET} PRIVATE
-Wall
-Wextra
- -Werror
+ #-Werror
-Wfatal-errors
-Wdouble-promotion
-Wstrict-prototypes
diff --git a/src/osal/osal.h b/src/osal/osal.h
index 8f45ea5c1..38d45da44 100644
--- a/src/osal/osal.h
+++ b/src/osal/osal.h
@@ -63,6 +63,8 @@ typedef void (*osal_task_func_t)( void * );
#include "osal_rtthread.h"
#elif CFG_TUSB_OS == OPT_OS_RTX4
#include "osal_rtx4.h"
+#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
+ #include "osal_zephyr.h"
#elif CFG_TUSB_OS == OPT_OS_CUSTOM
#include "tusb_os_custom.h" // implemented by application
#else
diff --git a/src/osal/osal_zephyr.h b/src/osal/osal_zephyr.h
new file mode 100644
index 000000000..8ecb13c6d
--- /dev/null
+++ b/src/osal/osal_zephyr.h
@@ -0,0 +1,123 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Ha Thach (tinyusb.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+#ifndef TUSB_OSAL_ZEPHYR_H
+#define TUSB_OSAL_ZEPHYR_H
+
+#include <zephyr/kernel.h>
+
+//--------------------------------------------------------------------+
+// TASK API
+//--------------------------------------------------------------------+
+TU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {
+ k_msleep(msec);
+}
+
+//--------------------------------------------------------------------+
+// Binary Semaphore API
+//--------------------------------------------------------------------+
+typedef struct k_sem osal_semaphore_def_t, * osal_semaphore_t;
+
+TU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef) {
+ k_sem_init(semdef, 0, 255);
+ return semdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {
+ (void) semd_hdl;
+ return true; // nothing to do
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {
+ (void) in_isr;
+ k_sem_give(sem_hdl);
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {
+ return 0 == k_sem_take(sem_hdl, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {
+ k_sem_reset(sem_hdl);
+}
+
+//--------------------------------------------------------------------+
+// MUTEX API
+//--------------------------------------------------------------------+
+typedef struct k_mutex osal_mutex_def_t, *osal_mutex_t;
+
+TU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {
+ if ( 0 == k_mutex_init(mdef) ) {
+ return mdef;
+ } else {
+ return NULL;
+ }
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {
+ (void) mutex_hdl;
+ return true; // nothing to do
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {
+ return 0 == k_mutex_lock(mutex_hdl, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {
+ return 0 == k_mutex_unlock(mutex_hdl);
+}
+
+//--------------------------------------------------------------------+
+// QUEUE API
+//--------------------------------------------------------------------+
+typedef struct k_msgq osal_queue_def_t, * osal_queue_t;
+
+// role device/host is used by OS NONE for mutex (disable usb isr) only
+#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) K_MSGQ_DEFINE(_name, sizeof(_type), _depth, 4)
+
+TU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {
+ // K_MSGQ_DEFINE already initializes the queue
+ return (osal_queue_t) qdef;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {
+ (void) qhdl;
+ return true;
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {
+ return 0 == k_msgq_get(qhdl, data, K_MSEC(msec));
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const* data, bool in_isr) {
+ return 0 == k_msgq_put(qhdl, data, in_isr ? K_NO_WAIT : K_FOREVER);
+}
+
+TU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {
+ return 0 == k_msgq_num_used_get(qhdl);
+}
+
+#endif
diff --git a/src/tusb_option.h b/src/tusb_option.h
index 86cb6d046..29fdcb0d6 100644
--- a/src/tusb_option.h
+++ b/src/tusb_option.h
@@ -215,6 +215,7 @@
#define OPT_OS_PICO 5 ///< Raspberry Pi Pico SDK
#define OPT_OS_RTTHREAD 6 ///< RT-Thread
#define OPT_OS_RTX4 7 ///< Keil RTX 4
+#define OPT_OS_ZEPHYR 8 ///< Zephyr
//--------------------------------------------------------------------+
// Mode and Speed