1 /*
2  * Copyright (c) 2024 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 USB_INTERFACE_TYPE_H
17 #define USB_INTERFACE_TYPE_H
18 #include "usb_common.h"
19 #include "message_parcel.h"
20 
21 namespace OHOS {
22 namespace USB {
23 enum InterfaceType {
24     TYPE_INTERFACE,
25     TYPE_STORAGE,
26     TYPE_AUDIO,
27     TYPE_HID,
28     TYPE_PHYSICAL,
29     TYPE_IMAGE,
30     TYPE_PRINTER,
31     TYPE_COMMUNICATION,
32     TYPE_FULL_SPEED_HUB,
33     TYPE_FULL_SPEED_HUB_S,
34     TYPE_FULL_SPEED_HUB_M,
35     TYPE_CDC_DATA,
36     TYPE_SMART_CARD,
37     TYPE_CONTENT_SECURTIY,
38     TYPE_VIDEO,
39     TYPE_PERSONAL_HEALTHCARE,
40     TYPE_AVCONTROL,
41     TYPE_AVV_STREAMING,
42     TYPE_AVA_STREAMING,
43     TYPE_BILLBOARD,
44     TYPE_TYPEC_BRIDGE,
45     TYPE_BDP,
46     TYPE_MCTP_MANA_1,
47     TYPE_MCTP_MANA_2,
48     TYPE_MCTP_HOST_1,
49     TYPE_MCTP_HOST_2,
50     TYPE_I3C,
51     TYPE_DIAGNOSTIC_1,
52     TYPE_DIAGNOSTIC_2,
53     TYPE_DIAGNOSTIC_3,
54     TYPE_DIAGNOSTIC_4,
55     TYPE_DIAGNOSTIC_5,
56     TYPE_DIAGNOSTIC_6,
57     TYPE_DIAGNOSTIC_7,
58     TYPE_DIAGNOSTIC_8,
59     TYPE_DIAGNOSTIC_9,
60     TYPE_DIAGNOSTIC_10,
61     TYPE_DIAGNOSTIC_11,
62     TYPE_DIAGNOSTIC_12,
63     TYPE_DIAGNOSTIC_13,
64     TYPE_DIAGNOSTIC_14,
65     TYPE_WIRLESS_CONTROLLER_1,
66     TYPE_WIRLESS_CONTROLLER_2,
67     TYPE_WIRLESS_CONTROLLER_3,
68     TYPE_WIRLESS_CONTROLLER_4,
69     TYPE_WIRLESS_CONTROLLER_5,
70     TYPE_WIRLESS_CONTROLLER_6,
71     TYPE_WIRLESS_CONTROLLER_7,
72     TYPE_MISCELLANEOUS_1,
73     TYPE_MISCELLANEOUS_2,
74     TYPE_MISCELLANEOUS_3,
75     TYPE_MISCELLANEOUS_4,
76     TYPE_MISCELLANEOUS_5,
77     TYPE_MISCELLANEOUS_6,
78     TYPE_MISCELLANEOUS_7,
79     TYPE_MISCELLANEOUS_8,
80     TYPE_MISCELLANEOUS_9,
81     TYPE_MISCELLANEOUS_10,
82     TYPE_MISCELLANEOUS_11,
83     TYPE_MISCELLANEOUS_12,
84     TYPE_MISCELLANEOUS_13,
85     TYPE_MISCELLANEOUS_14,
86     TYPE_MISCELLANEOUS_15,
87     TYPE_MISCELLANEOUS_16,
88     TYPE_MISCELLANEOUS_17,
89     TYPE_MISCELLANEOUS_18,
90     TYPE_MISCELLANEOUS_19,
91     TYPE_APPLICATION_SPE_1,
92     TYPE_APPLICATION_SPE_2,
93     TYPE_APPLICATION_SPE_3,
94     TYPE_APPLICATION_SPE_4,
95     TYPE_VENDOR_SPECIFIC,
96 };
97 
98 struct UsbDeviceType {
99     int32_t baseClass;
100     int32_t subClass;
101     int32_t protocol;
102     bool isDeviceType;
103     bool operator<(const UsbDeviceType &other) const
104     {
105         if (baseClass != other.baseClass) {
106             return baseClass < other.baseClass;
107         } else if (subClass != other.subClass) {
108             return subClass < other.subClass;
109         } else {
110             return protocol < other.protocol;
111         }
112     }
113     bool operator == (const UsbDeviceType &other) const
114     {
115         return (baseClass == other.baseClass) && (subClass == other.subClass) && (protocol == other.protocol) &&
116             (isDeviceType == other.isDeviceType);
117     }
UsbDeviceTypeUsbDeviceType118     UsbDeviceType (int32_t deviceBaseClass, int32_t sub, int32_t prot, bool deviceType)
119         : baseClass(deviceBaseClass), subClass(sub), protocol(prot), isDeviceType(deviceType) {};
UsbDeviceTypeUsbDeviceType120     UsbDeviceType (): baseClass(0), subClass(0), protocol(0), isDeviceType(0) {};
121     bool Marshalling(MessageParcel &parcel) const;
122     static bool Unmarshalling(MessageParcel &parcel, UsbDeviceType &usbDeviceType);
123     bool ReadFromParcel(MessageParcel &parcel);
124 };
125 
126 struct UsbDeviceId {
127     int32_t productId;
128     int32_t vendorId;
129 };
130 
131 const std::unordered_map<InterfaceType, std::vector<int32_t>> d_typeMap = {
132     {InterfaceType::TYPE_INTERFACE,             {0, 0, 0}},
133     {InterfaceType::TYPE_COMMUNICATION,         {2, -1, -1}},
134     {InterfaceType::TYPE_FULL_SPEED_HUB,        {9, 0, 0}},
135     {InterfaceType::TYPE_FULL_SPEED_HUB_S,      {9, 0, 1}},
136     {InterfaceType::TYPE_FULL_SPEED_HUB_M,      {9, 0, 2}},
137     {InterfaceType::TYPE_BILLBOARD,             {17, 0, 0}},
138     {InterfaceType::TYPE_DIAGNOSTIC_1,          {220, 1, 1}},
139     {InterfaceType::TYPE_DIAGNOSTIC_2,          {220, 2, 0}},
140     {InterfaceType::TYPE_DIAGNOSTIC_3,          {220, 2, 1}},
141     {InterfaceType::TYPE_DIAGNOSTIC_4,          {220, 3, 0}},
142     {InterfaceType::TYPE_DIAGNOSTIC_5,          {220, 3, 1}},
143     {InterfaceType::TYPE_DIAGNOSTIC_6,          {220, 4, 0}},
144     {InterfaceType::TYPE_DIAGNOSTIC_7,          {220, 4, 1}},
145     {InterfaceType::TYPE_DIAGNOSTIC_8,          {220, 5, 0}},
146     {InterfaceType::TYPE_DIAGNOSTIC_9,          {220, 5, 1}},
147     {InterfaceType::TYPE_DIAGNOSTIC_10,         {220, 6, 0}},
148     {InterfaceType::TYPE_DIAGNOSTIC_11,         {220, 6, 1}},
149     {InterfaceType::TYPE_DIAGNOSTIC_12,         {220, 7, 0}},
150     {InterfaceType::TYPE_DIAGNOSTIC_13,         {220, 7, 1}},
151     {InterfaceType::TYPE_DIAGNOSTIC_14,         {220, 8, 0}},
152     {InterfaceType::TYPE_MISCELLANEOUS_1,       {239, 1, 1}},
153     {InterfaceType::TYPE_MISCELLANEOUS_2,       {239, 1, 2}},
154     {InterfaceType::TYPE_MISCELLANEOUS_3,       {239, 2, 1}},
155     {InterfaceType::TYPE_MISCELLANEOUS_4,       {239, 2, 2}},
156     {InterfaceType::TYPE_VENDOR_SPECIFIC,       {255, -1, -1}}
157 };
158 
159 const std::unordered_map<InterfaceType, std::vector<int32_t>> g_typeMap = {
160     {InterfaceType::TYPE_AUDIO,                 {1, -1, -1}},
161     {InterfaceType::TYPE_COMMUNICATION,         {2, -1, -1}},
162     {InterfaceType::TYPE_HID,                   {3, -1, -1}},
163     {InterfaceType::TYPE_PHYSICAL,              {5, -1, -1}},
164     {InterfaceType::TYPE_IMAGE,                 {6, 1, 1}},
165     {InterfaceType::TYPE_PRINTER,               {7, -1, -1}},
166     {InterfaceType::TYPE_STORAGE,               {8, -1, -1}},
167     {InterfaceType::TYPE_CDC_DATA,              {10, -1, -1}},
168     {InterfaceType::TYPE_SMART_CARD,            {11, -1, -1}},
169     {InterfaceType::TYPE_CONTENT_SECURTIY,      {13, 0, 0}},
170     {InterfaceType::TYPE_VIDEO,                 {14, -1, -1}},
171     {InterfaceType::TYPE_PERSONAL_HEALTHCARE,   {15, -1, -1}},
172     {InterfaceType::TYPE_AVCONTROL,             {16, 1, 0}},
173     {InterfaceType::TYPE_AVV_STREAMING,         {16, 2, 0}},
174     {InterfaceType::TYPE_AVA_STREAMING,         {16, 3, 0}},
175     {InterfaceType::TYPE_TYPEC_BRIDGE,          {18, 0, 0}},
176     {InterfaceType::TYPE_BDP,                   {19, 0, 0}},
177     {InterfaceType::TYPE_MCTP_MANA_1,           {20, 0, 1}},
178     {InterfaceType::TYPE_MCTP_MANA_2,           {20, 0, 2}},
179     {InterfaceType::TYPE_MCTP_HOST_1,           {20, 1, 1}},
180     {InterfaceType::TYPE_MCTP_HOST_2,           {20, 1, 2}},
181     {InterfaceType::TYPE_I3C,                   {60, 0, 0}},
182     {InterfaceType::TYPE_DIAGNOSTIC_1,          {220, 1, 1}},
183     {InterfaceType::TYPE_DIAGNOSTIC_2,          {220, 2, 0}},
184     {InterfaceType::TYPE_DIAGNOSTIC_3,          {220, 2, 1}},
185     {InterfaceType::TYPE_DIAGNOSTIC_4,          {220, 3, 0}},
186     {InterfaceType::TYPE_DIAGNOSTIC_5,          {220, 3, 1}},
187     {InterfaceType::TYPE_DIAGNOSTIC_6,          {220, 4, 0}},
188     {InterfaceType::TYPE_DIAGNOSTIC_7,          {220, 4, 1}},
189     {InterfaceType::TYPE_DIAGNOSTIC_8,          {220, 5, 0}},
190     {InterfaceType::TYPE_DIAGNOSTIC_9,          {220, 5, 1}},
191     {InterfaceType::TYPE_DIAGNOSTIC_10,         {220, 6, 0}},
192     {InterfaceType::TYPE_DIAGNOSTIC_11,         {220, 6, 1}},
193     {InterfaceType::TYPE_DIAGNOSTIC_12,         {220, 7, 0}},
194     {InterfaceType::TYPE_DIAGNOSTIC_13,         {220, 7, 1}},
195     {InterfaceType::TYPE_DIAGNOSTIC_14,         {220, 8, 0}},
196     {InterfaceType::TYPE_WIRLESS_CONTROLLER_1,  {224, 1, 1}},
197     {InterfaceType::TYPE_WIRLESS_CONTROLLER_2,  {224, 1, 2}},
198     {InterfaceType::TYPE_WIRLESS_CONTROLLER_3,  {224, 1, 3}},
199     {InterfaceType::TYPE_WIRLESS_CONTROLLER_4,  {224, 1, 4}},
200     {InterfaceType::TYPE_WIRLESS_CONTROLLER_5,  {224, 2, 1}},
201     {InterfaceType::TYPE_WIRLESS_CONTROLLER_6,  {224, 2, 2}},
202     {InterfaceType::TYPE_WIRLESS_CONTROLLER_7,  {224, 2, 3}},
203     {InterfaceType::TYPE_MISCELLANEOUS_1,       {239, 1, 1}},
204     {InterfaceType::TYPE_MISCELLANEOUS_2,       {239, 1, 2}},
205     {InterfaceType::TYPE_MISCELLANEOUS_5,       {239, 3, 1}},
206     {InterfaceType::TYPE_MISCELLANEOUS_6,       {239, 4, 1}},
207     {InterfaceType::TYPE_MISCELLANEOUS_7,       {239, 4, 2}},
208     {InterfaceType::TYPE_MISCELLANEOUS_8,       {239, 4, 3}},
209     {InterfaceType::TYPE_MISCELLANEOUS_9,       {239, 4, 4}},
210     {InterfaceType::TYPE_MISCELLANEOUS_10,      {239, 4, 5}},
211     {InterfaceType::TYPE_MISCELLANEOUS_11,      {239, 4, 6}},
212     {InterfaceType::TYPE_MISCELLANEOUS_12,      {239, 4, 7}},
213     {InterfaceType::TYPE_MISCELLANEOUS_13,      {239, 5, 0}},
214     {InterfaceType::TYPE_MISCELLANEOUS_14,      {239, 5, 1}},
215     {InterfaceType::TYPE_MISCELLANEOUS_15,      {239, 5, 2}},
216     {InterfaceType::TYPE_MISCELLANEOUS_16,      {239, 6, 1}},
217     {InterfaceType::TYPE_MISCELLANEOUS_17,      {239, 6, 2}},
218     {InterfaceType::TYPE_MISCELLANEOUS_18,      {239, 7, 1}},
219     {InterfaceType::TYPE_MISCELLANEOUS_19,      {239, 7, 2}},
220     {InterfaceType::TYPE_APPLICATION_SPE_1,     {254, 1, 1}},
221     {InterfaceType::TYPE_APPLICATION_SPE_2,     {254, 2, 0}},
222     {InterfaceType::TYPE_APPLICATION_SPE_3,     {254, 3, 0}},
223     {InterfaceType::TYPE_APPLICATION_SPE_4,     {254, 3, 1}},
224 };
225 } // namespace USB
226 } // namespace OHOS
227 #endif // USB_INTERFACE_TYPE_H
228