|
|
|
|
@@ -3,7 +3,8 @@
|
|
|
|
|
* @file audio_class.c
|
|
|
|
|
* @brief usb audio class type
|
|
|
|
|
**************************************************************************
|
|
|
|
|
* Copyright notice & Disclaimer
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2025, Artery Technology, All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* The software Board Support Package (BSP) that is made available to
|
|
|
|
|
* download from Artery official website is the copyrighted work of Artery.
|
|
|
|
|
@@ -580,32 +581,75 @@ static void audio_req_get_cur(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_core_type *pudev = (usbd_core_type *)udev;
|
|
|
|
|
usb_audio_hid_type *paudio_hid = (usb_audio_hid_type *)pudev->class_handler->pdata;
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
|
|
|
|
|
switch(setup->bmRequestType & AUDIO_REQ_CONTROL_MASK)
|
|
|
|
|
{
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_MUTE_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->g_audio_cur[0] = paudio_hid->spk_mute;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_MUTE_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->g_audio_cur[0] = paudio_hid->mic_mute;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case AUDIO_REQ_CONTROL_INTERFACE:
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_MUTE_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->g_audio_cur[0] = paudio_hid->spk_mute;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wValue) == AUDIO_VOLUME_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wIndex) == AUDIO_MIC_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_MUTE_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->g_audio_cur[0] = paudio_hid->mic_mute;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wValue) == AUDIO_VOLUME_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AUDIO_REQ_CONTROL_ENDPOINT:
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_SAMPLING_FREQ_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
if(setup->wIndex == USBD_AUHID_AUDIO_MIC_IN_EPT)
|
|
|
|
|
{
|
|
|
|
|
*((uint32_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_freq;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(setup->wIndex == USBD_AUHID_AUDIO_SPK_OUT_EPT)
|
|
|
|
|
{
|
|
|
|
|
*((uint32_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_freq;
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -619,6 +663,7 @@ static void audio_req_set_cur(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_core_type *pudev = (usbd_core_type *)udev;
|
|
|
|
|
usb_audio_hid_type *paudio_hid = (usb_audio_hid_type *)pudev->class_handler->pdata;
|
|
|
|
|
|
|
|
|
|
if(setup->wLength > 0)
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_recv(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
@@ -634,19 +679,35 @@ static void audio_req_set_cur(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->request_no = AUDIO_MUTE_CONTROL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else if(HBYTE(setup->wValue) == AUDIO_VOLUME_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->request_no = AUDIO_VOLUME_CONTROL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AUDIO_REQ_CONTROL_ENDPOINT:
|
|
|
|
|
paudio_hid->enpd = setup->wIndex;
|
|
|
|
|
paudio_hid->request_no = AUDIO_FREQ_SET_CONTROL;
|
|
|
|
|
if(HBYTE(setup->wValue) == AUDIO_SAMPLING_FREQ_CONTROL)
|
|
|
|
|
{
|
|
|
|
|
paudio_hid->enpd = setup->wIndex;
|
|
|
|
|
paudio_hid->request_no = AUDIO_FREQ_SET_CONTROL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -659,15 +720,31 @@ static void audio_req_get_min(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_core_type *pudev = (usbd_core_type *)udev;
|
|
|
|
|
usb_audio_hid_type *paudio_hid = (usb_audio_hid_type *)pudev->class_handler->pdata;
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
|
|
|
|
|
switch(setup->bmRequestType & AUDIO_REQ_CONTROL_MASK)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[0];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[0];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
case AUDIO_REQ_CONTROL_INTERFACE:
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[0];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wIndex) == AUDIO_MIC_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[0];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AUDIO_REQ_CONTROL_ENDPOINT:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -681,15 +758,31 @@ static void audio_req_get_max(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_core_type *pudev = (usbd_core_type *)udev;
|
|
|
|
|
usb_audio_hid_type *paudio_hid = (usb_audio_hid_type *)pudev->class_handler->pdata;
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
|
|
|
|
|
switch(setup->bmRequestType & AUDIO_REQ_CONTROL_MASK)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[1];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[1];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
case AUDIO_REQ_CONTROL_INTERFACE:
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[1];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wIndex) == AUDIO_MIC_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[1];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AUDIO_REQ_CONTROL_ENDPOINT:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -703,15 +796,31 @@ static void audio_req_get_res(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_core_type *pudev = (usbd_core_type *)udev;
|
|
|
|
|
usb_audio_hid_type *paudio_hid = (usb_audio_hid_type *)pudev->class_handler->pdata;
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
|
|
|
|
|
switch(setup->bmRequestType & AUDIO_REQ_CONTROL_MASK)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[2];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[2];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
case AUDIO_REQ_CONTROL_INTERFACE:
|
|
|
|
|
if(HBYTE(setup->wIndex) == AUDIO_SPK_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->spk_volume_limits[2];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else if(HBYTE(setup->wIndex) == AUDIO_MIC_FEATURE_UNIT_ID)
|
|
|
|
|
{
|
|
|
|
|
*((uint16_t *)paudio_hid->g_audio_cur) = paudio_hid->mic_volume_limits[2];
|
|
|
|
|
usbd_ctrl_send(pudev, paudio_hid->g_audio_cur, setup->wLength);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case AUDIO_REQ_CONTROL_ENDPOINT:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -770,7 +879,10 @@ static void audio_get_interface(void *udev, usb_setup_type *setup)
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_send(pudev, (uint8_t *)&paudio_hid->mic_alt_setting, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
usbd_ctrl_unsupport(pudev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|