Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions examples/device/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,21 @@ family_initialize_project(tinyusb_device_examples ${CMAKE_CURRENT_LIST_DIR})
# family_add_subdirectory will filter what to actually add based on selected FAMILY
set(EXAMPLE_LIST
audio_4_channel_mic
audio_4_channel_mic_freertos
audio_test
audio_test_freertos
audio_test_multi_rate
board_test
cdc_dual_ports
cdc_msc
cdc_msc_freertos
cdc_msc_throughput
cdc_uac2
dfu
dfu_runtime
dynamic_configuration
hid_boot_interface
hid_composite
hid_composite_freertos
hid_generic_inout
hid_multiple_interface
midi_test
midi_test_freertos
midi2_device
msc_dual_lun
mtp
Expand Down
9 changes: 7 additions & 2 deletions examples/device/audio_4_channel_mic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 3.20)

include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)

# Need to set Espressif defaults before project() is called
if(FAMILY STREQUAL "espressif")
list(APPEND SDKCONFIG_DEFAULTS "${CMAKE_CURRENT_LIST_DIR}/sdkconfig.defaults")
endif()

project(audio_4_channel_mic C CXX ASM)

# Checks this example is valid for the family and initializes the project
Expand Down Expand Up @@ -30,6 +35,6 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_libraries(${PROJECT_NAME} PUBLIC m)
endif()

# Configure compilation flags and libraries for the example without RTOS.
# Configure compilation flags and libraries for the selected RTOS.
# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.
family_configure_device_example(${PROJECT_NAME} noos)
family_configure_device_example(${PROJECT_NAME} ${RTOS})
35 changes: 29 additions & 6 deletions examples/device/audio_4_channel_mic/skip.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
mcu:SAMD11
mcu:SAME5X
mcu:SAMG
family:broadcom_64bit
family:espressif
mcu:CH583
rtos:noos mcu:SAMD11
rtos:noos mcu:SAME5X
rtos:noos mcu:SAMG
rtos:noos family:broadcom_64bit
rtos:noos family:espressif
rtos:noos mcu:CH583

rtos:freertos mcu:CH32F20X
rtos:freertos mcu:CH32V103
rtos:freertos mcu:CH32V20X
rtos:freertos mcu:CH32V307
rtos:freertos mcu:CH583
rtos:freertos mcu:CXD56
rtos:freertos mcu:F1C100S
rtos:freertos mcu:GD32VF103
rtos:freertos mcu:MCXA15
rtos:freertos mcu:MKL25ZXX
rtos:freertos mcu:MSP430x5xx
rtos:freertos mcu:FT90X
rtos:freertos mcu:SAMD11
rtos:freertos mcu:VALENTYUSB_EPTRI
rtos:freertos mcu:RAXXX
rtos:freertos mcu:STM32L0
rtos:freertos board:lpcxpresso11u37
rtos:freertos board:lpcxpresso1347
rtos:freertos family:broadcom_32bit
rtos:freertos family:broadcom_64bit
rtos:freertos family:nuc121_125
rtos:freertos family:hpmicro
135 changes: 116 additions & 19 deletions examples/device/audio_4_channel_mic/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,21 +72,18 @@ audio20_control_range_4_n_t(1) sampleFreqRng;
// Audio test data, 4 channels muxed together, buffer[0] for CH0, buffer[1] for CH1, buffer[2] for CH2, buffer[3] for CH3
uint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX * CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000];

void led_blinking_task(void);
void audio_task(void);
void led_blinking_task(void *param);
void audio_task(void *param);

#if CFG_TUSB_OS == OPT_OS_FREERTOS
static void usb_device_task(void *param);
static void freertos_init(void);
#endif

/*------------- MAIN -------------*/
int main(void) {
board_init();

// init device stack on configured roothub port
tusb_rhport_init_t dev_init = {
.role = TUSB_ROLE_DEVICE,
.speed = TUSB_SPEED_AUTO};
tusb_init(BOARD_TUD_RHPORT, &dev_init);

board_init_after_tusb();

// Init values
sampFreq = AUDIO_SAMPLE_RATE;
clkValid = 1;
Expand All @@ -112,11 +109,24 @@ int main(void) {
*p_buff++ = (uint16_t) ((int16_t) (sinf(t) * 750) + 6000);
}

#if CFG_TUSB_OS == OPT_OS_FREERTOS
freertos_init();
return 0;
#else
// init device stack on configured roothub port
tusb_rhport_init_t dev_init = {
.role = TUSB_ROLE_DEVICE,
.speed = TUSB_SPEED_AUTO};
tusb_init(BOARD_TUD_RHPORT, &dev_init);

board_init_after_tusb();

while (1) {
tud_task();// tinyusb device task
led_blinking_task();
audio_task();
led_blinking_task(NULL);
audio_task(NULL);
}
#endif
}

