1 /**
2 * Copyright 2024 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 /*******************************************************************************
9 * Includes
10 ******************************************************************************/
11 #include "usb_host_config.h"
12
13 #if defined(USB_HOST_CONFIG_CDC_ECM) && USB_HOST_CONFIG_CDC_ECM
14 #include "usb_host.h"
15 #include "usb_host_cdc.h"
16 #include "usb_host_cdc_ecm.h"
17 #include "usb_host_devices.h"
18 #include "usb_host_framework.h"
19
20 /*******************************************************************************
21 * Definitions
22 ******************************************************************************/
23
24 /*******************************************************************************
25 * Prototypes
26 ******************************************************************************/
27 static void USB_HostCdcEcmGetMacStringDescriptorPipeCallback(void *param,
28 usb_host_transfer_t *transfer,
29 usb_status_t status);
30 /*******************************************************************************
31 * Variables
32 ******************************************************************************/
33
34 /*******************************************************************************
35 * Code
36 ******************************************************************************/
USB_HostCdcEcmSetEthernetMulticastFilters(usb_host_class_handle classHandle,uint16_t filterNumSum,uint8_t (* filterData)[6],transfer_callback_t callbackFn,void * callbackParam)37 usb_status_t USB_HostCdcEcmSetEthernetMulticastFilters(usb_host_class_handle classHandle,
38 uint16_t filterNumSum,
39 uint8_t (*filterData)[6],
40 transfer_callback_t callbackFn,
41 void *callbackParam)
42 {
43 return USB_HostCdcControl(
44 classHandle, USB_REQUEST_TYPE_DIR_OUT | USB_REQUEST_TYPE_TYPE_CLASS | USB_REQUEST_TYPE_RECIPIENT_INTERFACE,
45 CDC_ECM_SET_ETHERNET_MULTICAST_FILTER, USB_SHORT_GET_LOW(filterNumSum), USB_SHORT_GET_HIGH(filterNumSum),
46 filterNumSum * 6, &filterData[0][0], callbackFn, callbackParam);
47 }
48
USB_HostCdcEcmSetEthernetPowerManagementPatternFilter(usb_host_class_handle classHandle,uint16_t filterNum,uint8_t * buffer,uint16_t bufferLength,transfer_callback_t callbackFn,void * callbackParam)49 usb_status_t USB_HostCdcEcmSetEthernetPowerManagementPatternFilter(usb_host_class_handle classHandle,
50 uint16_t filterNum,
51 uint8_t *buffer,
52 uint16_t bufferLength,
53 transfer_callback_t callbackFn,
54 void *callbackParam)
55 {
56 return USB_HostCdcControl(
57 classHandle, USB_REQUEST_TYPE_DIR_OUT | USB_REQUEST_TYPE_TYPE_CLASS | USB_REQUEST_TYPE_RECIPIENT_INTERFACE,
58 CDC_ECM_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER, USB_SHORT_GET_LOW(filterNum),
59 USB_SHORT_GET_HIGH(filterNum), bufferLength, buffer, callbackFn, callbackParam);
60 }
61
USB_HostCdcEcmGetEthernetPowerManagementPatternFilter(usb_host_class_handle classHandle,uint16_t filterNum,uint8_t (* buffer)[2],transfer_callback_t callbackFn,void * callbackParam)62 usb_status_t USB_HostCdcEcmGetEthernetPowerManagementPatternFilter(usb_host_class_handle classHandle,
63 uint16_t filterNum,
64 uint8_t (*buffer)[2],
65 transfer_callback_t callbackFn,
66 void *callbackParam)
67 {
68 return USB_HostCdcControl(
69 classHandle, USB_REQUEST_TYPE_DIR_IN | USB_REQUEST_TYPE_TYPE_CLASS | USB_REQUEST_TYPE_RECIPIENT_INTERFACE,
70 CDC_ECM_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER, USB_SHORT_GET_LOW(filterNum),
71 USB_SHORT_GET_HIGH(filterNum), 2, &buffer[0][0], callbackFn, callbackParam);
72 }
73
USB_HostCdcEcmSetEthernetPacketFilter(usb_host_class_handle classHandle,uint16_t packetFilterBitmap,transfer_callback_t callbackFn,void * callbackParam)74 usb_status_t USB_HostCdcEcmSetEthernetPacketFilter(usb_host_class_handle classHandle,
75 uint16_t packetFilterBitmap,
76 transfer_callback_t callbackFn,
77 void *callbackParam)
78 {
79 return USB_HostCdcControl(
80 classHandle, USB_REQUEST_TYPE_DIR_OUT | USB_REQUEST_TYPE_TYPE_CLASS | USB_REQUEST_TYPE_RECIPIENT_INTERFACE,
81 CDC_ECM_SET_ETHERNET_PACKET_FILTER, USB_SHORT_GET_LOW(packetFilterBitmap),
82 USB_SHORT_GET_HIGH(packetFilterBitmap), 0, NULL, callbackFn, callbackParam);
83 }
84
USB_HostCdcEcmGetEthernetStatistic(usb_host_class_handle classHandle,uint16_t featureSelector,uint8_t (* buffer)[4],transfer_callback_t callbackFn,void * callbackParam)85 usb_status_t USB_HostCdcEcmGetEthernetStatistic(usb_host_class_handle classHandle,
86 uint16_t featureSelector,
87 uint8_t (*buffer)[4],
88 transfer_callback_t callbackFn,
89 void *callbackParam)
90 {
91 return USB_HostCdcControl(
92 classHandle, USB_REQUEST_TYPE_DIR_IN | USB_REQUEST_TYPE_TYPE_CLASS | USB_REQUEST_TYPE_RECIPIENT_INTERFACE,
93 CDC_ECM_GET_ETHERNET_STATISTIC, USB_SHORT_GET_LOW(featureSelector), USB_SHORT_GET_HIGH(featureSelector), 4,
94 &buffer[0][0], callbackFn, callbackParam);
95 }
96
USB_HostCdcEcmDataRecv(usb_host_class_handle classHandle,uint8_t * buffer,uint32_t bufferLength,transfer_callback_t callbackFn,void * callbackParam)97 usb_status_t USB_HostCdcEcmDataRecv(usb_host_class_handle classHandle,
98 uint8_t *buffer,
99 uint32_t bufferLength,
100 transfer_callback_t callbackFn,
101 void *callbackParam)
102 {
103 return USB_HostCdcDataRecv(classHandle, buffer, bufferLength, callbackFn, callbackParam);
104 }
105
USB_HostCdcEcmDataSend(usb_host_class_handle classHandle,uint8_t * buffer,uint32_t bufferLength,uint16_t maxSegmentSize,transfer_callback_t callbackFn,void * callbackParam)106 usb_status_t USB_HostCdcEcmDataSend(usb_host_class_handle classHandle,
107 uint8_t *buffer,
108 uint32_t bufferLength,
109 uint16_t maxSegmentSize,
110 transfer_callback_t callbackFn,
111 void *callbackParam)
112 {
113 return USB_HostCdcDataSend(classHandle, buffer, MIN(bufferLength, maxSegmentSize), callbackFn, callbackParam);
114 }
115
USB_HostCdcEcmGetMacStringDescriptor(usb_host_class_handle classHandle,uint16_t index,uint16_t langID,uint8_t * buffer,uint16_t bufferLength,transfer_callback_t callbackFn,void * callbackParam)116 usb_status_t USB_HostCdcEcmGetMacStringDescriptor(usb_host_class_handle classHandle,
117 uint16_t index,
118 uint16_t langID,
119 uint8_t *buffer,
120 uint16_t bufferLength,
121 transfer_callback_t callbackFn,
122 void *callbackParam)
123 {
124 usb_status_t status = kStatus_USB_Success;
125 usb_host_cdc_instance_struct_t *cdcEcmInstance = (usb_host_cdc_instance_struct_t *)classHandle;
126 usb_host_device_instance_t *deviceInstance = cdcEcmInstance->deviceHandle;
127 usb_host_transfer_t *transfer;
128 usb_host_process_descriptor_param_t descriptorParam;
129
130 cdcEcmInstance->controlCallbackFn = callbackFn;
131 cdcEcmInstance->controlCallbackParam = callbackParam;
132
133 status = USB_HostMallocTransfer(deviceInstance->hostHandle, &transfer);
134 if (status != kStatus_USB_Success)
135 {
136 usb_echo("Malloc get string descriptor transfer error.\r\n");
137 return status;
138 }
139
140 transfer->setupPacket->bmRequestType = USB_REQUEST_TYPE_DIR_IN;
141 transfer->setupPacket->bRequest = USB_REQUEST_STANDARD_GET_DESCRIPTOR;
142 transfer->callbackFn = USB_HostCdcEcmGetMacStringDescriptorPipeCallback;
143 transfer->callbackParam = cdcEcmInstance;
144
145 descriptorParam.descriptorBuffer = buffer;
146 descriptorParam.descriptorType = USB_DESCRIPTOR_TYPE_STRING;
147 descriptorParam.descriptorIndex = index;
148 descriptorParam.descriptorLength = bufferLength;
149 descriptorParam.languageId = langID;
150
151 return USB_HostStandardSetGetDescriptor(deviceInstance, transfer, &descriptorParam);
152 }
153
USB_HostCdcEcmGetMacStringDescriptorPipeCallback(void * param,usb_host_transfer_t * transfer,usb_status_t status)154 static void USB_HostCdcEcmGetMacStringDescriptorPipeCallback(void *param,
155 usb_host_transfer_t *transfer,
156 usb_status_t status)
157 {
158 usb_host_cdc_instance_struct_t *cdcEcmInstance = (usb_host_cdc_instance_struct_t *)param;
159 if (cdcEcmInstance->controlCallbackFn != NULL)
160 {
161 cdcEcmInstance->controlCallbackFn(cdcEcmInstance->controlCallbackParam, transfer->transferBuffer,
162 transfer->transferSofar, status);
163 }
164 (void)USB_HostFreeTransfer(cdcEcmInstance->hostHandle, transfer);
165
166 return;
167 }
168
USB_HostCdcEcmPowerManagementPatternFilterData(USB_HostCdcEcmPowerManagementPatternFilter_t * param,uint8_t * dataBuf)169 uint32_t USB_HostCdcEcmPowerManagementPatternFilterData(USB_HostCdcEcmPowerManagementPatternFilter_t *param,
170 uint8_t *dataBuf)
171 {
172 uint8_t *p = dataBuf;
173 volatile uint32_t len = 0;
174 *p++ = param->MaskSize & 0xFF;
175 *p++ = (param->MaskSize >> 8) & 0xFF;
176 len += 2;
177
178 for (int i = 0; i < param->MaskSize; i++)
179 {
180 *p++ = param->Mask[i];
181 len++;
182 }
183 for (int i = 0; i < strlen((char *)param->Pattern); i++)
184 {
185 *p++ = param->Pattern[i];
186 len++;
187 }
188
189 return len;
190 }
191 #endif
192