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