mcu_ab568x/userboot240328/app/projects/AB5681G_320/functions/func_usbdev.c
2025-05-30 18:03:10 +08:00

325 lines
9.0 KiB
C

#include "include.h"
#include "func.h"
#include "func_usbdev.h"
#if FUNC_USBDEV_EN
f_ude_t f_ude;
u8 usbmic_volume_en = 0;
u8 usbmic_compli_xp_sys = 0;
void uda_set_by_pass(u8 bypass);
/*
AT(.usbdev.com.table)
//usb device descriptor
const u8 desc_usb_device[18] = {
18, // Num bytes of the descriptor
1, // Device Descriptor type
0x10, // Revision of USB Spec. LSB (in BCD)
0x01, // Revision of USB Spec. MSB (in BCD)
0, // Mass Storage Class
0, // General Mass Storage Sub Class
0, // Do not use Class specific protocol
USB_CTRL_SIZE, // Max packet size of Endpoint 0
//jl:e3b4
0x87, // Vendor ID LSB
0x80, // Vendor ID MSB
0x24, // Product ID LSB
0x10, // Product ID MSB
0x00, // Device Revision LSB (in BCD)
0x01, // Device Revision MSB (in BCD)
STR_MANUFACTURER, // Index of Manufacture string descriptor
STR_PRODUCT, // Index of Product string descriptor
STR_SERIAL_NUM, // Index of Serial No. string descriptor
1 // Num Configurations, Must be 1
};
//修改usb_dev在电脑上的名称
AT(.usbdev.com.table)
const u8 str_product[28] = {
28, // Num bytes of this descriptor //str_product总长度28,名字长度有变时,需要同时改变这个值
3, // String descriptor //此值保持不变
'T', 0, //以下是可以随便修改的名字 //unicode,2byte一个字符 //这里名字示例为26byte
'E', 0,
'S', 0,
'T', 0,
'.', 0,
'0', 0,
' ', 0,
'D', 0,
'e', 0,
'v', 0,
'i', 0,
'c', 0,
'e', 0
};
*/
/// desc_config_hid1 是自定义HID接口描述符 HID描述符 端点描述符示例
//AT(.usbdev.com.table)
//const u8 desc_config_hid1[32] = {
// //Interface Descriptor:
// 9, // Num bytes of this descriptor
// 4, // Interface descriptor type 请勿修改
// 4, // Interface Number 请勿修改
// 0, // Alternate interface number 请勿修改
// 2, // Num endpoints of this interface 请勿修改
// 0x03, // Interface Sub Class: Human Interface Device
// 0, // Interface Sub Class:
// 0, // Class specific protocol:
// 0, // Index of Interface string descriptor
//
// //HID Descriptor:
// 9, // Num bytes of this descriptor
// 0x21, // HID Type
// 0x01, 0x02, // HID Class Specification compliance
// 0x00, // Country Code: none
// 0x01, // Number of descriptors to follow
// 0x22, // Report descriptor type
//#if UDE_HID_TYPY_C
// 69, 0, // Len of Report descriptor ,sizeof(desc_hid_report)
//#else
// 33, 0, // Len of Report descriptor ,sizeof(desc_hid_report)
//#endif // UDE_HID_TYPY_C
// //EndpointDescriptor:
// 7, // Num bytes of this descriptor
// 5, // Endpoint descriptor type
// 3 | 0x80, // Endpoint number: HID IN
// 0x03, // Interrupt Endpoint
// 16, 0x00, // Maximum packet size
// 0x01, // Poll every 10msec seconds
//
// //EndpointDescriptor:
// 7, // Num bytes of this descriptor
// 5, // Endpoint descriptor type
// 3, // Endpoint number: HID OUT
// 0x03, // Interrupt Endpoint
// 16, 0x00, // Maximum packet size
// 0x0A, // Poll every 10msec seconds
//};
/// desc_hid_report1是自定义 HID report示例
//AT(.usbdev.com.table)
//const u8 desc_hid_report1[33] = {
// 0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
// 0x09, 0x01, // USAGE (Consumer Control)
// 0xa1, 0x01, // COLLECTION (Application)
//
//
// 0x15, 0x00, // LOGICAL_MINIMUM (0)
// 0x25, 0x01, // LOGICAL_MAXIMUM (1)
//
// 0x09, 0xb3, // USAGE (fast forward)
// 0x09, 0xb5, // USAGE (Scan Next Track)
// 0x09, 0xb6, // USAGE (Scan Previous Track)
// 0x09, 0xb7, // USAGE (stop)
// 0x09, 0xcd, // USAGE (Play/Pause)
// 0x09, 0xe2, // USAGE (Mute)
// 0x09, 0xe9, // USAGE (Volume Up)
// 0x09, 0xea, // USAGE (Volume Down)
//
// 0x75, 0x08, // REPORT_SIZE (1)
// 0x95, 0x08, // REPORT_COUNT (8)
// 0x81, 0x42, // INPUT (Data,Var,Abs)
// 0xc0, // END_COLLECTION
//};
///hid get buf
AT(.text.func.usbdev)
void ude_hid_get_data(u8 *data,u8 len) {
// my_print_r(data,len);
}
AT(.text.func.usbdev)
void ude_mic_start(void)
{
audio_path_init(AUDIO_PATH_USBMIC);
audio_path_start(AUDIO_PATH_USBMIC);
dac_spr_set(SPR_48000);
}
AT(.text.func.usbdev)
void ude_mic_stop(void)
{
audio_path_exit(AUDIO_PATH_USBMIC);
}
AT(.usbdev.com)
u8 ude_get_sys_volume(void)
{
return sys_cb.vol;
}
AT(.usbdev.com)
u8 ude_get_sys_vol_level(void)
{
return 256 / VOL_MAX;
}
AT(.usbdev.com)
void ude_set_sys_volume(u8 vol)
{
if (sys_cb.vol != vol) {
sys_cb.vol = vol;
msg_enqueue(EVT_UDE_SET_VOL);
}
}
#if UDE_STORAGE_EN
AT(.text.func.usbdev)
void ude_sdcard_switch(u8 dev)
{
// printf("%s, %d, %d\n", __func__, f_ude.cur_dev, dev);
if (f_ude.cur_dev != dev) {
ude_sd_remove();
f_ude.cur_dev = dev;
fsdisk_callback_init(f_ude.cur_dev);
f_ude.dev_change = 1;
} else {
sd0_init();
}
}
AT(.text.func.usbdev)
void ude_sdcard_change_process(void)
{
static u8 cnt_s = 0;
if (f_ude.dev_change) {
cnt_s++;
if (cnt_s >= 5) {
f_ude.dev_change = 0;
sd0_init();
}
} else {
cnt_s = 0;
}
}
#endif // UDE_STORAGE_EN
AT(.text.func.usbdev)
void func_usbdev_mp3_res_play(u32 addr, u32 len)
{
if (len == 0) {
return;
}
uda_set_by_pass(1);
DACDIGCON0 &= ~BIT(6);
adpll_spr_set(DAC_OUT_SPR);
dac_fade_out();
dac_fade_wait();
bsp_change_volume(WARNING_VOLUME);
bsp_piano_warning_play(WARNING_TONE, TONE_MAX_VOL);
dac_fade_out();
dac_fade_wait();
bsp_change_volume(sys_cb.vol);
dac_fade_in();
adpll_spr_set(1);
dac_spr_set(0); //samplerate 48K
DACDIGCON0 |= BIT(6); //Src0 Sample Rate Synchronization Enable
uda_set_by_pass(0);
}
AT(.text.func.usbdev)
void func_usbdev_process(void)
{
func_process();
usb_device_process();
f_ude.rw_sta = sd0_get_rw_sta();
}
static void func_usbdev_enter(void)
{
f_ude.vol = sys_cb.vol; //restore system volume
if (!dev_is_online(DEV_USBPC)) {
func_cb.sta = FUNC_NULL;
return;
}
func_cb.mp3_res_play = func_usbdev_mp3_res_play;
f_ude.cur_dev = DEV_SDCARD;
f_ude.dev_change = 0;
//func_usbdev_enter_display();
led_idle();
#if UDE_SPEAKER_EN
adpll_spr_set(1);
dac_spr_set(0); //samplerate 48K
DACDIGCON0 |= BIT(6); //Src0 Sample Rate Synchronization Enable
sys_cb.vol = VOL_MAX;
bsp_change_volume(sys_cb.vol);
dac_fade_in();
aubuf0_gpdma_init(0);
#endif // UDE_SPEAKER_EN
#if UDE_STORAGE_EN
if (dev_is_online(DEV_SDCARD) || dev_is_online(DEV_SDCARD1)) {
if (dev_is_online(DEV_SDCARD)) {
f_ude.cur_dev = DEV_SDCARD;
} else if (dev_is_online(DEV_SDCARD1)) {
f_ude.cur_dev = DEV_SDCARD1;
}
fsdisk_callback_init(f_ude.cur_dev);
fs_mount();
}
#endif // UDE_STORAGE_EN
usb_device_enter(UDE_ENUM_TYPE);
}
static void func_usbdev_exit(void)
{
usb_device_exit();
// func_usbdev_exit_display();
#if UDE_SPEAKER_EN
DACDIGCON0 &= ~BIT(6);
adpll_spr_set(DAC_OUT_SPR);
sys_cb.vol = f_ude.vol; //recover system volume
bsp_change_volume(sys_cb.vol);
dac_fade_out();
#endif // UDE_SPEAKER_EN
#if UDE_STORAGE_EN
if (dev_is_online(DEV_SDCARD) || dev_is_online(DEV_SDCARD1)) {
sd0_stop(1);
}
#endif // UDE_STORAGE_EN
func_cb.last = FUNC_USBDEV;
func_cb.sta = FUNC_IDLE;
}
AT(.text.func.usbdev)
void func_usbdev(void)
{
printf("%s\n", __func__);
func_usbdev_enter();
while (func_cb.sta == FUNC_USBDEV) {
func_usbdev_process();
// func_usbdev_message(msg_dequeue());
}
func_usbdev_exit();
}
#else
AT(.text.func.usbdev)
void ude_mic_start(void){}
AT(.text.func.usbdev)
void ude_mic_stop(void){}
AT(.usbdev.com)
u8 ude_get_sys_volume(void){return 0;}
AT(.usbdev.com)
u8 ude_get_sys_vol_level(void){return 0;}
AT(.usbdev.com)
void ude_set_sys_volume(u8 vol){}
#endif // FUNC_USBDEV_EN