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 HDF_USB_SERIAL_H 17094332d3Sopenharmony_ci#define HDF_USB_SERIAL_H 18094332d3Sopenharmony_ci 19094332d3Sopenharmony_ci#include "data_fifo.h" 20094332d3Sopenharmony_ci#include "hdf_base.h" 21094332d3Sopenharmony_ci#include "hdf_device_desc.h" 22094332d3Sopenharmony_ci#include "usb_ddk.h" 23094332d3Sopenharmony_ci#include "usb_ddk_interface.h" 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_ci#define USB_MAX_INTERFACES 32 26094332d3Sopenharmony_ci#define DATARATE 9600 27094332d3Sopenharmony_ci#define DATA_BITS_LENGTH 8 28094332d3Sopenharmony_ci#define ACM_NW 16 29094332d3Sopenharmony_ci#define ACM_NR 16 30094332d3Sopenharmony_ci#define READ_BUF_SIZE 8192 31094332d3Sopenharmony_ci#define DIRECTION_MASK 0x1 32094332d3Sopenharmony_ci#define USB_CTRL_SET_TIMEOUT 5000 33094332d3Sopenharmony_ci#define USB_PIPE_DIR_OFFSET 7 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_citypedef enum { 36094332d3Sopenharmony_ci CMD_OPEN_PARM = 0, 37094332d3Sopenharmony_ci CMD_CLOSE_PARM, 38094332d3Sopenharmony_ci CMD_WRITE_PARM, 39094332d3Sopenharmony_ci CMD_READ_PARM, 40094332d3Sopenharmony_ci CMD_GET_BAUDRATE, 41094332d3Sopenharmony_ci CMD_SET_BAUDRATE, 42094332d3Sopenharmony_ci CMD_WRITE_DATA_SYNC, 43094332d3Sopenharmony_ci CMD_READ_DATA_SYNC, 44094332d3Sopenharmony_ci CMD_CLASS_CTRL_SYNC, 45094332d3Sopenharmony_ci CMD_STD_CTRL_GET_DESCRIPTOR_CMD, 46094332d3Sopenharmony_ci CMD_STD_CTRL_GET_STATUS_CMD, 47094332d3Sopenharmony_ci CMD_STD_CTRL_GET_CONFIGURATION, 48094332d3Sopenharmony_ci CMD_STD_CTRL_GET_INTERFACE, 49094332d3Sopenharmony_ci CMD_STD_CTRL_GET_DESCRIPTOR_ASYNC, 50094332d3Sopenharmony_ci CMD_ADD_INTERFACE, 51094332d3Sopenharmony_ci CMD_REMOVE_INTERFACE, 52094332d3Sopenharmony_ci} SerialOPCmd; 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_citypedef enum { 55094332d3Sopenharmony_ci HOST_ACM_SYNC_READ = 1, 56094332d3Sopenharmony_ci HOST_ACM_SYNC_WRITE, 57094332d3Sopenharmony_ci HOST_ACM_ASYNC_READ, 58094332d3Sopenharmony_ci HOST_ACM_ASYNC_WRITE, 59094332d3Sopenharmony_ci HOST_ACM_CTRL_READ, 60094332d3Sopenharmony_ci HOST_ACM_CTRL_WRITE, 61094332d3Sopenharmony_ci HOST_ACM_CTRL_CLASS_SYNC, 62094332d3Sopenharmony_ci HOST_ACM_CTRL_GET_STATUS, 63094332d3Sopenharmony_ci HOST_ACM_CTRL_SYNC_DESCRIPTOR, 64094332d3Sopenharmony_ci HOST_ACM_CTRL_ASYNC_DESCRIPTOR, 65094332d3Sopenharmony_ci HOST_ACM_CTRL_GET_CONFIGURATION, 66094332d3Sopenharmony_ci HOST_ACM_CTRL_GET_INTERFACE, 67094332d3Sopenharmony_ci HOST_ACM_SPEED_TEST, 68094332d3Sopenharmony_ci HOST_ACM_SET_BAUDRATE, 69094332d3Sopenharmony_ci HOST_ACM_GET_BAUDRATE, 70094332d3Sopenharmony_ci HOST_ACM_ADD_INTERFACE, 71094332d3Sopenharmony_ci HOST_ACM_REMOVE_INTERFACE, 72094332d3Sopenharmony_ci} AcmModuleTestCmdType; 73094332d3Sopenharmony_ci 74094332d3Sopenharmony_cistruct AcmDevice; 75094332d3Sopenharmony_ci 76094332d3Sopenharmony_cistruct AcmWb { 77094332d3Sopenharmony_ci struct UsbRequest *request; 78094332d3Sopenharmony_ci struct AcmDevice *instance; 79094332d3Sopenharmony_ci uint8_t *buf; 80094332d3Sopenharmony_ci uint32_t len; 81094332d3Sopenharmony_ci int32_t use; 82094332d3Sopenharmony_ci}; 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_cistruct AcmRb { 85094332d3Sopenharmony_ci uint8_t *base; 86094332d3Sopenharmony_ci int32_t size; 87094332d3Sopenharmony_ci int32_t index; 88094332d3Sopenharmony_ci int32_t use; 89094332d3Sopenharmony_ci struct AcmDevice *instance; 90094332d3Sopenharmony_ci}; 91094332d3Sopenharmony_ci 92094332d3Sopenharmony_cistruct SerialDevice { 93094332d3Sopenharmony_ci struct AcmDevice *acm; 94094332d3Sopenharmony_ci struct UsbCdcLineCoding lineCoding; 95094332d3Sopenharmony_ci struct OsalMutex lock; 96094332d3Sopenharmony_ci struct DataFifo readFifo; 97094332d3Sopenharmony_ci}; 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_cistruct AcmDevice { 100094332d3Sopenharmony_ci struct IDeviceIoService service; 101094332d3Sopenharmony_ci struct HdfDeviceObject *device; 102094332d3Sopenharmony_ci struct UsbInterface *ctrIface; 103094332d3Sopenharmony_ci struct UsbPipeInfo *ctrPipe; 104094332d3Sopenharmony_ci struct UsbPipeInfo *intPipe; 105094332d3Sopenharmony_ci struct UsbPipeInfo *dataInPipe; 106094332d3Sopenharmony_ci struct UsbPipeInfo *dataOutPipe; 107094332d3Sopenharmony_ci struct AcmWb wb[ACM_NW]; 108094332d3Sopenharmony_ci struct AcmRb rb[ACM_NR]; 109094332d3Sopenharmony_ci struct UsbPipeInfo wPipeInfo; 110094332d3Sopenharmony_ci struct OsalMutex writeLock; 111094332d3Sopenharmony_ci struct OsalMutex readLock; 112094332d3Sopenharmony_ci struct UsbRequest *notifyReq; 113094332d3Sopenharmony_ci struct UsbRequest *readReq[ACM_NR]; 114094332d3Sopenharmony_ci struct UsbRequest *writeReq; 115094332d3Sopenharmony_ci struct UsbRequest *ctrlReq; 116094332d3Sopenharmony_ci struct OsalMutex lock; 117094332d3Sopenharmony_ci struct UsbInterface *itface; 118094332d3Sopenharmony_ci UsbInterfaceHandle *devHandle[USB_MAX_INTERFACES]; 119094332d3Sopenharmony_ci UsbInterfaceHandle *ctrDevHandle; 120094332d3Sopenharmony_ci struct UsbSession *session; 121094332d3Sopenharmony_ci struct SerialDevice *port; 122094332d3Sopenharmony_ci uint32_t nbIndex; 123094332d3Sopenharmony_ci uint32_t nbSize; 124094332d3Sopenharmony_ci int32_t transmitting; 125094332d3Sopenharmony_ci int32_t ctrlReqNum; 126094332d3Sopenharmony_ci uint8_t busNum; 127094332d3Sopenharmony_ci uint8_t devAddr; 128094332d3Sopenharmony_ci uint8_t interfaceCnt; 129094332d3Sopenharmony_ci uint8_t *notificationBuffer; 130094332d3Sopenharmony_ci uint8_t interfaceIndex[USB_MAX_INTERFACES]; 131094332d3Sopenharmony_ci struct UsbInterface *iface[USB_MAX_INTERFACES]; 132094332d3Sopenharmony_ci uint32_t ctrlSize; 133094332d3Sopenharmony_ci uint32_t intSize; 134094332d3Sopenharmony_ci uint32_t writeSize; 135094332d3Sopenharmony_ci uint32_t readSize; 136094332d3Sopenharmony_ci struct UsbCdcLineCoding lineCoding; 137094332d3Sopenharmony_ci bool initFlag; 138094332d3Sopenharmony_ci}; 139094332d3Sopenharmony_ci 140094332d3Sopenharmony_cistruct UsbControlParams { 141094332d3Sopenharmony_ci uint8_t request; 142094332d3Sopenharmony_ci UsbRequestTargetType target; 143094332d3Sopenharmony_ci UsbControlRequestType reqType; 144094332d3Sopenharmony_ci UsbRequestDirection directon; 145094332d3Sopenharmony_ci uint16_t value; 146094332d3Sopenharmony_ci uint16_t index; 147094332d3Sopenharmony_ci void *data; 148094332d3Sopenharmony_ci uint16_t size; 149094332d3Sopenharmony_ci}; 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_cistruct UsbDescriptorParams { 152094332d3Sopenharmony_ci UsbInterfaceHandle *devHandle; 153094332d3Sopenharmony_ci struct UsbRequest *request; 154094332d3Sopenharmony_ci uint8_t type; 155094332d3Sopenharmony_ci uint8_t index; 156094332d3Sopenharmony_ci void *buf; 157094332d3Sopenharmony_ci uint16_t size; 158094332d3Sopenharmony_ci}; 159094332d3Sopenharmony_ci#endif 160