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#ifndef USB_DDK_LITEOS_ADAPTER_H
17094332d3Sopenharmony_ci#define USB_DDK_LITEOS_ADAPTER_H
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_ci#include <stdlib.h>
20094332d3Sopenharmony_ci#include <stdint.h>
21094332d3Sopenharmony_ci#include <errno.h>
22094332d3Sopenharmony_ci#include <fcntl.h>
23094332d3Sopenharmony_ci#include <sys/ioctl.h>
24094332d3Sopenharmony_ci#include <sys/mman.h>
25094332d3Sopenharmony_ci#include <unistd.h>
26094332d3Sopenharmony_ci#include "liteos_ddk_usb.h"
27094332d3Sopenharmony_ci
28094332d3Sopenharmony_ci#define MAX_BULK_DATA_BUFFER_LENGTH     4096
29094332d3Sopenharmony_ci#define MAX_BULK_URBS_PER_REQUEST       1
30094332d3Sopenharmony_ci#define MAX_ISO_PACKETS_PER_URB         128
31094332d3Sopenharmony_ci#define MAX_ISO_DATA_BUFFER_LEN         (8 * 1024)
32094332d3Sopenharmony_ci#define MAX_ISO_URBS_PER_REQUEST        (((MAX_ISO_DATA_BUFFER_LEN - 1) / MAX_ISO_PACKETS_PER_URB) + 1)
33094332d3Sopenharmony_ci
34094332d3Sopenharmony_ci#define URBS_PER_REQUEST                MAX(MAX_BULK_URBS_PER_REQUEST, MAX_ISO_URBS_PER_REQUEST)
35094332d3Sopenharmony_ci
36094332d3Sopenharmony_cistruct UsbCtrltransfer {
37094332d3Sopenharmony_ci    uint8_t requestType;
38094332d3Sopenharmony_ci    uint8_t request;
39094332d3Sopenharmony_ci    uint16_t wValue;
40094332d3Sopenharmony_ci    uint16_t wIndex;
41094332d3Sopenharmony_ci    uint16_t wLength;
42094332d3Sopenharmony_ci    uint32_t timeout;
43094332d3Sopenharmony_ci    void *data;
44094332d3Sopenharmony_ci};
45094332d3Sopenharmony_ci
46094332d3Sopenharmony_cistruct UsbSetInterface {
47094332d3Sopenharmony_ci    unsigned int interface;
48094332d3Sopenharmony_ci    unsigned int altSetting;
49094332d3Sopenharmony_ci};
50094332d3Sopenharmony_ci
51094332d3Sopenharmony_cienum UsbRequestFlags {
52094332d3Sopenharmony_ci    USB_REQUEST_SHORT_NOT_OK = (1U << 0),
53094332d3Sopenharmony_ci    USB_REQUEST_FREE_BUFFER = (1U << 1),
54094332d3Sopenharmony_ci    USB_REQUEST_FREE_TRANSFER = (1U << 2),
55094332d3Sopenharmony_ci    USB_REQUEST_ADD_ZERO_PACKET = (1U << 3)
56094332d3Sopenharmony_ci};
57094332d3Sopenharmony_ci
58094332d3Sopenharmony_cistruct UsbAdapterStreams {
59094332d3Sopenharmony_ci    unsigned int numStreams;
60094332d3Sopenharmony_ci    unsigned int numEps;
61094332d3Sopenharmony_ci    unsigned char eps[0];
62094332d3Sopenharmony_ci};
63094332d3Sopenharmony_ci
64094332d3Sopenharmony_cistruct ConfigDescriptor {
65094332d3Sopenharmony_ci    struct UsbConfigDescriptor *desc;
66094332d3Sopenharmony_ci    size_t actualLen;
67094332d3Sopenharmony_ci};
68094332d3Sopenharmony_ci
69094332d3Sopenharmony_cistruct UsbDevicePriv {
70094332d3Sopenharmony_ci    void *descriptors;
71094332d3Sopenharmony_ci    size_t descriptorsLen;
72094332d3Sopenharmony_ci    uint8_t activeConfig;
73094332d3Sopenharmony_ci    struct ConfigDescriptor *configDescriptors;
74094332d3Sopenharmony_ci};
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci#define BUS_OFFSET      8
77094332d3Sopenharmony_ci#define USB_ADAPTER_URB_TYPE_ISO        0
78094332d3Sopenharmony_ci#define USB_ADAPTER_URB_TYPE_INTERRUPT  1
79094332d3Sopenharmony_ci#define USB_ADAPTER_URB_TYPE_CONTROL        2
80094332d3Sopenharmony_ci#define USB_ADAPTER_URB_TYPE_BULK       3
81094332d3Sopenharmony_ci#define USB_ADAPTER_URB_SHORT_NOT_OK        0x01
82094332d3Sopenharmony_ci#define USB_ADAPTER_URB_ISO_ASAP        0x02
83094332d3Sopenharmony_ci#define USB_ADAPTER_URB_BULK_CONTINUATION   0x04
84094332d3Sopenharmony_ci#define USB_ADAPTER_URB_QUEUE_BULK      0x10
85094332d3Sopenharmony_ci#define USB_ADAPTER_URB_ZERO_PACKET     0x40
86094332d3Sopenharmony_ci#define USB_ADAPTER_CAP_ZERO_PACKET         0x01
87094332d3Sopenharmony_ci#define USB_ADAPTER_CAP_BULK_CONTINUATION       0x02
88094332d3Sopenharmony_ci#define USB_ADAPTER_CAP_NO_PACKET_SIZE_LIM      0x04
89094332d3Sopenharmony_ci#define USB_ADAPTER_CAP_BULK_SCATTER_GATHER     0x08
90094332d3Sopenharmony_ci#define USB_ADAPTER_CAP_REAP_AFTER_DISCONNECT       0x10
91094332d3Sopenharmony_ci
92094332d3Sopenharmony_cistruct UsbOsAdapterOps {
93094332d3Sopenharmony_ci    int32_t (*init)(const struct UsbSession *session);
94094332d3Sopenharmony_ci    void (*exit)(const struct UsbSession *session);
95094332d3Sopenharmony_ci    struct UsbDeviceHandle *(*openDevice)(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr);
96094332d3Sopenharmony_ci    void (*closeDevice)(struct UsbDeviceHandle *devHandle);
97094332d3Sopenharmony_ci    int32_t (*getConfigDescriptor)(const struct UsbDevice *device, uint8_t configIndex, void *buffer, size_t len);
98094332d3Sopenharmony_ci    int32_t (*getConfiguration)(const struct UsbDeviceHandle *devHandle, uint8_t *activeConfig);
99094332d3Sopenharmony_ci    int32_t (*setConfiguration)(struct UsbDeviceHandle *devHandle, int32_t activeConfig);
100094332d3Sopenharmony_ci    int32_t (*claimInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
101094332d3Sopenharmony_ci    int32_t (*releaseInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
102094332d3Sopenharmony_ci    int32_t (*setInterfaceAltsetting)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber,
103094332d3Sopenharmony_ci        uint8_t altsetting);
104094332d3Sopenharmony_ci    int32_t (*clearHalt)(const struct UsbDeviceHandle *devHandle, unsigned int endpoint);
105094332d3Sopenharmony_ci    int32_t (*resetDevice)(const struct UsbDeviceHandle *devHandle);
106094332d3Sopenharmony_ci    struct UsbHostRequest *(*allocRequest)(const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t len);
107094332d3Sopenharmony_ci    int32_t (*freeRequest)(struct UsbHostRequest *request);
108094332d3Sopenharmony_ci    int32_t (*submitRequest)(struct UsbHostRequest *request);
109094332d3Sopenharmony_ci    int32_t (*cancelRequest)(const struct UsbHostRequest *request);
110094332d3Sopenharmony_ci    int32_t (*urbCompleteHandle)(const struct UsbDeviceHandle *devHandle);
111094332d3Sopenharmony_ci};
112094332d3Sopenharmony_ci
113094332d3Sopenharmony_cistruct UsbOsAdapterOps *UsbAdapterGetOps(void);
114094332d3Sopenharmony_ciUsbRawTidType UsbAdapterGetTid(void);
115094332d3Sopenharmony_ciint32_t UsbAdapterRegisterSignal(void);
116094332d3Sopenharmony_ciint32_t UsbAdapterKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid);
117094332d3Sopenharmony_ciint32_t AdapterAtomicInc(OsalAtomic *v);
118094332d3Sopenharmony_ciint32_t AdapterAtomicDec(OsalAtomic *v);
119094332d3Sopenharmony_ci
120094332d3Sopenharmony_ci#endif  /* USB_DDK_LITEOS_ADAPTER_H */
121