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 HDF_USB_CDCACM_H
17#define HDF_USB_CDCACM_H
18
19#include "data_fifo.h"
20#include "hdf_base.h"
21#include "hdf_device_desc.h"
22#include "osal_atomic.h"
23#include "osal_mutex.h"
24#include "usbfn_request.h"
25#include "usb_ddk.h"
26#include "usb_object.h"
27
28#define USB_MAX_PACKET_SIZE     0x40
29
30enum UsbSerialCmd {
31    USB_SERIAL_OPEN = 0,
32    USB_SERIAL_CLOSE,
33    USB_SERIAL_READ,
34    USB_SERIAL_WRITE,
35    USB_SERIAL_GET_BAUDRATE,
36    USB_SERIAL_SET_BAUDRATE,
37    USB_SERIAL_SET_PROP,
38    USB_SERIAL_GET_PROP,
39    USB_SERIAL_REGIST_PROP,
40    USB_SERIAL_WRITE_SPEED,
41    USB_SERIAL_WRITE_GET_TEMP_SPEED,
42    USB_SERIAL_WRITE_SPEED_DONE,
43    USB_SERIAL_WRITE_GET_TEMP_SPEED_UINT32,
44    USB_SERIAL_READ_SPEED,
45    USB_SERIAL_READ_GET_TEMP_SPEED,
46    USB_SERIAL_READ_SPEED_DONE,
47    USB_SERIAL_READ_GET_TEMP_SPEED_UINT32,
48    USB_SERIAL_INIT = 100,
49    USB_SERIAL_RELEASE = 101,
50};
51
52struct UsbSerial {
53    struct UsbAcmDevice         *acm;
54    struct UsbCdcLineCoding     lineCoding;
55    struct OsalMutex            lock;
56
57    struct DListHead            readPool;
58    struct DListHead            readQueue;
59    int32_t                     readStarted;
60    int32_t                     readAllocated;
61    struct DataFifo             readFifo;
62    struct DListHead            writePool;
63    int32_t                     writeStarted;
64    int32_t                     writeAllocated;
65    struct DataFifo             writeFifo;
66    bool                        writeBusy;
67
68    bool                        suspended;
69    bool                        startDelayed;
70    int32_t                         refCount;
71};
72
73struct AcmNotifyMethod {
74    void (*Connect)(struct UsbAcmDevice *acm);
75    void (*Disconnect)(struct UsbAcmDevice *acm);
76    int32_t (*SendBreak)(struct UsbAcmDevice *acm, int32_t duration);
77};
78
79struct UsbAcmPipe {
80    uint8_t                     id;
81    uint16_t                    maxPacketSize;
82    struct UsbFnInterface       *ctrlIface;
83};
84
85struct UsbAcmInterface {
86    struct UsbFnInterface       *fn;
87    UsbFnInterfaceHandle        handle;
88};
89
90struct UsbAcmDevice {
91    struct IDeviceIoService     service;
92    struct HdfDeviceObject      *device;
93    struct UsbFnDevice          *fnDev;
94    struct UsbAcmInterface      ctrlIface;
95    struct UsbAcmInterface      dataIface;
96    struct UsbAcmPipe           notifyPipe;
97    struct UsbAcmPipe           dataInPipe;
98    struct UsbAcmPipe           dataOutPipe;
99
100    struct DListHead            ctrlPool;
101    int32_t                     ctrlReqNum;
102    struct UsbFnRequest         *notifyReq;
103    struct OsalMutex            lock;
104    bool                        pending;
105    bool                        initFlag;
106    uint32_t                    enableEvtCnt;
107    char                        *udcName;
108    struct UsbSerial            *port;
109    struct UsbCdcLineCoding     lineCoding;
110    uint16_t                    serialState;
111#define SERIAL_STATE_DCD        (1 << 0)
112#define SERIAL_STATE_DSR        (1 << 1)
113#define SERIAL_STATE_BREAK      (1 << 2)
114#define SERIAL_STATE_RING       (1 << 3)
115#define SERIAL_STATE_FRAMING    (1 << 4)
116#define SERIAL_STATE_PARITY     (1 << 5)
117#define SERIAL_STATE_OVERRUN    (1 << 6)
118
119    uint16_t                    handshakeBits;
120    /* notification callbacks */
121    struct AcmNotifyMethod      *notify;
122};
123
124struct CtrlInfo {
125    uint8_t                     request;
126    struct UsbAcmDevice         *acm;
127};
128
129#endif /* HDF_USB_CDCACM_H */
130