//--------------------------------------------------------------------+
Expand Down Expand Up @@ -153,14 +163,23 @@ void tud_resume_cb(void) {
// This task simulates an audio receive callback, one frame is received every 1ms.
// We assume that the audio data is read from an I2S buffer.
// In a real application, this would be replaced with actual I2S receive callback.
void audio_task(void) {
void audio_task(void *param) {
(void) param;
static uint32_t start_ms = 0;

#if CFG_TUSB_OS == OPT_OS_FREERTOS
while (1) {
#endif
uint32_t curr_ms = tusb_time_millis_api();
if (start_ms == curr_ms) {
return; // not enough time
if (start_ms != curr_ms) {
start_ms = curr_ms;
tud_audio_write(i2s_dummy_buffer, AUDIO_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX);
}
start_ms = curr_ms;
tud_audio_write(i2s_dummy_buffer, AUDIO_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX);

#if CFG_TUSB_OS == OPT_OS_FREERTOS
vTaskDelay(1);
}
#endif
}

//--------------------------------------------------------------------+
Expand Down Expand Up @@ -403,16 +422,94 @@ bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p
//--------------------------------------------------------------------+
// BLINKING TASK
//--------------------------------------------------------------------+
void led_blinking_task(void) {
static uint32_t start_ms = 0;
void led_blinking_task(void *param) {
(void) param;
static bool led_state = false;

#if CFG_TUSB_OS == OPT_OS_FREERTOS
while (1) {
vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);
#else
static uint32_t start_ms = 0;
// Blink every interval ms
if (tusb_time_millis_api() - start_ms < blink_interval_ms) {
return; // not enough time
}
start_ms += blink_interval_ms;
#endif

board_led_write(led_state);
led_state = 1 - led_state;// toggle

#if CFG_TUSB_OS == OPT_OS_FREERTOS
}
#endif
}

//--------------------------------------------------------------------+
// FreeRTOS
//--------------------------------------------------------------------+
#if CFG_TUSB_OS == OPT_OS_FREERTOS

#ifdef ESP_PLATFORM
#define USBD_STACK_SIZE 4096

void app_main(void) {
main();
}
#else
#define USBD_STACK_SIZE ((4 * configMINIMAL_STACK_SIZE / 2) * (CFG_TUSB_DEBUG ? 2 : 1))
#endif

#define BLINKY_STACK_SIZE configMINIMAL_STACK_SIZE
#define AUDIO_STACK_SIZE configMINIMAL_STACK_SIZE

#if configSUPPORT_STATIC_ALLOCATION
StackType_t blinky_stack[BLINKY_STACK_SIZE];
StaticTask_t blinky_taskdef;

StackType_t usb_device_stack[USBD_STACK_SIZE];
StaticTask_t usb_device_taskdef;

StackType_t audio_stack[AUDIO_STACK_SIZE];
StaticTask_t audio_taskdef;
#endif

// USB Device Driver task
// This top level thread processes all USB events and invokes callbacks.
static void usb_device_task(void *param) {
(void) param;

// init device stack on configured roothub port.
// This should be called after scheduler/kernel is started.
// Otherwise, it could cause kernel issue since USB IRQ handler uses RTOS queue API.
tusb_rhport_init_t dev_init = {
.role = TUSB_ROLE_DEVICE,
.speed = TUSB_SPEED_AUTO
};
tusb_init(BOARD_TUD_RHPORT, &dev_init);

board_init_after_tusb();

while (1) {
tud_task();// tinyusb device task
}
}

static void freertos_init(void) {
#if configSUPPORT_STATIC_ALLOCATION
xTaskCreateStatic(led_blinking_task, "blinky", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);
xTaskCreateStatic(usb_device_task, "usbd", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, usb_device_stack, &usb_device_taskdef);
xTaskCreateStatic(audio_task, "audio", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, audio_stack, &audio_taskdef);
#else
xTaskCreate(led_blinking_task, "blinky", BLINKY_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(usb_device_task, "usbd", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, NULL);
xTaskCreate(audio_task, "audio", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);
#endif

#ifndef ESP_PLATFORM
vTaskStartScheduler();
#endif
}

#endif
5 changes: 5 additions & 0 deletions examples/device/audio_4_channel_mic/src/tusb_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ extern "C" {
#define CFG_TUSB_OS OPT_OS_NONE
#endif

// Espressif IDF requires "freertos/" prefix in include path
#ifdef ESP_PLATFORM
#define CFG_TUSB_OS_INC_PATH freertos/
#endif

#ifndef CFG_TUSB_DEBUG
#define CFG_TUSB_DEBUG 0
#endif
Expand Down
40 changes: 0 additions & 40 deletions examples/device/audio_4_channel_mic_freertos/CMakeLists.txt

This file was deleted.

This file was deleted.

15 changes: 0 additions & 15 deletions examples/device/audio_4_channel_mic_freertos/Makefile

This file was deleted.

22 changes: 0 additions & 22 deletions examples/device/audio_4_channel_mic_freertos/skip.txt

This file was deleted.

Loading
Loading