142103316Sopenharmony_ci/*
242103316Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
342103316Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
442103316Sopenharmony_ci * you may not use this file except in compliance with the License.
542103316Sopenharmony_ci * You may obtain a copy of the License at
642103316Sopenharmony_ci *
742103316Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
842103316Sopenharmony_ci *
942103316Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1042103316Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1142103316Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1242103316Sopenharmony_ci * See the License for the specific language governing permissions and
1342103316Sopenharmony_ci * limitations under the License.
1442103316Sopenharmony_ci */
1542103316Sopenharmony_ci
1642103316Sopenharmony_ci#ifndef USB_COMMON_H
1742103316Sopenharmony_ci#define USB_COMMON_H
1842103316Sopenharmony_ci
1942103316Sopenharmony_ci#include <cstdint>
2042103316Sopenharmony_ci#include <utility>
2142103316Sopenharmony_ci
2242103316Sopenharmony_ci#include "hilog_wrapper.h"
2342103316Sopenharmony_cinamespace OHOS {
2442103316Sopenharmony_cinamespace USB {
2542103316Sopenharmony_ci/**
2642103316Sopenharmony_ci * Invalid usb int value
2742103316Sopenharmony_ci */
2842103316Sopenharmony_ciconstexpr int32_t INVALID_USB_INT_VALUE = -1;
2942103316Sopenharmony_ci
3042103316Sopenharmony_ci/**
3142103316Sopenharmony_ci * Bitmask used for extracting the USBEndpoint type from it's address
3242103316Sopenharmony_ci */
3342103316Sopenharmony_ciconstexpr uint32_t USB_ENDPOINT_XFERTYPE_MASK = 0x03;
3442103316Sopenharmony_ci
3542103316Sopenharmony_ci/**
3642103316Sopenharmony_ci * Control USBEndpoint type
3742103316Sopenharmony_ci */
3842103316Sopenharmony_ciconstexpr int32_t USB_ENDPOINT_XFER_CONTROL = 0;
3942103316Sopenharmony_ci
4042103316Sopenharmony_ci/**
4142103316Sopenharmony_ci * Isochronous USBEndpoint type
4242103316Sopenharmony_ci */
4342103316Sopenharmony_ciconstexpr int32_t USB_ENDPOINT_XFER_ISOC = 1;
4442103316Sopenharmony_ci
4542103316Sopenharmony_ci/**
4642103316Sopenharmony_ci * Bulk USBEndpoint type
4742103316Sopenharmony_ci */
4842103316Sopenharmony_ciconstexpr int32_t USB_ENDPOINT_XFER_BULK = 2;
4942103316Sopenharmony_ci
5042103316Sopenharmony_ci/**
5142103316Sopenharmony_ci * Interrupt USBEndpoint type
5242103316Sopenharmony_ci */
5342103316Sopenharmony_ciconstexpr int32_t USB_ENDPOINT_XFER_INT = 3;
5442103316Sopenharmony_ci
5542103316Sopenharmony_ci/**
5642103316Sopenharmony_ci * Bitmask used for extracting the USBEndpoint number from it's address
5742103316Sopenharmony_ci */
5842103316Sopenharmony_ciconstexpr uint32_t USB_ENDPOINT_NUMBER_MASK = 0x0f;
5942103316Sopenharmony_ci
6042103316Sopenharmony_ci/**
6142103316Sopenharmony_ci * Bitmask used for extracting the USBEndpoint direction from it's address
6242103316Sopenharmony_ci */
6342103316Sopenharmony_ciconstexpr uint32_t USB_ENDPOINT_DIR_MASK = 0x80;
6442103316Sopenharmony_ci
6542103316Sopenharmony_ci/**
6642103316Sopenharmony_ci * Used to signify direction of data for USBEndpoint is OUT, host to device
6742103316Sopenharmony_ci */
6842103316Sopenharmony_ciconstexpr uint32_t USB_ENDPOINT_DIR_OUT = 0;
6942103316Sopenharmony_ci
7042103316Sopenharmony_ci/**
7142103316Sopenharmony_ci * Used to signify direction of data for USBEndpoint is IN, device to host
7242103316Sopenharmony_ci */
7342103316Sopenharmony_ciconstexpr uint32_t USB_ENDPOINT_DIR_IN = 0x80;
7442103316Sopenharmony_ci
7542103316Sopenharmony_ci/**
7642103316Sopenharmony_ci * Bitmask for self power in the USBConfig
7742103316Sopenharmony_ci */
7842103316Sopenharmony_ciconstexpr uint32_t USB_CFG_SELF_POWERED = 0x80;
7942103316Sopenharmony_ci
8042103316Sopenharmony_ci/**
8142103316Sopenharmony_ci * Bitmask for remote wakeup in the USBConfig
8242103316Sopenharmony_ci */
8342103316Sopenharmony_ciconstexpr uint32_t USB_CFG_REMOTE_WAKEUP = 0x20;
8442103316Sopenharmony_ci
8542103316Sopenharmony_ci#define INVALID_STRING_VALUE ("")
8642103316Sopenharmony_ci#define RETURN_IF_WITH_RET(cond, retval) \
8742103316Sopenharmony_ci    if (cond) {                          \
8842103316Sopenharmony_ci        return (retval);                 \
8942103316Sopenharmony_ci    }
9042103316Sopenharmony_ci#define RETURN_IF(cond) \
9142103316Sopenharmony_ci    if (cond) {         \
9242103316Sopenharmony_ci        return;         \
9342103316Sopenharmony_ci    }
9442103316Sopenharmony_ci#define RETURN_IF_WITH_LOG(cond, loginfo)                                    \
9542103316Sopenharmony_ci    do {                                                                     \
9642103316Sopenharmony_ci        if (cond) {                                                          \
9742103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s " #loginfo " ", __func__); \
9842103316Sopenharmony_ci            return;                                                          \
9942103316Sopenharmony_ci        }                                                                    \
10042103316Sopenharmony_ci    } while (0)
10142103316Sopenharmony_ci
10242103316Sopenharmony_ci#define READ_PARCEL_NO_RET(parcel, type, out)                                       \
10342103316Sopenharmony_ci    do {                                                                            \
10442103316Sopenharmony_ci        if (!(parcel).Read##type(out)) {                                            \
10542103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s read " #out " failed", __func__); \
10642103316Sopenharmony_ci            return;                                                                 \
10742103316Sopenharmony_ci        }                                                                           \
10842103316Sopenharmony_ci    } while (0)
10942103316Sopenharmony_ci
11042103316Sopenharmony_ci#define WRITE_PARCEL_NO_RET(parcel, type, data)                                       \
11142103316Sopenharmony_ci    do {                                                                              \
11242103316Sopenharmony_ci        if (!(parcel).Write##type(data)) {                                            \
11342103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s write " #data " failed", __func__); \
11442103316Sopenharmony_ci            return;                                                                   \
11542103316Sopenharmony_ci        }                                                                             \
11642103316Sopenharmony_ci    } while (0)
11742103316Sopenharmony_ci
11842103316Sopenharmony_ci#define WRITE_PARCEL_AND_RETURN_FALSE_WHEN_FAIL(type, parcel, data)        \
11942103316Sopenharmony_ci    do {                                                                 \
12042103316Sopenharmony_ci        if (!(parcel).Write##type(data)) {                               \
12142103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s write " #data " failed", __func__); \
12242103316Sopenharmony_ci            return false;                                                \
12342103316Sopenharmony_ci        }                                                                \
12442103316Sopenharmony_ci    } while (0)
12542103316Sopenharmony_ci
12642103316Sopenharmony_ci#define READ_PARCEL_WITH_RET(parcel, type, out, retval)                             \
12742103316Sopenharmony_ci    do {                                                                            \
12842103316Sopenharmony_ci        if (!(parcel).Read##type(out)) {                                            \
12942103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s read " #out " failed", __func__); \
13042103316Sopenharmony_ci            return (retval);                                                        \
13142103316Sopenharmony_ci        }                                                                           \
13242103316Sopenharmony_ci    } while (0)
13342103316Sopenharmony_ci
13442103316Sopenharmony_ci#define WRITE_PARCEL_WITH_RET(parcel, type, data, retval)                             \
13542103316Sopenharmony_ci    do {                                                                              \
13642103316Sopenharmony_ci        if (!(parcel).Write##type(data)) {                                            \
13742103316Sopenharmony_ci            USB_HILOGE(MODULE_COMMON, "%{public}s write " #data " failed", __func__); \
13842103316Sopenharmony_ci            return (retval);                                                          \
13942103316Sopenharmony_ci        }                                                                             \
14042103316Sopenharmony_ci    } while (0)
14142103316Sopenharmony_ci
14242103316Sopenharmony_citemplate <typename E>
14342103316Sopenharmony_ciconstexpr auto ToUnderlying(E e) noexcept
14442103316Sopenharmony_ci{
14542103316Sopenharmony_ci    return static_cast<std::underlying_type_t<E>>(e);
14642103316Sopenharmony_ci}
14742103316Sopenharmony_ci} // namespace USB
14842103316Sopenharmony_ci} // namespace OHOS
14942103316Sopenharmony_ci
15042103316Sopenharmony_ci#endif // USB_COMMON_H
151