• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <fcntl.h>
20 
21 #include "usb_raw_api_library.h"
22 
23 #if __GLIBC__ == 2 && __GLIBC_MINOR__ < 30
24 #include <sys/syscall.h>
gettid()25 static inline pid_t gettid()
26 {
27     return syscall(SYS_gettid);
28 }
29 #endif
30 
31 #define USBDEV_PATH     "/dev"
32 #define USB_DEV_FS_PATH "/dev/bus/usb"
33 
34 #define BUS_OFFSET      8
35 
36 #define MAX_BULK_DATA_BUFFER_LENGTH     4096
37 #define MAX_BULK_URBS_PER_REQUEST       1
38 
39 #define MAX_ISO_PACKETS_PER_URB         128
40 #define MAX_ISO_DATA_BUFFER_LEN         (8 * 1024)
41 #define MAX_ISO_URBS_PER_REQUEST        (((MAX_ISO_DATA_BUFFER_LEN - 1) / MAX_ISO_PACKETS_PER_URB) + 1)
42 
43 #define URBS_PER_REQUEST                MAX(MAX_BULK_URBS_PER_REQUEST, MAX_ISO_URBS_PER_REQUEST)
44 
45 #define MAX_ISO_SHARE_MEMERY_SIZE       sizeof(struct UsbHostRequest) + \
46     (URBS_PER_REQUEST * sizeof(struct UsbAdapterUrb)) + MAX_ISO_DATA_BUFFER_LEN
47 #define MAX_BULK_SHARE_MEMERY_SIZE      sizeof(struct UsbHostRequest) + \
48     (URBS_PER_REQUEST * sizeof(struct UsbAdapterUrb)) + MAX_BULK_DATA_BUFFER_LENGTH
49 #define MAX_CTRL_BUFFER_LENGTH  4096
50 #define MAX_DRIVER_NAME_LENGTH  256
51 #define DISCONNECT_CLAIM_EXCEPT_DRIVER  2
52 
53 #define USB_ADAPTER_URB_TYPE_ISO                0
54 #define USB_ADAPTER_URB_TYPE_INTERRUPT          1
55 #define USB_ADAPTER_URB_TYPE_CONTROL            2
56 #define USB_ADAPTER_URB_TYPE_BULK               3
57 #define USB_ADAPTER_URB_SHORT_NOT_OK            0x01
58 #define USB_ADAPTER_URB_ISO_ASAP                0x02
59 #define USB_ADAPTER_URB_BULK_CONTINUATION       0x04
60 #define USB_ADAPTER_URB_QUEUE_BULK              0x10
61 #define USB_ADAPTER_URB_ZERO_PACKET             0x40
62 #define USB_ADAPTER_CAP_ZERO_PACKET             0x01
63 #define USB_ADAPTER_CAP_BULK_CONTINUATION       0x02
64 #define USB_ADAPTER_CAP_NO_PACKET_SIZE_LIM      0x04
65 #define USB_ADAPTER_CAP_BULK_SCATTER_GATHER     0x08
66 #define USB_ADAPTER_CAP_REAP_AFTER_DISCONNECT   0x10
67 
68 #define USBDEVFS_CONTROL            _IOWR('U', 0, struct UsbControlRequestData)
69 #define USBDEVFS_BULK               _IOWR('U', 2, struct UsbAdapterBulkTransfer)
70 #define USBDEVFS_SETINTERFACE       _IOR('U', 4, struct UsbAdapterSetInterface)
71 #define USBDEVFS_SETCONFIGURATION   _IOR('U', 5, unsigned int)
72 #define USBDEVFS_GETDRIVER          _IOW('U', 8, struct UsbAdapterGetdriver)
73 #define USBDEVFS_SUBMITURB          _IOR('U', 10, struct UsbAdapterUrb)
74 #define USBDEVFS_DISCARDURB         _IO('U', 11)
75 #define USBDEVFS_REAPURB            _IOW('U', 12, void *)
76 #define USBDEVFS_CLAIMINTERFACE     _IOR('U', 15, unsigned int)
77 #define USBDEVFS_RELEASEINTERFACE   _IOR('U', 16, unsigned int)
78 #define USBDEVFS_IOCTL              _IOWR('U', 18, struct UsbAdapterIoctl)
79 #define USBDEVFS_RESET              _IO('U', 20)
80 #define USBDEVFS_CLEAR_HALT         _IOR('U', 21, unsigned int)
81 #define USBDEVFS_DISCONNECT         _IO('U', 22)
82 #define USBDEVFS_CONNECT            _IO('U', 23)
83 #define USBDEVFS_GET_CAPABILITIES   _IOR('U', 26, unsigned int)
84 #define USBDEVFS_DISCONNECT_CLAIM   _IOR('U', 27, struct UsbAdapterDisconnectClaim)
85 #define USBDEVFS_ALLOC_STREAMS      _IOR('U', 28, struct UsbAdapterStreams)
86 #define USBDEVFS_FREE_STREAMS       _IOR('U', 29, struct UsbAdapterStreams)
87 #define USBDEVFS_GET_SPEED          _IO('U', 31)
88 
89 struct UsbAdapterBulkTransfer {
90     unsigned int ep;
91     unsigned int len;
92     unsigned int timeout; /* in milliseconds */
93     void *data;
94 };
95 
96 struct UsbAdapterSetInterface {
97     unsigned int interface;
98     unsigned int altSetting;
99 };
100 
101 struct UsbAdapterStreams {
102     unsigned int numStreams;
103     unsigned int numEps;
104     unsigned char eps[0];
105 };
106 
107 struct UsbAdapterGetdriver {
108     unsigned int interface;
109     char driver[MAX_DRIVER_NAME_LENGTH];
110 };
111 
112 struct UsbAdapterIoctl {
113     unsigned int interface;
114     unsigned int code;
115     void *data;
116 };
117 
118 struct UsbAdapterDisconnectClaim {
119     unsigned int interface;
120     unsigned int flags;
121     char driver[MAX_DRIVER_NAME_LENGTH];
122 };
123 
124 struct UsbOsAdapterOps {
125     int32_t (*init)(const struct UsbSession *session);
126     void (*exit)(const struct UsbSession *session);
127     struct UsbDeviceHandle *(*openDevice)(struct UsbSession *session, uint8_t busNum, uint8_t usbAddr);
128     void (*closeDevice)(struct UsbDeviceHandle *devHandle);
129     int32_t (*getConfigDescriptor)(const struct UsbDevice *device, uint8_t configIndex, void *buffer, size_t len);
130     int32_t (*getConfiguration)(const struct UsbDeviceHandle *devHandle, uint8_t *activeConfig);
131     int32_t (*setConfiguration)(struct UsbDeviceHandle *devHandle, int32_t activeConfig);
132     int32_t (*claimInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
133     int32_t (*releaseInterface)(const struct UsbDeviceHandle *devHandle, unsigned int interfaceNumber);
134     int32_t (*setInterfaceAltsetting)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber,
135         uint8_t altsetting);
136     int32_t (*clearHalt)(const struct UsbDeviceHandle *devHandle, unsigned int endpoint);
137     int32_t (*resetDevice)(struct UsbDeviceHandle *devHandle);
138     struct UsbHostRequest *(*allocRequest)(const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t len);
139     struct UsbHostRequest *(*allocRequestByMmap)(const struct UsbDeviceHandle *handle, int32_t isoPackets, size_t len);
140     int32_t (*freeRequest)(struct UsbHostRequest *request);
141     int32_t (*freeRequestByMmap)(struct UsbHostRequest *request);
142     int32_t (*submitRequest)(struct UsbHostRequest *request);
143     int32_t (*cancelRequest)(struct UsbHostRequest *request);
144     int32_t (*urbCompleteHandle)(const struct UsbDeviceHandle *devHandle);
145     int32_t (*detachKernelDriverAndClaim)(const struct UsbDeviceHandle *handle, uint32_t interfaceNumber);
146     int32_t (*attachKernelDriver)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
147     int32_t (*detachKernelDriver)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
148     int32_t (*usbControlMsg)(const struct UsbDeviceHandle *devHandle, struct UsbControlRequestData *ctrlData);
149     int32_t (*getUsbSpeed)(const struct UsbDeviceHandle *handle);
150     bool (*getInterfaceActiveStatus)(const struct UsbDeviceHandle *devHandle, uint8_t interfaceNumber);
151     int32_t (*getDeviceSpeed)(const struct UsbDeviceHandle *devHandle);
152     int32_t (*getDeviceFd)(struct UsbDevice *dev, mode_t mode);
153 };
154 #ifdef __cplusplus
155 extern "C" {
156 #endif
157 
158 struct UsbOsAdapterOps *UsbAdapterGetOps(void);
159 UsbRawTidType UsbAdapterGetTid(void);
160 int32_t UsbAdapterRegisterSignal(void);
161 int32_t UsbAdapterKillSignal(struct UsbDeviceHandle *devHandle, UsbRawTidType tid);
162 int32_t AdapterAtomicInc(OsalAtomic *v);
163 int32_t AdapterAtomicDec(OsalAtomic *v);
164 
165 #ifdef __cplusplus
166 }
167 #endif
168 #endif /* USB_HOST_LINUX_ADAPTER_H */
169