1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** USBX Component */
16 /** */
17 /** Slave Simulator Controller Driver */
18 /** */
19 /**************************************************************************/
20 /**************************************************************************/
21
22 #define UX_SOURCE_CODE
23
24 /* Include necessary system files. */
25
26 #include "ux_api.h"
27 #include "ux_dcd_sim_slave.h"
28
29
30 /**************************************************************************/
31 /* */
32 /* FUNCTION RELEASE */
33 /* */
34 /* _ux_dcd_sim_slave_function PORTABLE C */
35 /* 6.1.10 */
36 /* AUTHOR */
37 /* */
38 /* Chaoqiong Xiao, Microsoft Corporation */
39 /* */
40 /* DESCRIPTION */
41 /* */
42 /* This function dispatches the DCD function internally to the */
43 /* slave simulator controller. */
44 /* */
45 /* INPUT */
46 /* */
47 /* dcd Pointer to device controller */
48 /* function Function requested */
49 /* parameter Pointer to parameter structure*/
50 /* */
51 /* */
52 /* OUTPUT */
53 /* */
54 /* Completion Status */
55 /* */
56 /* CALLS */
57 /* */
58 /* _ux_dcd_sim_slave_address_set Set address */
59 /* _ux_dcd_sim_slave_endpoint_create Create endpoint */
60 /* _ux_dcd_sim_slave_endpoint_destroy Destroy endpoint */
61 /* _ux_dcd_sim_slave_endpoint_reset Reset endpoint */
62 /* _ux_dcd_sim_slave_endpoint_stall Stall endpoint */
63 /* _ux_dcd_sim_slave_endpoint_status Get endpoint status */
64 /* _ux_dcd_sim_slave_frame_number_get Get frame number */
65 /* _ux_dcd_sim_slave_state_change Change state */
66 /* _ux_dcd_sim_slave_transfer_abort Abort transfer */
67 /* _ux_dcd_sim_slave_transfer_request Request transfer */
68 /* */
69 /* CALLED BY */
70 /* */
71 /* USBX Device Stack */
72 /* */
73 /* RELEASE HISTORY */
74 /* */
75 /* DATE NAME DESCRIPTION */
76 /* */
77 /* 05-19-2020 Chaoqiong Xiao Initial Version 6.0 */
78 /* 09-30-2020 Chaoqiong Xiao Modified comment(s), */
79 /* resulting in version 6.1 */
80 /* 01-31-2022 Chaoqiong Xiao Modified comment(s), */
81 /* added standalone support, */
82 /* resulting in version 6.1.10 */
83 /* */
84 /**************************************************************************/
_ux_dcd_sim_slave_function(UX_SLAVE_DCD * dcd,UINT function,VOID * parameter)85 UINT _ux_dcd_sim_slave_function(UX_SLAVE_DCD *dcd, UINT function, VOID *parameter)
86 {
87
88 UINT status;
89 UX_DCD_SIM_SLAVE *dcd_sim_slave;
90
91
92 /* Check the status of the controller. */
93 if (dcd -> ux_slave_dcd_status == UX_UNUSED)
94 {
95
96 /* Error trap. */
97 _ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_DCD, UX_CONTROLLER_UNKNOWN);
98
99 /* If trace is enabled, insert this event into the trace buffer. */
100 UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_CONTROLLER_UNKNOWN, 0, 0, 0, UX_TRACE_ERRORS, 0, 0)
101
102 return(UX_CONTROLLER_UNKNOWN);
103 }
104
105 /* Get the pointer to the Slave simulation DCD. */
106 dcd_sim_slave = (UX_DCD_SIM_SLAVE *) dcd -> ux_slave_dcd_controller_hardware;
107
108 /* Look at the function and route it. */
109 switch(function)
110 {
111
112 case UX_DCD_GET_FRAME_NUMBER:
113
114 status = _ux_dcd_sim_slave_frame_number_get(dcd_sim_slave, (ULONG *) parameter);
115 break;
116
117 #if defined(UX_DEVICE_STANDALONE)
118 case UX_DCD_TRANSFER_RUN:
119
120 status = _ux_dcd_sim_slave_transfer_run(dcd_sim_slave, (UX_SLAVE_TRANSFER *) parameter);
121 break;
122 #else
123 case UX_DCD_TRANSFER_REQUEST:
124
125 status = _ux_dcd_sim_slave_transfer_request(dcd_sim_slave, (UX_SLAVE_TRANSFER *) parameter);
126 break;
127 #endif
128
129 case UX_DCD_TRANSFER_ABORT:
130
131 status = _ux_dcd_sim_slave_transfer_abort(dcd_sim_slave, (UX_SLAVE_TRANSFER *) parameter);
132 break;
133
134 case UX_DCD_CREATE_ENDPOINT:
135
136 status = _ux_dcd_sim_slave_endpoint_create(dcd_sim_slave, parameter);
137 break;
138
139 case UX_DCD_DESTROY_ENDPOINT:
140
141 status = _ux_dcd_sim_slave_endpoint_destroy(dcd_sim_slave, parameter);
142 break;
143
144 case UX_DCD_RESET_ENDPOINT:
145
146 status = _ux_dcd_sim_slave_endpoint_reset(dcd_sim_slave, parameter);
147 break;
148
149 case UX_DCD_STALL_ENDPOINT:
150
151 status = _ux_dcd_sim_slave_endpoint_stall(dcd_sim_slave, parameter);
152 break;
153
154 case UX_DCD_SET_DEVICE_ADDRESS:
155
156 status = _ux_dcd_sim_slave_address_set(dcd_sim_slave, (ULONG) (ALIGN_TYPE) parameter);
157 break;
158
159 case UX_DCD_CHANGE_STATE:
160
161 status = _ux_dcd_sim_slave_state_change(dcd_sim_slave, (ULONG) (ALIGN_TYPE) parameter);
162 break;
163
164 case UX_DCD_ENDPOINT_STATUS:
165
166 status = _ux_dcd_sim_slave_endpoint_status(dcd_sim_slave, (ULONG) (ALIGN_TYPE) parameter);
167 break;
168
169 case UX_DCD_ISR_PENDING:
170
171 status = UX_SUCCESS;
172 break;
173
174 default:
175
176 /* Error trap. */
177 _ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_DCD, UX_FUNCTION_NOT_SUPPORTED);
178
179 /* If trace is enabled, insert this event into the trace buffer. */
180 UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_FUNCTION_NOT_SUPPORTED, 0, 0, 0, UX_TRACE_ERRORS, 0, 0)
181
182 status = UX_FUNCTION_NOT_SUPPORTED;
183 }
184
185 /* Return completion status. */
186 return(status);
187 }
188
189