1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef USB_HOST_LINUX_ADAPTER_H
17 #define USB_HOST_LINUX_ADAPTER_H
18
19 #include "usb_raw_api_library.h"
20
21 #if __GLIBC__ == 2 && __GLIBC_MINOR__ < 30
22 #include <sys/syscall.h>
gettid()23 static inline pid_t gettid()
24 {
25 return syscall(SYS_gettid);
26 }
27 #endif
28
29 #define USBDEV_PATH "/dev"
30 #define USB_DEV_FS_PATH "/dev/bus/usb"
31
32 #define BUS_OFFSET 8
33
34 #define MAX_BULK_DATA_BUFFER_LENGTH 4096
35 #define MAX_BULK_URBS_PER_REQUEST 1
36
37 #define MAX_ISO_PACKETS_PER_URB 128
38 #define MAX_ISO_DATA_BUFFER_LEN (8 * 1024)
39 #define MAX_ISO_URBS_PER_REQUEST (((MAX_ISO_DATA_BUFFER_LEN - 1) / MAX_ISO_PACKETS_PER_URB) + 1)
40
41 #define URBS_PER_REQUEST MAX(MAX_BULK_URBS_PER_REQUEST, MAX_ISO_URBS_PER_REQUEST)
42
43 #define MAX_ISO_SHARE_MEMERY_SIZE sizeof(struct UsbHostRequest) + \
44 (URBS_PER_REQUEST * sizeof(struct UsbAdapterUrb)) + MAX_ISO_DATA_BUFFER_LEN
45 #define MAX_BULK_SHARE_MEMERY_SIZE sizeof(struct UsbHostRequest) + \
46 (URBS_PER_REQUEST * sizeof(struct UsbAdapterUrb)) + MAX_BULK_DATA_BUFFER_LENGTH
47 #define MAX_CTRL_BUFFER_LENGTH 4096
48 #define MAX_DRIVER_NAME_LENGTH 256
49 #define DISCONNECT_CLAIM_EXCEPT_DRIVER 2
50
51 #define USB_ADAPTER_URB_TYPE_ISO 0
52 #define USB_ADAPTER_URB_TYPE_INTERRUPT 1
53 #define USB_ADAPTER_URB_TYPE_CONTROL 2
54 #define USB_ADAPTER_URB_TYPE_BULK 3
55 #define USB_ADAPTER_URB_SHORT_NOT_OK 0x01
56 #define USB_ADAPTER_URB_ISO_ASAP 0x02
57 #define USB_ADAPTER_URB_BULK_CONTINUATION 0x04
58 #define USB_ADAPTER_URB_QUEUE_BULK 0x10
59 #define USB_ADAPTER_URB_ZERO_PACKET 0x40
60 #define USB_ADAPTER_CAP_ZERO_PACKET 0x01
61 #define USB_ADAPTER_CAP_BULK_CONTINUATION 0x02
62 #define USB_ADAPTER_CAP_NO_PACKET_SIZE_LIM 0x04
63 #define USB_ADAPTER_CAP_BULK_SCATTER_GATHER 0x08
64 #define USB_ADAPTER_CAP_REAP_AFTER_DISCONNECT 0x10
65
66 #define USBDEVFS_CONTROL _IOWR('U', 0, struct UsbControlRequestData)
67 #define USBDEVFS_BULK _IOWR('U', 2, struct UsbAdapterBulkTransfer)
68 #define USBDEVFS_SETINTERFACE _IOR('U', 4, struct UsbAdapterSetInterface)
69 #define USBDEVFS_SETCONFIGURATION _IOR('U', 5, unsigned int)
70 #define USBDEVFS_GETDRIVER _IOW('U', 8, struct UsbAdapterGetdriver)
71 #define USBDEVFS_SUBMITURB _IOR('U', 10, struct UsbAdapterUrb)
72 #define USBDEVFS_DISCARDURB _IO('U', 11)
73 #define USBDEVFS_REAPURB _IOW('U', 12, void *)
74 #define USBDEVFS_CLAIMINTERFACE _IOR('U', 15, unsigned int)
75 #define USBDEVFS_RELEASEINTERFACE _IOR('U', 16, unsigned int)
76 #define USBDEVFS_IOCTL _IOWR('U', 18, struct UsbAdapterIoctl)
77 #define USBDEVFS_RESET _IO('U', 20)
78 #define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int)
79 #define USBDEVFS_DISCONNECT _IO('U', 22)
80 #define USBDEVFS_CONNECT _IO('U', 23)
81 #define USBDEVFS_GET_CAPABILITIES _IOR('U', 26, unsigned int)
82 #define USBDEVFS_DISCONNECT_CLAIM _IOR('U', 27, struct UsbAdapterDisconnectClaim)
83 #define USBDEVFS_ALLOC_STREAMS _IOR('U', 28, struct UsbAdapterStreams)
84 #define USBDEVFS_FREE_STREAMS _IOR('U', 29, struct UsbAdapterStreams)
85 #define USBDEVFS_GET_SPEED _IO('U', 31)
86
87 struct UsbAdapterBulkTransfer {
88 unsigned int ep;
89 unsigned int len;
90 unsigned int timeout; /* in milliseconds */
91 void *data;
92 };
93
94 struct UsbAdapterSetInterface {
95 unsigned int interface;
96 unsigned int altSetting;
97 };
98
99 struct UsbAdapterStreams {
100 unsigned int numStreams;
101 unsigned int numEps;
102 unsigned char eps[0];
103 };
104
105 struct UsbAdapterGetdriver {
106 unsigned int interface;
107 char driver[MAX_DRIVER_NAME_LENGTH];
108 };
109
110 struct UsbAdapterIoctl {
111 unsigned int interface;
112 unsigned int code;
113 void *data;
114 };
115
116 struct UsbAdapterDisconnectClaim {
117 unsigned int interface;
118 unsigned int flags;
119 char driver[MAX_DRIVER_NAME_LENGTH];
120 };
121
122 struct UsbOsAdapterOps {
123 int32_t (*init)(const struct UsbSession *session);
124 void (*exit)(const struct UsbSession *session);
125 struct UsbDeviceHandle *(*openDevice)(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr);
126 void (*closeDevice)(struct UsbDeviceHandle *devHandle);
127 int32_t (*getConfigDescriptor)(const struct UsbDevice *device, uint8_t configIndex, void *buffer, size_t len);
128 int32_t (*getConfiguration)(const struct UsbDeviceHandle *devHandle, uint8_t *activeConfig);
129 int32_t (*setConfiguration)(struct UsbDeviceHandle *devHandle, int32_t activeConfig);
130 int32_t (*claimInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
131 int32_t (*releaseInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
132 int32_t (*setInterfaceAltsetting)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber,
133 uint8_t altsetting);
134 int32_t (*clearHalt)(const struct UsbDeviceHandle *devHandle, unsigned int endpoint);
135 int32_t (*resetDevice)(const struct UsbDeviceHandle *devHandle);
136 struct UsbHostRequest *(*allocRequest)(const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t len);
137 struct UsbHostRequest *(*allocRequestByMmap)(const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t len);
138 int32_t (*freeRequest)(struct UsbHostRequest *request);
139 int32_t (*freeRequestByMmap)(struct UsbHostRequest *request);
140 int32_t (*submitRequest)(struct UsbHostRequest *request);
141 int32_t (*cancelRequest)(struct UsbHostRequest *request);
142 int32_t (*urbCompleteHandle)(const struct UsbDeviceHandle *devHandle);
143 int32_t (*detachKernelDriverAndClaim)(const struct UsbDeviceHandle *handle, uint32_t interfaceNumber);
144 int32_t (*attachKernelDriver)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
145 int32_t (*detachKernelDriver)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
146 int32_t (*usbControlMsg)(const struct UsbDeviceHandle *devHandle, struct UsbControlRequestData *ctrlData);
147 int32_t (*getUsbSpeed)(const struct UsbDeviceHandle *handle);
148 bool (*getInterfaceActiveStatus)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
149 int32_t (*getDeviceSpeed)(const struct UsbDeviceHandle *devHandle);
150 };
151 #ifdef __cplusplus
152 extern "C" {
153 #endif
154
155 struct UsbOsAdapterOps *UsbAdapterGetOps(void);
156 UsbRawTidType UsbAdapterGetTid(void);
157 int32_t UsbAdapterRegisterSignal(void);
158 int32_t UsbAdapterKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid);
159 int32_t AdapterAtomicInc(OsalAtomic *v);
160 int32_t AdapterAtomicDec(OsalAtomic *v);
161
162 #ifdef __cplusplus
163 }
164 #endif
165 #endif /* USB_HOST_LINUX_ADAPTER_H */
166