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 /** CDC ECM Class */ 18 /** */ 19 /**************************************************************************/ 20 /**************************************************************************/ 21 22 23 /**************************************************************************/ 24 /* */ 25 /* COMPONENT DEFINITION RELEASE */ 26 /* */ 27 /* ux_host_class_cdc_ecm.h PORTABLE C */ 28 /* 6.3.0 */ 29 /* AUTHOR */ 30 /* */ 31 /* Chaoqiong Xiao, Microsoft Corporation */ 32 /* */ 33 /* DESCRIPTION */ 34 /* */ 35 /* This file contains all the header and extern functions used by the */ 36 /* USBX CDC_ECM class. */ 37 /* */ 38 /* RELEASE HISTORY */ 39 /* */ 40 /* DATE NAME DESCRIPTION */ 41 /* */ 42 /* 05-19-2020 Chaoqiong Xiao Initial Version 6.0 */ 43 /* 09-30-2020 Chaoqiong Xiao Modified comment(s), */ 44 /* used UX prefix to refer to */ 45 /* TX symbols instead of using */ 46 /* them directly, */ 47 /* resulting in version 6.1 */ 48 /* 02-02-2021 Xiuwen Cai Modified comment(s), added */ 49 /* compile option for using */ 50 /* packet pool from NetX, */ 51 /* resulting in version 6.1.4 */ 52 /* 08-02-2021 Chaoqiong Xiao Modified comment(s), */ 53 /* added extern "C" keyword */ 54 /* for compatibility with C++, */ 55 /* resulting in version 6.1.8 */ 56 /* 04-25-2022 Chaoqiong Xiao Modified comment(s), */ 57 /* fixed standalone compile, */ 58 /* resulting in version 6.1.11 */ 59 /* 10-31-2022 Chaoqiong Xiao Modified comment(s), */ 60 /* supported NX packet chain, */ 61 /* resulting in version 6.2.0 */ 62 /* 10-31-2023 Chaoqiong Xiao Modified comment(s), */ 63 /* optimized USB descriptors, */ 64 /* resulting in version 6.3.0 */ 65 /* */ 66 /**************************************************************************/ 67 68 #ifndef UX_HOST_CLASS_CDC_ECM_H 69 #define UX_HOST_CLASS_CDC_ECM_H 70 71 /* Determine if a C++ compiler is being used. If so, ensure that standard 72 C is used to process the API information. */ 73 74 #ifdef __cplusplus 75 76 /* Yes, C++ compiler is present. Use standard C. */ 77 extern "C" { 78 79 #endif 80 81 #if !defined(UX_HOST_STANDALONE) 82 #include "nx_api.h" 83 #include "ux_network_driver.h" 84 #else 85 86 /* Assume NX things for compiling. */ 87 #define NX_PACKET VOID* 88 #define NX_PACKET_POOL VOID* 89 #endif 90 91 92 /* Define CDC_ECM Class constants. Insert here the PID/VID of vendors and products using the CDC ECM chipset. 93 It is a better mechanism to put this value in the ux_user.h file. */ 94 #ifndef UX_HOST_CLASS_CDC_ECM_VENDOR_ID 95 #define UX_HOST_CLASS_CDC_ECM_VENDOR_ID 0x0770 96 #define UX_HOST_CLASS_CDC_ECM_PRODUCT_ID 0x1042 97 #endif 98 99 /* Define CDC_ECM Class/subclass/protocol constants. */ 100 #define UX_HOST_CLASS_CDC_CONTROL_CLASS 0x02 101 #define UX_HOST_CLASS_CDC_DATA_CLASS 0x0A 102 #define UX_HOST_CLASS_CDC_ECM_CONTROL_SUBCLASS 0x06 103 #define UX_HOST_CLASS_CDC_ECM_CONTROL_PROTOCOL 0x00 104 #define UX_HOST_CLASS_CDC_ECM_CS_INTERFACE 0x24 105 #define UX_HOST_CLASS_CDC_ECM_FUNCTIONAL_DESCRIPTOR 0x0F 106 #define UX_HOST_CLASS_CDC_ECM_MAC_ADDRESS_STRING_LENGTH 32 107 #define UX_HOST_CLASS_CDC_ECM_MAC_ADDRESS_ASCII_LENGTH 8 108 109 #define UX_HOST_CLASS_CDC_ECM_SPEED_SELECTED_100MPBS 0x100 110 #define UX_HOST_CLASS_CDC_ECM_SPEED_SELECTED_10MPBS 0x10 111 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_DOWN 0 112 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_UP 1 113 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_PENDING_UP 2 114 #define UX_HOST_CLASS_CDC_ECM_LINK_STATE_PENDING_DOWN 3 115 #define UX_HOST_CLASS_CDC_ECM_BASE_IP_ADDRESS 0xC0A80001 116 #define UX_HOST_CLASS_CDC_ECM_BASE_IP_MASK 0xFFFFFF00 117 #define UX_HOST_CLASS_CDC_ECM_MAX_MTU 1518 118 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_IP 0x0800 119 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_ARP 0x0806 120 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_RARP 0x8035 121 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE 1536 122 #define UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING 2 123 #ifndef UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES 124 #define UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES 16 125 #endif 126 127 #define UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE sizeof(NX_PACKET) 128 129 #define UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG(UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE, UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING), UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_calc_ovf) 130 #define UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE (UX_HOST_CLASS_CDC_ECM_ETHERNET_PACKET_SIZE + UX_HOST_CLASS_CDC_ECM_NX_ALIGN_PADDING) 131 132 #define UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT \ 133 UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE_ASSERT \ 134 UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG( \ 135 UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE, \ 136 UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE), \ 137 UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_calc_ovf) 138 #define UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE (UX_HOST_CLASS_CDC_ECM_NX_PAYLOAD_SIZE + UX_HOST_CLASS_CDC_ECM_NX_PACKET_SIZE) 139 140 #define UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_ASSERT \ 141 UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE_ASSERT \ 142 UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_MULC_ULONG( \ 143 UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES, \ 144 UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE), \ 145 UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc1_ovf) \ 146 UX_COMPILE_TIME_ASSERT(!UX_OVERFLOW_CHECK_ADD_ULONG( \ 147 UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES * \ 148 UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE, \ 149 32), UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE_calc2_ovf) 150 #define UX_HOST_CLASS_CDC_ECM_NX_ETHERNET_POOL_ALLOCSIZE (UX_HOST_CLASS_CDC_ECM_NX_PKPOOL_ENTRIES * UX_HOST_CLASS_CDC_ECM_NX_BUFF_SIZE + 32) 151 152 #ifdef NX_DISABLE_PACKET_CHAIN 153 #undef UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT 154 #else 155 #define UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT 156 #endif 157 158 #define UX_HOST_CLASS_CDC_ECM_ETHERNET_SIZE 14 159 160 #define UX_HOST_CLASS_CDC_ECM_DEVICE_INIT_DELAY (1 * UX_PERIODIC_RATE) 161 #define UX_HOST_CLASS_CDC_ECM_CLASS_TRANSFER_TIMEOUT 300000 162 #define UX_HOST_CLASS_CDC_ECM_SETUP_BUFFER_SIZE 16 163 164 165 /* Define NetX errors inside the CDC ECM class. */ 166 #define UX_HOST_CLASS_CDC_ECM_NX_SUCCESS 0x00 167 #define UX_HOST_CLASS_CDC_ECM_NX_NO_PACKET 0x01 168 #define UX_HOST_CLASS_CDC_ECM_NX_UNDERFLOW 0x02 169 #define UX_HOST_CLASS_CDC_ECM_NX_OVERFLOW 0x03 170 #define UX_HOST_CLASS_CDC_ECM_NX_NO_MAPPING 0x04 171 #define UX_HOST_CLASS_CDC_ECM_NX_DELETED 0x05 172 #define UX_HOST_CLASS_CDC_ECM_NX_POOL_ERROR 0x06 173 #define UX_HOST_CLASS_CDC_ECM_NX_PTR_ERROR 0x07 174 #define UX_HOST_CLASS_CDC_ECM_NX_WAIT_ERROR 0x08 175 #define UX_HOST_CLASS_CDC_ECM_NX_SIZE_ERROR 0x09 176 #define UX_HOST_CLASS_CDC_ECM_NX_OPTION_ERROR 0x0a 177 #define UX_HOST_CLASS_CDC_ECM_NX_DELETE_ERROR 0x10 178 #define UX_HOST_CLASS_CDC_ECM_NX_CALLER_ERROR 0x11 179 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_PACKET 0x12 180 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_SOCKET 0x13 181 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_ENABLED 0x14 182 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_ENABLED 0x15 183 #define UX_HOST_CLASS_CDC_ECM_NX_ENTRY_NOT_FOUND 0x16 184 #define UX_HOST_CLASS_CDC_ECM_NX_NO_MORE_ENTRIES 0x17 185 #define UX_HOST_CLASS_CDC_ECM_NX_ARP_TIMER_ERROR 0x18 186 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE0 0x19 187 #define UX_HOST_CLASS_CDC_ECM_NX_WAIT_ABORTED 0x1A 188 #define UX_HOST_CLASS_CDC_ECM_NX_IP_INTERNAL_ERROR 0x20 189 #define UX_HOST_CLASS_CDC_ECM_NX_IP_ADDRESS_ERROR 0x21 190 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_BOUND 0x22 191 #define UX_HOST_CLASS_CDC_ECM_NX_PORT_UNAVAILABLE 0x23 192 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_BOUND 0x24 193 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE1 0x25 194 #define UX_HOST_CLASS_CDC_ECM_NX_SOCKET_UNBOUND 0x26 195 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CREATED 0x27 196 #define UX_HOST_CLASS_CDC_ECM_NX_SOCKETS_BOUND 0x28 197 #define UX_HOST_CLASS_CDC_ECM_NX_NO_RESPONSE 0x29 198 #define UX_HOST_CLASS_CDC_ECM_NX_POOL_DELETED 0x30 199 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_RELEASED 0x31 200 #define UX_HOST_CLASS_CDC_ECM_NX_RESERVED_CODE2 0x32 201 #define UX_HOST_CLASS_CDC_ECM_NX_MAX_LISTEN 0x33 202 #define UX_HOST_CLASS_CDC_ECM_NX_DUPLICATE_LISTEN 0x34 203 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CLOSED 0x35 204 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_LISTEN_STATE 0x36 205 #define UX_HOST_CLASS_CDC_ECM_NX_IN_PROGRESS 0x37 206 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_CONNECTED 0x38 207 #define UX_HOST_CLASS_CDC_ECM_NX_WINDOW_OVERFLOW 0x39 208 #define UX_HOST_CLASS_CDC_ECM_NX_ALREADY_SUSPENDED 0x40 209 #define UX_HOST_CLASS_CDC_ECM_NX_DISCONNECT_FAILED 0x41 210 #define UX_HOST_CLASS_CDC_ECM_NX_STILL_BOUND 0x42 211 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_SUCCESSFUL 0x43 212 #define UX_HOST_CLASS_CDC_ECM_NX_UNHANDLED_COMMAND 0x44 213 #define UX_HOST_CLASS_CDC_ECM_NX_NO_FREE_PORTS 0x45 214 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_PORT 0x46 215 #define UX_HOST_CLASS_CDC_ECM_NX_INVALID_RELISTEN 0x47 216 #define UX_HOST_CLASS_CDC_ECM_NX_CONNECTION_PENDING 0x48 217 #define UX_HOST_CLASS_CDC_ECM_NX_TX_QUEUE_DEPTH 0x49 218 #define UX_HOST_CLASS_CDC_ECM_NX_NOT_IMPLEMENTED 0x80 219 220 /* Define CDC_ECM Class packet equivalences. */ 221 222 #define UX_HOST_CLASS_CDC_ECM_PACKET_SIZE 128 223 #define UX_HOST_CLASS_CDC_ECM_NODE_ID_LENGTH 6 224 225 /* Define supported notification types. */ 226 227 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_CONNECTION 0x00 228 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_RESPONSE_AVAILABLE 0x01 229 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_SERIAL_STATE 0x20 230 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_CALL_STATE_CHANGE 0x28 231 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_LINE_STATE_CHANGE 0x29 232 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_SPEED_CHANGE 0x2A 233 234 /* Define notification packet format. */ 235 236 #define UX_HOST_CLASS_CDC_ECM_NPF_REQUEST_TYPE 0x00 237 #define UX_HOST_CLASS_CDC_ECM_NPF_NOTIFICATION_TYPE 0x01 238 #define UX_HOST_CLASS_CDC_ECM_NPF_VALUE 0x02 239 #define UX_HOST_CLASS_CDC_ECM_NPF_INDEX 0x04 240 #define UX_HOST_CLASS_CDC_ECM_NPF_LENGTH 0x06 241 242 /* Define supported notification values. */ 243 244 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_LINK_DOWN 0x00 245 #define UX_HOST_CLASS_CDC_ECM_NOTIFICATION_NETWORK_LINK_UP 0x01 246 247 /* Define packet allocation timeout in milliseconds. */ 248 249 #ifndef UX_HOST_CLASS_CDC_ECM_PACKET_POOL_WAIT 250 #define UX_HOST_CLASS_CDC_ECM_PACKET_POOL_WAIT 1000 251 #endif 252 253 /* Define packet pool waiting time in milliseconds. */ 254 255 #ifndef UX_HOST_CLASS_CDC_ECM_PACKET_POOL_INSTANCE_WAIT 256 #define UX_HOST_CLASS_CDC_ECM_PACKET_POOL_INSTANCE_WAIT 100 257 #endif 258 259 /* Define CDC_ECM Class instance structure. */ 260 261 typedef struct UX_HOST_CLASS_CDC_ECM_STRUCT 262 { 263 struct UX_HOST_CLASS_CDC_ECM_STRUCT 264 *ux_host_class_cdc_ecm_next_instance; 265 UX_HOST_CLASS *ux_host_class_cdc_ecm_class; 266 UX_DEVICE *ux_host_class_cdc_ecm_device; 267 UX_ENDPOINT *ux_host_class_cdc_ecm_bulk_in_endpoint; 268 UX_ENDPOINT *ux_host_class_cdc_ecm_bulk_out_endpoint; 269 UX_ENDPOINT *ux_host_class_cdc_ecm_interrupt_endpoint; 270 UX_INTERFACE *ux_host_class_cdc_ecm_interface_data; 271 UX_INTERFACE *ux_host_class_cdc_ecm_interface_control; 272 UCHAR ux_host_class_cdc_ecm_bulk_in_transfer_check_and_arm_in_process; 273 UCHAR ux_host_class_cdc_ecm_bulk_in_transfer_waiting_for_check_and_arm_to_finish; 274 UX_SEMAPHORE ux_host_class_cdc_ecm_bulk_in_transfer_waiting_for_check_and_arm_to_finish_semaphore; 275 UCHAR ux_host_class_cdc_ecm_bulk_out_transfer_check_and_arm_in_process; 276 UCHAR ux_host_class_cdc_ecm_bulk_out_transfer_waiting_for_check_and_arm_to_finish; 277 UX_SEMAPHORE ux_host_class_cdc_ecm_bulk_out_transfer_waiting_for_check_and_arm_to_finish_semaphore; 278 UINT ux_host_class_cdc_ecm_instance_status; 279 UINT ux_host_class_cdc_ecm_state; 280 UX_SEMAPHORE ux_host_class_cdc_ecm_interrupt_notification_semaphore; 281 UX_THREAD ux_host_class_cdc_ecm_thread; 282 UCHAR *ux_host_class_cdc_ecm_thread_stack; 283 ULONG ux_host_class_cdc_ecm_notification_count; 284 ULONG ux_host_class_cdc_ecm_primary_phy_id; 285 ULONG ux_host_class_cdc_ecm_primary_phy_type; 286 ULONG ux_host_class_cdc_ecm_secondary_phy_id; 287 ULONG ux_host_class_cdc_ecm_secondary_phy_type; 288 ULONG ux_host_class_cdc_ecm_model_revision_number; 289 ULONG ux_host_class_cdc_ecm_vendor_model_number; 290 ULONG ux_host_class_cdc_ecm_speed_selected; 291 ULONG ux_host_class_cdc_ecm_device_state; 292 ULONG ux_host_class_cdc_ecm_link_state; 293 NX_PACKET *ux_host_class_cdc_ecm_xmit_queue_head; 294 NX_PACKET *ux_host_class_cdc_ecm_xmit_queue_tail; 295 NX_PACKET_POOL *ux_host_class_cdc_ecm_packet_pool; 296 #ifdef UX_HOST_CLASS_CDC_ECM_PACKET_CHAIN_SUPPORT 297 UCHAR *ux_host_class_cdc_ecm_xmit_buffer; 298 UCHAR *ux_host_class_cdc_ecm_receive_buffer; 299 #endif 300 301 UCHAR ux_host_class_cdc_ecm_node_id[UX_HOST_CLASS_CDC_ECM_NODE_ID_LENGTH]; 302 VOID (*ux_host_class_cdc_ecm_device_status_change_callback)(struct UX_HOST_CLASS_CDC_ECM_STRUCT *cdc_ecm, 303 ULONG device_state); 304 VOID *ux_host_class_cdc_ecm_network_handle; 305 306 } UX_HOST_CLASS_CDC_ECM; 307 308 309 /* Define ECM Interface Functional descriptor. */ 310 311 #define UX_HOST_CLASS_CDC_ECM_INTERFACE_DESCRIPTOR_ENTRIES 8 312 #define UX_HOST_CLASS_CDC_ECM_INTERFACE_DESCRIPTOR_LENGTH 13 313 314 typedef struct UX_HOST_CLASS_ECM_INTERFACE_DESCRIPTOR_STRUCT 315 { 316 UCHAR bFunctionLength; 317 UCHAR bDescriptorType; 318 UCHAR bDescriptorSubtype; 319 UCHAR iMACAddress; 320 ULONG bmEthernetStatistics; 321 USHORT wMaxSegmentSize; 322 USHORT wNumberMCFilters; 323 UCHAR bNumberPowerFilters; 324 UCHAR _align_size[3]; 325 } UX_HOST_CLASS_ECM_INTERFACE_DESCRIPTOR; 326 327 /* Define CDC ECM Class function prototypes. */ 328 329 UINT _ux_host_class_cdc_ecm_activate(UX_HOST_CLASS_COMMAND *command); 330 UINT _ux_host_class_cdc_ecm_deactivate(UX_HOST_CLASS_COMMAND *command); 331 UINT _ux_host_class_cdc_ecm_endpoints_get(UX_HOST_CLASS_CDC_ECM *cdc_ecm); 332 UINT _ux_host_class_cdc_ecm_entry(UX_HOST_CLASS_COMMAND *command); 333 UINT _ux_host_class_cdc_ecm_write(VOID *cdc_ecm_class, NX_PACKET *packet); 334 VOID _ux_host_class_cdc_ecm_interrupt_notification(UX_TRANSFER *transfer_request); 335 VOID _ux_host_class_cdc_ecm_thread(ULONG parameter); 336 VOID _ux_host_class_cdc_ecm_transmission_callback(UX_TRANSFER *transfer_request); 337 VOID _ux_host_class_cdc_ecm_transmit_queue_clean(UX_HOST_CLASS_CDC_ECM *cdc_ecm_control); 338 UINT _ux_host_class_cdc_ecm_mac_address_get(UX_HOST_CLASS_CDC_ECM *cdc_ecm); 339 340 /* Define CDC ECM Class API prototypes. */ 341 342 #define ux_host_class_cdc_ecm_entry _ux_host_class_cdc_ecm_entry 343 #define ux_host_class_cdc_ecm_write _ux_host_class_cdc_ecm_write 344 345 /* Determine if a C++ compiler is being used. If so, complete the standard 346 C conditional started above. */ 347 #ifdef __cplusplus 348 } 349 #endif 350 351 #endif 352