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