| /* |
| * Copyright 2019 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef ARC_ADBD_ADBD_H_ |
| #define ARC_ADBD_ADBD_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include <base/files/file_path.h> |
| #include <base/files/scoped_file.h> |
| |
| namespace adbd { |
| // Refer to the man page of vsock for special VM addresses [0-2]. |
| constexpr uint32_t kFirstGuestVmAddr = 3; |
| |
| // Initial value of cid argument. It means a valid cid of guest VM |
| // hasn't been provided. It doesn't bear the meaning of any special |
| // addresses defined in the man page of vsock and Linux header files |
| // although its value is in their range. |
| constexpr uint32_t kVmAddrCidInvalid = 0; |
| |
| // The path of USB function FS where endpoints of ADB interface live. |
| constexpr char kFunctionFSPath[] = "/dev/usb-ffs/adb"; |
| |
| // Represents a loadable kernel module. This is then converted to a modprobe(8) |
| // invocation. |
| struct AdbdConfigurationKernelModule { |
| // Name of the kernel module. |
| std::string name; |
| |
| // Optional parameters to the module. |
| std::vector<std::string> parameters; |
| }; |
| |
| // Represents the configuration for the service. |
| struct AdbdConfiguration { |
| // The USB product ID. Is SoC-specific. |
| std::string usb_product_id; |
| |
| // Optional list of kernel modules that need to be loaded before setting up |
| // the USB gadget. |
| std::vector<AdbdConfigurationKernelModule> kernel_modules; |
| }; |
| |
| // Creates a FIFO at |path|, owned and only writable by the Android shell user. |
| bool CreatePipe(const base::FilePath& path); |
| |
| // Returns the USB product ID for the current device, or an empty string if the |
| // device does not support ADB over USB. |
| bool GetConfiguration(AdbdConfiguration* config); |
| |
| // TODO(hidehiko): Remove once libchrome rolls and provides this method. |
| std::string GetStrippedReleaseBoard(); |
| |
| // Returns the name of the UDC driver that is available in the system, or an |
| // empty string if none are available. |
| std::string GetUDCDriver(); |
| |
| // Sets up the ConfigFS files to be able to use the ADB gadget. The |
| // |serialnumber| parameter is used to setup how the device appears in "adb |
| // devices". The |usb_product_id| and |usb_product_name| parameters are used so |
| // that the USB gadget self-reports as Android running in Chrome OS. |
| bool SetupConfigFS(const std::string& serialnumber, |
| const std::string& usb_product_id, |
| const std::string& usb_product_name); |
| |
| // Sets up FunctionFS and returns an open FD to the control endpoint of the |
| // fully setup ADB gadget. The gadget will be torn down if the FD is closed when |
| // this program exits. |
| base::ScopedFD SetupFunctionFS(const std::string& udc_driver_name); |
| |
| // Sets up all the necessary kernel modules for the device. |
| bool SetupKernelModules( |
| const std::vector<AdbdConfigurationKernelModule>& kernel_modules); |
| |
| // Bind-mount the bulk-in/bulk-out endpoints into the shared mount for |
| // container. |
| bool BindMountUsbBulkEndpoints(); |
| |
| // Starts Arcvm usb adb bridge. This function will create two channels |
| // to relay ADB data between USB endpoints and a socket to the ARC adb |
| // proxy service. This function creates threads that are expected to run |
| // until the whole process exits, so it should not return but waiting |
| // for the threads to join in the normal cases. The cid (>=3) of VM must |
| // be provided for vsock connection. |
| void StartArcVmAdbBridge(uint32_t cid); |
| } // namespace adbd |
| |
| #endif // ARC_ADBD_ADBD_H_ |