xref: /aosp_15_r20/hardware/interfaces/usb/gadget/aidl/default/UsbGadget.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "android.hardware.usb.gadget.aidl-service"
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "UsbGadget.h"
20*4d7e907cSAndroid Build Coastguard Worker #include <dirent.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <fcntl.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <stdio.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <sys/inotify.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <sys/mount.h>
25*4d7e907cSAndroid Build Coastguard Worker #include <sys/stat.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <sys/types.h>
27*4d7e907cSAndroid Build Coastguard Worker #include <unistd.h>
28*4d7e907cSAndroid Build Coastguard Worker 
29*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/frameworks/stats/IStats.h>
30*4d7e907cSAndroid Build Coastguard Worker 
31*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
32*4d7e907cSAndroid Build Coastguard Worker namespace android {
33*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
34*4d7e907cSAndroid Build Coastguard Worker namespace usb {
35*4d7e907cSAndroid Build Coastguard Worker namespace gadget {
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker string enabledPath;
38*4d7e907cSAndroid Build Coastguard Worker constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
39*4d7e907cSAndroid Build Coastguard Worker constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
40*4d7e907cSAndroid Build Coastguard Worker constexpr char kAccessoryLimitCurrent[] = "i2c-max77759tcpc/usb_limit_accessory_current";
41*4d7e907cSAndroid Build Coastguard Worker constexpr char kAccessoryLimitCurrentEnable[] = "i2c-max77759tcpc/usb_limit_accessory_enable";
42*4d7e907cSAndroid Build Coastguard Worker 
UsbGadget()43*4d7e907cSAndroid Build Coastguard Worker UsbGadget::UsbGadget() : mGadgetIrqPath("") {
44*4d7e907cSAndroid Build Coastguard Worker }
45*4d7e907cSAndroid Build Coastguard Worker 
getUsbGadgetIrqPath()46*4d7e907cSAndroid Build Coastguard Worker Status UsbGadget::getUsbGadgetIrqPath() {
47*4d7e907cSAndroid Build Coastguard Worker     std::string irqs;
48*4d7e907cSAndroid Build Coastguard Worker     size_t read_pos = 0;
49*4d7e907cSAndroid Build Coastguard Worker     size_t found_pos = 0;
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker     if (!ReadFileToString(kProcInterruptsPath, &irqs)) {
52*4d7e907cSAndroid Build Coastguard Worker         ALOGE("cannot read all interrupts");
53*4d7e907cSAndroid Build Coastguard Worker         return Status::ERROR;
54*4d7e907cSAndroid Build Coastguard Worker     }
55*4d7e907cSAndroid Build Coastguard Worker 
56*4d7e907cSAndroid Build Coastguard Worker     while (true) {
57*4d7e907cSAndroid Build Coastguard Worker         found_pos = irqs.find_first_of("\n", read_pos);
58*4d7e907cSAndroid Build Coastguard Worker         if (found_pos == std::string::npos) {
59*4d7e907cSAndroid Build Coastguard Worker             ALOGI("the string of all interrupts is unexpected");
60*4d7e907cSAndroid Build Coastguard Worker             return Status::ERROR;
61*4d7e907cSAndroid Build Coastguard Worker         }
62*4d7e907cSAndroid Build Coastguard Worker 
63*4d7e907cSAndroid Build Coastguard Worker         std::string single_irq = irqs.substr(read_pos, found_pos - read_pos);
64*4d7e907cSAndroid Build Coastguard Worker 
65*4d7e907cSAndroid Build Coastguard Worker         if (single_irq.find("dwc3", 0) != std::string::npos) {
66*4d7e907cSAndroid Build Coastguard Worker             unsigned int dwc3_irq_number;
67*4d7e907cSAndroid Build Coastguard Worker             size_t dwc3_pos = single_irq.find_first_of(":");
68*4d7e907cSAndroid Build Coastguard Worker             if (!ParseUint(single_irq.substr(0, dwc3_pos), &dwc3_irq_number)) {
69*4d7e907cSAndroid Build Coastguard Worker                 ALOGI("unknown IRQ strings");
70*4d7e907cSAndroid Build Coastguard Worker                 return Status::ERROR;
71*4d7e907cSAndroid Build Coastguard Worker             }
72*4d7e907cSAndroid Build Coastguard Worker 
73*4d7e907cSAndroid Build Coastguard Worker             mGadgetIrqPath = kProcIrqPath + single_irq.substr(0, dwc3_pos) + kSmpAffinityList;
74*4d7e907cSAndroid Build Coastguard Worker             break;
75*4d7e907cSAndroid Build Coastguard Worker         }
76*4d7e907cSAndroid Build Coastguard Worker 
77*4d7e907cSAndroid Build Coastguard Worker         if (found_pos == irqs.npos) {
78*4d7e907cSAndroid Build Coastguard Worker             ALOGI("USB gadget doesn't start");
79*4d7e907cSAndroid Build Coastguard Worker             return Status::ERROR;
80*4d7e907cSAndroid Build Coastguard Worker         }
81*4d7e907cSAndroid Build Coastguard Worker 
82*4d7e907cSAndroid Build Coastguard Worker         read_pos = found_pos + 1;
83*4d7e907cSAndroid Build Coastguard Worker     }
84*4d7e907cSAndroid Build Coastguard Worker 
85*4d7e907cSAndroid Build Coastguard Worker     return Status::SUCCESS;
86*4d7e907cSAndroid Build Coastguard Worker }
87*4d7e907cSAndroid Build Coastguard Worker 
currentFunctionsAppliedCallback(bool functionsApplied,void * payload)88*4d7e907cSAndroid Build Coastguard Worker void currentFunctionsAppliedCallback(bool functionsApplied, void *payload) {
89*4d7e907cSAndroid Build Coastguard Worker     UsbGadget *gadget = (UsbGadget *)payload;
90*4d7e907cSAndroid Build Coastguard Worker     gadget->mCurrentUsbFunctionsApplied = functionsApplied;
91*4d7e907cSAndroid Build Coastguard Worker }
92*4d7e907cSAndroid Build Coastguard Worker 
getCurrentUsbFunctions(const shared_ptr<IUsbGadgetCallback> & callback,int64_t in_transactionId)93*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus UsbGadget::getCurrentUsbFunctions(const shared_ptr<IUsbGadgetCallback>& callback,
94*4d7e907cSAndroid Build Coastguard Worker                                                 int64_t in_transactionId) {
95*4d7e907cSAndroid Build Coastguard Worker     if (callback == nullptr) {
96*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromExceptionCode(EX_NULL_POINTER);
97*4d7e907cSAndroid Build Coastguard Worker     }
98*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus ret = callback->getCurrentUsbFunctionsCb(
99*4d7e907cSAndroid Build Coastguard Worker         mCurrentUsbFunctions,
100*4d7e907cSAndroid Build Coastguard Worker         mCurrentUsbFunctionsApplied ? Status::FUNCTIONS_APPLIED : Status::FUNCTIONS_NOT_APPLIED,
101*4d7e907cSAndroid Build Coastguard Worker 	in_transactionId);
102*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk())
103*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Call to getCurrentUsbFunctionsCb failed %s", ret.getDescription().c_str());
104*4d7e907cSAndroid Build Coastguard Worker 
105*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
106*4d7e907cSAndroid Build Coastguard Worker }
107*4d7e907cSAndroid Build Coastguard Worker 
getUsbSpeed(const shared_ptr<IUsbGadgetCallback> & callback,int64_t in_transactionId)108*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus UsbGadget::getUsbSpeed(const shared_ptr<IUsbGadgetCallback> &callback,
109*4d7e907cSAndroid Build Coastguard Worker 	int64_t in_transactionId) {
110*4d7e907cSAndroid Build Coastguard Worker     std::string current_speed;
111*4d7e907cSAndroid Build Coastguard Worker     if (ReadFileToString(SPEED_PATH, &current_speed)) {
112*4d7e907cSAndroid Build Coastguard Worker         current_speed = Trim(current_speed);
113*4d7e907cSAndroid Build Coastguard Worker         ALOGI("current USB speed is %s", current_speed.c_str());
114*4d7e907cSAndroid Build Coastguard Worker         if (current_speed == "low-speed")
115*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::LOWSPEED;
116*4d7e907cSAndroid Build Coastguard Worker         else if (current_speed == "full-speed")
117*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::FULLSPEED;
118*4d7e907cSAndroid Build Coastguard Worker         else if (current_speed == "high-speed")
119*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::HIGHSPEED;
120*4d7e907cSAndroid Build Coastguard Worker         else if (current_speed == "super-speed")
121*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::SUPERSPEED;
122*4d7e907cSAndroid Build Coastguard Worker         else if (current_speed == "super-speed-plus")
123*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::SUPERSPEED_10Gb;
124*4d7e907cSAndroid Build Coastguard Worker         else if (current_speed == "UNKNOWN")
125*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::UNKNOWN;
126*4d7e907cSAndroid Build Coastguard Worker         else
127*4d7e907cSAndroid Build Coastguard Worker             mUsbSpeed = UsbSpeed::UNKNOWN;
128*4d7e907cSAndroid Build Coastguard Worker     } else {
129*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Fail to read current speed");
130*4d7e907cSAndroid Build Coastguard Worker         mUsbSpeed = UsbSpeed::UNKNOWN;
131*4d7e907cSAndroid Build Coastguard Worker     }
132*4d7e907cSAndroid Build Coastguard Worker 
133*4d7e907cSAndroid Build Coastguard Worker     if (callback) {
134*4d7e907cSAndroid Build Coastguard Worker         ScopedAStatus ret = callback->getUsbSpeedCb(mUsbSpeed, in_transactionId);
135*4d7e907cSAndroid Build Coastguard Worker 
136*4d7e907cSAndroid Build Coastguard Worker         if (!ret.isOk())
137*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Call to getUsbSpeedCb failed %s", ret.getDescription().c_str());
138*4d7e907cSAndroid Build Coastguard Worker     }
139*4d7e907cSAndroid Build Coastguard Worker 
140*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
141*4d7e907cSAndroid Build Coastguard Worker }
142*4d7e907cSAndroid Build Coastguard Worker 
tearDownGadget()143*4d7e907cSAndroid Build Coastguard Worker Status UsbGadget::tearDownGadget() {
144*4d7e907cSAndroid Build Coastguard Worker     return Status::SUCCESS;
145*4d7e907cSAndroid Build Coastguard Worker }
146*4d7e907cSAndroid Build Coastguard Worker 
reset(const shared_ptr<IUsbGadgetCallback> & callback,int64_t in_transactionId)147*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus UsbGadget::reset(const shared_ptr<IUsbGadgetCallback> &callback,
148*4d7e907cSAndroid Build Coastguard Worker         int64_t in_transactionId) {
149*4d7e907cSAndroid Build Coastguard Worker     if (callback)
150*4d7e907cSAndroid Build Coastguard Worker         callback->resetCb(Status::SUCCESS, in_transactionId);
151*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::ok();
152*4d7e907cSAndroid Build Coastguard Worker }
153*4d7e907cSAndroid Build Coastguard Worker 
setupFunctions(long functions,const shared_ptr<IUsbGadgetCallback> & callback,uint64_t timeout,int64_t in_transactionId)154*4d7e907cSAndroid Build Coastguard Worker Status UsbGadget::setupFunctions(long functions,
155*4d7e907cSAndroid Build Coastguard Worker 	const shared_ptr<IUsbGadgetCallback> &callback, uint64_t timeout,
156*4d7e907cSAndroid Build Coastguard Worker 	int64_t in_transactionId) {
157*4d7e907cSAndroid Build Coastguard Worker     bool ffsEnabled = false;
158*4d7e907cSAndroid Build Coastguard Worker     if (timeout == 0) {
159*4d7e907cSAndroid Build Coastguard Worker 	ALOGI("timeout not setup");
160*4d7e907cSAndroid Build Coastguard Worker     }
161*4d7e907cSAndroid Build Coastguard Worker 
162*4d7e907cSAndroid Build Coastguard Worker     if ((functions & GadgetFunction::ADB) != 0) {
163*4d7e907cSAndroid Build Coastguard Worker         ffsEnabled = true;
164*4d7e907cSAndroid Build Coastguard Worker     }
165*4d7e907cSAndroid Build Coastguard Worker 
166*4d7e907cSAndroid Build Coastguard Worker     if ((functions & GadgetFunction::NCM) != 0) {
167*4d7e907cSAndroid Build Coastguard Worker         ALOGI("setCurrentUsbFunctions ncm");
168*4d7e907cSAndroid Build Coastguard Worker     }
169*4d7e907cSAndroid Build Coastguard Worker 
170*4d7e907cSAndroid Build Coastguard Worker     // Pull up the gadget right away when there are no ffs functions.
171*4d7e907cSAndroid Build Coastguard Worker     if (!ffsEnabled) {
172*4d7e907cSAndroid Build Coastguard Worker         mCurrentUsbFunctionsApplied = true;
173*4d7e907cSAndroid Build Coastguard Worker         if (callback)
174*4d7e907cSAndroid Build Coastguard Worker             callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS, in_transactionId);
175*4d7e907cSAndroid Build Coastguard Worker         return Status::SUCCESS;
176*4d7e907cSAndroid Build Coastguard Worker     }
177*4d7e907cSAndroid Build Coastguard Worker 
178*4d7e907cSAndroid Build Coastguard Worker     return Status::SUCCESS;
179*4d7e907cSAndroid Build Coastguard Worker }
180*4d7e907cSAndroid Build Coastguard Worker 
getI2cBusHelper(string * name)181*4d7e907cSAndroid Build Coastguard Worker Status getI2cBusHelper(string *name) {
182*4d7e907cSAndroid Build Coastguard Worker     DIR *dp;
183*4d7e907cSAndroid Build Coastguard Worker 
184*4d7e907cSAndroid Build Coastguard Worker     dp = opendir(kHsi2cPath);
185*4d7e907cSAndroid Build Coastguard Worker     if (dp != NULL) {
186*4d7e907cSAndroid Build Coastguard Worker         struct dirent *ep;
187*4d7e907cSAndroid Build Coastguard Worker 
188*4d7e907cSAndroid Build Coastguard Worker         while ((ep = readdir(dp))) {
189*4d7e907cSAndroid Build Coastguard Worker             if (ep->d_type == DT_DIR) {
190*4d7e907cSAndroid Build Coastguard Worker                 if (string::npos != string(ep->d_name).find("i2c-")) {
191*4d7e907cSAndroid Build Coastguard Worker                     std::strtok(ep->d_name, "-");
192*4d7e907cSAndroid Build Coastguard Worker                     *name = std::strtok(NULL, "-");
193*4d7e907cSAndroid Build Coastguard Worker                 }
194*4d7e907cSAndroid Build Coastguard Worker             }
195*4d7e907cSAndroid Build Coastguard Worker         }
196*4d7e907cSAndroid Build Coastguard Worker         closedir(dp);
197*4d7e907cSAndroid Build Coastguard Worker         return Status::SUCCESS;
198*4d7e907cSAndroid Build Coastguard Worker     }
199*4d7e907cSAndroid Build Coastguard Worker 
200*4d7e907cSAndroid Build Coastguard Worker     ALOGE("Failed to open %s", kHsi2cPath);
201*4d7e907cSAndroid Build Coastguard Worker     return Status::ERROR;
202*4d7e907cSAndroid Build Coastguard Worker }
203*4d7e907cSAndroid Build Coastguard Worker 
setCurrentUsbFunctions(int64_t functions,const shared_ptr<IUsbGadgetCallback> & callback,int64_t timeoutMs,int64_t in_transactionId)204*4d7e907cSAndroid Build Coastguard Worker ScopedAStatus UsbGadget::setCurrentUsbFunctions(int64_t functions,
205*4d7e907cSAndroid Build Coastguard Worker                                                const shared_ptr<IUsbGadgetCallback> &callback,
206*4d7e907cSAndroid Build Coastguard Worker 					       int64_t timeoutMs,
207*4d7e907cSAndroid Build Coastguard Worker 					       int64_t in_transactionId) {
208*4d7e907cSAndroid Build Coastguard Worker     std::unique_lock<std::mutex> lk(mLockSetCurrentFunction);
209*4d7e907cSAndroid Build Coastguard Worker     std::string current_usb_power_operation_mode, current_usb_type;
210*4d7e907cSAndroid Build Coastguard Worker     std::string usb_limit_sink_enable;
211*4d7e907cSAndroid Build Coastguard Worker 
212*4d7e907cSAndroid Build Coastguard Worker     string accessoryCurrentLimitEnablePath, accessoryCurrentLimitPath, path;
213*4d7e907cSAndroid Build Coastguard Worker 
214*4d7e907cSAndroid Build Coastguard Worker     mCurrentUsbFunctions = functions;
215*4d7e907cSAndroid Build Coastguard Worker     mCurrentUsbFunctionsApplied = false;
216*4d7e907cSAndroid Build Coastguard Worker 
217*4d7e907cSAndroid Build Coastguard Worker     getI2cBusHelper(&path);
218*4d7e907cSAndroid Build Coastguard Worker     accessoryCurrentLimitPath = kI2CPath + path + "/" + kAccessoryLimitCurrent;
219*4d7e907cSAndroid Build Coastguard Worker     accessoryCurrentLimitEnablePath = kI2CPath + path + "/" + kAccessoryLimitCurrentEnable;
220*4d7e907cSAndroid Build Coastguard Worker 
221*4d7e907cSAndroid Build Coastguard Worker     // Get the gadget IRQ number before tearDownGadget()
222*4d7e907cSAndroid Build Coastguard Worker     if (mGadgetIrqPath.empty())
223*4d7e907cSAndroid Build Coastguard Worker         getUsbGadgetIrqPath();
224*4d7e907cSAndroid Build Coastguard Worker 
225*4d7e907cSAndroid Build Coastguard Worker     // Unlink the gadget and stop the monitor if running.
226*4d7e907cSAndroid Build Coastguard Worker     Status status = tearDownGadget();
227*4d7e907cSAndroid Build Coastguard Worker     if (status != Status::SUCCESS) {
228*4d7e907cSAndroid Build Coastguard Worker         goto error;
229*4d7e907cSAndroid Build Coastguard Worker     }
230*4d7e907cSAndroid Build Coastguard Worker 
231*4d7e907cSAndroid Build Coastguard Worker     ALOGI("Returned from tearDown gadget");
232*4d7e907cSAndroid Build Coastguard Worker 
233*4d7e907cSAndroid Build Coastguard Worker     // Leave the gadget pulled down to give time for the host to sense disconnect.
234*4d7e907cSAndroid Build Coastguard Worker     //usleep(kDisconnectWaitUs);
235*4d7e907cSAndroid Build Coastguard Worker 
236*4d7e907cSAndroid Build Coastguard Worker     if (functions == GadgetFunction::NONE) {
237*4d7e907cSAndroid Build Coastguard Worker         if (callback == NULL)
238*4d7e907cSAndroid Build Coastguard Worker             return ScopedAStatus::fromServiceSpecificErrorWithMessage(
239*4d7e907cSAndroid Build Coastguard Worker                 -1, "callback == NULL");
240*4d7e907cSAndroid Build Coastguard Worker         ScopedAStatus ret = callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS, in_transactionId);
241*4d7e907cSAndroid Build Coastguard Worker         if (!ret.isOk())
242*4d7e907cSAndroid Build Coastguard Worker             ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.getDescription().c_str());
243*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificErrorWithMessage(
244*4d7e907cSAndroid Build Coastguard Worker                 -1, "Error while calling setCurrentUsbFunctionsCb");
245*4d7e907cSAndroid Build Coastguard Worker     }
246*4d7e907cSAndroid Build Coastguard Worker 
247*4d7e907cSAndroid Build Coastguard Worker     status = setupFunctions(functions, callback, timeoutMs, in_transactionId);
248*4d7e907cSAndroid Build Coastguard Worker     if (status != Status::SUCCESS) {
249*4d7e907cSAndroid Build Coastguard Worker         goto error;
250*4d7e907cSAndroid Build Coastguard Worker     }
251*4d7e907cSAndroid Build Coastguard Worker 
252*4d7e907cSAndroid Build Coastguard Worker     if (functions & GadgetFunction::NCM) {
253*4d7e907cSAndroid Build Coastguard Worker         if (!mGadgetIrqPath.empty()) {
254*4d7e907cSAndroid Build Coastguard Worker             if (!WriteStringToFile(BIG_CORE, mGadgetIrqPath))
255*4d7e907cSAndroid Build Coastguard Worker                 ALOGI("Cannot move gadget IRQ to big core, path:%s", mGadgetIrqPath.c_str());
256*4d7e907cSAndroid Build Coastguard Worker         }
257*4d7e907cSAndroid Build Coastguard Worker     } else {
258*4d7e907cSAndroid Build Coastguard Worker         if (!mGadgetIrqPath.empty()) {
259*4d7e907cSAndroid Build Coastguard Worker             if (!WriteStringToFile(MEDIUM_CORE, mGadgetIrqPath))
260*4d7e907cSAndroid Build Coastguard Worker                 ALOGI("Cannot move gadget IRQ to medium core, path:%s", mGadgetIrqPath.c_str());
261*4d7e907cSAndroid Build Coastguard Worker         }
262*4d7e907cSAndroid Build Coastguard Worker     }
263*4d7e907cSAndroid Build Coastguard Worker 
264*4d7e907cSAndroid Build Coastguard Worker     if (ReadFileToString(CURRENT_USB_TYPE_PATH, &current_usb_type))
265*4d7e907cSAndroid Build Coastguard Worker         current_usb_type = Trim(current_usb_type);
266*4d7e907cSAndroid Build Coastguard Worker 
267*4d7e907cSAndroid Build Coastguard Worker     if (ReadFileToString(CURRENT_USB_POWER_OPERATION_MODE_PATH, &current_usb_power_operation_mode))
268*4d7e907cSAndroid Build Coastguard Worker         current_usb_power_operation_mode = Trim(current_usb_power_operation_mode);
269*4d7e907cSAndroid Build Coastguard Worker 
270*4d7e907cSAndroid Build Coastguard Worker     if (functions & GadgetFunction::ACCESSORY &&
271*4d7e907cSAndroid Build Coastguard Worker         current_usb_type == "Unknown SDP [CDP] DCP" &&
272*4d7e907cSAndroid Build Coastguard Worker         (current_usb_power_operation_mode == "default" ||
273*4d7e907cSAndroid Build Coastguard Worker         current_usb_power_operation_mode == "1.5A")) {
274*4d7e907cSAndroid Build Coastguard Worker         if (!WriteStringToFile("1300000", accessoryCurrentLimitPath)) {
275*4d7e907cSAndroid Build Coastguard Worker             ALOGI("Write 1.3A to limit current fail");
276*4d7e907cSAndroid Build Coastguard Worker         } else {
277*4d7e907cSAndroid Build Coastguard Worker             if (!WriteStringToFile("1", accessoryCurrentLimitEnablePath)) {
278*4d7e907cSAndroid Build Coastguard Worker                 ALOGI("Enable limit current fail");
279*4d7e907cSAndroid Build Coastguard Worker             }
280*4d7e907cSAndroid Build Coastguard Worker         }
281*4d7e907cSAndroid Build Coastguard Worker     } else {
282*4d7e907cSAndroid Build Coastguard Worker         if (!WriteStringToFile("0", accessoryCurrentLimitEnablePath))
283*4d7e907cSAndroid Build Coastguard Worker             ALOGI("unvote accessory limit current failed");
284*4d7e907cSAndroid Build Coastguard Worker     }
285*4d7e907cSAndroid Build Coastguard Worker 
286*4d7e907cSAndroid Build Coastguard Worker     ALOGI("Usb Gadget setcurrent functions called successfully");
287*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromServiceSpecificErrorWithMessage(
288*4d7e907cSAndroid Build Coastguard Worker                 -1, "Usb Gadget setcurrent functions called successfully");
289*4d7e907cSAndroid Build Coastguard Worker 
290*4d7e907cSAndroid Build Coastguard Worker 
291*4d7e907cSAndroid Build Coastguard Worker error:
292*4d7e907cSAndroid Build Coastguard Worker     ALOGI("Usb Gadget setcurrent functions failed");
293*4d7e907cSAndroid Build Coastguard Worker     if (callback == NULL)
294*4d7e907cSAndroid Build Coastguard Worker         return ScopedAStatus::fromServiceSpecificErrorWithMessage(
295*4d7e907cSAndroid Build Coastguard Worker                 -1, "Usb Gadget setcurrent functions failed");
296*4d7e907cSAndroid Build Coastguard Worker     ScopedAStatus ret = callback->setCurrentUsbFunctionsCb(functions, status, in_transactionId);
297*4d7e907cSAndroid Build Coastguard Worker     if (!ret.isOk())
298*4d7e907cSAndroid Build Coastguard Worker         ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.getDescription().c_str());
299*4d7e907cSAndroid Build Coastguard Worker     return ScopedAStatus::fromServiceSpecificErrorWithMessage(
300*4d7e907cSAndroid Build Coastguard Worker                 -1, "Error while calling setCurrentUsbFunctionsCb");
301*4d7e907cSAndroid Build Coastguard Worker }
302*4d7e907cSAndroid Build Coastguard Worker }  // namespace gadget
303*4d7e907cSAndroid Build Coastguard Worker }  // namespace usb
304*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
305*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
306*4d7e907cSAndroid Build Coastguard Worker }  // aidl
307