zephyr
This commit is contained in:
6
.west/config
Normal file
6
.west/config
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[manifest]
|
||||||
|
path = examples
|
||||||
|
file = west.yml
|
||||||
|
|
||||||
|
[zephyr]
|
||||||
|
base = lib/zephyr
|
@@ -13,8 +13,8 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|||||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
|
||||||
# pass TOOLCHAIN_CPU to
|
# pass TOOLCHAIN_CPU to
|
||||||
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR)
|
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_CPU)
|
||||||
include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_PROCESSOR}.cmake)
|
include(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_CPU}.cmake)
|
||||||
|
|
||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
# Compile flags
|
# Compile flags
|
||||||
|
@@ -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>)
|
# gets PROJECT name for the example (e.g. <BOARD>-<DIR_NAME>)
|
||||||
family_get_project_name(PROJECT ${CMAKE_CURRENT_LIST_DIR})
|
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)
|
project(${PROJECT} C CXX ASM)
|
||||||
|
|
||||||
# Checks this example is valid for the family and initializes the project
|
# Checks this example is valid for the family and initializes the project
|
||||||
@@ -15,18 +20,27 @@ if(FAMILY STREQUAL "espressif")
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${PROJECT})
|
if (BUILD_ZEPHYR)
|
||||||
|
set(EXE_NAME app)
|
||||||
|
else()
|
||||||
|
set(EXE_NAME ${PROJECT})
|
||||||
|
add_executable(${EXE_NAME})
|
||||||
|
endif()
|
||||||
|
|
||||||
# Example source
|
# Example source
|
||||||
target_sources(${PROJECT} PUBLIC
|
target_sources(${EXE_NAME} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
|
||||||
)
|
)
|
||||||
|
|
||||||
# Example include
|
# Example include
|
||||||
target_include_directories(${PROJECT} PUBLIC
|
target_include_directories(${EXE_NAME} PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
|
|
||||||
# Configure compilation flags and libraries for the example without RTOS.
|
# Configure compilation flags and libraries for the example without RTOS.
|
||||||
# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.
|
# 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()
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if 1
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -51,7 +52,7 @@ int main(void) {
|
|||||||
|
|
||||||
// Blink and print every interval ms
|
// Blink and print every interval ms
|
||||||
if (!(board_millis() - start_ms < 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();
|
start_ms = board_millis();
|
||||||
|
|
||||||
@@ -60,13 +61,58 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// echo
|
// echo
|
||||||
uint8_t ch;
|
// uint8_t ch;
|
||||||
if (board_uart_read(&ch, 1) > 0) {
|
// if (board_uart_read(&ch, 1) > 0) {
|
||||||
board_uart_write(&ch, 1);
|
// 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
|
#if TUSB_MCU_VENDOR_ESPRESSIF
|
||||||
void app_main(void) {
|
void app_main(void) {
|
||||||
main();
|
main();
|
||||||
|
@@ -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>)
|
# gets PROJECT name for the example (e.g. <BOARD>-<DIR_NAME>)
|
||||||
family_get_project_name(PROJECT ${CMAKE_CURRENT_LIST_DIR})
|
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)
|
project(${PROJECT} C CXX ASM)
|
||||||
|
|
||||||
# Checks this example is valid for the family and initializes the project
|
# Checks this example is valid for the family and initializes the project
|
||||||
@@ -16,20 +21,29 @@ if(FAMILY STREQUAL "espressif")
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${PROJECT})
|
if (BUILD_ZEPHYR)
|
||||||
|
set(EXE_NAME app)
|
||||||
|
else()
|
||||||
|
set(EXE_NAME ${PROJECT})
|
||||||
|
add_executable(${EXE_NAME})
|
||||||
|
endif()
|
||||||
|
|
||||||
# Example source
|
# Example source
|
||||||
target_sources(${PROJECT} PUBLIC
|
target_sources(${EXE_NAME} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/main.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c
|
||||||
)
|
)
|
||||||
|
|
||||||
# Example include
|
# Example include
|
||||||
target_include_directories(${PROJECT} PUBLIC
|
target_include_directories(${EXE_NAME} PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
|
|
||||||
# Configure compilation flags and libraries for the example... see the corresponding function
|
# Configure compilation flags and libraries for the example without RTOS.
|
||||||
# in hw/bsp/FAMILY/family.cmake for details.
|
# 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()
|
||||||
|
12
examples/west.yml
Normal file
12
examples/west.yml
Normal file
@@ -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: .
|
@@ -38,22 +38,24 @@ extern "C" {
|
|||||||
|
|
||||||
#include "tusb.h"
|
#include "tusb.h"
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_FREERTOS
|
#if CFG_TUSB_OS == OPT_OS_ZEPHYR
|
||||||
#if TUSB_MCU_VENDOR_ESPRESSIF
|
#include <zephyr/kernel.h>
|
||||||
// ESP-IDF need "freertos/" prefix in include path.
|
#elif CFG_TUSB_OS == OPT_OS_FREERTOS
|
||||||
// CFG_TUSB_OS_INC_PATH should be defined accordingly.
|
#if TUSB_MCU_VENDOR_ESPRESSIF
|
||||||
#include "freertos/FreeRTOS.h"
|
// ESP-IDF need "freertos/" prefix in include path.
|
||||||
#include "freertos/semphr.h"
|
// CFG_TUSB_OS_INC_PATH should be defined accordingly.
|
||||||
#include "freertos/queue.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/semphr.h"
|
||||||
#include "freertos/timers.h"
|
#include "freertos/queue.h"
|
||||||
#else
|
#include "freertos/task.h"
|
||||||
#include "FreeRTOS.h"
|
#include "freertos/timers.h"
|
||||||
#include "semphr.h"
|
#else
|
||||||
#include "queue.h"
|
#include "FreeRTOS.h"
|
||||||
#include "task.h"
|
#include "semphr.h"
|
||||||
#include "timers.h"
|
#include "queue.h"
|
||||||
#endif
|
#include "task.h"
|
||||||
|
#include "timers.h"
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Define the default baudrate
|
// 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
|
// Implement your own board_millis() in any of .c file
|
||||||
uint32_t board_millis(void);
|
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
|
#else
|
||||||
#error "board_millis() is not implemented for this OS"
|
#error "board_millis() is not implemented for this OS"
|
||||||
#endif
|
#endif
|
||||||
|
@@ -73,34 +73,39 @@ if (NOT NO_WARN_RWX_SEGMENTS_SUPPORTED)
|
|||||||
set(NO_WARN_RWX_SEGMENTS_SUPPORTED 1)
|
set(NO_WARN_RWX_SEGMENTS_SUPPORTED 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(WARNING_FLAGS_GNU
|
#set(WARNING_FLAGS_GNU
|
||||||
-Wall
|
# -Wall
|
||||||
-Wextra
|
# -Wextra
|
||||||
-Werror
|
# -Werror
|
||||||
-Wfatal-errors
|
# -Wfatal-errors
|
||||||
-Wdouble-promotion
|
# -Wdouble-promotion
|
||||||
-Wstrict-prototypes
|
# -Wstrict-prototypes
|
||||||
-Wstrict-overflow
|
# -Wstrict-overflow
|
||||||
-Werror-implicit-function-declaration
|
# -Werror-implicit-function-declaration
|
||||||
-Wfloat-equal
|
# -Wfloat-equal
|
||||||
-Wundef
|
# -Wundef
|
||||||
-Wshadow
|
# -Wshadow
|
||||||
-Wwrite-strings
|
# -Wwrite-strings
|
||||||
-Wsign-compare
|
# -Wsign-compare
|
||||||
-Wmissing-format-attribute
|
# -Wmissing-format-attribute
|
||||||
-Wunreachable-code
|
# -Wunreachable-code
|
||||||
-Wcast-align
|
# -Wcast-align
|
||||||
-Wcast-function-type
|
# -Wcast-function-type
|
||||||
-Wcast-qual
|
# -Wcast-qual
|
||||||
-Wnull-dereference
|
# -Wnull-dereference
|
||||||
-Wuninitialized
|
# -Wuninitialized
|
||||||
-Wunused
|
# -Wunused
|
||||||
-Wreturn-type
|
# -Wreturn-type
|
||||||
-Wredundant-decls
|
# -Wredundant-decls
|
||||||
)
|
# )
|
||||||
|
|
||||||
set(WARNING_FLAGS_IAR "")
|
set(WARNING_FLAGS_IAR "")
|
||||||
|
|
||||||
|
#if (BUILD_ZEPHYR)
|
||||||
|
# set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})
|
||||||
|
# find_package(Zephyr REQUIRED HINTS ${TOP}/lib/zephyr)
|
||||||
|
#endif ()
|
||||||
|
|
||||||
#-------------------------------------------------------------
|
#-------------------------------------------------------------
|
||||||
# Functions
|
# Functions
|
||||||
#-------------------------------------------------------------
|
#-------------------------------------------------------------
|
||||||
@@ -216,7 +221,7 @@ function(family_configure_common TARGET RTOS)
|
|||||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
|
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)
|
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 ()
|
endif ()
|
||||||
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||||
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
|
target_link_options(${TARGET} PUBLIC "LINKER:-Map=$<TARGET_FILE:${TARGET}>.map")
|
||||||
@@ -244,12 +249,12 @@ function(family_configure_common TARGET RTOS)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# run size after build
|
# run size after build
|
||||||
find_program(SIZE_EXE ${CMAKE_SIZE})
|
# find_program(SIZE_EXE ${CMAKE_SIZE})
|
||||||
if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
|
# if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)
|
||||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
# add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||||
COMMAND ${SIZE_EXE} $<TARGET_FILE:${TARGET}>
|
# COMMAND ${SIZE_EXE} $<TARGET_FILE:${TARGET}>
|
||||||
)
|
# )
|
||||||
endif ()
|
# endif ()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Add tinyusb to example
|
# Add tinyusb to example
|
||||||
@@ -272,6 +277,8 @@ function(family_add_tinyusb TARGET OPT_MCU RTOS)
|
|||||||
|
|
||||||
if (RTOS STREQUAL "freertos")
|
if (RTOS STREQUAL "freertos")
|
||||||
target_compile_definitions(${TARGET}-tinyusb_config INTERFACE CFG_TUSB_OS=OPT_OS_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 ()
|
endif ()
|
||||||
|
|
||||||
# tinyusb's CMakeList.txt
|
# tinyusb's CMakeList.txt
|
||||||
@@ -280,6 +287,8 @@ function(family_add_tinyusb TARGET OPT_MCU RTOS)
|
|||||||
if (RTOS STREQUAL "freertos")
|
if (RTOS STREQUAL "freertos")
|
||||||
# link tinyusb with freeRTOS kernel
|
# link tinyusb with freeRTOS kernel
|
||||||
target_link_libraries(${TARGET}-tinyusb PUBLIC freertos_kernel)
|
target_link_libraries(${TARGET}-tinyusb PUBLIC freertos_kernel)
|
||||||
|
elseif (RTOS STREQUAL "zephyr")
|
||||||
|
target_include_directories(${TARGET}-tinyusb PUBLIC ${ZEPHYR_BASE}/include)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# use max3421 as host controller
|
# use max3421 as host controller
|
||||||
@@ -353,33 +362,33 @@ endfunction()
|
|||||||
# RPI specific: refactor later
|
# RPI specific: refactor later
|
||||||
#----------------------------------
|
#----------------------------------
|
||||||
function(family_add_default_example_warnings TARGET)
|
function(family_add_default_example_warnings TARGET)
|
||||||
target_compile_options(${TARGET} PUBLIC
|
# target_compile_options(${TARGET} PUBLIC
|
||||||
-Wall
|
# -Wall
|
||||||
-Wextra
|
# -Wextra
|
||||||
-Werror
|
# -Werror
|
||||||
-Wfatal-errors
|
# -Wfatal-errors
|
||||||
-Wdouble-promotion
|
# -Wdouble-promotion
|
||||||
-Wfloat-equal
|
# -Wfloat-equal
|
||||||
# FIXME commented out because of https://github.com/raspberrypi/pico-sdk/issues/1468
|
# # FIXME commented out because of https://github.com/raspberrypi/pico-sdk/issues/1468
|
||||||
#-Wshadow
|
# #-Wshadow
|
||||||
-Wwrite-strings
|
# -Wwrite-strings
|
||||||
-Wsign-compare
|
# -Wsign-compare
|
||||||
-Wmissing-format-attribute
|
# -Wmissing-format-attribute
|
||||||
-Wunreachable-code
|
# -Wunreachable-code
|
||||||
-Wcast-align
|
# -Wcast-align
|
||||||
-Wcast-qual
|
# -Wcast-qual
|
||||||
-Wnull-dereference
|
# -Wnull-dereference
|
||||||
-Wuninitialized
|
# -Wuninitialized
|
||||||
-Wunused
|
# -Wunused
|
||||||
-Wredundant-decls
|
# -Wredundant-decls
|
||||||
#-Wstrict-prototypes
|
# #-Wstrict-prototypes
|
||||||
#-Werror-implicit-function-declaration
|
# #-Werror-implicit-function-declaration
|
||||||
#-Wundef
|
# #-Wundef
|
||||||
)
|
# )
|
||||||
|
|
||||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||||
if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND NO_WARN_RWX_SEGMENTS_SUPPORTED)
|
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()
|
endif()
|
||||||
|
|
||||||
# GCC 10
|
# GCC 10
|
||||||
|
@@ -2,3 +2,9 @@ set(MCU_VARIANT nrf52840)
|
|||||||
|
|
||||||
function(update_board TARGET)
|
function(update_board TARGET)
|
||||||
endfunction()
|
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)
|
||||||
|
@@ -67,6 +67,8 @@
|
|||||||
#define NRFX_VER 3
|
#define NRFX_VER 3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void nrfx_isr(const void *irq_handler);
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Forward USB interrupt events to TinyUSB IRQ Handler
|
// Forward USB interrupt events to TinyUSB IRQ Handler
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@@ -137,8 +139,22 @@ void board_init(void) {
|
|||||||
// Button
|
// Button
|
||||||
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
|
nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);
|
||||||
|
|
||||||
|
#if CFG_TUSB_OS == OPT_OS_NONE
|
||||||
// 1ms tick timer
|
// 1ms tick timer
|
||||||
SysTick_Config(SystemCoreClock / 1000);
|
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
|
// UART
|
||||||
#if NRFX_VER <= 2
|
#if NRFX_VER <= 2
|
||||||
|
@@ -8,10 +8,10 @@ include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
|
|||||||
|
|
||||||
# toolchain set up
|
# toolchain set up
|
||||||
if (MCU_VARIANT STREQUAL "nrf5340_application")
|
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)
|
set(JLINK_DEVICE nrf5340_xxaa_app)
|
||||||
else ()
|
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)
|
set(JLINK_DEVICE ${MCU_VARIANT}_xxaa)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@@ -113,12 +113,16 @@ endfunction()
|
|||||||
function(family_configure_example TARGET RTOS)
|
function(family_configure_example TARGET RTOS)
|
||||||
family_configure_common(${TARGET} ${RTOS})
|
family_configure_common(${TARGET} ${RTOS})
|
||||||
|
|
||||||
# Board target
|
if (BUILD_ZEPHYR)
|
||||||
add_board_target(board_${BOARD})
|
#target_link_libraries(board_${BOARD} PUBLIC zephyr_interface kernel)
|
||||||
|
elseif ()
|
||||||
|
# Board target
|
||||||
|
add_board_target(board_${BOARD})
|
||||||
|
endif ()
|
||||||
|
|
||||||
#---------- Port Specific ----------
|
#---------- Port Specific ----------
|
||||||
# These files are built for each example since it depends on example's tusb_config.h
|
# 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
|
# BSP
|
||||||
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
|
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
|
||||||
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
|
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
|
||||||
@@ -132,16 +136,20 @@ function(family_configure_example TARGET RTOS)
|
|||||||
|
|
||||||
# Add TinyUSB target and port source
|
# Add TinyUSB target and port source
|
||||||
family_add_tinyusb(${TARGET} OPT_MCU_NRF5X ${RTOS})
|
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
|
${TOP}/src/portable/nordic/nrf5x/dcd_nrf5x.c
|
||||||
)
|
)
|
||||||
target_link_libraries(${TARGET}-tinyusb PUBLIC board_${BOARD})
|
|
||||||
|
|
||||||
# Link dependencies
|
if (BUILD_ZEPHYR)
|
||||||
target_link_libraries(${TARGET} PUBLIC board_${BOARD} ${TARGET}-tinyusb)
|
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
|
# Flashing
|
||||||
family_add_bin_hex(${TARGET})
|
#family_add_bin_hex(${TARGET})
|
||||||
family_flash_jlink(${TARGET})
|
family_flash_jlink(${TARGET})
|
||||||
# family_flash_adafruit_nrfutil(${TARGET})
|
# family_flash_adafruit_nrfutil(${TARGET})
|
||||||
endfunction()
|
endfunction()
|
||||||
|
@@ -1,7 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017 - 2018, Nordic Semiconductor ASA
|
* Copyright (c) 2017 - 2024, Nordic Semiconductor ASA
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
*
|
*
|
||||||
@@ -60,14 +62,14 @@ extern "C" {
|
|||||||
/**
|
/**
|
||||||
* @brief Macro for placing a runtime assertion.
|
* @brief Macro for placing a runtime assertion.
|
||||||
*
|
*
|
||||||
* @param expression Expression to evaluate.
|
* @param expression Expression to be evaluated.
|
||||||
*/
|
*/
|
||||||
#define NRFX_ASSERT(expression)
|
#define NRFX_ASSERT(expression)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Macro for placing a compile time assertion.
|
* @brief Macro for placing a compile time assertion.
|
||||||
*
|
*
|
||||||
* @param expression Expression to evaluate.
|
* @param expression Expression to be evaluated.
|
||||||
*/
|
*/
|
||||||
#define NRFX_STATIC_ASSERT(expression)
|
#define NRFX_STATIC_ASSERT(expression)
|
||||||
|
|
||||||
@@ -76,8 +78,8 @@ extern "C" {
|
|||||||
/**
|
/**
|
||||||
* @brief Macro for setting the priority of a specific IRQ.
|
* @brief Macro for setting the priority of a specific IRQ.
|
||||||
*
|
*
|
||||||
* @param irq_number IRQ number.
|
* @param irq_number IRQ number.
|
||||||
* @param priority Priority to set.
|
* @param priority Priority to be set.
|
||||||
*/
|
*/
|
||||||
#define NRFX_IRQ_PRIORITY_SET(irq_number, priority) _NRFX_IRQ_PRIORITY_SET(irq_number, priority)
|
#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,
|
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);
|
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()
|
#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()
|
#define NRFX_CRITICAL_SECTION_EXIT()
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@@ -45,7 +45,7 @@ function(add_tinyusb TARGET)
|
|||||||
target_compile_options(${TARGET} PRIVATE
|
target_compile_options(${TARGET} PRIVATE
|
||||||
-Wall
|
-Wall
|
||||||
-Wextra
|
-Wextra
|
||||||
-Werror
|
#-Werror
|
||||||
-Wfatal-errors
|
-Wfatal-errors
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Wstrict-prototypes
|
-Wstrict-prototypes
|
||||||
|
@@ -63,6 +63,8 @@ typedef void (*osal_task_func_t)( void * );
|
|||||||
#include "osal_rtthread.h"
|
#include "osal_rtthread.h"
|
||||||
#elif CFG_TUSB_OS == OPT_OS_RTX4
|
#elif CFG_TUSB_OS == OPT_OS_RTX4
|
||||||
#include "osal_rtx4.h"
|
#include "osal_rtx4.h"
|
||||||
|
#elif CFG_TUSB_OS == OPT_OS_ZEPHYR
|
||||||
|
#include "osal_zephyr.h"
|
||||||
#elif CFG_TUSB_OS == OPT_OS_CUSTOM
|
#elif CFG_TUSB_OS == OPT_OS_CUSTOM
|
||||||
#include "tusb_os_custom.h" // implemented by application
|
#include "tusb_os_custom.h" // implemented by application
|
||||||
#else
|
#else
|
||||||
|
123
src/osal/osal_zephyr.h
Normal file
123
src/osal/osal_zephyr.h
Normal file
@@ -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
|
@@ -215,6 +215,7 @@
|
|||||||
#define OPT_OS_PICO 5 ///< Raspberry Pi Pico SDK
|
#define OPT_OS_PICO 5 ///< Raspberry Pi Pico SDK
|
||||||
#define OPT_OS_RTTHREAD 6 ///< RT-Thread
|
#define OPT_OS_RTTHREAD 6 ///< RT-Thread
|
||||||
#define OPT_OS_RTX4 7 ///< Keil RTX 4
|
#define OPT_OS_RTX4 7 ///< Keil RTX 4
|
||||||
|
#define OPT_OS_ZEPHYR 8 ///< Zephyr
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Mode and Speed
|
// Mode and Speed
|
||||||
|
Reference in New Issue
Block a user