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