1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "usb_raw_api.h"
17094332d3Sopenharmony_ci#include "usb_raw_api_library.h"
18094332d3Sopenharmony_ci#include "usbd_wrapper.h"
19094332d3Sopenharmony_ci
20094332d3Sopenharmony_ci#define HDF_LOG_TAG USB_RAW_API
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_ciint32_t UsbRawInit(struct UsbSession **session)
23094332d3Sopenharmony_ci{
24094332d3Sopenharmony_ci    return RawInit(session);
25094332d3Sopenharmony_ci}
26094332d3Sopenharmony_ci
27094332d3Sopenharmony_ciint32_t UsbRawExit(const struct UsbSession *session)
28094332d3Sopenharmony_ci{
29094332d3Sopenharmony_ci    return RawExit(session);
30094332d3Sopenharmony_ci}
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_ciUsbRawHandle *UsbRawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr)
33094332d3Sopenharmony_ci{
34094332d3Sopenharmony_ci    return (UsbRawHandle *)RawOpenDevice(session, busNum, usbAddr);
35094332d3Sopenharmony_ci}
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_ciint32_t UsbRawCloseDevice(const UsbRawHandle *devHandle)
38094332d3Sopenharmony_ci{
39094332d3Sopenharmony_ci    if (devHandle == NULL) {
40094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
41094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
42094332d3Sopenharmony_ci    }
43094332d3Sopenharmony_ci
44094332d3Sopenharmony_ci    return RawCloseDevice((const struct UsbDeviceHandle *)devHandle);
45094332d3Sopenharmony_ci}
46094332d3Sopenharmony_ci
47094332d3Sopenharmony_ciint32_t UsbRawSendControlRequest(
48094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbControlRequestData *requestData)
49094332d3Sopenharmony_ci{
50094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (requestData == NULL)) {
51094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
52094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
53094332d3Sopenharmony_ci    }
54094332d3Sopenharmony_ci
55094332d3Sopenharmony_ci    return RawSendControlRequest(
56094332d3Sopenharmony_ci        (struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle, requestData);
57094332d3Sopenharmony_ci}
58094332d3Sopenharmony_ci
59094332d3Sopenharmony_ciint32_t UsbRawSendBulkRequest(
60094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData)
61094332d3Sopenharmony_ci{
62094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (requestData == NULL)) {
63094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
64094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
65094332d3Sopenharmony_ci    }
66094332d3Sopenharmony_ci
67094332d3Sopenharmony_ci    return RawSendBulkRequest(
68094332d3Sopenharmony_ci        (const struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle, requestData);
69094332d3Sopenharmony_ci}
70094332d3Sopenharmony_ci
71094332d3Sopenharmony_ciint32_t UsbRawSendInterruptRequest(
72094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData)
73094332d3Sopenharmony_ci{
74094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (requestData == NULL)) {
75094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
76094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
77094332d3Sopenharmony_ci    }
78094332d3Sopenharmony_ci
79094332d3Sopenharmony_ci    return RawSendInterruptRequest(
80094332d3Sopenharmony_ci        (const struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle, requestData);
81094332d3Sopenharmony_ci}
82094332d3Sopenharmony_ci
83094332d3Sopenharmony_ciint32_t UsbRawGetConfigDescriptor(
84094332d3Sopenharmony_ci    const UsbRawDevice *rawDev, uint8_t configIndex, struct UsbRawConfigDescriptor ** const config)
85094332d3Sopenharmony_ci{
86094332d3Sopenharmony_ci    if ((rawDev == NULL) || (config == NULL)) {
87094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d rawDev or config is NULL", __func__, __LINE__);
88094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
89094332d3Sopenharmony_ci    }
90094332d3Sopenharmony_ci
91094332d3Sopenharmony_ci    return RawGetConfigDescriptor((const struct UsbDevice *)rawDev, configIndex, config);
92094332d3Sopenharmony_ci}
93094332d3Sopenharmony_ci
94094332d3Sopenharmony_civoid UsbRawFreeConfigDescriptor(const struct UsbRawConfigDescriptor *config)
95094332d3Sopenharmony_ci{
96094332d3Sopenharmony_ci    if (config == NULL) {
97094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d config is NULL", __func__, __LINE__);
98094332d3Sopenharmony_ci        return;
99094332d3Sopenharmony_ci    }
100094332d3Sopenharmony_ci
101094332d3Sopenharmony_ci    RawClearConfiguration((struct UsbRawConfigDescriptor *)config);
102094332d3Sopenharmony_ci    RawUsbMemFree((void *)config);
103094332d3Sopenharmony_ci}
104094332d3Sopenharmony_ci
105094332d3Sopenharmony_ciint32_t UsbRawGetConfiguration(const UsbRawHandle * const devHandle, int32_t *config)
106094332d3Sopenharmony_ci{
107094332d3Sopenharmony_ci    if ((devHandle == NULL) || (config == NULL)) {
108094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d dev or config is NULL", __func__, __LINE__);
109094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
110094332d3Sopenharmony_ci    }
111094332d3Sopenharmony_ci
112094332d3Sopenharmony_ci    return RawGetConfiguration((const struct UsbDeviceHandle *)devHandle, config);
113094332d3Sopenharmony_ci}
114094332d3Sopenharmony_ci
115094332d3Sopenharmony_ciint32_t UsbRawSetConfiguration(const UsbRawHandle *devHandle, int32_t config)
116094332d3Sopenharmony_ci{
117094332d3Sopenharmony_ci    if (devHandle == NULL) {
118094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d dev is NULL", __func__, __LINE__);
119094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
120094332d3Sopenharmony_ci    }
121094332d3Sopenharmony_ci
122094332d3Sopenharmony_ci    return RawSetConfiguration((const struct UsbDeviceHandle *)devHandle, config);
123094332d3Sopenharmony_ci}
124094332d3Sopenharmony_ci
125094332d3Sopenharmony_ciint32_t UsbRawControlMsg(const UsbRawHandle * const devHandle, struct UsbControlRequestData *ctrlData)
126094332d3Sopenharmony_ci{
127094332d3Sopenharmony_ci    if ((devHandle == NULL) || (ctrlData == NULL)) {
128094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d dev or config is NULL", __func__, __LINE__);
129094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
130094332d3Sopenharmony_ci    }
131094332d3Sopenharmony_ci
132094332d3Sopenharmony_ci    return RawUsbControlMsg((const struct UsbDeviceHandle *)devHandle, ctrlData);
133094332d3Sopenharmony_ci}
134094332d3Sopenharmony_ci
135094332d3Sopenharmony_ciint32_t UsbRawGetUsbSpeed(const UsbRawHandle * const devHandle)
136094332d3Sopenharmony_ci{
137094332d3Sopenharmony_ci    if ((devHandle == NULL)) {
138094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d dev or config is NULL", __func__, __LINE__);
139094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
140094332d3Sopenharmony_ci    }
141094332d3Sopenharmony_ci    return RawUsbGetUsbSpeed((const struct UsbDeviceHandle *)devHandle);
142094332d3Sopenharmony_ci}
143094332d3Sopenharmony_ci
144094332d3Sopenharmony_ciint32_t UsbRawGetDescriptor(const struct UsbRawRequest *request, const UsbRawHandle *devHandle,
145094332d3Sopenharmony_ci    const struct UsbRawDescriptorParam *param, const unsigned char *data)
146094332d3Sopenharmony_ci{
147094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (param == NULL) || (data == NULL)) {
148094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d request or devHandle is NULL", __func__, __LINE__);
149094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
150094332d3Sopenharmony_ci    }
151094332d3Sopenharmony_ci
152094332d3Sopenharmony_ci    return RawGetDescriptor(
153094332d3Sopenharmony_ci        (const struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle, param, data);
154094332d3Sopenharmony_ci}
155094332d3Sopenharmony_ci
156094332d3Sopenharmony_ciUsbRawDevice *UsbRawGetDevice(const UsbRawHandle * const devHandle)
157094332d3Sopenharmony_ci{
158094332d3Sopenharmony_ci    if (devHandle == NULL) {
159094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL ", __func__, __LINE__);
160094332d3Sopenharmony_ci        return NULL;
161094332d3Sopenharmony_ci    }
162094332d3Sopenharmony_ci
163094332d3Sopenharmony_ci    return (UsbRawDevice *)RawGetDevice((const struct UsbDeviceHandle *)devHandle);
164094332d3Sopenharmony_ci}
165094332d3Sopenharmony_ci
166094332d3Sopenharmony_ciint32_t UsbRawGetDeviceDescriptor(const UsbRawDevice *rawDev, struct UsbDeviceDescriptor *desc)
167094332d3Sopenharmony_ci{
168094332d3Sopenharmony_ci    if ((rawDev == NULL) || (desc == NULL)) {
169094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d rawDev or desc is NULL", __func__, __LINE__);
170094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
171094332d3Sopenharmony_ci    }
172094332d3Sopenharmony_ci
173094332d3Sopenharmony_ci    return RawGetDeviceDescriptor((const struct UsbDevice *)rawDev, desc);
174094332d3Sopenharmony_ci}
175094332d3Sopenharmony_ci
176094332d3Sopenharmony_ciint32_t UsbRawClaimInterface(const UsbRawHandle *devHandle, int32_t interfaceNumber)
177094332d3Sopenharmony_ci{
178094332d3Sopenharmony_ci    if (devHandle == NULL) {
179094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
180094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
181094332d3Sopenharmony_ci    }
182094332d3Sopenharmony_ci
183094332d3Sopenharmony_ci    return RawClaimInterface((struct UsbDeviceHandle *)devHandle, interfaceNumber);
184094332d3Sopenharmony_ci}
185094332d3Sopenharmony_ci
186094332d3Sopenharmony_ciint32_t UsbRawReleaseInterface(const UsbRawHandle *devHandle, int32_t interfaceNumber)
187094332d3Sopenharmony_ci{
188094332d3Sopenharmony_ci    if (devHandle == NULL) {
189094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
190094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
191094332d3Sopenharmony_ci    }
192094332d3Sopenharmony_ci
193094332d3Sopenharmony_ci    return RawReleaseInterface((struct UsbDeviceHandle *)devHandle, interfaceNumber);
194094332d3Sopenharmony_ci}
195094332d3Sopenharmony_ci
196094332d3Sopenharmony_ciint32_t UsbRawResetDevice(const UsbRawHandle *devHandle)
197094332d3Sopenharmony_ci{
198094332d3Sopenharmony_ci    if (devHandle == NULL) {
199094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
200094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci
203094332d3Sopenharmony_ci    return RawResetDevice((const struct UsbDeviceHandle *)devHandle);
204094332d3Sopenharmony_ci}
205094332d3Sopenharmony_ci
206094332d3Sopenharmony_cistruct UsbRawRequest *UsbRawAllocRequest(const UsbRawHandle *devHandle, int32_t isoPackets, int32_t length)
207094332d3Sopenharmony_ci{
208094332d3Sopenharmony_ci    if (devHandle == NULL) {
209094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
210094332d3Sopenharmony_ci        return NULL;
211094332d3Sopenharmony_ci    }
212094332d3Sopenharmony_ci
213094332d3Sopenharmony_ci    return (struct UsbRawRequest *)RawAllocRequest((const struct UsbDeviceHandle *)devHandle, isoPackets, length);
214094332d3Sopenharmony_ci}
215094332d3Sopenharmony_ci
216094332d3Sopenharmony_ciint32_t UsbRawFreeRequest(const struct UsbRawRequest *request)
217094332d3Sopenharmony_ci{
218094332d3Sopenharmony_ci    if (request == NULL) {
219094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d request is NULL", __func__, __LINE__);
220094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
221094332d3Sopenharmony_ci    }
222094332d3Sopenharmony_ci
223094332d3Sopenharmony_ci    return RawFreeRequest((const struct UsbHostRequest *)request);
224094332d3Sopenharmony_ci}
225094332d3Sopenharmony_ci
226094332d3Sopenharmony_ciint32_t UsbRawFillBulkRequest(
227094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData)
228094332d3Sopenharmony_ci{
229094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (fillData == NULL)) {
230094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
231094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
232094332d3Sopenharmony_ci    }
233094332d3Sopenharmony_ci
234094332d3Sopenharmony_ci    return RawFillBulkRequest((struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle,
235094332d3Sopenharmony_ci        (const struct UsbFillRequestData *)fillData);
236094332d3Sopenharmony_ci}
237094332d3Sopenharmony_ci
238094332d3Sopenharmony_ciint32_t UsbRawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData)
239094332d3Sopenharmony_ci{
240094332d3Sopenharmony_ci    if ((setup == NULL) || (requestData == NULL)) {
241094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d setup or requestData is NULL", __func__, __LINE__);
242094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
243094332d3Sopenharmony_ci    }
244094332d3Sopenharmony_ci
245094332d3Sopenharmony_ci    return RawFillControlSetup(setup, requestData);
246094332d3Sopenharmony_ci}
247094332d3Sopenharmony_ci
248094332d3Sopenharmony_ciint32_t UsbRawFillControlRequest(
249094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData)
250094332d3Sopenharmony_ci{
251094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (fillData == NULL)) {
252094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
253094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
254094332d3Sopenharmony_ci    }
255094332d3Sopenharmony_ci
256094332d3Sopenharmony_ci    return RawFillControlRequest((struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle,
257094332d3Sopenharmony_ci        (const struct UsbFillRequestData *)fillData);
258094332d3Sopenharmony_ci}
259094332d3Sopenharmony_ci
260094332d3Sopenharmony_ciint32_t UsbRawFillInterruptRequest(
261094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData)
262094332d3Sopenharmony_ci{
263094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (fillData == NULL)) {
264094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
265094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
266094332d3Sopenharmony_ci    }
267094332d3Sopenharmony_ci
268094332d3Sopenharmony_ci    return RawFillInterruptRequest((struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle,
269094332d3Sopenharmony_ci        (const struct UsbFillRequestData *)fillData);
270094332d3Sopenharmony_ci}
271094332d3Sopenharmony_ci
272094332d3Sopenharmony_ciint32_t UsbRawFillIsoRequest(
273094332d3Sopenharmony_ci    const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData)
274094332d3Sopenharmony_ci{
275094332d3Sopenharmony_ci    if ((request == NULL) || (devHandle == NULL) || (fillData == NULL)) {
276094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d invalid param", __func__, __LINE__);
277094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
278094332d3Sopenharmony_ci    }
279094332d3Sopenharmony_ci
280094332d3Sopenharmony_ci    return RawFillIsoRequest((struct UsbHostRequest *)request, (const struct UsbDeviceHandle *)devHandle,
281094332d3Sopenharmony_ci        (const struct UsbFillRequestData *)fillData);
282094332d3Sopenharmony_ci}
283094332d3Sopenharmony_ci
284094332d3Sopenharmony_ciint32_t UsbRawSubmitRequest(const struct UsbRawRequest *request)
285094332d3Sopenharmony_ci{
286094332d3Sopenharmony_ci    if (request == NULL) {
287094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d request is NULL", __func__, __LINE__);
288094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
289094332d3Sopenharmony_ci    }
290094332d3Sopenharmony_ci
291094332d3Sopenharmony_ci    return RawSubmitRequest((const struct UsbHostRequest *)request);
292094332d3Sopenharmony_ci}
293094332d3Sopenharmony_ci
294094332d3Sopenharmony_ciint32_t UsbRawCancelRequest(const struct UsbRawRequest *request)
295094332d3Sopenharmony_ci{
296094332d3Sopenharmony_ci    if (request == NULL) {
297094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d request is NULL", __func__, __LINE__);
298094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
299094332d3Sopenharmony_ci    }
300094332d3Sopenharmony_ci
301094332d3Sopenharmony_ci    return RawCancelRequest((const struct UsbHostRequest *)request);
302094332d3Sopenharmony_ci}
303094332d3Sopenharmony_ci
304094332d3Sopenharmony_ciint32_t UsbRawHandleRequests(const UsbRawHandle *devHandle)
305094332d3Sopenharmony_ci{
306094332d3Sopenharmony_ci    if (devHandle == NULL) {
307094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:%{public}d devHandle is NULL", __func__, __LINE__);
308094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
309094332d3Sopenharmony_ci    }
310094332d3Sopenharmony_ci
311094332d3Sopenharmony_ci    return RawHandleRequest((const struct UsbDeviceHandle *)devHandle);
312094332d3Sopenharmony_ci}
313