blob: 152f2de69e8658ca6c533fdb8fbf329facdb3a8d [file] [log] [blame]
/*
* Copyright (C) 2017-2018 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#define LOG_TAG "android.hardware.usb@1.3-service-basic"
#include <android-base/file.h>
#include <android-base/logging.h>
#include <utils/Errors.h>
#include <utils/StrongPointer.h>
#include "Usb.h"
namespace android {
namespace hardware {
namespace usb {
namespace V1_3 {
namespace implementation {
// Methods from ::android::hardware::usb::V1_0::IUsb follow.
Return<void> Usb::switchRole(const hidl_string& portName __unused,
const PortRole& newRole __unused) {
LOG(ERROR) << __func__ << ": Not supported";
return Void();
}
Return<void> Usb::queryPortStatus() {
std::lock_guard<std::mutex> lock(mMutex);
V1_0::PortStatus currentPortStatus = {
.portName = "otg_default",
.currentDataRole = V1_0::PortDataRole::DEVICE,
.currentPowerRole = V1_0::PortPowerRole::SINK,
.currentMode = V1_0::PortMode::UFP,
.canChangeMode = false,
.canChangeDataRole = false,
.canChangePowerRole = false,
.supportedModes = V1_0::PortMode::UFP,
};
V1_1::PortStatus_1_1 currentPortStatus_1_1 = {
.status = currentPortStatus,
.supportedModes = (unsigned int)V1_1::PortMode_1_1::UFP,
.currentMode = V1_1::PortMode_1_1::UFP,
};
V1_2::PortStatus currentPortStatus_1_2 = {
.status_1_1 = currentPortStatus_1_1,
.supportedContaminantProtectionModes =
(unsigned int)V1_2::ContaminantProtectionMode::NONE,
.supportsEnableContaminantPresenceProtection = false,
.contaminantProtectionStatus = V1_2::ContaminantProtectionStatus::NONE,
.supportsEnableContaminantPresenceDetection = false,
.contaminantDetectionStatus = V1_2::ContaminantDetectionStatus::NOT_SUPPORTED,
};
if (mCallback_1_2 != NULL) {
hidl_vec<V1_2::PortStatus> vec_currentPortStatus_1_2;
vec_currentPortStatus_1_2.resize(1);
vec_currentPortStatus_1_2[0] = currentPortStatus_1_2;
Return<void> ret = mCallback_1_2->notifyPortStatusChange_1_2(vec_currentPortStatus_1_2,
V1_0::Status::SUCCESS);
if (!ret.isOk()) {
LOG(ERROR) << "queryPortStatus V1.2 error " << ret.description();
}
} else if (mCallback_1_1 != NULL) {
hidl_vec<V1_1::PortStatus_1_1> vec_currentPortStatus_1_1;
vec_currentPortStatus_1_1.resize(1);
vec_currentPortStatus_1_1[0] = currentPortStatus_1_1;
Return<void> ret = mCallback_1_1->notifyPortStatusChange_1_1(vec_currentPortStatus_1_1,
V1_0::Status::SUCCESS);
if (!ret.isOk()) {
LOG(ERROR) << "queryPortStatus V1.1 error " << ret.description();
}
} else if (mCallback != NULL) {
hidl_vec<V1_0::PortStatus> vec_currentPortStatus;
vec_currentPortStatus.resize(1);
vec_currentPortStatus[0] = currentPortStatus;
Return<void> ret =
mCallback->notifyPortStatusChange(vec_currentPortStatus, V1_0::Status::SUCCESS);
if (!ret.isOk()) {
LOG(ERROR) << "queryPortStatus V1.0 error " << ret.description();
}
} else {
LOG(INFO) << "Notifying userspace skipped. Callback is NULL";
}
return Void();
}
Return<void> Usb::setCallback(const sp<V1_0::IUsbCallback>& callback) {
std::lock_guard<std::mutex> lock(mMutex);
mCallback = callback;
mCallback_1_1 = V1_1::IUsbCallback::castFrom(mCallback);
mCallback_1_2 = V1_2::IUsbCallback::castFrom(mCallback);
LOG(INFO) << "registering callback";
return Void();
}
// Methods from ::android::hardware::usb::V1_2::IUsb follow.
Return<void> Usb::enableContaminantPresenceDetection(const hidl_string& portName __unused,
bool enable __unused) {
LOG(ERROR) << __func__ << ": Not supported";
return Void();
}
Return<void> Usb::enableContaminantPresenceProtection(const hidl_string& portName __unused,
bool enable __unused) {
LOG(ERROR) << __func__ << ": Not supported";
return Void();
}
// Methods from ::android::hardware::usb::V1_3::IUsb follow.
Return<bool> Usb::enableUsbDataSignal(bool enable) {
bool success = android::base::WriteStringToFile(
enable ? USB_CONTROL_DISABLE : USB_CONTROL_ENABLE, USB_CONTROL_PATH);
if (success)
queryPortStatus();
else
LOG(ERROR) << __func__ << ": Failed to " << (enable ? "enable" : "disable");
return success;
}
} // namespace implementation
} // namespace V1_3
} // namespace usb
} // namespace hardware
} // namespace android