diff --git a/apps/apptester/Makefile b/apps/apptester/Makefile index 0453beb..100f46f 100644 --- a/apps/apptester/Makefile +++ b/apps/apptester/Makefile @@ -23,8 +23,6 @@ subdir-ccflags-y += \ -Iservices/multimedia/speech/inc \ -Iservices/nv_section/include \ -Iservices/nv_section/aud_section \ - -Iplatform/drivers/usb/usb_dev/inc \ - -Itests/anc_usb \ -Iutils/hwtimer_list CFLAGS_usb_audio_app.o += -DAUDIO_OUTPUT_VOLUME_DEFAULT=$(AUDIO_OUTPUT_VOLUME_DEFAULT) @@ -58,9 +56,6 @@ ifeq ($(ADC_CH_SEP_BUFF),1) ANC_USB_CFG_FLAGS += -DADC_CH_SEP_BUFF endif -include platform/drivers/usb/usb_dev/uaud_cfg_flags.mk - -platform/drivers/usb/usb_dev/uaud_cfg_flags.mk: ; ANC_USB_CFG_FLAGS += $(UAUD_CFG_FLAGS) diff --git a/apps/btusbaudio/Makefile b/apps/btusbaudio/Makefile deleted file mode 100644 index e29b52a..0000000 --- a/apps/btusbaudio/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -obj-y := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)*.c $(cur_dir)*.cpp $(cur_dir)*.S)) - - -obj-y := $(obj-y:.c=.o) -obj-y := $(obj-y:.cpp=.o) -obj-y := $(obj-y:.S=.o) - -ccflags-y += \ - $(BT_IF_INCLUDES) \ - $(BT_PROFILES_INCLUDES) \ - -Iservices/bt_app \ - -Iservices/bt_app/a2dp_codecs/include \ - -Iservices/audioflinger \ - -Iservices/nvrecord \ - -Iservices/overlay \ - -Iservices/resources \ - -Iservices/audio_process \ - -Iapps/apptester \ - -Iapps/factory \ - -Iutils/crc32 \ - -Iplatform/drivers/bt \ - -Iplatform/drivers/ana \ - -Iapps/audioplayers/rbplay \ - -Itests/anc_usb \ - -Iapps/anc/inc \ - -Iapps/ota \ - -Ithirdparty/userapi \ - -Iservices/voicepath \ - -Iservices/voicepath/gsound/gsound_service \ - -Iservices/voicepath/gsound/gsound_target \ - -Iservices/communication \ - -Iutils/cqueue \ - -Iservices/ai_voice/ama/ama_manager \ - -Iservices/ai_voice/manager \ - -Iservices/multimedia/audio/codec/sbc/inc \ - -Iservices/multimedia/audio/codec/sbc/src/inc \ - -Iservices/interconnection - - diff --git a/apps/btusbaudio/btusb_audio.c b/apps/btusbaudio/btusb_audio.c deleted file mode 100644 index 5769820..0000000 --- a/apps/btusbaudio/btusb_audio.c +++ /dev/null @@ -1,260 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "app_audio.h" -#include "cmsis_os.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "stdio.h" - -#include "a2dp_api.h" -#include "app_bt.h" -#include "btapp.h" -#include "btusb_audio.h" -#include "usb_audio_app.h" - -extern void btusbaudio_entry(void); -extern void btusbaudio_exit(void); -extern a2dp_stream_t *app_bt_get_steam(enum BT_DEVICE_ID_T id); -extern int app_bt_get_bt_addr(enum BT_DEVICE_ID_T id, bt_bdaddr_t *bdaddr); -extern bool app_bt_a2dp_service_is_connected(void); -int app_bt_A2DP_OpenStream(a2dp_stream_t *Stream, bt_bdaddr_t *Addr); -int app_bt_A2DP_CloseStream(a2dp_stream_t *Stream); - -extern bool btapp_hfp_is_call_active(void); -static bool btusb_usb_is_on = false; -static enum BTUSB_MODE btusb_mode = BTUSB_MODE_INVALID; -static bool btusb_bt_audio_is_suspend = false; - -#define BT_USB_DEBUG() // TRACE(2,"_debug: %s,%d",__func__,__LINE__) -extern struct BT_DEVICE_T app_bt_device; - -static void _btusb_stream_open(unsigned int timeout_ms) { - a2dp_stream_t *stream = NULL; - bt_bdaddr_t bdaddr; - uint32_t stime = 0; - uint32_t etime = 0; - - stime = hal_sys_timer_get(); - // BT_USB_DEBUG(); - stream = (a2dp_stream_t *)app_bt_get_steam(BT_DEVICE_ID_1); - - app_bt_get_bt_addr(BT_DEVICE_ID_1, &bdaddr); - if (stream) { - // struct BT_DEVICE_T *bt_dev = &app_bt_device; - // A2DP_Register((a2dp_stream_t - // *)bt_dev->a2dp_stream[BT_DEVICE_ID_1]->a2dp_stream, &a2dp_avdtpcodec, - // NULL, (A2dpCallback) a2dp_callback); AVRCP_Register((AvrcpChannel - // *)bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle, - // (AvrcpCallback)avrcp_callback_CT, BTIF_AVRCP_CT_CATEGORY_1 | - // BTIF_AVRCP_CT_CATEGORY_2 | BTIF_AVRCP_TG_CATEGORY_2); - BT_USB_DEBUG(); - osDelay(10); - app_bt_A2DP_OpenStream(stream, &bdaddr); - } else { - BT_USB_DEBUG(); - return; - } - while (1) { - if (app_bt_a2dp_service_is_connected()) { - etime = hal_sys_timer_get(); - TRACE(1, "_debug: a2dp service connected, wait time = 0x%x.", - TICKS_TO_MS(etime - stime)); - break; - } else { - etime = hal_sys_timer_get(); - if (TICKS_TO_MS(etime - stime) >= timeout_ms) { - TRACE(1, "_debug: a2dp service connect timeout = 0x%x.", - TICKS_TO_MS(etime - stime)); - break; - } - osDelay(10); - } - } - // BT_USB_DEBUG(); -} - -static void _btusb_stream_close(unsigned int timeout_ms) { - a2dp_stream_t *stream = NULL; - uint32_t stime = 0; - uint32_t etime = 0; - - stime = hal_sys_timer_get(); - BT_USB_DEBUG(); - stream = (a2dp_stream_t *)app_bt_get_steam(BT_DEVICE_ID_1); - if (stream) { - BT_USB_DEBUG(); - app_bt_A2DP_CloseStream(stream); - } else { - BT_USB_DEBUG(); - return; - } - stime = hal_sys_timer_get(); - while (1) { - if (!app_bt_a2dp_service_is_connected()) { - // struct BT_DEVICE_T *bt_dev = &app_bt_device; - // AVRCP_Deregister(bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle); - // A2DP_Deregister(stream); - etime = hal_sys_timer_get(); - TRACE(1, "a2dp service diconnected, wait time = 0x%x.", - TICKS_TO_MS(etime - stime)); - break; - } else { - etime = hal_sys_timer_get(); - if (TICKS_TO_MS(etime - stime) >= timeout_ms) { - TRACE(1, "a2dp service diconnect timeout = 0x%x.", - TICKS_TO_MS(etime - stime)); - break; - } - osDelay(10); - } - } - BT_USB_DEBUG(); -} - -static void btusb_usbaudio_entry(void) { - BT_USB_DEBUG(); - btusbaudio_entry(); - btusb_usb_is_on = true; -} - -void btusb_usbaudio_open(void) { - BT_USB_DEBUG(); - if (!btusb_usb_is_on) { - btusb_usbaudio_entry(); - BT_USB_DEBUG(); - } else { - usb_audio_app(1); - } - BT_USB_DEBUG(); -} - -void btusb_usbaudio_close(void) { - BT_USB_DEBUG(); - if (btusb_usb_is_on) { - usb_audio_app(0); - BT_USB_DEBUG(); - } else { - BT_USB_DEBUG(); - } -} - -void btusb_btaudio_close(bool is_wait) { - BT_USB_DEBUG(); - // if(!btusb_bt_audio_is_suspend) - { - BT_USB_DEBUG(); - if (is_wait) { - app_audio_sendrequest(APP_PLAY_BACK_AUDIO, - (uint8_t)APP_BT_SETTING_CLOSEALL, 0); - _btusb_stream_close(BTUSB_OUTTIME_MS); - } else { - _btusb_stream_close(0); - } - btusb_bt_audio_is_suspend = true; - } -} - -void btusb_btaudio_open(bool is_wait) { - BT_USB_DEBUG(); - // if(btusb_bt_audio_is_suspend) - { - TRACE(2, "%s: %d.", __func__, __LINE__); - if (is_wait) { - _btusb_stream_open(BTUSB_OUTTIME_MS); - app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE, - 0); - app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_SETUP, - 0); - } else { - _btusb_stream_open(0); - } - TRACE(2, "%s: %d.", __func__, __LINE__); - btusb_bt_audio_is_suspend = false; - } -} - -void btusb_switch(enum BTUSB_MODE mode) { - // BT_USB_DEBUG(); - if (mode != BTUSB_MODE_BT && mode != BTUSB_MODE_USB) { - ASSERT(0, "%s:%d, mode = %d.", __func__, __LINE__, mode); - } - - if (btusb_mode == mode) { - BT_USB_DEBUG(); - return; - } - - if (btusb_mode == BTUSB_MODE_INVALID) { - if (mode == BTUSB_MODE_BT) { - TRACE(1, "%s: switch to BT mode.", __func__); - btusb_mode = BTUSB_MODE_BT; - } else { - TRACE(1, "%s: switch to USB mode.", __func__); - // btusb_btaudio_close(true); - osDelay(500); - btusb_usbaudio_open(); - btusb_mode = BTUSB_MODE_USB; - } - } else { - if (mode == BTUSB_MODE_BT) { - TRACE(1, "%s: switch to BT mode.", __func__); - if (btusb_usb_is_on) { - TRACE(1, "%s: btusb_usbaudio_close.", __func__); - btusb_usbaudio_close(); - TRACE(1, "%s: btusb_usbaudio_close done.", __func__); - osDelay(500); - } - btusb_mode = BTUSB_MODE_BT; - btusb_btaudio_open(true); - TRACE(1, "%s: switch to BT mode done.", __func__); - } else { - if (btapp_hfp_is_call_active() == 1) { - TRACE(1, "%s: hfp is call active.", __func__); - return; - } - TRACE(1, "%s: switch to USB mode.", __func__); - btusb_btaudio_close(true); - TRACE(1, "%s: btusb_btaudio_close done.", __func__); - osDelay(500); - btusb_usbaudio_open(); - btusb_mode = BTUSB_MODE_USB; - TRACE(1, "%s: switch to USB mode done.", __func__); - } - } -} - -bool btusb_is_bt_mode(void) { - BT_USB_DEBUG(); - return btusb_mode == BTUSB_MODE_BT ? true : false; -} - -bool btusb_is_usb_mode(void) { - return btusb_mode == BTUSB_MODE_USB ? true : false; -} - -#if defined(BT_USB_AUDIO_DUAL_MODE_TEST) -void test_btusb_switch(void) { - if (btusb_mode == BTUSB_MODE_BT) { - btusb_switch(BTUSB_MODE_USB); - } else { - btusb_switch(BTUSB_MODE_BT); - } -} - -void test_btusb_switch_to_bt(void) { btusb_switch(BTUSB_MODE_BT); } - -void test_btusb_switch_to_usb(void) { btusb_switch(BTUSB_MODE_USB); } -#endif diff --git a/apps/btusbaudio/btusb_audio.h b/apps/btusbaudio/btusb_audio.h deleted file mode 100644 index 134cae9..0000000 --- a/apps/btusbaudio/btusb_audio.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef _BTUSB_AUDIO_H_ -#define _BTUSB_AUDIO_H_ -#ifdef __cplusplus -extern "C" { -#endif - -#define BTUSB_OUTTIME_MS 1000 -enum BTUSB_MODE{ - BTUSB_MODE_BT, - BTUSB_MODE_USB, - BTUSB_MODE_INVALID -}; - -void btusb_usbaudio_open(void); -void btusb_usbaudio_close(void); -void btusb_btaudio_open(bool is_wait); -void btusb_btaudio_close(bool is_wait); -void btusb_switch(enum BTUSB_MODE mode); -bool btusb_is_bt_mode(void); -bool btusb_is_usb_mode(void); -#ifdef __cplusplus -} -#endif -#endif // _BTUSB_AUDIO_H_ - diff --git a/apps/btusbaudio/usbaudio_thread.c b/apps/btusbaudio/usbaudio_thread.c deleted file mode 100644 index ce537d1..0000000 --- a/apps/btusbaudio/usbaudio_thread.c +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "usbaudio_thread.h" -#include "app_utils.h" -#include "cmsis_os.h" -#include "hal_trace.h" -#include "usb_audio_app.h" - -static void usb_thread(void const *argument); -osThreadDef(usb_thread, osPriorityHigh, 1, 2048, "usb"); - -osMailQDef(usb_mailbox, USB_MAILBOX_MAX, USB_MESSAGE); -static osMailQId usb_mailbox = NULL; -static uint8_t usb_mailbox_cnt = 0; -#define USBAUDIO_DEBUG TRACE -static int usb_mailbox_init(void) { - USBAUDIO_DEBUG("%s,%d", __func__, __LINE__); - usb_mailbox = osMailCreate(osMailQ(usb_mailbox), NULL); - if (usb_mailbox == NULL) { - USBAUDIO_DEBUG("Failed to Create usb_mailbox\n"); - return -1; - } - usb_mailbox_cnt = 0; - return 0; -} - -int usb_mailbox_put(USB_MESSAGE *msg_src) { - osStatus status; - USB_MESSAGE *msg_p = NULL; - - USBAUDIO_DEBUG("%s,%d", __func__, __LINE__); - if (usb_mailbox_cnt >= 1) { - USBAUDIO_DEBUG("%s,%d usb_mailbox_cnt = %d.", __func__, __LINE__, - usb_mailbox_cnt); - return 0; - } - msg_p = (USB_MESSAGE *)osMailAlloc(usb_mailbox, 0); - ASSERT(msg_p, "osMailAlloc error"); - msg_p->id = msg_src->id; - msg_p->ptr = msg_src->ptr; - msg_p->param0 = msg_src->param0; - msg_p->param1 = msg_src->param1; - - status = osMailPut(usb_mailbox, msg_p); - if (osOK == status) - usb_mailbox_cnt++; - USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.", __func__, __LINE__, - usb_mailbox_cnt); - return (int)status; -} - -int usb_mailbox_free(USB_MESSAGE *msg_p) { - osStatus status; - - USBAUDIO_DEBUG("%s,%d", __func__, __LINE__); - status = osMailFree(usb_mailbox, msg_p); - if (osOK == status) - usb_mailbox_cnt--; - USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.", __func__, __LINE__, - usb_mailbox_cnt); - return (int)status; -} - -int usb_mailbox_get(USB_MESSAGE **msg_p) { - osEvent evt; - evt = osMailGet(usb_mailbox, osWaitForever); - if (evt.status == osEventMail) { - *msg_p = (USB_MESSAGE *)evt.value.p; - return 0; - } - return -1; -} - -static void usb_thread(void const *argument) { - // USB_FUNC_T usb_funcp; - USBAUDIO_DEBUG("%s,%d", __func__, __LINE__); - while (1) { - USB_MESSAGE *msg_p = NULL; - - if (!usb_mailbox_get(&msg_p)) { - // TRACE(2,"_debug: %s,%d",__func__,__LINE__); - USBAUDIO_DEBUG( - "usb_thread: id = 0x%x, ptr = 0x%x,param0 = 0x%x,param1 = 0x%x.", - msg_p->id, msg_p->ptr, msg_p->param0, msg_p->param1); - usb_mailbox_free(msg_p); - usb_audio_app_loop(); - } - } -} - -static void usb_enqueue_cmd(uint32_t data) { - USB_MESSAGE usb_msg; - - usb_msg.id = 0; - usb_msg.param0 = 0; - usb_msg.param1 = 0; - usb_msg.ptr = 0; - usb_mailbox_put(&usb_msg); -} - -int usb_os_init(void) { - osThreadId usb_tid; - - USBAUDIO_DEBUG("%s,%d", __func__, __LINE__); - if (usb_mailbox_init()) { - USBAUDIO_DEBUG("_debug: %s,%d", __func__, __LINE__); - return -1; - } - usb_tid = osThreadCreate(osThread(usb_thread), NULL); - if (usb_tid == NULL) { - USBAUDIO_DEBUG("Failed to Create usb_thread\n"); - return 0; - } - - usb_audio_set_enqueue_cmd_callback(usb_enqueue_cmd); - - return 0; -} diff --git a/apps/btusbaudio/usbaudio_thread.h b/apps/btusbaudio/usbaudio_thread.h deleted file mode 100644 index c9ecc07..0000000 --- a/apps/btusbaudio/usbaudio_thread.h +++ /dev/null @@ -1,49 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_THREAD_H__ -#define __USB_THREAD_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define USB_MAILBOX_MAX (20) - -typedef struct { - uint32_t id; - uint32_t ptr; - uint32_t param0; - uint32_t param1; -} USB_MESSAGE; - - -//typedef int (*USB_MOD_HANDLER_T)(USB_MESSAGE_BODY *); -typedef void (*USB_FUNC_T)(uint32_t, uint32_t); - -int usb_mailbox_put(USB_MESSAGE* msg_src); - -int usb_mailbox_free(USB_MESSAGE* msg_p); - -int usb_mailbox_get(USB_MESSAGE** msg_p); - -int usb_os_init(void); - -#ifdef __cplusplus - } -#endif - -#endif // __USB_THREAD_H__ - diff --git a/apps/factory/Makefile b/apps/factory/Makefile index 03130f6..71d6a07 100644 --- a/apps/factory/Makefile +++ b/apps/factory/Makefile @@ -18,7 +18,6 @@ ccflags-y += \ -Iapps/key \ -Iplatform/drivers/bt \ -Iplatform/drivers/ana \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iapps/battery \ -Iservices/multimedia/audio/codec/sbc/inc \ -Iservices/multimedia/audio/codec/sbc/src/inc \ diff --git a/apps/mic_alg/Makefile b/apps/mic_alg/Makefile index e1c5fd2..5beade3 100644 --- a/apps/mic_alg/Makefile +++ b/apps/mic_alg/Makefile @@ -30,7 +30,6 @@ ccflags-y += \ -Iapps/i2c_sensor \ -Iplatform/drivers/bt \ -Iplatform/drivers/ana \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iapps/battery ifeq ($(AUDIO_RESAMPLE),1) diff --git a/apps/usbaudio/Makefile b/apps/usbaudio/Makefile deleted file mode 100644 index 64ee009..0000000 --- a/apps/usbaudio/Makefile +++ /dev/null @@ -1,193 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -obj-y := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)*.c $(cur_dir)*.cpp $(cur_dir)*.S)) - -obj-y += ../../tests/anc_usb/usb_audio_app.c -obj-y += ../../tests/anc_usb/safe_queue.c -obj-y += ../../tests/anc_usb/memutils.c - -ifeq ($(USB_AUDIO_SPEECH),1) -obj-y += ../../tests/anc_usb/speech_process.c -endif - -ifeq ($(ANC_APP),1) -obj-y += ../../tests/anc_usb/anc_usb_app.c -endif - -obj-y := $(obj-y:.c=.o) -obj-y := $(obj-y:.cpp=.o) -obj-y := $(obj-y:.S=.o) - - -ccflags-y += \ - -Iutils/boot_struct \ - -Iutils/crc32 \ - -Iutils/hexdump \ - -Iutils/hwtimer_list \ - -Itests/programmer \ - -Iplatform/drivers/usb/usb_dev/inc \ - -Iplatform/drivers/ana \ - -Iservices/multimedia/audio/process/adp/include \ - -Iservices/multimedia/audio/process/anc/include \ - -Iservices/multimedia/audio/process/filters/include \ - -Iservices/multimedia/audio/process/resample/include \ - -Iservices/multimedia/speech/inc \ - -Iservices/audio_process \ - -Iservices/nv_section/aud_section \ - -Iservices/nv_section/include \ - -Iservices/overlay \ - -Itests/anc_usb - -CFLAGS_usbaudio_entry.o += -DUSB_AUDIO_APP -CFLAGS_usb_audio_app.o += -DAUDIO_OUTPUT_VOLUME_DEFAULT=$(AUDIO_OUTPUT_VOLUME_DEFAULT) -CFLAGS_adda_loop_app.o += -DAUDIO_OUTPUT_VOLUME_DEFAULT=$(AUDIO_OUTPUT_VOLUME_DEFAULT) - -ANC_USB_CFG_FLAGS := - -# ANC option -ifeq ($(ANC_APP),1) -ANC_USB_CFG_FLAGS += -DANC_APP -endif - -# USB audio option -ifeq ($(USB_AUDIO_APP),1) -ANC_USB_CFG_FLAGS += -DUSB_AUDIO_APP -endif - -ifeq ($(USB_HIGH_SPEED),1) -ANC_USB_CFG_FLAGS += -DUSB_HIGH_SPEED -endif - -ifeq ($(AUDIO_RESAMPLE),1) -ANC_USB_CFG_FLAGS += -D__AUDIO_RESAMPLE__ -endif - -ifeq ($(ADC_CH_SEP_BUFF),1) -ANC_USB_CFG_FLAGS += -DADC_CH_SEP_BUFF -endif - -include platform/drivers/usb/usb_dev/uaud_cfg_flags.mk - -platform/drivers/usb/usb_dev/uaud_cfg_flags.mk: ; - -ANC_USB_CFG_FLAGS += $(UAUD_CFG_FLAGS) - -# USB audio configuration -ifeq ($(USB_AUDIO_DYN_CFG),1) -ifneq ($(AUDIO_RESAMPLE),1) -SW_CAPTURE_RESAMPLE ?= 1 -endif -endif - -ifeq ($(AUDIO_PLAYBACK_24BIT),1) -ANC_USB_CFG_FLAGS += -DAUDIO_PLAYBACK_24BIT -endif - -# DSD configuration -ifeq ($(HW_FIR_DSD_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_FIR_DSD_PROCESS__ -endif - -# EQ configuration -ifeq ($(HW_FIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_FIR_EQ_PROCESS__ -endif - -ifeq ($(HW_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_IIR_EQ_PROCESS__ -endif - -ifeq ($(SW_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__SW_IIR_EQ_PROCESS__ -endif - -ifeq ($(HW_DAC_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_DAC_IIR_EQ_PROCESS__ -endif - -ifeq ($(SW_CAPTURE_RESAMPLE),1) -ANC_USB_CFG_FLAGS += -DSW_CAPTURE_RESAMPLE -endif - -CFLAGS_usbaudio_entry.o += $(ANC_USB_CFG_FLAGS) -CFLAGS_usb_audio_app.o += $(ANC_USB_CFG_FLAGS) -CFLAGS_anc_usb_app.o += $(ANC_USB_CFG_FLAGS) - -ifeq ($(ANC_KEY_DOUBLE_CLICK_ON_OFF),1) -CFLAGS_anc_usb_app.o += -DANC_KEY_DOUBLE_CLICK_ON_OFF -endif - -ifeq ($(ANC_FF_ENABLED),1) -CFLAGS_anc_usb_app.o += -DANC_FF_ENABLED -endif - -ifeq ($(ANC_FB_ENABLED),1) -CFLAGS_anc_usb_app.o += -DANC_FB_ENABLED -endif - -ifeq ($(AUDIO_SECTION_SUPPT),1) -CFLAGS_anc_usb_app.o += -D__AUDIO_SECTION_SUPPT__ -endif - -ifeq ($(ANC_INIT_OFF),1) -CFLAGS_anc_usb_app.o += -DANC_INIT_OFF -endif - -ifeq ($(PC_CMD_UART),1) -CFLAGS_usbaudio_entry.o += -D__PC_CMD_UART__ -endif - -ifeq ($(DELAY_STREAM_OPEN),1) -CFLAGS_usb_audio_app.o += -DDELAY_STREAM_OPEN -endif - -ifeq ($(NOISE_GATING),1) -CFLAGS_usb_audio_app.o += -DNOISE_GATING -endif - -ifeq ($(NOISE_REDUCTION),1) -CFLAGS_usb_audio_app.o += -DNOISE_REDUCTION -endif - -ifeq ($(ANC_L_R_MISALIGN_WORKAROUND),1) -CFLAGS_usb_audio_app.o += -DANC_L_R_MISALIGN_WORKAROUND -endif - -ifeq ($(ANDROID_ACCESSORY_SPEC),1) -CFLAGS_usb_audio_app.o += -DANDROID_ACCESSORY_SPEC -ifeq ($(ANDROID_VOICE_CMD_KEY),1) -CFLAGS_usb_audio_app.o += -DANDROID_VOICE_CMD_KEY -endif -endif - -ifeq ($(DUAL_AUX_MIC_MORE_FILTER),1) -CFLAGS_usb_audio_app.o += -DDUAL_AUX_MIC_MORE_FILTER -endif - -ifeq ($(FREQ_RESP_EQ),1) -CFLAGS_usb_audio_app.o += -DFREQ_RESP_EQ -endif - -ifeq ($(KEEP_SAME_LATENCY),1) -CFLAGS_usb_audio_app.o += -DKEEP_SAME_LATENCY -CFLAGS_speech_process.o += -DKEEP_SAME_LATENCY -endif - -ifeq ($(USB_AUDIO_PWRKEY_TEST),1) -CFLAGS_usb_audio_app.o += -DUSB_AUDIO_PWRKEY_TEST -endif - -ifeq ($(AUDIO_RESAMPLE),1) -# If neither best1000 nor best2000 -ifeq ($(filter best1000 best2000,$(CHIP)),) -PLL_TUNE_SAMPLE_RATE ?= 1 -endif -ifeq ($(PLL_TUNE_SAMPLE_RATE),1) -CFLAGS_usb_audio_app.o += -DPLL_TUNE_SAMPLE_RATE -endif -endif - -ifeq ($(USB_AUDIO_SPEECH),1) -CFLAGS_usbaudio_entry.o += -DUSB_AUDIO_SPEECH -CFLAGS_usb_audio_app.o += -DUSB_AUDIO_SPEECH -endif diff --git a/apps/usbaudio/usbaudio_entry.c b/apps/usbaudio/usbaudio_entry.c deleted file mode 100644 index ec4703d..0000000 --- a/apps/usbaudio/usbaudio_entry.c +++ /dev/null @@ -1,363 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "analog.h" -#include "audioflinger.h" -#include "cmsis.h" -#include "hal_cmu.h" -#include "hal_dma.h" -#include "hal_gpadc.h" -#include "hal_iomux.h" -#include "hal_key.h" -#include "hal_sleep.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "plat_addr_map.h" -#include "pmu.h" -#include "string.h" -#if defined(ANC_APP) -#include "anc_usb_app.h" -#endif -#include "audio_process.h" -#include "dualadc_audio_app.h" -#include "tgt_hardware.h" -#include "usb_audio_app.h" -#include "usb_audio_frm_defs.h" - -#ifdef RTOS -#include "cmsis_os.h" -#endif -#ifdef __PC_CMD_UART__ -#include "hal_cmd.h" -#endif - -#ifdef USB_AUDIO_SPEECH -#define CODEC_BUFF_FRAME_NUM (2 * 16) -#define USB_BUFF_FRAME_NUM (CODEC_BUFF_FRAME_NUM * 2) -#else -#define CODEC_BUFF_FRAME_NUM 4 -#define USB_BUFF_FRAME_NUM 8 -#endif - -#if (CODEC_BUFF_FRAME_NUM >= USB_BUFF_FRAME_NUM) -#error \ - "Codec buffer frame num should be less than usb buffer frame num (on the requirement of conflict ctrl)" -#endif - -#ifdef USB_AUDIO_DYN_CFG -#define USB_AUDIO_PLAYBACK_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN) -#define USB_AUDIO_CAPTURE_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN) - -#define USB_AUDIO_RECV_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN) -#define USB_AUDIO_SEND_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN) - -#if defined(CHIP_BEST1000) -// FIR EQ is working on 16-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int16_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE USB_AUDIO_PLAYBACK_BUFF_SIZE -#elif defined(CHIP_BEST2000) -// FIR EQ is working on 32-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 2) -#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P) -// FIR EQ is working on 32-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 2) -#endif - -#else -#define USB_AUDIO_PLAYBACK_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN) -#define USB_AUDIO_CAPTURE_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN) - -#define USB_AUDIO_RECV_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN) -#define USB_AUDIO_SEND_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN) - -#if defined(CHIP_BEST1000) -// FIR EQ is working on 16-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE \ - (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int16_t) / SAMPLE_SIZE_PLAYBACK) -#elif defined(CHIP_BEST2000) -// FIR EQ is working on 16-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE \ - (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK) -#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P) -// FIR EQ is working on 16-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE \ - (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK) -#endif -#endif - -#if (defined(CHIP_BEST1000) && \ - (defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) && \ - (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) -// Resample input buffer size should be (half_of_max_sample_num * -// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE). half_of_max_sample_num = 48000 / -// 1000 * CODEC_BUFF_FRAME_NUM / 2 * 48 / 44 -#define RESAMPLE_INPUT_BUFF_SIZE \ - ALIGN(48000 / 1000 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE * \ - CODEC_BUFF_FRAME_NUM / 2 * 48 / 44, \ - 4) -#else -#define RESAMPLE_INPUT_BUFF_SIZE 0 -#endif -// Resample history buffer size should be -// sizeof(struct RESAMPLE_CTRL_T) + ((SAMPLE_NUM + phase_coef_num) * -// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) -#define RESAMPLE_HISTORY_BUFF_SIZE \ - (50 + (256 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE)) -#define USB_AUDIO_RESAMPLE_BUFF_SIZE \ - (RESAMPLE_INPUT_BUFF_SIZE + RESAMPLE_HISTORY_BUFF_SIZE) - -#define ALIGNED4 ALIGNED(4) - -#if defined(USB_AUDIO_APP) || defined(DUALADC_AUDIO_TEST) - -#ifdef AUDIO_ANC_FB_MC -static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE * - 9]; // max 48->384 or 44.1->44.1*8; -#else -static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE]; -#endif - -static uint8_t ALIGNED4 capture_buff[USB_AUDIO_CAPTURE_BUFF_SIZE]; - -#endif - -#ifdef USB_AUDIO_APP -#if defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 - eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE + USB_AUDIO_IIR_EQ_BUFF_SIZE]; -#elif defined(__HW_FIR_EQ_PROCESS__) && !defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE]; -#elif !defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 eq_buff[USB_AUDIO_IIR_EQ_BUFF_SIZE]; -#else -static uint8_t ALIGNED4 eq_buff[0]; -#endif - -#ifdef SW_CAPTURE_RESAMPLE -static uint8_t ALIGNED4 resample_buff[USB_AUDIO_RESAMPLE_BUFF_SIZE]; -#else -static uint8_t ALIGNED4 resample_buff[0]; -#endif - -static uint8_t ALIGNED4 recv_buff[USB_AUDIO_RECV_BUFF_SIZE]; -static uint8_t ALIGNED4 send_buff[USB_AUDIO_SEND_BUFF_SIZE]; -#endif - -#ifdef CFG_HW_KEY_LED_PIN -const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_key_led[1] = { - {CFG_HW_KEY_LED_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, - HAL_IOMUX_PIN_NOPULL}, -}; -#endif - -#ifdef CFG_MIC_KEY -extern void mic_key_open(void); -#endif - -static void uart_i2c_switch(void) { - static int flag = 0; - - flag ^= 1; - - if (flag) { - hal_iomux_set_analog_i2c(); - } else { - hal_iomux_set_uart0(); - } -} - -static int POSSIBLY_UNUSED key_event_process(uint32_t key_code, - uint8_t key_event) { - TRACE(3, "%s: code=0x%X, event=%u", __FUNCTION__, key_code, key_event); - -#ifdef CFG_HW_KEY_LED_PIN - if (key_event == HAL_KEY_EVENT_DOWN) { - hal_gpio_pin_set(CFG_HW_KEY_LED_PIN); - } else if (key_event == HAL_KEY_EVENT_UP) { - hal_gpio_pin_clr(CFG_HW_KEY_LED_PIN); - } -#endif - -#ifdef USB_AUDIO_APP - if (usb_audio_app_key(key_code, key_event) == 0) { - return 0; - } -#endif - -#ifdef ANC_APP - if (anc_usb_app_key(key_code, key_event) == 0) { - return 0; - } -#endif - - if (key_event == HAL_KEY_EVENT_CLICK) { - if (key_code == HAL_KEY_CODE_FN9) { - uart_i2c_switch(); - } - } - - return 0; -} - -void anc_usb_open(void) { - TRACE(1, "%s", __FUNCTION__); - -#ifdef __AUDIO_RESAMPLE__ - hal_cmu_audio_resample_enable(); -#endif - -#ifdef USB_AUDIO_APP - struct USB_AUDIO_BUF_CFG cfg; - - memset(&cfg, 0, sizeof(cfg)); - cfg.play_buf = playback_buff; -#ifdef AUDIO_ANC_FB_MC - cfg.play_size = sizeof(playback_buff) / 9; -#else - cfg.play_size = sizeof(playback_buff); -#endif - cfg.cap_buf = capture_buff; - cfg.cap_size = sizeof(capture_buff); - cfg.recv_buf = recv_buff; - cfg.recv_size = sizeof(recv_buff); - cfg.send_buf = send_buff; - cfg.send_size = sizeof(send_buff); - cfg.eq_buf = eq_buff; - cfg.eq_size = sizeof(eq_buff); - cfg.resample_buf = resample_buff; - cfg.resample_size = sizeof(resample_buff); - - usb_audio_app_init(&cfg); - usb_audio_app(1); -#endif - -#ifdef ANC_APP - anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, SAMPLE_RATE_PLAYBACK, - SAMPLE_RATE_CAPTURE); -#endif - -#ifdef DUALADC_AUDIO_TEST - dualadc_audio_app_init(playback_buff, USB_AUDIO_PLAYBACK_BUFF_SIZE, - capture_buff, USB_AUDIO_CAPTURE_BUFF_SIZE); - dualadc_audio_app(1); -#endif - -#if defined(CFG_MIC_KEY) - mic_key_open(); -#endif -#ifdef BT_USB_AUDIO_DUAL_MODE - return; -#endif - // Allow sleep - hal_sysfreq_req(HAL_SYSFREQ_USER_INIT, HAL_CMU_FREQ_32K); - - while (1) { -#ifdef USB_AUDIO_APP - usb_audio_app_loop(); -#endif - -#ifdef ANC_APP - anc_usb_app_loop(); -#endif - -#ifdef RTOS - // Let the task sleep - osDelay(20); -#else // !RTOS - -#ifdef __PC_CMD_UART__ - hal_cmd_run(); -#endif - - hal_sleep_enter_sleep(); - -#endif // !RTOS - } -} - -void anc_usb_close(void) { usb_audio_app(0); } - -#ifdef CFG_HW_GPADCKEY -void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt) { - static uint16_t stable_cnt = 0; - static uint16_t click_cnt = 0; - static uint32_t click_time; - uint32_t time; - enum HAL_KEY_EVENT_T event; - bool send_event = false; - - time = hal_sys_timer_get(); - - if (volt < 100) { - stable_cnt++; - // TRACE(5,"adc_key down: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - } else { - if (stable_cnt > 1) { - // TRACE(5,"adc_key up: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - if (click_cnt == 0 || (time - click_time) < MS_TO_TICKS(500)) { - click_time = time; - click_cnt++; - if (click_cnt >= 3) { - send_event = true; - } - } else { - send_event = true; - } - } - stable_cnt = 0; - - if (click_cnt > 0 && (time - click_time) >= MS_TO_TICKS(500)) { - send_event = true; - } - - if (send_event) { - // TRACE(5,"adc_key click: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - if (click_cnt == 1) { - event = HAL_KEY_EVENT_CLICK; - } else if (click_cnt == 2) { - event = HAL_KEY_EVENT_DOUBLECLICK; - } else { - event = HAL_KEY_EVENT_TRIPLECLICK; - } - key_event_process(CFG_HW_GPADCKEY, event); - click_cnt = 0; - } - } -} -#endif - -// GDB can set a breakpoint on the main function only if it is -// declared as below, when linking with STD libraries. -int btusbaudio_entry(void) { - anc_usb_open(); - return 0; -} - -void btusbaudio_exit(void) { anc_usb_close(); } diff --git a/apps/usbhost/Makefile b/apps/usbhost/Makefile deleted file mode 100644 index a2b6b88..0000000 --- a/apps/usbhost/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -obj-y := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)*.c $(cur_dir)*.cpp $(cur_dir)*.S)) -obj-y := $(obj-y:.c=.o) -obj-y := $(obj-y:.cpp=.o) -obj-y := $(obj-y:.S=.o) - diff --git a/apps/usbhost/app_usbhost.c b/apps/usbhost/app_usbhost.c deleted file mode 100644 index 35c02c1..0000000 --- a/apps/usbhost/app_usbhost.c +++ /dev/null @@ -1,18 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "app_thread.h" -#include "cmsis_os.h" -#include "hal_trace.h" diff --git a/apps/usbhost/app_usbhost.h b/apps/usbhost/app_usbhost.h deleted file mode 100644 index c12f1ee..0000000 --- a/apps/usbhost/app_usbhost.h +++ /dev/null @@ -1,27 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __APP_USBHOST_H__ -#define __APP_USBHOST_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus - } -#endif - -#endif//__FMDEC_H__ diff --git a/config/Makefile b/config/Makefile index 90dd8d5..7c6d917 100644 --- a/config/Makefile +++ b/config/Makefile @@ -19,7 +19,6 @@ obj-y := $(obj-y:.S=.o) ccflags-y += \ -Iplatform/hal \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iservices/nv_section/aud_section \ -Iservices/nv_section/include \ -Iservices/multimedia/speech/inc \ diff --git a/platform/drivers/Makefile b/platform/drivers/Makefile index d45fd5a..8bc5f8b 100644 --- a/platform/drivers/Makefile +++ b/platform/drivers/Makefile @@ -1,9 +1,5 @@ obj-y := ana/ codec/ norflash/ bt/ btpcm/ sbcacc/ -ifeq ($(CHIP_HAS_USB),1) -obj-y += usb/ -endif - subdir-ccflags-y += -Iplatform/drivers/ana \ -Iplatform/drivers/bt diff --git a/platform/drivers/usb/Makefile b/platform/drivers/usb/Makefile deleted file mode 100644 index 7f54e96..0000000 --- a/platform/drivers/usb/Makefile +++ /dev/null @@ -1 +0,0 @@ -obj-y := usb_dev/ diff --git a/platform/drivers/usb/usb_dev/Makefile b/platform/drivers/usb/usb_dev/Makefile deleted file mode 100644 index fe0a98d..0000000 --- a/platform/drivers/usb/usb_dev/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -src_obj := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)src/*.c $(cur_dir)src/*.S)) -src_obj := $(src_obj:.c=.o) -src_obj := $(src_obj:.S=.o) - -cfg_obj := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)cfg/*.c $(cur_dir)cfg/*.S)) -cfg_obj := $(cfg_obj:.c=.o) -cfg_obj := $(cfg_obj:.S=.o) - -USB_DEV_LIB_NAME := libusbdev - -ccflags-y += -Iplatform/drivers/usb/usb_dev/inc - -ifeq ($(USB_HIGH_SPEED),1) -ccflags-y += -DUSB_HIGH_SPEED -endif - -CFLAGS_usb_cdc.o += -Itests/programmer/inc - -CFLAGS_usb_audio.o += -Iutils/hwtimer_list - -CFLAGS_usb_audio_sync.o += -Iplatform/drivers/ana - -USB_AUDIO_NO_START_ERR ?= 1 -ifeq ($(USB_AUDIO_NO_START_ERR),1) -CFLAGS_usb_audio.o += -DUSB_AUDIO_NO_START_ERR -endif - -ifneq ($(USYNC_TRACE_VERBOSE),) -CFLAGS_usb_audio_sync.o += -DUSYNC_TRACE_VERBOSE=$(USYNC_TRACE_VERBOSE) -endif - -ifneq ($(USB_CDC_VENDOR_ID),) -CFLAGS_usb_dev_desc.o += -DUSB_CDC_VENDOR_ID=$(USB_CDC_VENDOR_ID) -endif - -ifneq ($(USB_CDC_PRODUCT_ID),) -CFLAGS_usb_dev_desc.o += -DUSB_CDC_PRODUCT_ID=$(USB_CDC_PRODUCT_ID) -endif - -ifneq ($(USB_AUDIO_VENDOR_ID),) -CFLAGS_usb_dev_desc.o += -DUSB_AUDIO_VENDOR_ID=$(USB_AUDIO_VENDOR_ID) -endif - -ifneq ($(USB_AUDIO_PRODUCT_ID),) -CFLAGS_usb_dev_desc.o += -DUSB_AUDIO_PRODUCT_ID=$(USB_AUDIO_PRODUCT_ID) -endif - -ifeq ($(USB_LPM),1) -CFLAGS_usb_dev_desc.o += -DUSB_LPM -ifeq ($(USB_LPM_DEEP_BESL),1) -CFLAGS_usb_dev_desc.o += -DUSB_LPM_DEEP_BESL -endif -endif - -include $(cur_dir)uaud_cfg_flags.mk - -$(cur_dir)uaud_cfg_flags.mk: ; - -ifeq ($(USB_AUDIO_DYN_CFG),1) - -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_dyn - -else # USB_AUDIO_DYN_CFG != 1 - -ifeq ($(USB_AUDIO_384K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_384k -else ifeq ($(USB_AUDIO_352_8K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_352p8k -else ifeq ($(USB_AUDIO_192K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_192k -else ifeq ($(USB_AUDIO_176_4K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_176p4k -else ifeq ($(USB_AUDIO_96K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_96k -else ifeq ($(USB_AUDIO_44_1K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_44p1k -else ifeq ($(USB_AUDIO_16K),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_16k -endif - -ifeq ($(USB_AUDIO_32BIT),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_32b -else -ifeq ($(USB_AUDIO_24BIT),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_24b -endif -endif - -endif # USB_AUDIO_DYN_CFG != 1 - -ifneq ($(USB_AUDIO_SEND_CHAN),) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_s$(USB_AUDIO_SEND_CHAN) -endif - -ifeq ($(USB_AUDIO_UAC2),1) -USB_DEV_LIB_NAME := $(USB_DEV_LIB_NAME)_uac2 -endif - -CFLAGS_usb_audio.o += $(UAUD_CFG_FLAGS) -CFLAGS_usb_dev_desc.o += $(UAUD_CFG_FLAGS) - -ifeq ($(SIMU_UAUD_MAX_PKT),1) -CFLAGS_usb_audio.o += -DSIMU_UAUD_MAX_PKT -endif - -ifeq ($(ANDROID_ACCESSORY_SPEC),1) -CFLAGS_usb_audio.o += -DANDROID_ACCESSORY_SPEC -ifeq ($(STRICT_ANDROID_ACCESSORY_SPEC),1) -CFLAGS_usb_audio.o += -DSTRICT_ANDROID_ACCESSORY_SPEC -ifeq ($(ANDROID_VOICE_CMD_KEY),1) -CFLAGS_usb_audio.o += -DANDROID_VOICE_CMD_KEY -endif -endif -endif - -ifneq ($(USB_AUDIO_RECV_ENABLE),0) -CFLAGS_usb_audio.o += -DUSB_AUDIO_RECV_ENABLE -CFLAGS_usb_audio_sync.o += -DUSB_AUDIO_RECV_ENABLE -endif -ifneq ($(USB_AUDIO_SEND_ENABLE),0) -CFLAGS_usb_audio.o += -DUSB_AUDIO_SEND_ENABLE -CFLAGS_usb_audio_sync.o += -DUSB_AUDIO_SEND_ENABLE -endif - -$(USB_DEV_LIB_NAME)-y := $(src_obj) - -obj-y := $(USB_DEV_LIB_NAME).a $(cfg_obj) - diff --git a/platform/drivers/usb/usb_dev/cfg/usb_dev_desc.c b/platform/drivers/usb/usb_dev/cfg/usb_dev_desc.c deleted file mode 100644 index 3865dc6..0000000 --- a/platform/drivers/usb/usb_dev/cfg/usb_dev_desc.c +++ /dev/null @@ -1,499 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "usb_dev_desc.h" -#include "hal_usb.h" -#include "tgt_hardware.h" -#include "usb_descriptor.h" - -#ifdef USB_HIGH_SPEED -#define DEV_QUAL_USB_VER 0x0200 -#define USB_CDC_USB_VER 0x0200 -#define USB_AUDIO_USB_VER 0x0201 -#define USB_CDC_PRODUCT_ID_BASE 0x0120 -#ifdef USB_AUDIO_UAC2 -#define USB_AUDIO_PRODUCT_ID_BASE 0x0400 -#else -#define USB_AUDIO_PRODUCT_ID_BASE 0x0300 -#endif -#else -#define DEV_QUAL_USB_VER 0x0200 -#define USB_CDC_USB_VER 0x0200 // 0x0110 -#define USB_AUDIO_USB_VER 0x0200 // 0x0110 -#define USB_CDC_PRODUCT_ID_BASE 0x0100 -#define USB_AUDIO_PRODUCT_ID_BASE 0x0200 -#ifdef USB_AUDIO_UAC2 -#error "USB_AUDIO_UAC2 should run on USB_HIGH_SPEED" -#endif -#endif - -#ifndef USB_CDC_VENDOR_ID -#define USB_CDC_VENDOR_ID 0xBE57 -#endif - -#ifndef USB_CDC_PRODUCT_ID -#define USB_CDC_PRODUCT_ID (USB_CDC_PRODUCT_ID_BASE + 0x01) -#endif - -#ifndef USB_AUDIO_VENDOR_ID -#define USB_AUDIO_VENDOR_ID 0xBE57 -#endif - -#ifndef USB_AUDIO_PRODUCT_ID - -#ifdef USB_AUDIO_DYN_CFG - -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x31) -#ifdef USB_AUDIO_32BIT -#define USB_AUDIO_PRODUCT_32BIT_FLAG 0x0004 -#else -#define USB_AUDIO_PRODUCT_32BIT_FLAG 0 -#endif -#ifdef USB_AUDIO_24BIT -#define USB_AUDIO_PRODUCT_24BIT_FLAG 0x0002 -#else -#define USB_AUDIO_PRODUCT_24BIT_FLAG 0 -#endif -#ifdef USB_AUDIO_16BIT -#define USB_AUDIO_PRODUCT_16BIT_FLAG 0x0001 -#else -#define USB_AUDIO_PRODUCT_16BIT_FLAG 0 -#endif - -#define USB_AUDIO_PRODUCT_ID \ - (USB_AUDIO_PRODUCT_ID_STEM + USB_AUDIO_PRODUCT_32BIT_FLAG + \ - USB_AUDIO_PRODUCT_24BIT_FLAG + USB_AUDIO_PRODUCT_16BIT_FLAG) - -#else // !USB_AUDIO_DYN_CFG - -#ifdef USB_AUDIO_384K -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x08) -#elif defined(USB_AUDIO_352_8K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x07) -#elif defined(USB_AUDIO_192K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x06) -#elif defined(USB_AUDIO_176_4K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x05) -#elif defined(USB_AUDIO_96K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x04) -#elif defined(USB_AUDIO_44_1K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x03) -#elif defined(USB_AUDIO_16K) -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x02) -#else // 48K -#define USB_AUDIO_PRODUCT_ID_STEM (USB_AUDIO_PRODUCT_ID_BASE + 0x01) -#endif - -#define USB_AUDIO_PRODUCT_32BIT_FLAG 0x0020 -#define USB_AUDIO_PRODUCT_24BIT_FLAG 0x0010 - -#ifdef USB_AUDIO_32BIT -#define USB_AUDIO_PRODUCT_ID \ - (USB_AUDIO_PRODUCT_ID_STEM + USB_AUDIO_PRODUCT_32BIT_FLAG) -#elif defined(USB_AUDIO_24BIT) -#define USB_AUDIO_PRODUCT_ID \ - (USB_AUDIO_PRODUCT_ID_STEM + USB_AUDIO_PRODUCT_24BIT_FLAG) -#else -#define USB_AUDIO_PRODUCT_ID (USB_AUDIO_PRODUCT_ID_STEM) -#endif - -#endif // !USB_AUDIO_DYN_CFG - -#endif // !USB_AUDIO_PRODUCT_ID - -//---------------------------------------------------------------- -// USB device common string descriptions -//---------------------------------------------------------------- - -static const uint8_t stringLangidDescriptor[] = { - 0x04, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - 0x09, 0x04, /*bString Lang ID - 0x0409 - English*/ -}; - -static const uint8_t stringIconfigurationDescriptor[] = { - 0x06, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - '0', - 0, - '1', - 0, /*bString iConfiguration - 01*/ -}; - -#ifdef USB_HIGH_SPEED -static const uint8_t deviceQualifierDescriptor[] = { - 10, - QUALIFIER_DESCRIPTOR, - LSB(DEV_QUAL_USB_VER), - MSB(DEV_QUAL_USB_VER), - 0, // bDeviceClass - 0, // bDeviceSubClass - 0, // bDeviceProtocol - USB_MAX_PACKET_SIZE_CTRL, // bMaxPacketSize0 - 0, - 0, -}; - -static const uint8_t bosDescriptor[] = { - 5, - BOS_DESCRIPTOR, - 12, - 0, // wTotalLength - 1, // bNumDeviceCaps - 7, // bLength - 0x10, // bDescriptorType - 0x02, // bDevCapabilityType -#ifdef USB_LPM -#ifdef USB_LPM_DEEP_BESL - 0x1E, // bmAttributes: LPM, BESL, Baseline BESL, Deep BESL -#else - 0x0E, // bmAttributes: LPM, BESL, Baseline BESL -#endif - (USB_L1_DEEP_SLEEP_BESL << 4) | USB_L1_LIGHT_SLEEP_BESL, -#else - 0x00, // bmAttributes: none - 0x00, -#endif - 0x00, - 0x00}; -#endif - -//---------------------------------------------------------------- -// USB CDC device description and string descriptions -//---------------------------------------------------------------- - -const uint8_t *cdc_dev_desc(uint8_t type) { - static const uint8_t deviceDescriptor[] = { - 18, // bLength - DEVICE_DESCRIPTOR, // bDescriptorType - LSB(USB_CDC_USB_VER), - MSB(USB_CDC_USB_VER), // bcdUSB - 2, // bDeviceClass - 0, // bDeviceSubClass - 0, // bDeviceProtocol - USB_MAX_PACKET_SIZE_CTRL, // bMaxPacketSize0 - LSB(USB_CDC_VENDOR_ID), - MSB(USB_CDC_VENDOR_ID), // idVendor - LSB(USB_CDC_PRODUCT_ID), - MSB(USB_CDC_PRODUCT_ID), // idProduct - 0x00, - 0x01, // bcdDevice - STRING_OFFSET_IMANUFACTURER, // iManufacturer - STRING_OFFSET_IPRODUCT, // iProduct - STRING_OFFSET_ISERIAL, // iSerialNumber - 1 // bNumConfigurations - }; - - if (type == DEVICE_DESCRIPTOR) { - return deviceDescriptor; -#ifdef USB_HIGH_SPEED - } else if (type == QUALIFIER_DESCRIPTOR) { - return deviceQualifierDescriptor; - } else if (type == BOS_DESCRIPTOR) { - return bosDescriptor; -#endif - } else { - return NULL; - } -} - -const uint8_t *cdc_string_desc(uint8_t index) { - static const uint8_t stringImanufacturerDescriptor[] = -#ifdef USB_CDC_STR_DESC_MANUFACTURER - USB_CDC_STR_DESC_MANUFACTURER; -#else - { - 0x16, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - 'b', - 0, - 'e', - 0, - 's', - 0, - 't', - 0, - 'e', - 0, - 'c', - 0, - 'h', - 0, - 'n', - 0, - 'i', - 0, - 'c', - 0 /*bString iManufacturer - bestechnic*/ - }; -#endif - - static const uint8_t stringIserialDescriptor[] = -#ifdef USB_CDC_STR_DESC_SERIAL - USB_CDC_STR_DESC_SERIAL; -#else - { - 0x16, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - '2', - 0, - '0', - 0, - '1', - 0, - '5', - 0, - '1', - 0, - '0', - 0, - '0', - 0, - '6', - 0, - '.', - 0, - '1', - 0, /*bString iSerial - 20151006.1*/ - }; -#endif - - static const uint8_t stringIinterfaceDescriptor[] = -#ifdef USB_CDC_STR_DESC_INTERFACE - USB_CDC_STR_DESC_INTERFACE; -#else - { - 0x08, STRING_DESCRIPTOR, 'C', 0, 'D', 0, 'C', 0, - }; -#endif - - static const uint8_t stringIproductDescriptor[] = -#ifdef USB_CDC_STR_DESC_PRODUCT - USB_CDC_STR_DESC_PRODUCT; -#else - {0x16, STRING_DESCRIPTOR, - 'C', 0, - 'D', 0, - 'C', 0, - ' ', 0, - 'D', 0, - 'E', 0, - 'V', 0, - 'I', 0, - 'C', 0, - 'E', 0}; -#endif - - const uint8_t *data = NULL; - - switch (index) { - case STRING_OFFSET_LANGID: - data = stringLangidDescriptor; - break; - case STRING_OFFSET_IMANUFACTURER: - data = stringImanufacturerDescriptor; - break; - case STRING_OFFSET_IPRODUCT: - data = stringIproductDescriptor; - break; - case STRING_OFFSET_ISERIAL: - data = stringIserialDescriptor; - break; - case STRING_OFFSET_ICONFIGURATION: - data = stringIconfigurationDescriptor; - break; - case STRING_OFFSET_IINTERFACE: - data = stringIinterfaceDescriptor; - break; - } - - return data; -} - -//---------------------------------------------------------------- -// USB audio device description and string descriptions -//---------------------------------------------------------------- - -const uint8_t *uaud_dev_desc(uint8_t type) { - static const uint8_t deviceDescriptor[] = { - 18, // bLength - DEVICE_DESCRIPTOR, // bDescriptorType - LSB(USB_AUDIO_USB_VER), - MSB(USB_AUDIO_USB_VER), // bcdUSB - 0, // bDeviceClass - 0, // bDeviceSubClass - 0, // bDeviceProtocol - USB_MAX_PACKET_SIZE_CTRL, // bMaxPacketSize0 - LSB(USB_AUDIO_VENDOR_ID), - MSB(USB_AUDIO_VENDOR_ID), // idVendor - LSB(USB_AUDIO_PRODUCT_ID), - MSB(USB_AUDIO_PRODUCT_ID), // idProduct - 0x00, - 0x01, // bcdDevice - STRING_OFFSET_IMANUFACTURER, // iManufacturer - STRING_OFFSET_IPRODUCT, // iProduct - STRING_OFFSET_ISERIAL, // iSerialNumber - 1 // bNumConfigurations - }; - - if (type == DEVICE_DESCRIPTOR) { - return deviceDescriptor; -#ifdef USB_HIGH_SPEED - } else if (type == QUALIFIER_DESCRIPTOR) { - return deviceQualifierDescriptor; - } else if (type == BOS_DESCRIPTOR) { - return bosDescriptor; -#endif - } else { - return NULL; - } -} - -const uint8_t *uaud_string_desc(uint8_t index) { - static const uint8_t stringImanufacturerDescriptor[] = -#ifdef USB_AUDIO_STR_DESC_MANUFACTURER - USB_AUDIO_STR_DESC_MANUFACTURER; -#else - { - 0x16, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - 'b', - 0, - 'e', - 0, - 's', - 0, - 't', - 0, - 'e', - 0, - 'c', - 0, - 'h', - 0, - 'n', - 0, - 'i', - 0, - 'c', - 0 /*bString iManufacturer - bestechnic*/ - }; -#endif - - static const uint8_t stringIserialDescriptor[] = -#ifdef USB_AUDIO_STR_DESC_SERIAL - USB_AUDIO_STR_DESC_SERIAL; -#else - { - 0x16, /*bLength*/ - STRING_DESCRIPTOR, /*bDescriptorType 0x03*/ - '2', - 0, - '0', - 0, - '1', - 0, - '6', - 0, - '0', - 0, - '4', - 0, - '0', - 0, - '6', - 0, - '.', - 0, - '1', - 0, /*bString iSerial - 20160406.1*/ - }; -#endif - - static const uint8_t stringIinterfaceDescriptor[] = -#ifdef USB_AUDIO_STR_DESC_INTERFACE - USB_AUDIO_STR_DESC_INTERFACE; -#else - { - 0x0c, // bLength - STRING_DESCRIPTOR, // bDescriptorType 0x03 - 'A', - 0, - 'u', - 0, - 'd', - 0, - 'i', - 0, - 'o', - 0 // bString iInterface - Audio - }; -#endif - - static const uint8_t stringIproductDescriptor[] = -#ifdef USB_AUDIO_STR_DESC_PRODUCT - USB_AUDIO_STR_DESC_PRODUCT; -#else - { - 0x16, // bLength - STRING_DESCRIPTOR, // bDescriptorType 0x03 - 'B', - 0, - 'e', - 0, - 's', - 0, - 't', - 0, - ' ', - 0, - 'A', - 0, - 'u', - 0, - 'd', - 0, - 'i', - 0, - 'o', - 0 // bString iProduct - Best Audio - }; -#endif - - const uint8_t *data = NULL; - - switch (index) { - case STRING_OFFSET_LANGID: - data = stringLangidDescriptor; - break; - case STRING_OFFSET_IMANUFACTURER: - data = stringImanufacturerDescriptor; - break; - case STRING_OFFSET_IPRODUCT: - data = stringIproductDescriptor; - break; - case STRING_OFFSET_ISERIAL: - data = stringIserialDescriptor; - break; - case STRING_OFFSET_ICONFIGURATION: - data = stringIconfigurationDescriptor; - break; - case STRING_OFFSET_IINTERFACE: - data = stringIinterfaceDescriptor; - break; - } - - return data; -} diff --git a/platform/drivers/usb/usb_dev/inc/usb_audio.h b/platform/drivers/usb/usb_dev/inc/usb_audio.h deleted file mode 100644 index 5e4f855..0000000 --- a/platform/drivers/usb/usb_dev/inc/usb_audio.h +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_AUDIO_H__ -#define __USB_AUDIO_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stdint.h" -#include "hal_usb.h" - -enum USB_AUDIO_ITF_ID_T { - USB_AUDIO_ITF_ID_RECV, - USB_AUDIO_ITF_ID_SEND, -#ifdef USB_AUDIO_MULTIFUNC - USB_AUDIO_ITF_ID_RECV2, -#endif - - USB_AUDIO_ITF_ID_QTY -}; - -enum USB_AUDIO_ITF_CMD_T { - USB_AUDIO_ITF_STOP, - USB_AUDIO_ITF_START_16BIT, - USB_AUDIO_ITF_START_24BIT, - USB_AUDIO_ITF_START_32BIT, - - USB_AUDIO_ITF_CMD_QTY -}; - -enum USB_AUDIO_STATE_EVENT_T { - USB_AUDIO_STATE_RESET, // RESET event should be processed as quickly as possible - USB_AUDIO_STATE_DISCONNECT, - USB_AUDIO_STATE_SLEEP, - USB_AUDIO_STATE_WAKEUP, - USB_AUDIO_STATE_CONFIG, - USB_AUDIO_STATE_RECV_PAUSE, - USB_AUDIO_STATE_RECV_CONTINUE, - USB_AUDIO_STATE_SET_RECV_RATE, - USB_AUDIO_STATE_SET_SEND_RATE, - USB_AUDIO_STATE_RECV2_PAUSE, - USB_AUDIO_STATE_RECV2_CONTINUE, - - USB_AUDIO_STATE_EVENT_QTY -}; - -enum USB_AUDIO_HID_EVENT_T { - USB_AUDIO_HID_VOL_UP = (1 << 0), - USB_AUDIO_HID_VOL_DOWN = (1 << 1), - USB_AUDIO_HID_PLAY_PAUSE = (1 << 2), - USB_AUDIO_HID_SCAN_NEXT = (1 << 3), - USB_AUDIO_HID_SCAN_PREV = (1 << 4), - USB_AUDIO_HID_STOP = (1 << 5), - USB_AUDIO_HID_FAST_FWD = (1 << 6), - USB_AUDIO_HID_REWIND = (1 << 7), - USB_AUDIO_HID_VOL_MUTE = (1 << 8), - USB_AUDIO_HID_VOICE_CMD = (1 << 9), - USB_AUDIO_HID_REDIAL = (1 << 10), - USB_AUDIO_HID_HOOK_SWITCH = (1 << 11), - USB_AUDIO_HID_MIC_MUTE = (1 << 12), - USB_AUDIO_HID_VOICE_MAIL = (1 << 13), - USB_AUDIO_HID_RESERVED_14 = (1 << 14), - USB_AUDIO_HID_RESERVED_15 = (1 << 15), -}; - -struct USB_AUDIO_XFER_INFO_T { - const uint8_t *data; - uint32_t size; - uint32_t next_size; - bool pool_enabled; - int8_t cur_compl_err; - int8_t next_xfer_err; -}; - -struct USB_AUDIO_VENDOR_MSG_T { - const struct SETUP_PACKET *pkt; - uint8_t *data; - uint16_t length; -}; - -typedef void (*USB_AUDIO_ITF_CALLBACK)(enum USB_AUDIO_ITF_ID_T id, enum USB_AUDIO_ITF_CMD_T cmd); -typedef void (*USB_AUDIO_MUTE_CALLBACK)(enum USB_AUDIO_ITF_ID_T id, uint32_t mute); -typedef void (*USB_AUDIO_SET_VOLUME)(enum USB_AUDIO_ITF_ID_T id, uint32_t percent); -typedef uint32_t (*USB_AUDIO_GET_VOLUME)(enum USB_AUDIO_ITF_ID_T id); -typedef void (*USB_AUDIO_XFER_CALLBACK)(enum USB_AUDIO_ITF_ID_T id, const struct USB_AUDIO_XFER_INFO_T *info); -typedef void (*USB_AUDIO_STATE_CALLBACK)(enum USB_AUDIO_STATE_EVENT_T event, uint32_t param); -typedef void (*HID_XFER_CALLBACK)(enum USB_AUDIO_HID_EVENT_T event, int error); -typedef int (*USB_AUDIO_VENDOR_MSG_CALLBACK)(struct USB_AUDIO_VENDOR_MSG_T *msg); - -struct USB_AUDIO_CFG_T { - uint32_t recv_sample_rate; - uint32_t send_sample_rate; - uint8_t *vendor_rx_buf; - uint16_t vendor_rx_size; - USB_AUDIO_ITF_CALLBACK itf_callback; - USB_AUDIO_MUTE_CALLBACK mute_callback; - USB_AUDIO_SET_VOLUME set_volume; - USB_AUDIO_GET_VOLUME get_volume; - USB_AUDIO_STATE_CALLBACK state_callback; - USB_AUDIO_XFER_CALLBACK xfer_callback; - HID_XFER_CALLBACK hid_send_callback; - USB_AUDIO_VENDOR_MSG_CALLBACK vendor_msg_callback; -}; - -int usb_audio_open(const struct USB_AUDIO_CFG_T *cfg); - -void usb_audio_close(void); - -int usb_audio_recv_ready(void); - -int usb_audio_send_ready(void); - -int usb_audio_start_recv(uint8_t *buf, uint32_t pos, uint32_t size); - -void usb_audio_stop_recv(void); - -int usb_audio_start_send(const uint8_t *buf, uint32_t pos, uint32_t size); - -void usb_audio_stop_send(void); - -void usb_audio_pause_send(void); - -int usb_audio_continue_send(uint32_t pos); - -int usb_audio_set_recv_pos(uint32_t pos); - -int usb_audio_set_send_pos(uint32_t pos); - -void usb_audio_hid_set_event(enum USB_AUDIO_HID_EVENT_T event, int state); - -const char *usb_audio_get_hid_event_name(enum USB_AUDIO_HID_EVENT_T event); - -int usb_audio_start_recv2(uint8_t *buf, uint32_t pos, uint32_t size); - -void usb_audio_stop_recv2(void); - -int usb_audio_set_recv2_pos(uint32_t pos); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/platform/drivers/usb/usb_dev/inc/usb_audio_sync.h b/platform/drivers/usb/usb_dev/inc/usb_audio_sync.h deleted file mode 100644 index 8f42f09..0000000 --- a/platform/drivers/usb/usb_dev/inc/usb_audio_sync.h +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_AUDIO_SYNC_H__ -#define __USB_AUDIO_SYNC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" - -typedef uint32_t (*USB_AUDIO_SYNC_TIME_TO_MS)(uint32_t time); - -enum UAUD_SYNC_RET_T { - UAUD_SYNC_IDLE, - UAUD_SYNC_START, - UAUD_SYNC_ERR, -}; - -struct USB_AUDIO_STREAM_INFO_T { - // Difference error threshold - uint16_t err_thresh; - // Difference synchronization threshold - uint16_t sync_thresh; - // Sample rate - uint32_t samp_rate; - // Total sample count of the buffer - uint32_t samp_cnt; - // The number of value to calculate the average - uint8_t diff_avg_cnt; - // The stream info ID - uint8_t id; - // Whether to enable diff_target - uint8_t diff_target_enabled; - // The Max adjust ratio moving to diff_target - float max_target_ratio; - // The abosulte difference value between current diff and diff_target to apply max_target_ratio - uint32_t max_target_thresh; - // The target of the difference - int diff_target; - // Function to convert timestamp to ms. If NULL, default timer will be used. - USB_AUDIO_SYNC_TIME_TO_MS time_to_ms; - // Current timestamp. If time_to_ms is NULL, this member will be ignored. - uint32_t time; - // Internal control block - uint32_t ctrl_block[8]; -}; - -void usb_audio_sync_reset(struct USB_AUDIO_STREAM_INFO_T *info); - -int usb_audio_sync_normalize_diff(int diff, uint32_t size); - -enum UAUD_SYNC_RET_T usb_audio_sync(uint32_t pos_a, uint32_t pos_b, struct USB_AUDIO_STREAM_INFO_T *info, float *p_ratio); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/platform/drivers/usb/usb_dev/inc/usb_cdc.h b/platform/drivers/usb/usb_dev/inc/usb_cdc.h deleted file mode 100644 index c76eba6..0000000 --- a/platform/drivers/usb/usb_dev/inc/usb_cdc.h +++ /dev/null @@ -1,126 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_CDC_H__ -#define __USB_CDC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" - -enum USB_SERIAL_API_MODE { - USB_SERIAL_API_NONBLOCKING, - USB_SERIAL_API_BLOCKING, -}; - -enum USB_SERIAL_STATE_EVENT_T { - USB_SERIAL_STATE_RESET, // RESET event should be processed as quickly as possible - USB_SERIAL_STATE_DISCONNECT, - USB_SERIAL_STATE_SLEEP, - USB_SERIAL_STATE_WAKEUP, - USB_SERIAL_STATE_CONFIG, - USB_SERIAL_STATE_STALL_RECV, - USB_SERIAL_STATE_STALL_SEND, - USB_SERIAL_STATE_STALL_INTR, - USB_SERIAL_STATE_UNSTALL_RECV, - USB_SERIAL_STATE_UNSTALL_SEND, - USB_SERIAL_STATE_UNSTALL_INTR, -}; - -enum USB_SERIAL_RET_VALUE { - USB_ERR_OK = 0, - USB_ERR_RXTX_DATA = -1, - USB_ERR_NOT_DONE = -2, - USB_ERR_NOT_IDLE = -3, - USB_ERR_NOT_LOCK = -9, - USB_ERR_NOT_CONNECT = -10, - USB_ERR_INV_PARAM = -11, - USB_ERR_UNALIGNED = -12, - USB_ERR_RX_SIZE = -13, - USB_ERR_RXTX_CANCEL = -14, -}; - -enum USB_SERIAL_STOP_BITS_T { - USB_SERIAL_STOP_BITS_1 = 0, - USB_SERIAL_STOP_BITS_1P5 = 1, - USB_SERIAL_STOP_BITS_2 = 2, -}; - -enum USB_SERIAL_PARITY_T { - USB_SERIAL_PARITY_NONE = 0, - USB_SERIAL_PARITY_ODD = 1, - USB_SERIAL_PARITY_EVEN = 2, - USB_SERIAL_PARITY_MARK = 3, - USB_SERIAL_PARITY_SPACE = 4, -}; - -struct USB_SERIAL_LINE_CODING_T { - uint32_t rate; - uint8_t stop_bits; - uint8_t parity; - uint8_t data_bits; -}; - -typedef void (*USB_SERIAL_STATE_CALLBACK)(enum USB_SERIAL_STATE_EVENT_T event); -typedef void (*USB_SERIAL_BREAK_CALLBACK)(uint16_t ms); -typedef int (*USB_SERIAL_GET_LINE_CODING_CALLBACK)(struct USB_SERIAL_LINE_CODING_T *coding); -typedef int (*USB_SERIAL_SET_LINE_CODING_CALLBACK)(const struct USB_SERIAL_LINE_CODING_T *coding); -typedef void (*USB_SERIAL_XFER_CALLBACK)(const uint8_t *data, uint32_t size, int error); - -struct USB_SERIAL_CFG_T { - USB_SERIAL_STATE_CALLBACK state_callback; - USB_SERIAL_BREAK_CALLBACK break_callback; - USB_SERIAL_GET_LINE_CODING_CALLBACK get_line_coding_callback; - USB_SERIAL_SET_LINE_CODING_CALLBACK set_line_coding_callback; - enum USB_SERIAL_API_MODE mode; -}; - -int usb_serial_open(const struct USB_SERIAL_CFG_T *cfg); - -int usb_serial_reopen(USB_SERIAL_BREAK_CALLBACK break_handler); - -void usb_serial_close(void); - -int usb_serial_ready(void); - -int usb_serial_connected(void); - -void usb_serial_init_xfer(void); - -void usb_serial_cancel_recv(void); - -int usb_serial_flush_recv_buffer(void); - -int usb_serial_recv(uint8_t *buf, uint32_t size); - -int usb_serial_direct_recv(uint8_t *dma_buf, uint32_t size, uint32_t expect, uint32_t *recv, - USB_SERIAL_XFER_CALLBACK callback); - -void usb_serial_cancel_send(void); - -int usb_serial_send(const uint8_t *buf, uint32_t size); - -int usb_serial_direct_send(const uint8_t *dma_buf, uint32_t size, USB_SERIAL_XFER_CALLBACK callback); - -int usb_serial_send_break(void); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/platform/drivers/usb/usb_dev/inc/usb_descriptor.h b/platform/drivers/usb/usb_dev/inc/usb_descriptor.h deleted file mode 100644 index a5ee527..0000000 --- a/platform/drivers/usb/usb_dev/inc/usb_descriptor.h +++ /dev/null @@ -1,144 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_DESCRIPTOR_H__ -#define __USB_DESCRIPTOR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Standard requests */ -#define GET_STATUS (0) -#define CLEAR_FEATURE (1) -#define SET_FEATURE (3) -#define SET_ADDRESS (5) -#define GET_DESCRIPTOR (6) -#define SET_DESCRIPTOR (7) -#define GET_CONFIGURATION (8) -#define SET_CONFIGURATION (9) -#define GET_INTERFACE (10) -#define SET_INTERFACE (11) - -/* bmRequestType.direction */ -#define HOST_TO_DEVICE (0) -#define DEVICE_TO_HOST (1) - -/* bmRequestType.type*/ -#define STANDARD_TYPE (0) -#define CLASS_TYPE (1) -#define VENDOR_TYPE (2) -#define RESERVED_TYPE (3) - -/* bmRequestType.recipient */ -#define DEVICE_RECIPIENT (0) -#define INTERFACE_RECIPIENT (1) -#define ENDPOINT_RECIPIENT (2) -#define OTHER_RECIPIENT (3) - -/* Descriptors */ -#define DESCRIPTOR_TYPE(wValue) (wValue >> 8) -#define DESCRIPTOR_INDEX(wValue) (wValue & 0xff) - -/* Device status */ -#define DEVICE_STATUS_SELF_POWERED (1U<<0) -#define DEVICE_STATUS_REMOTE_WAKEUP (1U<<1) - -/* Endpoint status */ -#define ENDPOINT_STATUS_HALT (1U<<0) - -/* Standard feature selectors */ -#define DEVICE_REMOTE_WAKEUP (1) -#define ENDPOINT_HALT (0) -#define TEST_MODE (2) - -/* Test mode selectors */ -#define TEST_MODE_TEST_J (1) -#define TEST_MODE_TEST_K (2) -#define TEST_MODE_TEST_SE0_NAK (3) -#define TEST_MODE_TEST_PACKET (4) -#define TEST_MODE_FORCE_ENABLE (5) - -/* Standard descriptor types */ -#define DEVICE_DESCRIPTOR (1) -#define CONFIGURATION_DESCRIPTOR (2) -#define STRING_DESCRIPTOR (3) -#define INTERFACE_DESCRIPTOR (4) -#define ENDPOINT_DESCRIPTOR (5) -#define QUALIFIER_DESCRIPTOR (6) -#define BOS_DESCRIPTOR (0xF) - -/* Standard descriptor lengths */ -#define DEVICE_DESCRIPTOR_LENGTH (0x12) -#define CONFIGURATION_DESCRIPTOR_LENGTH (0x09) -#define INTERFACE_DESCRIPTOR_LENGTH (0x09) -#define ENDPOINT_DESCRIPTOR_LENGTH (0x07) -#define QUALIFIER_DESCRIPTOR_LENGTH (0x0A) -#define BOS_DESCRIPTOR_LENGTH (0x05) - -/*string offset*/ -#define STRING_OFFSET_LANGID (0) -#define STRING_OFFSET_IMANUFACTURER (1) -#define STRING_OFFSET_IPRODUCT (2) -#define STRING_OFFSET_ISERIAL (3) -#define STRING_OFFSET_ICONFIGURATION (4) -#define STRING_OFFSET_IINTERFACE (5) - -/* USB Specification Release Number */ -#define USB_VERSION_2_0 (0x0200) -#define USB_VERSION_1_1 (0x0101) - -/* Least/Most significant byte of short integer */ -#define LSB(n) ((n)&0xff) -#define MSB(n) (((n)&0xff00)>>8) - -#define LSB0(n) ((n) & 0xFF) -#define LSB1(n) (((n) >> 8) & 0xFF) -#define LSB2(n) (((n) >> 16) & 0xFF) -#define LSB3(n) (((n) >> 24) & 0xFF) - -/* Convert physical endpoint number to descriptor endpoint number */ -#define PHY_TO_DESC(endpoint, dir) (((endpoint) & 0xF) | ((dir == EP_OUT) ? 0 : 0x80)) - -/* bmAttributes in configuration descriptor */ -/* C_RESERVED must always be set */ -#define C_RESERVED (1U<<7) -#define C_SELF_POWERED (1U<<6) -#define C_REMOTE_WAKEUP (1U<<5) - -/* bMaxPower in configuration descriptor */ -#define C_POWER(mA) ((mA)/2) - -/* bmAttributes in endpoint descriptor */ -#define E_CONTROL (0x00) -#define E_ISOCHRONOUS (0x01) -#define E_BULK (0x02) -#define E_INTERRUPT (0x03) - -/* For isochronous endpoints only: */ -#define E_NO_SYNCHRONIZATION (0x00) -#define E_ASYNCHRONOUS (0x04) -#define E_ADAPTIVE (0x08) -#define E_SYNCHRONOUS (0x0C) -#define E_DATA (0x00) -#define E_FEEDBACK (0x10) -#define E_IMPLICIT_FEEDBACK (0x20) - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/platform/drivers/usb/usb_dev/inc/usb_dev_desc.h b/platform/drivers/usb/usb_dev/inc/usb_dev_desc.h deleted file mode 100644 index 7cfd428..0000000 --- a/platform/drivers/usb/usb_dev/inc/usb_dev_desc.h +++ /dev/null @@ -1,65 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_DEV_DESC_H__ -#define __USB_DEV_DESC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" - -#ifdef USB_AUDIO_32BIT -#if defined(USB_AUDIO_192K) && !defined(USB_HIGH_SPEED) -#error "192K 32BIT stream can run on USB_HIGH_SPEED only" -#endif -#if defined(USB_AUDIO_176_4K) && !defined(USB_HIGH_SPEED) -#error "176.4K 32BIT stream can run on USB_HIGH_SPEED only" -#endif -#elif defined(USB_AUDIO_24BIT) -#if defined(USB_AUDIO_192K) && !defined(USB_HIGH_SPEED) -#error "192K 24BIT stream can run on USB_HIGH_SPEED only" -#endif -#if defined(USB_AUDIO_176_4K) && !defined(USB_HIGH_SPEED) -#error "176.4K 24BIT stream can run on USB_HIGH_SPEED only" -#endif -#endif - -#if defined(USB_AUDIO_384K) && !(defined(USB_HIGH_SPEED) && defined(USB_AUDIO_UAC2)) -#error "384K stream can run on USB_HIGH_SPEED and USB_AUDIO_UAC2 only" -#endif -#if defined(USB_AUDIO_352_8K) && !(defined(USB_HIGH_SPEED) && defined(USB_AUDIO_UAC2)) -#error "352.8K stream can run on USB_HIGH_SPEED and USB_AUDIO_UAC2 only" -#endif - -#if defined(USB_AUDIO_UAC2) && !defined(USB_HIGH_SPEED) -#error "USB_AUDIO_UAC2 should run on USB_HIGH_SPEED" -#endif - -const uint8_t *cdc_dev_desc(uint8_t type); - -const uint8_t *cdc_string_desc(uint8_t index); - -const uint8_t *uaud_dev_desc(uint8_t type); - -const uint8_t *uaud_string_desc(uint8_t index); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/platform/drivers/usb/usb_dev/lib/libusbdev.a b/platform/drivers/usb/usb_dev/lib/libusbdev.a deleted file mode 100644 index 316c44f..0000000 Binary files a/platform/drivers/usb/usb_dev/lib/libusbdev.a and /dev/null differ diff --git a/platform/drivers/usb/usb_dev/uaud_cfg_flags.mk b/platform/drivers/usb/usb_dev/uaud_cfg_flags.mk deleted file mode 100644 index bb7d926..0000000 --- a/platform/drivers/usb/usb_dev/uaud_cfg_flags.mk +++ /dev/null @@ -1,110 +0,0 @@ - -UAUD_CFG_FLAGS := - -ifeq ($(USB_AUDIO_DYN_CFG),1) - -UAUD_CFG_FLAGS += -DUSB_AUDIO_DYN_CFG - -USB_AUDIO_32BIT ?= 1 -USB_AUDIO_24BIT ?= 1 -USB_AUDIO_16BIT ?= 1 - -USB_AUDIO_16K ?= 1 -USB_AUDIO_44_1K ?= 1 -USB_AUDIO_48K ?= 1 -USB_AUDIO_96K ?= 1 -ifeq ($(USB_HIGH_SPEED),1) -USB_AUDIO_176_4K ?= 1 -USB_AUDIO_192K ?= 1 -ifeq ($(USB_AUDIO_UAC2),1) -USB_AUDIO_352_8K ?= 1 -USB_AUDIO_384K ?= 1 -endif -endif - -else # USB_AUDIO_DYN_CFG != 1 - -ifeq ($(filter 1,$(USB_AUDIO_384K) $(USB_AUDIO_352_8K) $(USB_AUDIO_192K) $(USB_AUDIO_176_4K) \ - $(USB_AUDIO_96K) $(USB_AUDIO_44_1K) $(USB_AUDIO_16K)),) -USB_AUDIO_48K := 1 -endif - -ifeq ($(filter 1,$(USB_AUDIO_32BIT) $(USB_AUDIO_24BIT)),) -USB_AUDIO_16BIT := 1 -endif - -endif # USB_AUDIO_DYN_CFG != 1 - -ifeq ($(filter 1,$(USB_AUDIO_384K) $(USB_AUDIO_352_8K) $(USB_AUDIO_192K) $(USB_AUDIO_176_4K) \ - $(USB_AUDIO_96K) $(USB_AUDIO_48K) $(USB_AUDIO_44_1K) $(USB_AUDIO_16K)),) -$(error None of usb audio sample rates is enabled) -endif - -ifeq ($(USB_AUDIO_384K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_384K -endif -ifeq ($(USB_AUDIO_352_8K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_352_8K -endif -ifeq ($(USB_AUDIO_192K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_192K -endif -ifeq ($(USB_AUDIO_176_4K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_176_4K -endif -ifeq ($(USB_AUDIO_96K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_96K -endif -ifeq ($(USB_AUDIO_48K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_48K -endif -ifeq ($(USB_AUDIO_44_1K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_44_1K -endif -ifeq ($(USB_AUDIO_16K),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_16K -endif - -ifeq ($(filter 1,$(USB_AUDIO_32BIT) $(USB_AUDIO_24BIT) $(USB_AUDIO_16BIT)),) -$(error None of USB_AUDIO_32BIT/USB_AUDIO_24BIT/USB_AUDIO_16BIT is enabled) -endif - -ifeq ($(USB_AUDIO_32BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_32BIT -endif -ifeq ($(USB_AUDIO_24BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_24BIT -endif -ifeq ($(USB_AUDIO_16BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_16BIT -endif - -ifeq ($(filter 1,$(USB_AUDIO_SEND_32BIT) $(USB_AUDIO_SEND_24BIT)),) -USB_AUDIO_SEND_16BIT := 1 -ifneq ($(USB_AUDIO_SEND_16BIT),1) -$(error None of USB_AUDIO_SEND_32BIT/USB_AUDIO_SEND_24BIT/USB_AUDIO_SEND_16BIT is enabled) -endif -endif - -ifeq ($(USB_AUDIO_SEND_32BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_SEND_32BIT -endif -ifeq ($(USB_AUDIO_SEND_24BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_SEND_24BIT -endif -ifeq ($(USB_AUDIO_SEND_16BIT),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_SEND_16BIT -endif - -ifneq ($(USB_AUDIO_SEND_CHAN),) -UAUD_CFG_FLAGS += -DUSB_AUDIO_SEND_CHAN=$(USB_AUDIO_SEND_CHAN) -endif - -ifeq ($(USB_AUDIO_UAC2),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_UAC2 -endif - -ifeq ($(USB_AUDIO_MULTIFUNC),1) -UAUD_CFG_FLAGS += -DUSB_AUDIO_MULTIFUNC -endif - diff --git a/platform/drivers/usb/usb_host/Makefile b/platform/drivers/usb/usb_host/Makefile deleted file mode 100644 index d361ecd..0000000 --- a/platform/drivers/usb/usb_host/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -src_obj := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)*.c $(cur_dir)*.cpp $(cur_dir)*.S)) -src_obj := $(src_obj:.c=.o) -src_obj := $(src_obj:.cpp=.o) -src_obj := $(src_obj:.S=.o) - -libusbhost-y := $(src_obj) - -obj-y := libusbhost.a - -ccflags-y := -Iplatform-Iplatform/drivers/usb/usb_host/inc -Iplatform/drivers/ana - -ifeq ($(USB_WAKEUP_OPEN),1) -CFLAGS_USBHost.o += -DUSB_WAKEUP_OPEN -endif - -ifeq ($(USB_WAKEUP_RESET),1) -CFLAGS_USBHost.o += -DUSB_WAKEUP_RESET -endif diff --git a/platform/drivers/usb/usb_host/inc/USBHost.h b/platform/drivers/usb/usb_host/inc/USBHost.h deleted file mode 100644 index 36b9f24..0000000 --- a/platform/drivers/usb/usb_host/inc/USBHost.h +++ /dev/null @@ -1,193 +0,0 @@ - -/* -Copyright (c) 2010 Peter Barrett - -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. -*/ - -#ifndef USBHOST_H -#define USBHOST_H - -#include "plat_types.h" - -#define ENDPOINT_CONTROL 0 -#define ENDPOINT_ISOCRONOUS 1 -#define ENDPOINT_BULK 2 -#define ENDPOINT_INTERRUPT 3 - -#define DESCRIPTOR_TYPE_DEVICE 1 -#define DESCRIPTOR_TYPE_CONFIGURATION 2 -#define DESCRIPTOR_TYPE_STRING 3 -#define DESCRIPTOR_TYPE_INTERFACE 4 -#define DESCRIPTOR_TYPE_ENDPOINT 5 - -#define DESCRIPTOR_TYPE_HID 0x21 -#define DESCRIPTOR_TYPE_REPORT 0x22 -#define DESCRIPTOR_TYPE_PHYSICAL 0x23 -#define DESCRIPTOR_TYPE_HUB 0x29 - -enum USB_CLASS_CODE -{ - CLASS_DEVICE, - CLASS_AUDIO, - CLASS_COMM_AND_CDC_CONTROL, - CLASS_HID, - CLASS_PHYSICAL = 0x05, - CLASS_STILL_IMAGING, - CLASS_PRINTER, - CLASS_MASS_STORAGE, - CLASS_HUB, - CLASS_CDC_DATA, - CLASS_SMART_CARD, - CLASS_CONTENT_SECURITY = 0x0D, - CLASS_VIDEO = 0x0E, - CLASS_DIAGNOSTIC_DEVICE = 0xDC, - CLASS_WIRELESS_CONTROLLER = 0xE0, - CLASS_MISCELLANEOUS = 0xEF, - CLASS_APP_SPECIFIC = 0xFE, - CLASS_VENDOR_SPECIFIC = 0xFF -}; - -#define DEVICE_TO_HOST 0x80 -#define HOST_TO_DEVICE 0x00 -#define REQUEST_TYPE_CLASS 0x20 -#define RECIPIENT_DEVICE 0x00 -#define RECIPIENT_INTERFACE 0x01 -#define RECIPIENT_ENDPOINT 0x02 -#define RECIPIENT_OTHER 0x03 - -#define GET_STATUS 0 -#define CLEAR_FEATURE 1 -#define SET_FEATURE 3 -#define SET_ADDRESS 5 -#define GET_DESCRIPTOR 6 -#define SET_DESCRIPTOR 7 -#define GET_CONFIGURATION 8 -#define SET_CONFIGURATION 9 -#define GET_INTERFACE 10 -#define SET_INTERFACE 11 -#define SYNCH_FRAME 11 - -// -5 is nak -/* -0010 ACK Handshake -1010 NAK Handshake -1110 STALL Handshake -0110 NYET (No Response Yet) -*/ - -#define IO_PENDING -100 -#define ERR_ENDPOINT_NONE_LEFT -101 -#define ERR_ENDPOINT_NOT_FOUND -102 -#define ERR_DEVICE_NOT_FOUND -103 -#define ERR_DEVICE_NONE_LEFT -104 -#define ERR_HUB_INIT_FAILED -105 -#define ERR_INTERFACE_NOT_FOUND -106 - -typedef struct -{ - u8 bLength; - u8 bDescriptorType; - u16 bcdUSB; - u8 bDeviceClass; - u8 bDeviceSubClass; - u8 bDeviceProtocol; - u8 bMaxPacketSize; - u16 idVendor; - u16 idProduct; - u16 bcdDevice; // version - u8 iManufacturer; - u8 iProduct; - u8 iSerialNumber; - u8 bNumConfigurations; -} DeviceDescriptor; // 16 bytes - -typedef struct -{ - u8 bLength; - u8 bDescriptorType; - u16 wTotalLength; - u8 bNumInterfaces; - u8 bConfigurationValue; // Value to use as an argument to select this configuration - u8 iConfiguration; // Index of String Descriptor describing this configuration - u8 bmAttributes; // Bitmap D7 Reserved, set to 1. (USB 1.0 Bus Powered),D6 Self Powered,D5 Remote Wakeup,D4..0 = 0 - u8 bMaxPower; // Maximum Power Consumption in 2mA units -} ConfigurationDescriptor; - -typedef struct -{ - u8 bLength; - u8 bDescriptorType; - u8 bInterfaceNumber; - u8 bAlternateSetting; - u8 bNumEndpoints; - u8 bInterfaceClass; - u8 bInterfaceSubClass; - u8 bInterfaceProtocol; - u8 iInterface; // Index of String Descriptor Describing this interface -} InterfaceDescriptor; - -typedef struct -{ - u8 bLength; - u8 bDescriptorType; - u8 bEndpointAddress; // Bits 0:3 endpoint, Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints) - u8 bmAttributes; // Bits 0:1 00 = Control, 01 = Isochronous, 10 = Bulk, 11 = Interrupt - u16 wMaxPacketSize; - u8 bInterval; // Interval for polling endpoint data transfers. -} EndpointDescriptor; - -typedef struct { - u8 bLength; - u8 bDescriptorType; - u16 bcdHID; - u8 bCountryCode; - u8 bNumDescriptors; - u8 bDescriptorType2; - u16 wDescriptorLength; -} HIDDescriptor; - -//============================================================================ -//============================================================================ - - -void USBInit(); -void USBLoop(); -u8* USBGetBuffer(u32* len); - -// Optional callback for transfers, called at interrupt time -typedef void (*USBCallback)(int device, int endpoint, int status, u8* data, int len, void* userData); - -// Transfers -int USBControlTransfer(int device, int request_type, int request, int value, int index, u8* data, int length, USBCallback callback = 0, void* userData = 0); -int USBInterruptTransfer(int device, int ep, u8* data, int length, USBCallback callback = 0, void* userData = 0); -int USBBulkTransfer(int device, int ep, u8* data, int length, USBCallback callback = 0, void* userData = 0); - -// Standard Device methods -int GetDescriptor(int device, int descType, int descIndex, u8* data, int length); -int GetString(int device, int index, char* dst, int length); -int SetAddress(int device, int new_addr); -int SetConfiguration(int device, int configNum); -int SetInterface(int device, int ifNum, int altNum); - -// Implemented to notify app of the arrival of a device -void OnLoadDevice(int device, DeviceDescriptor* deviceDesc, InterfaceDescriptor* interfaceDesc, u8 *itfDescEnd); -void OnUnloadDevice(int device); - -#endif diff --git a/platform/drivers/usb/usb_host/inc/usb_tester.h b/platform/drivers/usb/usb_host/inc/usb_tester.h deleted file mode 100644 index f89d50c..0000000 --- a/platform/drivers/usb/usb_host/inc/usb_tester.h +++ /dev/null @@ -1,49 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef USB_TESTER_H -#define USB_TESTER_H - -#include "FATFileSystem.h" -#include - - -class USBFileSystem : public FATFileSystem -{ - -public: - USBFileSystem(); - - void SetDevice(int device); - - int GetDevice(void); - - virtual int disk_initialize(); - - virtual int disk_write(const uint8_t * buffer, uint64_t sector, uint8_t count); - - virtual int disk_read(uint8_t * buffer, uint64_t sector, uint8_t count); - - virtual uint64_t disk_sectors(); - -protected: - int _device; - u32 _blockSize; - u32 _blockCount; - -}; - - -#endif diff --git a/platform/hal/Makefile b/platform/hal/Makefile index 2f69682..c46fa66 100644 --- a/platform/hal/Makefile +++ b/platform/hal/Makefile @@ -357,7 +357,6 @@ ifneq ($(DEBUG_PORT),) CFLAGS_hal_uart.o += -DDEBUG_PORT=$(DEBUG_PORT) endif -CFLAGS_hal_usb.o += -Iplatform/drivers/usb/usb_dev/inc -Iutils/hwtimer_list ifeq ($(USB_ISO),1) CFLAGS_hal_usb.o += -DUSB_ISO diff --git a/platform/hal/hal_usb.c b/platform/hal/hal_usb.c deleted file mode 100644 index d4bcdc5..0000000 --- a/platform/hal/hal_usb.c +++ /dev/null @@ -1,2725 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifdef CHIP_HAS_USB - -#include "hal_usb.h" -#include "cmsis_nvic.h" -#include "hal_chipid.h" -#include "hal_cmu.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "plat_addr_map.h" -#include "pmu.h" -#include "reg_usb.h" -#include "string.h" -#include "usb_descriptor.h" -#ifdef CHIP_HAS_USBPHY -#include "usbphy.h" -#endif - -// TODO List: -// 1) Thread-safe issue (race condition) - -// Hardware configuration: -// GHWCFG1 = 0x00000000 -// GHWCFG2 = 0x228a5512 -// GHWCFG3 = 0x03f404e8 -// GHWCFG4 = 0x16108020 - -#define USB_TRACE(n, mask, str, ...) \ - { \ - if (usb_trmask & (1 << mask)) { \ - TRACE(n, str, ##__VA_ARGS__); \ - } \ - } -#define USB_FUNC_ENTRY_TRACE(mask) \ - { \ - if (usb_trmask & (1 << mask)) { \ - FUNC_ENTRY_TRACE(); \ - } \ - } - -#ifndef CHIP_BEST1000 -#define CHIP_HAS_USBIF -#endif - -#ifdef USB_HIGH_SPEED -#ifndef USB_ISO_INTERVAL -#define USB_ISO_INTERVAL 8 // ANY value larger than 1 -#endif -#if (USB_ISO_INTERVAL <= 1) -#error "Invalid USB_ISO_INTERVAL" -#endif -#else -#undef USB_ISO_INTERVAL -#define USB_ISO_INTERVAL 1 -#endif - -#ifdef SIMU_UAUD_MAX_PKT -// SEND/RECV with mps = USB_MAX_PACKET_SIZE_ISO -#define USB_FIFO_MPS_ISO_RECV USB_FIFO_MPS_ISO_SEND -#else -#ifdef USB_HIGH_SPEED -// 384K sample rate, 32 bits, 2 channels = 3072 bytes/ms -#define USB_FIFO_MPS_ISO_RECV 1200 -#else -// 192K sample rate, 16 bits, 2 channels = 768 bytes/ms -#define USB_FIFO_MPS_ISO_RECV USB_FIFO_MPS_ISO_SEND -#endif -#endif - -#define PIN_CHECK_ENABLE_INTERVAL MS_TO_TICKS(1) -#define PIN_CHECK_WAIT_RESUME_INTERVAL MS_TO_TICKS(30) -#define LPM_CHECK_INTERVAL MS_TO_TICKS(100) //(US_TO_TICKS(8 + 50) + 2) - -#define USB_SYS_FREQ HAL_CMU_FREQ_52M - -enum DEVICE_STATE { - ATTACHED, - POWERED, - DEFAULT, - ADDRESS, - CONFIGURED, -}; - -struct EPN_OUT_TRANSFER { - uint8_t *data; - uint32_t length; - bool enabled; -}; - -struct EPN_IN_TRANSFER { - const uint8_t *data; - uint32_t length; - uint16_t pkt_cnt; - bool zero_len_pkt; - bool enabled; -}; - -enum DATA_PID_T { - DATA_PID_DATA0 = 0, - DATA_PID_DATA1 = 2, - DATA_PID_DATA2 = 1, - DATA_PID_MDATA = 3, -}; - -enum USB_SLEEP_T { - USB_SLEEP_NONE, - USB_SLEEP_SUSPEND, - USB_SLEEP_L1, -}; - -static const uint32_t usb_trmask = (1 << 0); //(1 << 2) | (1 << 6) | (1 << 8); - -static struct USBC_T *const usbc = (struct USBC_T *)USB_BASE; -#ifdef CHIP_HAS_USBIF -static struct USBIF_T *const usbif = (struct USBIF_T *)(USB_BASE + 0x00040000); -#endif - -static uint16_t fifo_addr; - -static uint32_t ep0_out_buffer[USB_MAX_PACKET_SIZE_CTRL / 4]; -static uint32_t ep0_in_buffer[USB_MAX_PACKET_SIZE_CTRL / 4]; - -static struct EPN_OUT_TRANSFER epn_out_transfer[EPNUM - 1]; -static struct EPN_IN_TRANSFER epn_in_transfer[EPNUM - 1]; -#ifdef USB_HIGH_SPEED -static uint8_t epn_in_mc[EPNUM - 1]; -#endif - -static struct EP0_TRANSFER ep0_transfer; - -static struct HAL_USB_CALLBACKS callbacks; - -static volatile enum DEVICE_STATE device_state = ATTACHED; -static uint8_t device_cfg = 0; -static uint8_t currentAlternate; -static uint16_t currentInterface; - -static enum USB_SLEEP_T device_sleep_status; -static uint8_t device_pwr_wkup_status; -static uint8_t device_test_mode; - -#if defined(USB_SUSPEND) && (defined(PMU_USB_PIN_CHECK) || defined(USB_LPM)) -#ifdef USB_LPM -static bool lpm_entry; -#endif -static bool usbdev_timer_active; -static HWTIMER_ID usbdev_timer; - -static void hal_usb_stop_usbdev_timer(void); -#endif - -static void hal_usb_irq_handler(void); - -static void hal_usb_init_ep0_transfer(void) { - ep0_transfer.stage = NONE_STAGE; - ep0_transfer.data = NULL; - ep0_transfer.length = 0; - ep0_transfer.trx_len = 0; -} - -static void hal_usb_init_epn_transfer(void) { - memset(&epn_out_transfer[0], 0, sizeof(epn_out_transfer)); - memset(&epn_in_transfer[0], 0, sizeof(epn_in_transfer)); -} - -static void get_setup_packet(uint8_t *data, struct SETUP_PACKET *packet) { - packet->bmRequestType.direction = (data[0] & 0x80) >> 7; - packet->bmRequestType.type = (data[0] & 0x60) >> 5; - packet->bmRequestType.recipient = data[0] & 0x1f; - packet->bRequest = data[1]; - packet->wValue = (data[2] | data[3] << 8); - packet->wIndex = (data[4] | data[5] << 8); - packet->wLength = (data[6] | data[7] << 8); -} - -static void reset_epn_out_transfer(uint8_t ep) { - bool enabled; - - enabled = epn_out_transfer[ep - 1].enabled; - - // Clear epn_out_transfer[] before invoking the callback, - // so that ep can be restarted in the callback - memset(&epn_out_transfer[ep - 1], 0, sizeof(epn_out_transfer[0])); - - if (enabled && callbacks.epn_recv_compl[ep - 1]) { - callbacks.epn_recv_compl[ep - 1](NULL, 0, XFER_COMPL_ERROR); - } -} - -static void reset_epn_in_transfer(uint8_t ep) { - bool enabled; - - enabled = epn_in_transfer[ep - 1].enabled; - - // Clear epn_in_transfer[] before invoking the callback, - // so that ep can be restarted in the callback - memset(&epn_in_transfer[ep - 1], 0, sizeof(epn_in_transfer[0])); - - if (enabled && callbacks.epn_send_compl[ep - 1]) { - callbacks.epn_send_compl[ep - 1](NULL, 0, XFER_COMPL_ERROR); - } -} - -static uint32_t get_ep_type(enum EP_DIR dir, uint8_t ep) { - uint32_t type; - - if (ep == 0) { - return E_CONTROL; - } - - if (dir == EP_OUT) { - type = GET_BITFIELD(usbc->DOEPnCONFIG[ep - 1].DOEPCTL, USBC_EPTYPE); - } else { - type = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPTYPE); - } - - return type; -} - -static void _set_global_out_nak(void) { - uint32_t start; - uint32_t sts; - uint32_t ep; - - usbc->DCTL |= USBC_SGOUTNAK; - - start = hal_sys_timer_get(); - while (((usbc->GINTSTS & USBC_GOUTNAKEFF) == 0) && - (hal_sys_timer_get() - start < MS_TO_TICKS(5))) { - if (hal_sys_timer_get() - start >= US_TO_TICKS(60)) { - if ((usbc->GRSTCTL & USBC_DMAREQ) == 0) { - break; - } - } - } - - if (usbc->GINTSTS & USBC_GOUTNAKEFF) { - return; - } - - start = hal_sys_timer_get(); - while ((usbc->GINTSTS & USBC_RXFLVL) && - (hal_sys_timer_get() - start < MS_TO_TICKS(5))) { - sts = usbc->GRXSTSP; - - ep = GET_BITFIELD(sts, USBC_EPNUM); - ASSERT(ep == 0, - "Global OUT NAK: Only ep0 packets can be dropped: ep=%u sts=0x%08X", - ep, sts); - - // NOTE: - // Global OUT NAK pattern cannot be read out from GRXSTSP -- consumed by - // controller automatically when poping? - - hal_sys_timer_delay(US_TO_TICKS(60)); - if (usbc->GINTSTS & USBC_GOUTNAKEFF) { - return; - } - } - - ASSERT((usbc->GINTSTS & USBC_GOUTNAKEFF), - "Global OUT NAK: Failed to recover"); -} - -static void _disable_out_ep(uint8_t ep, uint32_t set, uint32_t clr) { - volatile uint32_t *ctrl; - volatile uint32_t *intr; - uint32_t doepctl; - - if (ep >= EPNUM) { - return; - } - - if (ep == 0) { - ctrl = &usbc->DOEPCTL0; - intr = &usbc->DOEPINT0; - } else { - ctrl = &usbc->DOEPnCONFIG[ep - 1].DOEPCTL; - intr = &usbc->DOEPnCONFIG[ep - 1].DOEPINT; - } - - doepctl = *ctrl; - - if ((doepctl & (USBC_EPENA | USBC_USBACTEP)) == 0) { - goto _exit; - } - if ((doepctl & (USBC_EPENA | USBC_NAKSTS)) == USBC_NAKSTS && - set == USBC_SNAK && clr == 0) { - goto _exit; - } - - _set_global_out_nak(); - - *ctrl |= USBC_SNAK | USBC_USBACTEP | set; - - if (clr) { - *ctrl &= ~clr; - } - - // EP0 out cannot be disabled, but stalled - if (ep != 0) { - if (doepctl & USBC_EPENA) { - *intr = USBC_EPDISBLD; - *ctrl |= USBC_EPDIS; - while ((*intr & USBC_EPDISBLD) == 0) - ; - } - - if ((doepctl & USBC_USBACTEP) == 0) { - *ctrl &= ~USBC_USBACTEP; - } - } - - usbc->DCTL |= USBC_CGOUTNAK; - -_exit: - if (ep > 0) { - reset_epn_out_transfer(ep); - } -} - -static void _disable_in_ep(uint8_t ep, uint32_t set, uint32_t clr) { - volatile uint32_t *ctrl; - volatile uint32_t *intr; - uint32_t diepctl; - - if (ep >= EPNUM) { - return; - } - - if (ep == 0) { - ctrl = &usbc->DIEPCTL0; - intr = &usbc->DIEPINT0; - } else { - ctrl = &usbc->DIEPnCONFIG[ep - 1].DIEPCTL; - intr = &usbc->DIEPnCONFIG[ep - 1].DIEPINT; - } - - diepctl = *ctrl; - - if ((diepctl & (USBC_EPENA | USBC_USBACTEP)) == 0) { - goto _exit; - } - if ((diepctl & (USBC_EPENA | USBC_NAKSTS)) == USBC_NAKSTS && - set == USBC_SNAK && clr == 0) { - goto _exit; - } - - *intr = USBC_INEPNAKEFF; - *ctrl |= USBC_SNAK | USBC_USBACTEP | set; - if ((diepctl & USBC_EPENA) && (diepctl & USBC_NAKSTS) == 0) { - while ((*intr & USBC_INEPNAKEFF) == 0) - ; - *intr = USBC_INEPNAKEFF; - } - - if (clr) { - *ctrl &= ~clr; - } - - if (diepctl & USBC_EPENA) { - *intr = USBC_EPDISBLD; - *ctrl |= USBC_EPDIS; - while ((*intr & USBC_EPDISBLD) == 0) - ; - } - - usbc->GRSTCTL = USBC_TXFNUM(ep) | USBC_TXFFLSH; - while ((usbc->GRSTCTL & USBC_TXFFLSH) != 0) - ; - - if ((diepctl & USBC_USBACTEP) == 0) { - *ctrl &= ~USBC_USBACTEP; - } - -_exit: - if (ep > 0) { - reset_epn_in_transfer(ep); - } -} - -void hal_usb_disable_ep(enum EP_DIR dir, uint8_t ep) { - USB_TRACE(3, 14, "%s: %d ep%d", __FUNCTION__, dir, ep); - - if (dir == EP_OUT) { - _disable_out_ep(ep, USBC_SNAK, 0); - } else { - _disable_in_ep(ep, USBC_SNAK, 0); - } -} - -void hal_usb_stall_ep(enum EP_DIR dir, uint8_t ep) { - uint32_t set; - uint32_t clr; - - USB_TRACE(3, 13, "%s: %d ep%d", __FUNCTION__, dir, ep); - - set = USBC_STALL; - clr = 0; - - if (dir == EP_OUT) { - _disable_out_ep(ep, set, clr); - } else { - _disable_in_ep(ep, set, clr); - } -} - -void hal_usb_unstall_ep(enum EP_DIR dir, uint8_t ep) { - uint32_t set; - uint32_t clr; - uint8_t type; - - USB_TRACE(3, 12, "%s: %d ep%d", __FUNCTION__, dir, ep); - - set = USBC_SNAK; - clr = USBC_STALL; - - type = get_ep_type(dir, ep); - if (type == E_INTERRUPT || type == E_BULK) { - set |= USBC_SETD0PID; - } - - if (hal_usb_get_ep_stall_state(dir, ep) == 0) { - // Ep not in stall state - if (ep != 0 && (type == E_INTERRUPT || type == E_BULK)) { - if (dir == EP_OUT) { - usbc->DOEPnCONFIG[ep - 1].DOEPCTL |= USBC_SETD0PID; - } else { - usbc->DIEPnCONFIG[ep - 1].DIEPCTL |= USBC_SETD0PID; - } - } - return; - } - - if (dir == EP_OUT) { - _disable_out_ep(ep, set, clr); - } else { - _disable_in_ep(ep, set, clr); - } -} - -int hal_usb_get_ep_stall_state(enum EP_DIR dir, uint8_t ep) { - volatile uint32_t *ctrl; - - if (ep >= EPNUM) { - return 0; - } - - // Select ctl register - if (ep == 0) { - if (dir == EP_IN) { - ctrl = &usbc->DIEPCTL0; - } else { - ctrl = &usbc->DOEPCTL0; - } - } else { - if (dir == EP_IN) { - ctrl = &usbc->DIEPnCONFIG[ep - 1].DIEPCTL; - } else { - ctrl = &usbc->DOEPnCONFIG[ep - 1].DOEPCTL; - } - } - - return ((*ctrl & USBC_STALL) != 0); -} - -void hal_usb_stop_ep(enum EP_DIR dir, uint8_t ep) { - USB_TRACE(3, 11, "%s: %d ep%d", __FUNCTION__, dir, ep); - - hal_usb_disable_ep(dir, ep); -} - -static void hal_usb_stop_all_out_eps(void) { - int i; - volatile uint32_t *ctrl; - volatile uint32_t *intr; - uint32_t doepctl; - - USB_FUNC_ENTRY_TRACE(11); - - // Enable global out nak - _set_global_out_nak(); - - for (i = 0; i < EPNUM; i++) { - if (i == 0) { - ctrl = &usbc->DOEPCTL0; - intr = &usbc->DOEPINT0; - } else { - ctrl = &usbc->DOEPnCONFIG[i - 1].DOEPCTL; - intr = &usbc->DOEPnCONFIG[i - 1].DOEPINT; - } - - doepctl = *ctrl; - - // BUS RESET will clear USBC_USBACTEP but keep USBC_EPENA in ep ctrl - if (doepctl & (USBC_EPENA | USBC_USBACTEP)) { - *ctrl |= USBC_SNAK | USBC_USBACTEP; - // EP0 out cannot be disabled, but stalled - if (i != 0) { - if (doepctl & USBC_EPENA) { - *intr = USBC_EPDISBLD; - *ctrl |= USBC_EPDIS; - while ((*intr & USBC_EPDISBLD) == 0) - ; - } - if ((doepctl & USBC_USBACTEP) == 0) { - *ctrl &= ~USBC_USBACTEP; - } - } - } - } - - // Disable global out nak - usbc->DCTL |= USBC_CGOUTNAK; -} - -static void hal_usb_stop_all_in_eps(void) { - int i; - volatile uint32_t *ctrl; - volatile uint32_t *intr; - uint32_t diepctl; - - USB_FUNC_ENTRY_TRACE(11); - - usbc->DCTL |= USBC_SGNPINNAK; - while ((usbc->GINTSTS & USBC_GINNAKEFF) == 0) - ; - - for (i = 0; i < EPNUM; i++) { - if (i == 0) { - ctrl = &usbc->DIEPCTL0; - intr = &usbc->DIEPINT0; - } else { - ctrl = &usbc->DIEPnCONFIG[i - 1].DIEPCTL; - intr = &usbc->DIEPnCONFIG[i - 1].DIEPINT; - } - - diepctl = *ctrl; - - // BUS RESET will clear USBC_USBACTEP but keep USBC_EPENA in ep ctrl - if (diepctl & (USBC_EPENA | USBC_USBACTEP)) { - *intr = USBC_INEPNAKEFF; - *ctrl |= USBC_SNAK | USBC_USBACTEP; - if ((diepctl & USBC_EPENA) && (diepctl & USBC_NAKSTS) == 0) { - while ((*intr & USBC_INEPNAKEFF) == 0) - ; - *intr = USBC_INEPNAKEFF; - } - if (diepctl & USBC_EPENA) { - *intr = USBC_EPDISBLD; - *ctrl |= USBC_EPDIS; - while ((*intr & USBC_EPDISBLD) == 0) - ; - } - if ((diepctl & USBC_USBACTEP) == 0) { - *ctrl &= ~USBC_USBACTEP; - } - } - } - - // Flush Tx Fifo - usbc->GRSTCTL = USBC_TXFNUM(0x10) | USBC_TXFFLSH | USBC_RXFFLSH; - while ((usbc->GRSTCTL & (USBC_TXFFLSH | USBC_RXFFLSH)) != 0) - ; - - usbc->DCTL |= USBC_CGNPINNAK; -} - -static void hal_usb_flush_tx_fifo(uint8_t ep) { - usbc->DCTL |= USBC_SGNPINNAK; - while ((usbc->GINTSTS & USBC_GINNAKEFF) == 0) - ; - - while ((usbc->GRSTCTL & USBC_AHBIDLE) == 0) - ; - - // while ((usbc->GRSTCTL & USBC_TXFFLSH) != 0); - - usbc->GRSTCTL = USBC_TXFNUM(ep) | USBC_TXFFLSH; - while ((usbc->GRSTCTL & USBC_TXFFLSH) != 0) - ; - - usbc->DCTL |= USBC_CGNPINNAK; -} - -static void hal_usb_flush_all_tx_fifos(void) { hal_usb_flush_tx_fifo(0x10); } - -static void POSSIBLY_UNUSED hal_usb_flush_rx_fifo(void) { - _set_global_out_nak(); - - usbc->GRSTCTL |= USBC_RXFFLSH; - while ((usbc->GRSTCTL & USBC_RXFFLSH) != 0) - ; - - usbc->DCTL |= USBC_CGOUTNAK; -} - -static void hal_usb_alloc_ep0_fifo(void) { - uint32_t ram_size; - uint32_t ram_avail; - - if ((usbc->GHWCFG2 & USBC_DYNFIFOSIZING) == 0) { - return; - } - - // All endpoints have been stopped in hal_usb_irq_reset() - - // Configure FIFOs - - // RX FIFO Calculation - // ------------------- - // SETUP Packets : 4 * n + 6 - // Global OUT NAK : 1 - // DATA Packets + Status Info : (MPS / 4 + 1) * m - // OutEp XFER COMPL : 1 * outEpNum - // OutEp Disable : 1 * outEpNum - -#ifdef USB_ISO -#define RXFIFOSIZE \ - ((4 * CTRL_EPNUM + 6) + 1 + (2 * (USB_FIFO_MPS_ISO_RECV / 4 + 1)) + \ - (EPNUM * 2)) -#else -#define RXFIFOSIZE \ - ((4 * CTRL_EPNUM + 6) + 1 + (2 * (USB_MAX_PACKET_SIZE_BULK / 4 + 1)) + \ - (EPNUM * 2)) -#endif -#define EP0_TXFIFOSIZE (2 * (USB_MAX_PACKET_SIZE_CTRL + 3) / 4) - -#if (RXFIFOSIZE + EP0_TXFIFOSIZE > SPFIFORAM_SIZE) -#error "Invalid FIFO size configuration" -#endif - - ram_size = GET_BITFIELD(usbc->GDFIFOCFG, USBC_GDFIFOCFG); - ram_avail = GET_BITFIELD(usbc->GDFIFOCFG, USBC_EPINFOBASEADDR); - - ASSERT(SPFIFORAM_SIZE == ram_size, "Bad dfifo size: %u (should be %u)", - ram_size, SPFIFORAM_SIZE); - ASSERT(RXFIFOSIZE + EP0_TXFIFOSIZE <= ram_avail, - "Bad dfifo size cfg: rx=%u ep0=%u avail=%u", RXFIFOSIZE, - EP0_TXFIFOSIZE, ram_avail); - - // Rx Fifo Size (and init fifo_addr) - usbc->GRXFSIZ = USBC_RXFDEP(RXFIFOSIZE); - fifo_addr = RXFIFOSIZE; - - // EP0 / Non-periodic Tx Fifo Size - usbc->GNPTXFSIZ = - USBC_NPTXFSTADDR(fifo_addr) | USBC_NPTXFDEPS(EP0_TXFIFOSIZE); - fifo_addr += EP0_TXFIFOSIZE; - - // Flush Tx FIFOs - hal_usb_flush_all_tx_fifos(); -} - -static void hal_usb_alloc_epn_fifo(uint8_t ep, uint16_t mps) { - uint16_t size; - uint32_t ram_avail; - - if (ep == 0 || ep >= EPNUM) { - return; - } - - size = (mps + 3) / 4 * 2; - - ram_avail = GET_BITFIELD(usbc->GDFIFOCFG, USBC_EPINFOBASEADDR); - - ASSERT(fifo_addr + size <= ram_avail, - "Fifo overflow: fifo_addr=%u, size=%u, avail=%u", fifo_addr, size, - ram_avail); - - usbc->DTXFSIZE[ep - 1].DIEPTXFn = - USBC_INEPNTXFSTADDR(fifo_addr) | USBC_INEPNTXFDEP(size); - fifo_addr += size; -} - -static void hal_usb_soft_reset(void) { - usbc->GRSTCTL |= USBC_CSFTRST; - while ((usbc->GRSTCTL & USBC_CSFTRST) != 0) - ; - while ((usbc->GRSTCTL & USBC_AHBIDLE) == 0) - ; -} - -static void hal_usb_init_phy(void) { -#ifdef USB_HIGH_SPEED - usbc->GUSBCFG |= - USBC_FORCEDEVMODE | USBC_ULPIAUTORES | USBC_ULPIFSLS | USBC_ULPI_UTMI_SEL; - usbc->GUSBCFG &= - ~(USBC_FSINTF | USBC_PHYIF | USBC_PHYSEL | USBC_USBTRDTIM_MASK); -#else - usbc->GUSBCFG |= USBC_FORCEDEVMODE | USBC_ULPIAUTORES | USBC_ULPIFSLS | - USBC_PHYSEL | USBC_ULPI_UTMI_SEL; - usbc->GUSBCFG &= ~(USBC_FSINTF | USBC_PHYIF | USBC_USBTRDTIM_MASK); -#endif - // USB turnaround time = 4 * AHB Clock + 1 PHY Clock, in terms of PHY clocks. - // If AHB Clock >= PHY Clock, time can be set to 5. - // If AHB Clock * 2 == PHY Clock, time should be set to 9. - usbc->GUSBCFG |= USBC_USBTRDTIM(5); -} - -static void hal_usb_device_init(void) { - int i; - uint8_t speed; - -#ifdef CHIP_HAS_USBPHY - usbphy_open(); -#endif - -#ifdef USB_HIGH_SPEED -#ifdef CHIP_HAS_USBIF - usbif->USBIF_00 &= ~(USBIF_00_CFG_DR_SUSPEND | USBIF_00_CFG_REG_SUSPEND); - usbif->USBIF_08 &= ~USBIF_08_CFG_SEL48M; -#endif - speed = 0; -#else -#ifdef CHIP_HAS_USBIF - usbif->USBIF_00 |= USBIF_00_CFG_DR_SUSPEND | USBIF_00_CFG_REG_SUSPEND; - usbif->USBIF_08 |= USBIF_08_CFG_SEL48M; -#endif - speed = 3; -#endif - -#ifdef CHIP_BEST2000 - if (hal_get_chip_metal_id() >= HAL_CHIP_METAL_ID_1) { - // dr_suspend and reg_suspend are inverted since metal 1 - usbif->USBIF_00 ^= USBIF_00_CFG_DR_SUSPEND | USBIF_00_CFG_REG_SUSPEND; - } -#endif - -#ifdef USB_HIGH_SPEED - // Wait until usbphy clock is ready - hal_sys_timer_delay(US_TO_TICKS(60)); -#endif - - hal_usb_soft_reset(); - hal_usb_init_phy(); - // Reset after selecting PHY - hal_usb_soft_reset(); - // Some core cfg (except for PHY selection) will also be reset during soft - // reset - hal_usb_init_phy(); - - usbc->DCFG &= ~(USBC_DEVSPD_MASK | USBC_PERFRINT_MASK); - usbc->DCFG |= USBC_DEVSPD(speed) | USBC_NZSTSOUTHSHK | USBC_PERFRINT(0); - - // Clear previous interrupts - usbc->GINTMSK = 0; - usbc->GINTSTS = ~0UL; - usbc->DAINTMSK = 0; - usbc->DOEPMSK = 0; - usbc->DIEPMSK = 0; - for (i = 0; i < EPNUM; ++i) { - if (i == 0) { - usbc->DOEPINT0 = ~0UL; - usbc->DIEPINT0 = ~0UL; - } else { - usbc->DOEPnCONFIG[i - 1].DOEPINT = ~0UL; - usbc->DIEPnCONFIG[i - 1].DIEPINT = ~0UL; - } - } - usbc->GINTMSK = USBC_USBRST | USBC_ENUMDONE | USBC_ERLYSUSP | USBC_USBSUSP; - - usbc->DCTL &= ~USBC_SFTDISCON; -#if (USB_ISO_INTERVAL > 1) - // Not to check frame number and ignore ISO incomplete interrupts - usbc->DCTL |= USBC_IGNRFRMNUM; -#endif - - // Enable DMA mode - // Burst size 16 words - usbc->GAHBCFG = USBC_DMAEN | USBC_HBSTLEN(7); - usbc->GAHBCFG |= USBC_GLBLINTRMSK; -} - -static void hal_usb_soft_disconnect(void) { - // Disable global interrupt - usbc->GAHBCFG &= ~USBC_GLBLINTRMSK; - // Soft disconnection - usbc->DCTL |= USBC_SFTDISCON; - - hal_usb_device_init(); -} - -static void enable_usb_irq(void) { - NVIC_SetVector(USB_IRQn, (uint32_t)hal_usb_irq_handler); -#ifdef USB_ISO - NVIC_SetPriority(USB_IRQn, IRQ_PRIORITY_HIGH); -#else - NVIC_SetPriority(USB_IRQn, IRQ_PRIORITY_NORMAL); -#endif - NVIC_ClearPendingIRQ(USB_IRQn); - NVIC_EnableIRQ(USB_IRQn); -} - -int hal_usb_open(const struct HAL_USB_CALLBACKS *c, enum HAL_USB_API_MODE m) { - if (c == NULL) { - return 1; - } - if (c->device_desc == NULL || c->cfg_desc == NULL || c->string_desc == NULL || - c->setcfg == NULL) { - return 2; - } - - if (device_state != ATTACHED) { - return 3; - } - device_state = POWERED; - device_sleep_status = USB_SLEEP_NONE; - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, USB_SYS_FREQ); - -#if defined(USB_SUSPEND) && (defined(PMU_USB_PIN_CHECK) || defined(USB_LPM)) - if (usbdev_timer == NULL) { - usbdev_timer = hwtimer_alloc(NULL, NULL); - ASSERT(usbdev_timer, "Failed to alloc usbdev_timer"); - } -#endif - - hal_cmu_usb_set_device_mode(); - hal_cmu_usb_clock_enable(); - - memcpy(&callbacks, c, sizeof(callbacks)); - - if (usbc->GAHBCFG & USBC_GLBLINTRMSK) { - hal_usb_soft_disconnect(); - } else { - hal_usb_device_init(); - } - - enable_usb_irq(); - - if (m == HAL_USB_API_BLOCKING) { - while (device_state != CONFIGURED) - ; - } - - return 0; -} - -int hal_usb_reopen(const struct HAL_USB_CALLBACKS *c, uint8_t dcfg, uint8_t alt, - uint16_t itf) { - if (c == NULL) { - return 1; - } - if (c->device_desc == NULL || c->cfg_desc == NULL || c->string_desc == NULL || - c->setcfg == NULL) { - return 2; - } - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, USB_SYS_FREQ); - - memcpy(&callbacks, c, sizeof(callbacks)); - - device_state = CONFIGURED; - device_cfg = dcfg; - currentAlternate = alt; - currentInterface = itf; - - enable_usb_irq(); - - return 0; -} - -void hal_usb_close(void) { -#ifdef USB_SUSPEND -#if defined(PMU_USB_PIN_CHECK) || defined(USB_LPM) - // Stop pin check timer - hal_usb_stop_usbdev_timer(); -#ifdef PMU_USB_PIN_CHECK - // Disabe PMU pin status check - pmu_usb_disable_pin_status_check(); -#endif -#endif -#endif - - NVIC_DisableIRQ(USB_IRQn); - - device_state = ATTACHED; - - // Disable global interrupt - usbc->GAHBCFG &= ~USBC_GLBLINTRMSK; - // Soft disconnection - usbc->DCTL |= USBC_SFTDISCON; - // Soft reset - usbc->GRSTCTL |= USBC_CSFTRST; - usbc->DCTL |= USBC_SFTDISCON; - usbc->GRSTCTL |= USBC_CSFTRST; - // while ((usbc->GRSTCTL & USBC_CSFTRST) != 0); - // while ((usbc->GRSTCTL & USBC_AHBIDLE) == 0); - -#ifdef CHIP_HAS_USBPHY - usbphy_close(); -#endif - - hal_cmu_usb_clock_disable(); - - memset(&callbacks, 0, sizeof(callbacks)); - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, HAL_CMU_FREQ_32K); -} - -void hal_usb_detect_disconn(void) { - // NOTE: - // PHY detects the disconnection event by DP/DN voltage level change. - // But DP/DN voltages are provided by vusb ldo inside chip, which has nothing - // to do with VBUS. That is why USB controller cannot generate the - // disconnection interrupt. Meanwhile VBUS detection or charger detection can - // help to generate USB disconnection event via this function. - - USB_FUNC_ENTRY_TRACE(26); - - if (device_state != ATTACHED && callbacks.state_change) { - callbacks.state_change(HAL_USB_EVENT_DISCONNECT, 0); - } -} - -int hal_usb_configured(void) { return (device_state == CONFIGURED); } - -int hal_usb_suspended(void) { - return (device_sleep_status == USB_SLEEP_SUSPEND); -} - -uint32_t hal_usb_get_soffn(void) { - return GET_BITFIELD(usbc->DSTS, USBC_SOFFN); -} - -#ifdef USB_HIGH_SPEED -uint32_t hal_usb_calc_hshb_ep_mps(uint32_t pkt_size) { - // For high speed, high bandwidth endpoints - if (pkt_size <= USB_MAX_PACKET_SIZE_ISO) { - return pkt_size; - } else if (pkt_size > USB_MAX_PACKET_SIZE_ISO && - pkt_size <= USB_MAX_PACKET_SIZE_ISO * 2) { - return ALIGN(pkt_size / 2, 4); - } else { - // if (pkt_size > USB_MAX_PACKET_SIZE_ISO * 2 && pkt_size <= - // USB_MAX_PACKET_SIZE_ISO * 3) - return ALIGN(pkt_size / 3, 4); - } -} -#endif - -int hal_usb_activate_epn(enum EP_DIR dir, uint8_t ep, uint8_t type, - uint16_t mps) { - uint32_t fifo_mps; - - USB_TRACE(3, 10, "%s: %d ep%d", __FUNCTION__, dir, ep); - - if (ep == 0 || ep >= EPNUM) { - return 1; - } - - if (dir == EP_OUT) { - // Stop ep out - if (usbc->DOEPnCONFIG[ep - 1].DOEPCTL & (USBC_EPENA | USBC_USBACTEP)) { - hal_usb_stop_ep(dir, ep); - } - // Config ep out - usbc->DOEPnCONFIG[ep - 1].DOEPCTL = USBC_EPN_MPS(mps) | USBC_EPTYPE(type) | - USBC_USBACTEP | USBC_SNAK | - USBC_SETD0PID; - // Unstall ep out - usbc->DOEPnCONFIG[ep - 1].DOEPCTL &= ~USBC_STALL; - // Unmask ep out interrupt - usbc->DAINTMSK |= USBC_OUTEPMSK(1 << ep); - } else { - fifo_mps = mps; -#ifdef USB_HIGH_SPEED - if (type == E_ISOCHRONOUS || type == E_INTERRUPT) { - if (mps > USB_FIFO_MPS_ISO_SEND) { - fifo_mps = USB_FIFO_MPS_ISO_SEND; - } - epn_in_mc[ep - 1] = 1; - } -#endif - // Stop ep in - if (usbc->DIEPnCONFIG[ep - 1].DIEPCTL & (USBC_EPENA | USBC_USBACTEP)) { - hal_usb_stop_ep(dir, ep); - } - // Config ep in - usbc->DIEPnCONFIG[ep - 1].DIEPCTL = USBC_EPN_MPS(mps) | USBC_EPTYPE(type) | - USBC_USBACTEP | USBC_EPTXFNUM(ep) | - USBC_SNAK | USBC_SETD0PID; - // Allocate tx fifo - hal_usb_alloc_epn_fifo(ep, fifo_mps); - // Unstall ep in - usbc->DIEPnCONFIG[ep - 1].DIEPCTL &= ~USBC_STALL; - // Unmask ep in interrupt - usbc->DAINTMSK |= USBC_INEPMSK(1 << ep); - } - - return 0; -} - -int hal_usb_deactivate_epn(enum EP_DIR dir, uint8_t ep) { - USB_TRACE(3, 9, "%s: %d ep%d", __FUNCTION__, dir, ep); - - if (ep == 0 || ep >= EPNUM) { - return 1; - } - - hal_usb_stop_ep(dir, ep); - - if (dir == EP_OUT) { - usbc->DOEPnCONFIG[ep - 1].DOEPCTL &= ~USBC_USBACTEP; - // Mask ep out interrupt - usbc->DAINTMSK &= ~USBC_OUTEPMSK(1 << ep); - } else { - usbc->DIEPnCONFIG[ep - 1].DIEPCTL &= ~USBC_USBACTEP; - // Mask ep in interrupt - usbc->DAINTMSK &= ~USBC_INEPMSK(1 << ep); - } - - return 0; -} - -// NOTE: Not support send epn mps change, which will involve tx fifo -// reallocation -int hal_usb_update_recv_epn_mps(uint8_t ep, uint16_t mps) { - uint8_t type; - - USB_TRACE(3, 9, "%s: ep%d mps=%u", __FUNCTION__, ep, mps); - - if (ep == 0 || ep >= EPNUM) { - return 1; - } - - if ((usbc->DOEPnCONFIG[ep - 1].DOEPCTL & USBC_USBACTEP) == 0) { - return 2; - } - - hal_usb_stop_ep(EP_OUT, ep); - - usbc->DOEPnCONFIG[ep - 1].DOEPCTL &= ~USBC_USBACTEP; - // Mask ep out interrupt - usbc->DAINTMSK &= ~USBC_OUTEPMSK(1 << ep); - // Config ep out - type = GET_BITFIELD(usbc->DOEPnCONFIG[ep - 1].DOEPCTL, USBC_EPTYPE); - usbc->DOEPnCONFIG[ep - 1].DOEPCTL = USBC_EPN_MPS(mps) | USBC_EPTYPE(type) | - USBC_USBACTEP | USBC_SNAK | USBC_SETD0PID; - // Unmask ep out interrupt - usbc->DAINTMSK |= USBC_OUTEPMSK(1 << ep); - - return 0; -} - -int hal_usb_update_send_epn_mc(uint8_t ep, uint8_t mc) { -#ifdef USB_HIGH_SPEED - uint8_t type; - - USB_TRACE(3, 9, "%s: ep%d mc=%u", __FUNCTION__, ep, mc); - - if (ep == 0 || ep >= EPNUM) { - return 1; - } - - if (mc < 1 || mc > 3) { - return 3; - } - - if ((usbc->DIEPnCONFIG[ep - 1].DIEPCTL & USBC_USBACTEP) == 0) { - return 2; - } - - type = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPTYPE); - if (type == E_INTERRUPT || type == E_ISOCHRONOUS) { - epn_in_mc[ep - 1] = mc; - return 0; - } -#endif - - return 4; -} - -static void hal_usb_recv_ep0(void) { - USB_FUNC_ENTRY_TRACE(8); - - // Enable EP0 to receive a new setup packet - usbc->DOEPTSIZ0 = USBC_SUPCNT(3) | - USBC_OEPXFERSIZE0(USB_MAX_PACKET_SIZE_CTRL) | - USBC_OEPPKTCNT0; - usbc->DOEPDMA0 = (uint32_t)ep0_out_buffer; - usbc->DOEPINT0 = usbc->DOEPINT0; - usbc->DOEPCTL0 |= USBC_CNAK | USBC_EPENA; -} - -static void hal_usb_send_ep0(const uint8_t *data, uint16_t size) { - USB_TRACE(2, 8, "%s: %d", __FUNCTION__, size); - ASSERT(size <= USB_MAX_PACKET_SIZE_CTRL, "Invalid ep0 send size: %d", size); - - if (data && size) { - memcpy(ep0_in_buffer, data, size); - } - - // Enable EP0 to send one packet - usbc->DIEPTSIZ0 = USBC_IEPXFERSIZE0(size) | USBC_IEPPKTCNT0(1); - usbc->DIEPDMA0 = (uint32_t)ep0_in_buffer; - usbc->DIEPINT0 = usbc->DIEPINT0; - usbc->DIEPCTL0 |= USBC_CNAK | USBC_EPENA; -} - -int hal_usb_recv_epn(uint8_t ep, uint8_t *buffer, uint32_t size) { - uint16_t mps; - uint32_t pkt; - uint32_t xfer; - uint32_t fn = 0; -#ifdef USB_ISO - bool isoEp; - uint32_t lock; -#endif - - USB_TRACE(3, 7, "%s: ep%d %d", __FUNCTION__, ep, size); - - if (device_state != CONFIGURED) { - return 1; - } - if (ep == 0 || ep > EPNUM) { - return 2; - } - if (((uint32_t)buffer & 0x3) != 0) { - return 3; - } - if (epn_out_transfer[ep - 1].data != NULL) { - return 4; - } - if ((usbc->DOEPnCONFIG[ep - 1].DOEPCTL & USBC_USBACTEP) == 0) { - return 5; - } - mps = GET_BITFIELD(usbc->DOEPnCONFIG[ep - 1].DOEPCTL, USBC_EPN_MPS); - mps = ALIGN(mps, 4); - if (size < mps) { - return 6; - } - - if (size > EPN_MAX_XFERSIZE) { - return 7; - } - pkt = size / mps; - if (pkt > EPN_MAX_PKTCNT) { - return 8; - } - xfer = pkt * mps; - if (size != xfer) { - return 9; - } - - usbc->DOEPnCONFIG[ep - 1].DOEPTSIZ = - USBC_OEPXFERSIZE(xfer) | USBC_OEPPKTCNT(pkt); - usbc->DOEPnCONFIG[ep - 1].DOEPDMA = (uint32_t)buffer; - usbc->DOEPnCONFIG[ep - 1].DOEPINT = usbc->DOEPnCONFIG[ep - 1].DOEPINT; - - epn_out_transfer[ep - 1].data = buffer; - epn_out_transfer[ep - 1].length = xfer; - epn_out_transfer[ep - 1].enabled = true; - -#ifdef USB_ISO - if (GET_BITFIELD(usbc->DOEPnCONFIG[ep - 1].DOEPCTL, USBC_EPTYPE) == - E_ISOCHRONOUS) { - isoEp = true; - } else { - isoEp = false; - } - if (isoEp) { - // Set the frame number in time - lock = int_lock(); - // Get next frame number - if (GET_BITFIELD(usbc->DSTS, USBC_SOFFN) & 0x1) { - fn = USBC_SETD0PID; - } else { - fn = USBC_SETD1PID; - } - } -#endif - - usbc->DOEPnCONFIG[ep - 1].DOEPCTL |= USBC_EPENA | USBC_CNAK | fn; - -#ifdef USB_ISO - if (isoEp) { - int_unlock(lock); - } -#endif - - return 0; -} - -int hal_usb_send_epn(uint8_t ep, const uint8_t *buffer, uint32_t size, - enum ZLP_STATE zlp) { - uint16_t mps; - uint8_t type; - uint32_t pkt; - uint32_t fn = 0; -#ifdef USB_ISO - bool isoEp; - uint32_t lock; -#endif - - USB_TRACE(3, 6, "%s: ep%d %d", __FUNCTION__, ep, size); - - if (device_state != CONFIGURED) { - return 1; - } - if (ep == 0 || ep > EPNUM) { - return 2; - } - if (((uint32_t)buffer & 0x3) != 0) { - return 3; - } - if (epn_in_transfer[ep - 1].data != NULL) { - return 4; - } - if ((usbc->DIEPnCONFIG[ep - 1].DIEPCTL & USBC_USBACTEP) == 0) { - return 5; - } - if (size > EPN_MAX_XFERSIZE) { - return 7; - } - mps = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPN_MPS); - if (size <= mps) { - // Also taking care of 0 size packet - pkt = 1; - } else { - // If mps is not aligned in 4 bytes, application should add padding at the - // end of each packet to make sure a new packet always starts at 4-byte - // boundary - pkt = (size + mps - 1) / mps; - if (pkt > EPN_MAX_PKTCNT) { - return 8; - } - } - - type = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPTYPE); - if (type == E_INTERRUPT || type == E_ISOCHRONOUS) { -#ifdef USB_HIGH_SPEED - if (pkt != epn_in_mc[ep - 1] && (pkt % epn_in_mc[ep - 1])) { - // MC is the pkt cnt must be sent in every (micro)frame. - // The total pkt cnt should be integral multiple of MC value. - return 9; - } -#endif - // Never send a zero length packet at the end of transfer - epn_in_transfer[ep - 1].zero_len_pkt = false; - usbc->DIEPnCONFIG[ep - 1].DIEPTSIZ = USBC_IEPXFERSIZE(size) | - USBC_IEPPKTCNT(pkt) | -#ifdef USB_HIGH_SPEED - USBC_MC(epn_in_mc[ep - 1]); -#else - USBC_MC(1); -#endif - } else { - // Check if a zero length packet is needed at the end of transfer - if (zlp == ZLP_AUTO) { - epn_in_transfer[ep - 1].zero_len_pkt = ((size % mps) == 0); - } else { - epn_in_transfer[ep - 1].zero_len_pkt = false; - } - usbc->DIEPnCONFIG[ep - 1].DIEPTSIZ = - USBC_IEPXFERSIZE(size) | USBC_IEPPKTCNT(pkt); - } - usbc->DIEPnCONFIG[ep - 1].DIEPDMA = (uint32_t)buffer; - usbc->DIEPnCONFIG[ep - 1].DIEPINT = usbc->DIEPnCONFIG[ep - 1].DIEPINT; - - epn_in_transfer[ep - 1].data = buffer; - epn_in_transfer[ep - 1].length = size; - epn_in_transfer[ep - 1].pkt_cnt = pkt; - epn_in_transfer[ep - 1].enabled = true; - -#ifdef USB_ISO - if (GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPTYPE) == - E_ISOCHRONOUS) { - isoEp = true; - } else { - isoEp = false; - } - if (isoEp) { - // Set the frame number in time - lock = int_lock(); - // Get next frame number - if (GET_BITFIELD(usbc->DSTS, USBC_SOFFN) & 0x1) { - fn = USBC_SETD0PID; - } else { - fn = USBC_SETD1PID; - } - } -#endif - - usbc->DIEPnCONFIG[ep - 1].DIEPCTL |= USBC_EPENA | USBC_CNAK | fn; - -#ifdef USB_ISO - if (isoEp) { - int_unlock(lock); - } -#endif - - return 0; -} - -static void hal_usb_recv_epn_complete(uint8_t ep, uint32_t statusEp) { - uint8_t *data; - uint32_t size; - uint32_t doeptsiz; - enum XFER_COMPL_STATE state = XFER_COMPL_SUCCESS; - - USB_TRACE(3, 5, "%s: ep%d 0x%08x", __FUNCTION__, ep, statusEp); - - if (!epn_out_transfer[ep - 1].enabled) { - return; - } - - doeptsiz = usbc->DOEPnCONFIG[ep - 1].DOEPTSIZ; - - data = epn_out_transfer[ep - 1].data; - size = GET_BITFIELD(doeptsiz, USBC_OEPXFERSIZE); - ASSERT(size <= epn_out_transfer[ep - 1].length, - "Invalid xfer size: size=%d, len=%d", size, - epn_out_transfer[ep - 1].length); - size = epn_out_transfer[ep - 1].length - size; - -#ifdef USB_ISO - uint32_t doepctl = usbc->DOEPnCONFIG[ep - 1].DOEPCTL; - - if (GET_BITFIELD(doepctl, USBC_EPTYPE) == E_ISOCHRONOUS) { -#if (USB_ISO_INTERVAL == 1) -#if 1 - if (GET_BITFIELD(doeptsiz, USBC_OEPPKTCNT) != 0) { - state = XFER_COMPL_ERROR; - } -#else - uint32_t rxdpid = GET_BITFIELD(doeptsiz, USBC_RXDPID); - uint32_t pkt = - epn_out_transfer[ep - 1].length / GET_BITFIELD(doepctl, USBC_EPN_MPS) - - GET_BITFIELD(doeptsiz, USBC_OEPPKTCNT); - if ((rxdpid == DATA_PID_DATA0 && pkt != 1) || - (rxdpid == DATA_PID_DATA1 && pkt != 2) || - (rxdpid == DATA_PID_DATA2 && pkt != 3)) { - state = XFER_COMPL_ERROR; - } -#endif -#else // USB_ISO_INTERVAL != 1 - if (statusEp & USBC_PKTDRPSTS) { - state = XFER_COMPL_ERROR; - } -#endif // USB_ISO_INTERVAL != 1 - } -#endif // USB_ISO - - // Clear epn_out_transfer[] before invoking the callback, - // so that ep can be restarted in the callback - memset(&epn_out_transfer[ep - 1], 0, sizeof(epn_out_transfer[0])); - - if (callbacks.epn_recv_compl[ep - 1]) { - callbacks.epn_recv_compl[ep - 1](data, size, state); - } -} - -static void hal_usb_send_epn_complete(uint8_t ep, uint32_t statusEp) { - const uint8_t *data; - uint32_t size; - uint16_t pkt, mps; - uint8_t type; - uint32_t mc; - enum XFER_COMPL_STATE state = XFER_COMPL_SUCCESS; - - USB_TRACE(3, 4, "%s: ep%d 0x%08x", __FUNCTION__, ep, statusEp); - - if (!epn_in_transfer[ep - 1].enabled) { - return; - } - - if ((statusEp & USBC_XFERCOMPLMSK) == 0) { - state = XFER_COMPL_ERROR; - } - - pkt = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPTSIZ, USBC_IEPPKTCNT); - if (pkt != 0) { - state = XFER_COMPL_ERROR; - mps = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPN_MPS); - ASSERT(pkt <= epn_in_transfer[ep - 1].pkt_cnt, - "Invalid pkt cnt: pkt=%d, pkt_cnt=%d", pkt, - epn_in_transfer[ep - 1].pkt_cnt); - size = (epn_in_transfer[ep - 1].pkt_cnt - pkt) * mps; - } else { - size = epn_in_transfer[ep - 1].length; - } - - if (state == XFER_COMPL_SUCCESS && epn_in_transfer[ep - 1].zero_len_pkt) { - epn_in_transfer[ep - 1].zero_len_pkt = false; - // Send the last zero length packet, except for isochronous/interrupt - // endpoints - type = GET_BITFIELD(usbc->DIEPnCONFIG[ep - 1].DIEPCTL, USBC_EPTYPE); - if (type == E_INTERRUPT || type == E_ISOCHRONOUS) { -#ifdef USB_HIGH_SPEED - mc = USBC_MC(epn_in_mc[ep - 1]); -#else - mc = USBC_MC(1); -#endif - } else { - mc = 0; - } - usbc->DIEPnCONFIG[ep - 1].DIEPTSIZ = - USBC_IEPXFERSIZE(0) | USBC_IEPPKTCNT(1) | mc; - usbc->DIEPnCONFIG[ep - 1].DIEPCTL |= USBC_EPENA | USBC_CNAK; - } else { - data = epn_in_transfer[ep - 1].data; - - // Clear epn_in_transfer[] before invoking the callback, - // so that ep can be restarted in the callback - memset(&epn_in_transfer[ep - 1], 0, sizeof(epn_in_transfer[0])); - - if (state != XFER_COMPL_SUCCESS) { - // The callback will not be invoked when stopping ep, - // for epn_in_transfer[] has been cleared - hal_usb_stop_ep(EP_IN, ep); - } - - if (callbacks.epn_send_compl[ep - 1]) { - callbacks.epn_send_compl[ep - 1](data, size, state); - } - } -} - -static bool requestSetAddress(void) { - USB_FUNC_ENTRY_TRACE(25); - - /* Set the device address */ - usbc->DCFG = - SET_BITFIELD(usbc->DCFG, USBC_DEVADDR, ep0_transfer.setup_pkt.wValue); - ep0_transfer.stage = STATUS_IN_STAGE; - - if (ep0_transfer.setup_pkt.wValue == 0) { - device_state = DEFAULT; - } else { - device_state = ADDRESS; - } - - return true; -} - -static bool requestSetConfiguration(void) { - USB_FUNC_ENTRY_TRACE(24); - - device_cfg = ep0_transfer.setup_pkt.wValue; - /* Set the device configuration */ - if (device_cfg == 0) { - /* Not configured */ - device_state = ADDRESS; - } else { - if (callbacks.setcfg && callbacks.setcfg(device_cfg)) { - /* Valid configuration */ - device_state = CONFIGURED; - ep0_transfer.stage = STATUS_IN_STAGE; - } else { - return false; - } - } - - return true; -} - -static bool requestGetConfiguration(void) { - USB_FUNC_ENTRY_TRACE(23); - - /* Send the device configuration */ - ep0_transfer.data = &device_cfg; - ep0_transfer.length = sizeof(device_cfg); - ep0_transfer.stage = DATA_IN_STAGE; - return true; -} - -static bool requestGetInterface(void) { - USB_FUNC_ENTRY_TRACE(22); - - /* Return the selected alternate setting for an interface */ - if (device_state != CONFIGURED) { - return false; - } - - /* Send the alternate setting */ - ep0_transfer.setup_pkt.wIndex = currentInterface; - ep0_transfer.data = ¤tAlternate; - ep0_transfer.length = sizeof(currentAlternate); - ep0_transfer.stage = DATA_IN_STAGE; - return true; -} - -static bool requestSetInterface(void) { - bool success = false; - - USB_FUNC_ENTRY_TRACE(21); - - if (callbacks.setitf && callbacks.setitf(ep0_transfer.setup_pkt.wIndex, - ep0_transfer.setup_pkt.wValue)) { - success = true; - currentInterface = ep0_transfer.setup_pkt.wIndex; - currentAlternate = ep0_transfer.setup_pkt.wValue; - ep0_transfer.stage = STATUS_IN_STAGE; - } - return success; -} - -static bool requestSetFeature(void) { - bool success = false; - - USB_FUNC_ENTRY_TRACE(20); - - if (device_state != CONFIGURED) { - /* Endpoint or interface must be zero */ - if (ep0_transfer.setup_pkt.wIndex != 0) { - return false; - } - } - - switch (ep0_transfer.setup_pkt.bmRequestType.recipient) { - case DEVICE_RECIPIENT: - if (ep0_transfer.setup_pkt.wValue == TEST_MODE) { - // TODO: Check test mode - device_test_mode = (ep0_transfer.setup_pkt.wIndex >> 8); - success = true; - } -#ifdef USB_SUSPEND - else if (ep0_transfer.setup_pkt.wValue == DEVICE_REMOTE_WAKEUP) { - if (callbacks.set_remote_wakeup) { - callbacks.set_remote_wakeup(1); - device_pwr_wkup_status |= DEVICE_STATUS_REMOTE_WAKEUP; - success = true; - } - } -#endif - break; - case ENDPOINT_RECIPIENT: - if (ep0_transfer.setup_pkt.wValue == ENDPOINT_HALT) { - // TODO: Check endpoint number - hal_usb_stall_ep((ep0_transfer.setup_pkt.wIndex & 0x80) ? EP_IN : EP_OUT, - ep0_transfer.setup_pkt.wIndex & 0xF); - if (callbacks.state_change) { - callbacks.state_change(HAL_USB_EVENT_STALL, - ep0_transfer.setup_pkt.wIndex & 0xFF); - } - success = true; - } - break; - default: - break; - } - - ep0_transfer.stage = STATUS_IN_STAGE; - - return success; -} - -static bool requestClearFeature(void) { - bool success = false; - - USB_FUNC_ENTRY_TRACE(19); - - if (device_state != CONFIGURED) { - /* Endpoint or interface must be zero */ - if (ep0_transfer.setup_pkt.wIndex != 0) { - return false; - } - } - - switch (ep0_transfer.setup_pkt.bmRequestType.recipient) { - case DEVICE_RECIPIENT: -#ifdef USB_SUSPEND - if (ep0_transfer.setup_pkt.wValue == DEVICE_REMOTE_WAKEUP) { - if (callbacks.set_remote_wakeup) { - callbacks.set_remote_wakeup(0); - device_pwr_wkup_status &= ~DEVICE_STATUS_REMOTE_WAKEUP; - success = true; - } - } -#endif - break; - case ENDPOINT_RECIPIENT: - /* TODO: We should check that the endpoint number is valid */ - if (ep0_transfer.setup_pkt.wValue == ENDPOINT_HALT) { - hal_usb_unstall_ep((ep0_transfer.setup_pkt.wIndex & 0x80) ? EP_IN - : EP_OUT, - ep0_transfer.setup_pkt.wIndex & 0xF); - if (callbacks.state_change) { - callbacks.state_change(HAL_USB_EVENT_UNSTALL, - ep0_transfer.setup_pkt.wIndex & 0xFF); - } - success = true; - } - break; - default: - break; - } - - ep0_transfer.stage = STATUS_IN_STAGE; - - return success; -} - -static bool requestGetStatus(void) { - static uint16_t status; - bool success = false; - - USB_FUNC_ENTRY_TRACE(18); - - if (device_state != CONFIGURED) { - /* Endpoint or interface must be zero */ - if (ep0_transfer.setup_pkt.wIndex != 0) { - return false; - } - } - - switch (ep0_transfer.setup_pkt.bmRequestType.recipient) { - case DEVICE_RECIPIENT: - status = device_pwr_wkup_status; - success = true; - break; - case INTERFACE_RECIPIENT: - status = 0; - success = true; - break; - case ENDPOINT_RECIPIENT: - /* TODO: We should check that the endpoint number is valid */ - if (hal_usb_get_ep_stall_state( - (ep0_transfer.setup_pkt.wIndex & 0x80) ? EP_IN : EP_OUT, - ep0_transfer.setup_pkt.wIndex & 0xF)) { - status = ENDPOINT_STATUS_HALT; - } else { - status = 0; - } - success = true; - break; - default: - break; - } - - if (success) { - /* Send the status */ - ep0_transfer.data = (uint8_t *)&status; /* Assumes little endian */ - ep0_transfer.length = sizeof(status); - ep0_transfer.stage = DATA_IN_STAGE; - } - - return success; -} - -static bool requestGetDescriptor(void) { - bool success = false; - uint8_t type; - uint8_t index; - uint8_t *desc; - - type = DESCRIPTOR_TYPE(ep0_transfer.setup_pkt.wValue); - index = DESCRIPTOR_INDEX(ep0_transfer.setup_pkt.wValue); - - USB_TRACE(3, 3, "%s: %d %d", __FUNCTION__, type, index); - - switch (type) { - case DEVICE_DESCRIPTOR: - desc = (uint8_t *)callbacks.device_desc(type); - if (desc != NULL) { - if ((desc[0] == DEVICE_DESCRIPTOR_LENGTH) && - (desc[1] == DEVICE_DESCRIPTOR)) { - ep0_transfer.length = desc[0]; - ep0_transfer.data = desc; - success = true; - } - } - break; - case CONFIGURATION_DESCRIPTOR: - desc = (uint8_t *)callbacks.cfg_desc(index); - if (desc != NULL) { - if ((desc[0] == CONFIGURATION_DESCRIPTOR_LENGTH) && - (desc[1] == CONFIGURATION_DESCRIPTOR)) { - /* Get wTotalLength */ - ep0_transfer.length = desc[2] | (desc[3] << 8); - ep0_transfer.data = desc; - // Get self-powered status - if ((desc[7] >> 6) & 0x01) { - device_pwr_wkup_status |= DEVICE_STATUS_SELF_POWERED; - } else { - device_pwr_wkup_status &= ~DEVICE_STATUS_SELF_POWERED; - } - success = true; - } - } - break; - case STRING_DESCRIPTOR: - ep0_transfer.data = (uint8_t *)callbacks.string_desc(index); - if (ep0_transfer.data) { - ep0_transfer.length = ep0_transfer.data[0]; - success = true; - } - break; - case INTERFACE_DESCRIPTOR: - case ENDPOINT_DESCRIPTOR: - /* TODO: Support is optional, not implemented here */ - break; - case QUALIFIER_DESCRIPTOR: -#ifdef USB_HIGH_SPEED - desc = (uint8_t *)callbacks.device_desc(type); - if (desc != NULL) { - if (desc[0] == QUALIFIER_DESCRIPTOR_LENGTH && desc[1] == type) { - ep0_transfer.length = desc[0]; - ep0_transfer.data = desc; - success = true; - } - } -#endif - break; - case BOS_DESCRIPTOR: -#ifdef USB_HIGH_SPEED - desc = (uint8_t *)callbacks.device_desc(type); - if (desc != NULL) { - if (desc[0] == BOS_DESCRIPTOR_LENGTH && desc[1] == type) { - // Total length - ep0_transfer.length = desc[2]; - ep0_transfer.data = desc; - success = true; - } - } -#endif - break; - default: - // Might be a class or vendor specific descriptor, which - // should be handled in setuprecv callback - USB_TRACE(1, 0, "*** Error: Unknown desc type: %d", type); - break; - } - - if (success) { - ep0_transfer.stage = DATA_IN_STAGE; - } - - return success; -} - -static void hal_usb_reset_all_transfers(void) { - int ep; - - USB_FUNC_ENTRY_TRACE(31); - - for (ep = 1; ep < EPNUM; ep++) { - reset_epn_out_transfer(ep); - reset_epn_in_transfer(ep); - } -} - -static bool hal_usb_handle_setup(void) { - bool success = false; - enum DEVICE_STATE old_state; - - USB_FUNC_ENTRY_TRACE(17); - - old_state = device_state; - - /* Process standard requests */ - if (ep0_transfer.setup_pkt.bmRequestType.type == STANDARD_TYPE) { - switch (ep0_transfer.setup_pkt.bRequest) { - case GET_STATUS: - success = requestGetStatus(); - break; - case CLEAR_FEATURE: - success = requestClearFeature(); - break; - case SET_FEATURE: - success = requestSetFeature(); - break; - case SET_ADDRESS: - success = requestSetAddress(); - break; - case GET_DESCRIPTOR: - success = requestGetDescriptor(); - break; - case SET_DESCRIPTOR: - /* TODO: Support is optional, not implemented here */ - success = false; - break; - case GET_CONFIGURATION: - success = requestGetConfiguration(); - break; - case SET_CONFIGURATION: - success = requestSetConfiguration(); - break; - case GET_INTERFACE: - success = requestGetInterface(); - break; - case SET_INTERFACE: - success = requestSetInterface(); - break; - default: - break; - } - } - - if (old_state == CONFIGURED && device_state != CONFIGURED) { - hal_usb_reset_all_transfers(); - } - - return success; -} - -static int hal_usb_ep0_setup_stage(uint32_t statusEp) { - uint8_t *data; - uint8_t setup_cnt; - uint16_t pkt_len; - - // Skip the check on IN/OUT tokens - usbc->DOEPMSK &= ~USBC_OUTTKNEPDISMSK; - usbc->DIEPMSK &= ~USBC_INTKNTXFEMPMSK; - - if (statusEp & USBC_BACK2BACKSETUP) { - data = (uint8_t *)(usbc->DOEPDMA0 - 8); - } else { - setup_cnt = GET_BITFIELD(usbc->DOEPTSIZ0, USBC_SUPCNT); - if (setup_cnt >= 3) { - setup_cnt = 2; - } - data = (uint8_t *)((uint32_t)ep0_out_buffer + 8 * (2 - setup_cnt)); - } - // Init new transfer - hal_usb_init_ep0_transfer(); - ep0_transfer.stage = SETUP_STAGE; - get_setup_packet(data, &ep0_transfer.setup_pkt); - - USB_TRACE(5, 2, "Got SETUP type=%d, req=0x%x, val=0x%x, idx=0x%x, len=%d", - ep0_transfer.setup_pkt.bmRequestType.type, - ep0_transfer.setup_pkt.bRequest, ep0_transfer.setup_pkt.wValue, - ep0_transfer.setup_pkt.wIndex, ep0_transfer.setup_pkt.wLength); - - if (ep0_transfer.setup_pkt.wLength == 0 && - ep0_transfer.setup_pkt.bmRequestType.direction != EP_OUT) { - USB_TRACE(0, 0, "*** Error: Ep0 dir should be out if wLength=0"); - return 1; - } - - if (callbacks.setuprecv == NULL || !callbacks.setuprecv(&ep0_transfer)) { - if (!hal_usb_handle_setup()) { - return 1; - } - } - -#if 0 - if (ep0_transfer.setup_pkt.wLength == 0) { - ep0_transfer.setup_pkt.bmRequestType.direction = EP_OUT; - } -#endif - - if (ep0_transfer.stage == DATA_OUT_STAGE) { - if (ep0_transfer.data == NULL) { - ep0_transfer.data = (uint8_t *)ep0_out_buffer; - } - } else if (ep0_transfer.stage == DATA_IN_STAGE) { - if (ep0_transfer.length > ep0_transfer.setup_pkt.wLength) { - ep0_transfer.length = ep0_transfer.setup_pkt.wLength; - } - pkt_len = ep0_transfer.length; - if (pkt_len > USB_MAX_PACKET_SIZE_CTRL) { - pkt_len = USB_MAX_PACKET_SIZE_CTRL; - } - hal_usb_send_ep0(ep0_transfer.data, pkt_len); - } else if (ep0_transfer.stage == STATUS_IN_STAGE) { - hal_usb_send_ep0(NULL, 0); - } else { - USB_TRACE(1, 0, "*** Setup stage switches to invalid stage: %d", - ep0_transfer.stage); - return 1; - } - - return 0; -} - -static int hal_usb_ep0_data_out_stage(void) { - uint16_t pkt_len; - uint16_t reg_size; - - reg_size = GET_BITFIELD(usbc->DOEPTSIZ0, USBC_OEPXFERSIZE0); - - ASSERT(reg_size <= USB_MAX_PACKET_SIZE_CTRL, "Invalid ep0 recv size"); - - pkt_len = MIN(USB_MAX_PACKET_SIZE_CTRL - reg_size, - (uint16_t)(ep0_transfer.length - ep0_transfer.trx_len)); - - ASSERT(ep0_transfer.length >= ep0_transfer.trx_len + pkt_len, - "Invalid ep0 recv len: length=%u trx_len=%u pkt_len=%u", - ep0_transfer.length, ep0_transfer.trx_len, pkt_len); - - memcpy(ep0_transfer.data + ep0_transfer.trx_len, ep0_out_buffer, pkt_len); - ep0_transfer.trx_len += pkt_len; - - // Always enable setup packet receiving - // CAUTION: Start ep0 recv before invoking datarecv callbacks to handle all - // kinds of endpoints. - // Some USBC events are triggered by patterns in receive FIFO, only - // when these patterns are popped by the core (DMA reading) or the - // application (usbc->GRXSTSP reading). E.g., Global OUT NAK - // (DCTL.SGOUTNak) triggers GINTSTS.GOUTNakEff, but the interrupt - // will never raise in data out stage without DMA or usbc->GRXSTSP - // reading. - hal_usb_recv_ep0(); - - pkt_len = ep0_transfer.length - ep0_transfer.trx_len; - if (pkt_len == 0) { - if (callbacks.datarecv == NULL || !callbacks.datarecv(&ep0_transfer)) { - // hal_usb_stall_ep(EP_OUT, 0); - // hal_usb_stall_ep(EP_IN, 0); - // return; - } - ep0_transfer.stage = STATUS_IN_STAGE; - // Check error on IN/OUT tokens - usbc->DOEPMSK |= USBC_OUTTKNEPDISMSK; - // Send status packet - hal_usb_send_ep0(NULL, 0); - } else { - // Receive next data packet - } - - return 0; -} - -static int hal_usb_ep0_data_in_stage(void) { - uint16_t pkt_len; - bool zero_len_pkt = false; - - ASSERT(GET_BITFIELD(usbc->DIEPTSIZ0, USBC_IEPPKTCNT0) == 0, - "Invalid ep0 sent pkt cnt"); - ASSERT(ep0_transfer.length >= ep0_transfer.trx_len, - "Invalid ep0 sent len 1: length=%u trx_len=%u", ep0_transfer.length, - ep0_transfer.trx_len); - - pkt_len = ep0_transfer.length - ep0_transfer.trx_len; - if (pkt_len == 0) { - // The last zero length packet was sent successfully - ep0_transfer.stage = STATUS_OUT_STAGE; - // Receive status packet (receiving is always enabled) - } else { - // Update sent count - if (pkt_len == USB_MAX_PACKET_SIZE_CTRL) { - zero_len_pkt = true; - } else if (pkt_len > USB_MAX_PACKET_SIZE_CTRL) { - pkt_len = USB_MAX_PACKET_SIZE_CTRL; - } - ep0_transfer.trx_len += pkt_len; - - ASSERT(ep0_transfer.length >= ep0_transfer.trx_len, - "Invalid ep0 sent len 2: length=%u trx_len=%u", ep0_transfer.length, - ep0_transfer.trx_len); - - // Send next packet - pkt_len = ep0_transfer.length - ep0_transfer.trx_len; - if (pkt_len > USB_MAX_PACKET_SIZE_CTRL) { - pkt_len = USB_MAX_PACKET_SIZE_CTRL; - } - if (pkt_len == 0) { - if (zero_len_pkt) { - // Send the last zero length packet - hal_usb_send_ep0(NULL, 0); - } else { - ep0_transfer.stage = STATUS_OUT_STAGE; - // Check error on IN/OUT tokens - usbc->DIEPMSK |= USBC_INTKNTXFEMPMSK; - // Receive status packet (receiving is always enabled) - } - } else { - hal_usb_send_ep0(ep0_transfer.data + ep0_transfer.trx_len, pkt_len); - } - } - - return 0; -} - -static int hal_usb_ep0_status_stage(void) { - // Done with status packet - ep0_transfer.stage = NONE_STAGE; - // Skip the check on IN/OUT tokens - usbc->DOEPMSK &= ~USBC_OUTTKNEPDISMSK; - usbc->DIEPMSK &= ~USBC_INTKNTXFEMPMSK; - - return 0; -} - -static void hal_usb_ep0_test_mode_check(void) { - if (device_test_mode) { - usbc->DCTL = SET_BITFIELD(usbc->DCTL, USBC_TSTCTL, device_test_mode); - device_test_mode = 0; - } -} - -static void hal_usb_handle_ep0_packet(enum EP_DIR dir, uint32_t statusEp) { - int ret; - - USB_TRACE(3, 16, "%s: dir=%d, statusEp=0x%08x", __FUNCTION__, dir, statusEp); - - if (dir == EP_OUT) { - if ((statusEp & (USBC_XFERCOMPL | USBC_STSPHSERCVD)) == - (USBC_XFERCOMPL | USBC_STSPHSERCVD)) { - // From Linux driver - if (GET_BITFIELD(usbc->DOEPTSIZ0, USBC_OEPXFERSIZE0) == - USB_MAX_PACKET_SIZE_CTRL && - (usbc->DOEPTSIZ0 & USBC_OEPPKTCNT0)) { - // Abnormal case - USB_TRACE( - 2, 0, - "*** EP0 OUT empty compl with stsphsercvd: stage=%d, size=0x%08x", - ep0_transfer.stage, usbc->DOEPTSIZ0); - // Always enable setup packet receiving - hal_usb_recv_ep0(); - return; - } - } - - if (statusEp & USBC_XFERCOMPL) { - // New packet received - if (statusEp & USBC_SETUP) { - // Clean previous transfer - if (ep0_transfer.stage != NONE_STAGE) { - USB_TRACE(1, 0, "*** Setup stage breaks previous stage %d", - ep0_transfer.stage); - hal_usb_stop_ep(EP_IN, 0); - } - // New setup packet - ep0_transfer.stage = SETUP_STAGE; - } else if (statusEp & USBC_STUPPKTRCVD) { - // Clean previous transfer - if (ep0_transfer.stage != NONE_STAGE) { - USB_TRACE(1, 0, "*** Wait setup stage breaks previous stage %d", - ep0_transfer.stage); - hal_usb_stop_ep(EP_IN, 0); - } - // New setup packet received, and wait for USBC h/w state machine - // finished CAUTION: Enabling data receipt before getting USBC_SETUP - // interrupt might cause - // race condition in h/w, which leads to missing USBC_XFERCOMPL - // interrupt after the data has been received and acked - ep0_transfer.stage = WAIT_SETUP_STAGE; - return; - } - } else { - // No packet received - if (statusEp & USBC_SETUP) { - if (ep0_transfer.stage == WAIT_SETUP_STAGE) { - // Previous packet is setup packet - ep0_transfer.stage = SETUP_STAGE; - } else { - USB_TRACE(1, 0, "*** Setup interrupt occurs in stage %d", - ep0_transfer.stage); - // The setup packet has been processed - return; - } - } - } - } - - if (ep0_transfer.stage == SETUP_STAGE) { - ASSERT(dir == EP_OUT, "Invalid dir for setup stage"); - - ret = hal_usb_ep0_setup_stage(statusEp); - if (ret) { - // Error - ep0_transfer.stage = NONE_STAGE; - hal_usb_stall_ep(EP_OUT, 0); - hal_usb_stall_ep(EP_IN, 0); - // H/w will unstall EP0 automatically when a setup token is received - // hal_usb_recv_ep0(); - } - // Always enable setup packet receiving - hal_usb_recv_ep0(); - - return; - } - - if (statusEp & USBC_XFERCOMPL) { - if (dir == EP_OUT) { - if (ep0_transfer.stage == DATA_OUT_STAGE) { - hal_usb_ep0_data_out_stage(); - } else if (ep0_transfer.stage == STATUS_OUT_STAGE) { - hal_usb_ep0_status_stage(); - // Always enable setup packet receiving - hal_usb_recv_ep0(); - } else { - // Abnormal case - USB_TRACE(2, 0, "*** EP0 OUT compl in stage %d with size 0x%08x", - ep0_transfer.stage, usbc->DOEPTSIZ0); - // Always enable setup packet receiving - hal_usb_recv_ep0(); - } - } else { - if (ep0_transfer.stage == DATA_IN_STAGE) { - hal_usb_ep0_data_in_stage(); - } else if (ep0_transfer.stage == STATUS_IN_STAGE) { - hal_usb_ep0_status_stage(); - hal_usb_ep0_test_mode_check(); - } else { - // Abnormal case - USB_TRACE(2, 0, "*** EP0 IN compl in stage %d with size 0x%08x", - ep0_transfer.stage, usbc->DIEPTSIZ0); - } - } - } -} - -static void hal_usb_irq_reset(void) { - USB_FUNC_ENTRY_TRACE(2); - - device_state = DEFAULT; - device_pwr_wkup_status = 0; - device_sleep_status = USB_SLEEP_NONE; - - usbc->PCGCCTL &= ~USBC_STOPPCLK; - usbc->DCTL &= ~USBC_RMTWKUPSIG; - - hal_usb_reset_all_transfers(); - hal_usb_stop_all_out_eps(); - hal_usb_stop_all_in_eps(); - - // Unmask ep0 interrupts - usbc->DAINTMSK = USBC_INEPMSK(1 << 0) | USBC_OUTEPMSK(1 << 0); - usbc->DOEPMSK = USBC_XFERCOMPLMSK | USBC_SETUPMSK; - usbc->DIEPMSK = USBC_XFERCOMPLMSK | USBC_TIMEOUTMSK; - usbc->GINTMSK |= USBC_OEPINT | USBC_IEPINT -#if defined(USB_ISO) && (USB_ISO_INTERVAL == 1) - | USBC_INCOMPISOOUT | USBC_INCOMPISOIN -#endif - ; -#ifdef USB_SUSPEND - usbc->GINTMSK &= ~USBC_WKUPINT; -#endif -#ifdef USB_LPM - usbc->GINTMSK |= USBC_LPM_INT; - usbc->PCGCCTL |= USBC_ENBL_L1GATING; - usbc->GLPMCFG = - SET_BITFIELD(usbc->GLPMCFG, USBC_HIRD_THRES, USB_L1_LIGHT_SLEEP_BESL) | - USBC_HIRD_THRES_BIT4 | USBC_LPMCAP | USBC_APPL1RES | - USBC_ENBESL; // | USBC_ENBLSLPM; -#ifdef CHIP_HAS_USBIF - usbif->USBIF_04 = SET_BITFIELD(usbif->USBIF_04, USBIF_04_CFG_SLEEP_THSD, - USB_L1_LIGHT_SLEEP_BESL); -#endif -#endif - - // Config ep0 size - hal_usb_alloc_ep0_fifo(); - // Reset device address - usbc->DCFG &= ~USBC_DEVADDR_MASK; - - hal_usb_init_ep0_transfer(); - hal_usb_init_epn_transfer(); - - if (callbacks.state_change) { - callbacks.state_change(HAL_USB_EVENT_RESET, 0); - } -} - -static void hal_usb_irq_enum_done(void) { - uint8_t speed; - uint8_t mps = 0; - - USB_FUNC_ENTRY_TRACE(2); - - speed = GET_BITFIELD(usbc->DSTS, USBC_ENUMSPD); - if (speed == 0) { - // High speed -- ERROR! - mps = 0; // 64 bytes - } else if (speed == 1 || speed == 3) { - // Full speed - mps = 0; // 64 bytes - } else { - // Low speed -- ERROR! - mps = 3; // 8 bytes - } - // Only support 64-byte MPS ! - mps = 0; - // Config max packet size - usbc->DIEPCTL0 = - USBC_EP0_MPS(mps) | USBC_USBACTEP | USBC_EPTXFNUM(0) | USBC_SNAK; - usbc->DOEPCTL0 = USBC_EP0_MPS(mps) | USBC_USBACTEP | USBC_SNAK; - - hal_usb_recv_ep0(); -} - -#if defined(USB_ISO) && (USB_ISO_INTERVAL == 1) -static void hal_usb_irq_incomp_iso_out(void) { - int i; - uint32_t ctrl; - uint32_t sof_fn; - uint32_t statusEp; - - sof_fn = GET_BITFIELD(usbc->DSTS, USBC_SOFFN); - - for (i = 0; i < EPNUM - 1; i++) { - ctrl = usbc->DOEPnCONFIG[i].DOEPCTL; - if ((ctrl & USBC_EPENA) && - ((ctrl >> USBC_EPDPID_SHIFT) & 1) == (sof_fn & 1) && - GET_BITFIELD(ctrl, USBC_EPTYPE) == E_ISOCHRONOUS) { - statusEp = usbc->DOEPnCONFIG[i].DOEPINT; - hal_usb_disable_ep(EP_OUT, i + 1); - break; - } - } - - if (i < EPNUM - 1) { - USB_TRACE(4, 17, "%s ep%d: INT=0x%08x, SOF=0x%04x", __FUNCTION__, i + 1, - statusEp, sof_fn); - } else { - USB_TRACE(1, 17, "%s: No valid ISO ep", __FUNCTION__); - } -} - -static void hal_usb_irq_incomp_iso_in(void) { - int i; - uint32_t ctrl; - uint32_t sof_fn; - uint32_t statusEp; - - sof_fn = GET_BITFIELD(usbc->DSTS, USBC_SOFFN); - - for (i = 0; i < EPNUM - 1; i++) { - ctrl = usbc->DIEPnCONFIG[i].DIEPCTL; - if ((ctrl & USBC_EPENA) && - ((ctrl >> USBC_EPDPID_SHIFT) & 1) == (sof_fn & 1) && - GET_BITFIELD(ctrl, USBC_EPTYPE) == E_ISOCHRONOUS) { - statusEp = usbc->DIEPnCONFIG[i].DIEPINT; - hal_usb_disable_ep(EP_IN, i + 1); - break; - } - } - - if (i < EPNUM - 1) { - USB_TRACE(4, 17, "%s ep%d: INT=0x%08x, SOF=0x%04x", __FUNCTION__, i + 1, - statusEp, sof_fn); - } else { - USB_TRACE(1, 17, "%s: No valid ISO ep", __FUNCTION__); - } -} -#endif - -#ifdef USB_SUSPEND -static void hal_usb_restore_clock(void) { - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, USB_SYS_FREQ); - -#ifdef PMU_USB_PIN_CHECK -#ifdef CHIP_HAS_USBPHY - // Enable dig phy clock - usbphy_wakeup(); -#endif - - hal_cmu_clock_enable(HAL_CMU_MOD_H_USBC); - hal_cmu_clock_enable(HAL_CMU_MOD_O_USB); -#endif - - usbc->PCGCCTL &= ~USBC_STOPPCLK; - -#ifdef PMU_USB_PIN_CHECK - NVIC_ClearPendingIRQ(USB_IRQn); - NVIC_EnableIRQ(USB_IRQn); -#endif -} - -static void hal_usb_stop_clock(void) { -#ifdef PMU_USB_PIN_CHECK - // Disable USB IRQ to avoid errors when RESET/RESUME is detected before - // stopping USB clock - NVIC_DisableIRQ(USB_IRQn); -#endif - - usbc->PCGCCTL |= USBC_STOPPCLK; - -#ifdef PMU_USB_PIN_CHECK - hal_cmu_clock_disable(HAL_CMU_MOD_O_USB); - hal_cmu_clock_disable(HAL_CMU_MOD_H_USBC); - -#ifdef CHIP_HAS_USBPHY - // Disable dig phy clock - usbphy_sleep(); -#endif -#endif - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, HAL_CMU_FREQ_32K); -} - -#ifdef PMU_USB_PIN_CHECK -static void hal_usb_pin_status_resume(enum PMU_USB_PIN_CHK_STATUS_T status); - -static void hal_usb_pin_check_enable_check(void *param) { - pmu_usb_enable_pin_status_check(); -} - -static void hal_usb_pin_check_cancel_resume(void *param) { - USB_TRACE(3, 18, "[%X] %s: DSTS=0x%08x", hal_sys_timer_get(), __FUNCTION__, - usbc->DSTS); - - if (usbc->DSTS & USBC_SUSPSTS) { - hal_usb_stop_clock(); - pmu_usb_enable_pin_status_check(); - } -} - -static void hal_usb_pin_status_resume(enum PMU_USB_PIN_CHK_STATUS_T status) { - USB_TRACE(2, 18, "%s: %d", __FUNCTION__, status); - - // Start timer to check resume status, so as to avoid fake pin resume signal - if (usbdev_timer_active) { - hwtimer_stop(usbdev_timer); - } - hwtimer_update_then_start(usbdev_timer, hal_usb_pin_check_cancel_resume, NULL, - PIN_CHECK_WAIT_RESUME_INTERVAL); - usbdev_timer_active = 1; - - hal_usb_restore_clock(); -} -#endif - -#if defined(PMU_USB_PIN_CHECK) || defined(USB_LPM) -static void hal_usb_stop_usbdev_timer(void) { - if (usbdev_timer_active) { - hwtimer_stop(usbdev_timer); - usbdev_timer_active = 0; - } -} -#endif - -static void hal_usb_sleep(enum USB_SLEEP_T cause) { - USB_FUNC_ENTRY_TRACE(18); - - device_sleep_status = cause; - - if (callbacks.state_change) { - callbacks.state_change((cause == USB_SLEEP_SUSPEND) - ? HAL_USB_EVENT_SUSPEND - : HAL_USB_EVENT_L1_DEEP_SLEEP, - 0); - } - - usbc->GINTMSK |= USBC_WKUPINT; -#ifdef USB_LPM - usbc->GINTMSK &= ~USBC_LPM_INT; -#endif - - hal_usb_stop_clock(); - -#ifdef PMU_USB_PIN_CHECK - pmu_usb_config_pin_status_check(PMU_USB_PIN_CHK_HOST_RESUME, - hal_usb_pin_status_resume, false); - // Stat timer to check current pin status - if (usbdev_timer_active) { - hwtimer_stop(usbdev_timer); - } - hwtimer_update_then_start(usbdev_timer, hal_usb_pin_check_enable_check, NULL, - PIN_CHECK_ENABLE_INTERVAL); - usbdev_timer_active = 1; -#endif -} - -static void hal_usb_wakeup(void) { - USB_FUNC_ENTRY_TRACE(18); - - device_sleep_status = USB_SLEEP_NONE; - -#ifndef PMU_USB_PIN_CHECK - hal_usb_restore_clock(); -#endif - - usbc->GINTMSK &= ~USBC_WKUPINT; -#ifdef USB_LPM - usbc->GINTMSK |= USBC_LPM_INT; -#endif - - if (callbacks.state_change) { - callbacks.state_change(HAL_USB_EVENT_RESUME, 0); - } -} - -static void hal_usb_send_resume_signal(int enable) { - if (enable) { -#ifdef PMU_USB_PIN_CHECK - // Stop pin check timer - hal_usb_stop_usbdev_timer(); - // Disabe PMU pin status check - pmu_usb_disable_pin_status_check(); -#endif - - // Restore USB clock and IRQ - hal_usb_restore_clock(); - - usbc->GINTMSK &= ~USBC_WKUPINT; - - usbc->DCTL |= USBC_RMTWKUPSIG; - } else { - usbc->DCTL &= ~USBC_RMTWKUPSIG; - } -} -#endif - -int hal_usb_remote_wakeup(int signal) { -#ifdef USB_SUSPEND - USB_TRACE(2, 15, "%s: %d", __FUNCTION__, signal); - - if (signal) { - if (device_sleep_status != USB_SLEEP_SUSPEND) { - return 1; - } - if ((device_pwr_wkup_status & DEVICE_STATUS_REMOTE_WAKEUP) == 0) { - return 2; - } - - hal_usb_send_resume_signal(1); - } else { - hal_usb_send_resume_signal(0); - - // USBC will NOT generate resume IRQ in case of remote wakeup, so fake one - // here - hal_usb_wakeup(); - } -#endif - - return 0; -} - -void hal_usb_lpm_sleep_enable(void) { -#ifdef USB_LPM - if (usbc->GLPMCFG & USBC_ENBESL) { - // usbc->GLPMCFG &= ~USBC_RSTRSLPSTS; - } - usbc->GLPMCFG |= (USBC_APPL1RES | USBC_HIRD_THRES_BIT4); - - usbc->PCGCCTL |= USBC_ENBL_L1GATING; -#endif -} - -void hal_usb_lpm_sleep_disable(void) { -#ifdef USB_LPM - uint32_t cnt; - uint32_t lock; - uint32_t lpm; - bool POSSIBLY_UNUSED rmtWake = false; - - usbc->PCGCCTL &= ~USBC_ENBL_L1GATING; - - usbc->GLPMCFG &= ~(USBC_APPL1RES | USBC_HIRD_THRES_BIT4 | USBC_ENBLSLPM); - if (usbc->GLPMCFG & USBC_ENBESL) { - usbc->GLPMCFG |= USBC_RSTRSLPSTS; - } - - lpm_entry = false; - - // Resume if in L1 state - if (usbc->GLPMCFG & USBC_SLPSTS) { - cnt = 0; - while ( - (usbc->GLPMCFG & (USBC_BREMOTEWAKE | USBC_SLPSTS | USBC_L1RESUMEOK)) == - (USBC_BREMOTEWAKE | USBC_SLPSTS)) { - hal_sys_timer_delay(US_TO_TICKS(0)); - if (++cnt > 3) { - break; - } - } - - lock = int_lock(); - - lpm = usbc->GLPMCFG; - - if (lpm & USBC_SLPSTS) { - if ((lpm & (USBC_BREMOTEWAKE | USBC_L1RESUMEOK)) == - (USBC_BREMOTEWAKE | USBC_L1RESUMEOK)) { - hal_usb_send_resume_signal(1); - rmtWake = true; -#if 0 - // Detect race condition between remote wake and L1 state change - if ((usbc->GLPMCFG & USBC_SLPSTS) == 0) { - usbc->DCTL &= ~USBC_RMTWKUPSIG; - } -#endif -#ifdef USB_SUSPEND - if (device_sleep_status == USB_SLEEP_L1) { - // USBC will NOT generate resume IRQ in case of remote wakeup, so fake - // one here - hal_usb_wakeup(); - } -#endif - } else if ((lpm & (USBC_BREMOTEWAKE | USBC_L1RESUMEOK)) == - USBC_BREMOTEWAKE) { - TRACE(1, - "\n*** ERROR: LPM Disable: Failed to wait L1 resume OK: 0x%08X\n", - lpm); - } - } - - int_unlock(lock); - - if (rmtWake) { - USB_TRACE(1, 0, "LPM RmtWake: 0x%08X", lpm); - } - } -#endif -} - -#ifdef USB_LPM -#ifdef USB_SUSPEND -static void hal_usb_lpm_check(void *param) { - uint32_t lpm; - uint32_t lock; - - // TODO: Disable USB irq only (might conflict with hal_usb_stop_clock) - lock = int_lock(); - - lpm = usbc->GLPMCFG; - - if (lpm_entry && GET_BITFIELD(lpm, USBC_HIRD) >= USB_L1_DEEP_SLEEP_BESL) { - if ((lpm & USBC_SLPSTS) && - (lpm & (USBC_BREMOTEWAKE | USBC_L1RESUMEOK)) != USBC_BREMOTEWAKE) { - lpm_entry = false; - hal_usb_sleep(USB_SLEEP_L1); - } else { - hwtimer_update_then_start(usbdev_timer, hal_usb_lpm_check, NULL, - LPM_CHECK_INTERVAL); - usbdev_timer_active = 1; - } - } - - int_unlock(lock); -} -#endif - -static void hal_usb_irq_lpm(void) { - static const uint32_t lpm_trace_interval = MS_TO_TICKS(2000); - static uint32_t last_lpm_irq_time; - static uint32_t cnt = 0; - uint32_t time; - uint32_t lpm; - - cnt++; - lpm = usbc->GLPMCFG; - -#ifdef USB_SUSPEND - if (GET_BITFIELD(lpm, USBC_HIRD) >= USB_L1_DEEP_SLEEP_BESL) { - // Stat timer to check L1 sleep state - if (usbdev_timer_active) { - hwtimer_stop(usbdev_timer); - } - hwtimer_update_then_start(usbdev_timer, hal_usb_lpm_check, NULL, - LPM_CHECK_INTERVAL); - usbdev_timer_active = 1; - lpm_entry = true; - } -#endif - - time = hal_sys_timer_get(); - if (time - last_lpm_irq_time >= lpm_trace_interval || - GET_BITFIELD(lpm, USBC_HIRD) >= USB_L1_DEEP_SLEEP_BESL) { - last_lpm_irq_time = time; - USB_TRACE(6, 0, - "LPM IRQ: 0x%08X rmtWake=%d hird=0x%x l1Res=%d slpSts=%d cnt=%u", - lpm, !!(lpm & USBC_BREMOTEWAKE), GET_BITFIELD(lpm, USBC_HIRD), - GET_BITFIELD(lpm, USBC_COREL1RES), !!(lpm & USBC_SLPSTS), cnt); - } -} -#endif - -static void hal_usb_irq_handler(void) { - uint32_t status, rawStatus; - uint32_t statusEp, rawStatusEp; - uint32_t data; - uint8_t i; - - // Store interrupt flag and reset it - rawStatus = usbc->GINTSTS; - usbc->GINTSTS = rawStatus; - - status = rawStatus & - (usbc->GINTMSK & (USBC_USBRST | USBC_ENUMDONE -#if defined(USB_ISO) && (USB_ISO_INTERVAL == 1) - | USBC_INCOMPISOOUT | USBC_INCOMPISOIN -#endif - | USBC_IEPINT | USBC_OEPINT | USBC_ERLYSUSP | - USBC_USBSUSP | USBC_WKUPINT | USBC_LPM_INT)); - - USB_TRACE(3, 1, "%s: 0x%08x / 0x%08x", __FUNCTION__, status, rawStatus); - -#if defined(USB_SUSPEND) && (defined(PMU_USB_PIN_CHECK) || defined(USB_LPM)) - bool stop_timer = true; - -#ifdef USB_LPM - if (lpm_entry && status == USBC_ERLYSUSP && - (usbc->DSTS & USBC_ERRTICERR) == 0) { - // LPM TL1TokenRetry (8 us) timer has expired. L1 state transition will be - // finished after TL1Residency (50 us) timer from now. - stop_timer = false; - } else { - lpm_entry = false; - } -#endif - - if (stop_timer) { - hal_usb_stop_usbdev_timer(); - } -#endif - - if (status & USBC_USBRST) { - // Usb reset - hal_usb_irq_reset(); - - // We got a reset, and reseted the soft state machine: Discard all other - // interrupt causes. - status &= USBC_ENUMDONE; - } - - if (status & USBC_ENUMDONE) { - // Enumeration done - hal_usb_irq_enum_done(); - } - -#if defined(USB_ISO) && (USB_ISO_INTERVAL == 1) - if (status & USBC_INCOMPISOOUT) { - // Incomplete ISO OUT - hal_usb_irq_incomp_iso_out(); - } - - if (status & USBC_INCOMPISOIN) { - // Incomplete ISO IN - hal_usb_irq_incomp_iso_in(); - } -#endif - - if (status & USBC_IEPINT) { - // Tx - data = usbc->DAINT & usbc->DAINTMSK; - for (i = 0; i < EPNUM; ++i) { - if (data & USBC_INEPMSK(1 << i)) { - if (i == 0) { - // EP0 - rawStatusEp = usbc->DIEPINT0; - usbc->DIEPINT0 = rawStatusEp; - statusEp = rawStatusEp & usbc->DIEPMSK; - - if ((statusEp & USBC_TIMEOUT) || (statusEp & USBC_INTKNTXFEMP)) { - usbc->DIEPMSK &= ~USBC_INTKNTXFEMPMSK; - hal_usb_stall_ep(EP_IN, i); - } else if (statusEp & USBC_XFERCOMPL) { - // Handle ep0 command - hal_usb_handle_ep0_packet(EP_IN, rawStatusEp); - } - } else { - rawStatusEp = usbc->DIEPnCONFIG[i - 1].DIEPINT; - usbc->DIEPnCONFIG[i - 1].DIEPINT = rawStatusEp; - statusEp = rawStatusEp & usbc->DIEPMSK; - - if ((statusEp & USBC_TIMEOUT) || (statusEp & USBC_XFERCOMPL)) { - hal_usb_send_epn_complete(i, rawStatusEp); - } - } - } - } - } - - if (status & USBC_OEPINT) { - // Rx - data = usbc->DAINT & usbc->DAINTMSK; - for (i = 0; i < EPNUM; ++i) { - if (data & USBC_OUTEPMSK(1 << i)) { - if (i == 0) { - rawStatusEp = usbc->DOEPINT0; - usbc->DOEPINT0 = rawStatusEp; - statusEp = rawStatusEp & usbc->DOEPMSK; - - if (statusEp & USBC_OUTTKNEPDIS) { - usbc->DOEPMSK &= ~USBC_OUTTKNEPDISMSK; - hal_usb_stall_ep(EP_OUT, i); - if (statusEp & USBC_XFERCOMPL) { - // Always enable setup packet receiving - hal_usb_recv_ep0(); - } - } else if (statusEp & (USBC_XFERCOMPL | USBC_SETUP)) { - // Handle ep0 command - hal_usb_handle_ep0_packet(EP_OUT, rawStatusEp); - } - } else { - rawStatusEp = usbc->DOEPnCONFIG[i - 1].DOEPINT; - usbc->DOEPnCONFIG[i - 1].DOEPINT = rawStatusEp; - statusEp = rawStatusEp & usbc->DOEPMSK; - - if (statusEp & USBC_XFERCOMPL) { - hal_usb_recv_epn_complete(i, rawStatusEp); - } - } - } - } - } - -#ifdef USB_SUSPEND - if (status & USBC_ERLYSUSP) { - if (usbc->DSTS & USBC_ERRTICERR) { - hal_usb_soft_disconnect(); - return; - } - } - - if (status & USBC_USBSUSP) { - hal_usb_sleep(USB_SLEEP_SUSPEND); - } - - if (status & USBC_WKUPINT) { - hal_usb_wakeup(); - } -#endif - -#ifdef USB_LPM - if (status & USBC_LPM_INT) { - hal_usb_irq_lpm(); - } -#endif -} - -#endif // CHIP_HAS_USB diff --git a/platform/hal/hal_usb.h b/platform/hal/hal_usb.h deleted file mode 100644 index 4533273..0000000 --- a/platform/hal/hal_usb.h +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __HAL_USB_H__ -#define __HAL_USB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stdint.h" -#include "stdbool.h" - -#define USB_MAX_PACKET_SIZE_CTRL 64 -#ifdef USB_HIGH_SPEED -#define USB_MAX_PACKET_SIZE_BULK 512 -#define USB_MAX_PACKET_SIZE_INT 1024 -#define USB_MAX_PACKET_SIZE_ISO 1024 -#define USB_FIFO_MPS_ISO_SEND 800 -#else -#define USB_MAX_PACKET_SIZE_BULK 64 -#define USB_MAX_PACKET_SIZE_INT 64 -#define USB_MAX_PACKET_SIZE_ISO 1023 -#define USB_FIFO_MPS_ISO_SEND 768 -#endif - -// H/w register bit field width limitation -#define EPN_MAX_PKTCNT ((1 << 10) - 1) -#define EPN_MAX_XFERSIZE ((1 << 19) - 1) - -#define EPNUM 6 -#define CTRL_EPNUM 2 - -#define USB_L1_LIGHT_SLEEP_BESL USB_BESL_125US -#define USB_L1_DEEP_SLEEP_BESL USB_BESL_6000US - -enum HAL_USB_API_MODE { - HAL_USB_API_NONBLOCKING, - HAL_USB_API_BLOCKING, -}; - -enum EP_DIR { - EP_OUT, - EP_IN, -}; - -enum CTRL_STAGE { - NONE_STAGE, - WAIT_SETUP_STAGE, - SETUP_STAGE, - DATA_OUT_STAGE, - DATA_IN_STAGE, - STATUS_OUT_STAGE, - STATUS_IN_STAGE, -}; - -enum ZLP_STATE { - ZLP_AUTO, - ZLP_DISABLED, -}; - -enum XFER_COMPL_STATE { - XFER_COMPL_SUCCESS, - XFER_COMPL_ERROR, -}; - -enum HAL_USB_STATE_EVENT { - HAL_USB_EVENT_RESET, // RESET event should be processed as quickly as possible - HAL_USB_EVENT_DISCONNECT, - HAL_USB_EVENT_SUSPEND, - HAL_USB_EVENT_L1_DEEP_SLEEP, - HAL_USB_EVENT_RESUME, - HAL_USB_EVENT_STALL, - HAL_USB_EVENT_UNSTALL, - - HAL_USB_EVENT_QTY -}; - -enum USB_BESL_T { - USB_BESL_125US = 0, - USB_BESL_150US, - USB_BESL_200US, - USB_BESL_300US, - USB_BESL_400US, - USB_BESL_500US, - USB_BESL_1000US, - USB_BESL_2000US, - USB_BESL_3000US, - USB_BESL_4000US, - USB_BESL_5000US, - USB_BESL_6000US, - USB_BESL_7000US, - USB_BESL_8000US, - USB_BESL_9000US, - USB_BESL_10000US, -}; - -enum USB_BESL_HIRD_T { - USB_BESL_HIRD_75US, - USB_BESL_HIRD_100US, - USB_BESL_HIRD_150US, - USB_BESL_HIRD_250US, - USB_BESL_HIRD_350US, - USB_BESL_HIRD_450US, - USB_BESL_HIRD_950US, - USB_BESL_HIRD_1950US, - USB_BESL_HIRD_2950US, - USB_BESL_HIRD_3950US, - USB_BESL_HIRD_4950US, - USB_BESL_HIRD_5950US, - USB_BESL_HIRD_6950US, - USB_BESL_HIRD_7950US, - USB_BESL_HIRD_8950US, - USB_BESL_HIRD_9950US, -}; - -enum USB_HIRD_T { - USB_HIRD_50US, - USB_HIRD_125US, - USB_HIRD_200US, - USB_HIRD_275US, - USB_HIRD_350US, - USB_HIRD_425US, - USB_HIRD_500US, - USB_HIRD_575US, - USB_HIRD_650US, - USB_HIRD_725US, - USB_HIRD_800US, - USB_HIRD_875US, - USB_HIRD_950US, - USB_HIRD_1025US, - USB_HIRD_1100US, - USB_HIRD_1175US, -}; - -struct SETUP_PACKET { - struct { - uint8_t recipient : 5; - uint8_t type : 2; - uint8_t direction : 1; - } bmRequestType; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}; - -struct EP0_TRANSFER { - enum CTRL_STAGE stage; - uint8_t *data; - uint16_t length; - uint16_t trx_len; - struct SETUP_PACKET setup_pkt; -}; - -typedef const uint8_t *(*HAL_USB_GET_DESCRIPTOR_CALLBACK)(uint8_t); -typedef bool (*HAL_USB_SETUPRECV_CALLBACK)(struct EP0_TRANSFER *); -typedef bool (*HAL_USB_DATARECV_CALLBACK)(struct EP0_TRANSFER *); -typedef bool (*HAL_USB_SETCFG_CALLBACK)(uint8_t); -typedef bool (*HAL_USB_SETITF_CALLBACK)(uint16_t, uint16_t); -typedef void (*HAL_USB_REMOTE_WAKEUP_CALLBACK)(int enable); -typedef void (*HAL_USB_STATE_CHANGE_CALLBACK)(enum HAL_USB_STATE_EVENT, uint32_t); -typedef bool (*HAL_USB_RECV_COMPL_CALLBACK)(const uint8_t *, uint32_t, enum XFER_COMPL_STATE); -typedef bool (*HAL_USB_SEND_COMPL_CALLBACK)(const uint8_t *, uint32_t, enum XFER_COMPL_STATE); - -struct HAL_USB_CALLBACKS { - HAL_USB_GET_DESCRIPTOR_CALLBACK device_desc; - HAL_USB_GET_DESCRIPTOR_CALLBACK cfg_desc; - HAL_USB_GET_DESCRIPTOR_CALLBACK string_desc; - - HAL_USB_SETUPRECV_CALLBACK setuprecv; - HAL_USB_DATARECV_CALLBACK datarecv; - HAL_USB_SETCFG_CALLBACK setcfg; - HAL_USB_SETITF_CALLBACK setitf; - HAL_USB_REMOTE_WAKEUP_CALLBACK set_remote_wakeup; - HAL_USB_STATE_CHANGE_CALLBACK state_change; - - HAL_USB_RECV_COMPL_CALLBACK epn_recv_compl[EPNUM - 1]; - HAL_USB_SEND_COMPL_CALLBACK epn_send_compl[EPNUM - 1]; -}; - -int hal_usb_open(const struct HAL_USB_CALLBACKS *c, enum HAL_USB_API_MODE m); -int hal_usb_reopen(const struct HAL_USB_CALLBACKS *c, uint8_t dcfg, uint8_t alt, uint16_t itf); -void hal_usb_close(void); - -int hal_usb_remote_wakeup(int signal); -void hal_usb_detect_disconn(void); - -void hal_usb_lpm_sleep_enable(void); -void hal_usb_lpm_sleep_disable(void); - -int hal_usb_configured(void); -int hal_usb_suspended(void); - -uint32_t hal_usb_calc_hshb_ep_mps(uint32_t pkt_size); - -int hal_usb_activate_epn(enum EP_DIR dir, uint8_t ep, uint8_t type, uint16_t mps); -int hal_usb_deactivate_epn(enum EP_DIR dir, uint8_t ep); -int hal_usb_update_recv_epn_mps(uint8_t ep, uint16_t mps); -int hal_usb_update_send_epn_mc(uint8_t ep, uint8_t mc); - -void hal_usb_disable_ep(enum EP_DIR dir, uint8_t ep); - -void hal_usb_stall_ep(enum EP_DIR dir, uint8_t ep); -void hal_usb_unstall_ep(enum EP_DIR dir, uint8_t ep); -int hal_usb_get_ep_stall_state(enum EP_DIR dir, uint8_t ep); - -void hal_usb_stop_ep(enum EP_DIR dir, uint8_t ep); - -int hal_usb_recv_epn(uint8_t ep, uint8_t *buffer, uint32_t size); -int hal_usb_send_epn(uint8_t ep, const uint8_t *buffer, uint32_t size, enum ZLP_STATE zlp); - -uint32_t hal_usb_get_soffn(void); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/platform/hal/hal_usbhost.c b/platform/hal/hal_usbhost.c deleted file mode 100644 index 3e36894..0000000 --- a/platform/hal/hal_usbhost.c +++ /dev/null @@ -1,1119 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifdef CHIP_HAS_USB - -#include "hal_usbhost.h" -#include "cmsis_nvic.h" -#include "hal_cmu.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "plat_addr_map.h" -#include "pmu.h" -#include "reg_usb.h" -#include "string.h" - -#define MAX_CHAN_NUM 10 -#define MAX_EP_NUM 16 - -#define MAX_XFER_SIZE \ - (USBC_HCTSIZN_XFERSIZE_MASK >> USBC_HCTSIZN_XFERSIZE_SHIFT) -#define MAX_XFER_PKT (USBC_HCTSIZN_PKTCNT_MASK >> USBC_HCTSIZN_PKTCNT_SHIFT) - -#define HAL_USBC_PHY_FREQ_MHZ 48 -#define HAL_USBC_PHY_FREQ_MHZ_HS 60 -#define HAL_USBC_HPRT_WC_MASK \ - (USBC_HPRT_PRTSUSP | USBC_HPRT_PRTOVRCURRCHNG | USBC_HPRT_PRTENCHNG | \ - USBC_HPRT_PRTENA | USBC_HPRT_PRTCONNDET) - -#define HAL_USBHOST_TIMEOUT_TICKS MS_TO_TICKS(200) - -#define USBHOST_TRACE(n, mask, str, ...) \ - { \ - if (usbhost_trmask & (1 << mask)) { \ - TRACE(n, str, ##__VA_ARGS__); \ - } \ - } -#define USBHOST_FUNC_ENTRY_TRACE(mask) \ - { \ - if (usbhost_trmask & (1 << mask)) { \ - FUNC_ENTRY_TRACE(); \ - } \ - } - -enum HAL_USBHOST_CHAN_STATE_T { - HAL_USBHOST_CHAN_IDLE, - HAL_USBHOST_CHAN_ALLOC, - HAL_USBHOST_CHAN_INIT, - HAL_USBHOST_CHAN_XFER, - - HAL_USBHOST_CHAN_QTY -}; - -struct HAL_USBHOST_CHAN_DESC_T { - enum HAL_USBHOST_CHAN_STATE_T state; - uint32_t start_xfer_size; - uint16_t start_pkt_cnt; - uint8_t err_cnt; - struct HAL_USBHOST_CHAN_TYPE_T type; - struct HAL_USBHOST_XFER_T xfer; -}; - -static const uint32_t usbhost_trmask = (1 << 0); //~0UL; //(1 << 3) | (1 << 4); - -static struct USBC_T *const usbc = (struct USBC_T *)USB_BASE; - -static HAL_USBHOST_PORT_HANDLER port_handler; -static HAL_USBHOST_DELAY_FUNC delay_func; - -static struct HAL_USBHOST_CHAN_DESC_T chan_desc[MAX_CHAN_NUM]; - -static struct HAL_USBHOST_SETUP_XFER_T setup_xfer; - -static volatile bool in_setup = false; - -static bool usbhost_opened = false; - -static enum HAL_USBHOST_SETUP_STAGE_T cur_setup_stage; - -static HWTIMER_ID usbhost_timer[MAX_CHAN_NUM]; - -#ifdef PMU_USB_PIN_CHECK -static HAL_USBHOST_PLUG_HANDLER plug_handler; -#endif - -static uint32_t hal_usbhost_get_xfer_size(uint8_t chan, int complete); -static void hal_usbhost_irq_handler(void); -static void hal_usbhost_timeout(void *param); - -void hal_usbhost_halt_chan(uint8_t chan) { - uint32_t mask; - - USBHOST_TRACE(2, 17, "%s: %d", __FUNCTION__, chan); - - if (chan >= MAX_CHAN_NUM) { - return; - } - - hwtimer_stop(usbhost_timer[chan]); - - mask = usbc->HCSR[chan].HCINTMSKn; - usbc->HCSR[chan].HCINTMSKn = 0; - if ((usbc->HCSR[chan].HCCHARn & USBC_HCCHARN_CHENA) == 0) { - goto _exit; - } - usbc->HCSR[chan].HCINTn = USBC_HCINTN_CHHLTD; - usbc->HCSR[chan].HCCHARn |= USBC_HCCHARN_CHENA | USBC_HCCHARN_CHDIS; - while ((usbc->HCSR[chan].HCINTn & USBC_HCINTN_CHHLTD) == 0) - ; - -_exit: - usbc->HCSR[chan].HCINTn = ~0UL; - usbc->HCSR[chan].HCINTMSKn = mask; -} - -static void hal_usbhost_soft_reset(void) { - usbc->GRSTCTL |= USBC_CSFTRST; - while ((usbc->GRSTCTL & USBC_CSFTRST) != 0) - ; - while ((usbc->GRSTCTL & USBC_AHBIDLE) == 0) - ; -} - -static void hal_usbhost_init_phy(void) { - usbc->GUSBCFG |= USBC_FORCEHSTMODE | USBC_ULPIAUTORES | USBC_ULPIFSLS | - USBC_PHYSEL | USBC_ULPI_UTMI_SEL; - usbc->GUSBCFG &= ~(USBC_FSINTF | USBC_PHYIF | USBC_USBTRDTIM_MASK); - // USBC_USBTRDTIM(9) if AHB bus is 26M - usbc->GUSBCFG |= USBC_USBTRDTIM(5); -} - -int hal_usbhost_open(HAL_USBHOST_PORT_HANDLER port_cb, - HAL_USBHOST_DELAY_FUNC delay_fn) { - int i; - - USBHOST_FUNC_ENTRY_TRACE(16); - - for (i = 0; i < MAX_CHAN_NUM; i++) { - chan_desc[i].state = HAL_USBHOST_CHAN_IDLE; - } - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, HAL_CMU_FREQ_52M); - - hal_cmu_usb_set_host_mode(); - hal_cmu_usb_clock_enable(); - - hal_usbhost_soft_reset(); - hal_usbhost_init_phy(); - // Reset after selecting PHY - hal_usbhost_soft_reset(); - // Some core cfg (except for PHY selection) will also be reset during soft - // reset - hal_usbhost_init_phy(); - -#ifdef USB_HIGH_SPEED - usbc->HCFG = USBC_HCFG_FSLSPCLKSEL(0); -#else - usbc->HCFG = USBC_HCFG_FSLSSUPP | USBC_HCFG_FSLSPCLKSEL(1); -#endif - - usbc->HPRT = USBC_HPRT_PRTPWR; - - // Clear previous interrupts - usbc->GINTMSK = 0; - usbc->GINTSTS = ~0UL; - usbc->HAINTMSK = 0; - for (i = 0; i < MAX_CHAN_NUM; i++) { - usbc->HCSR[i].HCINTMSKn = 0; - usbc->HCSR[i].HCINTn = ~0UL; - } - usbc->GINTMSK = USBC_PRTINT | USBC_HCHINT | USBC_DISCONNINT; - - // Enable DMA mode - // Burst size 16 words - usbc->GAHBCFG = USBC_DMAEN | USBC_HBSTLEN(7); - usbc->GAHBCFG |= USBC_GLBLINTRMSK; - - port_handler = port_cb; - delay_func = delay_fn; - - usbhost_opened = true; - - NVIC_SetVector(USB_IRQn, (uint32_t)hal_usbhost_irq_handler); - NVIC_SetPriority(USB_IRQn, IRQ_PRIORITY_NORMAL); - NVIC_ClearPendingIRQ(USB_IRQn); - NVIC_EnableIRQ(USB_IRQn); - - // usbc->TPORTDBG1 = 0x11; - - return 0; -} - -void hal_usbhost_close(void) { - uint8_t chan; - - USBHOST_FUNC_ENTRY_TRACE(15); - -#ifdef PMU_USB_PIN_CHECK - pmu_usb_disable_pin_status_check(); -#endif - - NVIC_DisableIRQ(USB_IRQn); - - usbhost_opened = false; - - hal_cmu_usb_clock_disable(); - - for (chan = 0; chan < MAX_CHAN_NUM; chan++) { - hal_usbhost_free_chan(chan); - } - - hal_sysfreq_req(HAL_SYSFREQ_USER_USB, HAL_CMU_FREQ_32K); -} - -static void hal_usbhost_delay(uint32_t ms) { - if (delay_func) { - delay_func(ms); - } else { - hal_sys_timer_delay(MS_TO_TICKS(ms)); - } -} - -void hal_usbhost_port_reset(uint32_t ms) { - int lock; - - USBHOST_TRACE(2, 14, "%s: %d", __FUNCTION__, ms); - - lock = int_lock(); - usbc->HPRT = (usbc->HPRT & ~HAL_USBC_HPRT_WC_MASK) | USBC_HPRT_PRTRST; - int_unlock(lock); - - hal_usbhost_delay(ms); - - lock = int_lock(); - usbc->HPRT = (usbc->HPRT & ~HAL_USBC_HPRT_WC_MASK) & ~USBC_HPRT_PRTRST; - int_unlock(lock); -} - -static void hal_usbhost_port_suspend(void) { - int lock; - - USBHOST_FUNC_ENTRY_TRACE(22); - - lock = int_lock(); - usbc->HPRT = (usbc->HPRT & ~HAL_USBC_HPRT_WC_MASK) | USBC_HPRT_PRTSUSP; - int_unlock(lock); - - hal_usbhost_delay(3); -} - -static void hal_usbhost_port_resume(void) { - int lock; - - USBHOST_FUNC_ENTRY_TRACE(22); - - lock = int_lock(); - usbc->HPRT = (usbc->HPRT & ~HAL_USBC_HPRT_WC_MASK) | USBC_HPRT_PRTRES; - int_unlock(lock); - - hal_usbhost_delay(20); - - lock = int_lock(); - usbc->HPRT = (usbc->HPRT & ~HAL_USBC_HPRT_WC_MASK) & ~USBC_HPRT_PRTRES; - int_unlock(lock); -} - -int hal_usbhost_get_chan(uint8_t *chan) { - int i; - uint32_t lock; - - lock = int_lock(); - for (i = 0; i < MAX_CHAN_NUM; i++) { - if (chan_desc[i].state == HAL_USBHOST_CHAN_IDLE) { - chan_desc[i].state = HAL_USBHOST_CHAN_ALLOC; - break; - } - } - int_unlock(lock); - - USBHOST_TRACE(2, 13, "%s: %d", __FUNCTION__, i); - - if (i == MAX_CHAN_NUM) { - return 1; - } - - *chan = i; - - ASSERT(usbhost_timer[i] == NULL, "%s: Prev hwtimer not released: 0x%08x", - __FUNCTION__, (uint32_t)usbhost_timer[i]); - usbhost_timer[i] = hwtimer_alloc(hal_usbhost_timeout, (void *)(uint32_t)i); - if (usbhost_timer[i] == NULL) { - USBHOST_TRACE(2, 0, "%s: WARNING: Failed to alloc hwtimer for chan=%d", - __FUNCTION__, i); - // Continue even if usbhost_timer is null - } - - return 0; -} - -int hal_usbhost_free_chan(uint8_t chan) { - USBHOST_TRACE(2, 12, "%s: %d", __FUNCTION__, chan); - - if (chan >= MAX_CHAN_NUM) { - return 1; - } - - hwtimer_stop(usbhost_timer[chan]); - hwtimer_free(usbhost_timer[chan]); - usbhost_timer[chan] = NULL; - - chan_desc[chan].state = HAL_USBHOST_CHAN_IDLE; - - return 0; -} - -int hal_usbhost_init_chan(uint8_t chan, - const struct HAL_USBHOST_CHAN_TYPE_T *type) { - USBHOST_TRACE(7, 11, "%s: chan=%d mps=%d ep=%d in=%d type=%d addr=%d", - __FUNCTION__, chan, type->mps, type->ep_num, type->ep_in, - type->ep_type, type->dev_addr); - - if (chan >= MAX_CHAN_NUM) { - return 1; - } - if (chan_desc[chan].state != HAL_USBHOST_CHAN_ALLOC) { - return 2; - } - if (usbc->HCSR[chan].HCCHARn & USBC_HCCHARN_CHENA) { - return 3; - } - if ((type->dev_addr & (USBC_HCCHARN_DEVADDR_MASK >> - USBC_HCCHARN_DEVADDR_SHIFT)) != type->dev_addr) { - return 4; - } - if (type->ep_num >= MAX_EP_NUM) { - return 5; - } - if (type->ep_type >= HAL_USBHOST_EP_QTY) { - return 6; - } - if ((type->mps & (USBC_HCCHARN_MPS_MASK >> USBC_HCCHARN_MPS_SHIFT)) != - type->mps) { - return 7; - } - if (type->mps == 0) { - return 8; - } - - memcpy(&chan_desc[chan].type, type, sizeof(chan_desc[chan].type)); - chan_desc[chan].err_cnt = 0; - - usbc->HCSR[chan].HCINTMSKn = 0; - usbc->HCSR[chan].HCINTn = ~0UL; - - usbc->HCSR[chan].HCCHARn = - USBC_HCCHARN_MPS(type->mps) | USBC_HCCHARN_EPNUM(type->ep_num) | - (type->ep_in ? USBC_HCCHARN_EPDIR : 0) | - USBC_HCCHARN_EPTYPE(type->ep_type) | USBC_HCCHARN_DEVADDR(type->dev_addr); - - usbc->HCSR[chan].HCINTMSKn = USBC_HCINTN_AHBERR | USBC_HCINTN_CHHLTD; - usbc->HAINTMSK |= (1 << chan); - usbc->GINTMSK |= USBC_HCHINT; - - chan_desc[chan].state = HAL_USBHOST_CHAN_INIT; - - return 0; -} - -int hal_usbhost_update_chan_dev_addr(uint8_t chan, uint8_t dev_addr) { - USBHOST_TRACE(3, 10, "%s: chan=%d dev_addr=%d", __FUNCTION__, chan, dev_addr); - - if (chan >= MAX_CHAN_NUM) { - return 1; - } - if (chan_desc[chan].state != HAL_USBHOST_CHAN_INIT) { - return 2; - } - - chan_desc[chan].type.dev_addr = dev_addr; - - usbc->HCSR[chan].HCCHARn = - SET_BITFIELD(usbc->HCSR[chan].HCCHARn, USBC_HCCHARN_DEVADDR, dev_addr); - - chan_desc[chan].state = HAL_USBHOST_CHAN_INIT; - - return 0; -} - -int hal_usbhost_update_chan_mps(uint8_t chan, uint16_t mps) { - USBHOST_TRACE(3, 9, "%s: chan=%d mps=%d", __FUNCTION__, chan, mps); - - if (chan >= MAX_CHAN_NUM) { - return 1; - } - if (chan_desc[chan].state != HAL_USBHOST_CHAN_INIT) { - return 2; - } - - chan_desc[chan].type.mps = mps; - - usbc->HCSR[chan].HCCHARn = - SET_BITFIELD(usbc->HCSR[chan].HCCHARn, USBC_HCCHARN_MPS, mps); - - chan_desc[chan].state = HAL_USBHOST_CHAN_INIT; - - return 0; -} - -int hal_usbhost_start_xfer(uint8_t chan, - const struct HAL_USBHOST_XFER_T *xfer) { - uint32_t max_periodic_len; - uint32_t pkt_cnt; - uint32_t size; - enum HAL_USBHOST_PID_TYPE_T pid; - uint8_t multi_cnt; - - USBHOST_TRACE(5, 7, "%s: chan=%d size=%u mc=%d pid=%d", __FUNCTION__, chan, - xfer->size, xfer->multi_cnt, xfer->pid); - - if (chan >= MAX_CHAN_NUM) { - return 1; - } - if (chan_desc[chan].state != HAL_USBHOST_CHAN_INIT) { - return 2; - } - if (usbc->HCSR[chan].HCCHARn & USBC_HCCHARN_CHENA) { - return 3; - } - if (((uint32_t)xfer->buf & 0x3) != 0) { - return 4; - } - if (chan_desc[chan].type.ep_type == HAL_USBHOST_EP_ISO || - chan_desc[chan].type.ep_type == HAL_USBHOST_EP_INT) { - max_periodic_len = xfer->multi_cnt * chan_desc[chan].type.mps; - if (max_periodic_len < xfer->size) { - return 5; - } - } else { - if (xfer->size > MAX_XFER_SIZE) { - return 6; - } - } - - pkt_cnt = - (xfer->size + (chan_desc[chan].type.mps - 1)) / chan_desc[chan].type.mps; - if (pkt_cnt > MAX_XFER_PKT) { - return 7; - } - if (pkt_cnt == 0) { - pkt_cnt = 1; - } - - if (chan_desc[chan].type.ep_in) { - size = pkt_cnt * chan_desc[chan].type.mps; - } else { - size = xfer->size; - } - - chan_desc[chan].start_xfer_size = size; - chan_desc[chan].start_pkt_cnt = pkt_cnt; - memcpy(&chan_desc[chan].xfer, xfer, sizeof(chan_desc[chan].xfer)); - - pid = xfer->pid; - if (pid == HAL_USBHOST_PID_AUTO) { - pid = GET_BITFIELD(usbc->HCSR[chan].HCTSIZn, USBC_HCTSIZN_PID); - } - multi_cnt = xfer->multi_cnt; - - if (chan_desc[chan].type.ep_type == HAL_USBHOST_EP_ISO || - chan_desc[chan].type.ep_type == HAL_USBHOST_EP_INT) { - multi_cnt = pkt_cnt; - - if (chan_desc[chan].type.ep_type == HAL_USBHOST_EP_ISO) { - pid = HAL_USBHOST_PID_DATA0; // Full speed - } - - if (usbc->HFNUM & 0x1) { - usbc->HCSR[chan].HCCHARn &= ~USBC_HCCHARN_ODDFRM; - } else { - usbc->HCSR[chan].HCCHARn |= USBC_HCCHARN_ODDFRM; - } - } - - chan_desc[chan].state = HAL_USBHOST_CHAN_XFER; - - usbc->HCSR[chan].HCTSIZn = USBC_HCTSIZN_PID(pid) | - USBC_HCTSIZN_PKTCNT(pkt_cnt) | - USBC_HCTSIZN_XFERSIZE(size); - usbc->HCSR[chan].HCDMAn = (uint32_t)xfer->buf; - - usbc->HCSR[chan].HCINTn = ~0UL; - - usbc->HCSR[chan].HCCHARn = - SET_BITFIELD(usbc->HCSR[chan].HCCHARn, USBC_HCCHARN_EC, multi_cnt); - usbc->HCSR[chan].HCCHARn &= ~USBC_HCCHARN_CHDIS; - usbc->HCSR[chan].HCCHARn |= USBC_HCCHARN_CHENA; - - if (xfer->handler) { - hwtimer_start(usbhost_timer[chan], HAL_USBHOST_TIMEOUT_TICKS); - } - - return 0; -} - -static void hal_usbhost_setup_xfer_handler(uint8_t chan, uint8_t *buf, - uint32_t len, - enum HAL_USBHOST_XFER_ERR_T error) { - int ret; - struct HAL_USBHOST_XFER_T xfer; - enum HAL_USBHOST_SETUP_STAGE_T handler_stage; - uint8_t handler_chan; - - ret = 1; - if (error != HAL_USBHOST_XFER_ERR_NONE) { - goto _exit; - } - - USBHOST_TRACE(5, 6, "%s: chan=%d cur=%d next=%d error=%d", __FUNCTION__, chan, - cur_setup_stage, setup_xfer.next_stage, error); - - handler_stage = setup_xfer.next_stage; - handler_chan = HAL_USBHOST_CHAN_NONE; - - switch (handler_stage) { - case HAL_USBHOST_SETUP_DATA_IN: - case HAL_USBHOST_SETUP_DATA_OUT: - xfer.buf = setup_xfer.data_buf; - xfer.size = setup_xfer.setup_pkt.wLength; - xfer.pid = HAL_USBHOST_PID_DATA1; - xfer.multi_cnt = 0; - xfer.handler = hal_usbhost_setup_xfer_handler; - if (handler_stage == HAL_USBHOST_SETUP_DATA_IN) { - handler_chan = setup_xfer.chan_in; - setup_xfer.next_stage = HAL_USBHOST_SETUP_STATUS_OUT; - } else { - handler_chan = setup_xfer.chan_out; - setup_xfer.next_stage = HAL_USBHOST_SETUP_STATUS_IN; - } - ret = hal_usbhost_start_xfer(handler_chan, &xfer); - if (ret) { - goto _exit; - } - break; - case HAL_USBHOST_SETUP_STATUS_IN: - case HAL_USBHOST_SETUP_STATUS_OUT: - if (cur_setup_stage == HAL_USBHOST_SETUP_DATA_IN) { - if (setup_xfer.setup_pkt.wLength != len) { - USBHOST_TRACE(2, 0, "Invalid setup data length: %d expect=%d", len, - setup_xfer.setup_pkt.wLength); - // Update received len - setup_xfer.setup_pkt.wLength = len; - } - } - xfer.buf = NULL; - xfer.size = 0; - xfer.pid = HAL_USBHOST_PID_DATA1; - xfer.multi_cnt = 0; - xfer.handler = hal_usbhost_setup_xfer_handler; - if (handler_stage == HAL_USBHOST_SETUP_STATUS_IN) { - handler_chan = setup_xfer.chan_in; - } else { - handler_chan = setup_xfer.chan_out; - } - setup_xfer.next_stage = HAL_USBHOST_SETUP_DONE; - ret = hal_usbhost_start_xfer(handler_chan, &xfer); - if (ret) { - goto _exit; - } - break; - case HAL_USBHOST_SETUP_DONE: - ret = 0; - goto _exit; - break; - default: - ASSERT(false, "Invalid setup next stage %d for chan %d", - setup_xfer.next_stage, chan); - ret = 1; - goto _exit; - } - - cur_setup_stage = handler_stage; - - return; - -_exit: - if (error != HAL_USBHOST_XFER_ERR_NONE) { - setup_xfer.next_stage = HAL_USBHOST_SETUP_ERROR; - } - - { - struct HAL_USBHOST_SETUP_XFER_T setup; - - memcpy(&setup, &setup_xfer, sizeof(setup)); - in_setup = false; - if (setup.handler) { - setup.handler(&setup, ret); - } - } - - return; -} - -int hal_usbhost_start_setup_xfer(const struct HAL_USBHOST_SETUP_XFER_T *setup, - uint32_t *recv_len) { - int ret; - struct HAL_USBHOST_XFER_T xfer; - - USBHOST_TRACE(7, 6, - "%s: out=%d in=%d type=0x%02x req=0x%02x wlen=%d next_stage=%d", - __FUNCTION__, setup->chan_out, setup->chan_in, - setup->setup_pkt.bmRequestType, setup->setup_pkt.bRequest, - setup->setup_pkt.wLength, setup->next_stage); - - if (setup->next_stage >= HAL_USBHOST_SETUP_STATUS_OUT) { - return -1; - } - - if (in_setup) { - return -2; - } - in_setup = true; - - memcpy(&setup_xfer, setup, sizeof(setup_xfer)); - cur_setup_stage = HAL_USBHOST_SETUP_STAGE_QTY; - - xfer.buf = (uint8_t *)&setup_xfer.setup_pkt; - xfer.size = sizeof(setup_xfer.setup_pkt); - xfer.pid = HAL_USBHOST_PID_SETUP; - xfer.multi_cnt = 0; - xfer.handler = hal_usbhost_setup_xfer_handler; - - ret = hal_usbhost_start_xfer(setup_xfer.chan_out, &xfer); - if (ret) { - in_setup = false; - return ret; - } - - if (setup->handler == NULL) { - while (in_setup) - ; - if (setup_xfer.next_stage != HAL_USBHOST_SETUP_DONE) { - return -3; - } - if (recv_len) { - if (setup->next_stage == HAL_USBHOST_SETUP_DATA_IN) { - *recv_len = setup_xfer.setup_pkt.wLength; - } else { - *recv_len = 0; - } - } - } - - return 0; -} - -static void hal_usbhost_stop_all_chans(void) { - int i; - uint32_t xfer; - HAL_USBHOST_XFER_COMPL_HANDLER handler; - uint8_t *buf; - - usbc->HAINTMSK = 0; - - for (i = 0; i < MAX_CHAN_NUM; i++) { - hal_usbhost_halt_chan(i); - - if (chan_desc[i].state != HAL_USBHOST_CHAN_XFER) { - continue; - } - - if (chan_desc[i].xfer.handler) { - // TODO: Check whether HCTSIZn is reset after channel is halted - xfer = hal_usbhost_get_xfer_size(i, 0); - - // Reset the chan_desc to INIT state so that it can be reused in callback - handler = chan_desc[i].xfer.handler; - buf = chan_desc[i].xfer.buf; - chan_desc[i].state = HAL_USBHOST_CHAN_INIT; - - handler(i, buf, xfer, HAL_USBHOST_XFER_ERR_DISCONN); - } - } - - usbc->HAINT = ~0UL; -} - -static void hal_usbhost_disconn_handler(void) { - USBHOST_FUNC_ENTRY_TRACE(5); - - usbc->GINTMSK &= ~USBC_HCHINT; - - hal_usbhost_stop_all_chans(); - - if (port_handler) { - port_handler(HAL_USBHOST_PORT_DISCONN); - } -} - -static void hal_usbhost_alloc_fifo(void) { - // FIFO configuration should be started after port enabled, or 60 ms after - // soft reset - - hal_usbhost_stop_all_chans(); - - // RX FIFO Calculation - // ------------------- - // DATA Packets + Status Info : (MPS / 4 + 1) * m - // OutEp XFER COMPL : 1 * m - // NAK/NYET Handling : 1 * outEpNum - -#define RXFIFOSIZE (2 * (MAX_USBHOST_PACKET_SIZE / 4 + 1 + 1) + USBHOST_EPNUM) -#define TXFIFOSIZE (2 * (MAX_USBHOST_PACKET_SIZE / 4)) - - // Rx Fifo Size (and init fifo_addr) - usbc->GRXFSIZ = USBC_RXFDEP(RXFIFOSIZE); - - // EP0 / Non-periodic Tx Fifo Size - usbc->GNPTXFSIZ = USBC_NPTXFSTADDR(RXFIFOSIZE) | USBC_NPTXFDEPS(TXFIFOSIZE); - - // Flush all FIFOs - usbc->GRSTCTL = USBC_TXFNUM(0x10) | USBC_TXFFLSH | USBC_RXFFLSH; - while ((usbc->GRSTCTL & (USBC_TXFFLSH | USBC_RXFFLSH)) != 0) - ; -} - -static void hal_usbhost_port_handler(void) { - uint32_t prt; - uint32_t speed; - enum HAL_USBHOST_PORT_EVENT_T event; - - prt = usbc->HPRT; - // USBC_HPRT_PRTENA also controls the port status - usbc->HPRT = prt & ~(USBC_HPRT_PRTENA | USBC_HPRT_PRTSUSP); - - USBHOST_TRACE(2, 4, "%s: 0x%08x", __FUNCTION__, prt); - - if (prt & USBC_HPRT_PRTCONNDET) { - if (port_handler) { - port_handler(HAL_USBHOST_PORT_CONN); - } - } - - if (prt & USBC_HPRT_PRTENCHNG) { - if (prt & USBC_HPRT_PRTENA) { - speed = GET_BITFIELD(usbc->HPRT, USBC_HPRT_PRTSPD); - if (speed == 1 || -#ifdef USB_HIGH_SPEED - speed == 0 || -#endif - 0) { -#ifdef USB_HIGH_SPEED - if (speed == 0) { - // High speed - usbc->HFIR = SET_BITFIELD(usbc->HFIR, USBC_HFIR_FRINT, - 125 * HAL_USBC_PHY_FREQ_MHZ_HS); - event = HAL_USBHOST_PORT_EN_HS; - } else -#else - { - // Full speed - usbc->HFIR = SET_BITFIELD(usbc->HFIR, USBC_HFIR_FRINT, - 1000 * HAL_USBC_PHY_FREQ_MHZ); - event = HAL_USBHOST_PORT_EN_FS; - } -#endif - // Config FIFOs - hal_usbhost_alloc_fifo(); - // Notify upper layer - if (port_handler) { - port_handler(event); - } - } else { - // High (0) or low (2) speed not supported - if (port_handler) { - port_handler(HAL_USBHOST_PORT_EN_BAD); - } - } - } - } -} - -static void hal_usbhost_retry_chan(uint8_t chan, uint32_t size) { - uint32_t pkt_cnt; - - USBHOST_TRACE(3, 20, "%s: chan=%d size=%u", __FUNCTION__, chan, size); - -#if 0 - if (chan_desc[chan].state != HAL_USBHOST_CHAN_XFER) { - return; - } -#endif - - hal_usbhost_halt_chan(chan); - - pkt_cnt = (size + chan_desc[chan].type.mps - 1) / chan_desc[chan].type.mps; - if (pkt_cnt == 0) { - pkt_cnt = 1; - } - - usbc->HCSR[chan].HCTSIZn = - (usbc->HCSR[chan].HCTSIZn & - ~(USBC_HCTSIZN_PKTCNT_MASK | USBC_HCTSIZN_XFERSIZE_MASK)) | - USBC_HCTSIZN_PKTCNT(pkt_cnt) | USBC_HCTSIZN_XFERSIZE(size); - usbc->HCSR[chan].HCDMAn = (uint32_t)chan_desc[chan].xfer.buf + - (chan_desc[chan].start_xfer_size - size); - - usbc->HCSR[chan].HCINTn = ~0UL; - - // usbc->HCSR[chan].HCCHARn = SET_BITFIELD(usbc->HCSR[chan].HCCHARn, - // USBC_HCCHARN_EC, multi_cnt); - usbc->HCSR[chan].HCCHARn &= ~USBC_HCCHARN_CHDIS; - usbc->HCSR[chan].HCCHARn |= USBC_HCCHARN_CHENA; -} - -static uint32_t hal_usbhost_get_xfer_size(uint8_t chan, int complete) { - uint32_t xfer; - - if (complete) { - if (chan_desc[chan].type.ep_in) { - xfer = GET_BITFIELD(usbc->HCSR[chan].HCTSIZn, USBC_HCTSIZN_XFERSIZE); - if (chan_desc[chan].start_xfer_size > xfer) { - xfer = chan_desc[chan].start_xfer_size - xfer; - } else { - xfer = 0; - } - } else { - xfer = chan_desc[chan].start_xfer_size; - } - } else { - xfer = GET_BITFIELD(usbc->HCSR[chan].HCTSIZn, USBC_HCTSIZN_PKTCNT); - if (chan_desc[chan].start_pkt_cnt > xfer) { - xfer = (chan_desc[chan].start_pkt_cnt - xfer) * chan_desc[chan].type.mps; - } else { - xfer = 0; - } - } - - return xfer; -} - -static enum HAL_USBHOST_XFER_ERR_T hal_usbhost_get_xfer_error(uint32_t irq) { - if (irq & USBC_HCINTN_XFERCOMPL) - return HAL_USBHOST_XFER_ERR_NONE; - if (irq & USBC_HCINTN_AHBERR) - return HAL_USBHOST_XFER_ERR_AHB; - if (irq & USBC_HCINTN_STALL) - return HAL_USBHOST_XFER_ERR_STALL; - if (irq & USBC_HCINTN_XACTERR) - return HAL_USBHOST_XFER_ERR_TRANSACTION; - if (irq & USBC_HCINTN_BBLERR) - return HAL_USBHOST_XFER_ERR_BABBLE; - if (irq & USBC_HCINTN_FRMOVRUN) - return HAL_USBHOST_XFER_ERR_FRAME_OVERRUN; - if (irq & USBC_HCINTN_DATATGLERR) - return HAL_USBHOST_XFER_ERR_DATA_TOGGLE; - - return HAL_USBHOST_XFER_ERR_QTY; -} - -static void hal_usbhost_chan_n_handler(uint8_t chan) { - uint32_t raw_irq; - uint32_t irq; - uint32_t xfer; - enum HAL_USBHOST_XFER_ERR_T error; - HAL_USBHOST_XFER_COMPL_HANDLER handler; - uint8_t *buf; - - USBHOST_TRACE(2, 3, "%s: %d", __FUNCTION__, chan); - - if (chan_desc[chan].state != HAL_USBHOST_CHAN_XFER) { - return; - } - - raw_irq = usbc->HCSR[chan].HCINTn; - usbc->HCSR[chan].HCINTn = raw_irq; - irq = raw_irq & usbc->HCSR[chan].HCINTMSKn; - - xfer = hal_usbhost_get_xfer_size(chan, (raw_irq & USBC_HCINTN_XFERCOMPL)); - - USBHOST_TRACE(4, 18, "%s: chan=%d HCINTn=0x%08x xfer=%u", __FUNCTION__, chan, - raw_irq, xfer); - - error = HAL_USBHOST_XFER_ERR_QTY; - - if (chan_desc[chan].type.ep_type == HAL_USBHOST_EP_BULK || - chan_desc[chan].type.ep_type == HAL_USBHOST_EP_CTRL) { - if (chan_desc[chan].type.ep_in) { - if (raw_irq & USBC_HCINTN_CHHLTD) { - if (raw_irq & - (USBC_HCINTN_XFERCOMPL | USBC_HCINTN_STALL | USBC_HCINTN_BBLERR)) { - chan_desc[chan].err_cnt = 0; - usbc->HCSR[chan].HCINTMSKn &= - ~(USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_DATATGLERR); - error = hal_usbhost_get_xfer_error(raw_irq); - } else if (raw_irq & USBC_HCINTN_XACTERR) { - if (chan_desc[chan].err_cnt >= 2) { - error = HAL_USBHOST_XFER_ERR_TRANSACTION; - } else { - chan_desc[chan].err_cnt++; - usbc->HCSR[chan].HCINTMSKn |= - USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_DATATGLERR; - hal_usbhost_retry_chan(chan, - chan_desc[chan].start_xfer_size - xfer); - return; - } - } - } else if (raw_irq & - (USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_DATATGLERR)) { - chan_desc[chan].err_cnt = 0; - usbc->HCSR[chan].HCINTMSKn &= - ~(USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_DATATGLERR); - return; - } - } else { - if (raw_irq & USBC_HCINTN_CHHLTD) { - if (raw_irq & (USBC_HCINTN_XFERCOMPL | USBC_HCINTN_STALL)) { - chan_desc[chan].err_cnt = 0; - usbc->HCSR[chan].HCINTMSKn &= - ~(USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_NYET); - error = hal_usbhost_get_xfer_error(raw_irq); - } else if (raw_irq & USBC_HCINTN_XACTERR) { - if (chan_desc[chan].err_cnt >= 2) { - usbc->HCSR[chan].HCINTMSKn &= - ~(USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_NYET); - error = HAL_USBHOST_XFER_ERR_TRANSACTION; - } else { - chan_desc[chan].err_cnt++; - usbc->HCSR[chan].HCINTMSKn |= - (USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_NYET); - hal_usbhost_retry_chan(chan, - chan_desc[chan].start_xfer_size - xfer); - return; - } - } - } else if (raw_irq & - (USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_NYET)) { - chan_desc[chan].err_cnt = 0; - usbc->HCSR[chan].HCINTMSKn &= - ~(USBC_HCINTN_ACK | USBC_HCINTN_NAK | USBC_HCINTN_NYET); - return; - } - } - } - - if (error == HAL_USBHOST_XFER_ERR_QTY) { - error = hal_usbhost_get_xfer_error(raw_irq); - } - - if (error == HAL_USBHOST_XFER_ERR_QTY) { - // Unknown IRQ - usbc->HCSR[chan].HCINTMSKn &= ~irq; - USBHOST_TRACE(3, 19, "%s: Got unknown IRQ chan=%d irq=0x%08x", __FUNCTION__, - chan, irq); - } else { - // Stop xfer timer - hwtimer_stop(usbhost_timer[chan]); - - // Reset the chan_desc to INIT state so that it can be reused in callback - handler = chan_desc[chan].xfer.handler; - buf = chan_desc[chan].xfer.buf; - chan_desc[chan].state = HAL_USBHOST_CHAN_INIT; - - if (error != HAL_USBHOST_XFER_ERR_NONE) { - usbc->HAINTMSK &= ~(1 << chan); - if ((raw_irq & USBC_HCINTN_CHHLTD) == 0) { - hal_usbhost_halt_chan(chan); - } - } - if (handler) { - handler(chan, buf, xfer, error); - } - } -} - -static void hal_usbhost_chan_handler(void) { - uint8_t i; - - USBHOST_FUNC_ENTRY_TRACE(2); - - for (i = 0; i < MAX_CHAN_NUM; i++) { - if (usbc->HAINT & (1 << i)) { - hal_usbhost_chan_n_handler(i); - } - } -} - -static void hal_usbhost_irq_handler(void) { - uint32_t status; - - // Store interrupt flag and reset it - status = usbc->GINTSTS; - usbc->GINTSTS = status; - - status &= (usbc->GINTMSK & (USBC_PRTINT | USBC_HCHINT | USBC_DISCONNINT)); - - USBHOST_TRACE(2, 1, "%s: 0x%08x", __FUNCTION__, status); - - if (status & USBC_DISCONNINT) { - hal_usbhost_disconn_handler(); - return; - } - if (status & USBC_PRTINT) { - hal_usbhost_port_handler(); - } - if (status & USBC_HCHINT) { - hal_usbhost_chan_handler(); - } -} - -static void hal_usbhost_timeout(void *param) { - uint8_t chan = (uint8_t)(uint32_t)param; - uint32_t xfer; - HAL_USBHOST_XFER_COMPL_HANDLER handler; - uint8_t *buf; - - USBHOST_TRACE(2, 21, "%s: %d", __FUNCTION__, chan); - - if (chan_desc[chan].state != HAL_USBHOST_CHAN_XFER) { - return; - } - - hal_usbhost_halt_chan(chan); - - if (chan_desc[chan].xfer.handler) { - // TODO: Check whether HCTSIZn is reset after channel is halted - xfer = hal_usbhost_get_xfer_size(chan, 0); - - // Reset the chan_desc to INIT state so that it can be reused in callback - handler = chan_desc[chan].xfer.handler; - buf = chan_desc[chan].xfer.buf; - chan_desc[chan].state = HAL_USBHOST_CHAN_INIT; - - handler(chan, buf, xfer, HAL_USBHOST_XFER_ERR_TIMEOUT); - } -} - -#ifdef PMU_USB_PIN_CHECK -static void -hal_usbhost_pin_status_change(enum PMU_USB_PIN_CHK_STATUS_T status) { - USBHOST_TRACE(2, 24, "%s: %d", __FUNCTION__, status); - - if (plug_handler) { - if (status == PMU_USB_PIN_CHK_DEV_CONN) { - plug_handler(HAL_USBHOST_PLUG_IN); - } else if (status == PMU_USB_PIN_CHK_DEV_DISCONN) { - plug_handler(HAL_USBHOST_PLUG_OUT); - } - } -} -#endif - -void hal_usbhost_detect(enum HAL_USBHOST_PLUG_STATUS_T status, - HAL_USBHOST_PLUG_HANDLER handler) { -#ifdef PMU_USB_PIN_CHECK - enum PMU_USB_PIN_CHK_STATUS_T pmu_status; - - USBHOST_FUNC_ENTRY_TRACE(23); - - if (status == HAL_USBHOST_PLUG_IN) { - pmu_status = PMU_USB_PIN_CHK_DEV_CONN; - } else if (status == HAL_USBHOST_PLUG_OUT) { - pmu_status = PMU_USB_PIN_CHK_DEV_DISCONN; - } else { - pmu_status = PMU_USB_PIN_CHK_NONE; - } - - plug_handler = handler; - if (handler && pmu_status != PMU_USB_PIN_CHK_NONE) { - pmu_usb_config_pin_status_check(pmu_status, hal_usbhost_pin_status_change, - true); - } else { - pmu_usb_disable_pin_status_check(); - } -#else - ASSERT(false, "No aux usb pin status check support"); -#endif -} - -void hal_usbhost_sleep(void) { - USBHOST_FUNC_ENTRY_TRACE(22); - - if (usbhost_opened) { - hal_usbhost_port_suspend(); -#ifdef PMU_USB_PIN_CHECK - hal_cmu_clock_disable(HAL_CMU_MOD_H_USBC); - hal_cmu_clock_disable(HAL_CMU_MOD_O_USB); - pmu_usb_config_pin_status_check(PMU_USB_PIN_CHK_DEV_DISCONN, - hal_usbhost_pin_status_change, true); -#endif - } -} - -void hal_usbhost_wakeup(void) { - USBHOST_FUNC_ENTRY_TRACE(22); - - if (usbhost_opened) { -#ifdef PMU_USB_PIN_CHECK - pmu_usb_disable_pin_status_check(); - hal_cmu_clock_enable(HAL_CMU_MOD_H_USBC); - hal_cmu_clock_enable(HAL_CMU_MOD_O_USB); -#endif - hal_usbhost_port_resume(); - } -} - -#endif // CHIP_HAS_USB diff --git a/platform/hal/hal_usbhost.h b/platform/hal/hal_usbhost.h deleted file mode 100644 index bb348cf..0000000 --- a/platform/hal/hal_usbhost.h +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __HAL_USB_H__ -#define __HAL_USB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "stdint.h" -#include "stdbool.h" - -#ifdef USB_HIGH_SPEED -#define MAX_USBHOST_PACKET_SIZE 512 -#else -#define MAX_USBHOST_PACKET_SIZE 64 -#endif - -#define USBHOST_EPNUM 6 - -#define HAL_USBHOST_CHAN_NONE 0xFF - -enum HAL_USBHOST_EP_TYPE_T { - HAL_USBHOST_EP_CTRL, - HAL_USBHOST_EP_ISO, - HAL_USBHOST_EP_BULK, - HAL_USBHOST_EP_INT, - - HAL_USBHOST_EP_QTY -}; - -enum HAL_USBHOST_PID_TYPE_T { - HAL_USBHOST_PID_DATA0 = 0, - HAL_USBHOST_PID_DATA2 = 1, - HAL_USBHOST_PID_DATA1 = 2, - HAL_USBHOST_PID_MDATA = 3, - HAL_USBHOST_PID_SETUP = 3, - - HAL_USBHOST_PID_QTY, - HAL_USBHOST_PID_AUTO = 0xFF, -}; - -enum HAL_USBHOST_PORT_EVENT_T { - HAL_USBHOST_PORT_CONN, - HAL_USBHOST_PORT_EN_LS, - HAL_USBHOST_PORT_EN_FS, - HAL_USBHOST_PORT_EN_HS, - HAL_USBHOST_PORT_EN_BAD, - HAL_USBHOST_PORT_DISCONN, - - HAL_USBHOST_PORT_QTY -}; - -enum HAL_USBHOST_SETUP_STAGE_T { - HAL_USBHOST_SETUP_DATA_IN, - HAL_USBHOST_SETUP_DATA_OUT, - HAL_USBHOST_SETUP_STATUS_IN, - HAL_USBHOST_SETUP_STATUS_OUT, - HAL_USBHOST_SETUP_DONE, - HAL_USBHOST_SETUP_ERROR, - - HAL_USBHOST_SETUP_STAGE_QTY -}; - -enum HAL_USBHOST_XFER_ERR_T { - HAL_USBHOST_XFER_ERR_NONE, - HAL_USBHOST_XFER_ERR_AHB, - HAL_USBHOST_XFER_ERR_STALL, - HAL_USBHOST_XFER_ERR_TRANSACTION, - HAL_USBHOST_XFER_ERR_BABBLE, - HAL_USBHOST_XFER_ERR_FRAME_OVERRUN, - HAL_USBHOST_XFER_ERR_DATA_TOGGLE, - HAL_USBHOST_XFER_ERR_TIMEOUT, - HAL_USBHOST_XFER_ERR_DISCONN, - - HAL_USBHOST_XFER_ERR_QTY -}; - -struct HAL_USBHOST_SETUP_XFER_T; - -typedef void (*HAL_USBHOST_DELAY_FUNC)(uint32_t ms); -typedef void (*HAL_USBHOST_PORT_HANDLER)(enum HAL_USBHOST_PORT_EVENT_T evt); -typedef void (*HAL_USBHOST_XFER_COMPL_HANDLER)(uint8_t chan, uint8_t *buf, uint32_t len, enum HAL_USBHOST_XFER_ERR_T error); -typedef void (*HAL_USBHOST_SETUP_COMPL_HANDLER)(struct HAL_USBHOST_SETUP_XFER_T *setup, int error); - -enum HAL_USBHOST_PLUG_STATUS_T { - HAL_USBHOST_PLUG_UNKNOWN, - HAL_USBHOST_PLUG_IN, - HAL_USBHOST_PLUG_OUT, -}; - -typedef void (*HAL_USBHOST_PLUG_HANDLER)(enum HAL_USBHOST_PLUG_STATUS_T status); - -struct HAL_USBHOST_CHAN_TYPE_T { - uint16_t mps; - uint8_t ep_num; - uint8_t ep_in; - enum HAL_USBHOST_EP_TYPE_T ep_type; - uint8_t dev_addr; -}; - -struct HAL_USBHOST_XFER_T { - uint8_t *buf; - uint32_t size; - uint8_t multi_cnt; - enum HAL_USBHOST_PID_TYPE_T pid; - HAL_USBHOST_XFER_COMPL_HANDLER handler; -}; - -struct HAL_USBHOST_SETUP_PKT_T { - uint8_t bmRequestType; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}; - -struct HAL_USBHOST_SETUP_XFER_T { - struct HAL_USBHOST_SETUP_PKT_T setup_pkt; - enum HAL_USBHOST_SETUP_STAGE_T next_stage; - HAL_USBHOST_SETUP_COMPL_HANDLER handler; - uint8_t *data_buf; - uint8_t chan_out; - uint8_t chan_in; -}; - -int hal_usbhost_open(HAL_USBHOST_PORT_HANDLER port_cb, HAL_USBHOST_DELAY_FUNC delay_fn); - -void hal_usbhost_close(void); - -void hal_usbhost_halt_chan(uint8_t chan); - -void hal_usbhost_port_reset(uint32_t ms); - -int hal_usbhost_get_chan(uint8_t *chan); - -int hal_usbhost_free_chan(uint8_t chan); - -int hal_usbhost_init_chan(uint8_t chan, const struct HAL_USBHOST_CHAN_TYPE_T *type); - -int hal_usbhost_update_chan_dev_addr(uint8_t chan, uint8_t dev_addr); - -int hal_usbhost_update_chan_mps(uint8_t chan, uint16_t mps); - -int hal_usbhost_start_xfer(uint8_t chan, const struct HAL_USBHOST_XFER_T *xfer); - -int hal_usbhost_start_setup_xfer(const struct HAL_USBHOST_SETUP_XFER_T *setup, uint32_t *recv_len); - -void hal_usbhost_detect(enum HAL_USBHOST_PLUG_STATUS_T status, HAL_USBHOST_PLUG_HANDLER handler); - -void hal_usbhost_sleep(void); - -void hal_usbhost_wakeup(void); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/platform/main/Makefile b/platform/main/Makefile index 6994838..63af99f 100644 --- a/platform/main/Makefile +++ b/platform/main/Makefile @@ -202,7 +202,6 @@ ccflags-y += \ -Iutils/hwtimer_list \ -Iplatform/drivers/ana \ -Iplatform/drivers/security_engine \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iapps/main \ -Iapps/factory \ -Iutils/list \ diff --git a/services/communication/Makefile b/services/communication/Makefile index eab9024..de84a64 100644 --- a/services/communication/Makefile +++ b/services/communication/Makefile @@ -11,7 +11,6 @@ endif ccflags-y += \ -Iapps/common \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iplatform/drivers/ana \ $(BT_IF_INCLUDES) \ -Iservices/communication/comminication_knowles \ diff --git a/services/communication/comminication_knowles/Makefile b/services/communication/comminication_knowles/Makefile index fb3fafc..1fb369c 100644 --- a/services/communication/comminication_knowles/Makefile +++ b/services/communication/comminication_knowles/Makefile @@ -10,7 +10,6 @@ obj-y := $(obj_c:.c=.o) $(obj_s:.S=.o) $(obj_cpp:.cpp=.o) subdir-ccflags-y += \ -Iapps/common \ - -Iplatform/drivers/usb/usb_dev/inc \ -Iplatform/drivers/ana \ -Iutils/crc32 \ -Iservices/bt_app \ diff --git a/tests/anc_usb/Makefile b/tests/anc_usb/Makefile deleted file mode 100644 index 590b75b..0000000 --- a/tests/anc_usb/Makefile +++ /dev/null @@ -1,292 +0,0 @@ -cur_dir := $(dir $(lastword $(MAKEFILE_LIST))) - -#obj-y := $(patsubst $(cur_dir)%,%,$(wildcard $(cur_dir)*.c $(cur_dir)*.cpp $(cur_dir)*.S)) -obj-y := - -ifeq ($(ROM_BUILD),1) -obj-y += ../../tests/rom/startup_ARMCM.S -else -obj-y += ../../platform/main/startup_main.S -endif - -obj-y += main.c -ifeq ($(ANC_APP),1) -obj-y += anc_usb_app.c -endif -obj-y += usb_audio_app.c -obj-y += dualadc_audio_app.c -obj-y += adda_loop_app.c -obj-y += safe_queue.c -obj-y += memutils.c -ifeq ($(MIC_KEY),1) -obj-y += mic_key.c -endif -ifeq ($(VENDOR_MSG_SUPPT),1) -obj-y += usb_vendor_msg.c -endif - -obj-y += ../../services/audio_process/ -obj-y += ../../services/multimedia/ -obj-y += ../../services/nv_section/ -obj-y += ../../utils/crc32/ - -ifeq ($(USB_AUDIO_SPEECH),1) -obj-y += speech_process.c -obj-y += ../../apps/audioplayers/bt_sco_chain.c -obj-y += ../../apps/audioplayers/bt_sco_chain_cfg_default.c -obj-y += ../../apps/audioplayers/bt_sco_chain_tuning.cpp -obj-y += ../../services/audio_dump/ -obj-y += ../../utils/heap/ - -ccflags-y += \ - -Iapps/audioplayers \ - -Iapps/common -endif - -obj-y := $(obj-y:.c=.o) -obj-y := $(obj-y:.cpp=.o) -obj-y := $(obj-y:.S=.o) - -ifeq ($(INTSRAM_RUN),1) -asflags-y += -DINTSRAM_RUN -ccflags-y += -DINTSRAM_RUN -endif - -ccflags-y += \ - -Iutils/boot_struct \ - -Iutils/crc32 \ - -Iutils/heap \ - -Iutils/hexdump \ - -Iutils/hwtimer_list \ - -Iplatform/drivers/usb/usb_dev/inc \ - -Iplatform/drivers/ana \ - -Iservices/multimedia/audio/process/adp/include \ - -Iservices/multimedia/audio/process/anc/include \ - -Iservices/multimedia/audio/process/filters/include \ - -Iservices/multimedia/audio/process/resample/include \ - -Iservices/audio_dump/include \ - -Iservices/multimedia/speech/inc \ - -Iservices/audio_process \ - -Iservices/nv_section/aud_section \ - -Iservices/nv_section/include - -CFLAGS_usb_audio_app.o += -DAUDIO_OUTPUT_VOLUME_DEFAULT=$(AUDIO_OUTPUT_VOLUME_DEFAULT) -CFLAGS_adda_loop_app.o += -DAUDIO_OUTPUT_VOLUME_DEFAULT=$(AUDIO_OUTPUT_VOLUME_DEFAULT) - -ifneq ($(DEBUG_PORT),) -CFLAGS_main.o += -DDEBUG_PORT=$(DEBUG_PORT) -endif - -ifeq ($(USB_AUDIO_SPEECH),1) -CFLAGS_main.o += -DUSB_AUDIO_SPEECH -endif - -ANC_USB_CFG_FLAGS := - -# ANC option -ifeq ($(ANC_APP),1) -ANC_USB_CFG_FLAGS += -DANC_APP -endif - -# USB audio option -ifeq ($(USB_AUDIO_APP),1) -ANC_USB_CFG_FLAGS += -DUSB_AUDIO_APP -endif - -ifeq ($(USB_I2S_APP),1) -ANC_USB_CFG_FLAGS += -DUSB_I2S_APP -ifneq ($(USB_I2S_ID),) -ANC_USB_CFG_FLAGS += -DUSB_I2S_ID=$(USB_I2S_ID) -endif -endif - -ifeq ($(USB_HIGH_SPEED),1) -ANC_USB_CFG_FLAGS += -DUSB_HIGH_SPEED -endif - -ifeq ($(AUDIO_RESAMPLE),1) -ANC_USB_CFG_FLAGS += -D__AUDIO_RESAMPLE__ -endif - -ifeq ($(ADC_CH_SEP_BUFF),1) -ANC_USB_CFG_FLAGS += -DADC_CH_SEP_BUFF -endif - -include platform/drivers/usb/usb_dev/uaud_cfg_flags.mk - -platform/drivers/usb/usb_dev/uaud_cfg_flags.mk: ; - -ANC_USB_CFG_FLAGS += $(UAUD_CFG_FLAGS) - -# USB audio configuration -ifeq ($(USB_AUDIO_DYN_CFG),1) -ifneq ($(USB_AUDIO_RECV_ENABLE),0) -ifneq ($(AUDIO_RESAMPLE),1) -SW_CAPTURE_RESAMPLE ?= 1 -endif -endif -endif - -ifeq ($(AUDIO_PLAYBACK_24BIT),1) -ANC_USB_CFG_FLAGS += -DAUDIO_PLAYBACK_24BIT -endif - -# DSD configuration -ifeq ($(HW_FIR_DSD_PROCESS),1) -ifeq ($(HW_FIR_DSD_BUF_MID_ADDR),) -$(error HW_FIR_DSD_BUF_MID_ADDR must be defined with HW_FIR_DSD_PROCESS) -endif -ANC_USB_CFG_FLAGS += -D__HW_FIR_DSD_PROCESS__ -DHW_FIR_DSD_BUF_MID_ADDR=$(HW_FIR_DSD_BUF_MID_ADDR) -endif - -ifeq ($(CODEC_DSD),1) -ANC_USB_CFG_FLAGS += -DCODEC_DSD -endif - -# EQ configuration -ifeq ($(HW_FIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_FIR_EQ_PROCESS__ -endif - -ifeq ($(HW_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_IIR_EQ_PROCESS__ -endif - -ifeq ($(SW_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__SW_IIR_EQ_PROCESS__ -endif - -ifeq ($(HW_DAC_IIR_EQ_PROCESS),1) -ANC_USB_CFG_FLAGS += -D__HW_DAC_IIR_EQ_PROCESS__ -endif - -ifeq ($(AUDIO_RESAMPLE),1) -ifeq ($(SW_PLAYBACK_RESAMPLE),1) -ANC_USB_CFG_FLAGS += -DSW_PLAYBACK_RESAMPLE -endif -endif - -ifeq ($(SW_CAPTURE_RESAMPLE),1) -ANC_USB_CFG_FLAGS += -DSW_CAPTURE_RESAMPLE -endif - -CFLAGS_main.o += $(ANC_USB_CFG_FLAGS) -CFLAGS_usb_audio_app.o += $(ANC_USB_CFG_FLAGS) -CFLAGS_anc_usb_app.o += $(ANC_USB_CFG_FLAGS) - -ifeq ($(ANC_KEY_DOUBLE_CLICK_ON_OFF),1) -CFLAGS_anc_usb_app.o += -DANC_KEY_DOUBLE_CLICK_ON_OFF -endif - -ifeq ($(ANC_FF_ENABLED),1) -CFLAGS_anc_usb_app.o += -DANC_FF_ENABLED -endif - -ifeq ($(ANC_FB_ENABLED),1) -CFLAGS_anc_usb_app.o += -DANC_FB_ENABLED -endif - -ifeq ($(AUDIO_SECTION_SUPPT),1) -CFLAGS_anc_usb_app.o += -D__AUDIO_SECTION_SUPPT__ -endif - -ifeq ($(ANC_INIT_OFF),1) -CFLAGS_anc_usb_app.o += -DANC_INIT_OFF -endif - -ifeq ($(ADDA_LOOP_APP),1) -CFLAGS_main.o += -DADDA_LOOP_APP -endif - -ifeq ($(PC_CMD_UART),1) -CFLAGS_main.o += -D__PC_CMD_UART__ -endif - -ifeq ($(JTAG_ENABLE),1) -CFLAGS_main.o += -DJTAG_ENABLE -endif - -ifeq ($(DEBUG_MODE_USB_DOWNLOAD),1) -CFLAGS_main.o += -DDEBUG_MODE_USB_DOWNLOAD -endif - -ifeq ($(DELAY_STREAM_OPEN),1) -CFLAGS_usb_audio_app.o += -DDELAY_STREAM_OPEN -endif - -ifeq ($(NOISE_GATING),1) -CFLAGS_usb_audio_app.o += -DNOISE_GATING -endif - -ifeq ($(NOISE_REDUCTION),1) -CFLAGS_usb_audio_app.o += -DNOISE_REDUCTION -endif - -ifeq ($(ANC_L_R_MISALIGN_WORKAROUND),1) -CFLAGS_usb_audio_app.o += -DANC_L_R_MISALIGN_WORKAROUND -endif - -ifeq ($(ANDROID_ACCESSORY_SPEC),1) -CFLAGS_usb_audio_app.o += -DANDROID_ACCESSORY_SPEC -ifeq ($(ANDROID_VOICE_CMD_KEY),1) -CFLAGS_usb_audio_app.o += -DANDROID_VOICE_CMD_KEY -endif -endif - -ifeq ($(DUAL_AUX_MIC_MORE_FILTER),1) -CFLAGS_usb_audio_app.o += -DDUAL_AUX_MIC_MORE_FILTER -endif - -ifeq ($(FREQ_RESP_EQ),1) -CFLAGS_usb_audio_app.o += -DFREQ_RESP_EQ -endif - -ifeq ($(KEEP_SAME_LATENCY),1) -CFLAGS_usb_audio_app.o += -DKEEP_SAME_LATENCY -CFLAGS_speech_process.o += -DKEEP_SAME_LATENCY -endif - -ifeq ($(USB_AUDIO_PWRKEY_TEST),1) -CFLAGS_usb_audio_app.o += -DUSB_AUDIO_PWRKEY_TEST -endif - -ifeq ($(AUDIO_RESAMPLE),1) -# If neither best1000 nor best2000 -ifeq ($(filter best1000 best2000,$(CHIP)),) -PLL_TUNE_SAMPLE_RATE ?= 1 -endif -ifeq ($(PLL_TUNE_SAMPLE_RATE),1) -CFLAGS_usb_audio_app.o += -DPLL_TUNE_SAMPLE_RATE -endif -ifeq ($(PLL_TUNE_XTAL),1) -CFLAGS_usb_audio_app.o += -DPLL_TUNE_XTAL -endif -endif - -ifeq ($(TARGET_TO_MAX_DIFF),1) -CFLAGS_usb_audio_app.o += -DTARGET_TO_MAX_DIFF -endif - -ifneq ($(USB_AUDIO_RECV_ENABLE),0) -CFLAGS_usb_audio_app.o += -DUSB_AUDIO_RECV_ENABLE -endif -ifneq ($(USB_AUDIO_SEND_ENABLE),0) -CFLAGS_usb_audio_app.o += -DUSB_AUDIO_SEND_ENABLE -endif - -ifeq ($(USB_EQ_TUNING), 1) -CFLAGS_main.o += -DUSB_EQ_TUNING -CFLAGS_usb_vendor_msg.o += -DUSB_EQ_TUNING -endif - -ifeq ($(VENDOR_MSG_SUPPT), 1) -CFLAGS_main.o += -D_VENDOR_MSG_SUPPT_ -CFLAGS_usb_vendor_msg.o += -D_VENDOR_MSG_SUPPT_ -CFLAGS_usb_audio_app.o += -D_VENDOR_MSG_SUPPT_ -endif - -ifeq ($(CHIP_HAS_DCO), 1) -CFLAGS_main.o += -DCHIP_HAS_DCO -CFLAGS_usb_vendor_msg.o += -DCHIP_HAS_DCO -CFLAGS_usb_audio_app.o += -DCHIP_HAS_DCO -endif \ No newline at end of file diff --git a/tests/anc_usb/adda_loop_app.c b/tests/anc_usb/adda_loop_app.c deleted file mode 100644 index 4972a92..0000000 --- a/tests/anc_usb/adda_loop_app.c +++ /dev/null @@ -1,210 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "adda_loop_app.h" -#include "audioflinger.h" -#include "hal_aud.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "string.h" -#include "tgt_hardware.h" - -#define ADDA_SAMPLE_RATE 48000 -#define ADDA_SAMPLE_SIZE 2 - -#define ADDA_PLAYBACK_CHAN 2 -#define ADDA_CAPTURE_CHAN 2 - -#define RATE_TO_SIZE(n) (((n) + (1000 - 1)) / 1000) - -#define ADDA_PLAYBACK_FRAME_SIZE \ - (RATE_TO_SIZE(ADDA_SAMPLE_RATE) * ADDA_SAMPLE_SIZE * ADDA_PLAYBACK_CHAN) -#define ADDA_CAPTURE_FRAME_SIZE \ - (RATE_TO_SIZE(ADDA_SAMPLE_RATE) * ADDA_SAMPLE_SIZE * ADDA_CAPTURE_CHAN) - -#define PLAYBACK_FRAME_NUM 4 -#define CAPTURE_FRAME_NUM 8 - -#define ADDA_NON_EXP_ALIGN(val, exp) (((val) + ((exp)-1)) / (exp) * (exp)) -#define BUFF_ALIGN (4 * 4) - -#define PLAYBACK_SIZE \ - ADDA_NON_EXP_ALIGN(ADDA_PLAYBACK_FRAME_SIZE *PLAYBACK_FRAME_NUM, BUFF_ALIGN) -#define CAPTURE_SIZE \ - ADDA_NON_EXP_ALIGN(ADDA_CAPTURE_FRAME_SIZE *CAPTURE_FRAME_NUM, BUFF_ALIGN) - -#define ALIGNED4 ALIGNED(4) - -static uint8_t ALIGNED4 adda_playback_buf[PLAYBACK_SIZE]; -static uint8_t ALIGNED4 adda_capture_buf[CAPTURE_SIZE]; - -static uint32_t cap_rpos; -static uint32_t cap_wpos; - -static enum AUD_BITS_T sample_size_to_enum(uint32_t size) { - if (size == 2) { - return AUD_BITS_16; - } else if (size == 4) { - return AUD_BITS_24; - } else { - ASSERT(false, "%s: Invalid sample size: %u", __FUNCTION__, size); - } - - return 0; -} - -static enum AUD_CHANNEL_NUM_T chan_num_to_enum(uint32_t num) { - if (num == 2) { - return AUD_CHANNEL_NUM_2; - } else if (num == 1) { - return AUD_CHANNEL_NUM_1; - } else { - ASSERT(false, "%s: Invalid channel num: %u", __FUNCTION__, num); - } - - return 0; -} - -static uint32_t adda_data_playback(uint8_t *buf, uint32_t len) { - uint32_t cur_time; - int16_t *src; - int16_t *dst; - int16_t *src_end; - int16_t *dst_end; - uint32_t avail; - - cur_time = hal_sys_timer_get(); - - if (cap_wpos >= cap_rpos) { - avail = cap_wpos - cap_rpos; - } else { - avail = sizeof(adda_capture_buf) + cap_wpos - cap_rpos; - } - - if (avail * ADDA_PLAYBACK_CHAN / ADDA_CAPTURE_CHAN >= len) { - src = (int16_t *)(adda_capture_buf + cap_rpos); - src_end = (int16_t *)(adda_capture_buf + sizeof(adda_capture_buf)); - dst = (int16_t *)buf; - dst_end = (int16_t *)(buf + len); - - while (dst < dst_end) { - *dst++ = *src++; - if (src == src_end) { - src = (int16_t *)adda_capture_buf; - } -#if (ADDA_PLAYBACK_CHAN == 2) && (ADDA_CAPTURE_CHAN == 1) - *dst = *(dst - 1); - dst++; -#endif - } - - cap_rpos = (uint32_t)src - (uint32_t)adda_capture_buf; - } else { - memset(buf, 0, len); - } - - TRACE(5, "[%X] playback: len=%4u wpos=%4u rpos=%4u avail=%4u", cur_time, len, - cap_wpos, cap_rpos, avail); - return 0; -} - -static uint32_t adda_data_capture(uint8_t *buf, uint32_t len) { - uint32_t cur_time; - - cur_time = hal_sys_timer_get(); - - cap_wpos += len; - if (cap_wpos >= sizeof(adda_capture_buf)) { - cap_wpos = 0; - } - - TRACE(4, "[%X] capture : len=%4u wpos=%4u rpos=%4u", cur_time, len, cap_wpos, - cap_rpos); - return 0; -} - -static void adda_loop_start(void) { - int ret = 0; - struct AF_STREAM_CONFIG_T stream_cfg; - - hal_sysfreq_req(HAL_SYSFREQ_USER_APP_2, HAL_CMU_FREQ_52M); - - memset(&stream_cfg, 0, sizeof(stream_cfg)); - - stream_cfg.bits = sample_size_to_enum(ADDA_SAMPLE_SIZE); - stream_cfg.channel_num = chan_num_to_enum(ADDA_PLAYBACK_CHAN); - stream_cfg.sample_rate = ADDA_SAMPLE_RATE; - stream_cfg.device = AUD_STREAM_USE_INT_CODEC; - stream_cfg.vol = AUDIO_OUTPUT_VOLUME_DEFAULT; - stream_cfg.handler = adda_data_playback; - stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER; - stream_cfg.data_ptr = adda_playback_buf; - stream_cfg.data_size = sizeof(adda_playback_buf); - - TRACE(3, "[%s] playback sample_rate: %d, bits = %d", __func__, - stream_cfg.sample_rate, stream_cfg.bits); - - ret = af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg); - ASSERT(ret == 0, "af_stream_open playback failed: %d", ret); - - memset(&stream_cfg, 0, sizeof(stream_cfg)); - - stream_cfg.bits = sample_size_to_enum(ADDA_SAMPLE_SIZE); - stream_cfg.channel_num = chan_num_to_enum(ADDA_CAPTURE_CHAN); - stream_cfg.sample_rate = ADDA_SAMPLE_RATE; - stream_cfg.device = AUD_STREAM_USE_INT_CODEC; - stream_cfg.vol = CODEC_SADC_VOL; - stream_cfg.handler = adda_data_capture; - stream_cfg.io_path = AUD_INPUT_PATH_MAINMIC; - stream_cfg.data_ptr = adda_capture_buf; - stream_cfg.data_size = sizeof(adda_capture_buf); - - TRACE(3, "[%s] capture sample_rate: %d, bits = %d", __func__, - stream_cfg.sample_rate, stream_cfg.bits); - - ret = af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg); - ASSERT(ret == 0, "af_stream_open catpure failed: %d", ret); - - ret = af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - ASSERT(ret == 0, "af_stream_start playback failed: %d", ret); - - ret = af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - ASSERT(ret == 0, "af_stream_start catpure failed: %d", ret); -} - -static void adda_loop_stop(void) { - af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - - hal_sysfreq_req(HAL_SYSFREQ_USER_APP_2, HAL_CMU_FREQ_32K); -} - -void adda_loop_app(bool on) { - if (on) { - adda_loop_start(); - } else { - adda_loop_stop(); - } -} - -void adda_loop_app_loop(void) { -#ifndef RTOS - extern void af_thread(void const *argument); - af_thread(NULL); -#endif -} diff --git a/tests/anc_usb/adda_loop_app.h b/tests/anc_usb/adda_loop_app.h deleted file mode 100644 index 057868d..0000000 --- a/tests/anc_usb/adda_loop_app.h +++ /dev/null @@ -1,33 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __ADDA_LOOP_APP_H__ -#define __ADDA_LOOP_APP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" - -void adda_loop_app(bool on); - -void adda_loop_app_loop(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/anc_usb/anc_usb_app.c b/tests/anc_usb/anc_usb_app.c deleted file mode 100644 index 18157b5..0000000 --- a/tests/anc_usb/anc_usb_app.c +++ /dev/null @@ -1,1047 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "anc_usb_app.h" -#include "anc_process.h" -#include "audioflinger.h" -#include "cmsis.h" -#include "hal_codec.h" -#include "hal_key.h" -#include "hal_sleep.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "pmu.h" -#include "tgt_hardware.h" -#include "usb_audio_app.h" - -#ifdef ANC_SWITCH_GPADC_CHAN -#include "hal_gpadc.h" -#endif - -#define ANC_KEY_CPU_WAKE_USER HAL_CPU_WAKE_LOCK_USER_4 -#define ANC_STATE_CPU_WAKE_USER HAL_CPU_WAKE_LOCK_USER_5 - -#define ANC_FADE_IN_OUT -#define ANC_FADE_GAIN_STEP 1 -#define ANC_MODE_SWITCH_WITHOUT_FADE - -#ifndef ANC_INIT_ON_TIMEOUT_MS -#ifdef CHIP_BEST1000 -#define ANC_INIT_ON_TIMEOUT_MS 1200 -#else -#define ANC_INIT_ON_TIMEOUT_MS 200 -#endif -#endif -#ifndef ANC_SHUTDOWN_TIMEOUT_MS -#define ANC_SHUTDOWN_TIMEOUT_MS 5000 -#endif - -#ifndef ANC_SWITCH_CHECK_INTERVAL -#define ANC_SWITCH_CHECK_INTERVAL MS_TO_TICKS(500) -#endif - -#ifdef ANC_COEF_NUM -#if (ANC_COEF_NUM < 1) -#error "Invalid ANC_COEF_NUM configuration" -#endif -#else -#define ANC_COEF_NUM (1) -#endif - -#define KEY_PROCESS_TIMER_INTERVAL (MS_TO_TICKS(1) / 2) -#define FADE_TIMER_INTERVAL (MS_TO_TICKS(1) / 2) - -enum ANC_STATUS_T { - ANC_STATUS_NULL = 0, - ANC_STATUS_INIT, - ANC_STATUS_FADEIN, - ANC_STATUS_ENABLE, - ANC_STATUS_FADEOUT, - ANC_STATUS_DISABLE, - ANC_STATUS_INIT_CLOSE, -}; - -enum ANC_KEY_STATE_T { - ANC_KEY_STATE_NULL = 0, - ANC_KEY_STATE_CLOSE, - ANC_KEY_STATE_OPEN, - ANC_KEY_STATE_DEBOUNCE, -}; - -enum ANC_CTRL_SM_T { - ANC_CTRL_SM_OFF = 0, - ANC_CTRL_SM_COEF_0, - ANC_CTRL_SM_COEF_N = ANC_CTRL_SM_COEF_0 + ANC_COEF_NUM - 1, - - ANC_CTRL_SM_QTY -}; - -static enum ANC_STATUS_T anc_status = ANC_STATUS_NULL; -static enum ANC_KEY_STATE_T prev_key_state = ANC_KEY_STATE_NULL; -static enum HAL_KEY_EVENT_T anc_key_event = HAL_KEY_EVENT_NONE; -static enum ANC_CTRL_SM_T anc_ctrl_sm = ANC_CTRL_SM_OFF; -#ifdef ANC_TALK_THROUGH -static bool talk_through = false; -#endif - -static uint32_t anc_init_time; -static uint32_t anc_close_time; - -static enum ANC_INDEX cur_coef_index = ANC_INDEX_0; - -static enum AUD_SAMPRATE_T anc_sample_rate[AUD_STREAM_NUM]; - -static bool anc_running = false; - -#ifdef ANC_SWITCH_GPIO_PIN -static const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_anc = { - ANC_SWITCH_GPIO_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, - HAL_IOMUX_PIN_PULLUP_ENABLE}; -static bool gpio_pending; -static bool gpio_irq_en; -static enum HAL_GPIO_IRQ_POLARITY_T gpio_irq_polarity; -#endif - -// ANC_SWITCH_GPADC_CHAN -static HWTIMER_ID gpadc_timer; - -// ANC_FADE_IN_OUT -static uint8_t fadein_cnt = 0; -static uint8_t fadeout_cnt = 0; -static uint32_t prev_fade_time = 0; - -#ifdef CFG_HW_ANC_LED_PIN -const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_anc_led[] = { - {CFG_HW_ANC_LED_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, - HAL_IOMUX_PIN_NOPULL}, -}; -#endif -#ifdef CFG_HW_ANC_LED_PIN2 -const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_anc_led2[] = { - {CFG_HW_ANC_LED_PIN2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, - HAL_IOMUX_PIN_NOPULL}, -}; -#endif - -static void anc_full_open(void); -static void anc_full_close(void); - -// ANC_FADE_IN_OUT -int anc_usb_app_fadein(enum ANC_TYPE_T anc_type) { - - int32_t gain0_curr, gain1_curr; - int32_t gain0_tg, gain1_tg; - - anc_get_gain(&gain0_curr, &gain1_curr, anc_type); - anc_get_cfg_gain(&gain0_tg, &gain1_tg, anc_type); - - /* - anc_set_gain(gain0_tg, gain1_tg,anc_type); - - return 0; - */ - if (gain0_tg > 0) { - if (gain0_curr < gain0_tg) { - if (gain0_curr + ANC_FADE_GAIN_STEP < gain0_tg) { - gain0_curr += ANC_FADE_GAIN_STEP; - } else { - gain0_curr = gain0_tg; - } - } - } else { - if (gain0_curr > gain0_tg) { - if (gain0_curr - ANC_FADE_GAIN_STEP > gain0_tg) { - gain0_curr -= ANC_FADE_GAIN_STEP; - } else { - gain0_curr = gain0_tg; - } - } - } - - if (gain1_tg > 0) { - if (gain1_curr < gain1_tg) { - if (gain1_curr + ANC_FADE_GAIN_STEP < gain1_tg) { - gain1_curr += ANC_FADE_GAIN_STEP; - } else { - gain1_curr = gain1_tg; - } - } - } else { - if (gain1_curr > gain1_tg) { - if (gain1_curr - ANC_FADE_GAIN_STEP > gain1_tg) { - gain1_curr -= ANC_FADE_GAIN_STEP; - } else { - gain1_curr = gain1_tg; - } - } - } - - // TRACE(3,"[%s] cur gain: %d %d", __func__, gain0_curr, gain1_curr); - anc_set_gain(gain0_curr, gain1_curr, anc_type); - - if ((gain0_curr == gain0_tg) && (gain1_curr == gain1_tg)) { - return 0; - } - - return 1; -} - -int anc_usb_app_fadeout(enum ANC_TYPE_T anc_type) { - - /* - anc_set_gain(0, 0,anc_type); - - return 0; - */ - - int32_t gain0_curr, gain1_curr; - - anc_get_gain(&gain0_curr, &gain1_curr, anc_type); - - if (gain0_curr > 0) { - if (gain0_curr > ANC_FADE_GAIN_STEP) { - gain0_curr -= ANC_FADE_GAIN_STEP; - } else { - gain0_curr = 0; - } - } else if (gain0_curr < 0) { - if (gain0_curr < -ANC_FADE_GAIN_STEP) { - gain0_curr += ANC_FADE_GAIN_STEP; - } else { - gain0_curr = 0; - } - } - - if (gain1_curr > 0) { - if (gain1_curr > ANC_FADE_GAIN_STEP) { - gain1_curr -= ANC_FADE_GAIN_STEP; - } else { - gain1_curr = 0; - } - } else if (gain1_curr < 0) { - if (gain1_curr < -ANC_FADE_GAIN_STEP) { - gain1_curr += ANC_FADE_GAIN_STEP; - } else { - gain1_curr = 0; - } - } - - // TRACE(3,"[%s] gain: %d, %d", __func__, gain0_curr, gain1_curr); - anc_set_gain(gain0_curr, gain1_curr, anc_type); - - if ((gain0_curr == 0) && (gain1_curr == 0)) { - return 0; - } - - return 1; -} - -void anc_usb_app(bool on) { - TRACE(2, "%s: on=%d", __func__, on); - - if (anc_running == on) - return; - else - anc_running = on; - - if (on) { - anc_enable(); - } else { - anc_disable(); - } - -#ifdef CFG_HW_ANC_LED_PIN - if (on) { - hal_gpio_pin_set(CFG_HW_ANC_LED_PIN); - } else { - hal_gpio_pin_clr(CFG_HW_ANC_LED_PIN); - } -#endif -#ifdef CFG_HW_ANC_LED_PIN2 - if (on) { - hal_gpio_pin_set(CFG_HW_ANC_LED_PIN2); - } else { - hal_gpio_pin_clr(CFG_HW_ANC_LED_PIN2); - } -#endif -} - -bool anc_usb_app_get_status() { return anc_running; } - -#ifdef ANC_SWITCH_GPIO_PIN -static void anc_key_gpio_handler(enum HAL_GPIO_PIN_T pin) { - struct HAL_GPIO_IRQ_CFG_T gpiocfg; - - gpiocfg.irq_enable = false; - hal_gpio_setup_irq((enum HAL_GPIO_PIN_T)pinmux_anc.pin, &gpiocfg); - - gpio_irq_en = false; - gpio_pending = true; - - hal_cpu_wake_lock(ANC_KEY_CPU_WAKE_USER); -} - -static void anc_key_gpio_irq_setup(enum HAL_GPIO_IRQ_POLARITY_T polarity) { - struct HAL_GPIO_IRQ_CFG_T gpiocfg; - - if (gpio_irq_en && gpio_irq_polarity == polarity) { - return; - } - - gpio_irq_polarity = polarity; - gpio_irq_en = true; - - gpiocfg.irq_enable = true; - gpiocfg.irq_debounce = true; - gpiocfg.irq_polarity = polarity; - gpiocfg.irq_handler = anc_key_gpio_handler; - gpiocfg.irq_type = HAL_GPIO_IRQ_TYPE_LEVEL_SENSITIVE; - - hal_gpio_setup_irq((enum HAL_GPIO_PIN_T)pinmux_anc.pin, &gpiocfg); -} -#endif - -static enum ANC_KEY_STATE_T anc_key_level_to_state(bool level) { - enum ANC_KEY_STATE_T key_state; - -#ifdef ANC_SWITCH_GPIO_PIN - anc_key_gpio_irq_setup(level ? HAL_GPIO_IRQ_POLARITY_LOW_FALLING - : HAL_GPIO_IRQ_POLARITY_HIGH_RISING); -#endif - - key_state = level ? ANC_KEY_STATE_OPEN : ANC_KEY_STATE_CLOSE; - - return key_state; -} - -enum ANC_KEY_STATE_T anc_key_get_state(bool init_state) { - enum ANC_KEY_STATE_T key_state = ANC_KEY_STATE_NULL; - uint8_t level; - -#if defined(ANC_SWITCH_GPIO_PIN) - level = hal_gpio_pin_get_val((enum HAL_GPIO_PIN_T)pinmux_anc.pin); - - level = level ? true : false; - -#elif defined(ANC_SWITCH_GPADC_CHAN) - HAL_GPADC_MV_T volt = 0; - - if (hal_gpadc_get_volt(ANC_SWITCH_GPADC_CHAN, &volt)) { - level = volt > ANC_SWITCH_VOLTAGE_THRESHOLD ? ANC_SWITCH_LEVEL_HIGH - : ANC_SWITCH_LEVEL_LOW; - // TRACE(3,"[%s] level = %d, volt = %d", __func__, level, volt); - } else { - // TRACE(1,"[%s] else...", __func__); - return ANC_KEY_STATE_NULL; - } -#else - return key_state; -#endif - - static uint32_t s_time; - static bool key_trigger = false; - static bool key_level = false; - - if (init_state) { - key_level = level; - return anc_key_level_to_state(level); - } - - if (key_trigger) { - if (key_level == level) { - key_trigger = false; - } else { - uint32_t diff_time_ms; - - diff_time_ms = TICKS_TO_MS(hal_sys_timer_get() - s_time); - - if (diff_time_ms >= 200) { - key_level = level; - key_trigger = false; - } - } - } else { - if (key_level != level) { - s_time = hal_sys_timer_get(); - key_trigger = true; - } - } - - if (key_trigger) { - key_state = ANC_KEY_STATE_DEBOUNCE; - } else { - key_state = anc_key_level_to_state(level); - } - - return key_state; -} - -static void anc_key_proc_open(bool from_key) { - int POSSIBLY_UNUSED ret; - uint32_t POSSIBLY_UNUSED time; - - time = hal_sys_timer_get(); - - if (anc_status == ANC_STATUS_INIT_CLOSE) { - TRACE(1, "[ANC KEY PROC] ANC INIT_CLOSE => INIT T:%u", time); - - anc_status = ANC_STATUS_INIT; - } else if (anc_status == ANC_STATUS_NULL) { - TRACE(1, "[ANC KEY PROC] ANC NULL => INIT T:%u", time); - - anc_full_open(); -#ifdef ANC_MODE_SWITCH_WITHOUT_FADE - } else if (anc_status == ANC_STATUS_ENABLE) { -#ifdef ANC_FF_ENABLED - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_FEEDFORWARD, ANC_GAIN_NO_DELAY); - TRACE(2, "[ANC KEY PROC] updata coefs ff %d: ret=%d", cur_coef_index, ret); -#endif -#ifdef ANC_FB_ENABLED - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_FEEDBACK, ANC_GAIN_NO_DELAY); - TRACE(2, "[ANC KEY PROC] updata coefs fb %d: ret=%d", cur_coef_index, ret); -#endif -#if defined(AUDIO_ANC_FB_MC_HW) - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_MUSICCANCLE, ANC_GAIN_NO_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef mc %d: ret=%d", cur_coef_index, - ret); -#endif -#if defined(AUDIO_ANC_TT_HW) - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_TALKTHRU, ANC_GAIN_NO_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef tt %d: ret=%d", cur_coef_index, - ret); -#endif - -#endif - } else { - if (from_key && anc_status == ANC_STATUS_INIT) { - TRACE(1, "[ANC KEY PROC] ANC ON2 T:%u", time); - // Let state machine enable ANC - return; - } - - TRACE(1, "[ANC KEY PROC] ANC ON T:%u", time); - -#ifdef ANC_FF_ENABLED - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_FEEDFORWARD, ANC_GAIN_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef ff %d: ret=%d", cur_coef_index, - ret); -#endif -#ifdef ANC_FB_ENABLED - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_FEEDBACK, ANC_GAIN_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef fb %d: ret=%d", cur_coef_index, - ret); -#endif -#if defined(AUDIO_ANC_FB_MC_HW) - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_MUSICCANCLE, ANC_GAIN_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef mc %d: ret=%d", cur_coef_index, - ret); -#endif -#if defined(AUDIO_ANC_TT_HW) - ret = anc_select_coef(anc_sample_rate[AUD_STREAM_PLAYBACK], cur_coef_index, - ANC_TALKTHRU, ANC_GAIN_DELAY); - TRACE(2, "[ANC KEY PROC] anc_select_coef tt %d: ret=%d", cur_coef_index, - ret); -#endif - - anc_usb_app(true); -#ifdef ANC_FADE_IN_OUT - fadein_cnt = 0; - anc_status = ANC_STATUS_FADEIN; -#else - { - int32_t gain_ch_l, gain_ch_r; -#if defined(AUDIO_ANC_TT_HW) - anc_get_cfg_gain(&gain_ch_l, &gain_ch_r, ANC_TALKTHRU); - anc_set_gain(gain_ch_l, gain_ch_r, ANC_TALKTHRU); -#endif -#ifdef ANC_FF_ENABLED - anc_get_cfg_gain(&gain_ch_l, &gain_ch_r, ANC_FEEDFORWARD); - anc_set_gain(gain_ch_l, gain_ch_r, ANC_FEEDFORWARD); -#endif -#ifdef ANC_FB_ENABLED - anc_get_cfg_gain(&gain_ch_l, &gain_ch_r, ANC_FEEDBACK); - anc_set_gain(gain_ch_l, gain_ch_r, ANC_FEEDBACK); -#endif -#ifdef AUDIO_ANC_FB_MC_HW - anc_get_cfg_gain(&gain_ch_l, &gain_ch_r, ANC_MUSICCANCLE); - anc_set_gain(gain_ch_l, gain_ch_r, ANC_MUSICCANCLE); -#endif - } - anc_status = ANC_STATUS_ENABLE; -#endif - } -} - -static void anc_key_proc_close(bool from_key) { - uint32_t time; - - time = hal_sys_timer_get(); - anc_close_time = time; - - if (anc_status == ANC_STATUS_INIT) { - TRACE(1, "[ANC KEY PROC] ANC INIT => INIT_CLOSE T:%u", time); - - anc_status = ANC_STATUS_INIT_CLOSE; - } else if (anc_status == ANC_STATUS_INIT_CLOSE || - anc_status == ANC_STATUS_DISABLE) { - if (from_key) { - TRACE(1, "[ANC KEY PROC] ANC OFF2 T:%u", time); - // Let state machine to shutdown ANC - return; - } - - TRACE(1, "[ANC KEY PROC] ANC CLOSE => NULL T:%u", time); - - anc_full_close(); - } else { - TRACE(1, "[ANC KEY PROC] ANC OFF T:%u", time); - -#ifdef ANC_FADE_IN_OUT - fadeout_cnt = 0; - anc_status = ANC_STATUS_FADEOUT; -#else - anc_usb_app(false); - anc_status = ANC_STATUS_DISABLE; -#endif - } -} - -void anc_switch_on_off_ctrl(void) { - uint32_t lock; - enum ANC_KEY_STATE_T key_state = ANC_KEY_STATE_NULL; - - lock = int_lock(); - // Check if there is a state change - if (anc_key_event != HAL_KEY_EVENT_NONE) { - key_state = prev_key_state; - anc_key_event = HAL_KEY_EVENT_NONE; - } - int_unlock(lock); - - if (key_state == ANC_KEY_STATE_OPEN) { - anc_key_proc_open(true); - } else if (key_state == ANC_KEY_STATE_CLOSE) { - anc_key_proc_close(true); - } -} - -void anc_double_click_on_off(void) { - uint32_t lock; - enum HAL_KEY_EVENT_T event; - - lock = int_lock(); - event = anc_key_event; - anc_key_event = HAL_KEY_EVENT_NONE; - hal_cpu_wake_unlock(ANC_KEY_CPU_WAKE_USER); - int_unlock(lock); - - if (event == HAL_KEY_EVENT_NONE) { - return; - } else if (event == HAL_KEY_EVENT_DOUBLECLICK) { - prev_key_state = (prev_key_state == ANC_KEY_STATE_OPEN) - ? ANC_KEY_STATE_CLOSE - : ANC_KEY_STATE_OPEN; - if (prev_key_state == ANC_KEY_STATE_OPEN) { - anc_key_proc_open(true); - } else { - anc_key_proc_close(true); - } - } -} - -void anc_click_on_off(void) { - enum ANC_STATE_UPDATE_T { - ANC_STATE_UPDATE_NULL = 0, - ANC_STATE_UPDATE_TALK_THROUGH, - ANC_STATE_UPDATE_COEF, - }; - - enum HAL_KEY_EVENT_T event; - enum ANC_STATE_UPDATE_T state_update = ANC_STATE_UPDATE_NULL; - uint8_t click_cnt = 0; - uint32_t lock; - - lock = int_lock(); - event = anc_key_event; - anc_key_event = HAL_KEY_EVENT_NONE; - hal_cpu_wake_unlock(ANC_KEY_CPU_WAKE_USER); - int_unlock(lock); - - if (event == HAL_KEY_EVENT_NONE) { - return; -#ifdef ANC_TALK_THROUGH - } else if (event == HAL_KEY_EVENT_LONGPRESS) { - talk_through = !talk_through; - if (talk_through) { - state_update = ANC_STATE_UPDATE_TALK_THROUGH; - cur_coef_index = ANC_COEF_NUM; - TRACE(0, "[ANC KEY PROC] anc_talk_through on"); - } else { - state_update = ANC_STATE_UPDATE_COEF; - TRACE(0, "[ANC KEY PROC] anc_talk_through off"); - } -#endif - } else if (event == HAL_KEY_EVENT_CLICK) { - click_cnt = 1; - } - if (event == HAL_KEY_EVENT_DOUBLECLICK) { - click_cnt = 2; - } - if (event == HAL_KEY_EVENT_TRIPLECLICK) { - click_cnt = 3; - } - - if (click_cnt > 0) { - anc_ctrl_sm = (anc_ctrl_sm + click_cnt) % ANC_CTRL_SM_QTY; - state_update = ANC_STATE_UPDATE_COEF; -#ifdef ANC_TALK_THROUGH - talk_through = false; -#endif - } - - if (state_update == ANC_STATE_UPDATE_COEF) { - if (anc_ctrl_sm >= ANC_CTRL_SM_COEF_0 && - anc_ctrl_sm <= ANC_CTRL_SM_COEF_N) { - cur_coef_index = anc_ctrl_sm - ANC_CTRL_SM_COEF_0; - } - } - - if (state_update != ANC_STATE_UPDATE_NULL) { - if (anc_ctrl_sm == ANC_CTRL_SM_OFF && - state_update != ANC_STATE_UPDATE_TALK_THROUGH) { - anc_key_proc_close(true); - } else { - anc_key_proc_open(true); - } - } -} - -static void anc_key_process(void) { -#if defined(ANC_SWITCH_GPIO_PIN) || defined(ANC_SWITCH_GPADC_CHAN) - - anc_switch_on_off_ctrl(); - -#elif defined(ANC_KEY_DOUBLE_CLICK_ON_OFF) - - anc_double_click_on_off(); - -#else - - anc_click_on_off(); - -#endif -} - -void anc_state_transition(void) { - uint32_t t_time; -#ifdef ANC_FADE_IN_OUT - int res_ff = 0, res_fb = 0; -#ifdef AUDIO_ANC_TT_HW - int res_tt = 0; -#endif -#ifdef AUDIO_ANC_FB_MC_HW - int res_mc = 0; -#endif -#endif - - t_time = hal_sys_timer_get(); - - if (anc_status == ANC_STATUS_INIT) { - if (t_time - anc_init_time >= MS_TO_TICKS(ANC_INIT_ON_TIMEOUT_MS)) { - // TRACE(2,"[%s] anc init on T:%u", __func__, t_time); - anc_key_proc_open(false); - // fadein or open - } - } - -#ifdef ANC_FADE_IN_OUT - if (anc_status == ANC_STATUS_FADEIN) { - // process - if (fadein_cnt == 0) { - TRACE(2, "[%s] anc fadein started T:%u", __func__, t_time); - prev_fade_time = t_time; - fadein_cnt++; - } else if (fadein_cnt == 1) { - // delay 60 ticks - if (t_time - prev_fade_time >= 60) { - fadein_cnt++; - prev_fade_time = t_time; - } - } else { - // delay 1 ticks - if (t_time > prev_fade_time) { - // TRACE(2,"[%s] anc_usb_app_fadein T:%u", __func__, t_time); -#ifdef AUDIO_ANC_TT_HW - res_tt = anc_usb_app_fadein(ANC_TALKTHRU); -#endif -#ifdef ANC_FF_ENABLED - res_ff = anc_usb_app_fadein(ANC_FEEDFORWARD); -#endif -#ifdef ANC_FB_ENABLED - res_fb = anc_usb_app_fadein(ANC_FEEDBACK); -#endif -#ifdef AUDIO_ANC_FB_MC_HW - res_mc = anc_usb_app_fadein(ANC_MUSICCANCLE); -#endif - if (res_ff == 0 && res_fb == 0 -#ifdef AUDIO_ANC_TT_HW - && res_tt == 0 -#endif -#ifdef AUDIO_ANC_FB_MC_HW - && res_mc == 0 -#endif - ) { - anc_status = ANC_STATUS_ENABLE; - TRACE(2, "[%s] anc fadein done T:%u", __func__, t_time); - } else { - prev_fade_time = t_time; - } - } - } - } else if (anc_status == ANC_STATUS_FADEOUT) { - // process - if (fadeout_cnt == 0) { - TRACE(2, "[%s] anc fadeout started T:%u", __func__, t_time); - prev_fade_time = t_time; - fadeout_cnt++; - } else if (fadeout_cnt == 1) { - // delay 1 ticks - if (t_time > prev_fade_time) { - // TRACE(2,"[%s] anc_usb_app_fadeout T:%u", __func__, t_time); -#ifdef AUDIO_ANC_TT_HW - res_tt = anc_usb_app_fadeout(ANC_TALKTHRU); -#endif -#ifdef ANC_FF_ENABLED - res_ff = anc_usb_app_fadeout(ANC_FEEDFORWARD); -#endif -#ifdef ANC_FB_ENABLED - res_fb = anc_usb_app_fadeout(ANC_FEEDBACK); -#endif -#ifdef AUDIO_ANC_FB_MC_HW - res_mc = anc_usb_app_fadein(ANC_MUSICCANCLE); -#endif - if (res_ff == 0 && res_fb == 0 -#ifdef AUDIO_ANC_TT_HW - && res_tt == 0 -#endif -#ifdef AUDIO_ANC_FB_MC_HW - && res_mc == 0 -#endif - ) { - fadeout_cnt++; - } - - prev_fade_time = t_time; - } - } else { - anc_usb_app(false); - anc_status = ANC_STATUS_DISABLE; - TRACE(2, "[%s] anc fadeout done T:%u", __func__, t_time); - } - } -#endif - - if (anc_status == ANC_STATUS_INIT_CLOSE || anc_status == ANC_STATUS_DISABLE) { - if (t_time - anc_close_time >= MS_TO_TICKS(ANC_SHUTDOWN_TIMEOUT_MS)) { - // TRACE(2,"[%s] anc shutdown T:%u", __func__, t_time); - anc_key_proc_close(false); - } - } - - if (anc_status == ANC_STATUS_NULL || anc_status == ANC_STATUS_ENABLE) { - hal_cpu_wake_unlock(ANC_STATE_CPU_WAKE_USER); - } else { - hal_cpu_wake_lock(ANC_STATE_CPU_WAKE_USER); - } -} - -int anc_usb_app_key(enum HAL_KEY_CODE_T code, enum HAL_KEY_EVENT_T event) { -#if !defined(ANC_SWITCH_GPIO_PIN) && !defined(ANC_SWITCH_GPADC_CHAN) - -#ifdef ANC_KEY_DOUBLE_CLICK_ON_OFF - - if (code == ANC_FUNCTION_KEY) { - if (event == HAL_KEY_EVENT_DOUBLECLICK) { - anc_key_event = event; - hal_cpu_wake_lock(ANC_KEY_CPU_WAKE_USER); - // The key event has been processed - return 0; - } - } - -#else - - if (code == ANC_FUNCTION_KEY) { - if (event == HAL_KEY_EVENT_CLICK || event == HAL_KEY_EVENT_DOUBLECLICK || - event == HAL_KEY_EVENT_TRIPLECLICK || - event == HAL_KEY_EVENT_LONGPRESS) { - anc_key_event = event; - hal_cpu_wake_lock(ANC_KEY_CPU_WAKE_USER); - } - // The key event has been processed - return 0; - } - -#endif - -#endif - - // Let other applications check the key event - return 1; -} - -void anc_key_check(void) { - enum ANC_KEY_STATE_T key_state; - -#ifdef ANC_SWITCH_GPIO_PIN - uint32_t lock; - - gpio_pending = false; -#endif - - key_state = anc_key_get_state(false); - - if (key_state == ANC_KEY_STATE_NULL) { - return; - } else if (key_state == ANC_KEY_STATE_DEBOUNCE) { - hal_cpu_wake_lock(ANC_KEY_CPU_WAKE_USER); - } else if (key_state != prev_key_state) { - prev_key_state = key_state; - // Reuse click event to tag a state change - anc_key_event = HAL_KEY_EVENT_CLICK; - hal_cpu_wake_lock(ANC_KEY_CPU_WAKE_USER); - } else if (anc_key_event == HAL_KEY_EVENT_NONE) { -#ifdef ANC_SWITCH_GPIO_PIN - lock = int_lock(); - if (!gpio_pending) { - hal_cpu_wake_unlock(ANC_KEY_CPU_WAKE_USER); - } - int_unlock(lock); -#else - hal_cpu_wake_unlock(ANC_KEY_CPU_WAKE_USER); -#endif - } -} - -void anc_key_gpadc_timer_handler(void *param) { - hwtimer_start(gpadc_timer, ANC_SWITCH_CHECK_INTERVAL); -} - -static void anc_key_init(void) { -#if defined(ANC_SWITCH_GPIO_PIN) - hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)&pinmux_anc, 1); - hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)pinmux_anc.pin, HAL_GPIO_DIR_IN, 0); - // Make sure gpio value is ready - hal_sys_timer_delay(3); -#elif defined(ANC_SWITCH_GPADC_CHAN) - hal_gpadc_open(ANC_SWITCH_GPADC_CHAN, HAL_GPADC_ATP_20MS, NULL); - // Make sure gpadc channel data is ready - hal_sys_timer_delay(6); - gpadc_timer = hwtimer_alloc(anc_key_gpadc_timer_handler, NULL); - ASSERT(gpadc_timer, "Failed to alloc gpadc timer"); - hwtimer_start(gpadc_timer, ANC_SWITCH_CHECK_INTERVAL); -#endif - - // Add other key initialize -} - -#if defined(USB_AUDIO_DYN_CFG) && !defined(__AUDIO_RESAMPLE__) -static void anc_sample_rate_change(enum AUD_STREAM_T stream, - enum AUD_SAMPRATE_T rate, - enum AUD_SAMPRATE_T *new_play, - enum AUD_SAMPRATE_T *new_cap) { - enum AUD_SAMPRATE_T play_rate, cap_rate; - - if (anc_sample_rate[stream] != rate) { -#ifdef CHIP_BEST1000 - if (stream == AUD_STREAM_PLAYBACK) { - play_rate = rate; - cap_rate = rate * (anc_sample_rate[AUD_STREAM_CAPTURE] / - anc_sample_rate[AUD_STREAM_PLAYBACK]); - } else { - play_rate = rate / (anc_sample_rate[AUD_STREAM_CAPTURE] / - anc_sample_rate[AUD_STREAM_PLAYBACK]); - cap_rate = rate; - } -#else - play_rate = rate; - cap_rate = rate; -#ifdef ANC_FF_ENABLED - anc_select_coef(play_rate, cur_coef_index, ANC_FEEDFORWARD, - ANC_GAIN_NO_DELAY); -#endif - -#ifdef ANC_FB_ENABLED - anc_select_coef(play_rate, cur_coef_index, ANC_FEEDBACK, ANC_GAIN_NO_DELAY); -#endif - -#if defined(AUDIO_ANC_FB_MC_HW) - anc_select_coef(play_rate, cur_coef_index, ANC_MUSICCANCLE, - ANC_GAIN_NO_DELAY); -#endif - -#if defined(AUDIO_ANC_TT_HW) - anc_select_coef(play_rate, cur_coef_index, ANC_TALKTHRU, ANC_GAIN_NO_DELAY); -#endif - -#endif - - TRACE(5, "%s: Update anc sample rate from %u/%u to %u/%u", __func__, - anc_sample_rate[AUD_STREAM_PLAYBACK], - anc_sample_rate[AUD_STREAM_CAPTURE], play_rate, cap_rate); - - if (new_play) { - *new_play = play_rate; - } - if (new_cap) { - *new_cap = cap_rate; - } - - anc_sample_rate[AUD_STREAM_PLAYBACK] = play_rate; - anc_sample_rate[AUD_STREAM_CAPTURE] = cap_rate; - } -} -#endif - -static void anc_full_open(void) { - AF_ANC_HANDLER POSSIBLY_UNUSED handler; - -#if defined(USB_AUDIO_DYN_CFG) && !defined(__AUDIO_RESAMPLE__) - handler = anc_sample_rate_change; -#else - handler = NULL; -#endif - -#ifdef USB_AUDIO_APP - usb_audio_keep_streams_running(true); -#endif - - pmu_anc_config(1); - -#ifdef ANC_FF_ENABLED - af_anc_open(ANC_FEEDFORWARD, anc_sample_rate[AUD_STREAM_PLAYBACK], - anc_sample_rate[AUD_STREAM_CAPTURE], handler); - anc_open(ANC_FEEDFORWARD); -#endif - -#ifdef ANC_FB_ENABLED - af_anc_open(ANC_FEEDBACK, anc_sample_rate[AUD_STREAM_PLAYBACK], - anc_sample_rate[AUD_STREAM_CAPTURE], handler); - anc_open(ANC_FEEDBACK); -#if defined(AUDIO_ANC_FB_MC_HW) - anc_open(ANC_MUSICCANCLE); -#endif -#endif - -#if defined(AUDIO_ANC_TT_HW) - anc_open(ANC_TALKTHRU); -#endif - - anc_init_time = hal_sys_timer_get(); - anc_status = ANC_STATUS_INIT; -} - -static void anc_full_close(void) { - -#if defined(AUDIO_ANC_TT_HW) - anc_close(ANC_TALKTHRU); -#endif - -#ifdef ANC_FF_ENABLED - anc_close(ANC_FEEDFORWARD); - af_anc_close(ANC_FEEDFORWARD); -#endif - -#ifdef ANC_FB_ENABLED -#if defined(AUDIO_ANC_FB_MC_HW) - anc_close(ANC_MUSICCANCLE); -#endif - anc_close(ANC_FEEDBACK); - af_anc_close(ANC_FEEDBACK); -#endif - - pmu_anc_config(0); - - anc_status = ANC_STATUS_NULL; - -#ifdef USB_AUDIO_APP - usb_audio_keep_streams_running(false); -#endif -} - -void anc_usb_app_loop(void) { -#if defined(ANC_SWITCH_GPIO_PIN) || defined(ANC_SWITCH_GPADC_CHAN) - anc_key_check(); -#endif - anc_key_process(); - anc_state_transition(); -} - -void anc_usb_app_init(enum AUD_IO_PATH_T input_path, - enum AUD_SAMPRATE_T playback_rate, - enum AUD_SAMPRATE_T capture_rate) { - enum ANC_KEY_STATE_T key_state; - -#ifdef CFG_HW_ANC_LED_PIN - hal_iomux_init(pinmux_anc_led, ARRAY_SIZE(pinmux_anc_led)); - hal_gpio_pin_set_dir(CFG_HW_ANC_LED_PIN, HAL_GPIO_DIR_OUT, 0); -#endif -#ifdef CFG_HW_ANC_LED_PIN2 - hal_iomux_init(pinmux_anc_led2, ARRAY_SIZE(pinmux_anc_led2)); - hal_gpio_pin_set_dir(CFG_HW_ANC_LED_PIN2, HAL_GPIO_DIR_OUT, 0); -#endif - - anc_key_init(); - -#ifdef __AUDIO_SECTION_SUPPT__ - anc_load_cfg(); -#endif - - anc_sample_rate[AUD_STREAM_PLAYBACK] = - hal_codec_anc_convert_rate(playback_rate); - anc_sample_rate[AUD_STREAM_CAPTURE] = - hal_codec_anc_convert_rate(capture_rate); - -#if defined(ANC_SWITCH_GPIO_PIN) || defined(ANC_SWITCH_GPADC_CHAN) - key_state = anc_key_get_state(true); - prev_key_state = key_state; -#elif defined(ANC_KEY_DOUBLE_CLICK_ON_OFF) - key_state = ANC_KEY_STATE_OPEN; - prev_key_state = key_state; -#else - key_state = ANC_KEY_STATE_OPEN; - anc_ctrl_sm = ANC_CTRL_SM_COEF_0 + cur_coef_index; -#endif - -#ifdef ANC_INIT_OFF - key_state = ANC_KEY_STATE_CLOSE; - prev_key_state = key_state; - anc_ctrl_sm = ANC_CTRL_SM_OFF; -#endif - - if (key_state == ANC_KEY_STATE_OPEN) { - anc_full_open(); - } -} - -void anc_usb_app_term(void) { anc_full_close(); } diff --git a/tests/anc_usb/anc_usb_app.h b/tests/anc_usb/anc_usb_app.h deleted file mode 100644 index 5d00204..0000000 --- a/tests/anc_usb/anc_usb_app.h +++ /dev/null @@ -1,45 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __ANC_USB_APP_H__ -#define __ANC_USB_APP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" -#include "hal_aud.h" -#include "hal_key.h" - -void anc_usb_app(bool on); - -bool anc_usb_app_get_status(); - -void anc_usb_app_init(enum AUD_IO_PATH_T input_path, enum AUD_SAMPRATE_T playback_rate, enum AUD_SAMPRATE_T capture_rate); - -void anc_usb_app_term(void); - -void anc_usb_app_loop(void); - -int anc_usb_app_key(enum HAL_KEY_CODE_T code, enum HAL_KEY_EVENT_T event); - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/tests/anc_usb/dualadc_audio_app.c b/tests/anc_usb/dualadc_audio_app.c deleted file mode 100644 index d515999..0000000 --- a/tests/anc_usb/dualadc_audio_app.c +++ /dev/null @@ -1,321 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "analog.h" -#include "audioflinger.h" -#include "hal_aud.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "pmu.h" -#include "string.h" - -static uint8_t *playback_buf; -static uint32_t playback_size; - -static uint8_t *capture_buf; -static uint32_t capture_size; - -/* -static void get_mic_data_max(short *buf, uint32_t len) -{ - int max0 = -32768, min0 = 32767, diff0 = 0; - int max1 = -32768, min1 = 32767, diff1 = 0; - - for(uint32_t i=0; imax0) - { - max0 = buf[i+0]; - } - - if(buf[i+0]max1) - { - max1 = buf[i+1]; - } - - if(buf[i+1]= playback_size) { - pos = 0; - } - stime = hal_sys_timer_get(); - - TRACE(4,"%s irqDur:%d Len:%d pos:%d", __func__, TICKS_TO_MS(stime - preIrqTime), len, pos); - - preIrqTime = stime; -#endif - return 0; -} - -#if 1 -#define MWSPT_NSEC 3 -// static const int NL[MWSPT_NSEC] = { 1, 3, 1 }; -static const float NUM[MWSPT_NSEC][3] = { - {0.0002616526908, 0, 0}, {1, 2, 1}, {1, 0, 0}}; - -// static const int DL[MWSPT_NSEC] = { 1, 3, 1 }; -static const float DEN[MWSPT_NSEC][3] = { - {1, 0, 0}, {1, -1.953727961, 0.9547745585}, {1, 0, 0}}; - -#else - -#define MWSPT_NSEC 3 -static const int NL[MWSPT_NSEC] = {1, 3, 1}; -static const float NUM[MWSPT_NSEC][3] = { - {0.0002616526908, 0, 0}, {1, 2, 1}, {1, 0, 0}}; -static const int DL[MWSPT_NSEC] = {1, 3, 1}; -static const float DEN[MWSPT_NSEC][3] = { - {1, 0, 0}, {1, -1.953727961, 0.9547745585}, {1, 0, 0}}; - -#endif - -static uint32_t dualadc_audio_data_capture(uint8_t *buf, uint32_t len) { - - TRACE(0, "capture"); - -#if 0 - if(buf==capture_buf) - { - short *BufSrcL = (short *)capture_buf; - short *BufSrcR = (short *)(capture_buf+2); - short *BufDstL = (short *)playback_buf; - short *BufDstR = (short *)(playback_buf+2); - - for(int i=0,j=0;i 32600) { - OutValue = ((int)BufSrcR[i]) << 6; - } else if (PcmValue > (32600 / 2) && PcmValue < 32600) { - if (BufSrcR[i] > 512) { - OutValue = PcmValue * (32600 - PcmValue) + - (((int)BufSrcR[i]) << 6) * (PcmValue - (32600 / 2)); - OutValue = OutValue / (32600 / 2); - } else { - OutValue = PcmValue; - } - } else if (PcmValue < -32700) { - OutValue = ((int)BufSrcR[i]) << 6; - } else if (PcmValue > -32700 && PcmValue < -(32700 / 2)) { - - if (BufSrcR[i] < -512) { - OutValue = PcmValue * (-PcmValue - (32700 / 2)) + - (((int)BufSrcR[i]) << 6) * (32700 + PcmValue); - OutValue = OutValue / (32700 / 2); - } else { - OutValue = PcmValue; - } - - } else { - OutValue = PcmValue; - } - - OutValue = OutValue >> 6; - // OutValue=BufSrcR[i]; - - { - static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0; - - x0 = (OutValue * NUM[0][0]); - - y0 = x0 * NUM[1][0] + x1 * NUM[1][1] + x2 * NUM[1][2] - y1 * DEN[1][1] - - y2 * DEN[1][2]; - - y2 = y1; - y1 = y0; - x2 = x1; - x1 = x0; - - if (y0 > 32767.0f) { - y0 = 32767.0f; - } - - if (y0 < -32768.0f) { - y0 = -32768.0f; - } - - OutValue = (short)y0; - } - - BufDstL[j] = OutValue; - BufDstR[j] = OutValue; - } - -#endif - -#if 0 - uint32_t stime; - uint32_t pos; - static uint32_t preIrqTime = 0; - - pos = buf + len - capture_buf; - if (pos >= capture_size) { - pos = 0; - } - stime = hal_sys_timer_get(); - - TRACE(4,"%s irqDur:%d Len:%d pos:%d", __func__, TICKS_TO_MS(stime - preIrqTime), len, pos); - - preIrqTime = stime; -#endif - return 0; -} - -void dualadc_audio_app(bool on) { - - struct AF_STREAM_CONFIG_T stream_cfg; - enum AUD_SAMPRATE_T sample_rate_play; - enum AUD_SAMPRATE_T POSSIBLY_UNUSED sample_rate_capture; - - static bool isRun = false; - - if (isRun == on) - return; - else - isRun = on; - - TRACE(2, "%s: on=%d", __FUNCTION__, on); - - sample_rate_play = AUD_SAMPRATE_192000; - sample_rate_capture = AUD_SAMPRATE_192000; - - if (on) { - - memset(&stream_cfg, 0, sizeof(stream_cfg)); - - stream_cfg.bits = AUD_BITS_16; - stream_cfg.channel_num = AUD_CHANNEL_NUM_2; - stream_cfg.sample_rate = sample_rate_play; - - stream_cfg.device = AUD_STREAM_USE_INT_CODEC; - stream_cfg.vol = 0x06; - - stream_cfg.handler = dualadc_audio_data_playback; - stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER; - - stream_cfg.data_ptr = playback_buf; - stream_cfg.data_size = playback_size; - af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg); - - stream_cfg.bits = AUD_BITS_16; - stream_cfg.channel_num = AUD_CHANNEL_NUM_2; - stream_cfg.sample_rate = sample_rate_capture; - stream_cfg.vol = 0x01; - - stream_cfg.handler = dualadc_audio_data_capture; - stream_cfg.io_path = AUD_INPUT_PATH_MAINMIC; - - stream_cfg.data_ptr = capture_buf; - stream_cfg.data_size = capture_size; - af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg); - - af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - - } else { - - af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - } -} - -void dualadc_audio_app_init(uint8_t *play_buf, uint32_t play_size, - uint8_t *cap_buf, uint32_t cap_size) { - playback_buf = play_buf; - playback_size = play_size; - capture_buf = cap_buf; - capture_size = cap_size; -} - -void dualadc_audio_app_term(void) { - playback_buf = NULL; - playback_size = 0; - capture_buf = NULL; - capture_size = 0; -} diff --git a/tests/anc_usb/dualadc_audio_app.h b/tests/anc_usb/dualadc_audio_app.h deleted file mode 100644 index 98a8364..0000000 --- a/tests/anc_usb/dualadc_audio_app.h +++ /dev/null @@ -1,38 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __DUALADC_AUDIO_TEST_H__ -#define __DUALADC_AUDIO_TEST_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#include "plat_types.h" - -void dualadc_audio_app(bool on); - -void dualadc_audio_app_init(uint8_t *play_buf, uint32_t play_size, uint8_t *cap_buf, uint32_t cap_size); - -void dualadc_audio_app_term(void); - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/tests/anc_usb/main.c b/tests/anc_usb/main.c deleted file mode 100644 index 614f313..0000000 --- a/tests/anc_usb/main.c +++ /dev/null @@ -1,519 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "adda_loop_app.h" -#include "analog.h" -#include "anc_usb_app.h" -#include "audio_process.h" -#include "audioflinger.h" -#include "cmsis.h" -#include "dualadc_audio_app.h" -#include "hal_bootmode.h" -#include "hal_cmu.h" -#include "hal_dma.h" -#include "hal_gpadc.h" -#include "hal_iomux.h" -#include "hal_key.h" -#include "hal_norflash.h" -#include "hal_sleep.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "main_entry.h" -#include "plat_addr_map.h" -#include "pmu.h" -#include "string.h" -#include "tgt_hardware.h" -#include "usb_audio_app.h" -#include "usb_audio_frm_defs.h" -#if defined(_VENDOR_MSG_SUPPT_) -#include "usb_vendor_msg.h" -#endif - -#ifdef RTOS -#include "cmsis_os.h" -#endif -#ifdef __PC_CMD_UART__ -#include "hal_cmd.h" -#endif - -#ifdef USB_AUDIO_SPEECH -#define CODEC_BUFF_FRAME_NUM (2 * 16) -#define USB_BUFF_FRAME_NUM (CODEC_BUFF_FRAME_NUM * 2) -#else -#define CODEC_BUFF_FRAME_NUM 4 -#define USB_BUFF_FRAME_NUM 10 -#endif - -#if (CODEC_BUFF_FRAME_NUM >= USB_BUFF_FRAME_NUM) -#error \ - "Codec buffer frame num should be less than usb buffer frame num (on the requirement of conflict ctrl)" -#endif - -#ifdef USB_AUDIO_DYN_CFG - -#define USB_AUDIO_PLAYBACK_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN) -#define USB_AUDIO_CAPTURE_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN) - -#define USB_AUDIO_RECV_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN) -#define USB_AUDIO_SEND_BUFF_SIZE \ - NON_EXP_ALIGN(MAX_FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN) - -#if defined(CHIP_BEST1000) -// FIR EQ is working on 16-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int16_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE USB_AUDIO_PLAYBACK_BUFF_SIZE -#elif defined(CHIP_BEST2000) -// FIR EQ is working on 32-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 2) -#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P) -// FIR EQ is working on 32-bit -// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t) -#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE) -#define USB_AUDIO_IIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE) -#define USB_AUDIO_DSD_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 16) -#endif - -#else // !USB_AUDIO_DYN_CFG - -#define USB_AUDIO_PLAYBACK_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN) -#define USB_AUDIO_CAPTURE_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN) - -#define USB_AUDIO_RECV_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN) -#define USB_AUDIO_SEND_BUFF_SIZE \ - NON_EXP_ALIGN(FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN) - -#if defined(CHIP_BEST1000) -// FIR EQ is working on 16-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE \ - (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int16_t) / SAMPLE_SIZE_PLAYBACK) -#elif defined(CHIP_BEST2000) -// FIR EQ is working on 32-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE \ - (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK) -#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P) -// FIR EQ is working on 32-bit -#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE) -#define USB_AUDIO_IIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE) -#define USB_AUDIO_DSD_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 16) -#endif - -#endif // !USB_AUDIO_DYN_CFG - -#if (defined(CHIP_BEST1000) && \ - (defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) && \ - (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) -// Resample input buffer size should be (half_of_max_sample_num * -// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE). half_of_max_sample_num = 48000 / -// 1000 * CODEC_BUFF_FRAME_NUM / 2 * 48 / 44 -#define RESAMPLE_INPUT_BUFF_SIZE \ - ALIGN(48000 / 1000 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE * \ - CODEC_BUFF_FRAME_NUM / 2 * 48 / 44, \ - 4) -#else -#define RESAMPLE_INPUT_BUFF_SIZE 0 -#endif -// Resample history buffer size should be -// sizeof(struct RESAMPLE_CTRL_T) + ((SAMPLE_NUM + phase_coef_num) * -// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) -#define RESAMPLE_HISTORY_BUFF_SIZE \ - (50 + (256 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE)) -#define USB_AUDIO_RESAMPLE_BUFF_SIZE \ - (RESAMPLE_INPUT_BUFF_SIZE + RESAMPLE_HISTORY_BUFF_SIZE) - -#define ALIGNED4 ALIGNED(4) - -#if defined(USB_AUDIO_APP) || defined(DUALADC_AUDIO_TEST) - -#ifdef AUDIO_ANC_FB_MC -static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE * - 9]; // max 48->384 or 44.1->44.1*8; -#else -static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE]; -#endif - -static uint8_t ALIGNED4 capture_buff[USB_AUDIO_CAPTURE_BUFF_SIZE]; - -#endif - -#ifdef USB_AUDIO_APP - -#if defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 - eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE + USB_AUDIO_IIR_EQ_BUFF_SIZE]; -#elif defined(__HW_FIR_EQ_PROCESS__) && !defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE]; -#elif !defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__) -static uint8_t ALIGNED4 eq_buff[USB_AUDIO_IIR_EQ_BUFF_SIZE]; -#else -static uint8_t ALIGNED4 eq_buff[0]; -#endif - -#ifdef SW_CAPTURE_RESAMPLE -static uint8_t ALIGNED4 resample_buff[USB_AUDIO_RESAMPLE_BUFF_SIZE]; -#else -static uint8_t ALIGNED4 resample_buff[0]; -#endif - -static uint8_t ALIGNED4 recv_buff[USB_AUDIO_RECV_BUFF_SIZE]; -static uint8_t ALIGNED4 send_buff[USB_AUDIO_SEND_BUFF_SIZE]; - -#ifdef USB_AUDIO_MULTIFUNC -static uint8_t ALIGNED4 recv2_buff[USB_AUDIO_RECV_BUFF_SIZE]; -#endif - -#endif - -#ifdef CFG_HW_KEY_LED_PIN -const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_key_led[1] = { - {CFG_HW_KEY_LED_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, - HAL_IOMUX_PIN_NOPULL}, -}; -#endif - -#ifdef CFG_MIC_KEY -extern void mic_key_open(void); -#endif - -static void uart_i2c_switch(void) { - static int flag = 0; - - flag ^= 1; - - if (flag) { - hal_iomux_set_analog_i2c(); - } else { - hal_iomux_set_uart0(); - } -} - -static int key_event_process(uint32_t key_code, uint8_t key_event) { - TRACE(3, "%s: code=0x%X, event=%u", __FUNCTION__, key_code, key_event); - -#ifdef CFG_HW_KEY_LED_PIN - if (key_event == HAL_KEY_EVENT_DOWN) { - hal_gpio_pin_set(CFG_HW_KEY_LED_PIN); - } else if (key_event == HAL_KEY_EVENT_UP) { - hal_gpio_pin_clr(CFG_HW_KEY_LED_PIN); - } -#endif - -#ifdef USB_AUDIO_APP - if (usb_audio_app_key(key_code, key_event) == 0) { - return 0; - } -#endif - -#ifdef ANC_APP - if (anc_usb_app_key(key_code, key_event) == 0) { - return 0; - } -#endif - - if (key_event == HAL_KEY_EVENT_CLICK) { - if (key_code == HAL_KEY_CODE_FN9) { - uart_i2c_switch(); - } - } - - return 0; -} - -void anc_usb_open(void) { - TRACE(1, "%s", __FUNCTION__); - -#ifdef __AUDIO_RESAMPLE__ - hal_cmu_audio_resample_enable(); -#endif -#ifdef USB_AUDIO_APP - struct USB_AUDIO_BUF_CFG cfg; - - memset(&cfg, 0, sizeof(cfg)); - cfg.play_buf = playback_buff; -#ifdef AUDIO_ANC_FB_MC - cfg.play_size = sizeof(playback_buff) / 9; -#else - cfg.play_size = sizeof(playback_buff); -#endif - cfg.cap_buf = capture_buff; - cfg.cap_size = sizeof(capture_buff); - cfg.recv_buf = recv_buff; - cfg.recv_size = sizeof(recv_buff); - cfg.send_buf = send_buff; - cfg.send_size = sizeof(send_buff); - cfg.eq_buf = eq_buff; - cfg.eq_size = sizeof(eq_buff); - cfg.resample_buf = resample_buff; - cfg.resample_size = sizeof(resample_buff); -#ifdef USB_AUDIO_MULTIFUNC - cfg.recv2_buf = recv2_buff; - cfg.recv2_size = sizeof(recv2_buff); -#endif - - usb_audio_app_init(&cfg); - usb_audio_app(true); -#endif - -#ifdef ANC_APP - anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, SAMPLE_RATE_PLAYBACK, - SAMPLE_RATE_CAPTURE); -#endif - -#ifdef DUALADC_AUDIO_TEST - dualadc_audio_app_init(playback_buff, USB_AUDIO_PLAYBACK_BUFF_SIZE, - capture_buff, USB_AUDIO_CAPTURE_BUFF_SIZE); - dualadc_audio_app(true); -#endif - -#ifdef ADDA_LOOP_APP - adda_loop_app(true); -#endif - -#if defined(_VENDOR_MSG_SUPPT_) -#ifndef USB_ANC_MC_EQ_TUNING - vendor_info_init(); -#endif -#endif - -#if defined(CFG_MIC_KEY) - mic_key_open(); -#endif - - // Allow sleep - hal_sysfreq_req(HAL_SYSFREQ_USER_INIT, HAL_CMU_FREQ_32K); - - while (1) { -#ifdef USB_AUDIO_APP - usb_audio_app_loop(); -#endif - -#ifdef ANC_APP - anc_usb_app_loop(); -#endif - -#ifdef ADDA_LOOP_APP - adda_loop_app_loop(); -#endif - -#ifdef RTOS - // Let the task sleep - osDelay(20); -#else // !RTOS - -#ifdef USB_EQ_TUNING - audio_eq_usb_eq_update(); -#endif - - hal_sleep_enter_sleep(); - -#endif // !RTOS - } -} - -#ifdef CFG_HW_GPADCKEY -void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt) { - static uint16_t stable_cnt = 0; - static uint16_t click_cnt = 0; - static uint32_t click_time; - uint32_t time; - enum HAL_KEY_EVENT_T event; - bool send_event = false; - - time = hal_sys_timer_get(); - - if (volt < 100) { - stable_cnt++; - // TRACE(5,"adc_key down: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - } else { - if (stable_cnt > 1) { - // TRACE(5,"adc_key up: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - if (click_cnt == 0 || (time - click_time) < MS_TO_TICKS(500)) { - click_time = time; - click_cnt++; - if (click_cnt >= 3) { - send_event = true; - } - } else { - send_event = true; - } - } - stable_cnt = 0; - - if (click_cnt > 0 && (time - click_time) >= MS_TO_TICKS(500)) { - send_event = true; - } - - if (send_event) { - // TRACE(5,"adc_key click: volt=%u stable=%u click_cnt=%u click_time=%u - // time=%u", volt, stable_cnt, click_cnt, click_time, time); - if (click_cnt == 1) { - event = HAL_KEY_EVENT_CLICK; - } else if (click_cnt == 2) { - event = HAL_KEY_EVENT_DOUBLECLICK; - } else { - event = HAL_KEY_EVENT_TRIPLECLICK; - } - key_event_process(CFG_HW_GPADCKEY, event); - click_cnt = 0; - } - } -} -#endif - -#ifdef DEBUG_MODE_USB_DOWNLOAD -static void process_usb_download_mode(void) { - if (pmu_charger_get_status() == PMU_CHARGER_PLUGIN && hal_pwrkey_pressed()) { - hal_sw_bootmode_set(HAL_SW_BOOTMODE_FORCE_USB_DLD); - hal_cmu_sys_reboot(); - } -} -#endif - -// GDB can set a breakpoint on the main function only if it is -// declared as below, when linking with STD libraries. -int MAIN_ENTRY(void) { -#ifdef INTSRAM_RUN -// hal_norflash_sleep(HAL_NORFLASH_ID_0); -#endif - -#ifdef DEBUG_MODE_USB_DOWNLOAD - process_usb_download_mode(); -#endif - - hal_cmu_simu_init(); - hwtimer_init(); - hal_audma_open(); - hal_gpdma_open(); - -#if (DEBUG_PORT == 2) - hal_iomux_set_analog_i2c(); - hal_iomux_set_uart1(); - hal_trace_open(HAL_TRACE_TRANSPORT_UART1); -#else - hal_iomux_set_uart0(); - hal_trace_open(HAL_TRACE_TRANSPORT_UART0); -#endif - -#if !defined(SIMU) - uint8_t flash_id[HAL_NORFLASH_DEVICE_ID_LEN]; - hal_norflash_get_id(HAL_NORFLASH_ID_0, flash_id, ARRAY_SIZE(flash_id)); - TRACE(3, "FLASH_ID: %02X-%02X-%02X", flash_id[0], flash_id[1], flash_id[2]); -#endif - - pmu_open(); - analog_open(); - af_open(); - hal_sleep_start_stats(10000, 10000); - -#ifdef CHIP_BEST1000 - hal_cmu_force_bt_sleep(); -#endif - - hal_key_open(0, key_event_process); -#ifdef CFG_HW_GPADCKEY - hal_gpadc_open(HAL_GPADC_CHAN_3, HAL_GPADC_ATP_20MS, gpadc_key_handler); -#endif - -#ifdef CFG_HW_KEY_LED_PIN - hal_iomux_init(pinmux_key_led, ARRAY_SIZE(pinmux_key_led)); - hal_gpio_pin_set_dir(CFG_HW_KEY_LED_PIN, HAL_GPIO_DIR_OUT, 0); -#endif - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_DAC_IIR_EQ_PROCESS__) || defined(__HW_IIR_EQ_PROCESS__) - audio_process_init(); - // TODO: Get EQ store parameter - // audio_eq_fir_update_cfg(int16_t *coef, int16_t num); - // audio_eq_iir_update_cfg(int *gain, int num); -#endif - - anc_usb_open(); - - TRACE(0, "byebye~~~\n"); - - hal_sys_timer_delay(MS_TO_TICKS(200)); - - pmu_shutdown(); - - return 0; -} - -//-------------------------------------------------------------------------------- -// Start of Programmer Entry -//-------------------------------------------------------------------------------- -#ifdef PROGRAMMER -#include "cmsis_nvic.h" -#include "hal_chipid.h" -#include "tool_msg.h" - -extern uint32_t __StackTop[]; -extern uint32_t __StackLimit[]; -extern uint32_t __bss_start__[]; -extern uint32_t __bss_end__[]; - -#define EXEC_STRUCT_LOC __attribute__((section(".exec_struct"))) - -bool task_yield(void) { return true; } - -void anc_usb_ramrun_main(void) { - uint32_t *dst; - - for (dst = __bss_start__; dst < __bss_end__; dst++) { - *dst = 0; - } - - NVIC_InitVectors(); -#ifdef UNALIGNED_ACCESS - SystemInit(); -#endif - hal_cmu_setup(); - main(); - -#if !defined(PROGRAMMER_INFLASH) - SAFE_PROGRAM_STOP(); -#endif -} - -void anc_usb_ramrun_start(void) { - GotBaseInit(); -#ifdef __ARM_ARCH_8M_MAIN__ - __set_MSPLIM((uint32_t)__StackLimit); -#endif - __set_MSP((uint32_t)__StackTop); - anc_usb_ramrun_main(); -} - -const struct exec_struct_t EXEC_STRUCT_LOC ramrun_struct = { - .entry = (uint32_t)anc_usb_ramrun_start, - .param = 0, - .sp = 0, - .exec_addr = (uint32_t)&ramrun_struct, -}; - -void programmer_start(void) __attribute__((weak, alias("anc_usb_ramrun_main"))); -#endif -//-------------------------------------------------------------------------------- -// End of Programmer Entry -//-------------------------------------------------------------------------------- diff --git a/tests/anc_usb/memutils.c b/tests/anc_usb/memutils.c deleted file mode 100644 index 48c2374..0000000 --- a/tests/anc_usb/memutils.c +++ /dev/null @@ -1,87 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "memutils.h" -#include "plat_types.h" -#include "string.h" - -#define ALIGNED32(a) (((uint32_t)(a)&3) == 0) -#define ALIGNED16(a) (((uint32_t)(a)&1) == 0) - -void *copy_mem32(void *dst, const void *src, unsigned int size) { - uint32_t *d = dst; - const uint32_t *s = src; - const uint32_t *e = s + size / 4; - - while (s < e) { - *d++ = *s++; - } - - return dst; -} - -void *copy_mem16(void *dst, const void *src, unsigned int size) { - uint16_t *d = dst; - const uint16_t *s = src; - const uint16_t *e = s + size / 2; - - while (s < e) { - *d++ = *s++; - } - - return dst; -} - -void *copy_mem(void *dst, const void *src, unsigned int size) { - if (ALIGNED32(dst) && ALIGNED32(src) && ALIGNED32(size)) { - return copy_mem32(dst, src, size); - } else if (ALIGNED16(dst) && ALIGNED16(src) && ALIGNED16(size)) { - return copy_mem16(dst, src, size); - } else { - return memcpy(dst, src, size); - } -} - -void *zero_mem32(void *dst, unsigned int size) { - uint32_t *d = dst; - uint32_t count = size / 4; - - while (count--) { - *d++ = 0; - } - - return dst; -} - -void *zero_mem16(void *dst, unsigned int size) { - uint16_t *d = dst; - uint32_t count = size / 2; - - while (count--) { - *d++ = 0; - } - - return dst; -} - -void *zero_mem(void *dst, unsigned int size) { - if (ALIGNED32(dst) && ALIGNED32(size)) { - return zero_mem32(dst, size); - } else if (ALIGNED16(dst) && ALIGNED16(size)) { - return zero_mem16(dst, size); - } else { - return memset(dst, 0, size); - } -} diff --git a/tests/anc_usb/memutils.h b/tests/anc_usb/memutils.h deleted file mode 100644 index a9f0580..0000000 --- a/tests/anc_usb/memutils.h +++ /dev/null @@ -1,32 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __MEMUTILS_H__ -#define __MEMUTILS_H__ - -void *copy_mem32(void *dst, const void *src, unsigned int size); - -void *copy_mem16(void *dst, const void *src, unsigned int size); - -void *copy_mem(void *dst, const void *src, unsigned int size); - -void *zero_mem32(void *dst, unsigned int size); - -void *zero_mem16(void *dst, unsigned int size); - -void *zero_mem(void *dst, unsigned int size); - -#endif - diff --git a/tests/anc_usb/mic_key.c b/tests/anc_usb/mic_key.c deleted file mode 100644 index 6a11a23..0000000 --- a/tests/anc_usb/mic_key.c +++ /dev/null @@ -1,149 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifdef CFG_MIC_KEY - -#include "analog.h" -#include "hal_gpadc.h" -#include "hal_iomux.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "hwtimer_list.h" -#include "tgt_hardware.h" -#include "usb_audio.h" - -#define MIC_KEY_CHK_TIMES 20 -#define MIC_KEY_SKIP_CNT 8 -#define MIC_KEY_CHK_INTERVAL MS_TO_TICKS(1) // in ticks - -static struct { - HWTIMER_ID chk_timer; - - uint16_t chk_val[MIC_KEY_CHK_TIMES - MIC_KEY_SKIP_CNT]; - - uint8_t chk_times; - uint8_t gpio_dn; - uint8_t key_dn[MIC_KEY_NUM]; -} s_mic_key_ctx; - -extern void mic_key_gpio_irq_set(void); - -void mic_key_irq_hdl(uint16_t irq_val, HAL_GPADC_MV_T volt) { - hal_gpadc_close(mic_key_gpadc_chan); - - if (++s_mic_key_ctx.chk_times >= MIC_KEY_CHK_TIMES) { - - uint8_t i, j; - uint32_t mean; - - for (i = 0; i < MIC_KEY_NUM; i++) { - mean = 0; - - for (j = 0; j < MIC_KEY_CHK_TIMES - MIC_KEY_SKIP_CNT; j++) { - mean += (uint32_t)s_mic_key_ctx.chk_val[j]; - } - mean /= MIC_KEY_CHK_TIMES - MIC_KEY_SKIP_CNT; - - if ((mean > mic_key_cfg_lst[i].ref_vol_low) && - (mean <= mic_key_cfg_lst[i].ref_vol_high)) - break; - } - - if (i < MIC_KEY_NUM) { - TRACE(2, "ana_key: key[%d] matched at [%dmv]", i, mean); - usb_audio_hid_set_event(mic_key_cfg_lst[i].hid_evt, 1); - s_mic_key_ctx.key_dn[i] = 1; - } else { - TRACE(1, "ana_key: no key matched [%dmv]", mean); - } - - return; - } - - if (s_mic_key_ctx.chk_times > MIC_KEY_SKIP_CNT) { - s_mic_key_ctx.chk_val[s_mic_key_ctx.chk_times - MIC_KEY_SKIP_CNT - 1] = - volt; - } - - hwtimer_start(s_mic_key_ctx.chk_timer, MIC_KEY_CHK_INTERVAL); -} - -void mic_key_gpio_det_irq_hdl(enum HAL_GPIO_PIN_T pin) { - if (pin != mic_key_det_gpio_pin) - return; - - TRACE(1, "GPIO detected at status[%d]", s_mic_key_ctx.gpio_dn); - if (s_mic_key_ctx.gpio_dn) { - - uint8_t i; - - for (i = 0; i < MIC_KEY_NUM; i++) { - if (s_mic_key_ctx.key_dn[i]) { - break; - } - } - if (i < MIC_KEY_NUM) { - usb_audio_hid_set_event(mic_key_cfg_lst[i].hid_evt, 0); - s_mic_key_ctx.key_dn[i] = 0; - } - - s_mic_key_ctx.gpio_dn = 0; - } else { - s_mic_key_ctx.chk_times = 0; - s_mic_key_ctx.gpio_dn = 1; - hal_gpadc_open(mic_key_gpadc_chan, HAL_GPADC_ATP_ONESHOT, mic_key_irq_hdl); - } - - mic_key_gpio_irq_set(); -} - -void mic_key_periodic_check(void *param) { - hal_gpadc_open(mic_key_gpadc_chan, HAL_GPADC_ATP_ONESHOT, mic_key_irq_hdl); -} - -void mic_key_gpio_irq_set(void) { - struct HAL_GPIO_IRQ_CFG_T cfg; - - cfg.irq_debounce = 1; - cfg.irq_enable = 1; - cfg.irq_type = HAL_GPIO_IRQ_TYPE_EDGE_SENSITIVE; - if (s_mic_key_ctx.gpio_dn) { - cfg.irq_polarity = HAL_GPIO_IRQ_POLARITY_HIGH_RISING; - } else { - cfg.irq_polarity = HAL_GPIO_IRQ_POLARITY_LOW_FALLING; - } - cfg.irq_handler = mic_key_gpio_det_irq_hdl; - - hal_gpio_setup_irq(mic_key_det_gpio_pin, &cfg); -} - -void mic_key_open(void) { - struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_key_det[] = { - {0, HAL_IOMUX_FUNC_GPIO, HAL_IOMUX_PIN_VOLTAGE_MEM, HAL_IOMUX_PIN_NOPULL}, - }; - - TRACE(1, "%s", __func__); - - pinmux_key_det[0].pin = mic_key_det_gpio_pin; - hal_iomux_init(pinmux_key_det, ARRAY_SIZE(pinmux_key_det)); - - analog_aud_mickey_enable(true); - - s_mic_key_ctx.chk_timer = hwtimer_alloc(mic_key_periodic_check, NULL); - hal_gpio_pin_set_dir(mic_key_det_gpio_pin, HAL_GPIO_DIR_IN, 0); - mic_key_gpio_irq_set(); -} - -#endif diff --git a/tests/anc_usb/safe_queue.c b/tests/anc_usb/safe_queue.c deleted file mode 100644 index c8ad328..0000000 --- a/tests/anc_usb/safe_queue.c +++ /dev/null @@ -1,156 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "safe_queue.h" -#include "cmsis.h" -#include "hal_trace.h" - -void safe_queue_init(struct SAFE_QUEUE_T *queue, uint32_t *items, - uint32_t size) { - // queue->first points to the first valid item - queue->first = 0; - // queue->last points to the first empty slot (beyond the last valid item) - queue->last = 0; - queue->count = 0; - queue->size = size; - queue->watermark = 0; - queue->items = items; -} - -int safe_queue_put(struct SAFE_QUEUE_T *queue, uint32_t item) { - int ret = 0; - uint32_t lock; - - lock = int_lock(); - - if (queue->count >= queue->size) { - ret = 1; - } else { - queue->items[queue->last] = item; - queue->last++; - if (queue->last >= queue->size) { - queue->last = 0; - } - - queue->count++; - if (queue->count > queue->watermark) { - queue->watermark = queue->count; - } - } - - int_unlock(lock); - - return ret; -} - -int safe_queue_get(struct SAFE_QUEUE_T *queue, uint32_t *itemp) { - int ret = 0; - uint32_t lock; - - lock = int_lock(); - - if (queue->count == 0) { - ret = 1; - } else { - if (itemp) { - *itemp = queue->items[queue->first]; - } - queue->first++; - if (queue->first >= queue->size) { - queue->first = 0; - } - - queue->count--; - } - - int_unlock(lock); - - return ret; -} - -int safe_queue_pop(struct SAFE_QUEUE_T *queue, uint32_t *itemp) { - int ret = 0; - uint32_t lock; - - lock = int_lock(); - - if (queue->count == 0) { - ret = 1; - } else { - if (queue->last) { - queue->last--; - } else { - queue->last = queue->size - 1; - } - if (itemp) { - *itemp = queue->items[queue->last]; - } - - queue->count--; - } - - int_unlock(lock); - - return ret; -} - -int safe_queue_peek(const struct SAFE_QUEUE_T *queue, int offset, - uint32_t *itemp) { - int ret = 0; - uint32_t lock; - uint8_t idx; - - lock = int_lock(); - - if (offset >= 0 && offset < queue->count) { - idx = queue->first + offset; - } else if (offset < 0 && -offset <= queue->count) { - idx = queue->size + queue->last + offset; - } else { - ret = 1; - } - - if (ret == 0) { - if (idx >= queue->size) { - idx -= queue->size; - } - - *itemp = queue->items[idx]; - } - - int_unlock(lock); - - return ret; -} - -uint32_t safe_queue_watermark(const struct SAFE_QUEUE_T *queue) { - return queue->watermark; -} - -int safe_queue_dump(const struct SAFE_QUEUE_T *queue) { - uint32_t cnt; - int i; - uint32_t item; - - cnt = queue->count; - for (i = 0; i < cnt; i++) { - if (safe_queue_peek(queue, i, &item)) { - break; - } - TRACE_IMM(3, "SAFE-QUEUE-DUMP: [%02d/%02d] 0x%08x", i, cnt, item); - } - - return 0; -} diff --git a/tests/anc_usb/safe_queue.h b/tests/anc_usb/safe_queue.h deleted file mode 100644 index a5abf95..0000000 --- a/tests/anc_usb/safe_queue.h +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __SAFE_QUEUE_H__ -#define __SAFE_QUEUE_H__ - -#include "plat_types.h" - -struct SAFE_QUEUE_T { - uint8_t first; - uint8_t last; - uint8_t count; - uint8_t size; - uint8_t watermark; - uint32_t *items; -}; - -void safe_queue_init(struct SAFE_QUEUE_T *queue, uint32_t *items, uint32_t size); - -int safe_queue_put(struct SAFE_QUEUE_T *queue, uint32_t item); - -int safe_queue_get(struct SAFE_QUEUE_T *queue, uint32_t *itemp); - -int safe_queue_pop(struct SAFE_QUEUE_T *queue, uint32_t *itemp); - -int safe_queue_peek(const struct SAFE_QUEUE_T *queue, int offset, uint32_t *itemp); - -uint32_t safe_queue_watermark(const struct SAFE_QUEUE_T *queue); - -int safe_queue_dump(const struct SAFE_QUEUE_T *queue); - -#endif diff --git a/tests/anc_usb/speech_process.c b/tests/anc_usb/speech_process.c deleted file mode 100644 index 89a56a6..0000000 --- a/tests/anc_usb/speech_process.c +++ /dev/null @@ -1,279 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "speech_process.h" -#include "cmsis.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" - -#if defined(SPEECH_TX_AEC2FLOAT) && !defined(KEEP_SAME_LATENCY) -#error "capture/playback size should be equal when enable AEC" -#endif - -#include "bt_sco_chain.h" -#include "iir_resample.h" -#include "speech_memory.h" -#include "speech_utils.h" - -#define MED_MEM_POOL_SIZE (1024 * 160) -static uint8_t g_medMemPool[MED_MEM_POOL_SIZE]; - -#define FFSE_SAMPLE_RATE (16000) - -int capture_channel_num = 1; -int capture_sample_rate = 48000; -int capture_sample_bit = 16; -int playback_channel_num = 2; -int playback_sample_rate = 48000; -int playback_sample_bit = 24; - -int send_channel_num = 2; -int recv_channel_num = 2; - -// resample related -static bool resample_needed_flag = false; -static IirResampleState *upsample_st; -static IirResampleState *downsample_st[4]; -int16_t *capture_buffer_deinter = NULL; -int16_t *process_buffer = NULL; -int16_t *process_buffer_inter = NULL; - -static short *aec_echo_buf = NULL; -static IirResampleState *rx_downsample_st; - -static volatile bool is_speech_init = false; - -static void speech_deinterleave(int16_t *in, int16_t *out, int len, - int ch_num) { - int len_per_channel = len / ch_num; - - for (int i = 0, j = 0; i < len; i += ch_num, j++) { - int16_t *pout = &out[j]; - int16_t *pin = &in[i]; - for (int c = 0; c < ch_num; c++) { - *pout = *pin; - pout += len_per_channel; - pin += 1; - } - } -} - -static void speech_interleave(int16_t *in, int16_t *out, int len, int ch_num) { - int len_per_channel = len / ch_num; - - for (int i = 0, j = 0; j < len; i++, j += ch_num) { - int16_t *pout = &out[j]; - int16_t *pin = &in[i]; - for (int c = 0; c < ch_num; c++) { - *pout = *pin; - pout += 1; - pin += len_per_channel; - } - } -} - -static void speech_extend(int16_t *in, int16_t *out, int len, int ch_num) { - int16_t *pout = out + len * ch_num - 1; - for (int i = len - 1; i >= 0; i--) { - for (int c = 0; c < ch_num; c++) { - *pout-- = in[i]; - } - } -} - -// This function output remains the same sample rate as input, -// output channel number shoule be CHAN_NUM_SEND. -// TODO: add multi-channel support in iir resampler -void speech_process_capture_run(uint8_t *buf, uint32_t *len) { - // TRACE(2,"[%s], pcm_len: %d", __FUNCTION__, *len / 2); - - if (is_speech_init == false) - return; - - int16_t *pcm_buf = (int16_t *)buf; - int pcm_len = *len / 2; - int process_len = pcm_len * FFSE_SAMPLE_RATE / capture_sample_rate; - - if (resample_needed_flag == true) { - if (capture_channel_num > 1) - speech_deinterleave(pcm_buf, capture_buffer_deinter, pcm_len, - capture_channel_num); - else - speech_copy_int16(capture_buffer_deinter, pcm_buf, pcm_len); - - int in_len_per_channel = pcm_len / capture_channel_num; - int out_len_per_channel = process_len / capture_channel_num; - for (int i = 0; i < capture_channel_num; i++) { - iir_resample_process( - downsample_st[i], &capture_buffer_deinter[i * in_len_per_channel], - &process_buffer[i * out_len_per_channel], in_len_per_channel); - } - - if (capture_channel_num > 1) - speech_interleave(process_buffer, process_buffer_inter, process_len, - capture_channel_num); - else - speech_copy_int16(process_buffer_inter, process_buffer, process_len); - - speech_tx_process(process_buffer_inter, aec_echo_buf, &process_len); - - iir_resample_process(upsample_st, process_buffer_inter, pcm_buf, - process_len); - - if (send_channel_num > 1) - speech_extend(pcm_buf, pcm_buf, in_len_per_channel, send_channel_num); - } else { - speech_tx_process(pcm_buf, aec_echo_buf, &process_len); - - if (send_channel_num > 1) - speech_extend(pcm_buf, pcm_buf, process_len, send_channel_num); - } - - pcm_len = pcm_len / capture_channel_num * send_channel_num; - *len = pcm_len * sizeof(int16_t); -} - -void speech_process_playback_run(uint8_t *buf, uint32_t *len) { - // TRACE(2,"[%s] pcm_len: %d", __FUNCTION__, *len / 2); - - if (is_speech_init == false) - return; - -#if defined(SPEECH_TX_AEC2FLOAT) - int16_t *pcm_buf = (int16_t *)buf; - int pcm_len = *len / 2; - - if (resample_needed_flag == true) { - // Convert to 16bit if necessary - if (playback_sample_bit == 24) { - int32_t *pcm32 = (int32_t *)buf; - for (int i = 0; i < pcm_len / 2; i++) { - pcm_buf[i] = (pcm32[i] >> 8); - } - pcm_len >>= 1; - } - - // Convert to mono if necessary, choose left channel - if (playback_channel_num == 2) { - for (int i = 0, j = 0; i < pcm_len; i += 2, j++) - pcm_buf[j] = pcm_buf[i]; - pcm_len >>= 1; - } - - iir_resample_process(rx_downsample_st, pcm_buf, pcm_buf, pcm_len); - } - speech_copy_int16(aec_echo_buf, pcm_buf, - pcm_len * FFSE_SAMPLE_RATE / capture_sample_rate); -#endif -} - -void speech_process_init(int tx_sample_rate, int tx_channel_num, - int tx_sample_bit, int rx_sample_rate, - int rx_channel_num, int rx_sample_bit, int tx_frame_ms, - int rx_frame_ms, int tx_send_channel_num, - int rx_recv_channel_num) { - ASSERT(tx_sample_rate == 16000 || tx_sample_rate == 48000, - "[%s] sample rate(%d) not supported", __FUNCTION__, tx_sample_rate); - ASSERT(tx_frame_ms == 16, "[%s] just support 16ms frame", __func__); - - capture_sample_rate = tx_sample_rate; - capture_channel_num = tx_channel_num; - capture_sample_bit = tx_sample_bit; - playback_sample_rate = rx_sample_rate; - playback_channel_num = rx_channel_num; - playback_sample_bit = rx_sample_bit; - - send_channel_num = tx_send_channel_num; - recv_channel_num = rx_recv_channel_num; - - resample_needed_flag = (capture_sample_rate != FFSE_SAMPLE_RATE); - - TRACE(5, - "[%s] sample_rate: %d, frame_ms: %d, channel_num: %d, " - "resample_needed_flag: %d", - __FUNCTION__, tx_sample_rate, tx_frame_ms, tx_channel_num, - resample_needed_flag); - - speech_init(FFSE_SAMPLE_RATE, FFSE_SAMPLE_RATE, tx_frame_ms, tx_frame_ms, - tx_frame_ms, &g_medMemPool[0], MED_MEM_POOL_SIZE); - - if (resample_needed_flag == true) { - capture_buffer_deinter = - speech_calloc(SPEECH_FRAME_MS_TO_LEN(capture_sample_rate, tx_frame_ms) * - capture_channel_num, - sizeof(int16_t)); - - // Resample state must be created after speech init, as it uses speech heap - process_buffer = - speech_calloc(SPEECH_FRAME_MS_TO_LEN(FFSE_SAMPLE_RATE, tx_frame_ms) * - capture_channel_num, - sizeof(int16_t)); - process_buffer_inter = - speech_calloc(SPEECH_FRAME_MS_TO_LEN(FFSE_SAMPLE_RATE, tx_frame_ms) * - capture_channel_num, - sizeof(int16_t)); - - upsample_st = iir_resample_init( - SPEECH_FRAME_MS_TO_LEN(FFSE_SAMPLE_RATE, tx_frame_ms), - iir_resample_choose_mode(FFSE_SAMPLE_RATE, capture_sample_rate)); - - // as iir resample can only deal with mono signal, we should init - // channel_num states - for (int i = 0; i < capture_channel_num; i++) { - downsample_st[i] = iir_resample_init( - SPEECH_FRAME_MS_TO_LEN(capture_sample_rate, tx_frame_ms), - iir_resample_choose_mode(capture_sample_rate, FFSE_SAMPLE_RATE)); - } - - // - aec_echo_buf = speech_calloc( - SPEECH_FRAME_MS_TO_LEN(FFSE_SAMPLE_RATE, rx_frame_ms), sizeof(int16_t)); - rx_downsample_st = iir_resample_init( - SPEECH_FRAME_MS_TO_LEN(playback_sample_rate, rx_frame_ms), - iir_resample_choose_mode(playback_sample_rate, FFSE_SAMPLE_RATE)); - } - - is_speech_init = true; -} - -void speech_process_deinit(void) { - if (is_speech_init == false) - return; - - if (resample_needed_flag == true) { - speech_free(capture_buffer_deinter); - - speech_free(process_buffer); - speech_free(process_buffer_inter); - - iir_resample_destroy(upsample_st); - - for (int i = 0; i < capture_channel_num; i++) { - iir_resample_destroy(downsample_st[i]); - } - - speech_free(aec_echo_buf); - iir_resample_destroy(rx_downsample_st); - - resample_needed_flag = false; - } - - speech_deinit(); - - is_speech_init = false; -} - -enum HAL_CMU_FREQ_T speech_process_need_freq(void) { return HAL_CMU_FREQ_208M; } diff --git a/tests/anc_usb/speech_process.h b/tests/anc_usb/speech_process.h deleted file mode 100644 index 004b297..0000000 --- a/tests/anc_usb/speech_process.h +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __SPEECH_PROCESS_H__ -#define __SPEECH_PROCESS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" -#include "hal_sysfreq.h" - -enum HAL_CMU_FREQ_T speech_process_need_freq(void); - -void speech_process_init(int tx_sample_rate, int tx_channel_num, int tx_sample_bit, - int rx_sample_rate, int rx_channel_num, int rx_sample_bit, - int tx_frame_ms, int rx_frame_ms, - int tx_send_channel_num, int rx_recv_channel_num); -void speech_process_deinit(void); -void speech_process_capture_run(uint8_t *buf, uint32_t *len); -void speech_process_playback_run(uint8_t *buf, uint32_t *len); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/anc_usb/usb_audio_app.c b/tests/anc_usb/usb_audio_app.c deleted file mode 100644 index 61c6efa..0000000 --- a/tests/anc_usb/usb_audio_app.c +++ /dev/null @@ -1,6410 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#include "usb_audio_app.h" -#include "analog.h" -#include "audio_resample_ex.h" -#include "audioflinger.h" -#include "cmsis.h" -#include "hal_aud.h" -#include "hal_codec.h" -#include "hal_location.h" -#include "hal_sleep.h" -#include "hal_sysfreq.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "memutils.h" -#include "pmu.h" -#include "resample_coef.h" -#include "safe_queue.h" -#include "string.h" -#include "tgt_hardware.h" -#include "usb_audio.h" -#include "usb_audio_frm_defs.h" -#include "usb_audio_sync.h" - -#ifdef _VENDOR_MSG_SUPPT_ -#include "usb_vendor_msg.h" -#endif - -#if defined(USB_AUDIO_SPEECH) -#include "app_overlay.h" -#include "speech_process.h" -#endif - -#if defined(__HW_FIR_DSD_PROCESS__) -#include "dsd_process.h" -#endif - -#if defined(AUDIO_ANC_FB_MC) -#include "anc_process.h" -#endif - -#include "hw_codec_iir_process.h" -#include "hw_iir_process.h" - -#ifdef __AUDIO_RESAMPLE__ -#ifdef SW_PLAYBACK_RESAMPLE -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) -#error "Software playback resample conflicts with ANC/AuxMic" -#endif -#else -#ifdef CHIP_BEST1000 -#error "No hardware playback resample support" -#endif -#endif - -#ifndef SW_CAPTURE_RESAMPLE -#if defined(CHIP_BEST1000) || defined(CHIP_BEST2000) -#error "No hardware capture resample support" -#endif -#endif -#endif // __AUDIO_RESAMPLE__ - -#ifdef CODEC_DSD -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_IIR_EQ_PROCESS__) || defined(__HW_DAC_IIR_EQ_PROCESS__) -#error "EQ conflicts with CODEC_DSD" -#endif -#ifdef FREQ_RESP_EQ -#error "FREQ_RESP_EQ conflicts with CODEC_DSD" -#endif -#ifdef __HW_FIR_DSD_PROCESS__ -#error "__HW_FIR_DSD_PROCESS__ conflicts with CODEC_DSD" -#endif -#ifdef AUDIO_ANC_FB_MC -#error "AUDIO_ANC_FB_MC conflicts with CODEC_DSD" -#endif -#ifdef NOISE_GATING -#error "NOISE_GATING conflicts with CODEC_DSD" -#endif -#ifdef NOISE_REDUCTION -#error "NOISE_REDUCTION conflicts with CODEC_DSD" -#endif -#endif - -#if defined(__SW_IIR_EQ_PROCESS__) -static uint8_t audio_eq_sw_iir_index = 0; -extern const IIR_CFG_T *const audio_eq_sw_iir_cfg_list[]; -#endif - -#if defined(__HW_FIR_EQ_PROCESS__) -static uint8_t audio_eq_hw_fir_index = 0; -extern const FIR_CFG_T *const audio_eq_hw_fir_cfg_list[]; -#endif - -#if defined(__HW_DAC_IIR_EQ_PROCESS__) -static uint8_t audio_eq_hw_dac_iir_index = 0; -extern const IIR_CFG_T *const audio_eq_hw_dac_iir_cfg_list[]; -#endif - -#if defined(__HW_IIR_EQ_PROCESS__) -static uint8_t audio_eq_hw_iir_index = 0; -extern const IIR_CFG_T *const audio_eq_hw_iir_cfg_list[]; -#endif - -#define KEY_TRACE -//#define UNMUTE_WHEN_SET_VOL -#define STREAM_RATE_BITS_SETUP - -#if defined(USB_AUDIO_DYN_CFG) && defined(ANC_L_R_MISALIGN_WORKAROUND) -#ifndef AUDIO_PLAYBACK_24BIT -//#define AUDIO_PLAYBACK_24BIT -#endif -#endif - -#if defined(__HW_FIR_DSD_PROCESS__) || defined(CODEC_DSD) -#define DSD_SUPPORT -#endif - -#ifdef TARGET_TO_MAX_DIFF -#if defined(USB_AUDIO_RECV_ENABLE) && defined(USB_AUDIO_SEND_ENABLE) -#if defined(__AUDIO_RESAMPLE__) && defined(PLL_TUNE_SAMPLE_RATE) -#define UAUD_SYNC_STREAM_TARGET -#else -#error \ - "TARGET_TO_MAX_DIFF can be enabled only with __AUDIO_RESAMPLE__ and PLL_TUNE_SAMPLE_RATE if both playback and capture streams exist" -#endif -#endif - -#ifdef USB_AUDIO_MULTIFUNC -#error "TARGET_TO_MAX_DIFF can NOT be enabled with USB_AUDIO_MULTIFUNC" -#endif -#endif // TARGET_TO_MAX_DIFF - -#define VERBOSE_TRACE 0 // 0xFFFF - -#ifdef TIMER1_BASE -#define TRACE_TIME(num, s, ...) \ - TRACE(num + 1, "[%u] " s, FAST_TICKS_TO_US(hal_fast_sys_timer_get()), \ - ##__VA_ARGS__) -#else -#define TRACE_TIME(num, s, ...) \ - TRACE(num + 1, "[%X] " s, hal_sys_timer_get(), ##__VA_ARGS__) -#endif - -#define USB_AUDIO_CPU_WAKE_USER HAL_CPU_WAKE_LOCK_USER_3 - -#define RECV_PAUSED_SAMPLE_RATE_FLAG (1 << 31) - -#define DIFF_ERR_THRESH_PLAYBACK (sample_rate_recv / 1000 / 2) -#define DIFF_ERR_THRESH_CAPTURE (sample_rate_send / 1000 / 2) - -#define DIFF_SYNC_THRESH_PLAYBACK 10 -#define DIFF_SYNC_THRESH_CAPTURE 10 - -#define DIFF_AVG_CNT 30 - -#define MAX_TARGET_RATIO 0.000020f - -#define MIN_VOLUME_VAL (TGT_VOLUME_LEVEL_MUTE) -#define MAX_VOLUME_VAL (TGT_VOLUME_LEVEL_QTY - 1) - -#define MIN_CAP_VOLUME_VAL (TGT_ADC_VOL_LEVEL_0) -#define MAX_CAP_VOLUME_VAL (TGT_ADC_VOL_LEVEL_QTY - 1) - -#define NOISE_GATING_INTERVAL MS_TO_TICKS(800) -#define NOISE_GATING_THRESH_16BIT 3 // -80dB -#define NOISE_GATING_THRESH_24BIT (NOISE_GATING_THRESH_16BIT << 8) - -#define NOISE_REDUCTION_INTERVAL MS_TO_TICKS(100) -#define NOISE_REDUCTION_MATCH_CNT 200 -#define NOISE_REDUCTION_THRESH_16BIT 100 // -50dB -#define NOISE_REDUCTION_THRESH_24BIT (NOISE_REDUCTION_THRESH_16BIT << 8) - -#define CONFLICT_CMD_TRIG_COUNT 10 -#define CONFLICT_CMD_TRIG_INTERVAL MS_TO_TICKS(20000) -#define CONFLICT_STATE_RESET_INTERVAL MS_TO_TICKS(10000) - -#define CAPTURE_STABLE_INTERVAL MS_TO_TICKS(200) - -#define USB_MAX_XFER_INTERVAL MS_TO_TICKS(10) - -#define USB_XFER_ERR_REPORT_INTERVAL MS_TO_TICKS(5000) - -#define USB_AUDIO_MIN_DBVAL (-99) - -#define USB_AUDIO_VOL_UPDATE_STEP 0.00002 - -#ifndef USB_AUDIO_KEY_MAP -#ifdef ANDROID_ACCESSORY_SPEC -#ifdef ANDROID_VOICE_CMD_KEY -#define USB_AUDIO_KEY_VOICE_CMD \ - { \ - USB_AUDIO_HID_VOICE_CMD, \ - HAL_KEY_CODE_FN4, \ - KEY_EVENT_SET2(DOWN, UP), \ - }, -#else -#define USB_AUDIO_KEY_VOICE_CMD -#endif -#define USB_AUDIO_KEY_MAP \ - { \ - { \ - USB_AUDIO_HID_PLAY_PAUSE, \ - HAL_KEY_CODE_FN1, \ - KEY_EVENT_SET2(DOWN, UP), \ - }, \ - { \ - USB_AUDIO_HID_VOL_UP, \ - HAL_KEY_CODE_FN2, \ - KEY_EVENT_SET2(DOWN, UP), \ - }, \ - { \ - USB_AUDIO_HID_VOL_DOWN, \ - HAL_KEY_CODE_FN3, \ - KEY_EVENT_SET2(DOWN, UP), \ - }, \ - USB_AUDIO_KEY_VOICE_CMD \ - } -#else -#define USB_AUDIO_KEY_MAP \ - { \ - { \ - USB_AUDIO_HID_PLAY_PAUSE, \ - HAL_KEY_CODE_FN1, \ - KEY_EVENT_SET(CLICK), \ - }, \ - { \ - USB_AUDIO_HID_SCAN_NEXT, \ - HAL_KEY_CODE_FN1, \ - KEY_EVENT_SET(DOUBLECLICK), \ - }, \ - { \ - USB_AUDIO_HID_SCAN_PREV, \ - HAL_KEY_CODE_FN1, \ - KEY_EVENT_SET(TRIPLECLICK), \ - }, \ - { \ - USB_AUDIO_HID_VOL_UP, \ - HAL_KEY_CODE_FN2, \ - KEY_EVENT_SET4(CLICK, DOUBLECLICK, TRIPLECLICK, REPEAT), \ - }, \ - { \ - USB_AUDIO_HID_VOL_DOWN, \ - HAL_KEY_CODE_FN3, \ - KEY_EVENT_SET4(CLICK, DOUBLECLICK, TRIPLECLICK, REPEAT), \ - }, \ - { \ - USB_AUDIO_HID_HOOK_SWITCH, \ - HAL_KEY_CODE_FN4, \ - KEY_EVENT_SET(CLICK), \ - }, \ - } -#endif -#endif - -enum AUDIO_CMD_T { - AUDIO_CMD_START_PLAY = 0, - AUDIO_CMD_STOP_PLAY, - AUDIO_CMD_START_CAPTURE, - AUDIO_CMD_STOP_CAPTURE, - AUDIO_CMD_SET_VOLUME, - AUDIO_CMD_SET_CAP_VOLUME, - AUDIO_CMD_MUTE_CTRL, - AUDIO_CMD_CAP_MUTE_CTRL, - AUDIO_CMD_USB_RESET, - AUDIO_CMD_USB_DISCONNECT, - AUDIO_CMD_USB_CONFIG, - AUDIO_CMD_USB_SLEEP, - AUDIO_CMD_USB_WAKEUP, - AUDIO_CMD_RECV_PAUSE, - AUDIO_CMD_RECV_CONTINUE, - AUDIO_CMD_SET_RECV_RATE, - AUDIO_CMD_SET_SEND_RATE, - AUDIO_CMD_RESET_CODEC, - AUDIO_CMD_NOISE_GATING, - AUDIO_CMD_NOISE_REDUCTION, - AUDIO_CMD_TUNE_RATE, - AUDIO_CMD_SET_DSD_CFG, - - TEST_CMD_PERF_TEST_POWER, - TEST_CMD_PA_ON_OFF, - - AUDIO_CMD_QTY -}; - -enum AUDIO_ITF_STATE_T { - AUDIO_ITF_STATE_STOPPED = 0, - AUDIO_ITF_STATE_STARTED, -}; - -enum AUDIO_STREAM_REQ_USER_T { - AUDIO_STREAM_REQ_USB = 0, - AUDIO_STREAM_REQ_ANC, - - AUDIO_STREAM_REQ_USER_QTY, - AUDIO_STREAM_REQ_USER_ALL = AUDIO_STREAM_REQ_USER_QTY, -}; - -enum AUDIO_STREAM_STATUS_T { - AUDIO_STREAM_OPENED = 0, - AUDIO_STREAM_STARTED, - - AUDIO_STREAM_STATUS_QTY -}; - -enum AUDIO_STREAM_RUNNING_T { - AUDIO_STREAM_RUNNING_NULL, - AUDIO_STREAM_RUNNING_ENABLED, - AUDIO_STREAM_RUNNING_DISABLED, -}; - -enum CODEC_CONFIG_LOCK_USER_T { - CODEC_CONFIG_LOCK_RESTART_PLAY, - CODEC_CONFIG_LOCK_RESTART_CAP, - - CODEC_CONFIG_LOCK_USER_QTY -}; - -enum CODEC_MUTE_USER_T { - CODEC_MUTE_USER_CMD, - CODEC_MUTE_USER_NOISE_GATING, - - CODEC_MUTE_USER_QTY, - CODEC_MUTE_USER_ALL = CODEC_MUTE_USER_QTY, -}; - -struct USB_AUDIO_KEY_MAP_T { - enum USB_AUDIO_HID_EVENT_T hid_event; - enum HAL_KEY_CODE_T key_code; - uint32_t key_event_bitset; -}; - -STATIC_ASSERT(8 * sizeof(((struct USB_AUDIO_KEY_MAP_T *)0)->key_event_bitset) >= - HAL_KEY_EVENT_NUM, - "key_event_bitset size is too small"); - -#ifdef USB_AUDIO_DYN_CFG - -static enum AUD_SAMPRATE_T sample_rate_play; -static enum AUD_SAMPRATE_T sample_rate_cap; -static enum AUD_SAMPRATE_T sample_rate_recv; -static enum AUD_SAMPRATE_T sample_rate_send; -static enum AUD_SAMPRATE_T new_sample_rate_recv; -static enum AUD_SAMPRATE_T new_sample_rate_send; -#ifdef AUDIO_PLAYBACK_24BIT -static -#ifndef CODEC_DSD - const -#endif - uint8_t sample_size_play = 4; -#else -static uint8_t sample_size_play; -#endif -static const uint8_t sample_size_cap = SAMPLE_SIZE_CAPTURE; -static uint8_t sample_size_recv; -static const uint8_t sample_size_send = SAMPLE_SIZE_SEND; -static uint8_t new_sample_size_recv; - -#else // !USB_AUDIO_DYN_CFG - -static const enum AUD_SAMPRATE_T sample_rate_play = SAMPLE_RATE_PLAYBACK; -static const enum AUD_SAMPRATE_T sample_rate_cap = SAMPLE_RATE_CAPTURE; -static const enum AUD_SAMPRATE_T sample_rate_recv = SAMPLE_RATE_RECV; -static const enum AUD_SAMPRATE_T sample_rate_send = SAMPLE_RATE_SEND; -static -#ifndef CODEC_DSD - const -#endif - uint8_t sample_size_play = SAMPLE_SIZE_PLAYBACK; -static const uint8_t sample_size_cap = SAMPLE_SIZE_CAPTURE; -static const uint8_t sample_size_recv = SAMPLE_SIZE_RECV; -static const uint8_t sample_size_send = SAMPLE_SIZE_SEND; - -#endif // !USB_AUDIO_DYN_CFG - -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) -#ifdef USB_AUDIO_DYN_CFG -static enum AUD_SAMPRATE_T sample_rate_ref_cap; -#else // !USB_AUDIO_DYN_CFG -#ifdef __AUDIO_RESAMPLE__ -static const enum AUD_SAMPRATE_T sample_rate_ref_cap = SAMPLE_RATE_CAPTURE; -#elif defined(USB_AUDIO_16K) -static const enum AUD_SAMPRATE_T sample_rate_ref_cap = SAMPLE_RATE_CAPTURE; -#else -static const enum AUD_SAMPRATE_T sample_rate_ref_cap = - (SAMPLE_RATE_RECV % AUD_SAMPRATE_8000) ? AUD_SAMPRATE_44100 - : AUD_SAMPRATE_48000; -#endif -#endif // !USB_AUDIO_DYN_CFG -#endif // (CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) - -static enum AUDIO_ITF_STATE_T playback_state = AUDIO_ITF_STATE_STOPPED; -static enum AUDIO_ITF_STATE_T capture_state = AUDIO_ITF_STATE_STOPPED; -static enum AUDIO_ITF_STATE_T recv_state = AUDIO_ITF_STATE_STOPPED; -static enum AUDIO_ITF_STATE_T send_state = AUDIO_ITF_STATE_STOPPED; - -static uint8_t codec_stream_map[AUD_STREAM_NUM][AUDIO_STREAM_STATUS_QTY]; -static uint8_t eq_opened; -static enum AUDIO_STREAM_RUNNING_T streams_running_req; - -static uint8_t playback_paused; - -static uint8_t playback_conflicted; -static uint8_t capture_conflicted; - -#ifdef NOISE_GATING -enum NOISE_GATING_CMD_T { - NOISE_GATING_CMD_NULL, - NOISE_GATING_CMD_MUTE, - NOISE_GATING_CMD_UNMUTE, -}; -static enum NOISE_GATING_CMD_T noise_gating_cmd = NOISE_GATING_CMD_NULL; -static uint32_t last_high_signal_time; - -#ifdef NOISE_REDUCTION -enum NOISE_REDUCTION_CMD_T { - NOISE_REDUCTION_CMD_NULL, - NOISE_REDUCTION_CMD_FIRE, - NOISE_REDUCTION_CMD_RESTORE, -}; -static enum NOISE_REDUCTION_CMD_T noise_reduction_cmd = - NOISE_REDUCTION_CMD_NULL; -static bool nr_active; -static bool prev_samp_positive[2]; -static uint16_t prev_zero_diff[2][2]; -static uint16_t cur_zero_diff[2][2]; -static uint16_t nr_cont_cnt; -static uint32_t last_nr_restore_time; - -static void restore_noise_reduction_status(void); -#endif -#endif - -static uint8_t *playback_buf; -static uint32_t playback_size; -static uint32_t playback_pos; - -#ifdef AUDIO_ANC_FB_MC -static int32_t playback_samplerate_ratio; -#endif - -static uint8_t *capture_buf; -static uint32_t capture_size; -static uint32_t capture_pos; - -static uint8_t *playback_eq_buf; -static uint32_t playback_eq_size; - -#ifdef USB_AUDIO_DYN_CFG -#ifdef KEEP_SAME_LATENCY -static uint32_t playback_max_size; -static uint32_t capture_max_size; -static uint32_t usb_recv_max_size; -static uint32_t usb_send_max_size; -#endif -static uint8_t playback_itf_set; -static uint8_t capture_itf_set; -#endif - -#ifdef SW_CAPTURE_RESAMPLE -static RESAMPLE_ID resample_id; -static bool resample_cap_enabled; -static uint8_t *resample_history_buf; -static uint32_t resample_history_size; -static uint8_t *resample_input_buf; -static uint32_t resample_input_size; -#endif - -static uint8_t *usb_recv_buf; -static uint32_t usb_recv_size; -static uint32_t usb_recv_rpos; -static uint32_t usb_recv_wpos; - -static uint8_t *usb_send_buf; -static uint32_t usb_send_size; -static uint32_t usb_send_rpos; -static uint32_t usb_send_wpos; - -static uint8_t usb_configured; - -static uint8_t usb_recv_valid; -static uint8_t usb_send_valid; - -static uint8_t usb_recv_init_rpos; -static uint8_t usb_send_init_wpos; - -static uint8_t codec_play_seq; -static uint8_t codec_cap_seq; -static volatile uint8_t usb_recv_seq; -static volatile uint8_t usb_send_seq; - -static uint8_t codec_play_valid; -static uint8_t codec_cap_valid; - -#ifdef USB_AUDIO_MULTIFUNC -static const uint8_t playback_vol = AUDIO_OUTPUT_VOLUME_DEFAULT; -#else -static uint8_t playback_vol; -#endif -static uint8_t new_playback_vol; -static uint8_t new_mute_state; -static uint8_t mute_user_map; -STATIC_ASSERT(sizeof(mute_user_map) * 8 >= CODEC_MUTE_USER_QTY, - "mute_user_map size too small"); - -static uint8_t capture_vol; -static uint8_t new_capture_vol; -static uint8_t new_cap_mute_state; - -static uint32_t last_usb_recv_err_time; -static uint32_t usb_recv_err_cnt; -static uint32_t usb_recv_ok_cnt; - -static uint32_t last_usb_send_err_time; -static uint32_t usb_send_err_cnt; -static uint32_t usb_send_ok_cnt; - -#ifdef USB_AUDIO_MULTIFUNC -static uint8_t playback_conflicted2; -static enum AUDIO_ITF_STATE_T recv2_state = AUDIO_ITF_STATE_STOPPED; -static uint8_t *usb_recv2_buf; -static uint32_t usb_recv2_size; -static uint32_t usb_recv2_rpos; -static uint32_t usb_recv2_wpos; -static uint8_t usb_recv2_valid; -static uint8_t usb_recv2_init_rpos; -static uint8_t new_playback2_vol; -static uint8_t new_mute2_state; -static float new_playback_coef; -static float new_playback2_coef; -static float playback_coef; -static float playback2_coef; - -static uint32_t last_usb_recv2_err_time; -static uint32_t usb_recv2_err_cnt; -static uint32_t usb_recv2_ok_cnt; - -static float playback_gain_to_float(uint32_t level); -#endif - -static uint8_t codec_config_lock; -STATIC_ASSERT(sizeof(codec_config_lock) * 8 >= CODEC_CONFIG_LOCK_USER_QTY, - "codec_config_lock size too small"); - -static struct USB_AUDIO_STREAM_INFO_T playback_info; -static struct USB_AUDIO_STREAM_INFO_T capture_info; - -static uint8_t nonconflict_start; -static uint16_t conflict_cnt; -static uint32_t conflict_time; -static uint32_t nonconflict_time; - -static uint32_t codec_cap_start_time; - -static uint32_t last_usb_recv_time; -static uint32_t last_usb_send_time; - -#define CMD_LIST_SIZE 30 -static uint32_t cmd_list[CMD_LIST_SIZE]; -static uint32_t cmd_watermark; -static struct SAFE_QUEUE_T cmd_queue; - -#define EXTRACT_CMD(d) ((d)&0xFF) -#define EXTRACT_SEQ(d) (((d) >> 8) & 0xFF) -#define EXTRACT_ARG(d) (((d) >> 16) & 0xFF) -#define MAKE_QUEUE_DATA(c, s, a) \ - (((c)&0xFF) | ((s)&0xFF) << 8 | ((a)&0xFF) << 16) -STATIC_ASSERT(AUDIO_CMD_QTY <= 0xFF, "audio cmd num exceeds size in queue"); -STATIC_ASSERT(USB_AUDIO_STATE_EVENT_QTY <= 0xFF, - "uaud evt num exceeds size in queue"); -STATIC_ASSERT(sizeof(usb_recv_seq) <= 1, "usb recv seq exceeds size in queue"); -STATIC_ASSERT(sizeof(usb_send_seq) <= 1, "usb send seq exceeds size in queue"); - -static const struct USB_AUDIO_KEY_MAP_T key_map[] = USB_AUDIO_KEY_MAP; - -#ifdef PERF_TEST_POWER_KEY -static enum HAL_CODEC_PERF_TEST_POWER_T perft_power_type; -#endif -#ifdef PA_ON_OFF_KEY -static bool pa_on_off_muted; -#endif - -static float rate_tune_ratio[AUD_STREAM_NUM]; - -#ifdef DSD_SUPPORT -static bool usb_dsd_enabled; -static bool codec_dsd_enabled; -static uint16_t usb_dsd_cont_cnt = 0; -#ifdef CODEC_DSD -static uint8_t dsd_saved_sample_size; -#endif -#endif - -#ifdef BT_USB_AUDIO_DUAL_MODE -static USB_AUDIO_ENQUEUE_CMD_CALLBACK enqueue_cmd_cb; -#endif - -static void enqueue_unique_cmd(enum AUDIO_CMD_T cmd); -static void usb_audio_set_codec_volume(enum AUD_STREAM_T stream, uint8_t vol); -static void usb_audio_cmd_tune_rate(enum AUD_STREAM_T stream); - -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) - -extern void damic_init(void); -extern void damic_deinit(void); - -// second-order IR filter -short soir_filter(int32_t PcmValue) { - float gain = 2.0F; - const float NUM[3] = {0.013318022713065147, 0.02375408448278904, - 0.010780527256429195}; - const float DEN[3] = {1, -1.6983977556228638, 0.74625039100646973}; - - static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0; - int32_t PcmOut = 0; - - // Left channel - x0 = PcmValue * gain; - y0 = x0 * NUM[0] + x1 * NUM[1] + x2 * NUM[2] - y1 * DEN[1] - y2 * DEN[2]; - y2 = y1; - y1 = y0; - x2 = x1; - x1 = x0; - - PcmOut = (int32_t)y0; - - PcmOut = __SSAT(PcmOut, 16); - - return (short)PcmOut; -} - -#ifdef DUAL_AUX_MIC_MORE_FILTER -// second-order IR filter -short soir_filter1(int32_t PcmValue) { - // float gain = 0.003031153698; - const float NUM[3] = {0.013318022713065147, 0.02375408448278904, - 0.010780527256429195}; - const float DEN[3] = {1, -1.6983977556228638, 0.74625039100646973}; - - static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0; - int32_t PcmOut = 0; - - // Left channel - // x0 = PcmValue* gain; - x0 = PcmValue; - y0 = x0 * NUM[0] + x1 * NUM[1] + x2 * NUM[2] - y1 * DEN[1] - y2 * DEN[2]; - y2 = y1; - y1 = y0; - x2 = x1; - x1 = x0; - - PcmOut = (int32_t)y0; - - PcmOut = __SSAT(PcmOut, 16); - - return (short)PcmOut; -} - -// second-order IR filter -short soir_filter2(int32_t PcmValue) { - // float gain = 0.003031153698; - const float NUM[3] = {0.013318022713065147, 0.02375408448278904, - 0.010780527256429195}; - const float DEN[3] = {1, -1.6983977556228638, 0.74625039100646973}; - - static float y0 = 0, y1 = 0, y2 = 0, x0 = 0, x1 = 0, x2 = 0; - int32_t PcmOut = 0; - - // Left channel - // x0 = PcmValue* gain; - x0 = PcmValue; - y0 = x0 * NUM[0] + x1 * NUM[1] + x2 * NUM[2] - y1 * DEN[1] - y2 * DEN[2]; - y2 = y1; - y1 = y0; - x2 = x1; - x1 = x0; - - PcmOut = (int32_t)y0; - - PcmOut = __SSAT(PcmOut, 16); - - return (short)PcmOut; -} -#endif - -static float s_f_amic3_dc; -static float s_f_amic4_dc; -static short s_amic3_dc; -static short s_amic4_dc; - -static void init_amic_dc(void) { - s_amic3_dc = 0; - s_amic4_dc = 0; - s_f_amic3_dc = 0.0; - s_f_amic4_dc = 0.0; -} - -static void get_amic_dc(short *src, uint32_t samp_cnt, uint32_t step) { - uint32_t i = 0; - - float u3_1 = 0.00001; - float u3_2 = 1 - u3_1; - - float u4_1 = 0.00001; - float u4_2 = 1 - u4_1; - - for (i = 0; i < samp_cnt; i += (2 << step)) { - s_f_amic3_dc = u3_2 * s_f_amic3_dc + u3_1 * src[i << 1]; - s_f_amic4_dc = u4_2 * s_f_amic4_dc + u4_1 * src[(i << 1) + 1]; - } - - s_amic3_dc = __SSAT((int)s_f_amic3_dc, 16); - s_amic4_dc = __SSAT((int)s_f_amic4_dc, 16); -} -#endif - -#ifdef FREQ_RESP_EQ - -#ifndef AUDIO_PLAYBACK_24BIT -#error "FREQ_RESP_EQ requires AUDIO_PLAYBACK_24BIT" -#endif - -#define FREQ_RESP_EQ_COEF_NUM 7 -static float freq_resp_eq_coef[FREQ_RESP_EQ_COEF_NUM] = { - // -0.000155, 0.000774, -0.003854, 0.994971, -0.003854, 0.000774, - // -0.000155 - -0.000138, 0.000687, -0.003426, 0.990852, -0.003426, 0.000687, -0.000138}; - -static int32_t freq_resp_eq_hist[2][(FREQ_RESP_EQ_COEF_NUM - 1) * 2]; -static uint8_t freq_resp_eq_hist_idx; - -void freq_resp_eq_init(void) { - int i; - - freq_resp_eq_hist_idx = 0; - for (i = 0; i < ARRAY_SIZE(freq_resp_eq_hist[0]); i++) { - freq_resp_eq_hist[0][i] = 0; - freq_resp_eq_hist[1][i] = 0; - } -} - -int freq_resp_eq_run(uint8_t *buf, uint32_t len) { - ASSERT(sample_size_play == 4, - "Freq resp eq is running on 24-bit playback only"); - - if (sample_rate_play > AUD_SAMPRATE_96000) { - // Sample rate higher than 96K will require higher system freq, which - // consumes more power - return 0; - } - - int32_t *src_buf = (int32_t *)buf; - int32_t *dst_buf = (int32_t *)buf; - uint32_t mono_samp_num = len / 2 / sample_size_play; - int32_t start_idx, in_idx, coef_idx; - int32_t in_l, in_r; - float out_l, out_r; - uint8_t new_seq_idx = !freq_resp_eq_hist_idx; - - if (mono_samp_num >= (FREQ_RESP_EQ_COEF_NUM - 1)) { - start_idx = (mono_samp_num - FREQ_RESP_EQ_COEF_NUM + 1) * 2; - for (in_idx = 0; in_idx < (FREQ_RESP_EQ_COEF_NUM - 1) * 2; in_idx++) { - freq_resp_eq_hist[new_seq_idx][in_idx] = src_buf[start_idx + in_idx]; - } - } else { - start_idx = (FREQ_RESP_EQ_COEF_NUM - 1 - mono_samp_num) * 2; - for (in_idx = 0; in_idx < start_idx; in_idx++) { - freq_resp_eq_hist[new_seq_idx][in_idx] = - freq_resp_eq_hist[freq_resp_eq_hist_idx][mono_samp_num * 2 + in_idx]; - } - for (in_idx = 0; in_idx < mono_samp_num * 2; in_idx++) { - freq_resp_eq_hist[new_seq_idx][start_idx + in_idx] = src_buf[in_idx]; - } - } - - for (in_idx = mono_samp_num - 1; in_idx >= 0; in_idx--) { - out_l = 0; - out_r = 0; - for (coef_idx = 0; coef_idx < FREQ_RESP_EQ_COEF_NUM; coef_idx++) { - if (in_idx + coef_idx - FREQ_RESP_EQ_COEF_NUM + 1 >= 0) { - in_l = src_buf[(in_idx + coef_idx - FREQ_RESP_EQ_COEF_NUM + 1) * 2]; - in_r = src_buf[(in_idx + coef_idx - FREQ_RESP_EQ_COEF_NUM + 1) * 2 + 1]; - } else { - in_l = - freq_resp_eq_hist[freq_resp_eq_hist_idx][(in_idx + coef_idx) * 2]; - in_r = freq_resp_eq_hist[freq_resp_eq_hist_idx] - [(in_idx + coef_idx) * 2 + 1]; - } - out_l += in_l * freq_resp_eq_coef[coef_idx]; - out_r += in_r * freq_resp_eq_coef[coef_idx]; - } - - // TODO: Is it really neccessary to round the float? - // dst_buf[in_idx * 2] = __SSAT(ftoi_nearest(out_l), 24); - // dst_buf[in_idx * 2 + 1] = __SSAT(ftoi_nearest(out_r), 24); - dst_buf[in_idx * 2] = __SSAT((int32_t)out_l, 24); - dst_buf[in_idx * 2 + 1] = __SSAT((int32_t)out_r, 24); - } - - freq_resp_eq_hist_idx = new_seq_idx; - - return 0; -} - -#endif // FREQ_RESP_EQ - -static enum AUD_BITS_T sample_size_to_enum_playback(uint32_t size) { - if (size == 2) { - return AUD_BITS_16; - } else if (size == 4) { - return AUD_BITS_24; - } else { - ASSERT(false, "%s: Invalid sample size: %u", __FUNCTION__, size); - } - - return 0; -} - -static enum AUD_BITS_T sample_size_to_enum_capture(uint32_t size) { - if (size == 2) { - return AUD_BITS_16; - } else if (size == 4) { -#ifdef USB_AUDIO_SEND_32BIT - return AUD_BITS_32; -#else - return AUD_BITS_24; -#endif - } else { - ASSERT(false, "%s: Invalid sample size: %u", __FUNCTION__, size); - } - - return 0; -} - -static enum AUD_CHANNEL_NUM_T chan_num_to_enum(uint32_t num) { - return AUD_CHANNEL_NUM_1 + (num - 1); -} - -static uint32_t POSSIBLY_UNUSED byte_to_samp_playback(uint32_t n) { -#if defined(USB_AUDIO_DYN_CFG) || defined(CODEC_DSD) - return n / sample_size_play / CHAN_NUM_PLAYBACK; -#else - return BYTE_TO_SAMP_PLAYBACK(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED byte_to_samp_capture(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n / sample_size_cap / CHAN_NUM_CAPTURE; -#else - return BYTE_TO_SAMP_CAPTURE(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED byte_to_samp_recv(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n / sample_size_recv / CHAN_NUM_RECV; -#else - return BYTE_TO_SAMP_RECV(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED byte_to_samp_send(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n / sample_size_send / CHAN_NUM_SEND; -#else - return BYTE_TO_SAMP_SEND(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED samp_to_byte_playback(uint32_t n) { -#if defined(USB_AUDIO_DYN_CFG) || defined(CODEC_DSD) - return n * sample_size_play * CHAN_NUM_PLAYBACK; -#else - return SAMP_TO_BYTE_PLAYBACK(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED samp_to_byte_capture(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n * sample_size_cap * CHAN_NUM_CAPTURE; -#else - return SAMP_TO_BYTE_CAPTURE(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED samp_to_byte_recv(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n * sample_size_recv * CHAN_NUM_RECV; -#else - return SAMP_TO_BYTE_RECV(n); -#endif -} - -static uint32_t POSSIBLY_UNUSED samp_to_byte_send(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - return n * sample_size_send * CHAN_NUM_SEND; -#else - return SAMP_TO_BYTE_SEND(n); -#endif -} - -static uint32_t playback_to_recv_len(uint32_t n) { -#if defined(USB_AUDIO_DYN_CFG) || defined(CODEC_DSD) - uint32_t len; - - // 1) When changing recv sample rate, the play stream will be stopped and then - // restarted. - // So when calculating the len, play sample rate has been changed according - // to recv sample rate. - // 2) Play and recv sample rates are integral multiple of each other. - - len = samp_to_byte_recv(byte_to_samp_playback(n)); - if (sample_rate_recv == sample_rate_play) { - return len; - } else if (sample_rate_recv < sample_rate_play) { - return len / (sample_rate_play / sample_rate_recv); - } else { - return len * (sample_rate_recv / sample_rate_play); - } -#else - return PLAYBACK_TO_RECV_LEN(n); -#endif -} - -static uint32_t capture_to_send_len(uint32_t n) { -#ifdef USB_AUDIO_DYN_CFG - uint32_t len; - enum AUD_SAMPRATE_T send_rate; - enum AUD_SAMPRATE_T cap_rate; - - // 1) When changing send sample rate, the cap stream will not be changed if - // the play stream is active. - // Moreover, the cap stream might be changed if changing recv sample rate - // (and then play sample rate). So when calculating the len, cap sample - // rate might be inconsistent with send sample rate. - // 2) Resample might be applied to the cap stream. Cap and send sample rates - // have no integral multiple relationship. - - send_rate = sample_rate_send; - cap_rate = sample_rate_cap; - - len = samp_to_byte_send(byte_to_samp_capture(n)); - if (send_rate == cap_rate) { - return len; - } else { - // Unlikely to overflow for the max send_rate is 48000 - return ALIGN((len * send_rate + cap_rate - 1) / cap_rate, - sample_size_send * CHAN_NUM_SEND); - } -#else - return CAPTURE_TO_SEND_LEN(n); -#endif -} - -#ifdef USB_AUDIO_DYN_CFG -static uint32_t POSSIBLY_UNUSED capture_to_ref_len(uint32_t n) { - uint32_t len; - - len = samp_to_byte_send(byte_to_samp_capture(n)); - -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) - // Capture reference sample rate and capture sample rate are integral multiple - // of each other. - - if (sample_rate_ref_cap == sample_rate_cap) { - return len; - } else if (sample_rate_ref_cap < sample_rate_cap) { - return len / (sample_rate_cap / sample_rate_ref_cap); - } else { - return len * (sample_rate_ref_cap / sample_rate_cap); - } -#else - return len; -#endif -} - -#ifdef KEEP_SAME_LATENCY -static uint32_t calc_usb_recv_size(enum AUD_SAMPRATE_T rate, - uint8_t sample_size) { - uint32_t size; - size = (SAMP_RATE_TO_FRAME_SIZE(rate) * sample_size * CHAN_NUM_RECV) * - (usb_recv_max_size / MAX_FRAME_SIZE_RECV); - return NON_EXP_ALIGN(size, RECV_BUFF_ALIGN); -} - -static uint32_t calc_usb_send_size(enum AUD_SAMPRATE_T rate) { - uint32_t size; - size = samp_to_byte_send(SAMP_RATE_TO_FRAME_SIZE(rate)) * usb_send_max_size / - MAX_FRAME_SIZE_SEND; - return NON_EXP_ALIGN(size, SEND_BUFF_ALIGN); -} - -static uint32_t calc_playback_size(enum AUD_SAMPRATE_T rate) { - uint32_t size; - size = samp_to_byte_playback(SAMP_RATE_TO_FRAME_SIZE(rate)) * - (playback_max_size / MAX_FRAME_SIZE_PLAYBACK); - return NON_EXP_ALIGN(size, DAC_BUFF_ALIGN); -} - -static uint32_t calc_capture_size(enum AUD_SAMPRATE_T rate) { - uint32_t size; - size = samp_to_byte_capture(SAMP_RATE_TO_FRAME_SIZE(rate)) * - (capture_max_size / MAX_FRAME_SIZE_CAPTURE); - return NON_EXP_ALIGN(size, ADC_BUFF_ALIGN); -} -#endif -#endif - -static void record_conflict(int conflicted) { - uint32_t lock; - uint32_t interval; - bool reset = false; - - lock = int_lock(); - - if (conflicted) { - nonconflict_start = 0; - if (conflict_cnt == 0) { - conflict_time = hal_sys_timer_get(); - } - conflict_cnt++; - - if (conflict_cnt >= CONFLICT_CMD_TRIG_COUNT) { - interval = hal_sys_timer_get() - conflict_time; - if (interval < CONFLICT_CMD_TRIG_INTERVAL) { - // TRACE(2,"RESET CODEC: conflict cnt=%u interval=%u ms", conflict_cnt, - // TICKS_TO_MS(interval)); - reset = true; - } - conflict_cnt = 0; - } - } else { - if (nonconflict_start == 0) { - nonconflict_start = 1; - if (conflict_cnt) { - nonconflict_time = hal_sys_timer_get(); - } - } else { - if (conflict_cnt) { - interval = hal_sys_timer_get() - nonconflict_time; - if (interval >= CONFLICT_STATE_RESET_INTERVAL) { - // TRACE(2,"RESET CONFLICT STATE: conflict cnt=%u nonconflict - // interval=%u ms", conflict_cnt, TICKS_TO_MS(interval)); - conflict_cnt = 0; - } - } - } - } - - int_unlock(lock); - - if (reset) { - // Avoid invoking cmd callback when irq is locked - enqueue_unique_cmd(AUDIO_CMD_RESET_CODEC); - } -} - -static void reset_conflict(void) { - uint32_t lock; - - lock = int_lock(); - conflict_cnt = 0; - nonconflict_start = 0; - int_unlock(lock); -} - -uint8_t usb_audio_get_eq_index(AUDIO_EQ_TYPE_T audio_eq_type, - uint8_t anc_status) { - uint8_t index_eq = 0; - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_DAC_IIR_EQ_PROCESS__) || defined(__HW_IIR_EQ_PROCESS__) - switch (audio_eq_type) { -#if defined(__SW_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_SW_IIR: { - if (anc_status) { - index_eq = audio_eq_sw_iir_index + 1; - } else { - index_eq = audio_eq_sw_iir_index; - } - - } break; -#endif - -#if defined(__HW_FIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_FIR: { -#ifdef USB_AUDIO_DYN_CFG - if (sample_rate_recv == AUD_SAMPRATE_44100) { - index_eq = 0; - } else if (sample_rate_recv == AUD_SAMPRATE_48000) { - index_eq = 1; - } else if (sample_rate_recv == AUD_SAMPRATE_96000) { - index_eq = 2; - } else if (sample_rate_recv == AUD_SAMPRATE_192000) { - index_eq = 3; - } else { - ASSERT(0, "[%s] sample_rate_recv(%d) is not supported", __func__, - sample_rate_recv); - } - audio_eq_hw_fir_index = index_eq; -#else - index_eq = audio_eq_hw_fir_index; -#endif - if (anc_status) { - index_eq = index_eq + 4; - } - } break; -#endif - -#if defined(__HW_DAC_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_DAC_IIR: { - if (anc_status) { - index_eq = audio_eq_hw_dac_iir_index + 1; - } else { - index_eq = audio_eq_hw_dac_iir_index; - } - } break; -#endif - -#if defined(__HW_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_IIR: { - if (anc_status) { - index_eq = audio_eq_hw_iir_index + 1; - } else { - index_eq = audio_eq_hw_iir_index; - } - } break; -#endif - default: { - ASSERT(false, "[%s]Error eq type!", __func__); - } - } -#endif - return index_eq; -} - -uint32_t usb_audio_set_eq(AUDIO_EQ_TYPE_T audio_eq_type, uint8_t index) { - const FIR_CFG_T *fir_cfg = NULL; - const IIR_CFG_T *iir_cfg = NULL; - - TRACE(3, "[%s]audio_eq_type=%d,index=%d", __func__, audio_eq_type, index); - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_DAC_IIR_EQ_PROCESS__) || defined(__HW_IIR_EQ_PROCESS__) - switch (audio_eq_type) { -#if defined(__SW_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_SW_IIR: { - if (index >= EQ_SW_IIR_LIST_NUM) { - TRACE(2, "[%s] index[%d] > EQ_SW_IIR_LIST_NUM", __func__, index); - return 1; - } - - iir_cfg = audio_eq_sw_iir_cfg_list[index]; - } break; -#endif - -#if defined(__HW_FIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_FIR: { - if (index >= EQ_HW_FIR_LIST_NUM) { - TRACE(2, "[%s] index[%d] > EQ_HW_FIR_LIST_NUM", __func__, index); - return 1; - } - - fir_cfg = audio_eq_hw_fir_cfg_list[index]; - } break; -#endif - -#if defined(__HW_DAC_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_DAC_IIR: { - if (index >= EQ_HW_DAC_IIR_LIST_NUM) { - TRACE(2, "[%s] index[%d] > EQ_HW_DAC_IIR_LIST_NUM", __func__, index); - return 1; - } - - iir_cfg = audio_eq_hw_dac_iir_cfg_list[index]; - } break; -#endif - -#if defined(__HW_IIR_EQ_PROCESS__) - case AUDIO_EQ_TYPE_HW_IIR: { - if (index >= EQ_HW_IIR_LIST_NUM) { - TRACE(2, "[%s] index[%d] > EQ_HW_IIR_LIST_NUM", __func__, index); - return 1; - } - - iir_cfg = audio_eq_hw_iir_cfg_list[index]; - } break; -#endif - default: { - ASSERT(false, "[%s]Error eq type!", __func__); - } - } -#endif - - return audio_eq_set_cfg(fir_cfg, iir_cfg, audio_eq_type); -} - -static void set_codec_config_status(enum CODEC_CONFIG_LOCK_USER_T user, - bool lock) { - if (lock) { - codec_config_lock |= (1 << user); - } else { - codec_config_lock &= ~(1 << user); - } -} - -static void usb_audio_codec_mute(enum CODEC_MUTE_USER_T user) { - TRACE(3, "%s: user=%d map=0x%02X", __FUNCTION__, user, mute_user_map); - - if (user >= CODEC_MUTE_USER_QTY || mute_user_map == 0) { - af_stream_mute(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, true); - } - if (user < CODEC_MUTE_USER_QTY) { - mute_user_map |= (1 << user); - } -} - -static void usb_audio_codec_unmute(enum CODEC_MUTE_USER_T user) { - uint8_t old_map; - STATIC_ASSERT(sizeof(old_map) * 8 >= CODEC_MUTE_USER_QTY, - "old_map size too small"); - - TRACE(3, "%s: user=%d map=0x%02X", __FUNCTION__, user, mute_user_map); - - old_map = mute_user_map; - - if (user < CODEC_MUTE_USER_QTY) { - mute_user_map &= ~(1 << user); - } - if (user >= CODEC_MUTE_USER_QTY || (old_map && mute_user_map == 0)) { - af_stream_mute(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, false); - } -} - -#ifdef AUDIO_ANC_FB_MC - -#define DELAY_SAMPLE_MC (33 * 2) // 2:ch -static int32_t delay_buf[DELAY_SAMPLE_MC]; -static int32_t mid_p_8_old_l = 0; -static int32_t mid_p_8_old_r = 0; -static uint32_t audio_mc_data_playback(uint8_t *buf, uint32_t mc_len_bytes) { - // uint32_t begin_time; - // uint32_t end_time; - // begin_time = hal_sys_timer_get(); - // TRACE(1,"cancel: %d",begin_time); - - float left_gain; - float right_gain; - uint32_t playback_len_bytes; - int i, j, k; - int delay_sample; - - hal_codec_get_dac_gain(&left_gain, &right_gain); - - // TRACE(1,"playback_samplerate_ratio: %d",playback_samplerate_ratio); - - // TRACE(1,"left_gain: %d",(int)(left_gain*(1<<12))); - // TRACE(1,"right_gain: %d",(int)(right_gain*(1<<12))); - - playback_len_bytes = mc_len_bytes / playback_samplerate_ratio; - - if (sample_size_play == 2) { - int16_t *sour_p = (int16_t *)(playback_buf + playback_size / 2); - int16_t *mid_p = (int16_t *)(buf); - int16_t *mid_p_8 = (int16_t *)(buf + mc_len_bytes - mc_len_bytes / 8); - int16_t *dest_p = (int16_t *)buf; - int i, j, k; - - if (buf == (playback_buf + playback_size)) { - sour_p = (int16_t *)playback_buf; - } - - delay_sample = DELAY_SAMPLE_MC; - - for (i = 0, j = 0; i < delay_sample; i = i + 2) { - mid_p[j++] = delay_buf[i]; - mid_p[j++] = delay_buf[i + 1]; - } - - for (i = 0; i < playback_len_bytes / 2 - delay_sample; i = i + 2) { - mid_p[j++] = sour_p[i]; - mid_p[j++] = sour_p[i + 1]; - } - - for (j = 0; i < playback_len_bytes / 2; i = i + 2) { - delay_buf[j++] = sour_p[i]; - delay_buf[j++] = sour_p[i + 1]; - } - - if (playback_samplerate_ratio <= 8) { - for (i = 0, j = 0; i < playback_len_bytes / 2; - i = i + 2 * (8 / playback_samplerate_ratio)) { - mid_p_8[j++] = mid_p[i]; - mid_p_8[j++] = mid_p[i + 1]; - } - } else { - for (i = 0, j = 0; i < playback_len_bytes / 2; i = i + 2) { - for (k = 0; k < playback_samplerate_ratio / 8; k++) { - mid_p_8[j++] = mid_p[i]; - mid_p_8[j++] = mid_p[i + 1]; - } - } - } - - anc_mc_run_stereo((uint8_t *)mid_p_8, mc_len_bytes / 8, left_gain, - right_gain, AUD_BITS_16); - - for (i = 0, j = 0; i < (mc_len_bytes / 8) / 2; i = i + 2) { - float delta_l = (mid_p_8[i] - mid_p_8_old_l) / 8.0f; - float delta_r = (mid_p_8[i + 1] - mid_p_8_old_r) / 8.0f; - for (k = 0; k < 8; k++) { - dest_p[j++] = mid_p_8_old_l + (int32_t)(delta_l * k); - dest_p[j++] = mid_p_8_old_r + (int32_t)(delta_r * k); - } - mid_p_8_old_l = mid_p_8[i]; - mid_p_8_old_r = mid_p_8[i + 1]; - } - } else if (sample_size_play == 4) { - int32_t *sour_p = (int32_t *)(playback_buf + playback_size / 2); - int32_t *mid_p = (int32_t *)(buf); - int32_t *mid_p_8 = (int32_t *)(buf + mc_len_bytes - mc_len_bytes / 8); - int32_t *dest_p = (int32_t *)buf; - - if (buf == (playback_buf + playback_size)) { - sour_p = (int32_t *)playback_buf; - } - - delay_sample = DELAY_SAMPLE_MC; - - for (i = 0, j = 0; i < delay_sample; i = i + 2) { - mid_p[j++] = delay_buf[i]; - mid_p[j++] = delay_buf[i + 1]; - } - - for (i = 0; i < playback_len_bytes / 4 - delay_sample; i = i + 2) { - mid_p[j++] = sour_p[i]; - mid_p[j++] = sour_p[i + 1]; - } - - for (j = 0; i < playback_len_bytes / 4; i = i + 2) { - delay_buf[j++] = sour_p[i]; - delay_buf[j++] = sour_p[i + 1]; - } - - if (playback_samplerate_ratio <= 8) { - for (i = 0, j = 0; i < playback_len_bytes / 4; - i = i + 2 * (8 / playback_samplerate_ratio)) { - mid_p_8[j++] = mid_p[i]; - mid_p_8[j++] = mid_p[i + 1]; - } - } else { - for (i = 0, j = 0; i < playback_len_bytes / 4; i = i + 2) { - for (k = 0; k < playback_samplerate_ratio / 8; k++) { - mid_p_8[j++] = mid_p[i]; - mid_p_8[j++] = mid_p[i + 1]; - } - } - } - - anc_mc_run_stereo((uint8_t *)mid_p_8, mc_len_bytes / 8, left_gain, - right_gain, AUD_BITS_24); - - for (i = 0, j = 0; i < (mc_len_bytes / 8) / 4; i = i + 2) { - float delta_l = (mid_p_8[i] - mid_p_8_old_l) / 8.0f; - float delta_r = (mid_p_8[i + 1] - mid_p_8_old_r) / 8.0f; - for (k = 0; k < 8; k++) { - dest_p[j++] = mid_p_8_old_l + (int32_t)(delta_l * k); - dest_p[j++] = mid_p_8_old_r + (int32_t)(delta_r * k); - } - mid_p_8_old_l = mid_p_8[i]; - mid_p_8_old_r = mid_p_8[i + 1]; - } - } - - // end_time = hal_sys_timer_get(); - // TRACE(2,"%s:run time: %d", __FUNCTION__, end_time-begin_time); - - return 0; -} -#endif - -static uint32_t usb_audio_data_playback(uint8_t *buf, uint32_t len) { - uint32_t usb_len; - uint32_t old_rpos, saved_old_rpos, new_rpos, wpos; - uint8_t recv_valid, init_pos; - uint8_t conflicted; - uint32_t reset_len = usb_recv_size / 2; -#ifdef USB_AUDIO_MULTIFUNC - uint32_t old_rpos2, saved_old_rpos2, new_rpos2, wpos2; - uint8_t recv2_valid, init_pos2; - uint8_t conflicted2; - uint32_t reset_len2 = usb_recv2_size / 2; -#endif - uint32_t play_next; - uint32_t lock; - uint8_t *conv_buf; - uint32_t cur_time; - uint32_t usb_time; - - usb_time = last_usb_recv_time; - cur_time = hal_sys_timer_get(); - - //---------------------------------------- - // Speech processing start - //---------------------------------------- -#ifdef USB_AUDIO_SPEECH - speech_process_playback_run(buf, &len); -#endif - //---------------------------------------- - // Speech processing end - //---------------------------------------- - - ASSERT(((uint32_t)buf & 0x3) == 0, "%s: Invalid buf: %p", __FUNCTION__, buf); - - // playback is valid when reaching here - codec_play_valid = 1; - - init_pos = 0; - // Allow to play till the end of the buffer when itf stopped - if (usb_recv_valid && !(recv_state == AUDIO_ITF_STATE_STOPPED && - usb_recv_rpos == usb_recv_wpos)) { - recv_valid = 1; - if (usb_recv_init_rpos == 0) { - init_pos = 1; - } - } else { - recv_valid = 0; - } -#ifdef USB_AUDIO_MULTIFUNC - init_pos2 = 0; - if (usb_recv2_valid && !(recv2_state == AUDIO_ITF_STATE_STOPPED && - usb_recv2_rpos == usb_recv2_wpos)) { - recv2_valid = 1; - if (usb_recv2_init_rpos == 0) { - init_pos2 = 1; - } - } else { - recv2_valid = 0; - } -#endif - - if (codec_play_seq != usb_recv_seq || - playback_state == AUDIO_ITF_STATE_STOPPED || -#ifdef USB_AUDIO_MULTIFUNC - (recv_valid == 0 && recv2_valid == 0) || -#else - recv_valid == 0 || -#endif - cur_time - usb_time > USB_MAX_XFER_INTERVAL) { - _invalid_play: - zero_mem32(buf, len); - conv_buf = buf; - // If usb recv is stopped, set usb_recv_rpos to the value of usb_recv_wpos - // -- avoid playing noise. Otherwise set usb_recv_rpos to 0 -- avoid buffer - // conflicts at usb recv startup. - new_rpos = (recv_state == AUDIO_ITF_STATE_STOPPED) ? usb_recv_wpos : 0; - conflicted = 0; -#ifdef USB_AUDIO_MULTIFUNC - new_rpos2 = (recv2_state == AUDIO_ITF_STATE_STOPPED) ? usb_recv2_wpos : 0; - conflicted2 = 0; -#endif - - goto _conv_end; - } - - //---------------------------------------- - // Check conflict - //---------------------------------------- - - usb_len = playback_to_recv_len(len); - conflicted = 0; -#ifdef USB_AUDIO_MULTIFUNC - conflicted2 = 0; -#endif - - lock = int_lock(); - wpos = usb_recv_wpos; - if (init_pos) { - old_rpos = wpos + reset_len; - if (old_rpos >= usb_recv_size) { - old_rpos -= usb_recv_size; - } - usb_recv_rpos = old_rpos; - usb_recv_init_rpos = 1; - } else { - old_rpos = usb_recv_rpos; - } - saved_old_rpos = old_rpos; - new_rpos = usb_recv_rpos + usb_len; - if (new_rpos >= usb_recv_size) { - new_rpos -= usb_recv_size; - } - if (recv_valid && init_pos == 0) { - if (old_rpos <= wpos) { - if (new_rpos < old_rpos || wpos < new_rpos) { - if (recv_state == AUDIO_ITF_STATE_STOPPED) { - if (new_rpos < old_rpos) { - zero_mem(usb_recv_buf + wpos, usb_recv_size - wpos); - zero_mem(usb_recv_buf, new_rpos); - } else { - zero_mem(usb_recv_buf + wpos, new_rpos - wpos); - } - wpos = new_rpos; - usb_recv_wpos = new_rpos; - } else { - conflicted = 1; - } - } - } else { - if (wpos < new_rpos && new_rpos < old_rpos) { - if (recv_state == AUDIO_ITF_STATE_STOPPED) { - zero_mem(usb_recv_buf + wpos, new_rpos - wpos); - wpos = new_rpos; - usb_recv_wpos = new_rpos; - } else { - conflicted = 1; - } - } - } - if (conflicted) { - // Reset read position - old_rpos = wpos + reset_len; - if (old_rpos >= usb_recv_size) { - old_rpos -= usb_recv_size; - } - new_rpos = old_rpos + usb_len; - if (new_rpos >= usb_recv_size) { - new_rpos -= usb_recv_size; - } - // Update global read position - usb_recv_rpos = old_rpos; - } - } - -#ifdef USB_AUDIO_MULTIFUNC - wpos2 = usb_recv2_wpos; - if (init_pos2) { - old_rpos2 = wpos2 + reset_len2; - if (old_rpos2 >= usb_recv2_size) { - old_rpos2 -= usb_recv2_size; - } - usb_recv2_rpos = old_rpos2; - usb_recv2_init_rpos = 1; - } else { - old_rpos2 = usb_recv2_rpos; - } - saved_old_rpos2 = old_rpos2; - new_rpos2 = usb_recv2_rpos + usb_len; - if (new_rpos2 >= usb_recv2_size) { - new_rpos2 -= usb_recv2_size; - } - if (recv2_valid && init_pos2 == 0) { - if (old_rpos2 <= wpos2) { - if (new_rpos2 < old_rpos2 || wpos2 < new_rpos2) { - if (recv2_state == AUDIO_ITF_STATE_STOPPED) { - if (new_rpos2 < old_rpos2) { - zero_mem(usb_recv2_buf + wpos2, usb_recv2_size - wpos2); - zero_mem(usb_recv2_buf, new_rpos2); - } else { - zero_mem(usb_recv2_buf + wpos2, new_rpos2 - wpos2); - } - wpos2 = new_rpos2; - usb_recv2_wpos = new_rpos2; - } else { - conflicted2 = 1; - } - } - } else { - if (wpos2 < new_rpos2 && new_rpos2 < old_rpos2) { - if (recv2_state == AUDIO_ITF_STATE_STOPPED) { - zero_mem(usb_recv2_buf + wpos2, new_rpos2 - wpos2); - wpos2 = new_rpos2; - usb_recv2_wpos = new_rpos2; - } else { - conflicted2 = 1; - } - } - } - if (conflicted2) { - // Reset read position - old_rpos2 = wpos2 + reset_len2; - if (old_rpos2 >= usb_recv2_size) { - old_rpos2 -= usb_recv2_size; - } - new_rpos2 = old_rpos2 + usb_len; - if (new_rpos2 >= usb_recv2_size) { - new_rpos2 -= usb_recv2_size; - } - // Update global read position - usb_recv2_rpos = old_rpos2; - } - } -#endif - int_unlock(lock); - - if (conflicted) { - TRACE(4, - "playback: Error: rpos=%u goes beyond wpos=%u with usb_len=%u. Reset " - "to %u", - saved_old_rpos, wpos, usb_len, old_rpos); - } -#ifdef USB_AUDIO_MULTIFUNC - if (conflicted2) { - TRACE(4, - "playback: Error: rpos2=%u goes beyond wpos2=%u with usb_len=%u. " - "Reset to %u", - saved_old_rpos2, wpos2, usb_len, old_rpos2); - } -#endif - -#if (VERBOSE_TRACE & (1 << 0)) - { - int hw_play_pos = - af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - uint32_t play_pos = buf - playback_buf; -#ifdef USB_AUDIO_MULTIFUNC - if (recv_valid == 0) { - old_rpos = -1; - wpos = -1; - } - if (recv2_valid == 0) { - old_rpos2 = -1; - wpos2 = -1; - } - TRACE_TIME(8, - "playback: rpos=%d/%d usb_len=%d wpos=%d/%d play_pos=%d len=%d " - "hw_play_pos=%d", - old_rpos, old_rpos2, usb_len, wpos, wpos2, play_pos, len, - hw_play_pos); -#else - TRACE_TIME(6, - "playback: rpos=%d usb_len=%d wpos=%d play_pos=%d len=%d " - "hw_play_pos=%d", - old_rpos, usb_len, wpos, play_pos, len, hw_play_pos); -#endif - } -#endif - - if (codec_play_seq != usb_recv_seq) { - goto _invalid_play; - } - -#ifdef USB_AUDIO_MULTIFUNC - record_conflict(conflicted || conflicted2); -#else - record_conflict(conflicted); -#endif - - //---------------------------------------- - // USB->CODEC stream format conversion start - //---------------------------------------- - - conv_buf = buf; - -#ifdef USB_AUDIO_MULTIFUNC - - { - uint8_t POSSIBLY_UNUSED *cur_buf, *buf_end, *usb_cur_buf, *usb_buf_end, - *usb_cur_buf2, *usb_buf_end2; - uint32_t codec_step, usb_step; - float cur_gain, new_gain, cur_gain2, new_gain2, gain_step; - - cur_buf = conv_buf; - buf_end = conv_buf + len; - usb_cur_buf = usb_recv_buf + old_rpos; - usb_buf_end = usb_recv_buf + usb_recv_size; - usb_cur_buf2 = usb_recv2_buf + old_rpos2; - usb_buf_end2 = usb_recv2_buf + usb_recv2_size; - - cur_gain = playback_coef; - new_gain = new_playback_coef; - cur_gain2 = playback2_coef; - new_gain2 = new_playback2_coef; - gain_step = USB_AUDIO_VOL_UPDATE_STEP; - - ASSERT(sample_rate_play == sample_rate_recv, - "2:1: Invalid sample_rate_play=%u sample_rate_recv=%u", - sample_rate_play, sample_rate_recv); - - if (0) { - - } else if (sample_size_play == 4 && - (sample_size_recv == 4 || sample_size_recv == 3 || - sample_size_recv == 2)) { - - int32_t left, right; - int32_t left2, right2; - - if (sample_size_recv == 4) { - usb_step = 8; - } else if (sample_size_recv == 3) { - usb_step = 6; - } else { - usb_step = 4; - } - - codec_step = 8; - - while (cur_buf + codec_step <= buf_end) { - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - if (usb_cur_buf2 + usb_step > usb_buf_end2) { - usb_cur_buf2 = usb_recv2_buf; - } - if (recv_valid) { - if (usb_step == 8) { - left = *(int32_t *)usb_cur_buf; - right = *((int32_t *)usb_cur_buf + 1); - } else if (usb_step == 6) { - left = ((usb_cur_buf[0] << 8) | (usb_cur_buf[1] << 16) | - (usb_cur_buf[2] << 24)); - right = ((usb_cur_buf[3] << 8) | (usb_cur_buf[4] << 16) | - (usb_cur_buf[5] << 24)); - } else { - left = *(int16_t *)usb_cur_buf << 16; - right = *((int16_t *)usb_cur_buf + 1) << 16; - } - if (cur_gain > new_gain) { - cur_gain -= gain_step; - if (cur_gain < new_gain) { - cur_gain = new_gain; - } - } else if (cur_gain < new_gain) { - cur_gain += gain_step; - if (cur_gain > new_gain) { - cur_gain = new_gain; - } - } - left = (int32_t)(left * cur_gain); - right = (int32_t)(right * cur_gain); - } else { - left = right = 0; - } - if (recv2_valid) { - if (usb_step == 8) { - left2 = *(int32_t *)usb_cur_buf2; - right2 = *((int32_t *)usb_cur_buf2 + 1); - } else if (usb_step == 6) { - left2 = ((usb_cur_buf2[0] << 8) | (usb_cur_buf2[1] << 16) | - (usb_cur_buf2[2] << 24)); - right2 = ((usb_cur_buf2[3] << 8) | (usb_cur_buf2[4] << 16) | - (usb_cur_buf2[5] << 24)); - } else { - left2 = *(int16_t *)usb_cur_buf2 << 16; - right2 = *((int16_t *)usb_cur_buf2 + 1) << 16; - } - if (cur_gain2 > new_gain2) { - cur_gain2 -= gain_step; - if (cur_gain2 < new_gain2) { - cur_gain2 = new_gain2; - } - } else if (cur_gain2 < new_gain2) { - cur_gain2 += gain_step; - if (cur_gain2 > new_gain2) { - cur_gain2 = new_gain2; - } - } - left2 = (int32_t)(left2 * cur_gain2); - right2 = (int32_t)(right2 * cur_gain2); - } else { - left2 = right2 = 0; - } - left = __QADD(left, left2); - right = __QADD(right, right2); - // Convert to 24-bit sample - left >>= 8; - right >>= 8; - - *(int32_t *)cur_buf = left; - *((int32_t *)cur_buf + 1) = right; - - cur_buf += codec_step; - usb_cur_buf += usb_step; - usb_cur_buf2 += usb_step; - } - } else if (sample_size_play == 2 && sample_size_recv == 2) { - - int32_t left, right; - int32_t left2, right2; - - usb_step = 4; - codec_step = 4; - - while (cur_buf + codec_step <= buf_end) { - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - if (usb_cur_buf2 + usb_step > usb_buf_end2) { - usb_cur_buf2 = usb_recv2_buf; - } - if (recv_valid) { - left = *(int16_t *)usb_cur_buf; - right = *((int16_t *)usb_cur_buf + 1); - if (cur_gain > new_gain) { - cur_gain -= gain_step; - if (cur_gain < new_gain) { - cur_gain = new_gain; - } - } else if (cur_gain < new_gain) { - cur_gain += gain_step; - if (cur_gain > new_gain) { - cur_gain = new_gain; - } - } - left = (int32_t)(left * cur_gain); - right = (int32_t)(right * cur_gain); - } else { - left = right = 0; - } - if (recv2_valid) { - left2 = *(int16_t *)usb_cur_buf2; - right2 = *((int16_t *)usb_cur_buf2 + 1); - if (cur_gain2 > new_gain2) { - cur_gain2 -= gain_step; - if (cur_gain2 < new_gain2) { - cur_gain2 = new_gain2; - } - } else if (cur_gain2 < new_gain2) { - cur_gain2 += gain_step; - if (cur_gain2 > new_gain2) { - cur_gain2 = new_gain2; - } - } - left2 = (int32_t)(left2 * cur_gain2); - right2 = (int32_t)(right2 * cur_gain2); - } else { - left2 = right2 = 0; - } - left = __SSAT(left + left2, 16); - right = __SSAT(right + right2, 16); - - *(int16_t *)cur_buf = left; - *((int16_t *)cur_buf + 1) = right; - - cur_buf += codec_step; - usb_cur_buf += usb_step; - } - - } else { - - ASSERT(false, "2:3: Invalid sample_size_play=%u sample_size_recv=%u", - sample_size_play, sample_size_recv); - } - - playback_coef = cur_gain; - playback2_coef = cur_gain2; - } - -#else - - { - uint8_t POSSIBLY_UNUSED *cur_buf, *buf_end, *usb_cur_buf, *usb_buf_end; - uint32_t codec_step, usb_step; - bool down_sampling = false; - - cur_buf = conv_buf; - buf_end = conv_buf + len; - usb_cur_buf = usb_recv_buf + old_rpos; - usb_buf_end = usb_recv_buf + usb_recv_size; - - if (0) { - -#ifdef CODEC_DSD - } else if (codec_dsd_enabled) { - - ASSERT(sample_size_play == 2, "Bad DSD playback sample size: %u", - sample_size_play); - ASSERT(sample_size_recv == 4 || sample_size_recv == 3, - "Bad DSD recv sample size: %u", sample_size_recv); - - uint32_t left, right; - - if (sample_size_recv == 4) { - usb_step = 8; - } else { - usb_step = 6; - } - - codec_step = 4; - - while (cur_buf + codec_step <= buf_end) { - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - if (usb_step == 8) { - left = *(uint32_t *)usb_cur_buf; - right = *((uint32_t *)usb_cur_buf + 1); - } else { - left = ((usb_cur_buf[0] << 8) | (usb_cur_buf[1] << 16)); - right = ((usb_cur_buf[3] << 8) | (usb_cur_buf[4] << 16)); - } - - left = __RBIT(left) >> 8; - right = __RBIT(right) >> 8; - - *(uint16_t *)cur_buf = left; - *((uint16_t *)cur_buf + 1) = right; - - cur_buf += codec_step; - usb_cur_buf += usb_step; - } -#endif - - } else if (sample_size_play == 4 && - (sample_size_recv == 4 || sample_size_recv == 3 || - sample_size_recv == 2)) { - - int32_t left, right; - - if (sample_size_recv == 4) { - usb_step = 8; - } else if (sample_size_recv == 3) { - usb_step = 6; - } else { - usb_step = 4; - } - - if ((sample_rate_play == 96000 && sample_rate_recv == 48000) || - (sample_rate_play == 88200 && sample_rate_recv == 44100)) { - codec_step = 16; - } else if (sample_rate_play == sample_rate_recv) { - codec_step = 8; - } else if (sample_rate_play == 96000 && sample_rate_recv == 192000) { - codec_step = 8; - down_sampling = true; - } else { - ASSERT(false, "1: Invalid sample_rate_play=%u sample_rate_recv=%u", - sample_rate_play, sample_rate_recv); - } - - while (cur_buf + codec_step <= buf_end) { - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - if (usb_step == 8) { - left = *(int32_t *)usb_cur_buf; - right = *((int32_t *)usb_cur_buf + 1); - } else if (usb_step == 6) { - left = ((usb_cur_buf[0] << 8) | (usb_cur_buf[1] << 16) | - (usb_cur_buf[2] << 24)); - right = ((usb_cur_buf[3] << 8) | (usb_cur_buf[4] << 16) | - (usb_cur_buf[5] << 24)); - } else { - left = *(int16_t *)usb_cur_buf << 16; - right = *((int16_t *)usb_cur_buf + 1) << 16; - } - // Convert to 24-bit sample - left >>= 8; - right >>= 8; - - if (down_sampling) { - int32_t left_next, right_next; - - usb_cur_buf += usb_step; - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - if (usb_step == 8) { - left_next = *(int32_t *)usb_cur_buf; - right_next = *((int32_t *)usb_cur_buf + 1); - } else if (usb_step == 6) { - left_next = ((usb_cur_buf[0] << 8) | (usb_cur_buf[1] << 16) | - (usb_cur_buf[2] << 24)); - right_next = ((usb_cur_buf[3] << 8) | (usb_cur_buf[4] << 16) | - (usb_cur_buf[5] << 24)); - } else { - left_next = *(int16_t *)usb_cur_buf << 16; - right_next = *((int16_t *)usb_cur_buf + 1) << 16; - } - // Convert to 24-bit sample - left_next >>= 8; - right_next >>= 8; - - // The addition of two 24-bit integers will not saturate - left = (left + left_next) / 2; - right = (right + right_next) / 2; - } - - *(int32_t *)cur_buf = left; - *((int32_t *)cur_buf + 1) = right; - if (codec_step == 16) { - *((int32_t *)cur_buf + 2) = left; - *((int32_t *)cur_buf + 3) = right; - } - - cur_buf += codec_step; - usb_cur_buf += usb_step; - } - - } else if (sample_size_play == 2 && sample_size_recv == 2) { - - int16_t left, right; - - usb_step = 4; - - if ((sample_rate_play == 96000 && sample_rate_recv == 48000) || - (sample_rate_play == 88200 && sample_rate_recv == 44100)) { - codec_step = 8; - } else if (sample_rate_play == sample_rate_recv) { - codec_step = 4; - } else if (sample_rate_play == 96000 && sample_rate_recv == 192000) { - codec_step = 4; - down_sampling = true; - } else { - ASSERT(false, "2: Invalid sample_rate_play=%u sample_rate_recv=%u", - sample_rate_play, sample_rate_recv); - } - - while (cur_buf + codec_step <= buf_end) { - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - left = *(int16_t *)usb_cur_buf; - right = *((int16_t *)usb_cur_buf + 1); - if (down_sampling) { - // Use 32-bit integers to avoid saturation - int32_t left32, right32; - - usb_cur_buf += usb_step; - if (usb_cur_buf + usb_step > usb_buf_end) { - usb_cur_buf = usb_recv_buf; - } - left32 = *(int16_t *)usb_cur_buf; - right32 = *((int16_t *)usb_cur_buf + 1); - left = (left + left32) / 2; - right = (right + right32) / 2; - } - *(int16_t *)cur_buf = left; - *((int16_t *)cur_buf + 1) = right; - if (codec_step == 8) { - *((int16_t *)cur_buf + 2) = left; - *((int16_t *)cur_buf + 3) = right; - } - cur_buf += codec_step; - usb_cur_buf += usb_step; - } - - } else { - - ASSERT(false, "3: Invalid sample_size_play=%u sample_size_recv=%u", - sample_size_play, sample_size_recv); - } - } - -#endif // !USB_AUDIO_MULTIFUNC - - //---------------------------------------- - // USB->CODEC stream format conversion end - //---------------------------------------- -_conv_end: - - play_next = buf + len - playback_buf; - if (play_next >= playback_size) { - play_next -= playback_size; - } - - lock = int_lock(); - if (codec_play_seq == usb_recv_seq) { -#ifdef USB_AUDIO_MULTIFUNC - if (playback_state == AUDIO_ITF_STATE_STARTED) { - if (recv_valid) { - usb_recv_rpos = new_rpos; - } - if (recv2_valid) { - usb_recv2_rpos = new_rpos2; - } - } else { - if (recv_valid) { - usb_recv_rpos = 0; - } - if (recv2_valid) { - usb_recv2_rpos = 0; - } - } - if (conflicted) { - playback_conflicted = conflicted; - } - if (conflicted2) { - playback_conflicted2 = conflicted2; - } -#else - if (playback_state == AUDIO_ITF_STATE_STARTED) { - usb_recv_rpos = new_rpos; - } else { - usb_recv_rpos = 0; - } - if (conflicted) { - playback_conflicted = conflicted; - } -#endif - playback_pos = play_next; - } - int_unlock(lock); - - //---------------------------------------- - // Audio processing start - //---------------------------------------- - -#ifdef FREQ_RESP_EQ - freq_resp_eq_run(conv_buf, len); -#endif -#if defined(__HW_FIR_DSD_PROCESS__) - if (codec_dsd_enabled) { - dsd_process(conv_buf, len); - } -#endif - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_IIR_EQ_PROCESS__) - if (eq_opened) { - audio_process_run(conv_buf, len); - } -#endif - - // If conv_buf != buf, copy the output to buf - - //---------------------------------------- - // Audio processing end - //---------------------------------------- - -#ifdef NOISE_GATING - bool noise_mute = true; -#ifdef NOISE_REDUCTION - bool nr_fire = true; - uint8_t chan = 0; -#endif - - if (sample_size_play == 2) { - int16_t *samp = (int16_t *)buf; - for (uint32_t i = 0; i < len / 2; i++) { - if (ABS(samp[i]) >= NOISE_GATING_THRESH_16BIT) { - noise_mute = false; - break; - } - // NOISE_REDUCTION is unstable for 16-bit streams for unknown reasons. - // Skip by now. - } - } else { - int32_t *samp = (int32_t *)buf; - for (uint32_t i = 0; i < len / 4; i++) { - if (ABS(samp[i]) >= NOISE_GATING_THRESH_24BIT) { - noise_mute = false; -#ifndef NOISE_REDUCTION - break; -#endif - } -#ifdef NOISE_REDUCTION - if (nr_fire) { - if (ABS(samp[i]) >= NOISE_REDUCTION_THRESH_24BIT) { - nr_fire = false; - } else { - cur_zero_diff[chan][0]++; - cur_zero_diff[chan][1]++; - if ((prev_samp_positive[chan] && samp[i] < 0) || - (!prev_samp_positive[chan] && samp[i] >= 0)) { - if (ABS(cur_zero_diff[chan][prev_samp_positive[chan]] - - prev_zero_diff[chan][prev_samp_positive[chan]]) < 2) { - if (nr_cont_cnt < NOISE_REDUCTION_MATCH_CNT) { - nr_cont_cnt++; - } - } else if (nr_cont_cnt > 2) { - nr_fire = false; - } - prev_zero_diff[chan][prev_samp_positive[chan]] = - cur_zero_diff[chan][prev_samp_positive[chan]]; - cur_zero_diff[chan][prev_samp_positive[chan]] = 0; - } - prev_samp_positive[chan] = (samp[i] >= 0); - // Switch channel - chan = !chan; - } - } -#endif - } - } - -#ifdef NOISE_REDUCTION - if (noise_mute) { - nr_fire = false; - } - if (nr_fire) { - if (nr_cont_cnt >= NOISE_REDUCTION_MATCH_CNT && !nr_active && - noise_reduction_cmd != NOISE_REDUCTION_CMD_FIRE) { - if (cur_time - last_nr_restore_time >= NOISE_REDUCTION_INTERVAL) { - TRACE(8, - "\nFire noise reduction: cur0=%u/%u cur1=%u/%u prev0=%u/%u " - "prev1=%u/%u\n", - cur_zero_diff[0][0], cur_zero_diff[0][1], cur_zero_diff[1][0], - cur_zero_diff[1][1], prev_zero_diff[0][0], prev_zero_diff[0][1], - prev_zero_diff[1][0], prev_zero_diff[1][1]); - noise_reduction_cmd = NOISE_REDUCTION_CMD_FIRE; - enqueue_unique_cmd(AUDIO_CMD_NOISE_REDUCTION); - } - } - } else { - if (nr_active && noise_reduction_cmd != NOISE_REDUCTION_CMD_RESTORE) { - TRACE(8, - "\nRestore noise reduction: cur0=%u/%u cur1=%u/%u prev0=%u/%u " - "prev1=%u/%u\n", - cur_zero_diff[0][0], cur_zero_diff[0][1], cur_zero_diff[1][0], - cur_zero_diff[1][1], prev_zero_diff[0][0], prev_zero_diff[0][1], - prev_zero_diff[1][0], prev_zero_diff[1][1]); - noise_reduction_cmd = NOISE_REDUCTION_CMD_RESTORE; - enqueue_unique_cmd(AUDIO_CMD_NOISE_REDUCTION); - } - memset(prev_zero_diff, 0, sizeof(prev_zero_diff)); - memset(cur_zero_diff, 0, sizeof(cur_zero_diff)); - nr_cont_cnt = 0; - last_nr_restore_time = cur_time; - } -#endif - - if (noise_mute) { - if ((mute_user_map & (1 << CODEC_MUTE_USER_NOISE_GATING)) == 0 && - noise_gating_cmd != NOISE_GATING_CMD_MUTE) { - if (cur_time - last_high_signal_time >= NOISE_GATING_INTERVAL) { - noise_gating_cmd = NOISE_GATING_CMD_MUTE; - enqueue_unique_cmd(AUDIO_CMD_NOISE_GATING); - } - } - } else { - if ((mute_user_map & (1 << CODEC_MUTE_USER_NOISE_GATING)) && - noise_gating_cmd != NOISE_GATING_CMD_UNMUTE) { - noise_gating_cmd = NOISE_GATING_CMD_UNMUTE; - enqueue_unique_cmd(AUDIO_CMD_NOISE_GATING); - } - last_high_signal_time = cur_time; - } -#endif - -#if (VERBOSE_TRACE & (1 << 1)) - { - int hw_play_pos = - af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - TRACE_TIME(2, "playbackEnd: playback_pos=%u hw_play_pos=%d", playback_pos, - hw_play_pos); - } -#endif - - return 0; -} - -static uint32_t usb_audio_data_capture(uint8_t *buf, uint32_t len) { - uint32_t usb_len; - uint32_t old_wpos, saved_old_wpos, new_wpos, rpos; - uint8_t init_pos; - uint8_t conflicted; - uint32_t reset_len = usb_send_size / 2; - uint32_t cap_next; - uint32_t lock; - uint8_t *conv_buf; - uint32_t cur_time; - uint32_t usb_time; -#ifdef SW_CAPTURE_RESAMPLE - enum RESAMPLE_STATUS_T ret; - struct RESAMPLE_IO_BUF_T io; - uint32_t in_size; - uint32_t out_size; - uint32_t resample_frame_len = 0; -#endif - - usb_time = last_usb_send_time; - cur_time = hal_sys_timer_get(); - - ASSERT(((uint32_t)buf & 0x3) == 0, "%s: Invalid buf: %p", __FUNCTION__, buf); - - if (codec_cap_valid == 0 && - cur_time - codec_cap_start_time >= CAPTURE_STABLE_INTERVAL) { - codec_cap_valid = 1; - } - - if (codec_cap_seq != usb_send_seq || - capture_state == AUDIO_ITF_STATE_STOPPED || - send_state == AUDIO_ITF_STATE_STOPPED || codec_cap_valid == 0 || - usb_send_valid == 0 || cur_time - usb_time > USB_MAX_XFER_INTERVAL) { - _invalid_cap: - new_wpos = 0; - conflicted = 0; - goto _conv_end; - } - - if (usb_send_init_wpos) { - init_pos = 0; - } else { - init_pos = 1; - } - - //---------------------------------------- - // Check conflict - //---------------------------------------- - - usb_len = capture_to_send_len(len); - conflicted = 0; - - lock = int_lock(); - rpos = usb_send_rpos; - if (init_pos) { - old_wpos = rpos + reset_len; - if (old_wpos >= usb_send_size) { - old_wpos -= usb_send_size; - } - usb_send_wpos = old_wpos; - usb_send_init_wpos = 1; - } else { - old_wpos = usb_send_wpos; - } - saved_old_wpos = old_wpos; - new_wpos = usb_send_wpos + usb_len; - if (new_wpos >= usb_send_size) { - new_wpos -= usb_send_size; - } - if (init_pos == 0) { - if (old_wpos <= rpos) { - if (new_wpos < old_wpos || rpos < new_wpos) { - conflicted = 1; - } - } else { - if (rpos < new_wpos && new_wpos < old_wpos) { - conflicted = 1; - } - } - if (conflicted) { - // Reset write position - old_wpos = rpos + reset_len; - if (old_wpos >= usb_send_size) { - old_wpos -= usb_send_size; - } - new_wpos = old_wpos + usb_len; - if (new_wpos >= usb_send_size) { - new_wpos -= usb_send_size; - } - // Update global write position - usb_send_wpos = old_wpos; - } - } - int_unlock(lock); - - if (conflicted) { - TRACE(4, - "capture: Error: wpos=%u goes beyond rpos=%u with usb_len=%u. Reset " - "to %u", - saved_old_wpos, rpos, usb_len, old_wpos); - } - -#if (VERBOSE_TRACE & (1 << 2)) - TRACE_TIME(5, "capture: wpos=%u usb_len=%u rpos=%u cap_pos=%u len=%u", - old_wpos, usb_len, rpos, buf + len - capture_buf, len); -#endif - - if (codec_cap_seq != usb_send_seq) { - goto _invalid_cap; - } - - record_conflict(conflicted); - - //---------------------------------------- - // Audio processing start - //---------------------------------------- - - // TODO ... - - //---------------------------------------- - // Audio processing end - //---------------------------------------- - - //---------------------------------------- - // Speech processing start - //---------------------------------------- -#ifdef USB_AUDIO_SPEECH - speech_process_capture_run(buf, &len); -#endif - //---------------------------------------- - // Speech processing end - //---------------------------------------- - - //---------------------------------------- - // CODEC->USB stream format conversion start - //---------------------------------------- - - conv_buf = buf; - - { - uint8_t POSSIBLY_UNUSED *cur_buf, *buf_end, *dst_buf_start, *dst_cur_buf, - *dst_buf_end; - - cur_buf = conv_buf; - buf_end = conv_buf + len; -#ifdef SW_CAPTURE_RESAMPLE - if (resample_cap_enabled) { -#if (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) -#if (defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) - // codec capture buffer --(ref rate conversion)--> resample input buffer - // --(resample)--> usb send buffer - -#ifdef USB_AUDIO_DYN_CFG - // Resample frame len is the capture reference len after reference rate - // conversion - resample_frame_len = capture_to_ref_len(len); -#else - // Resample frame len is the capture len - resample_frame_len = len; -#endif - ASSERT(resample_frame_len <= resample_input_size, - "resample_input_size too small: %u len=%u resample_frame_len=%u", - resample_input_size, len, resample_frame_len); - - dst_buf_start = resample_input_buf; - dst_cur_buf = resample_input_buf; - dst_buf_end = resample_input_buf + resample_frame_len; -#else // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) - // codec capture buffer --(resample)--> usb send buffer - - resample_input_buf = cur_buf; - // Resample frame len is the capture len - resample_frame_len = len; - - dst_buf_start = cur_buf; - dst_cur_buf = cur_buf; - dst_buf_end = cur_buf + len; -#endif // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) -#elif (CHAN_NUM_CAPTURE == 2) && (CHAN_NUM_SEND == 1) - // codec capture buffer --(chan num conversion)--> codec capture buffer - // --(resample)--> usb send buffer - - resample_input_buf = cur_buf; - // Resample frame len is half of the capture len - resample_frame_len = len / 2; - - dst_buf_start = cur_buf; - dst_cur_buf = cur_buf; - dst_buf_end = cur_buf + resample_frame_len; -#elif (CHAN_NUM_CAPTURE == 1) && (CHAN_NUM_SEND == 2) - // codec capture buffer --(resample)--> usb send buffer --(chan num - // conversion)--> usb send buffer - - // Resample frame len is the capture len - resample_frame_len = len; - - io.in = cur_buf; - io.in_size = resample_frame_len; - io.out = usb_send_buf + old_wpos; - io.out_size = usb_len / 2; - io.out_cyclic_start = usb_send_buf; - io.out_cyclic_end = usb_send_buf + usb_send_size; - - ret = audio_resample_ex_run(resample_id, &io, &in_size, &out_size); - ASSERT((ret == RESAMPLE_STATUS_IN_EMPTY || ret == RESAMPLE_STATUS_DONE) && - io.out_size >= out_size, - "Failed to resample: %d io.out_size=%u in_size=%u out_size=%u", - ret, io.out_size, in_size, out_size); - - uint32_t diff = usb_len - out_size * 2; - if (new_wpos >= diff) { - new_wpos -= diff; - } else { - new_wpos = new_wpos + usb_send_size - diff; - } - -#if (VERBOSE_TRACE & (1 << 3)) - TRACE(5, "cap_resample: new_wpos=%u, in: %u -> %u, out: %u -> %u", - new_wpos, io.in_size, in_size, io.out_size, out_size); -#endif - - dst_buf_start = usb_send_buf; - dst_cur_buf = usb_send_buf + old_wpos; - dst_buf_end = usb_send_buf + usb_send_size; - cur_buf = dst_cur_buf; - buf_end = cur_buf + out_size; - if (buf_end >= usb_send_buf + usb_send_size) { - buf_end -= usb_send_size; - } -#else -#error "Unsupported CHAN_NUM_CAPTURE and CHAN_NUM_SEND configuration" -#endif - } else -#endif // SW_CAPTURE_RESAMPLE - { - dst_buf_start = usb_send_buf; - dst_cur_buf = usb_send_buf + old_wpos; - dst_buf_end = usb_send_buf + usb_send_size; - } - -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) - - // Assuming codec adc records stereo data, and usb sends 48K/44.1K stereo - // data -#if (CHAN_NUM_CAPTURE != 2) || (CHAN_NUM_SEND != 2) -#error "Unsupported CHAN_NUM_CAPTURE and CHAN_NUM_SEND configuration" -#endif - - { -#define MERGE_VER 2 -#if (MERGE_VER == 2) -#define THRES_MIC3 32500 -#else -#define THRES_MIC3 27168 -#endif -#define SHIFT_BITS 4 - - uint32_t i = 0; - short *BufSrc = (short *)cur_buf; - short *BufDst = (short *)dst_cur_buf; - short *BufDstStart = (short *)dst_buf_start; - short *BufDstEnd = (short *)dst_buf_end; - - int32_t PcmValue = 0; - int32_t BufSrcRVal = 0; - - uint32_t step; - - // TRACE(3,"%s - %d, %d", __func__, BufSrc[0], BufSrc[1]); - // TRACE(2,"%s - %d", __func__, TICKS_TO_MS(cur_time)); - - if (sample_rate_cap == 384000 || sample_rate_cap == 352800) { - step = 2; - } else if (sample_rate_cap == 192000 || sample_rate_cap == 176400) { - step = 1; - } else { - ASSERT(false, - "1: Invalid sample_rate_cap=%u sample_rate_ref_cap=%u " - "sample_rate_send=%u", - sample_rate_cap, sample_rate_ref_cap, sample_rate_send); - } - - get_amic_dc(BufSrc, len >> 2, step); - - for (i = 0; i < (len >> 2); i += step) { - if (step == 2) { - if (!(i & 0x1)) { - PcmValue = ((int32_t)(BufSrc[i << 1])); - BufSrcRVal = ((int32_t)(BufSrc[(i << 1) + 1])); -#if (MERGE_VER == 2) - if ((PcmValue < THRES_MIC3) && (PcmValue > -THRES_MIC3)) { - PcmValue = (PcmValue - s_amic3_dc) >> SHIFT_BITS; - } else { - PcmValue = BufSrcRVal - s_amic4_dc; - } -#else // (MERGE_VER == 1) - PcmValue -= s_amic3_dc; - if ((PcmValue < THRES_MIC3) && (PcmValue > -THRES_MIC3)) { - PcmValue >>= SHIFT_BITS; - } else { - PcmValue = BufSrcRVal - s_amic4_dc; - } -#endif // MERGE_VER - PcmValue = soir_filter(PcmValue); -#ifdef DUAL_AUX_MIC_MORE_FILTER - PcmValue = soir_filter1(PcmValue); - PcmValue = soir_filter2(PcmValue); -#endif - if (!(i & 7)) { - if (BufDst + 2 > BufDstEnd) { - BufDst = BufDstStart; - } - *BufDst++ = PcmValue; - *BufDst++ = PcmValue; - } - } - } else { - if (!(i & 0x1)) { - PcmValue = ((int32_t)(BufSrc[i << 1])); - BufSrcRVal = ((int32_t)(BufSrc[(i << 1) + 1])); -#if (MERGE_VER == 2) - if ((PcmValue < THRES_MIC3) && (PcmValue > -THRES_MIC3)) { - PcmValue = (PcmValue - s_amic3_dc) >> SHIFT_BITS; - } else { - PcmValue = BufSrcRVal - s_amic4_dc; - } -#else // (MERGE_VER == 1) - PcmValue -= s_amic3_dc; - if ((PcmValue < THRES_MIC3) && (PcmValue > -THRES_MIC3)) { - PcmValue >>= SHIFT_BITS; - } else { - PcmValue = BufSrcRVal - s_amic4_dc; - } -#endif // MERGE_VER - PcmValue = soir_filter(PcmValue); -#ifdef DUAL_AUX_MIC_MORE_FILTER - PcmValue = soir_filter1(PcmValue); - PcmValue = soir_filter2(PcmValue); -#endif - if (!(i & 3)) { - if (BufDst + 2 > BufDstEnd) { - BufDst = BufDstStart; - } - *BufDst++ = PcmValue; - *BufDst++ = PcmValue; - } - } - } - } - } - -#elif defined(CHIP_BEST1000) && defined(ANC_APP) - - // Assuming codec adc records stereo data, and usb sends 48K/44.1K stereo - // data -#if (CHAN_NUM_CAPTURE != 2) || (CHAN_NUM_SEND != 2) -#error "Unsupported CHAN_NUM_CAPTURE and CHAN_NUM_SEND configuration" -#endif - - if ((sample_rate_ref_cap == 48000 || sample_rate_ref_cap == 44100) && - (sample_rate_cap == sample_rate_ref_cap * 2 || - sample_rate_cap == sample_rate_ref_cap * 4 || - sample_rate_cap == sample_rate_ref_cap * 8 || - sample_rate_cap == sample_rate_ref_cap * 16)) { - - uint32_t POSSIBLY_UNUSED factor = sample_rate_cap / sample_rate_ref_cap; - int32_t POSSIBLY_UNUSED left = 0; - int32_t POSSIBLY_UNUSED right = 0; - uint32_t step = factor * 4; - - while (cur_buf + step <= buf_end) { - if (dst_cur_buf + 4 > dst_buf_end) { - dst_cur_buf = dst_buf_start; - } - - // Downsampling the adc data -#if 1 - left = 0; - right = 0; - for (int i = 0; i < factor; i++) { - left += *(int16_t *)(cur_buf + 4 * i); - right += *(int16_t *)(cur_buf + 4 * i + 2); - } - *(int16_t *)dst_cur_buf = left / factor; - *(int16_t *)(dst_cur_buf + 2) = right / factor; -#else - *(int16_t *)dst_cur_buf = *(int16_t *)cur_buf; - *(int16_t *)(dst_cur_buf + 2) = *(int16_t *)(cur_buf + 2); -#endif - - // Move to next data - dst_cur_buf += 4; - cur_buf += step; - } - - } else { - ASSERT(false, - "2: Invalid sample_rate_cap=%u sample_rate_ref_cap=%u " - "sample_rate_send=%u", - sample_rate_cap, sample_rate_ref_cap, sample_rate_send); - } - -#else // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) - -#ifndef SW_CAPTURE_RESAMPLE - ASSERT(sample_rate_cap == sample_rate_send, - "3: Invalid sample_rate_cap=%u sample_rate_send=%u", sample_rate_cap, - sample_rate_send); -#endif - -// When USB_AUDIO_SPEECH is enable, buf after algorithm shoule be CHAN_NUM_SEND, -// do not need to convert any more. -#if (CHAN_NUM_CAPTURE == 2) && (CHAN_NUM_SEND == 1) && \ - !defined(USB_AUDIO_SPEECH) - - // Assuming codec adc always records stereo data - - while (cur_buf + 4 <= buf_end) { - // Copy left channel data - if (dst_cur_buf + 2 > dst_buf_end) { - dst_cur_buf = dst_buf_start; - } - *(int16_t *)dst_cur_buf = *(int16_t *)cur_buf; - - // Move to next data - dst_cur_buf += 2; - cur_buf += 4; - } - -#elif (CHAN_NUM_CAPTURE == 1) && (CHAN_NUM_SEND == 2) && \ - !defined(USB_AUDIO_SPEECH) - - // Assuming codec adc always records mono data - -#ifdef SW_CAPTURE_RESAMPLE -#if (CHAN_NUM_CAPTURE == 1) && (CHAN_NUM_SEND == 2) - if (resample_cap_enabled) { - // ASSERT(cur_buf == dst_cur_buf, "Bad assumption"); - uint32_t src_len; - - if (buf_end < cur_buf) { - src_len = buf_end + usb_send_size - cur_buf; - } else { - src_len = buf_end - cur_buf; - } - cur_buf = buf_end - 2; - if (cur_buf < dst_buf_start) { - cur_buf += usb_send_size; - } - dst_cur_buf += src_len * 2 - 4; - if (dst_cur_buf >= dst_buf_end) { - dst_cur_buf -= usb_send_size; - } - while (src_len > 0) { - *(int16_t *)dst_cur_buf = *(int16_t *)cur_buf; - *(int16_t *)(dst_cur_buf + 2) = *(int16_t *)cur_buf; - - // Move to next data - src_len -= 2; - cur_buf -= 2; - if (cur_buf < dst_buf_start) { - cur_buf += usb_send_size; - } - dst_cur_buf -= 4; - if (dst_cur_buf < dst_buf_start) { - dst_cur_buf += usb_send_size; - } - } - } else -#endif -#endif - { - while (cur_buf + 2 <= buf_end) { - // Duplicate the mono data - if (dst_cur_buf + 4 > dst_buf_end) { - dst_cur_buf = dst_buf_start; - } - *(int16_t *)dst_cur_buf = *(int16_t *)cur_buf; - *(int16_t *)(dst_cur_buf + 2) = *(int16_t *)cur_buf; - - // Move to next data - dst_cur_buf += 4; - cur_buf += 2; - } - } - -#else // (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) - - // The channel numbers of codec adc and USB data are the same - - if (sample_size_cap == sample_size_send) { -#if ((CHAN_NUM_CAPTURE & 1) == 0) -#define COPY_MEM(dst, src, size) copy_mem32(dst, src, size) -#else -#define COPY_MEM(dst, src, size) copy_mem16(dst, src, size) -#endif - if (dst_cur_buf != cur_buf) { - if (dst_cur_buf + len <= dst_buf_end) { - COPY_MEM(dst_cur_buf, cur_buf, len); - } else { - uint32_t copy_len; - - if (dst_cur_buf >= dst_buf_end) { - copy_len = 0; - } else { - copy_len = dst_buf_end - dst_cur_buf; - COPY_MEM(dst_cur_buf, cur_buf, copy_len); - } - COPY_MEM(dst_buf_start, cur_buf + copy_len, len - copy_len); - } - } -#undef COPY_MEM - } else if (sample_size_cap == 4 && sample_size_send == 3) { - uint32_t codec_step, usb_step; - uint32_t ch; - - codec_step = CHAN_NUM_CAPTURE * 4; - usb_step = CHAN_NUM_SEND * 3; - - while (cur_buf + codec_step <= buf_end) { - if (dst_cur_buf + usb_step > dst_buf_end) { - dst_cur_buf = dst_buf_start; - } - for (ch = 0; ch < CHAN_NUM_CAPTURE; ch++) { - *(uint16_t *)dst_cur_buf = *(uint16_t *)cur_buf; - *(uint8_t *)(dst_cur_buf + 2) = *(uint8_t *)(cur_buf + 2); - // Move to next channel - dst_cur_buf += 3; - cur_buf += 4; - } - } - } else { - ASSERT(false, "4: Invalid sample_size_cap=%u sample_size_send=%u", - sample_size_cap, sample_size_send); - } - -#endif // (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) - -#endif // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) - -#ifdef SW_CAPTURE_RESAMPLE -#if !((CHAN_NUM_CAPTURE == 1) && (CHAN_NUM_SEND == 2)) - if (resample_cap_enabled) { - io.in = resample_input_buf; - io.in_size = resample_frame_len; - io.out = usb_send_buf + old_wpos; - io.out_size = usb_len; - io.out_cyclic_start = usb_send_buf; - io.out_cyclic_end = usb_send_buf + usb_send_size; - - ret = audio_resample_ex_run(resample_id, &io, &in_size, &out_size); - ASSERT((ret == RESAMPLE_STATUS_IN_EMPTY || ret == RESAMPLE_STATUS_DONE) && - io.out_size >= out_size, - "Failed to resample: %d io.out_size=%u io.in_size=%u in_size=%u " - "out_size=%u", - ret, io.out_size, io.in_size, in_size, out_size); - - uint32_t diff = usb_len - out_size; - if (new_wpos >= diff) { - new_wpos -= diff; - } else { - new_wpos = new_wpos + usb_send_size - diff; - } - -#if (VERBOSE_TRACE & (1 << 3)) - TRACE(5, "cap_resample: new_wpos=%u, in: %u -> %u, out: %u -> %u", - new_wpos, io.in_size, in_size, io.out_size, out_size); -#endif - } -#endif -#endif - } - - //---------------------------------------- - // CODEC->USB stream format conversion end - //---------------------------------------- -_conv_end: - - cap_next = buf + len - capture_buf; - if (cap_next >= capture_size) { - cap_next -= capture_size; - } - - lock = int_lock(); - if (codec_cap_seq == usb_send_seq) { - if (capture_state == AUDIO_ITF_STATE_STARTED) { - usb_send_wpos = new_wpos; - } else { - usb_send_wpos = 0; - } - capture_pos = cap_next; - if (conflicted) { - capture_conflicted = conflicted; - } - } - int_unlock(lock); - -#if (VERBOSE_TRACE & (1 << 4)) - TRACE_TIME(0, "captureEnd"); -#endif - - return 0; -} - -static void update_playback_sync_info(void) { - playback_info.err_thresh = DIFF_ERR_THRESH_PLAYBACK; - playback_info.samp_rate = sample_rate_play; - playback_info.samp_cnt = byte_to_samp_recv(usb_recv_size); -#ifdef TARGET_TO_MAX_DIFF - playback_info.max_target_thresh = playback_info.samp_cnt / 2; - playback_info.diff_target = - byte_to_samp_recv(playback_to_recv_len(playback_size / 2)) + - playback_info.samp_cnt / 2; - playback_info.diff_target = usb_audio_sync_normalize_diff( - -playback_info.diff_target, playback_info.samp_cnt); -#endif - - TRACE(4, "%s: rate=%u cnt=%u (%u)", __FUNCTION__, playback_info.samp_rate, - playback_info.samp_cnt, usb_recv_size); -} - -static void update_capture_sync_info(void) { - capture_info.err_thresh = DIFF_ERR_THRESH_CAPTURE; - capture_info.samp_rate = sample_rate_cap; - capture_info.samp_cnt = byte_to_samp_send(usb_send_size); -#ifdef TARGET_TO_MAX_DIFF - capture_info.max_target_thresh = capture_info.samp_cnt / 2; - capture_info.diff_target = - byte_to_samp_send(capture_to_send_len(capture_size / 2)) + - capture_info.samp_cnt / 2; - capture_info.diff_target = usb_audio_sync_normalize_diff( - capture_info.diff_target, capture_info.samp_cnt); -#endif - - TRACE(4, "%s: rate=%u cnt=%u (%u)", __FUNCTION__, capture_info.samp_rate, - capture_info.samp_cnt, usb_send_size); -} - -static int usb_audio_open_codec_stream(enum AUD_STREAM_T stream, - enum AUDIO_STREAM_REQ_USER_T user) { - int ret = 0; - struct AF_STREAM_CONFIG_T stream_cfg; - - TRACE(4, "%s: stream=%d user=%d map=0x%x", __FUNCTION__, stream, user, - codec_stream_map[stream][AUDIO_STREAM_OPENED]); - - if (user >= AUDIO_STREAM_REQ_USER_QTY || - codec_stream_map[stream][AUDIO_STREAM_OPENED] == 0) { - memset(&stream_cfg, 0, sizeof(stream_cfg)); - - if (stream == AUD_STREAM_PLAYBACK) { -#if defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY) - playback_size = calc_playback_size(sample_rate_play); -#endif - - update_playback_sync_info(); - -#ifdef CODEC_DSD - if (codec_dsd_enabled) { - stream_cfg.bits = AUD_BITS_24; - } else -#endif - { - stream_cfg.bits = sample_size_to_enum_playback(sample_size_play); - } - stream_cfg.sample_rate = sample_rate_play; - stream_cfg.channel_num = chan_num_to_enum(CHAN_NUM_PLAYBACK); -#ifdef USB_I2S_APP -#if defined(USB_I2S_ID) && (USB_I2S_ID == 0) - stream_cfg.device = AUD_STREAM_USE_I2S0_MASTER; -#else - stream_cfg.device = AUD_STREAM_USE_I2S1_MASTER; -#endif -#else - stream_cfg.device = AUD_STREAM_USE_INT_CODEC; -#endif - stream_cfg.vol = playback_vol; - stream_cfg.handler = usb_audio_data_playback; - stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER; - stream_cfg.data_ptr = playback_buf; - stream_cfg.data_size = playback_size; - - // TRACE(3,"[%s] sample_rate: %d, bits = %d", __func__, - // stream_cfg.sample_rate, stream_cfg.bits); - - ret = af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg); - ASSERT(ret == 0, "af_stream_open playback failed: %d", ret); - -#ifdef AUDIO_ANC_FB_MC - stream_cfg.bits = sample_size_to_enum_playback(sample_size_play); - stream_cfg.sample_rate = sample_rate_play; - stream_cfg.channel_num = chan_num_to_enum(CHAN_NUM_PLAYBACK); - stream_cfg.device = AUD_STREAM_USE_MC; - stream_cfg.vol = playback_vol; - stream_cfg.handler = audio_mc_data_playback; - stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER; - stream_cfg.data_ptr = playback_buf + playback_size; - - mid_p_8_old_l = 0; - mid_p_8_old_r = 0; - - if (sample_rate_play == AUD_SAMPRATE_8000) { - playback_samplerate_ratio = 8 * 6; - } else if (sample_rate_play == AUD_SAMPRATE_16000) { - playback_samplerate_ratio = 8 * 3; - } else if ((sample_rate_play == AUD_SAMPRATE_44100) || - (sample_rate_play == AUD_SAMPRATE_48000) || - (sample_rate_play == AUD_SAMPRATE_50781)) { - playback_samplerate_ratio = 8; - } else if ((sample_rate_play == AUD_SAMPRATE_88200) || - (sample_rate_play == AUD_SAMPRATE_96000)) { - playback_samplerate_ratio = 4; - } else if ((sample_rate_play == AUD_SAMPRATE_176400) || - (sample_rate_play == AUD_SAMPRATE_192000)) { - playback_samplerate_ratio = 2; - } else if (sample_rate_play == AUD_SAMPRATE_384000) { - playback_samplerate_ratio = 1; - } else { - playback_samplerate_ratio = 1; - ASSERT(false, "Music cancel can't support playback sample rate:%d", - sample_rate_play); - } - - anc_mc_run_init((sample_rate_play * playback_samplerate_ratio) / 8); - - stream_cfg.data_size = playback_size * playback_samplerate_ratio; - - // TRACE(3,"[%s] sample_rate: %d, bits = %d", __func__, - // stream_cfg.sample_rate, stream_cfg.bits); - - ret = af_stream_open(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &stream_cfg); - ASSERT(ret == 0, "af_stream_open playback failed: %d", ret); -#endif - } else { -#if defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY) - capture_size = calc_capture_size(sample_rate_cap); -#endif - - update_capture_sync_info(); - - stream_cfg.bits = sample_size_to_enum_capture(sample_size_cap); - stream_cfg.sample_rate = sample_rate_cap; - stream_cfg.channel_num = chan_num_to_enum(CHAN_NUM_CAPTURE); -#ifdef ANC_PROD_TEST - stream_cfg.channel_map = anc_fb_mic_ch_l | anc_fb_mic_ch_r; -#endif -#ifdef USB_I2S_APP -#if defined(USB_I2S_ID) && (USB_I2S_ID == 0) - stream_cfg.device = AUD_STREAM_USE_I2S0_MASTER; -#else - stream_cfg.device = AUD_STREAM_USE_I2S1_MASTER; -#endif -#else - stream_cfg.device = AUD_STREAM_USE_INT_CODEC; -#endif - stream_cfg.vol = capture_vol; - stream_cfg.handler = usb_audio_data_capture; -#if !defined(USB_AUDIO_SPEECH) && defined(BTUSB_AUDIO_MODE) - stream_cfg.io_path = AUD_INPUT_PATH_USBAUDIO; -#else - stream_cfg.io_path = AUD_INPUT_PATH_MAINMIC; -#endif - stream_cfg.data_ptr = capture_buf; - stream_cfg.data_size = capture_size; - - // TRACE(4,"[%s] sample_rate: %d, bits = %d, ch_num = %d", __func__, - // stream_cfg.sample_rate, stream_cfg.bits, stream_cfg.channel_num); - - ret = af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg); - ASSERT(ret == 0, "af_stream_open catpure failed: %d", ret); - } - } - - if (user < AUDIO_STREAM_REQ_USER_QTY) { - codec_stream_map[stream][AUDIO_STREAM_OPENED] |= (1 << user); - } - - return ret; -} - -static int usb_audio_close_codec_stream(enum AUD_STREAM_T stream, - enum AUDIO_STREAM_REQ_USER_T user) { - int ret = 0; - - TRACE(4, "%s: stream=%d user=%d map=0x%x", __FUNCTION__, stream, user, - codec_stream_map[stream][AUDIO_STREAM_OPENED]); - - if (user < AUDIO_STREAM_REQ_USER_QTY) { - codec_stream_map[stream][AUDIO_STREAM_OPENED] &= ~(1 << user); - } - - if (user >= AUDIO_STREAM_REQ_USER_QTY || - codec_stream_map[stream][AUDIO_STREAM_OPENED] == 0) { - ret = af_stream_close(AUD_STREAM_ID_0, stream); - -#ifdef AUDIO_ANC_FB_MC - if (stream == AUD_STREAM_PLAYBACK) { - ret = af_stream_close(AUD_STREAM_ID_2, stream); - } -#endif - } - - return ret; -} - -static int usb_audio_open_eq(void) { - int ret = 0; - - TRACE(4, "[%s] EQ: sample_rate_recv=%d, sample_rate_play=%d, sample_bits=%d", - __func__, sample_rate_recv, sample_rate_play, - sample_size_to_enum_playback(sample_size_play)); - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_IIR_EQ_PROCESS__) || defined(__HW_DAC_IIR_EQ_PROCESS__) - enum AUD_BITS_T sample_bits = sample_size_to_enum_playback(sample_size_play); - enum AUD_CHANNEL_NUM_T chan_num = chan_num_to_enum(CHAN_NUM_PLAYBACK); - ret = audio_process_open(sample_rate_play, sample_bits, chan_num, - playback_eq_size / 2, playback_eq_buf, - playback_eq_size); - - // TRACE(1,"audio_process_open: %d", ret); - -#ifdef __SW_IIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_SW_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_SW_IIR, 0)); -#endif - -#ifdef __HW_FIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_HW_FIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_FIR, 0)); -#endif - -#ifdef __HW_DAC_IIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_HW_DAC_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_DAC_IIR, 0)); -#endif - -#ifdef __HW_IIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_HW_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_IIR, 0)); -#endif - -#endif - - eq_opened = 1; - - return ret; -} - -static int usb_audio_close_eq(void) { - int ret = 0; - -#if defined(__SW_IIR_EQ_PROCESS__) || defined(__HW_FIR_EQ_PROCESS__) || \ - defined(__HW_IIR_EQ_PROCESS__) || defined(__HW_DAC_IIR_EQ_PROCESS__) - ret = audio_process_close(); -#endif - - eq_opened = 0; - - return ret; -} - -static int usb_audio_start_codec_stream(enum AUD_STREAM_T stream, - enum AUDIO_STREAM_REQ_USER_T user) { - int ret = 0; - - TRACE(4, "%s: stream=%d user=%d map=0x%x", __FUNCTION__, stream, user, - codec_stream_map[stream][AUDIO_STREAM_STARTED]); - - if (user >= AUDIO_STREAM_REQ_USER_QTY || - codec_stream_map[stream][AUDIO_STREAM_STARTED] == 0) { - reset_conflict(); - - if (stream == AUD_STREAM_PLAYBACK) { - zero_mem32(playback_buf, playback_size); - codec_play_valid = 0; - usb_recv_init_rpos = 0; - playback_pos = 0; - playback_conflicted = 0; -#ifdef USB_AUDIO_MULTIFUNC - usb_recv2_init_rpos = 0; - playback_conflicted2 = 0; -#endif -#ifdef DSD_SUPPORT - if (codec_dsd_enabled) { -#if defined(__HW_FIR_DSD_PROCESS__) - uint8_t *dsd_buf; - uint32_t dsd_size; - - // DoP format requirement - dsd_size = playback_size * 16; - ; - dsd_buf = (uint8_t *)(HW_FIR_DSD_BUF_MID_ADDR - dsd_size / 2); - dsd_open(sample_rate_play, AUD_BITS_24, AUD_CHANNEL_NUM_2, dsd_buf, - dsd_size); -#elif defined(CODEC_DSD) - af_dsd_enable(); -#endif - } -#endif - usb_audio_open_eq(); - } else { -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) - damic_init(); - init_amic_dc(); -#endif - -#ifdef USB_AUDIO_SPEECH - app_overlay_select(APP_OVERLAY_HFP); - - speech_process_init(sample_rate_cap, CHAN_NUM_CAPTURE, - sample_size_to_enum_playback(sample_size_cap), - sample_rate_play, CHAN_NUM_PLAYBACK, - sample_size_to_enum_playback(sample_size_play), 16, - 16, CHAN_NUM_SEND, CHAN_NUM_RECV); -#endif - - codec_cap_valid = 0; - usb_send_init_wpos = 0; - capture_pos = 0; - capture_conflicted = 0; - } - - // Tune rate according to the newest sync ratio info - usb_audio_cmd_tune_rate(stream); - - ret = af_stream_start(AUD_STREAM_ID_0, stream); - ASSERT(ret == 0, "af_stream_start %d failed: %d", stream, ret); - - if (stream == AUD_STREAM_PLAYBACK) { -#ifdef AUDIO_ANC_FB_MC - ret = af_stream_start(AUD_STREAM_ID_2, stream); - ASSERT(ret == 0, "af_stream_start %d failed: %d", stream, ret); -#endif - } else { - codec_cap_start_time = hal_sys_timer_get(); - } - } - - if (user < AUDIO_STREAM_REQ_USER_QTY) { - codec_stream_map[stream][AUDIO_STREAM_STARTED] |= (1 << user); - } - - return ret; -} - -static int usb_audio_stop_codec_stream(enum AUD_STREAM_T stream, - enum AUDIO_STREAM_REQ_USER_T user) { - int ret = 0; - - TRACE(4, "%s: stream=%d user=%d map=0x%x", __FUNCTION__, stream, user, - codec_stream_map[stream][AUDIO_STREAM_STARTED]); - - if (user < AUDIO_STREAM_REQ_USER_QTY) { - codec_stream_map[stream][AUDIO_STREAM_STARTED] &= ~(1 << user); - } - - if (user >= AUDIO_STREAM_REQ_USER_QTY || - codec_stream_map[stream][AUDIO_STREAM_STARTED] == 0) { - ret = af_stream_stop(AUD_STREAM_ID_0, stream); - - if (stream == AUD_STREAM_PLAYBACK) { -#ifdef AUDIO_ANC_FB_MC - ret = af_stream_stop(AUD_STREAM_ID_2, stream); -#endif -#ifdef DSD_SUPPORT - if (codec_dsd_enabled) { -#if defined(__HW_FIR_DSD_PROCESS__) - dsd_close(); -#elif defined(CODEC_DSD) - af_dsd_disable(); -#endif - } -#endif - usb_audio_close_eq(); - } else { -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) - damic_deinit(); -#endif - -#ifdef USB_AUDIO_SPEECH - speech_process_deinit(); - app_overlay_unloadall(); -#endif - } - } - - return ret; -} - -static int usb_audio_start_usb_stream(enum AUD_STREAM_T stream) { - int ret; - - reset_conflict(); - - if (stream == AUD_STREAM_PLAYBACK) { - usb_audio_sync_reset(&playback_info); - - usb_recv_valid = 0; -#ifdef USB_AUDIO_MULTIFUNC - if (recv2_state == AUDIO_ITF_STATE_STOPPED) -#endif - { - usb_recv_seq++; - } - - usb_recv_rpos = 0; - usb_recv_wpos = usb_recv_size / 2; - zero_mem32(usb_recv_buf, usb_recv_size); - - usb_recv_err_cnt = 0; - -#ifdef DSD_SUPPORT - usb_dsd_enabled = false; - usb_dsd_cont_cnt = 0; -#endif - - ret = usb_audio_start_recv(usb_recv_buf, usb_recv_wpos, usb_recv_size); - if (ret == 1) { - TRACE(0, "usb_audio_start_recv failed: usb not configured"); - } else { - ASSERT(ret == 0, "usb_audio_start_recv failed: %d", ret); - } - } else { -#ifndef UAUD_SYNC_STREAM_TARGET - if (recv_state == AUDIO_ITF_STATE_STOPPED) -#endif - { - usb_audio_sync_reset(&capture_info); - } - - usb_send_valid = 0; - usb_send_seq++; - - usb_send_rpos = usb_send_size / 2; - usb_send_wpos = 0; - zero_mem32(usb_send_buf, usb_send_size); - - usb_send_err_cnt = 0; - - ret = usb_audio_start_send(usb_send_buf, usb_send_rpos, usb_send_size); - if (ret == 1) { - TRACE(0, "usb_audio_start_send failed: usb not configured"); - } else { - ASSERT(ret == 0, "usb_audio_start_send failed: %d", ret); - } - } - - return ret; -} - -static int usb_audio_stop_usb_stream(enum AUD_STREAM_T stream) { - if (stream == AUD_STREAM_PLAYBACK) { - usb_audio_stop_recv(); - -#ifdef DSD_SUPPORT - usb_dsd_enabled = false; -#endif - - usb_audio_sync_reset(&playback_info); - } else { - usb_audio_stop_send(); - -#ifndef UAUD_SYNC_STREAM_TARGET - if (recv_state == AUDIO_ITF_STATE_STOPPED) -#endif - { - usb_audio_sync_reset(&capture_info); - } - } - - return 0; -} - -static void usb_audio_set_codec_volume(enum AUD_STREAM_T stream, uint8_t vol) { - struct AF_STREAM_CONFIG_T *cfg; - uint8_t POSSIBLY_UNUSED old_vol; - uint32_t ret; - - ret = af_stream_get_cfg(AUD_STREAM_ID_0, stream, &cfg, true); - if (ret == 0) { - old_vol = cfg->vol; - if (old_vol != vol) { - cfg->vol = vol; - af_stream_setup(AUD_STREAM_ID_0, stream, cfg); - } - } - -#ifdef AUDIO_ANC_FB_MC - if (stream == AUD_STREAM_PLAYBACK) { - ret = af_stream_get_cfg(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &cfg, true); - if (ret == 0) { - if (cfg->vol != vol) { - cfg->vol = vol; - af_stream_setup(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, cfg); - } - } - } -#endif -} - -static void usb_audio_enqueue_cmd(uint32_t data) { - int ret; - uint32_t mark; - - ret = safe_queue_put(&cmd_queue, data); - ASSERT(ret == 0 || safe_queue_dump(&cmd_queue), "%s: cmd queue overflow", - __FUNCTION__); - - hal_cpu_wake_lock(USB_AUDIO_CPU_WAKE_USER); - - mark = safe_queue_watermark(&cmd_queue); - if (mark > cmd_watermark) { - cmd_watermark = mark; - TRACE(2, "%s: new watermark %u", __FUNCTION__, mark); - } - -#ifdef BT_USB_AUDIO_DUAL_MODE - if (enqueue_cmd_cb) { - enqueue_cmd_cb(data); - } -#endif -} - -#ifdef BT_USB_AUDIO_DUAL_MODE -void usb_audio_set_enqueue_cmd_callback(USB_AUDIO_ENQUEUE_CMD_CALLBACK cb) { - enqueue_cmd_cb = cb; -} -#endif - -static void enqueue_unique_cmd_with_opp(enum AUDIO_CMD_T cmd, uint8_t seq, - uint8_t arg, - enum AUDIO_CMD_T oppsite_cmd) { - uint32_t last[3]; - uint32_t lock; - bool dup = false; - - lock = int_lock(); - if (safe_queue_peek(&cmd_queue, -1, &last[0]) == 0 && - safe_queue_peek(&cmd_queue, -2, &last[1]) == 0 && - safe_queue_peek(&cmd_queue, -3, &last[2]) == 0) { - if (EXTRACT_CMD(last[0]) == cmd) { - dup = true; - safe_queue_pop(&cmd_queue, NULL); - } else if (EXTRACT_CMD(last[0]) == oppsite_cmd && - EXTRACT_CMD(last[1]) == cmd && - EXTRACT_CMD(last[2]) == oppsite_cmd) { - dup = true; - safe_queue_pop(&cmd_queue, NULL); - safe_queue_pop(&cmd_queue, NULL); - } - } - int_unlock(lock); - - usb_audio_enqueue_cmd(MAKE_QUEUE_DATA(cmd, seq, arg)); - - if (dup) { - TRACE(2, "%s: Remove old duplicate cmd %d", __FUNCTION__, cmd); - } -} - -static void enqueue_unique_cmd_arg(enum AUDIO_CMD_T cmd, uint8_t seq, - uint8_t arg) { - uint32_t last; - uint32_t cur; - uint32_t lock; - bool enqueue = true; - - cur = MAKE_QUEUE_DATA(cmd, seq, arg); - - lock = int_lock(); - if (safe_queue_peek(&cmd_queue, -1, &last) == 0) { - if (last == cur) { - enqueue = false; - } - } - int_unlock(lock); - - if (enqueue) { - usb_audio_enqueue_cmd(cur); - } else { - TRACE(2, "%s: Skip duplicate cmd %d", __FUNCTION__, cmd); - } -} - -static void enqueue_unique_cmd(enum AUDIO_CMD_T cmd) { - enqueue_unique_cmd_arg(cmd, 0, 0); -} - -static void usb_audio_playback_start(enum USB_AUDIO_ITF_CMD_T cmd) { - if (cmd == USB_AUDIO_ITF_STOP) { - // Stop the stream right now - if (recv_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STOPPED; - } - -#ifdef USB_AUDIO_DYN_CFG - playback_itf_set = 0; -#ifdef USB_AUDIO_UAC2 - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_PLAY, usb_recv_seq, 0, - AUDIO_CMD_START_PLAY); -#else - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_PLAY, usb_recv_seq, 0, - AUDIO_CMD_SET_RECV_RATE); -#endif -#else - -#ifdef USB_AUDIO_MULTIFUNC - if (recv2_state == AUDIO_ITF_STATE_STARTED) { - return; - } -#endif - - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_PLAY, usb_recv_seq, 0, - AUDIO_CMD_START_PLAY); -#endif - } else { -#ifdef USB_AUDIO_DYN_CFG - if (cmd == USB_AUDIO_ITF_START_16BIT) { - new_sample_size_recv = 2; - } else if (cmd == USB_AUDIO_ITF_START_24BIT) { - new_sample_size_recv = 3; - } else { - new_sample_size_recv = 4; - } - playback_itf_set = 1; - - // Some host applications will not stop current stream before changing - // sample size - if (recv_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STOPPED; - } - -#ifdef USB_AUDIO_UAC2 -#ifdef KEEP_SAME_LATENCY - usb_recv_size = - calc_usb_recv_size(new_sample_rate_recv, new_sample_size_recv); - TRACE(2, "%s: Set usb_recv_size=%u", __FUNCTION__, usb_recv_size); -#endif - - usb_audio_start_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STARTED; - - enqueue_unique_cmd_with_opp(AUDIO_CMD_START_PLAY, usb_recv_seq, 0, - AUDIO_CMD_STOP_PLAY); -#else - // Wait for sampling freq ctrl msg to start the stream -#endif - return; -#else - if (recv_state == AUDIO_ITF_STATE_STOPPED) { - usb_audio_start_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STARTED; - } - -#ifdef USB_AUDIO_MULTIFUNC - if (recv2_state == AUDIO_ITF_STATE_STARTED) { - return; - } -#endif - - enqueue_unique_cmd_with_opp(AUDIO_CMD_START_PLAY, usb_recv_seq, 0, - AUDIO_CMD_STOP_PLAY); -#endif - } -} - -static void usb_audio_capture_start(enum USB_AUDIO_ITF_CMD_T cmd) { - if (cmd == USB_AUDIO_ITF_STOP) { - // Stop the stream right now - if (send_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STOPPED; - } - -#ifdef USB_AUDIO_DYN_CFG - capture_itf_set = 0; -#ifdef USB_AUDIO_UAC2 - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_CAPTURE, usb_send_seq, 0, - AUDIO_CMD_START_CAPTURE); -#else - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_CAPTURE, usb_send_seq, 0, - AUDIO_CMD_SET_SEND_RATE); -#endif -#else - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_CAPTURE, usb_send_seq, 0, - AUDIO_CMD_START_CAPTURE); -#endif - } else { -#ifdef USB_AUDIO_DYN_CFG - capture_itf_set = 1; - - // Some host applications will not stop current stream before changing - // sample size - if (send_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STOPPED; - } - -#ifdef USB_AUDIO_UAC2 - usb_audio_start_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STARTED; - - enqueue_unique_cmd_with_opp(AUDIO_CMD_START_CAPTURE, usb_send_seq, 0, - AUDIO_CMD_STOP_CAPTURE); -#else - // Wait for sampling freq ctrl msg to start the stream -#endif - return; -#else - if (send_state == AUDIO_ITF_STATE_STOPPED) { - usb_audio_start_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STARTED; - } - - enqueue_unique_cmd_with_opp(AUDIO_CMD_START_CAPTURE, usb_send_seq, 0, - AUDIO_CMD_STOP_CAPTURE); -#endif - } -} - -static void usb_audio_mute_control(uint32_t mute) { - TRACE(1, "MUTE CTRL: %u", mute); - - new_mute_state = mute; -#ifdef USB_AUDIO_MULTIFUNC - if (mute) { - new_playback_coef = 0; - } else { - new_playback_coef = playback_gain_to_float(new_playback_vol); - } -#endif - usb_audio_enqueue_cmd(AUDIO_CMD_MUTE_CTRL); -} - -static void usb_audio_cap_mute_control(uint32_t mute) { - TRACE(1, "CAP MUTE CTRL: %u", mute); - - new_cap_mute_state = mute; - usb_audio_enqueue_cmd(AUDIO_CMD_CAP_MUTE_CTRL); -} - -static void usb_audio_vol_control(uint32_t percent) { - if (percent >= 100) { - new_playback_vol = MAX_VOLUME_VAL; - } else { - new_playback_vol = MIN_VOLUME_VAL + - (percent * (MAX_VOLUME_VAL - MIN_VOLUME_VAL) + 50) / 100; - } - - TRACE(2, "VOL CTRL: percent=%u new_playback_vol=%u", percent, - new_playback_vol); - -#ifdef USB_AUDIO_MULTIFUNC - new_playback_coef = playback_gain_to_float(new_playback_vol); -#else - usb_audio_enqueue_cmd(AUDIO_CMD_SET_VOLUME); -#endif -} - -static void usb_audio_cap_vol_control(uint32_t percent) { - if (percent >= 100) { - new_capture_vol = MAX_CAP_VOLUME_VAL; - } else { - new_capture_vol = - MIN_CAP_VOLUME_VAL + - (percent * (MAX_CAP_VOLUME_VAL - MIN_CAP_VOLUME_VAL) + 50) / 100; - } - - TRACE(2, "CAP VOL CTRL: percent=%u new_capture_vol=%u", percent, - new_capture_vol); - - usb_audio_enqueue_cmd(AUDIO_CMD_SET_CAP_VOLUME); -} - -static uint32_t usb_audio_get_vol_percent(void) { - if (new_playback_vol >= MAX_VOLUME_VAL) { - return 100; - } else if (new_playback_vol <= MIN_VOLUME_VAL) { - return 0; - } else { - return ((new_playback_vol - MIN_VOLUME_VAL) * 100 + - (MAX_VOLUME_VAL - MIN_VOLUME_VAL) / 2) / - (MAX_VOLUME_VAL - MIN_VOLUME_VAL); - } -} - -static uint32_t usb_audio_get_cap_vol_percent(void) { - if (new_capture_vol >= MAX_CAP_VOLUME_VAL) { - return 100; - } else if (new_capture_vol <= MIN_CAP_VOLUME_VAL) { - return 0; - } else { - return ((new_capture_vol - MIN_CAP_VOLUME_VAL) * 100 + - (MAX_CAP_VOLUME_VAL - MIN_CAP_VOLUME_VAL) / 2) / - (MAX_CAP_VOLUME_VAL - MIN_CAP_VOLUME_VAL); - } -} - -static void usb_audio_tune_rate(enum AUD_STREAM_T stream, float ratio) { - bool update_play, update_cap; - - update_play = true; - update_cap = false; - -#if defined(__AUDIO_RESAMPLE__) && defined(PLL_TUNE_SAMPLE_RATE) -#ifdef UAUD_SYNC_STREAM_TARGET - if (stream == AUD_STREAM_PLAYBACK) { - update_play = true; - update_cap = false; - } else { - update_play = false; - update_cap = true; - } -#else - update_play = true; - update_cap = true; -#endif -#endif - - if (update_play) { - rate_tune_ratio[AUD_STREAM_PLAYBACK] = - rate_tune_ratio[AUD_STREAM_PLAYBACK] + ratio + - rate_tune_ratio[AUD_STREAM_PLAYBACK] * ratio; - } - if (update_cap) { - rate_tune_ratio[AUD_STREAM_CAPTURE] = - rate_tune_ratio[AUD_STREAM_CAPTURE] + ratio + - rate_tune_ratio[AUD_STREAM_CAPTURE] * ratio; - } - - TRACE(4, "%s[%u]: ratio=%d resample_ratio=%d", __FUNCTION__, stream, - FLOAT_TO_PPB_INT(ratio), - update_cap ? FLOAT_TO_PPB_INT(rate_tune_ratio[stream]) - : FLOAT_TO_PPB_INT(rate_tune_ratio[AUD_STREAM_PLAYBACK])); - - enqueue_unique_cmd_arg(AUDIO_CMD_TUNE_RATE, 0, stream); -} - -static void -usb_audio_data_recv_handler(const struct USB_AUDIO_XFER_INFO_T *info) { - const uint8_t *data; - uint32_t size; - uint32_t old_wpos, new_wpos, wpos_boundary, rpos; - uint32_t old_play_pos = 0; - uint32_t play_pos; - uint32_t lock; - int conflicted; - uint32_t recv_samp, play_samp; - uint32_t cur_time; - - cur_time = hal_sys_timer_get(); - last_usb_recv_time = cur_time; - - data = info->data; - size = info->size; - - if (info->cur_compl_err || info->next_xfer_err) { - if (usb_recv_err_cnt == 0) { - usb_recv_err_cnt++; - usb_recv_ok_cnt = 0; - last_usb_recv_err_time = cur_time; - } else { - usb_recv_err_cnt++; - } - } else { - if (usb_recv_err_cnt) { - usb_recv_ok_cnt++; - } - } - if (usb_recv_err_cnt && - cur_time - last_usb_recv_err_time >= USB_XFER_ERR_REPORT_INTERVAL) { - if (info->cur_compl_err || info->next_xfer_err) { - TRACE(2, "recv: ERROR: cur_err=%d next_err=%d", info->cur_compl_err, - info->next_xfer_err); - } - TRACE(3, "recv: ERROR-CNT: err=%u ok=%u in %u ms", usb_recv_err_cnt, - usb_recv_ok_cnt, TICKS_TO_MS(USB_XFER_ERR_REPORT_INTERVAL)); - usb_recv_err_cnt = 0; - } - - if (usb_recv_buf <= data && data <= usb_recv_buf + usb_recv_size) { - if (data != usb_recv_buf + usb_recv_wpos) { - TRACE( - 3, - "recv: WARNING: Invalid wpos=0x%x data=%p recv_buf=%p. IRQ missing?", - usb_recv_wpos, data, usb_recv_buf); - usb_recv_wpos = data - usb_recv_buf; - } - } - - old_wpos = usb_recv_wpos; - new_wpos = old_wpos + size; - if (new_wpos >= usb_recv_size) { - new_wpos -= usb_recv_size; - } - - if (recv_state == AUDIO_ITF_STATE_STOPPED || size == 0 || // rx paused - 0) { - usb_recv_valid = 0; - } else { - if (info->cur_compl_err == 0) { - usb_recv_valid = 1; - } - } - - if (usb_recv_valid == 0 || usb_recv_init_rpos == 0 || codec_config_lock || - codec_play_seq != usb_recv_seq || codec_play_valid == 0 || - playback_state == AUDIO_ITF_STATE_STOPPED || 0) { - usb_recv_wpos = new_wpos; - return; - } - - conflicted = 0; - - lock = int_lock(); - if (playback_conflicted) { - playback_conflicted = 0; - rpos = 0; // Avoid compiler warnings - conflicted = 1; - } else { - rpos = usb_recv_rpos; - old_play_pos = playback_pos; - play_pos = af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - } - int_unlock(lock); - - if (conflicted == 0) { - if (info->pool_enabled) { - // USBC will write to memory pool. - wpos_boundary = new_wpos; - } else { - // USBC will write to new_wpos directly, so the buffer [new_wpos, new_wpos - // + info->next_size) must be protected too. - wpos_boundary = new_wpos + info->next_size; - if (wpos_boundary >= usb_recv_size) { - wpos_boundary -= usb_recv_size; - } - } - - if (old_wpos <= rpos) { - if (wpos_boundary < old_wpos || rpos < wpos_boundary) { - conflicted = 1; - } - } else { - if (rpos < wpos_boundary && wpos_boundary < old_wpos) { - conflicted = 1; - } - } - - if (conflicted) { - uint32_t reset_len = usb_recv_size / 2; - uint32_t saved_old_wpos = old_wpos; - - // Reset write position - old_wpos = rpos + reset_len; - if (old_wpos >= usb_recv_size) { - old_wpos -= usb_recv_size; - } - new_wpos = old_wpos + size; - if (new_wpos >= usb_recv_size) { - new_wpos -= usb_recv_size; - } - -#if 0 - usb_audio_stop_recv(); - usb_audio_start_recv(usb_recv_buf, new_wpos, usb_recv_size); -#else - usb_audio_set_recv_pos(new_wpos); -#endif - - TRACE(4, - "recv: Error: wpos=%u goes beyond rpos=%u with len=%u. Reset to %u", - saved_old_wpos, rpos, size, old_wpos); - } - record_conflict(conflicted); - } - - usb_recv_wpos = new_wpos; - -#if (VERBOSE_TRACE & (1 << 5)) - { - int hw_play_pos = - af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - TRACE_TIME(5, - "recv: wpos=%u size=%u rpos=%u playback_pos=%u hw_play_pos=%d", - old_wpos, size, rpos, playback_pos, hw_play_pos); - } -#endif - - if (conflicted) { - usb_audio_sync_reset(&playback_info); - return; - } - - if (usb_recv_buf <= data && data <= usb_recv_buf + usb_recv_size) { - recv_samp = byte_to_samp_recv(new_wpos); - } else { - recv_samp = -1; - } - - if ((int)play_pos >= 0) { - if (play_pos >= playback_size) { - play_pos = 0; - } - // Count the bytes of data waiting to play in the codec buffer - uint32_t bytes_to_play; - if (old_play_pos <= play_pos) { - bytes_to_play = playback_size + old_play_pos - play_pos; - } else { - bytes_to_play = old_play_pos - play_pos; - } - uint32_t usb_bytes_to_play; - usb_bytes_to_play = playback_to_recv_len(bytes_to_play); - if (rpos >= usb_bytes_to_play) { - play_pos = rpos - usb_bytes_to_play; - } else { - play_pos = usb_recv_size + rpos - usb_bytes_to_play; - } - play_samp = byte_to_samp_recv(play_pos); - } else { - play_samp = -1; - } - - if (recv_samp != -1 && play_samp != -1) { - enum UAUD_SYNC_RET_T ret; - float ratio; - - ret = usb_audio_sync(play_samp, recv_samp, &playback_info, &ratio); - if (ret == UAUD_SYNC_START) { - usb_audio_tune_rate(AUD_STREAM_PLAYBACK, ratio); - } - } else { - // TRACE(2,"recv_hdlr: recv_samp=0x%08x play_samp=0x%08x", recv_samp, - // play_samp); - } - -#ifdef DSD_SUPPORT - if (sample_size_recv == 3 && - (sample_rate_recv == 176400 || sample_rate_recv == 352800)) { - // First DoP solution marks - static const uint8_t pattern[2] = { - 0x05, - 0xFA, - }; - // Second DoP solution marks -- not supported yet - // static const uint8_t pattern2[2] = { 0x06, 0xF9, }; - static const uint16_t dsd_detect_thresh = 32; - uint8_t idx; - const uint8_t *dsd, *dsd_end, *dsd_end2; - bool dsd_valid = true; - - dsd = data + 2; - dsd_end = data + size; - dsd_end2 = usb_recv_buf + usb_recv_size; - if (dsd_end <= dsd_end2) { - dsd_end2 = NULL; - } else { - dsd_end = dsd_end2; - dsd_end2 = data + size - usb_recv_size; - } - if (*dsd == pattern[0]) { - idx = 0; - } else { - idx = 1; - } - - _check_dsd: - while (dsd < dsd_end) { - if (*dsd == pattern[idx]) { -#if (CHAN_NUM_RECV == 2) - dsd += 3; - if (dsd >= dsd_end || *dsd != pattern[idx]) { - dsd_valid = false; - break; - } -#endif - if (usb_dsd_cont_cnt < dsd_detect_thresh) { - usb_dsd_cont_cnt += CHAN_NUM_RECV; - } - idx = !idx; - dsd += 3; - } else { - dsd_valid = false; - break; - } - } - if (dsd_valid && dsd_end2) { - dsd = usb_recv_buf + 2; - dsd_end = dsd_end2; - dsd_end2 = NULL; - goto _check_dsd; - } - - if (dsd_valid && usb_dsd_cont_cnt < dsd_detect_thresh) { - dsd_valid = false; - } - if (!dsd_valid) { - usb_dsd_cont_cnt = 0; - } - - if (dsd_valid != usb_dsd_enabled) { - usb_dsd_enabled = dsd_valid; - enqueue_unique_cmd(AUDIO_CMD_SET_DSD_CFG); - } - } -#endif -} - -static void -usb_audio_data_send_handler(const struct USB_AUDIO_XFER_INFO_T *info) { - const uint8_t *data; - uint32_t size; - uint32_t old_rpos, new_rpos, rpos_boundary, wpos; - uint32_t old_cap_pos = 0; - uint32_t cap_pos; - uint32_t lock; - int conflicted; - uint32_t send_samp, cap_samp; - uint32_t cur_time; - - cur_time = hal_sys_timer_get(); - last_usb_send_time = cur_time; - - data = info->data; - size = info->size; - - if (info->cur_compl_err || info->next_xfer_err) { - if (usb_send_err_cnt == 0) { - usb_send_err_cnt++; - usb_send_ok_cnt = 0; - last_usb_send_err_time = cur_time; - } else { - usb_send_err_cnt++; - } - } else { - if (usb_send_err_cnt) { - usb_send_ok_cnt++; - } - } - if (usb_send_err_cnt && - cur_time - last_usb_send_err_time >= USB_XFER_ERR_REPORT_INTERVAL) { - if (info->cur_compl_err || info->next_xfer_err) { - TRACE(2, "send: ERROR: cur_err=%d next_err=%d", info->cur_compl_err, - info->next_xfer_err); - } - TRACE(3, "send: ERROR-CNT: err=%u ok=%u in %u ms", usb_send_err_cnt, - usb_send_ok_cnt, TICKS_TO_MS(USB_XFER_ERR_REPORT_INTERVAL)); - usb_send_err_cnt = 0; - } - - if (info->pool_enabled) { - // The buffer [data, size) has been sent completely, and - // the buffer [data + size, data + size + info->next_size) has been copied - // to memory pool. Make usb_send_rpos point to the pending send buffer - data += size; - if (data >= usb_send_buf + usb_send_size) { - data -= usb_send_size; - } - size = info->next_size; - } - - if (usb_send_buf <= data && data <= usb_send_buf + usb_send_size) { - if (data != usb_send_buf + usb_send_rpos) { - if (usb_send_valid == 0 && info->pool_enabled && - info->data != usb_send_buf + usb_send_rpos) { - TRACE(3, - "send: WARNING: Invalid rpos=0x%x data=%p send_buf=%p. IRQ " - "missing?", - usb_send_rpos, data, usb_send_buf); - } - usb_send_rpos = data - usb_send_buf; - } - } - - old_rpos = usb_send_rpos; - new_rpos = old_rpos + size; - if (new_rpos >= usb_send_size) { - new_rpos -= usb_send_size; - } - - if (send_state == AUDIO_ITF_STATE_STOPPED || size == 0 || // tx paused - 0) { - usb_send_valid = 0; - } else { - if (info->cur_compl_err == 0) { - usb_send_valid = 1; - } - } - - if (usb_send_valid == 0 || usb_send_init_wpos == 0 || codec_config_lock || - codec_cap_seq != usb_send_seq || codec_cap_valid == 0 || - capture_state == AUDIO_ITF_STATE_STOPPED || 0) { - usb_send_rpos = new_rpos; - if (usb_send_valid) { - // Zero the send buffer next to the part being sent by USB h/w - if (info->pool_enabled) { - uint32_t clr_len; - - clr_len = samp_to_byte_send(SAMP_RATE_TO_FRAME_SIZE(sample_rate_send)); - if (usb_send_rpos + clr_len <= usb_send_size) { - zero_mem16(usb_send_buf + usb_send_rpos, clr_len); - } else { - zero_mem16(usb_send_buf + usb_send_rpos, - usb_send_size - usb_send_rpos); - zero_mem16(usb_send_buf, clr_len - (usb_send_size - usb_send_rpos)); - } - } else { - // If no pool is enabled, the send pkt size is a fixed value, and - // the send buffer size is a integral multiple of the send pkt size - if (usb_send_rpos + size + size <= usb_send_size) { - zero_mem32(usb_send_buf + usb_send_rpos + size, size); - } else { - zero_mem32(usb_send_buf, size); - } - } - } - return; - } - - conflicted = 0; - - lock = int_lock(); - if (capture_conflicted) { - capture_conflicted = 0; - wpos = 0; // Avoid compiler warnings - conflicted = 1; - } else { - wpos = usb_send_wpos; - old_cap_pos = capture_pos; - cap_pos = af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE); - } - int_unlock(lock); - - if (conflicted == 0) { - if (info->pool_enabled) { - // old_rpos points to the pending send buffer, which has been copied to - // memory pool. USBC will read from memory pool. - rpos_boundary = new_rpos; - } else { - // old_rpos points to the buffer just sent completely. - // USBC will read from new_rpos directly, so the buffer [new_rpos, - // new_rpos + info->next_size) must be protected too. - rpos_boundary = new_rpos + info->next_size; - if (rpos_boundary >= usb_recv_size) { - rpos_boundary -= usb_recv_size; - } - } - - if (old_rpos <= wpos) { - if (new_rpos < old_rpos || wpos < new_rpos) { - conflicted = 1; - } - } else { - if (wpos < new_rpos && new_rpos < old_rpos) { - conflicted = 1; - } - } - - if (conflicted) { - uint32_t reset_len = usb_send_size / 2; - uint32_t saved_old_rpos = old_rpos; - - // Reset read position - old_rpos = wpos + reset_len; - if (old_rpos >= usb_send_size) { - old_rpos -= usb_send_size; - } - new_rpos = old_rpos + size; - if (new_rpos >= usb_send_size) { - new_rpos -= usb_send_size; - } - -#if 0 - usb_audio_stop_send(); - usb_audio_start_send(usb_send_buf, new_rpos, usb_send_size); -#else - usb_audio_set_send_pos(new_rpos); -#endif - - TRACE(4, - "send: Error: rpos=%u goes beyond wpos=%u with len=%u. Reset to %u", - saved_old_rpos, wpos, size, old_rpos); - } - record_conflict(conflicted); - } - - usb_send_rpos = new_rpos; - -#if (VERBOSE_TRACE & (1 << 6)) - TRACE_TIME(3, "send: rpos=%u size=%u wpos=%u", old_rpos, size, wpos); -#endif - - if (conflicted) { - usb_audio_sync_reset(&capture_info); - return; - } - -#ifndef UAUD_SYNC_STREAM_TARGET - // Recv takes precedence - if (recv_state == AUDIO_ITF_STATE_STARTED) { - return; - } -#endif - - if (usb_send_buf <= data && data <= usb_send_buf + usb_send_size) { - send_samp = byte_to_samp_send(new_rpos); - } else { - send_samp = -1; - } - - if ((int)cap_pos >= 0) { - if (cap_pos >= capture_size) { - cap_pos = 0; - } - // Count the bytes of data newly captured in the codec buffer - uint32_t bytes_cap; - if (old_cap_pos <= cap_pos) { - bytes_cap = cap_pos - old_cap_pos; - } else { - bytes_cap = capture_size + cap_pos - old_cap_pos; - } - uint32_t usb_bytes_cap; - usb_bytes_cap = capture_to_send_len(bytes_cap); - cap_pos = wpos + usb_bytes_cap; - if (cap_pos >= usb_send_size) { - cap_pos -= usb_send_size; - } - cap_samp = byte_to_samp_send(cap_pos); - } else { - cap_samp = -1; - } - - if (send_samp != -1 && cap_samp != -1) { - enum UAUD_SYNC_RET_T ret; - float ratio; - - ret = usb_audio_sync(cap_samp, send_samp, &capture_info, &ratio); - if (ret == UAUD_SYNC_START) { - usb_audio_tune_rate(AUD_STREAM_CAPTURE, ratio); - } - } else { - // TRACE(2,"send_hdlr: send_samp=0x%08x cap_samp=0x%08x", send_samp, - // cap_samp); - } -} - -#ifdef USB_AUDIO_MULTIFUNC -static float playback_gain_to_float(uint32_t level) { - int32_t db; - - if (level > MAX_VOLUME_VAL || level < MIN_VOLUME_VAL) { - return 0; - } - - db = codec_dac_vol[level].sdac_volume; - if (db <= USB_AUDIO_MIN_DBVAL) { - return 0; - } - - return db_to_float(db); -} - -static void usb_audio_playback2_start(enum USB_AUDIO_ITF_CMD_T cmd) { - if (cmd == USB_AUDIO_ITF_STOP) { - // Stop the stream right now - if (recv2_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_recv2(); - if (recv_state == AUDIO_ITF_STATE_STOPPED && - send_state == AUDIO_ITF_STATE_STOPPED) { - usb_audio_sync_reset(&playback_info); - } - recv2_state = AUDIO_ITF_STATE_STOPPED; - } - - if (recv_state == AUDIO_ITF_STATE_STARTED) { - return; - } - - enqueue_unique_cmd_with_opp(AUDIO_CMD_STOP_PLAY, usb_recv_seq, 0, - AUDIO_CMD_START_PLAY); - } else { - if (recv2_state == AUDIO_ITF_STATE_STOPPED) { - int ret; - - reset_conflict(); - - if (recv_state == AUDIO_ITF_STATE_STOPPED && - send_state == AUDIO_ITF_STATE_STOPPED) { - usb_audio_sync_reset(&playback_info); - } - - usb_recv2_valid = 0; - if (recv_state == AUDIO_ITF_STATE_STOPPED) { - usb_recv_seq++; - } - - usb_recv2_rpos = 0; - usb_recv2_wpos = usb_recv_size / 2; - zero_mem32(usb_recv2_buf, usb_recv2_size); - - usb_recv2_err_cnt = 0; - - ret = - usb_audio_start_recv2(usb_recv2_buf, usb_recv2_wpos, usb_recv2_size); - if (ret == 1) { - TRACE(0, "usb_audio_start_recv2 failed: usb not configured"); - } else { - ASSERT(ret == 0, "usb_audio_start_recv2 failed: %d", ret); - } - recv2_state = AUDIO_ITF_STATE_STARTED; - } - - if (recv_state == AUDIO_ITF_STATE_STARTED) { - return; - } - - enqueue_unique_cmd_with_opp(AUDIO_CMD_START_PLAY, usb_recv_seq, 0, - AUDIO_CMD_STOP_PLAY); - } -} - -static void usb_audio_mute2_control(uint32_t mute) { - TRACE(1, "MUTE2 CTRL: %u", mute); - - new_mute2_state = mute; - if (mute) { - new_playback2_coef = 0; - } else { - new_playback2_coef = playback_gain_to_float(new_playback2_vol); - } - usb_audio_enqueue_cmd(AUDIO_CMD_MUTE_CTRL); -} - -static void usb_audio_vol2_control(uint32_t percent) { - if (percent >= 100) { - new_playback2_vol = MAX_VOLUME_VAL; - } else { - new_playback2_vol = - MIN_VOLUME_VAL + - (percent * (MAX_VOLUME_VAL - MIN_VOLUME_VAL) + 50) / 100; - } - - new_playback2_coef = playback_gain_to_float(new_playback2_vol); - - TRACE(2, "VOL2 CTRL: percent=%u new_playback_vol=%u", percent, - new_playback2_vol); -} - -static uint32_t usb_audio_get_vol2_percent(void) { - if (new_playback2_vol >= MAX_VOLUME_VAL) { - return 100; - } else { - return ((new_playback2_vol - MIN_VOLUME_VAL) * 100 + - (MAX_VOLUME_VAL - MIN_VOLUME_VAL) / 2) / - (MAX_VOLUME_VAL - MIN_VOLUME_VAL); - } -} - -static void -usb_audio_data_recv2_handler(const struct USB_AUDIO_XFER_INFO_T *info) { - const uint8_t *data; - uint32_t size; - uint32_t old_wpos, new_wpos, wpos_boundary, rpos; - uint32_t old_play_pos = 0; - uint32_t play_pos; - uint32_t lock; - int conflicted; - uint32_t recv_samp, play_samp; - uint32_t cur_time; - - cur_time = hal_sys_timer_get(); - last_usb_recv_time = cur_time; - - data = info->data; - size = info->size; - - if (info->cur_compl_err || info->next_xfer_err) { - if (usb_recv2_err_cnt == 0) { - usb_recv2_err_cnt++; - usb_recv2_ok_cnt = 0; - last_usb_recv2_err_time = cur_time; - } else { - usb_recv2_err_cnt++; - } - } else { - if (usb_recv2_err_cnt) { - usb_recv2_ok_cnt++; - } - } - if (usb_recv2_err_cnt && - cur_time - last_usb_recv2_err_time >= USB_XFER_ERR_REPORT_INTERVAL) { - if (info->cur_compl_err || info->next_xfer_err) { - TRACE(2, "recv2: ERROR: cur_err=%d next_err=%d", info->cur_compl_err, - info->next_xfer_err); - } - TRACE(3, "recv2: ERROR-CNT: err=%u ok=%u in %u ms", usb_recv2_err_cnt, - usb_recv2_ok_cnt, TICKS_TO_MS(USB_XFER_ERR_REPORT_INTERVAL)); - usb_recv2_err_cnt = 0; - } - - if (usb_recv2_buf <= data && data <= usb_recv2_buf + usb_recv2_size) { - if (data != usb_recv2_buf + usb_recv2_wpos) { - TRACE(3, - "recv2: WARNING: Invalid wpos=0x%x data=%p recv2_buf=%p. IRQ " - "missing?", - usb_recv2_wpos, data, usb_recv2_buf); - usb_recv2_wpos = data - usb_recv2_buf; - } - } - - old_wpos = usb_recv2_wpos; - new_wpos = old_wpos + size; - if (new_wpos >= usb_recv2_size) { - new_wpos -= usb_recv2_size; - } - - if (codec_config_lock || codec_play_seq != usb_recv_seq || - codec_play_valid == 0 || playback_state == AUDIO_ITF_STATE_STOPPED || - recv2_state == AUDIO_ITF_STATE_STOPPED || size == 0 || // rx paused - 0) { - usb_recv2_valid = 0; - } else { - if (info->cur_compl_err == 0) { - usb_recv2_valid = 1; - } - } - - if (usb_recv2_valid == 0 || usb_recv2_init_rpos == 0) { - usb_recv2_wpos = new_wpos; - return; - } - - conflicted = 0; - - lock = int_lock(); - if (playback_conflicted2) { - playback_conflicted2 = 0; - rpos = 0; // Avoid compiler warnings - conflicted = 1; - } else { - rpos = usb_recv2_rpos; - old_play_pos = playback_pos; - play_pos = af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - } - int_unlock(lock); - - if (conflicted == 0) { - if (info->pool_enabled) { - // USBC will write to memory pool. - wpos_boundary = new_wpos; - } else { - // USBC will write to new_wpos directly, so the buffer [new_wpos, new_wpos - // + info->next_size) must be protected too. - wpos_boundary = new_wpos + info->next_size; - if (wpos_boundary >= usb_recv2_size) { - wpos_boundary -= usb_recv2_size; - } - } - - if (old_wpos <= rpos) { - if (wpos_boundary < old_wpos || rpos < wpos_boundary) { - conflicted = 1; - } - } else { - if (rpos < wpos_boundary && wpos_boundary < old_wpos) { - conflicted = 1; - } - } - - if (conflicted) { - uint32_t reset_len = usb_recv2_size / 2; - uint32_t saved_old_wpos = old_wpos; - - // Reset read position - old_wpos = rpos + reset_len; - if (old_wpos >= usb_recv2_size) { - old_wpos -= usb_recv2_size; - } - new_wpos = old_wpos + size; - if (new_wpos >= usb_recv2_size) { - new_wpos -= usb_recv2_size; - } - -#if 0 - usb_audio_stop_recv(); - usb_audio_start_recv(usb_recv2_buf, new_wpos, usb_recv2_size); -#else - usb_audio_set_recv2_pos(new_wpos); -#endif - - TRACE( - 4, - "recv2: Error: wpos=%u goes beyond rpos=%u with len=%u. Reset to %u", - saved_old_wpos, rpos, size, old_wpos); - } - record_conflict(conflicted); - } - - usb_recv2_wpos = new_wpos; - -#if (VERBOSE_TRACE & (1 << 5)) - { - int hw_play_pos = - af_stream_get_cur_dma_pos(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK); - TRACE_TIME(5, - "recv2: wpos=%u size=%u rpos=%u playback_pos=%u hw_play_pos=%d", - old_wpos, size, rpos, playback_pos, hw_play_pos); - } -#endif - - if (conflicted) { - usb_audio_sync_reset(&playback_info); - return; - } - - // Recv and send takes precedence - if (recv_state == AUDIO_ITF_STATE_STARTED || - send_state == AUDIO_ITF_STATE_STARTED) { - return; - } - - if (usb_recv2_buf <= data && data <= usb_recv2_buf + usb_recv2_size) { - recv_samp = byte_to_samp_recv(new_wpos); - } else { - recv_samp = -1; - } - - if ((int)play_pos >= 0) { - if (play_pos >= playback_size) { - play_pos = 0; - } - // Count the bytes of data waiting to play in the codec buffer - uint32_t bytes_to_play; - if (old_play_pos <= play_pos) { - bytes_to_play = playback_size + old_play_pos - play_pos; - } else { - bytes_to_play = old_play_pos - play_pos; - } - uint32_t usb_bytes_to_play; - usb_bytes_to_play = playback_to_recv_len(bytes_to_play); - if (rpos >= usb_bytes_to_play) { - play_pos = rpos - usb_bytes_to_play; - } else { - play_pos = usb_recv2_size + rpos - usb_bytes_to_play; - } - play_samp = byte_to_samp_recv(play_pos); - } else { - play_samp = -1; - } - - if (recv_samp != -1 && play_samp != -1) { - enum UAUD_SYNC_RET_T ret; - float ratio; - - ret = usb_audio_sync(play_samp, recv_samp, &playback_info, &ratio); - if (ret == UAUD_SYNC_START) { - usb_audio_tune_rate(AUD_STREAM_PLAYBACK, ratio); - } - } else { - // TRACE(2,"recv_hdlr: recv_samp=0x%08x play_samp=0x%08x", recv_samp, - // play_samp); - } -} -#endif - -static void usb_audio_reset_usb_stream_state(bool init) { - if (init) { - recv_state = AUDIO_ITF_STATE_STOPPED; - send_state = AUDIO_ITF_STATE_STOPPED; - -#ifdef USB_AUDIO_DYN_CFG - // Reset itf setting - playback_itf_set = 0; - capture_itf_set = 0; -#endif - - // Reset mute and volume setting - new_mute_state = 0; - new_cap_mute_state = 0; - - new_playback_vol = AUDIO_OUTPUT_VOLUME_DEFAULT; - if (new_playback_vol > MAX_VOLUME_VAL) { - new_playback_vol = MAX_VOLUME_VAL; - } else if (new_playback_vol < MIN_VOLUME_VAL) { - new_playback_vol = MIN_VOLUME_VAL; - } - - new_capture_vol = CODEC_SADC_VOL; - if (new_capture_vol > MAX_CAP_VOLUME_VAL) { - new_capture_vol = MAX_CAP_VOLUME_VAL; - } else if (new_capture_vol < MIN_CAP_VOLUME_VAL) { - new_capture_vol = MIN_CAP_VOLUME_VAL; - } - -#ifdef USB_AUDIO_MULTIFUNC - new_playback_coef = playback_gain_to_float(new_playback_vol); - playback_coef = new_playback_coef; - - recv2_state = AUDIO_ITF_STATE_STOPPED; - new_mute2_state = 0; - new_playback2_vol = AUDIO_OUTPUT_VOLUME_DEFAULT; - if (new_playback2_vol > MAX_VOLUME_VAL) { - new_playback2_vol = MAX_VOLUME_VAL; - } else if (new_playback2_vol < MIN_VOLUME_VAL) { - new_playback2_vol = MIN_VOLUME_VAL; - } - new_playback2_coef = playback_gain_to_float(new_playback2_vol); - playback2_coef = new_playback2_coef; -#endif - } else { - if (recv_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STOPPED; - } - if (send_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STOPPED; - } - -#ifdef USB_AUDIO_MULTIFUNC - if (recv2_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_recv2(); - if (recv_state == AUDIO_ITF_STATE_STOPPED && - send_state == AUDIO_ITF_STATE_STOPPED) { - usb_audio_sync_reset(&playback_info); - } - recv2_state = AUDIO_ITF_STATE_STOPPED; - } -#endif - - // Keep old itf setting unless it is in init mode - - // Keep old mute and playback volume setting unless it is in init mode - } -} - -static void usb_audio_reset_codec_stream_state(bool init) { - playback_state = AUDIO_ITF_STATE_STOPPED; - capture_state = AUDIO_ITF_STATE_STOPPED; - -#ifndef USB_AUDIO_MULTIFUNC - playback_vol = new_playback_vol; -#endif - capture_vol = new_capture_vol; - - playback_paused = 0; - - playback_conflicted = 0; -#ifdef USB_AUDIO_MULTIFUNC - playback_conflicted2 = 0; -#endif - capture_conflicted = 0; - - // Keep old mute setting unless it is in init mode - if (init) { -#ifdef PERF_TEST_POWER_KEY - perft_power_type = 0; - af_codec_set_perf_test_power(perft_power_type); -#endif -#ifdef PA_ON_OFF_KEY - if (pa_on_off_muted) { - pa_on_off_muted = false; - if (mute_user_map == 0) { - usb_audio_codec_unmute(CODEC_MUTE_USER_ALL); - } - } -#endif - if (mute_user_map) { - mute_user_map = 0; - usb_audio_codec_unmute(CODEC_MUTE_USER_ALL); - } -#if defined(NOISE_GATING) && defined(NOISE_REDUCTION) - restore_noise_reduction_status(); -#endif - } -} - -#ifdef USB_AUDIO_DYN_CFG -static void usb_audio_set_recv_rate(enum AUD_SAMPRATE_T rate) { -#ifndef USB_AUDIO_UAC2 - if (playback_itf_set == 0) { - TRACE(1, "\nWARNING: Set recv rate while itf not set: %d\n", rate); - return; - } -#endif - - // Some host applications will not stop current stream before changing sample - // rate - if (recv_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STOPPED; - } - - TRACE(3, "%s: Change recv sample rate from %u to %u", __FUNCTION__, - sample_rate_recv, rate); - - new_sample_rate_recv = rate; - -#ifdef KEEP_SAME_LATENCY - usb_recv_size = - calc_usb_recv_size(new_sample_rate_recv, new_sample_size_recv); - TRACE(2, "%s: Set usb_recv_size=%u", __FUNCTION__, usb_recv_size); -#endif - - if (playback_itf_set) { - usb_audio_start_usb_stream(AUD_STREAM_PLAYBACK); - recv_state = AUDIO_ITF_STATE_STARTED; - } - -#ifdef USB_AUDIO_UAC2 - enqueue_unique_cmd_arg(AUDIO_CMD_SET_RECV_RATE, usb_recv_seq, 0); -#else - enqueue_unique_cmd_with_opp(AUDIO_CMD_SET_RECV_RATE, usb_recv_seq, 0, - AUDIO_CMD_STOP_PLAY); -#endif -} - -static void usb_audio_set_send_rate(enum AUD_SAMPRATE_T rate) { -#ifndef USB_AUDIO_UAC2 - if (capture_itf_set == 0) { - TRACE(1, "\nWARNING: Set send rate while itf not set: %d\n", rate); - return; - } -#endif - - // Some host applications will not stop current stream before changing sample - // rate - if (send_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STOPPED; - } - - TRACE(3, "%s: Change send sample rate from %u to %u", __FUNCTION__, - sample_rate_send, rate); - - new_sample_rate_send = rate; - -#ifdef KEEP_SAME_LATENCY - usb_send_size = calc_usb_send_size(new_sample_rate_send); - TRACE(2, "%s: Set usb_send_size=%u", __FUNCTION__, usb_send_size); -#endif - - if (capture_itf_set) { - usb_audio_start_usb_stream(AUD_STREAM_CAPTURE); - send_state = AUDIO_ITF_STATE_STARTED; - } - -#ifdef USB_AUDIO_UAC2 - enqueue_unique_cmd_arg(AUDIO_CMD_SET_SEND_RATE, usb_send_seq, 0); -#else - enqueue_unique_cmd_with_opp(AUDIO_CMD_SET_SEND_RATE, usb_send_seq, 0, - AUDIO_CMD_STOP_CAPTURE); -#endif -} -#endif - -static void usb_audio_state_control(enum USB_AUDIO_STATE_EVENT_T event, - uint32_t param) { - TRACE(3, "%s: %d (%u)", __FUNCTION__, event, param); - - if (event == USB_AUDIO_STATE_RESET || event == USB_AUDIO_STATE_DISCONNECT || - event == USB_AUDIO_STATE_CONFIG) { - usb_audio_reset_usb_stream_state(true); - } else if (event == USB_AUDIO_STATE_SLEEP || - event == USB_AUDIO_STATE_WAKEUP) { - usb_audio_reset_usb_stream_state(false); - } - - if (event == USB_AUDIO_STATE_RESET) { - usb_audio_enqueue_cmd(AUDIO_CMD_USB_RESET); - } else if (event == USB_AUDIO_STATE_DISCONNECT) { - usb_audio_enqueue_cmd(AUDIO_CMD_USB_DISCONNECT); - } else if (event == USB_AUDIO_STATE_CONFIG) { - usb_audio_enqueue_cmd(AUDIO_CMD_USB_CONFIG); - } else if (event == USB_AUDIO_STATE_SLEEP) { - usb_audio_enqueue_cmd(AUDIO_CMD_USB_SLEEP); - } else if (event == USB_AUDIO_STATE_WAKEUP) { - usb_audio_enqueue_cmd(AUDIO_CMD_USB_WAKEUP); - } else if (event == USB_AUDIO_STATE_RECV_PAUSE || - event == USB_AUDIO_STATE_RECV2_PAUSE) { -#ifndef USB_AUDIO_MULTIFUNC - enqueue_unique_cmd_with_opp(AUDIO_CMD_RECV_PAUSE, usb_recv_seq, 0, - AUDIO_CMD_RECV_CONTINUE); -#endif - } else if (event == USB_AUDIO_STATE_RECV_CONTINUE || - event == USB_AUDIO_STATE_RECV2_CONTINUE) { -#ifndef USB_AUDIO_MULTIFUNC - enqueue_unique_cmd_with_opp(AUDIO_CMD_RECV_CONTINUE, usb_recv_seq, 0, - AUDIO_CMD_RECV_PAUSE); -#endif -#ifdef USB_AUDIO_DYN_CFG - } else if (event == USB_AUDIO_STATE_SET_RECV_RATE) { - usb_audio_set_recv_rate(param); - } else if (event == USB_AUDIO_STATE_SET_SEND_RATE) { - usb_audio_set_send_rate(param); -#endif - } else { - ASSERT(false, "Bad state event"); - } -} - -static void usb_audio_acquire_freq(void) { - enum HAL_CMU_FREQ_T freq; - -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) -#ifdef SW_CAPTURE_RESAMPLE - if (resample_cap_enabled) { - freq = HAL_CMU_FREQ_104M; - } else -#endif - if (capture_state == AUDIO_ITF_STATE_STARTED) { -#ifdef DUAL_AUX_MIC_MORE_FILTER - freq = HAL_CMU_FREQ_104M; -#else - freq = HAL_CMU_FREQ_78M; -#endif - } else -#else // !(CHIP_BEST1000 && _DUAL_AUX_MIC_) -#ifdef SW_CAPTURE_RESAMPLE - if (resample_cap_enabled) { -#ifdef CHIP_BEST1000 - freq = HAL_CMU_FREQ_78M; -#else - freq = HAL_CMU_FREQ_52M; -#endif - } else -#endif -#endif // !(CHIP_BEST1000 && _DUAL_AUX_MIC_) - { - freq = HAL_CMU_FREQ_52M; - } - -#if defined(USB_HIGH_SPEED) && defined(USB_AUDIO_UAC2) - if (playback_state == AUDIO_ITF_STATE_STARTED && - sample_rate_play >= AUD_SAMPRATE_352800) { - if (freq < HAL_CMU_FREQ_104M) { - freq = HAL_CMU_FREQ_104M; - } - } -#endif - -#ifdef AUDIO_ANC_FB_MC - if (freq < HAL_CMU_FREQ_104M) { - freq = HAL_CMU_FREQ_104M; - } -#endif - -#ifdef __HW_FIR_DSD_PROCESS__ - if (freq < HAL_CMU_FREQ_104M) { - freq = HAL_CMU_FREQ_104M; - } -#endif - -#ifdef USB_AUDIO_SPEECH - enum HAL_CMU_FREQ_T speech_freq; - - speech_freq = speech_process_need_freq(); - if (freq < speech_freq) { - freq = speech_freq; - } -#endif - - hal_sysfreq_req(HAL_SYSFREQ_USER_APP_2, freq); - // TRACE(2,"[%s] app_sysfreq_req %d", __FUNCTION__, freq); - // TRACE(2,"[%s] sys freq calc : %d\n", __FUNCTION__, - // hal_sys_timer_calc_cpu_freq(5, 0)); -} - -static void usb_audio_release_freq(void) { - hal_sysfreq_req(HAL_SYSFREQ_USER_APP_2, HAL_CMU_FREQ_32K); -} - -static void usb_audio_update_freq(void) { usb_audio_acquire_freq(); } - -#ifdef SW_CAPTURE_RESAMPLE - -static enum AUD_CHANNEL_NUM_T get_capture_resample_chan_num(void) { -#if (CHAN_NUM_CAPTURE == CHAN_NUM_SEND) - return chan_num_to_enum(CHAN_NUM_CAPTURE); -#else - return AUD_CHANNEL_NUM_1; -#endif -} - -static void capture_stream_resample_config(void) { - struct RESAMPLE_CFG_T cfg; - enum RESAMPLE_STATUS_T ret; - enum AUD_SAMPRATE_T cap_rate; - -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) - cap_rate = sample_rate_ref_cap; -#else - cap_rate = sample_rate_cap; -#endif - -#ifndef __AUDIO_RESAMPLE__ - if (cap_rate == sample_rate_send) { - if (resample_cap_enabled) { - TRACE(1, "!!! %s: Disable capture resample", __FUNCTION__); - - audio_resample_ex_close(resample_id); - resample_cap_enabled = false; - } - } else -#endif - { - if (!resample_cap_enabled) { - // Resample chan num is usb send chan num - memset(&cfg, 0, sizeof(cfg)); - cfg.chans = get_capture_resample_chan_num(); - cfg.bits = sample_size_to_enum_capture(sample_size_cap); -#ifdef __AUDIO_RESAMPLE__ - if (sample_rate_send % AUD_SAMPRATE_8000) { - ASSERT(hal_cmu_get_crystal_freq() / - (CODEC_FREQ_44_1K_SERIES / sample_rate_send) == - cap_rate, - "%s: Bad cap_rate=%u with sample_rate_send=%u", __FUNCTION__, - cap_rate, sample_rate_send); -#if (CODEC_FREQ_26M / CODEC_FREQ_CRYSTAL * CODEC_FREQ_CRYSTAL == CODEC_FREQ_26M) - cfg.coef = &resample_coef_50p7k_to_44p1k; -#else - cfg.coef = &resample_coef_46p8k_to_44p1k; -#endif - } else { - ASSERT(hal_cmu_get_crystal_freq() / - (CODEC_FREQ_48K_SERIES / sample_rate_send) == - cap_rate, - "%s: Bad cap_rate=%u with sample_rate_send=%u", __FUNCTION__, - cap_rate, sample_rate_send); -#if (CODEC_FREQ_26M / CODEC_FREQ_CRYSTAL * CODEC_FREQ_CRYSTAL == CODEC_FREQ_26M) - cfg.coef = &resample_coef_50p7k_to_48k; -#else - cfg.coef = &resample_coef_46p8k_to_48k; -#endif - } -#else - if (sample_rate_send % AUD_SAMPRATE_8000) { - ASSERT(CODEC_FREQ_48K_SERIES / - (CODEC_FREQ_44_1K_SERIES / sample_rate_send) == - cap_rate, - "%s: Bad cap_rate=%u with sample_rate_send=%u", __FUNCTION__, - cap_rate, sample_rate_send); - cfg.coef = &resample_coef_48k_to_44p1k; - } else { - ASSERT(CODEC_FREQ_44_1K_SERIES / - (CODEC_FREQ_48K_SERIES / sample_rate_send) == - cap_rate, - "%s: Bad cap_rate=%u with sample_rate_send=%u", __FUNCTION__, - cap_rate, sample_rate_send); - cfg.coef = &resample_coef_44p1k_to_48k; - } -#endif - cfg.buf = resample_history_buf; - cfg.size = resample_history_size; - - TRACE(3, "!!! %s: Enable capture resample %u => %u", __FUNCTION__, - cap_rate, sample_rate_send); - - ret = audio_resample_ex_open(&cfg, &resample_id); - ASSERT(ret == RESAMPLE_STATUS_OK, "%s: Failed to init resample: %d", - __FUNCTION__, ret); - - resample_cap_enabled = true; - } - } -} - -#endif - -static void usb_audio_init_streams(enum AUDIO_STREAM_REQ_USER_T user) { - bool action; - - action = false; -#ifndef DELAY_STREAM_OPEN - if (user == AUDIO_STREAM_REQ_USB) { - action = true; - } -#endif -#ifdef ANC_L_R_MISALIGN_WORKAROUND - if (user == AUDIO_STREAM_REQ_ANC) { - action = true; - } -#endif - if (action) { - usb_audio_open_codec_stream(AUD_STREAM_PLAYBACK, user); - usb_audio_open_codec_stream(AUD_STREAM_CAPTURE, user); - } - -#ifdef ANC_L_R_MISALIGN_WORKAROUND - if (user == AUDIO_STREAM_REQ_ANC) { - usb_audio_start_codec_stream(AUD_STREAM_PLAYBACK, user); - usb_audio_start_codec_stream(AUD_STREAM_CAPTURE, user); - } -#endif -} - -static void usb_audio_term_streams(enum AUDIO_STREAM_REQ_USER_T user) { - // Ensure all the streams for this user are stopped and closed - usb_audio_stop_codec_stream(AUD_STREAM_CAPTURE, user); - usb_audio_stop_codec_stream(AUD_STREAM_PLAYBACK, user); - - usb_audio_close_codec_stream(AUD_STREAM_CAPTURE, user); - usb_audio_close_codec_stream(AUD_STREAM_PLAYBACK, user); -} - -#if defined(ANDROID_ACCESSORY_SPEC) || defined(CFG_MIC_KEY) -static void hid_data_send_handler(enum USB_AUDIO_HID_EVENT_T event, int error) { - TRACE(2, "HID SENT: event=0x%04x error=%d", event, error); -} -#endif - -static void usb_audio_itf_callback(enum USB_AUDIO_ITF_ID_T id, - enum USB_AUDIO_ITF_CMD_T cmd) { - if (0) { -#ifdef USB_AUDIO_MULTIFUNC - } else if (id == USB_AUDIO_ITF_ID_RECV2) { - usb_audio_playback2_start(cmd); -#endif - } else if (id == USB_AUDIO_ITF_ID_RECV) { - usb_audio_playback_start(cmd); - } else { - usb_audio_capture_start(cmd); - } -} - -static void usb_audio_mute_callback(enum USB_AUDIO_ITF_ID_T id, uint32_t mute) { - if (0) { -#ifdef USB_AUDIO_MULTIFUNC - } else if (id == USB_AUDIO_ITF_ID_RECV2) { - usb_audio_mute2_control(mute); -#endif - } else if (id == USB_AUDIO_ITF_ID_RECV) { - usb_audio_mute_control(mute); - } else { - usb_audio_cap_mute_control(mute); - } -} - -static void usb_audio_set_volume(enum USB_AUDIO_ITF_ID_T id, uint32_t percent) { - if (0) { -#ifdef USB_AUDIO_MULTIFUNC - } else if (id == USB_AUDIO_ITF_ID_RECV2) { - usb_audio_vol2_control(percent); -#endif - } else if (id == USB_AUDIO_ITF_ID_RECV) { - usb_audio_vol_control(percent); - } else { - usb_audio_cap_vol_control(percent); - } -} - -static uint32_t usb_audio_get_volume(enum USB_AUDIO_ITF_ID_T id) { - uint32_t percent = 0; - - if (0) { -#ifdef USB_AUDIO_MULTIFUNC - } else if (id == USB_AUDIO_ITF_ID_RECV2) { - percent = usb_audio_get_vol2_percent(); -#endif - } else if (id == USB_AUDIO_ITF_ID_RECV) { - percent = usb_audio_get_vol_percent(); - } else { - percent = usb_audio_get_cap_vol_percent(); - } - - return percent; -} - -static void usb_audio_xfer_callback(enum USB_AUDIO_ITF_ID_T id, - const struct USB_AUDIO_XFER_INFO_T *info) { - if (0) { -#ifdef USB_AUDIO_MULTIFUNC - } else if (id == USB_AUDIO_ITF_ID_RECV2) { - usb_audio_data_recv2_handler(info); -#endif - } else if (id == USB_AUDIO_ITF_ID_RECV) { - usb_audio_data_recv_handler(info); - } else { - usb_audio_data_send_handler(info); - } -} - -static void usb_audio_stream_running_handler(void) { - enum AUDIO_STREAM_RUNNING_T req; - uint32_t lock; - - req = streams_running_req; - - if (req == AUDIO_STREAM_RUNNING_NULL) { - return; - } else if (req == AUDIO_STREAM_RUNNING_ENABLED) { - usb_audio_init_streams(AUDIO_STREAM_REQ_ANC); - } else if (req == AUDIO_STREAM_RUNNING_DISABLED) { - usb_audio_term_streams(AUDIO_STREAM_REQ_ANC); - } - - lock = int_lock(); - if (req == streams_running_req) { - streams_running_req = AUDIO_STREAM_RUNNING_NULL; - } - int_unlock(lock); -} - -void usb_audio_keep_streams_running(bool enable) { - if (enable) { - streams_running_req = AUDIO_STREAM_RUNNING_ENABLED; - } else { - streams_running_req = AUDIO_STREAM_RUNNING_DISABLED; - } - - // TODO: Move usb_audio_stream_running_handler() into usb_audio_app_loop() ? - // How to ensure that streams are opened before ANC is enabled? - usb_audio_stream_running_handler(); -} - -#ifdef USB_AUDIO_DYN_CFG - -static enum AUD_SAMPRATE_T calc_play_sample_rate(enum AUD_SAMPRATE_T usb_rate) { - enum AUD_SAMPRATE_T codec_rate; - -#if defined(CHIP_BEST1000) && defined(ANC_APP) - - codec_rate = - (usb_rate % AUD_SAMPRATE_8000) ? AUD_SAMPRATE_88200 : AUD_SAMPRATE_96000; - -#else - - codec_rate = usb_rate; - -#if defined(__AUDIO_RESAMPLE__) && defined(SW_PLAYBACK_RESAMPLE) - if (codec_rate % AUD_SAMPRATE_8000) { - codec_rate = - hal_cmu_get_crystal_freq() / (CODEC_FREQ_44_1K_SERIES / codec_rate); - } else { - codec_rate = - hal_cmu_get_crystal_freq() / (CODEC_FREQ_48K_SERIES / codec_rate); - } -#endif - -#endif - - return codec_rate; -} - -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) -static enum AUD_SAMPRATE_T -calc_anc_cap_sample_rate_best1000(enum AUD_SAMPRATE_T usb_rate, - enum AUD_SAMPRATE_T play_rate) { - enum AUD_SAMPRATE_T rate_cap; - -#ifdef ANC_APP - -#ifdef AUD_PLL_DOUBLE -#if defined(_DUAL_AUX_MIC_) || defined(CAPTURE_ANC_DATA) - rate_cap = play_rate * 8; -#else - rate_cap = play_rate * 2; -#endif -#else // !AUD_PLL_DOUBLE -#if defined(_DUAL_AUX_MIC_) || defined(CAPTURE_ANC_DATA) - rate_cap = play_rate * 4; -#else - rate_cap = play_rate; -#endif -#endif // !AUD_PLL_DOUBLE - -#else // _DUAL_AUX_MIC_ - - // Capture reference - enum AUD_SAMPRATE_T rate_cap_ref; - - rate_cap_ref = - (usb_rate % AUD_SAMPRATE_8000) ? AUD_SAMPRATE_44100 : AUD_SAMPRATE_48000; - - rate_cap = rate_cap_ref * 4; - -#endif - - return rate_cap; -} -#endif - -static enum AUD_SAMPRATE_T calc_cap_sample_rate(enum AUD_SAMPRATE_T usb_rate, - enum AUD_SAMPRATE_T play_rate) { -#if defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_)) - - return calc_anc_cap_sample_rate_best1000(usb_rate, play_rate); - -#else // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) - - enum AUD_SAMPRATE_T codec_rate; - -#ifdef __AUDIO_RESAMPLE__ - - codec_rate = usb_rate; - -#ifdef SW_CAPTURE_RESAMPLE - if (codec_rate % AUD_SAMPRATE_8000) { - codec_rate = - hal_cmu_get_crystal_freq() / (CODEC_FREQ_44_1K_SERIES / codec_rate); - } else { - codec_rate = - hal_cmu_get_crystal_freq() / (CODEC_FREQ_48K_SERIES / codec_rate); - } -#endif - -#else // ! __AUDIO_RESAMPLE__ - - bool usb_rate_44p1k; - bool play_rate_44p1k; - - usb_rate_44p1k = !!(usb_rate % AUD_SAMPRATE_8000); - play_rate_44p1k = !!(play_rate % AUD_SAMPRATE_8000); - - if (usb_rate_44p1k ^ play_rate_44p1k) { - // Playback pll is NOT compatible with capture sample rate - if (usb_rate_44p1k) { - codec_rate = CODEC_FREQ_48K_SERIES / (CODEC_FREQ_44_1K_SERIES / usb_rate); - } else { - codec_rate = CODEC_FREQ_44_1K_SERIES / (CODEC_FREQ_48K_SERIES / usb_rate); - } - } else { - // Playback pll is compatible with capture sample rate - codec_rate = usb_rate; - } - -#endif // !__AUDIO_RESAMPLE__ - - return codec_rate; - -#endif // !(CHIP_BEST1000 && (ANC_APP || _DUAL_AUX_MIC_)) -} - -#endif // USB_AUDIO_DYN_CFG - -static void POSSIBLY_UNUSED -usb_audio_update_codec_stream(enum AUD_STREAM_T stream) { - bool update_play; - bool update_cap; -#ifdef STREAM_RATE_BITS_SETUP - struct AF_STREAM_CONFIG_T *cfg, stream_cfg; - uint32_t ret; -#endif - - update_play = false; - update_cap = false; - -#ifdef USB_AUDIO_DYN_CFG - enum AUD_SAMPRATE_T new_recv_rate; - enum AUD_SAMPRATE_T new_send_rate; - enum AUD_SAMPRATE_T play_rate; - enum AUD_SAMPRATE_T cap_rate; - uint8_t new_recv_size; - uint32_t lock; - - lock = int_lock(); - new_recv_rate = new_sample_rate_recv; - new_recv_size = new_sample_size_recv; - new_send_rate = new_sample_rate_send; - int_unlock(lock); - - play_rate = sample_rate_play; - cap_rate = sample_rate_cap; - - if (stream == AUD_STREAM_PLAYBACK) { - if (sample_rate_recv == new_recv_rate && - sample_size_recv == new_recv_size) { - // No change - goto _done_rate_size_check; - } -#ifdef AUDIO_PLAYBACK_24BIT - if (sample_rate_recv == new_recv_rate && - sample_size_recv != new_recv_size) { - // No codec change. Only a change in usb sample size - TRACE(3, "%s:1: Update recv sample size from %u to %u", __FUNCTION__, - sample_size_recv, new_recv_size); - sample_size_recv = new_recv_size; - update_playback_sync_info(); - goto _done_rate_size_check; - } -#endif - } else { - if (sample_rate_send == new_send_rate) { - // No change - goto _done_rate_size_check; - } - } - - if (stream == AUD_STREAM_PLAYBACK) { - play_rate = calc_play_sample_rate(new_recv_rate); - if (sample_rate_play == play_rate) { - if (sample_size_recv == new_recv_size) { - // No codec change. Only a change in usb sample rate - TRACE(3, "%s:1: Update recv sample rate from %u to %u", __FUNCTION__, - sample_rate_recv, new_recv_rate); - sample_rate_recv = new_recv_rate; - update_playback_sync_info(); - goto _done_rate_size_check; - } - } else { -#ifndef __AUDIO_RESAMPLE__ - bool new_rate_44p1k; - bool old_rate_44p1k; - - new_rate_44p1k = !!(play_rate % AUD_SAMPRATE_8000); - old_rate_44p1k = !!(sample_rate_play % AUD_SAMPRATE_8000); - - if (new_rate_44p1k ^ old_rate_44p1k) { - cap_rate = calc_cap_sample_rate(new_send_rate, play_rate); - update_cap = true; - } -#endif - } - update_play = true; - } else { -#ifndef __AUDIO_RESAMPLE__ - if (playback_state == AUDIO_ITF_STATE_STOPPED) { - bool usb_rate_44p1k; - bool play_rate_44p1k; - - usb_rate_44p1k = !!(new_send_rate % AUD_SAMPRATE_8000); - play_rate_44p1k = !!(play_rate % AUD_SAMPRATE_8000); - - if (usb_rate_44p1k ^ play_rate_44p1k) { - play_rate = calc_play_sample_rate(usb_rate_44p1k ? AUD_SAMPRATE_44100 - : AUD_SAMPRATE_48000); - update_play = true; - } - } -#endif - cap_rate = calc_cap_sample_rate(new_send_rate, play_rate); - if (sample_rate_cap == cap_rate) { - // No codec change. Only a change in usb sample rate - TRACE(3, "%s:1: Update send sample rate from %u to %u", __FUNCTION__, - sample_rate_send, new_send_rate); - sample_rate_send = new_send_rate; - update_capture_sync_info(); - goto _done_rate_size_check; - } - update_cap = true; - } - -_done_rate_size_check:; -#endif - -#ifdef DSD_SUPPORT - bool new_dsd_state; - - new_dsd_state = usb_dsd_enabled; - if (stream == AUD_STREAM_PLAYBACK) { - if (codec_dsd_enabled != new_dsd_state) { - update_play = true; - } - } -#endif - - if (!update_play && !update_cap) { - return; - } - - // 1) To avoid L/R sample misalignment, streams must be stopped before - // changing sample rate 2) To avoid FIFO corruption, streams must be stopped - // before changing sample size - if (update_cap && - codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_STARTED]) { - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_CAP, true); - usb_audio_stop_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - } - if (update_play && - codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_STARTED]) { - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_PLAY, true); - usb_audio_stop_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USER_ALL); - } - - if (update_play) { -#ifdef USB_AUDIO_DYN_CFG - if (sample_rate_recv != new_recv_rate) { - TRACE(3, "%s:2: Update recv sample rate from %u to %u", __FUNCTION__, - sample_rate_recv, new_recv_rate); - sample_rate_recv = new_recv_rate; - } - if (sample_rate_play != play_rate) { - TRACE(3, "%s:2: Update play sample rate from %u to %u", __FUNCTION__, - sample_rate_play, play_rate); - sample_rate_play = play_rate; - } - if (sample_size_recv != new_recv_size) { - TRACE(3, "%s:2: Update recv sample size from %u to %u", __FUNCTION__, - sample_size_recv, new_recv_size); - sample_size_recv = new_recv_size; -#ifndef AUDIO_PLAYBACK_24BIT - uint8_t old_play_size; - - old_play_size = sample_size_play; - sample_size_play = (new_recv_size == 2) ? 2 : 4; - TRACE(3, "%s:2: Update play sample size from %u to %u", __FUNCTION__, - old_play_size, sample_size_play); -#endif - } -#endif -#ifdef DSD_SUPPORT - if (codec_dsd_enabled != new_dsd_state) { - codec_dsd_enabled = new_dsd_state; -#ifdef CODEC_DSD - uint8_t old_play_size; - - old_play_size = sample_size_play; - if (codec_dsd_enabled) { - playback_size /= ((sample_size_play + 1) / 2); - dsd_saved_sample_size = sample_size_play; - sample_size_play = 2; - } else { - playback_size *= ((dsd_saved_sample_size + 1) / 2); - sample_size_play = dsd_saved_sample_size; - } - TRACE(4, "%s:2: CODEC_DSD=%u update play sample size from %u to %u", - __FUNCTION__, codec_dsd_enabled, old_play_size, sample_size_play); -#endif - } -#endif - } - if (update_cap) { -#ifdef USB_AUDIO_DYN_CFG - if (sample_rate_send != new_send_rate) { - TRACE(3, "%s:2: Update send sample rate from %u to %u", __FUNCTION__, - sample_rate_send, new_send_rate); - sample_rate_send = new_send_rate; - } - if (sample_rate_cap != cap_rate) { - TRACE(3, "%s:2: Update cap sample rate from %u to %u", __FUNCTION__, - sample_rate_cap, cap_rate); - sample_rate_cap = cap_rate; - } -#endif - } - -#if defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY) - playback_size = calc_playback_size(sample_rate_play); - capture_size = calc_capture_size(sample_rate_cap); -#endif - -#ifdef SW_CAPTURE_RESAMPLE - // Check whether to start capture resample - if (update_cap && capture_state == AUDIO_ITF_STATE_STARTED) { - capture_stream_resample_config(); - } -#endif - -#ifdef STREAM_RATE_BITS_SETUP - if (update_play) { - update_playback_sync_info(); - - ret = af_stream_get_cfg(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &cfg, true); - if (ret == 0) { - // Changes in AF_STREAM_CONFIG_T::bits must be in another cfg variable - stream_cfg = *cfg; -#ifdef CODEC_DSD - if (codec_dsd_enabled) { - stream_cfg.bits = AUD_BITS_24; - } else -#endif - { - stream_cfg.bits = sample_size_to_enum_playback(sample_size_play); - } - stream_cfg.sample_rate = sample_rate_play; -#if (defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY)) || \ - defined(CODEC_DSD) - stream_cfg.data_size = playback_size; -#endif - af_stream_setup(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg); - } - -#ifdef AUDIO_ANC_FB_MC - ret = af_stream_get_cfg(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &cfg, true); - if (ret == 0) { - // Changes in AF_STREAM_CONFIG_T::bits must be in another cfg variable - stream_cfg = *cfg; - stream_cfg.bits = sample_size_to_enum_playback(sample_size_play); - - if (sample_rate_play == AUD_SAMPRATE_8000) { - playback_samplerate_ratio = 8 * 6; - } else if (sample_rate_play == AUD_SAMPRATE_16000) { - playback_samplerate_ratio = 8 * 3; - } else if ((sample_rate_play == AUD_SAMPRATE_44100) || - (sample_rate_play == AUD_SAMPRATE_48000) || - (sample_rate_play == AUD_SAMPRATE_50781)) { - playback_samplerate_ratio = 8; - } else if ((sample_rate_play == AUD_SAMPRATE_88200) || - (sample_rate_play == AUD_SAMPRATE_96000)) { - playback_samplerate_ratio = 4; - } else if ((sample_rate_play == AUD_SAMPRATE_176400) || - (sample_rate_play == AUD_SAMPRATE_192000)) { - playback_samplerate_ratio = 2; - } else if (sample_rate_play == AUD_SAMPRATE_384000) { - playback_samplerate_ratio = 1; - } else { - playback_samplerate_ratio = 1; - ASSERT(false, "Music cancel can't support playback sample rate:%d", - sample_rate_play); - } - - stream_cfg.data_ptr = playback_buf + playback_size; - stream_cfg.data_size = playback_size * playback_samplerate_ratio; - - stream_cfg.sample_rate = sample_rate_play; - af_stream_setup(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &stream_cfg); - anc_mc_run_setup((sample_rate_play * playback_samplerate_ratio) / 8); - } -#endif - } - if (update_cap) { - update_capture_sync_info(); - - ret = af_stream_get_cfg(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &cfg, true); - if (ret == 0) { - stream_cfg = *cfg; - stream_cfg.bits = sample_size_to_enum_capture(sample_size_cap); -#if defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY) - stream_cfg.data_size = capture_size; -#endif - stream_cfg.sample_rate = sample_rate_cap; - af_stream_setup(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg); - } - } -#else // !STREAM_RATE_BITS_SETUP - // Close streams - if (update_cap && codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_OPENED]) { - usb_audio_close_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - } - if (update_play && - codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_OPENED]) { - usb_audio_close_codec_stream(AUD_STREAM_PLAYBACK, - AUDIO_STREAM_REQ_USER_ALL); - } - // Open streams - if (update_play && - codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_OPENED]) { - usb_audio_open_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USER_ALL); - } - if (update_cap && codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_OPENED]) { - usb_audio_open_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - } -#endif // !STREAM_RATE_BITS_SETUP - - if (update_play && - codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_STARTED]) { - usb_audio_start_codec_stream(AUD_STREAM_PLAYBACK, - AUDIO_STREAM_REQ_USER_ALL); - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_PLAY, false); - } - if (update_cap && - codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_STARTED]) { - usb_audio_start_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_CAP, false); - } -} - -static void start_play(uint8_t seq) { - if (playback_state == AUDIO_ITF_STATE_STOPPED) { -#ifdef FREQ_RESP_EQ - freq_resp_eq_init(); -#endif - -#ifdef DELAY_STREAM_OPEN - usb_audio_open_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USB); -#endif - -#ifdef NOISE_GATING - last_high_signal_time = hal_sys_timer_get(); -#ifdef NOISE_REDUCTION - last_nr_restore_time = hal_sys_timer_get(); -#endif -#endif - - usb_audio_start_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USB); - - playback_state = AUDIO_ITF_STATE_STARTED; - } - - codec_play_seq = seq; - playback_paused = 0; - - usb_audio_update_freq(); -} - -static void usb_audio_cmd_start_play(uint8_t seq) { -#if defined(USB_AUDIO_DYN_CFG) && defined(USB_AUDIO_UAC2) - usb_audio_update_codec_stream(AUD_STREAM_PLAYBACK); -#endif - - start_play(seq); -} - -static void usb_audio_cmd_stop_play(void) { - if (playback_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USB); - -#ifdef PA_ON_OFF_KEY - if (pa_on_off_muted) { - pa_on_off_muted = false; - if (mute_user_map == 0) { - usb_audio_codec_unmute(CODEC_MUTE_USER_ALL); - } - } -#endif -#ifdef NOISE_GATING - // Restore the noise gating status - if (mute_user_map & (1 << CODEC_MUTE_USER_NOISE_GATING)) { - usb_audio_codec_unmute(CODEC_MUTE_USER_NOISE_GATING); - } -#ifdef NOISE_REDUCTION - restore_noise_reduction_status(); -#endif -#endif - -#ifdef DELAY_STREAM_OPEN - usb_audio_close_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USB); -#endif - - playback_paused = 0; - playback_state = AUDIO_ITF_STATE_STOPPED; -#ifdef DSD_SUPPORT - if (codec_dsd_enabled) { - usb_audio_update_codec_stream(AUD_STREAM_PLAYBACK); - } -#endif - } - - usb_audio_update_freq(); -} - -static void start_capture(uint8_t seq) { - if (capture_state == AUDIO_ITF_STATE_STOPPED) { -#ifdef SW_CAPTURE_RESAMPLE - // Check whether to start capture resample - capture_stream_resample_config(); -#endif - -#ifdef DELAY_STREAM_OPEN - usb_audio_open_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USB); -#endif - usb_audio_start_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USB); - - capture_state = AUDIO_ITF_STATE_STARTED; - } - - codec_cap_seq = seq; - - usb_audio_update_freq(); -} - -static void usb_audio_cmd_start_capture(uint8_t seq) { start_capture(seq); } - -static void usb_audio_cmd_stop_capture(void) { - if (capture_state == AUDIO_ITF_STATE_STARTED) { - usb_audio_stop_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USB); - -#ifdef DELAY_STREAM_OPEN - usb_audio_close_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USB); -#endif - -#ifdef SW_CAPTURE_RESAMPLE - if (resample_cap_enabled) { - audio_resample_ex_close(resample_id); - resample_cap_enabled = false; - } -#endif - - capture_state = AUDIO_ITF_STATE_STOPPED; - } - - usb_audio_update_freq(); -} - -static void usb_audio_cmd_set_volume(void) { -#ifndef USB_AUDIO_MULTIFUNC - playback_vol = new_playback_vol; -#endif - - usb_audio_set_codec_volume(AUD_STREAM_PLAYBACK, playback_vol); - -#ifdef UNMUTE_WHEN_SET_VOL - // Unmute if muted before - if (mute_user_map & (1 << CODEC_MUTE_USER_CMD)) { - usb_audio_codec_unmute(CODEC_MUTE_USER_CMD); - } -#endif -} - -static void usb_audio_cmd_set_cap_volume(void) { - capture_vol = new_capture_vol; - - usb_audio_set_codec_volume(AUD_STREAM_CAPTURE, capture_vol); -} - -static void usb_audio_cmd_mute_ctrl(void) { - uint8_t mute; - -#ifdef USB_AUDIO_MULTIFUNC - mute = new_mute_state && new_mute2_state; -#else - mute = new_mute_state; -#endif - - if (mute) { - usb_audio_codec_mute(CODEC_MUTE_USER_CMD); - } else { - usb_audio_codec_unmute(CODEC_MUTE_USER_CMD); - } -} - -static void usb_audio_cmd_cap_mute_ctrl(void) { - uint8_t mute; - - mute = new_cap_mute_state; - - af_stream_mute(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, mute); -} - -static void usb_audio_cmd_usb_state(enum AUDIO_CMD_T cmd) { - usb_audio_cmd_stop_capture(); - usb_audio_cmd_stop_play(); - - if (cmd == AUDIO_CMD_USB_RESET || cmd == AUDIO_CMD_USB_WAKEUP) { - usb_audio_acquire_freq(); - if (cmd == AUDIO_CMD_USB_RESET) { - usb_audio_term_streams(AUDIO_STREAM_REQ_USB); - } - usb_audio_reset_codec_stream_state(cmd == AUDIO_CMD_USB_RESET); - usb_audio_init_streams(AUDIO_STREAM_REQ_USB); - } else if (cmd == AUDIO_CMD_USB_DISCONNECT || cmd == AUDIO_CMD_USB_SLEEP) { - usb_audio_term_streams(AUDIO_STREAM_REQ_USB); - usb_audio_reset_codec_stream_state(cmd == AUDIO_CMD_USB_DISCONNECT); - if (cmd == AUDIO_CMD_USB_DISCONNECT || usb_configured) { - usb_audio_release_freq(); - } - } else if (cmd == AUDIO_CMD_USB_CONFIG) { - usb_configured = 1; - usb_audio_reset_codec_stream_state(true); - } -} - -static void usb_audio_cmd_recv_pause(uint8_t seq) { - TRACE(3, "%s: Recv pause: seq=%u usb_recv_seq=%u", __FUNCTION__, seq, - usb_recv_seq); - - if (seq == usb_recv_seq) { - usb_audio_cmd_stop_play(); - playback_paused = 1; - } -} - -static void usb_audio_cmd_recv_continue(uint8_t seq) { - TRACE(3, "%s: Recv continue: seq=%u usb_recv_seq=%u", __FUNCTION__, seq, - usb_recv_seq); - - if (seq == usb_recv_seq && playback_paused) { - start_play(seq); - // playback_paused = 0; - } -} - -#ifdef USB_AUDIO_DYN_CFG -static void usb_audio_cmd_set_playback_rate(uint8_t seq, uint8_t index) { -#ifndef USB_AUDIO_UAC2 - if (seq != usb_recv_seq) { - TRACE(3, "%s: Bad seq: seq=%u usb_recv_seq=%u", __FUNCTION__, seq, - usb_recv_seq); - return; - } -#endif - - usb_audio_update_codec_stream(AUD_STREAM_PLAYBACK); - -#ifndef USB_AUDIO_UAC2 - start_play(seq); -#endif -} - -static void usb_audio_cmd_set_capture_rate(uint8_t seq, uint8_t index) { -#ifndef USB_AUDIO_UAC2 - if (seq != usb_send_seq) { - TRACE(3, "%s: Bad seq: seq=%u usb_send_seq=%u", __FUNCTION__, seq, - usb_send_seq); - return; - } -#endif - - usb_audio_update_codec_stream(AUD_STREAM_CAPTURE); - -#ifndef USB_AUDIO_UAC2 - start_capture(seq); -#endif -} -#endif - -static void usb_audio_cmd_reset_codec(void) { - TRACE(1, "%s: RESET CODEC", __FUNCTION__); - - // Regarding PLL reconfiguration, stream stop and start are enough. - // Complete DAC/ADC reset (including analog parts) can be achieved by - // stream close and open, which need to invoke explicitly here if - // DELAY_STREAM_OPEN is not defined. - - if (codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_STARTED]) { - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_CAP, true); - usb_audio_stop_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - } - - if (codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_STARTED]) { - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_PLAY, true); - usb_audio_stop_codec_stream(AUD_STREAM_PLAYBACK, AUDIO_STREAM_REQ_USER_ALL); - } - - rate_tune_ratio[AUD_STREAM_PLAYBACK] = 0; - rate_tune_ratio[AUD_STREAM_CAPTURE] = 0; -#ifdef __AUDIO_RESAMPLE__ -#ifdef PLL_TUNE_SAMPLE_RATE - af_codec_tune_resample_rate(AUD_STREAM_PLAYBACK, - rate_tune_ratio[AUD_STREAM_PLAYBACK]); - af_codec_tune_resample_rate(AUD_STREAM_CAPTURE, - rate_tune_ratio[AUD_STREAM_CAPTURE]); -#elif defined(PLL_TUNE_XTAL) - af_codec_tune_xtal(rate_tune_ratio[AUD_STREAM_PLAYBACK]); -#endif -#else - af_codec_tune_pll(rate_tune_ratio[AUD_STREAM_PLAYBACK]); -#endif - - if (codec_stream_map[AUD_STREAM_PLAYBACK][AUDIO_STREAM_STARTED]) { - usb_audio_start_codec_stream(AUD_STREAM_PLAYBACK, - AUDIO_STREAM_REQ_USER_ALL); - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_PLAY, false); - } - - if (codec_stream_map[AUD_STREAM_CAPTURE][AUDIO_STREAM_STARTED]) { - usb_audio_start_codec_stream(AUD_STREAM_CAPTURE, AUDIO_STREAM_REQ_USER_ALL); - set_codec_config_status(CODEC_CONFIG_LOCK_RESTART_CAP, false); - } -} - -#ifdef NOISE_GATING -static void usb_audio_cmd_noise_gating(void) { - uint32_t lock; - enum NOISE_GATING_CMD_T cmd; - - lock = int_lock(); - cmd = noise_gating_cmd; - noise_gating_cmd = NOISE_GATING_CMD_NULL; - int_unlock(lock); - - TRACE(3, "%s: cmd=%d map=0x%02X", __FUNCTION__, cmd, mute_user_map); - - if (cmd == NOISE_GATING_CMD_MUTE) { - if ((mute_user_map & (1 << CODEC_MUTE_USER_NOISE_GATING)) == 0) { - usb_audio_codec_mute(CODEC_MUTE_USER_NOISE_GATING); - } - } else if (cmd == NOISE_GATING_CMD_UNMUTE) { - if (mute_user_map & (1 << CODEC_MUTE_USER_NOISE_GATING)) { - usb_audio_codec_unmute(CODEC_MUTE_USER_NOISE_GATING); - } - } -} - -#ifdef NOISE_REDUCTION -static void restore_noise_reduction_status(void) { - if (nr_active) { - nr_active = false; - af_codec_set_noise_reduction(false); - } - prev_samp_positive[0] = prev_samp_positive[1] = false; - memset(prev_zero_diff, 0, sizeof(prev_zero_diff)); - memset(cur_zero_diff, 0, sizeof(cur_zero_diff)); - nr_cont_cnt = 0; -} - -static void usb_audio_cmd_noise_reduction(void) { - uint32_t lock; - enum NOISE_REDUCTION_CMD_T cmd; - - lock = int_lock(); - cmd = noise_reduction_cmd; - noise_reduction_cmd = NOISE_REDUCTION_CMD_NULL; - int_unlock(lock); - - TRACE(2, "%s: cmd=%d", __FUNCTION__, cmd); - - if (cmd == NOISE_REDUCTION_CMD_FIRE) { - nr_active = true; - af_codec_set_noise_reduction(true); - } else if (cmd == NOISE_REDUCTION_CMD_RESTORE) { - nr_active = false; - af_codec_set_noise_reduction(false); - } -} -#endif -#endif - -static void usb_audio_cmd_tune_rate(enum AUD_STREAM_T stream) { -#ifdef __AUDIO_RESAMPLE__ -#ifdef PLL_TUNE_SAMPLE_RATE - bool update_play, update_cap; - - update_play = true; - update_cap = false; - -#ifdef UAUD_SYNC_STREAM_TARGET - if (stream == AUD_STREAM_PLAYBACK) { - update_play = true; - update_cap = false; - } else { - update_play = false; - update_cap = true; - } -#else - update_play = true; - update_cap = true; -#endif - -#ifdef SW_RESAMPLE - if (update_play) { - audio_resample_ex_set_ratio_step(play_resample_id, - nominal_ratio_step * - rate_tune_ratio[AUD_STREAM_PLAYBACK]); - } - if (update_cap) { - audio_resample_ex_set_ratio_step(cap_resample_id, - nominal_ratio_step * - rate_tune_ratio[AUD_STREAM_CAPTURE]); - } -#else - if (update_play) { - af_codec_tune_resample_rate(AUD_STREAM_PLAYBACK, - rate_tune_ratio[AUD_STREAM_PLAYBACK]); - } - if (update_cap) { - af_codec_tune_resample_rate(AUD_STREAM_CAPTURE, - rate_tune_ratio[AUD_STREAM_CAPTURE]); - } -#endif -#elif defined(PLL_TUNE_XTAL) - af_codec_tune_xtal(rate_tune_ratio[AUD_STREAM_PLAYBACK]); -#endif -#else // !__AUDIO_RESAMPLE__ - af_codec_tune_pll(rate_tune_ratio[AUD_STREAM_PLAYBACK]); -#endif // !__AUDIO_RESAMPLE__ -} - -#ifdef DSD_SUPPORT -static void usb_audio_cmd_set_dsd_cfg(void) { - if (codec_dsd_enabled != usb_dsd_enabled) { - TRACE(3, "%s: %d => %d", __FUNCTION__, codec_dsd_enabled, usb_dsd_enabled); - usb_audio_update_codec_stream(AUD_STREAM_PLAYBACK); - } -} -#endif - -#ifdef PERF_TEST_POWER_KEY -static void test_cmd_perf_test_power(void) { - perft_power_type++; - if (perft_power_type >= HAL_CODEC_PERF_TEST_QTY) { - perft_power_type = 0; - } - - TRACE(2, "%s: %d", __FUNCTION__, perft_power_type); - - af_codec_set_perf_test_power(perft_power_type); -} -#endif - -#ifdef PA_ON_OFF_KEY -static void test_cmd_pa_on_off(void) { - pa_on_off_muted = !pa_on_off_muted; - - TRACE(2, "%s: %d", __FUNCTION__, pa_on_off_muted); - - if (pa_on_off_muted) { - usb_audio_codec_mute(CODEC_MUTE_USER_ALL); - } else { - usb_audio_codec_unmute(CODEC_MUTE_USER_ALL); -#ifdef PERF_TEST_POWER_KEY - af_codec_set_perf_test_power(perft_power_type); -#endif - } -} -#endif - -static void usb_audio_cmd_handler(void *param) { - uint32_t data; - enum AUDIO_CMD_T cmd; - uint8_t seq; - uint8_t POSSIBLY_UNUSED arg; - - hal_cpu_wake_unlock(USB_AUDIO_CPU_WAKE_USER); - - while (safe_queue_get(&cmd_queue, &data) == 0) { - cmd = EXTRACT_CMD(data); - seq = EXTRACT_SEQ(data); - arg = EXTRACT_ARG(data); - TRACE(4, "%s: cmd=%d seq=%d arg=%d", __FUNCTION__, cmd, seq, arg); - - switch (cmd) { - case AUDIO_CMD_START_PLAY: - usb_audio_cmd_start_play(seq); - break; - - case AUDIO_CMD_STOP_PLAY: - usb_audio_cmd_stop_play(); - break; - - case AUDIO_CMD_START_CAPTURE: - usb_audio_cmd_start_capture(seq); - break; - - case AUDIO_CMD_STOP_CAPTURE: - usb_audio_cmd_stop_capture(); - break; - - case AUDIO_CMD_SET_VOLUME: - usb_audio_cmd_set_volume(); - break; - - case AUDIO_CMD_SET_CAP_VOLUME: - usb_audio_cmd_set_cap_volume(); - break; - - case AUDIO_CMD_MUTE_CTRL: - usb_audio_cmd_mute_ctrl(); - break; - - case AUDIO_CMD_CAP_MUTE_CTRL: - usb_audio_cmd_cap_mute_ctrl(); - break; - - case AUDIO_CMD_USB_RESET: - case AUDIO_CMD_USB_DISCONNECT: - case AUDIO_CMD_USB_CONFIG: - case AUDIO_CMD_USB_SLEEP: - case AUDIO_CMD_USB_WAKEUP: - usb_audio_cmd_usb_state(cmd); - break; - - case AUDIO_CMD_RECV_PAUSE: - usb_audio_cmd_recv_pause(seq); - break; - case AUDIO_CMD_RECV_CONTINUE: - usb_audio_cmd_recv_continue(seq); - break; - -#ifdef USB_AUDIO_DYN_CFG - case AUDIO_CMD_SET_RECV_RATE: - usb_audio_cmd_set_playback_rate(seq, arg); - break; - case AUDIO_CMD_SET_SEND_RATE: - usb_audio_cmd_set_capture_rate(seq, arg); - break; -#endif - - case AUDIO_CMD_RESET_CODEC: - usb_audio_cmd_reset_codec(); - break; - -#ifdef NOISE_GATING - case AUDIO_CMD_NOISE_GATING: - usb_audio_cmd_noise_gating(); - break; - -#ifdef NOISE_REDUCTION - case AUDIO_CMD_NOISE_REDUCTION: - usb_audio_cmd_noise_reduction(); - break; -#endif -#endif - - case AUDIO_CMD_TUNE_RATE: - usb_audio_cmd_tune_rate((enum AUD_STREAM_T)arg); - break; - -#ifdef DSD_SUPPORT - case AUDIO_CMD_SET_DSD_CFG: - usb_audio_cmd_set_dsd_cfg(); - break; -#endif - -#ifdef PERF_TEST_POWER_KEY - case TEST_CMD_PERF_TEST_POWER: - test_cmd_perf_test_power(); - break; -#endif - -#ifdef PA_ON_OFF_KEY - case TEST_CMD_PA_ON_OFF: - test_cmd_pa_on_off(); - break; -#endif - - default: - ASSERT(false, "%s: Invalid cmd %d", __FUNCTION__, cmd); - break; - } - } -} - -void usb_audio_app_init(const struct USB_AUDIO_BUF_CFG *cfg) { -#ifdef USB_AUDIO_DYN_CFG - ASSERT(cfg->play_size / MAX_FRAME_SIZE_PLAYBACK < - cfg->recv_size / MAX_FRAME_SIZE_RECV, - "%s: play frames %u should < recv frames %u", __FUNCTION__, - cfg->play_size / MAX_FRAME_SIZE_PLAYBACK, - cfg->recv_size / MAX_FRAME_SIZE_RECV); - ASSERT(cfg->cap_size / MAX_FRAME_SIZE_CAPTURE < - cfg->send_size / MAX_FRAME_SIZE_SEND, - "%s: cap frames %u should < send frames %u", __FUNCTION__, - cfg->cap_size / MAX_FRAME_SIZE_CAPTURE, - cfg->send_size / MAX_FRAME_SIZE_SEND); -#else - ASSERT( - cfg->play_size / FRAME_SIZE_PLAYBACK < cfg->recv_size / FRAME_SIZE_RECV, - "%s: play frames %u should < recv frames %u", __FUNCTION__, - cfg->play_size / FRAME_SIZE_PLAYBACK, cfg->recv_size / FRAME_SIZE_RECV); - ASSERT(cfg->cap_size / FRAME_SIZE_CAPTURE < cfg->send_size / FRAME_SIZE_SEND, - "%s: cap frames %u should < send frames %u", __FUNCTION__, - cfg->cap_size / FRAME_SIZE_CAPTURE, cfg->send_size / FRAME_SIZE_SEND); -#endif - -#ifdef SW_CAPTURE_RESAMPLE - enum AUD_CHANNEL_NUM_T chans; - enum AUD_BITS_T bits; - uint8_t phase_coef_num; - uint32_t resamp_calc_size; - - chans = get_capture_resample_chan_num(); - bits = sample_size_to_enum_capture(sample_size_cap); - // Max phase coef num - phase_coef_num = 100; - - resamp_calc_size = - audio_resample_ex_get_buffer_size(chans, bits, phase_coef_num); - ASSERT(cfg->resample_size > resamp_calc_size, - "%s: Resample size too small %u (should > %u)", __FUNCTION__, - cfg->resample_size, resamp_calc_size); - - resample_history_buf = (uint8_t *)ALIGN((uint32_t)cfg->resample_buf, 4); - resample_history_size = resamp_calc_size; - resample_input_buf = (uint8_t *)resample_history_buf + resample_history_size; - ASSERT(cfg->resample_buf + cfg->resample_size > resample_input_buf, - "%s: Resample size too small: %u", __FUNCTION__, cfg->resample_size); - resample_input_size = - cfg->resample_buf + cfg->resample_size - resample_input_buf; -#endif - - playback_buf = cfg->play_buf; - capture_buf = cfg->cap_buf; - usb_recv_buf = cfg->recv_buf; - usb_send_buf = cfg->send_buf; - playback_eq_buf = cfg->eq_buf; - playback_eq_size = cfg->eq_size; - -#if defined(USB_AUDIO_DYN_CFG) && defined(KEEP_SAME_LATENCY) - playback_max_size = cfg->play_size; - capture_max_size = cfg->cap_size; - usb_recv_max_size = cfg->recv_size; - usb_send_max_size = cfg->send_size; -#else - playback_size = cfg->play_size; - capture_size = cfg->cap_size; - usb_recv_size = cfg->recv_size; - usb_send_size = cfg->send_size; -#endif - - playback_pos = 0; - usb_recv_rpos = 0; - usb_recv_wpos = cfg->recv_size / 2; - capture_pos = 0; - usb_send_rpos = cfg->send_size / 2; - usb_send_wpos = 0; - -#ifdef USB_AUDIO_MULTIFUNC - usb_recv2_buf = cfg->recv2_buf; - usb_recv2_size = cfg->recv2_size; - usb_recv2_rpos = 0; - usb_recv2_wpos = cfg->recv2_size / 2; -#endif - - playback_info.id = 0; - playback_info.sync_thresh = DIFF_SYNC_THRESH_PLAYBACK; - playback_info.diff_avg_cnt = DIFF_AVG_CNT; -#ifdef TARGET_TO_MAX_DIFF - playback_info.diff_target_enabled = true; - playback_info.max_target_ratio = MAX_TARGET_RATIO; - playback_info.time_to_ms = NULL; -#endif - capture_info.id = 1; - capture_info.sync_thresh = DIFF_SYNC_THRESH_CAPTURE; - capture_info.diff_avg_cnt = DIFF_AVG_CNT; -#ifdef TARGET_TO_MAX_DIFF - capture_info.diff_target_enabled = true; - capture_info.max_target_ratio = MAX_TARGET_RATIO; - capture_info.time_to_ms = NULL; -#endif - - safe_queue_init(&cmd_queue, cmd_list, CMD_LIST_SIZE); - -#ifdef USB_AUDIO_PWRKEY_TEST - hal_cmu_simu_set_val(0); -#endif -} - -void usb_audio_app_term(void) { - playback_buf = NULL; - playback_size = 0; - capture_buf = NULL; - capture_size = 0; - usb_recv_buf = NULL; - usb_recv_size = 0; - usb_send_buf = NULL; - usb_send_size = 0; - - playback_pos = 0; - usb_recv_rpos = 0; - usb_recv_wpos = 0; - - capture_pos = 0; - usb_send_rpos = 0; - usb_send_wpos = 0; - -#ifdef USB_AUDIO_MULTIFUNC - usb_recv2_buf = NULL; - usb_recv2_size = 0; - usb_recv2_rpos = 0; - usb_recv2_wpos = 0; -#endif -} - -void usb_audio_app(bool on) { - static const struct USB_AUDIO_CFG_T usb_audio_cfg = { - .recv_sample_rate = SAMPLE_RATE_RECV, - .send_sample_rate = SAMPLE_RATE_SEND, - .itf_callback = usb_audio_itf_callback, - .mute_callback = usb_audio_mute_callback, - .set_volume = usb_audio_set_volume, - .get_volume = usb_audio_get_volume, - .state_callback = usb_audio_state_control, - .xfer_callback = usb_audio_xfer_callback, -#if defined(ANDROID_ACCESSORY_SPEC) || defined(CFG_MIC_KEY) - // Applications are responsible for clearing HID events - .hid_send_callback = hid_data_send_handler, -#else - // HID events will be cleared automatically once they are sent - .hid_send_callback = NULL, -#endif -#ifdef _VENDOR_MSG_SUPPT_ - .vendor_msg_callback = usb_vendor_callback, - .vendor_rx_buf = vendor_msg_rx_buf, - .vendor_rx_size = VENDOR_RX_BUF_SZ, -#endif - }; - static bool isRun = false; - int ret; - - if (isRun == on) - return; - else - isRun = on; - - TRACE(2, "%s: on=%d", __FUNCTION__, on); - - if (on) { - usb_audio_acquire_freq(); - - usb_audio_reset_usb_stream_state(true); - usb_audio_reset_codec_stream_state(true); - -#ifdef USB_AUDIO_DYN_CFG - sample_rate_recv = new_sample_rate_recv = usb_audio_cfg.recv_sample_rate; - sample_rate_send = new_sample_rate_send = usb_audio_cfg.send_sample_rate; - // Init codec sample rates after initializing usb sample rates - sample_rate_play = calc_play_sample_rate(sample_rate_recv); - sample_rate_cap = calc_cap_sample_rate(sample_rate_send, sample_rate_play); - // TODO: Check whether 16-bit sample is enabled - sample_size_recv = new_sample_size_recv = 2; -#ifndef AUDIO_PLAYBACK_24BIT - sample_size_play = 2; -#endif - -#ifdef KEEP_SAME_LATENCY - usb_recv_size = calc_usb_recv_size(sample_rate_recv, sample_size_recv); - usb_send_size = calc_usb_send_size(sample_rate_send); - playback_size = calc_playback_size(sample_rate_play); - capture_size = calc_capture_size(sample_rate_cap); -#endif -#endif - - TRACE(3, "CODEC playback sample: rate=%u size=%u chan=%u", sample_rate_play, - sample_size_play, CHAN_NUM_PLAYBACK); - TRACE(3, "CODEC capture sample: rate=%u size=%u chan=%u", sample_rate_cap, - sample_size_cap, CHAN_NUM_CAPTURE); - TRACE(2, "USB recv sample: rate=%u size=%u", sample_rate_recv, - sample_size_recv); - TRACE(2, "USB send sample: rate=%u size=%u", sample_rate_send, - sample_size_send); - - usb_audio_init_streams(AUDIO_STREAM_REQ_USB); - - pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE); - ret = usb_audio_open(&usb_audio_cfg); - ASSERT(ret == 0, "usb_audio_open failed: %d", ret); - } else { - usb_audio_close(); - pmu_usb_config(PMU_USB_CONFIG_TYPE_NONE); - - usb_audio_term_streams(AUDIO_STREAM_REQ_USB); - - usb_audio_reset_usb_stream_state(true); - usb_audio_reset_codec_stream_state(true); - - usb_audio_release_freq(); - } -} - -static void app_key_trace(uint32_t line, enum HAL_KEY_CODE_T code, - enum HAL_KEY_EVENT_T event, - enum USB_AUDIO_HID_EVENT_T uevt, int state) { -#ifdef KEY_TRACE - TRACE(5, "APPKEY/%u: code=%d event=%d uevt=%s state=%d", line, code, event, - usb_audio_get_hid_event_name(uevt), state); -#endif -} - -int usb_audio_app_key(enum HAL_KEY_CODE_T code, enum HAL_KEY_EVENT_T event) { - int i; - enum USB_AUDIO_HID_EVENT_T uevt; - int state; - - if (event == HAL_KEY_EVENT_CLICK && - playback_state == AUDIO_ITF_STATE_STARTED) { -#ifdef PERF_TEST_POWER_KEY - if (code == PERF_TEST_POWER_KEY) { - enqueue_unique_cmd(TEST_CMD_PERF_TEST_POWER); - } -#endif -#ifdef PA_ON_OFF_KEY - if (code == PA_ON_OFF_KEY) { - enqueue_unique_cmd(TEST_CMD_PA_ON_OFF); - } -#endif - } - -#ifdef USB_AUDIO_PWRKEY_TEST - if (code == HAL_KEY_CODE_PWR) { - uevt = hal_cmu_simu_get_val(); - if (uevt == 0) { - uevt = USB_AUDIO_HID_VOL_UP; - } -#if defined(ANDROID_ACCESSORY_SPEC) || defined(CFG_MIC_KEY) - if (event == HAL_KEY_EVENT_DOWN || event == HAL_KEY_EVENT_UP) { - state = (event != HAL_KEY_EVENT_UP); - app_key_trace(__LINE__, code, event, uevt, state); - usb_audio_hid_set_event(uevt, state); - } - // The key event has been processed - return 0; -#else - if (event == HAL_KEY_EVENT_CLICK) { - state = 1; - app_key_trace(__LINE__, code, event, uevt, state); - usb_audio_hid_set_event(uevt, state); - return 0; - } - // Let other applications check the key event - return 1; -#endif - } -#endif - - if (code != HAL_KEY_CODE_NONE) { - for (i = 0; i < ARRAY_SIZE(key_map); i++) { - if (key_map[i].key_code == code && - (key_map[i].key_event_bitset & (1 << event))) { - break; - } - } - if (i < ARRAY_SIZE(key_map)) { - uevt = key_map[i].hid_event; - if (uevt != 0) { -#if defined(ANDROID_ACCESSORY_SPEC) || defined(CFG_MIC_KEY) - state = (event != HAL_KEY_EVENT_UP); -#else - state = 1; -#endif - app_key_trace(__LINE__, code, event, uevt, state); - usb_audio_hid_set_event(uevt, state); - // The key event has been processed - return 0; - } - } - } - - // Let other applications check the key event - return 1; -} - -#ifdef ANC_APP -extern bool anc_usb_app_get_status(); -static uint8_t anc_status = 0; -static uint8_t anc_status_record = 0xff; -#endif - -void usb_audio_eq_loop(void) { -#ifdef ANC_APP - anc_status = anc_usb_app_get_status(); - if (anc_status_record != anc_status && eq_opened == 1) { - anc_status_record = anc_status; - TRACE(2, "[%s]anc_status = %d", __func__, anc_status); -#ifdef __SW_IIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_SW_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_SW_IIR, anc_status)); -#endif - -#ifdef __HW_FIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_HW_FIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_FIR, anc_status)); -#endif - -#ifdef __HW_DAC_IIR_EQ_PROCESS__ - usb_audio_set_eq( - AUDIO_EQ_TYPE_HW_DAC_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_DAC_IIR, anc_status)); -#endif - -#ifdef __HW_IIR_EQ_PROCESS__ - usb_audio_set_eq(AUDIO_EQ_TYPE_HW_IIR, - usb_audio_get_eq_index(AUDIO_EQ_TYPE_HW_IIR, anc_status)); -#endif - } -#endif -} - -void usb_audio_app_loop(void) { - usb_audio_cmd_handler(NULL); - - usb_audio_eq_loop(); - -#ifndef RTOS - extern void af_thread(void const *argument); - af_thread(NULL); -#endif -} - -uint32_t usb_audio_get_capture_sample_rate(void) { return sample_rate_cap; } diff --git a/tests/anc_usb/usb_audio_app.h b/tests/anc_usb/usb_audio_app.h deleted file mode 100644 index 9673148..0000000 --- a/tests/anc_usb/usb_audio_app.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_AUDIO_APP_H__ -#define __USB_AUDIO_APP_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "plat_types.h" -#include "hal_key.h" -#include "audio_process.h" - -struct USB_AUDIO_BUF_CFG { - uint8_t *play_buf; - uint32_t play_size; - uint8_t *cap_buf; - uint32_t cap_size; - uint8_t *recv_buf; - uint32_t recv_size; - uint8_t *send_buf; - uint32_t send_size; - uint8_t *eq_buf; - uint32_t eq_size; - uint8_t *resample_buf; - uint32_t resample_size; -#ifdef USB_AUDIO_MULTIFUNC - uint8_t *recv2_buf; - uint32_t recv2_size; -#endif -}; - -typedef void (*USB_AUDIO_ENQUEUE_CMD_CALLBACK)(uint32_t data); - -void usb_audio_app(bool on); -void usb_audio_keep_streams_running(bool enable); -void usb_audio_app_init(const struct USB_AUDIO_BUF_CFG *cfg); - -void usb_audio_app_term(void); -int usb_audio_app_key(enum HAL_KEY_CODE_T code, enum HAL_KEY_EVENT_T event); -void usb_audio_app_loop(void); -uint32_t usb_audio_get_capture_sample_rate(void); - -uint32_t usb_audio_set_eq(AUDIO_EQ_TYPE_T audio_eq_type,uint8_t index); -uint8_t usb_audio_get_eq_index(AUDIO_EQ_TYPE_T audio_eq_type,uint8_t anc_status); - -void usb_audio_set_enqueue_cmd_callback(USB_AUDIO_ENQUEUE_CMD_CALLBACK cb); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/anc_usb/usb_audio_frm_defs.h b/tests/anc_usb/usb_audio_frm_defs.h deleted file mode 100644 index 8ebf602..0000000 --- a/tests/anc_usb/usb_audio_frm_defs.h +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - * - * Copyright 2015-2019 BES. - * All rights reserved. All unpublished rights reserved. - * - * No part of this work may be used or reproduced in any form or by any - * means, or stored in a database or retrieval system, without prior written - * permission of BES. - * - * Use of this work is governed by a license granted by BES. - * This work contains confidential and proprietary information of - * BES. which is protected by copyright, trade secret, - * trademark and other intellectual property rights. - * - ****************************************************************************/ -#ifndef __USB_AUDIO_FRM_DEFS_H__ -#define __USB_AUDIO_FRM_DEFS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -// Recv/send sample rates -#if 0 -#elif defined(USB_AUDIO_384K) -#define SAMPLE_RATE_RECV 384000 -#define SAMPLE_RATE_SEND 48000 -#elif defined(USB_AUDIO_352_8K) -#define SAMPLE_RATE_RECV 352800 -#define SAMPLE_RATE_SEND 44100 -#elif defined(USB_AUDIO_192K) -#define SAMPLE_RATE_RECV 192000 -#define SAMPLE_RATE_SEND 48000 -#elif defined(USB_AUDIO_176_4K) -#define SAMPLE_RATE_RECV 176400 -#define SAMPLE_RATE_SEND 44100 -#elif defined(USB_AUDIO_96K) -#define SAMPLE_RATE_RECV 96000 -#define SAMPLE_RATE_SEND 48000 -#elif defined(USB_AUDIO_48K) -#define SAMPLE_RATE_RECV 48000 -#define SAMPLE_RATE_SEND 48000 -#elif defined(USB_AUDIO_44_1K) -#define SAMPLE_RATE_RECV 44100 -#define SAMPLE_RATE_SEND 44100 -#elif defined(USB_AUDIO_16K) -#define SAMPLE_RATE_RECV 16000 -#define SAMPLE_RATE_SEND 16000 -#else // 48K by default -#define SAMPLE_RATE_RECV 48000 -#define SAMPLE_RATE_SEND 48000 -#endif - -// Playback sample rate -#if defined(CHIP_BEST1000) && defined(ANC_APP) -#if (SAMPLE_RATE_RECV % 8000) -#define SAMPLE_RATE_PLAYBACK 88200 -#else -#define SAMPLE_RATE_PLAYBACK 96000 -#endif -#elif defined(__AUDIO_RESAMPLE__) && defined(SW_PLAYBACK_RESAMPLE) -#define SAMPLE_RATE_PLAYBACK 50781 -#else -#define SAMPLE_RATE_PLAYBACK SAMPLE_RATE_RECV -#endif - -// Capture sample rate -#if defined(CHIP_BEST1000) && defined(ANC_APP) -#ifdef AUD_PLL_DOUBLE -#if defined(_DUAL_AUX_MIC_) || defined(CAPTURE_ANC_DATA) -#define SAMPLE_RATE_CAPTURE (SAMPLE_RATE_PLAYBACK * 8) -#else -#define SAMPLE_RATE_CAPTURE (SAMPLE_RATE_PLAYBACK * 2) -#endif -#else // !AUD_PLL_DOUBLE -#if defined(_DUAL_AUX_MIC_) || defined(CAPTURE_ANC_DATA) -#define SAMPLE_RATE_CAPTURE (SAMPLE_RATE_PLAYBACK * 4) -#else -#define SAMPLE_RATE_CAPTURE SAMPLE_RATE_PLAYBACK -#endif -#endif // !AUD_PLL_DOUBLE -#else // !(CHIP_BEST1000 && ANC_APP) -#if defined(CHIP_BEST1000) && defined(_DUAL_AUX_MIC_) -#define SAMPLE_RATE_CAPTURE (SAMPLE_RATE_SEND * 4) -#elif defined(__AUDIO_RESAMPLE__) && defined(SW_CAPTURE_RESAMPLE) -#define SAMPLE_RATE_CAPTURE 50781 -#else -#define SAMPLE_RATE_CAPTURE SAMPLE_RATE_SEND -#endif -#endif // !(CHIP_BEST1000 && ANC_APP) - -#ifdef USB_AUDIO_32BIT -#define SAMPLE_SIZE_PLAYBACK 4 -#define SAMPLE_SIZE_RECV 4 -#elif defined(USB_AUDIO_24BIT) -#define SAMPLE_SIZE_PLAYBACK 4 -#define SAMPLE_SIZE_RECV 3 -#else -#ifdef AUDIO_PLAYBACK_24BIT -#define SAMPLE_SIZE_PLAYBACK 4 -#else -#define SAMPLE_SIZE_PLAYBACK 2 -#endif -#define SAMPLE_SIZE_RECV 2 -#endif - -#ifdef USB_AUDIO_SEND_32BIT -#define SAMPLE_SIZE_CAPTURE 4 -#define SAMPLE_SIZE_SEND 4 -#elif defined(USB_AUDIO_SEND_24BIT) -#define SAMPLE_SIZE_CAPTURE 4 -#define SAMPLE_SIZE_SEND 3 -#else -#define SAMPLE_SIZE_CAPTURE 2 -#define SAMPLE_SIZE_SEND 2 -#endif - -#define CHAN_NUM_PLAYBACK 2 -#define CHAN_NUM_RECV 2 -#ifdef USB_AUDIO_SEND_CHAN -#define CHAN_NUM_SEND USB_AUDIO_SEND_CHAN -#else -#define CHAN_NUM_SEND 2 -#endif -#if defined(CHIP_BEST1000) && defined(ANC_APP) -#define CHAN_NUM_CAPTURE 2 -#elif defined(USB_AUDIO_SPEECH) -#define CHAN_NUM_CAPTURE SPEECH_CODEC_CAPTURE_CHANNEL_NUM -#else -#define CHAN_NUM_CAPTURE CHAN_NUM_SEND -#endif - -#define BYTE_TO_SAMP_PLAYBACK(n) ((n) / SAMPLE_SIZE_PLAYBACK / CHAN_NUM_PLAYBACK) -#define SAMP_TO_BYTE_PLAYBACK(n) ((n) * SAMPLE_SIZE_PLAYBACK * CHAN_NUM_PLAYBACK) - -#define BYTE_TO_SAMP_CAPTURE(n) ((n) / SAMPLE_SIZE_CAPTURE / CHAN_NUM_CAPTURE) -#define SAMP_TO_BYTE_CAPTURE(n) ((n) * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) - -#define BYTE_TO_SAMP_RECV(n) ((n) / SAMPLE_SIZE_RECV / CHAN_NUM_RECV) -#define SAMP_TO_BYTE_RECV(n) ((n) * SAMPLE_SIZE_RECV * CHAN_NUM_RECV) - -#define BYTE_TO_SAMP_SEND(n) ((n) / SAMPLE_SIZE_SEND / CHAN_NUM_SEND) -#define SAMP_TO_BYTE_SEND(n) ((n) * SAMPLE_SIZE_SEND * CHAN_NUM_SEND) - -#define SAMP_RATE_TO_FRAME_SIZE(n) (((n) + (1000 - 1)) / 1000) - -#define SAMPLE_FRAME_PLAYBACK SAMP_RATE_TO_FRAME_SIZE(SAMPLE_RATE_PLAYBACK) -#define SAMPLE_FRAME_CAPTURE SAMP_RATE_TO_FRAME_SIZE(SAMPLE_RATE_CAPTURE) - -#define SAMPLE_FRAME_RECV SAMP_RATE_TO_FRAME_SIZE(SAMPLE_RATE_RECV) -#define SAMPLE_FRAME_SEND SAMP_RATE_TO_FRAME_SIZE(SAMPLE_RATE_SEND) - -#define FRAME_SIZE_PLAYBACK SAMP_TO_BYTE_PLAYBACK(SAMPLE_FRAME_PLAYBACK) -#define FRAME_SIZE_CAPTURE SAMP_TO_BYTE_CAPTURE(SAMPLE_FRAME_CAPTURE) - -#define FRAME_SIZE_RECV SAMP_TO_BYTE_RECV(SAMPLE_FRAME_RECV) -#define FRAME_SIZE_SEND SAMP_TO_BYTE_SEND(SAMPLE_FRAME_SEND) - -#define PLAYBACK_TO_RECV_LEN(n) (SAMP_TO_BYTE_RECV((BYTE_TO_SAMP_PLAYBACK(n) * \ - (SAMPLE_RATE_RECV / 100) + (SAMPLE_RATE_PLAYBACK / 100) - 1) / (SAMPLE_RATE_PLAYBACK / 100))) -#define CAPTURE_TO_SEND_LEN(n) (SAMP_TO_BYTE_SEND((BYTE_TO_SAMP_CAPTURE(n) * \ - (SAMPLE_RATE_SEND / 100) + (SAMPLE_RATE_CAPTURE / 100) - 1) / (SAMPLE_RATE_CAPTURE / 100))) - -#ifdef USB_HIGH_SPEED -#if defined(USB_AUDIO_384K) || defined(USB_AUDIO_352_8K) -#define MAX_FRAME_SIZE_PLAYBACK (SAMP_RATE_TO_FRAME_SIZE(384000) * 4 * CHAN_NUM_PLAYBACK) -#else -#define MAX_FRAME_SIZE_PLAYBACK (SAMP_RATE_TO_FRAME_SIZE(192000) * 4 * CHAN_NUM_PLAYBACK) -#endif -#else -// Same as (SAMP_RATE_TO_FRAME_SIZE(192000) * 2 * CHAN_NUM_PLAYBACK) -#define MAX_FRAME_SIZE_PLAYBACK (SAMP_RATE_TO_FRAME_SIZE(96000) * 4 * CHAN_NUM_PLAYBACK) -#endif -#if (defined(__AUDIO_RESAMPLE__) && defined(SW_CAPTURE_RESAMPLE)) || \ - (defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) -// Fixed capture sample rate -#define MAX_FRAME_SIZE_CAPTURE (SAMP_RATE_TO_FRAME_SIZE(SAMPLE_RATE_CAPTURE) * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) -#else -#define MAX_FRAME_SIZE_CAPTURE (SAMP_RATE_TO_FRAME_SIZE(48000) * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) -#endif - -#ifdef USB_HIGH_SPEED -#if defined(USB_AUDIO_384K) || defined(USB_AUDIO_352_8K) -#define MAX_FRAME_SIZE_RECV (SAMP_RATE_TO_FRAME_SIZE(384000) * 4 * CHAN_NUM_RECV) -#else -#define MAX_FRAME_SIZE_RECV (SAMP_RATE_TO_FRAME_SIZE(192000) * 4 * CHAN_NUM_RECV) -#endif -#else -// Same as (SAMP_RATE_TO_FRAME_SIZE(192000) * 2 * CHAN_NUM_RECV) -#define MAX_FRAME_SIZE_RECV (SAMP_RATE_TO_FRAME_SIZE(96000) * 4 * CHAN_NUM_RECV) -#endif -#define MAX_FRAME_SIZE_SEND (SAMP_RATE_TO_FRAME_SIZE(48000) * SAMPLE_SIZE_SEND * CHAN_NUM_SEND) - -// ---------------- -// Buffer alignment -// ---------------- - -#define AF_DMA_LIST_CNT 4 - -#ifdef ADC_CH_SEP_BUFF -#define ADC_BURST_NUM 4 -#define ADC_ALL_CH_DMA_BURST_SIZE (ADC_BURST_NUM * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE) -#define ADC_BUFF_ALIGN (ADC_ALL_CH_DMA_BURST_SIZE * AF_DMA_LIST_CNT) -#else -#define ADC_BUFF_ALIGN (4 * AF_DMA_LIST_CNT) -#endif -#if defined(__HW_FIR_DSD_PROCESS__) -// FIR DSD requires DAC buffer is aligned to 16-sample boundary for each FIR DMA process loop -#define DAC_BUFF_ALIGN (16 * SAMPLE_SIZE_PLAYBACK * CHAN_NUM_PLAYBACK * 2) -#else -#define DAC_BUFF_ALIGN (4 * AF_DMA_LIST_CNT) -#endif - -// USB buffer is split into 2 parts, and transfers from the second half (similar to PING-PONG buffer) -#ifdef USB_AUDIO_DYN_CFG -// RECV type-I frame slot (sample_size*chan_num): 2*2=4, 3*2=6, 4*2=8. The least common multiple is 24 -#define RECV_BUFF_ALIGN (2 * 24) -// SEND type-I frame slot (sample_size*chan_num): 2*2=4. The least common multiple is 4 -#define SEND_BUFF_ALIGN (2 * 4) -#else -// If usb rx/tx pool is NOT used, the buffer size should be aligned to frame packet size -#define RECV_BUFF_ALIGN SAMP_TO_BYTE_RECV(2) -#define SEND_BUFF_ALIGN SAMP_TO_BYTE_SEND(2) -#endif - -#define NON_EXP_ALIGN(val, exp) (((val) + ((exp) - 1)) / (exp) * (exp)) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/tests/anc_usb/usb_vendor_msg.c b/tests/anc_usb/usb_vendor_msg.c deleted file mode 100644 index aed266e..0000000 --- a/tests/anc_usb/usb_vendor_msg.c +++ /dev/null @@ -1,261 +0,0 @@ -#ifdef _VENDOR_MSG_SUPPT_ - -#include "cmsis.h" -#include "crc32.h" -#include "hal_bootmode.h" -#include "hal_cmu.h" -#include "hal_norflash.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "pmu.h" -#include "stdlib.h" -#include "tgt_hardware.h" -#include -#include -#ifdef USB_EQ_TUNING -#include "hal_cmd.h" -#endif - -#ifdef USB_ANC_MC_EQ_TUNING -#include "anc_process.h" -#endif - -#include "usb_vendor_msg.h" - -#define SYS_CHECK_VAL "1.1" - -#define FACT_SEC_VER 2 -#define FACT_SEC_MAGIC 0xba80 - -typedef enum { - FACT_SEC_VER_MAGIC, - FACT_SEC_CRC, - - FACT_SEC_DATA_START, - FACT_SEC_SEQ = FACT_SEC_DATA_START, - FACT_SEC_PROD_SN, - FACT_SEC_END = FACT_SEC_PROD_SN + 8, - - FACT_SEC_NUM = 256 -} FACT_SEC_E; - -typedef enum { - PC_TOOL_CMD_IDLE, - PC_TOOL_CMD_GET_FW_VER, - PC_TOOL_CMD_GET_PROD_SN, - // QUERY_VOLTAGE, - // BURN_SN, - PC_TOOL_CMD_SYS_REBOOT, - PC_TOOL_CMD_SYS_SHUTDOWN, - PC_TOOL_CMD_PING, - PC_TOOL_CMD_CHECK, - PC_TOOL_CMD_FW_UPDATE, -#ifdef USB_EQ_TUNING - PC_TOOL_CMD_EQ_TUNING, -#endif -#ifdef USB_ANC_MC_EQ_TUNING - PC_TOOL_CMD_ANC_MC_EQ_TUNING, -#endif - PC_TOOL_CMD_NUM, -} PC_TOOL_CMD_E; - -static char *s_pc_cmd_lst[PC_TOOL_CMD_NUM] = { - " ", - "QUERY_SW_VER", - "QUERY_SN", - // "QUERY_VOL", - // "BURN_SN", - "SYS_REBOOT", - "SYS_SHUTDOWN", - "PING_THROUGH_VENDOR", - "CHECK", - "FW_UPDATE", -#ifdef USB_EQ_TUNING - "EQ<", -#endif -#ifdef USB_ANC_MC_EQ_TUNING - "ANC_MC_EQ", -#endif -}; - -static PC_TOOL_CMD_E s_cur_cmd = PC_TOOL_CMD_IDLE; - -static uint8_t *s_sn_ptr; -static uint8_t *s_fw_ver_ptr; - -static uint8_t s_sn_sz; -static uint8_t s_fw_ver_sz; - -uint8_t vendor_msg_rx_buf[VENDOR_RX_BUF_SZ]; - -extern void analog_aud_codec_mute(void); - -int WEAK vendor_get_sn_info(uint8_t **p_ptr, uint8_t *p_size) { - static const char sn[] = "SN-001"; - - *p_ptr = (uint8_t *)sn; - *p_size = sizeof(sn) - 1; - return 0; -} - -int WEAK vendor_get_fw_ver_info(uint8_t **p_ptr, uint8_t *p_size) { - static const char ver[] = "VER-001"; - - *p_ptr = (uint8_t *)ver; - *p_size = sizeof(ver) - 1; - return 0; -} - -void vendor_info_init(void) { - vendor_get_sn_info(&s_sn_ptr, &s_sn_sz); - vendor_get_fw_ver_info(&s_fw_ver_ptr, &s_fw_ver_sz); -} - -static void pc_usb_cmd_set(struct USB_AUDIO_VENDOR_MSG_T *msg) { - size_t ret; - uint8_t cmd_id = 0; - - if (0 == msg->length) - return; - - for (cmd_id = 1; cmd_id < PC_TOOL_CMD_NUM; cmd_id++) { - ret = memcmp((void *)msg->data, (void *)s_pc_cmd_lst[cmd_id], - strlen((char *)s_pc_cmd_lst[cmd_id])); - if (!ret) - break; - } - - if (cmd_id > (PC_TOOL_CMD_NUM - 1)) { - return; - } - - s_cur_cmd = cmd_id; - // TRACE(3,"%s: cmd[%s], id[%d]", __func__, s_pc_cmd_lst[cmd_id], s_cur_cmd); - msg->data += strlen((char *)s_pc_cmd_lst[cmd_id]); -#ifdef USB_ANC_MC_EQ_TUNING - msg->length -= strlen((char *)s_pc_cmd_lst[cmd_id]); -#endif - - switch (s_cur_cmd) { -#ifdef USB_EQ_TUNING - case PC_TOOL_CMD_EQ_TUNING: - hal_cmd_list_process(msg->data); - break; -#endif - -#ifdef USB_ANC_MC_EQ_TUNING - case PC_TOOL_CMD_ANC_MC_EQ_TUNING: - // TRACE(1,"recev len:%d",msg->length); - /* - TRACE(0,"***********recev test*************"); - for(int i=0;ilength;i++) - { - TRACE(2,"msg->data[%d]:0x%x",i,msg->data[i]); - } - TRACE(0,"***********recev test*************"); - */ - anc_cmd_receve_process(msg->data, msg->length); - break; -#endif - default: - break; - } -} - -static void pc_usb_cmd_exec(struct USB_AUDIO_VENDOR_MSG_T *msg) { - // TRACE(2,"%s: cmd[%d]", __func__, s_cur_cmd); - static const char *s_str_ret1 = "1"; -#ifdef USB_EQ_TUNING - static const char *s_str_ret0 = "0"; -#endif - static const char *s_str_failure = "failure"; - - switch (s_cur_cmd) { - case PC_TOOL_CMD_GET_FW_VER: - msg->data = s_fw_ver_ptr; - msg->length = strlen((char *)s_fw_ver_ptr); - break; - - case PC_TOOL_CMD_GET_PROD_SN: - msg->data = s_sn_ptr; - msg->length = strlen((char *)s_sn_ptr); - break; - - case PC_TOOL_CMD_SYS_REBOOT: - // TRACE(0,"-> cmd_exec: reboot....."); - hal_sys_timer_delay(MS_TO_TICKS(500)); - hal_cmu_sys_reboot(); - break; - - case PC_TOOL_CMD_SYS_SHUTDOWN: - pmu_shutdown(); - break; - - case PC_TOOL_CMD_PING: - msg->data = (uint8_t *)s_pc_cmd_lst[PC_TOOL_CMD_PING]; - msg->length = (uint32_t)strlen((const char *)msg->data); - break; - - case PC_TOOL_CMD_CHECK: - msg->data = (uint8_t *)SYS_CHECK_VAL; - msg->length = strlen((char *)SYS_CHECK_VAL); - break; - - case PC_TOOL_CMD_FW_UPDATE: - hal_sw_bootmode_clear(1 << 8); // to clear HAL_SW_BOOTMODE_FORCE_UART_DLD - hal_sw_bootmode_set(1 << 7); // to set HAL_SW_BOOTMODE_FORCE_USB_DLD -#ifdef TGT_PLL_FREQ - extern void pll_config_update(uint32_t); - pll_config_update(960000000); -#endif - analog_aud_codec_mute(); - msg->data = (uint8_t *)s_str_ret1; - msg->length = (uint32_t)strlen(s_str_ret1); - break; - -#ifdef USB_EQ_TUNING - case PC_TOOL_CMD_EQ_TUNING: - hal_cmd_tx_process(&msg->data, &msg->length); - if (!msg->length) { - msg->data = (uint8_t *)s_str_ret0; - msg->length = (uint32_t)strlen(s_str_ret0); - } - break; -#endif - -#ifdef USB_ANC_MC_EQ_TUNING - case PC_TOOL_CMD_ANC_MC_EQ_TUNING: - anc_cmd_send_process(&msg->data, &msg->length); - TRACE(1, "sned len:%d", msg->length); - - /* TRACE(0,"***********send test*************"); - for(int i=0;ilength;i++) - { - TRACE(2,"msg->data[%d]:0x%x",i,msg->data[i]); - } - TRACE(0,"***********send test*************"); - */ - break; -#endif - - default: - msg->data = (uint8_t *)s_str_failure; - msg->length = (uint32_t)strlen(s_str_failure); - break; - } - - s_cur_cmd = PC_TOOL_CMD_IDLE; -} - -int usb_vendor_callback(struct USB_AUDIO_VENDOR_MSG_T *msg) { - - if (0 == msg->length) { - pc_usb_cmd_exec(msg); - } else { - pc_usb_cmd_set(msg); - } - - return 0; -} - -#endif diff --git a/tests/anc_usb/usb_vendor_msg.h b/tests/anc_usb/usb_vendor_msg.h deleted file mode 100644 index 6d5b009..0000000 --- a/tests/anc_usb/usb_vendor_msg.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _USB_VENDOR_MSG_H_ -#define _USB_VENDOR_MSG_H_ - -#include "usb_audio.h" - -#ifdef USB_ANC_MC_EQ_TUNING -#define VENDOR_RX_BUF_SZ 5000 -#else -#define VENDOR_RX_BUF_SZ 240 -#endif -extern uint8_t vendor_msg_rx_buf[VENDOR_RX_BUF_SZ]; - -int usb_vendor_callback (struct USB_AUDIO_VENDOR_MSG_T *msg); - -void vendor_info_init (void); - -#endif // _USB_VENDOR_MSG_H_