1 /**************************************************************************/
2 /* */
3 /* Copyright (c) Microsoft Corporation. All rights reserved. */
4 /* */
5 /* This software is licensed under the Microsoft Software License */
6 /* Terms for Microsoft Azure RTOS. Full text of the license can be */
7 /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
8 /* and in the root directory of this software. */
9 /* */
10 /**************************************************************************/
11
12
13 /**************************************************************************/
14 /**************************************************************************/
15 /** */
16 /** USBX Component */
17 /** */
18 /** Audio Class */
19 /** */
20 /**************************************************************************/
21 /**************************************************************************/
22
23
24 /* Include necessary system files. */
25
26 #define UX_SOURCE_CODE
27
28 #include "ux_api.h"
29 #include "ux_host_class_audio.h"
30 #include "ux_host_stack.h"
31
32
33 /**************************************************************************/
34 /* */
35 /* FUNCTION RELEASE */
36 /* */
37 /* _ux_host_class_audio_control_request PORTABLE C */
38 /* 6.1.12 */
39 /* AUTHOR */
40 /* */
41 /* Chaoqiong Xiao, Microsoft Corporation */
42 /* */
43 /* DESCRIPTION */
44 /* */
45 /* This function issue audio specific control request. */
46 /* */
47 /* INPUT */
48 /* */
49 /* audio Pointer to audio class */
50 /* streaming_control 0 for control requests */
51 /* 1 for streaming requests */
52 /* request_type bmRequestType */
53 /* request bRequest */
54 /* request_value wValue can be: */
55 /* (CS << 8) | CN or */
56 /* (ICN << 8) | OCN or */
57 /* (MU_MIXER_CONTROL << 8) | MCN */
58 /* or other specific value. */
59 /* spec_id Entity/Language ID (if used) */
60 /* parameter Pointer to request parameters */
61 /* parameter_size Request parameters length */
62 /* actual_size Actual processed size */
63 /* */
64 /* OUTPUT */
65 /* */
66 /* Completion Status */
67 /* */
68 /* CALLS */
69 /* */
70 /* _ux_host_stack_class_instance_verify Verify instance is valid */
71 /* _ux_host_stack_transfer_request Process transfer request */
72 /* _ux_host_semaphore_get Get semaphore */
73 /* _ux_host_mutex_on Get mutex */
74 /* _ux_host_mutex_off Release mutex */
75 /* */
76 /* CALLED BY */
77 /* */
78 /* Application */
79 /* Audio Class */
80 /* */
81 /* RELEASE HISTORY */
82 /* */
83 /* DATE NAME DESCRIPTION */
84 /* */
85 /* 07-29-2022 Chaoqiong Xiao Initial Version 6.1.12 */
86 /* */
87 /**************************************************************************/
_ux_host_class_audio_control_request(UX_HOST_CLASS_AUDIO * audio,UINT streaming_control,UINT request_type,UINT request,UINT request_value,UINT spec_id,UCHAR * parameter,ULONG parameter_size,ULONG * actual_size)88 UINT _ux_host_class_audio_control_request(UX_HOST_CLASS_AUDIO *audio,
89 UINT streaming_control,
90 UINT request_type, UINT request,
91 UINT request_value,
92 UINT spec_id,
93 UCHAR *parameter, ULONG parameter_size, ULONG *actual_size)
94 {
95
96 UX_ENDPOINT *control_endpoint;
97 UX_TRANSFER *transfer_request;
98 ULONG request_index = 0;
99 UINT status;
100
101
102 /* Ensure the instance is valid. */
103 if (_ux_host_stack_class_instance_verify(_ux_system_host_class_audio_name, (VOID *) audio) != UX_SUCCESS)
104 {
105
106 /* Error trap. */
107 _ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_HOST_CLASS_INSTANCE_UNKNOWN);
108
109 /* If trace is enabled, insert this event into the trace buffer. */
110 UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_HOST_CLASS_INSTANCE_UNKNOWN, audio, 0, 0, UX_TRACE_ERRORS, 0, 0)
111
112 return(UX_HOST_CLASS_INSTANCE_UNKNOWN);
113 }
114
115 /* Check request settings. */
116 switch(request_type & UX_REQUEST_TARGET)
117 {
118 case UX_REQUEST_TARGET_INTERFACE:
119 request_index = streaming_control ?
120 audio -> ux_host_class_audio_streaming_interface -> ux_interface_descriptor.bInterfaceNumber :
121 audio -> ux_host_class_audio_control_interface_number;
122 break;
123 case UX_REQUEST_TARGET_ENDPOINT:
124 request_index = audio -> ux_host_class_audio_isochronous_endpoint -> ux_endpoint_descriptor.bEndpointAddress;
125 break;
126 default:
127 return(UX_INVALID_PARAMETER);
128 }
129
130 /* Protect thread reentry to this instance. */
131 _ux_host_mutex_on(&audio -> ux_host_class_audio_mutex);
132
133 /* We need to get the default control endpoint transfer request pointer. */
134 control_endpoint = &audio -> ux_host_class_audio_device -> ux_device_control_endpoint;
135 transfer_request = &control_endpoint -> ux_endpoint_transfer_request;
136
137 /* Protect the control endpoint semaphore here. It will be unprotected in the
138 transfer request function. */
139 status = _ux_host_semaphore_get(&audio -> ux_host_class_audio_device -> ux_device_protection_semaphore, UX_WAIT_FOREVER);
140
141 /* Check for status. */
142 if (status != UX_SUCCESS)
143 {
144 /* Something went wrong. */
145 _ux_host_mutex_off(&audio -> ux_host_class_audio_mutex);
146 return(status);
147 }
148
149 /* Create a transfer request for the specific setting. */
150 transfer_request -> ux_transfer_request_data_pointer = parameter;
151 transfer_request -> ux_transfer_request_requested_length = parameter_size;
152 transfer_request -> ux_transfer_request_function = request;
153 transfer_request -> ux_transfer_request_type = request_type;
154 transfer_request -> ux_transfer_request_value = request_value;
155 transfer_request -> ux_transfer_request_index = request_index | (spec_id << 8);
156
157 /* Send request to HCD layer. */
158 status = _ux_host_stack_transfer_request(transfer_request);
159
160 /* Save actual size. */
161 if (actual_size)
162 *actual_size = transfer_request -> ux_transfer_request_actual_length;
163
164 /* Unprotect thread reentry to this instance. */
165 _ux_host_mutex_off(&audio -> ux_host_class_audio_mutex);
166
167 /* Return completion status. */
168 return(status);
169 }
170