131 uint8_t controlSelector,
138 uint8_t controlSelector,
145 uint8_t controlSelector,
152 uint8_t controlSelector,
159 uint8_t controlSelector,
179 USBH_AUDIO_InterfaceInit,
180 USBH_AUDIO_InterfaceDeInit,
181 USBH_AUDIO_ClassRequest,
183 USBH_AUDIO_SOFProcess,
206 uint8_t interface, index;
207 uint16_t ep_size_out = 0;
208 uint16_t ep_size_in = 0;
212 if(interface == 0xFF)
214 USBH_DbgLog (
"Cannot Find the interface for %s class.", phost->pActiveClass->Name);
227 out_status = USBH_AUDIO_FindAudioStreamingIN (phost);
229 in_status = USBH_AUDIO_FindAudioStreamingOUT(phost);
233 USBH_DbgLog (
"%s class configuration not supported.", phost->pActiveClass->Name);
242 if(ep_size_out < AUDIO_Handle->stream_out[index].EpSize)
256 if(ep_size_in < AUDIO_Handle->stream_in[index].EpSize)
269 if(USBH_AUDIO_FindHIDControl(phost) ==
USBH_OK)
275 USBH_AUDIO_ParseCSDescriptors (phost);
281 USBH_AUDIO_BuildHeadphonePath (phost);
289 phost->device.address,
300 USBH_AUDIO_BuildMicrophonePath (phost);
307 phost->device.address,
323 phost->device.address,
415 #if (USBH_USE_OS == 1) 441 #if (USBH_USE_OS == 1) 448 if(USBH_AUDIO_HandleCSRequest (phost) ==
USBH_OK)
469 #if (USBH_USE_OS == 1) 490 #if (USBH_USE_OS == 1) 499 #if (USBH_USE_OS == 1) 525 req_status = USBH_AC_GetCur(phost,
539 req_status = USBH_AC_GetMin(phost,
553 req_status = USBH_AC_GetMax(phost,
572 req_status = USBH_AC_GetRes(phost,
608 cs_status = USBH_AUDIO_CSRequest(phost,
626 #if (USBH_USE_OS == 1) 647 USBH_AUDIO_OutputStream (phost);
652 USBH_AUDIO_InputStream (phost);
675 uint8_t interface, alt_settings;
717 uint8_t interface, alt_settings;
767 if(interface != 0xFF)
799 int8_t itf_index = 0;
800 int8_t itf_number = 0;
813 while(ptr < phost->device.CfgDesc.wTotalLength)
821 itf_number = *((uint8_t *)pdesc + 2);
822 alt_setting = *((uint8_t *)pdesc + 3);
827 if(itf_number <= phost->device.CfgDesc.bNumInterfaces)
917 for(Index = 0; Index < AUDIO_Handle->class_desc.
FeatureUnitNum; Index ++)
974 uint8_t UnitID = 0, Type, Index;
976 uint8_t terminalIndex;
982 for(terminalIndex = 0; terminalIndex < AUDIO_Handle->class_desc.
InputTerminalNum; terminalIndex++)
994 value = USBH_AUDIO_FindLinkedUnit(phost, UnitID);
995 Index = value & 0xFF;
996 Type = (value >> 8) & 0xFF;
997 UnitID = (value >> 16) & 0xFF;
1032 uint8_t UnitID = 0, Type, Index;
1034 uint8_t terminalIndex;
1040 for(terminalIndex = 0; terminalIndex < AUDIO_Handle->class_desc.
InputTerminalNum; terminalIndex++)
1061 value = USBH_AUDIO_FindLinkedUnit(phost, UnitID);
1062 Index = value & 0xFF;
1063 Type = (value >> 8) & 0xFF;
1064 UnitID = (value >> 16) & 0xFF;
1108 uint8_t controlSelector,
1112 uint16_t wValue,wIndex,wLength;
1113 uint8_t UnitID,InterfaceNum;
1122 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1124 AUDIO_Handle->
mem[0] = 0x00;
1131 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1133 wValue = (controlSelector << 8) | channel;
1146 return(
USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->
mem) , wLength ));
1163 uint8_t controlSelector,
1167 uint16_t wValue = 0, wIndex = 0,wLength = 0;
1168 uint8_t UnitID = 0, InterfaceNum = 0;
1177 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1179 AUDIO_Handle->
mem[0] = 0x00;
1186 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1188 wValue = (controlSelector << 8) | channel;
1195 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1209 return(
USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->
mem) , wLength ));
1227 uint8_t controlSelector,
1231 uint16_t wValue = 0, wIndex = 0, wLength = 0;
1232 uint8_t UnitID = 0, InterfaceNum = 0;
1241 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1243 AUDIO_Handle->
mem[0] = 0x00;
1250 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1252 wValue = (controlSelector << 8) | channel;
1259 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1273 return(
USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->
mem) , wLength ));
1292 uint8_t controlSelector,
1296 uint16_t wValue = 0, wIndex = 0, wLength = 0;
1297 uint8_t UnitID = 0, InterfaceNum = 0;
1306 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1308 AUDIO_Handle->
mem[0] = 0x00;
1315 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1317 wValue = (controlSelector << 8) | channel;
1324 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1338 return(
USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->
mem) , wLength ));
1355 uint8_t controlSelector,
1359 uint16_t wValue = 0, wIndex = 0, wLength = 0;
1360 uint8_t UnitID = 0, InterfaceNum = 0;
1369 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1371 AUDIO_Handle->
mem[0] = 0x00;
1378 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1380 wValue = (controlSelector << 8) | channel;
1387 wIndex = ( UnitID << 8 ) | InterfaceNum ;
1401 return(
USBH_CtlReq(phost, (uint8_t *)(AUDIO_Handle->
mem) , wLength ));
1416 uint16_t wValue, wIndex, wLength;
1431 return(
USBH_CtlReq(phost, (uint8_t *)buff, wLength ));
1456 uint16_t attribute = 0;
1462 if((phost->
Timer & 1) == 0)
1466 (uint8_t *)(AUDIO_Handle->
mem),
1479 attribute =
LE16(&AUDIO_Handle->
mem[0]);
1480 if(USBH_AUDIO_SetControlAttribute (phost, attribute) ==
USBH_BUSY)
1491 (uint8_t *)(AUDIO_Handle->
mem),
1499 if( USBH_AUDIO_SetControlAttribute (phost, 1) ==
USBH_OK)
1507 if( USBH_AUDIO_SetControlAttribute (phost, 2) ==
USBH_OK)
1546 #if (USBH_USE_OS == 1) 1555 status = USBH_AUDIO_SetEndpointControls(phost, AUDIO_Handle->
headphone.
Ep, buff);
1564 status = USBH_AUDIO_SetEndpointControls(phost,AUDIO_Handle->
headphone.
Ep, buff);
1572 #if (USBH_USE_OS == 1) 1579 USBH_AUDIO_Transmit(phost);
1604 if((phost->
Timer & 1) == 0)
1619 #if (USBH_USE_OS == 1) 1634 USBH_AUDIO_Control (phost);
1670 uint16_t SampleRate,
1671 uint8_t NbrChannels,
1672 uint8_t BitPerSample)
1677 uint8_t change_freq =
FALSE;
1678 uint32_t freq_min, freq_max;
1679 uint8_t num_supported_freq;
1692 if(( SampleRate >= freq_min)&& (SampleRate <= freq_max))
1703 for(index = 0; index < num_supported_freq; index++)
1713 if(change_freq ==
TRUE)
1750 #if (USBH_USE_OS == 1) 1905 if(AUDIO_SetVolume (phost,
1971 AUDIO_Handle->
mem[0] = volume;
1973 status = USBH_AC_SetCur(phost,
USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, uint8_t *buff, uint8_t length, uint8_t hc_num)
USBH_InterruptReceiveData Receives the Device Response to the Interrupt IN token. ...
AUDIO_PlayStateTypeDef play_state
#define USB_SUBCLASS_AUDIOCONTROL
AUDIO_ControlStateTypeDef control_state
#define USB_SUBCLASS_AUDIOSTREAMING
USBH_DeviceTypeDef device
USBH_StatusTypeDef USBH_OpenPipe(USBH_HandleTypeDef *phost, uint8_t ch_num, uint8_t epnum, uint8_t dev_address, uint8_t speed, uint8_t ep_type, uint16_t mps)
USBH_Open_Pipe Open a pipe.
uint8_t USBH_AllocPipe(USBH_HandleTypeDef *phost, uint8_t ep_addr)
USBH_Alloc_Pipe Allocate a new Pipe.
AUDIO_ControlAttributeTypeDef attribute
#define HOST_USER_CLASS_ACTIVE
#define USB_REQ_RECIPIENT_ENDPOINT
AUDIO_OTDescTypeDef * OutputTerminalDesc[AUDIO_MAX_NUM_OUT_TERMINAL]
USBH_StatusTypeDef USBH_AUDIO_SetVolume(USBH_HandleTypeDef *phost, AUDIO_VolumeCtrlTypeDef volume_ctl)
USBH_AUDIO_SetVolume Set Volume.
uint8_t asociated_terminal
USBH_StatusTypeDef USBH_AUDIO_Stop(USBH_HandleTypeDef *phost)
USBH_AUDIO_Pause Stop the playback process.
USBH_StatusTypeDef USBH_FreePipe(USBH_HandleTypeDef *phost, uint8_t idx)
USBH_Free_Pipe Free the USB Pipe.
uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, uint8_t Class, uint8_t SubClass, uint8_t Protocol)
USBH_FindInterface Find the interface index for a specific class.
int32_t USBH_AUDIO_FindLinkedUnitIN(USBH_HandleTypeDef *phost, uint8_t UnitID)
void(* pUser)(struct _USBH_HandleTypeDef *pHandle, uint8_t id)
USBH_InterfaceDescTypeDef Itf_Desc[USBH_MAX_NUM_INTERFACES]
AUDIO_ClassSpecificDescTypedef class_desc
USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, uint8_t ep_num, uint8_t altSetting)
USBH_SetInterface The command sets the Interface value to the connected device.
AUDIO_SelectorDescTypeDef * SelectorUnitDesc[AUDIO_MAX_NUM_SELECTOR_UNIT]
USBH_CfgDescTypeDef CfgDesc
#define USB_REQ_RECIPIENT_INTERFACE
#define UAC_OUTPUT_TERMINAL
AUDIO_ITDescTypeDef * InputTerminalDesc[AUDIO_MAX_NUM_IN_TERMINAL]
int32_t USBH_AUDIO_FindLinkedUnitOUT(USBH_HandleTypeDef *phost, uint8_t UnitID)
This file contains all the prototypes for the usbh_audio.c.
uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, uint8_t interface_number, uint8_t alt_settings)
USBH_FindInterfaceIndex Find the interface index for a specific class interface and alternate setting...
USBH_ClassTypeDef AUDIO_Class
AUDIO_InterfaceStreamPropTypeDef microphone
#define USBH_MAX_NUM_INTERFACES
USBH_StatusTypeDef USBH_CtlReq(USBH_HandleTypeDef *phost, uint8_t *buff, uint16_t length)
USBH_CtlReq USBH_CtlReq sends a control request and provide the status after completion of the reques...
uint8_t asociated_feature
AUDIO_STREAMING_OUT_HandleTypeDef stream_out[AUDIO_MAX_AUDIO_STD_INTERFACE]
uint8_t asociated_channels
USBH_StatusTypeDef USBH_AUDIO_Resume(USBH_HandleTypeDef *phost)
USBH_AUDIO_Resume Resume the playback process.
AUDIO_InterfaceStreamPropTypeDef headphone
#define COPY_PROTECT_CONTROL
#define SAMPLING_FREQ_CONTROL
uint16_t InputTerminalNum
USBH_StatusTypeDef USBH_AUDIO_Play(USBH_HandleTypeDef *phost, uint8_t *buf, uint32_t length)
USBH_AUDIO_Play Start playback process.
#define USB_DESC_TYPE_INTERFACE
AUDIO_FeatureDescTypeDef * FeatureUnitDesc[AUDIO_MAX_NUM_FEATURE_UNIT]
USBH_EpDescTypeDef Ep_Desc[USBH_MAX_NUM_ENDPOINTS]
uint16_t OutputTerminalNum
#define AUDIO_MAX_AUDIO_STD_INTERFACE
AUDIO_InterfaceControlPropTypeDef control
uint8_t bInterfaceSubClass
#define UAC_SELECTOR_UNIT
AUDIO_MixerDescTypeDef * MixerUnitDesc[AUDIO_MAX_NUM_MIXER_UNIT]
uint8_t bAlternateSetting
#define UAC_INPUT_TERMINAL
USBH_DescHeader_t * USBH_GetNextDesc(uint8_t *pbuf, uint16_t *ptr)
USBH_GetNextDesc This function return the next descriptor header.
USBH_StatusTypeDef USBH_LL_SetToggle(USBH_HandleTypeDef *phost, uint8_t, uint8_t)
USBH_LL_SetToggle Set toggle for a pipe.
USBH_URBStateTypeDef USBH_LL_GetURBState(USBH_HandleTypeDef *phost, uint8_t)
USBH_LL_GetURBState Get a URB state from the low level driver.
AUDIO_CSReqStateTypeDef cs_req_state
AUDIO_ProcessingTypeDef processing_state
AUDIO_STREAMING_IN_HandleTypeDef stream_in[AUDIO_MAX_AUDIO_STD_INTERFACE]
AUDIO_HeaderDescTypeDef * HeaderDesc
__IO HOST_StateTypeDef gState
AUDIO_ACDescTypeDef cs_desc
#define USB_DESC_TYPE_CS_INTERFACE
__weak void USBH_AUDIO_FrequencySet(USBH_HandleTypeDef *phost)
The function informs user that Settings have been changed.
__weak void USBH_AUDIO_BufferEmptyCallback(USBH_HandleTypeDef *phost)
The function informs user that User data are processed.
USBH_StatusTypeDef USBH_AUDIO_Suspend(USBH_HandleTypeDef *phost)
USBH_AUDIO_Suspend Suspend the playback process.
AUDIO_ASGeneralDescTypeDef * GeneralDesc
osStatus osMessagePut(osMessageQId queue_id, uint32_t info, uint32_t millisec)
Put a Message to a Queue.
USBH_StatusTypeDef USBH_AUDIO_ChangeOutBuffer(USBH_HandleTypeDef *phost, uint8_t *buf)
USBH_AUDIO_ChangeOutBuffer Change audio data buffer address.
AUDIO_ReqStateTypeDef req_state
osStatus osDelay(uint32_t millisec)
Wait for Timeout (Time Delay)
AUDIO_ASDescTypeDef as_desc[AUDIO_MAX_STREAMING_INTERFACE]
USBH_ClassTypeDef * pActiveClass
int32_t USBH_AUDIO_GetOutOffset(USBH_HandleTypeDef *phost)
USBH_AUDIO_GetOutOffset return the current buffer pointer for OUT process.
struct _USB_Setup::_SetupPkt_Struc b
USBH_StatusTypeDef USBH_AUDIO_SetFrequency(USBH_HandleTypeDef *phost, uint16_t SampleRate, uint8_t NbrChannels, uint8_t BitPerSample)
USBH_AUDIO_SetFrequency Set Audio sampling parameters.
USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, uint8_t *buff, uint32_t length, uint8_t hc_num)
USBH_IsocSendData Sends the data on Isochronous OUT Endpoint.
uint8_t asociated_selector
AUDIO_ASFormatTypeDescTypeDef * FormatTypeDesc
USBH_StatusTypeDef USBH_ClosePipe(USBH_HandleTypeDef *phost, uint8_t pipe_num)
USBH_ClosePipe Close a pipe.