• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef HDC_HOST_USB_H
16 #define HDC_HOST_USB_H
17 #include "host_common.h"
18 
19 namespace Hdc {
20 class HdcHostUSB : public HdcUSBBase {
21 public:
22     HdcHostUSB(const bool serverOrDaemonIn, void *ptrMainBase, void *ctxUSBin);
23     virtual ~HdcHostUSB();
24     int Initial();
25     void InitLogging(void *ctxUSB);
26     int SendUSBRaw(HSession hSession, uint8_t *data, const int length) override;
27     HSession ConnectDetectDaemon(const HSession hSession, const HDaemonInfo pdi);
28     void Stop();
29     void RemoveIgnoreDevice(string &mountInfo);
30 
31 private:
32     enum UsbCheckStatus {
33         HOST_USB_IGNORE = 1,
34         HOST_USB_READY,
35         HOST_USB_REGISTER,
36     };
37     static int LIBUSB_CALL HotplugHostUSBCallback(libusb_context *ctx, libusb_device *device,
38                                                   libusb_hotplug_event event, void *userData);
39     static void UsbWorkThread(void *arg);  // 3rd thread
40     static void WatchUsbNodeChange(uv_timer_t *handle);
41     static void KickoutZombie(HSession hSession);
42     static void LIBUSB_CALL USBBulkCallback(struct libusb_transfer *transfer);
43     int StartupUSBWork();
44     void CheckUsbEndpoint(int& ret, HUSB hUSB, libusb_config_descriptor *descConfig);
45     int CheckActiveConfig(libusb_device *device, HUSB hUSB, libusb_device_descriptor& desc);
46     int OpenDeviceMyNeed(HUSB hUSB);
47     bool HasValidDevice(libusb_device *device);
48     int CheckDescriptor(HUSB hUSB, libusb_device_descriptor& desc);
49     bool IsDebuggableDev(const struct libusb_interface_descriptor *ifDescriptor);
50     bool ReadyForWorkThread(HSession hSession) override;
51     bool FindDeviceByID(HUSB hUSB, const char *usbMountPoint, libusb_context *ctxUSB);
52     bool DetectMyNeed(libusb_device *device, string &sn);
53     void RestoreHdcProtocol(HUSB hUsb, const uint8_t *buf, int bufSize);
54     void UpdateUSBDaemonInfo(HUSB hUSB, HSession hSession, uint8_t connStatus);
55     void BeginUsbRead(HSession hSession);
56     void ReviewUsbNodeLater(string &nodeKey);
57     void CancelUsbIo(HSession hSession) override;
58     int UsbToHdcProtocol(uv_stream_t *stream, uint8_t *appendData, int dataSize) override;
59     int SubmitUsbBio(HSession hSession, bool sendOrRecv, uint8_t *buf, int bufSize);
60 
61     libusb_context *ctxUSB;
62     uv_timer_t devListWatcher;
63     map<string, UsbCheckStatus> mapIgnoreDevice;
64 
65 private:
66     uv_thread_t threadUsbWork;
67 };
68 }  // namespace Hdc
69 #endif
70