summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <Badhri@google.com>2017-04-18 17:41:35 -0700
committerJan Altensen <info@stricted.net>2021-05-04 02:41:18 +0200
commitfda77b9921a4efa3a9942535a1484f9321663888 (patch)
treea79fae8c9341e2af35a1c831df3c8c25d8830bde
parent37ad3bfa4a152b7d23da09cea1811a6bafd4d0cc (diff)
lineage/interfaces: USB: HAL: update hal to V1_1
This CL adds support to notify frameworks when an audio or debug accessory is attached. Bug: 36604276 Test: Manually test inserting an Audio accessory. Change-Id: I9ec0f88ed85ed593b31132ba58bfedb51a435cd8
-rw-r--r--usb/1.1-typec/Android.bp32
-rw-r--r--usb/1.1-typec/Android.mk36
-rw-r--r--usb/1.1-typec/Usb.cpp106
-rw-r--r--usb/1.1-typec/Usb.h32
-rw-r--r--usb/1.1-typec/android.hardware.usb@1.1-service.wahoo.rc (renamed from usb/1.1-typec/android.hardware.usb@1.0-service.device.rc)2
-rw-r--r--usb/1.1-typec/service.cpp4
6 files changed, 127 insertions, 85 deletions
diff --git a/usb/1.1-typec/Android.bp b/usb/1.1-typec/Android.bp
new file mode 100644
index 0000000..4370d6c
--- /dev/null
+++ b/usb/1.1-typec/Android.bp
@@ -0,0 +1,32 @@
+//
+// Copyright (C) 2017 The Android Open Source 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.
+cc_binary {
+ name: "android.hardware.usb@1.1-service.wahoo",
+ relative_install_path: "hw",
+ init_rc: ["android.hardware.usb@1.1-service.wahoo.rc"],
+ srcs: ["service.cpp", "Usb.cpp"],
+ shared_libs: [
+ "libbase",
+ "libhidlbase",
+ "libhidltransport",
+ "liblog",
+ "libutils",
+ "libhardware",
+ "android.hardware.usb@1.0",
+ "android.hardware.usb@1.1",
+ "libcutils",
+ ],
+ proprietary: true,
+}
diff --git a/usb/1.1-typec/Android.mk b/usb/1.1-typec/Android.mk
deleted file mode 100644
index 3aaa8e9..0000000
--- a/usb/1.1-typec/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (C) 2017 The Android Open Source 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_PROPRIETARY_MODULE := true
-LOCAL_MODULE := android.hardware.usb@1.0-service.device
-LOCAL_INIT_RC := android.hardware.usb@1.0-service.device.rc
-LOCAL_SRC_FILES := \
- service.cpp \
- Usb.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libhidlbase \
- libhidltransport \
- liblog \
- libhwbinder \
- libutils \
- libhardware \
- android.hardware.usb@1.0 \
-
-include $(BUILD_EXECUTABLE)
diff --git a/usb/1.1-typec/Usb.cpp b/usb/1.1-typec/Usb.cpp
index 0a9529c..0d472bd 100644
--- a/usb/1.1-typec/Usb.cpp
+++ b/usb/1.1-typec/Usb.cpp
@@ -13,6 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+#define LOG_TAG "android.hardware.usb@1.1-service.wahoo"
+
+#include <android-base/logging.h>
#include <assert.h>
#include <dirent.h>
#include <pthread.h>
@@ -31,7 +35,7 @@
namespace android {
namespace hardware {
namespace usb {
-namespace V1_0 {
+namespace V1_1 {
namespace implementation {
// Set by the signal handler to destroy the thread
@@ -85,8 +89,8 @@ std::string convertRoletoString(PortRole role) {
if (role.role == static_cast<uint32_t>(PortDataRole::DEVICE))
return "device";
} else if (role.type == PortRoleType::MODE) {
- if (role.role == static_cast<uint32_t>(PortMode::UFP)) return "ufp";
- if (role.role == static_cast<uint32_t>(PortMode::DFP)) return "dfp";
+ if (role.role == static_cast<uint32_t>(PortMode_1_1::UFP)) return "ufp";
+ if (role.role == static_cast<uint32_t>(PortMode_1_1::DFP)) return "dfp";
}
return "none";
}
@@ -155,10 +159,24 @@ Return<void> Usb::switchRole(const hidl_string &portName,
return Void();
}
+Status getAccessoryConnected(std::string portName, std::string *accessory) {
+ std::string filename =
+ "/sys/class/typec/" + portName + "-partner/accessory_mode";
+
+ if (readFile(filename, accessory)) {
+ ALOGE("getAccessoryConnected: Failed to open filesystem node: %s",
+ filename.c_str());
+ return Status::ERROR;
+ }
+
+ return Status::SUCCESS;
+}
+
Status getCurrentRoleHelper(std::string portName, bool connected,
PortRoleType type, uint32_t *currentRole) {
std::string filename;
std::string roleName;
+ std::string accessory;
// Mode
@@ -170,13 +188,26 @@ Status getCurrentRoleHelper(std::string portName, bool connected,
*currentRole = static_cast<uint32_t>(PortDataRole::NONE);
} else if (type == PortRoleType::MODE) {
filename = "/sys/class/typec/" + portName + "/current_data_role";
- *currentRole = static_cast<uint32_t>(PortMode::NONE);
+ *currentRole = static_cast<uint32_t>(PortMode_1_1::NONE);
} else {
return Status::ERROR;
}
if (!connected) return Status::SUCCESS;
+ if (type == PortRoleType::MODE) {
+ if (getAccessoryConnected(portName, &accessory) != Status::SUCCESS) {
+ return Status::ERROR;
+ }
+ if (accessory == "Audio Adapter Accessory Mode") {
+ *currentRole = static_cast<uint32_t>(PortMode_1_1::AUDIO_ACCESSORY);
+ return Status::SUCCESS;
+ } else if (accessory == "Debug Accessory Mode") {
+ *currentRole = static_cast<uint32_t>(PortMode_1_1::DEBUG_ACCESSORY);
+ return Status::SUCCESS;
+ }
+ }
+
if (readFile(filename, &roleName)) {
ALOGE("getCurrentRole: Failed to open filesystem node: %s",
filename.c_str());
@@ -193,12 +224,12 @@ Status getCurrentRoleHelper(std::string portName, bool connected,
if (type == PortRoleType::DATA_ROLE)
*currentRole = static_cast<uint32_t>(PortDataRole::HOST);
else
- *currentRole = static_cast<uint32_t>(PortMode::DFP);
+ *currentRole = static_cast<uint32_t>(PortMode_1_1::DFP);
} else if (roleName == "device") {
if (type == PortRoleType::DATA_ROLE)
*currentRole = static_cast<uint32_t>(PortDataRole::DEVICE);
else
- *currentRole = static_cast<uint32_t>(PortMode::UFP);
+ *currentRole = static_cast<uint32_t>(PortMode_1_1::UFP);
} else if (roleName != "none") {
/* case for none has already been addressed.
* so we check if the role isnt none.
@@ -253,23 +284,23 @@ bool canSwitchRoleHelper(const std::string portName, PortRoleType /*type*/) {
return false;
}
-Status getPortStatusHelper(hidl_vec<PortStatus> *currentPortStatus) {
+Status getPortStatus_1_1Helper(hidl_vec<PortStatus_1_1> *currentPortStatus_1_1) {
std::unordered_map<std::string, bool> names;
Status result = getTypeCPortNamesHelper(&names);
int i = -1;
if (result == Status::SUCCESS) {
- currentPortStatus->resize(names.size());
+ currentPortStatus_1_1->resize(names.size());
for (std::pair<std::string, bool> port : names) {
i++;
ALOGI("%s", port.first.c_str());
- (*currentPortStatus)[i].portName = port.first;
+ (*currentPortStatus_1_1)[i].status.portName = port.first;
uint32_t currentRole;
if (getCurrentRoleHelper(port.first, port.second,
PortRoleType::POWER_ROLE,
&currentRole) == Status::SUCCESS) {
- (*currentPortStatus)[i].currentPowerRole =
+ (*currentPortStatus_1_1)[i].status.currentPowerRole =
static_cast<PortPowerRole>(currentRole);
} else {
ALOGE("Error while retreiving portNames");
@@ -278,7 +309,7 @@ Status getPortStatusHelper(hidl_vec<PortStatus> *currentPortStatus) {
if (getCurrentRoleHelper(port.first, port.second, PortRoleType::DATA_ROLE,
&currentRole) == Status::SUCCESS) {
- (*currentPortStatus)[i].currentDataRole =
+ (*currentPortStatus_1_1)[i].status.currentDataRole =
static_cast<PortDataRole>(currentRole);
} else {
ALOGE("Error while retreiving current port role");
@@ -287,28 +318,31 @@ Status getPortStatusHelper(hidl_vec<PortStatus> *currentPortStatus) {
if (getCurrentRoleHelper(port.first, port.second, PortRoleType::MODE,
&currentRole) == Status::SUCCESS) {
- (*currentPortStatus)[i].currentMode =
- static_cast<PortMode>(currentRole);
+ (*currentPortStatus_1_1)[i].currentMode =
+ static_cast<PortMode_1_1>(currentRole);
} else {
ALOGE("Error while retreiving current data role");
goto done;
}
- (*currentPortStatus)[i].canChangeMode = false;
- (*currentPortStatus)[i].canChangeDataRole =
+ (*currentPortStatus_1_1)[i].status.canChangeMode = false;
+ (*currentPortStatus_1_1)[i].status.canChangeDataRole =
port.second ? canSwitchRoleHelper(port.first, PortRoleType::DATA_ROLE)
: false;
- (*currentPortStatus)[i].canChangePowerRole =
+ (*currentPortStatus_1_1)[i].status.canChangePowerRole =
port.second
? canSwitchRoleHelper(port.first, PortRoleType::POWER_ROLE)
: false;
ALOGI("connected:%d canChangeMode: %d canChagedata: %d canChangePower:%d",
- port.second, (*currentPortStatus)[i].canChangeMode,
- (*currentPortStatus)[i].canChangeDataRole,
- (*currentPortStatus)[i].canChangePowerRole);
+ port.second, (*currentPortStatus_1_1)[i].status.canChangeMode,
+ (*currentPortStatus_1_1)[i].status.canChangeDataRole,
+ (*currentPortStatus_1_1)[i].status.canChangePowerRole);
- (*currentPortStatus)[i].supportedModes = PortMode::DRP;
+ (*currentPortStatus_1_1)[i].supportedModes = PortMode_1_1::UFP | PortMode_1_1::DFP;
+
+ (*currentPortStatus_1_1)[i].status.supportedModes = V1_0::PortMode::NONE;
+ (*currentPortStatus_1_1)[i].status.currentMode = V1_0::PortMode::NONE;
}
return Status::SUCCESS;
}
@@ -317,17 +351,17 @@ done:
}
Return<void> Usb::queryPortStatus() {
- hidl_vec<PortStatus> currentPortStatus;
+ hidl_vec<PortStatus_1_1> currentPortStatus_1_1;
Status status;
- status = getPortStatusHelper(&currentPortStatus);
+ status = getPortStatus_1_1Helper(&currentPortStatus_1_1);
pthread_mutex_lock(&mLock);
if (mCallback != NULL) {
Return<void> ret =
- mCallback->notifyPortStatusChange(currentPortStatus, status);
+ mCallback->notifyPortStatusChange_1_1(currentPortStatus_1_1, status);
if (!ret.isOk())
- ALOGE("queryPortStatus error %s", ret.description().c_str());
+ ALOGE("queryPortStatus_1_1 error %s", ret.description().c_str());
} else {
ALOGI("Notifying userspace skipped. Callback is NULL");
}
@@ -337,7 +371,7 @@ Return<void> Usb::queryPortStatus() {
}
struct data {
int uevent_fd;
- android::hardware::usb::V1_0::implementation::Usb *usb;
+ android::hardware::usb::V1_1::implementation::Usb *usb;
};
static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
@@ -359,10 +393,10 @@ static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
ALOGI("uevent received %s", cp);
pthread_mutex_lock(&payload->usb->mLock);
if (payload->usb->mCallback != NULL) {
- hidl_vec<PortStatus> currentPortStatus;
- Status status = getPortStatusHelper(&currentPortStatus);
- Return<void> ret = payload->usb->mCallback->notifyPortStatusChange(
- currentPortStatus, status);
+ hidl_vec<PortStatus_1_1> currentPortStatus_1_1;
+ Status status = getPortStatus_1_1Helper(&currentPortStatus_1_1);
+ Return<void> ret = payload->usb->mCallback->notifyPortStatusChange_1_1(
+ currentPortStatus_1_1, status);
if (!ret.isOk()) ALOGE("error %s", ret.description().c_str());
} else {
ALOGI("Notifying userspace skipped. Callback is NULL");
@@ -391,7 +425,7 @@ void *work(void *param) {
}
payload.uevent_fd = uevent_fd;
- payload.usb = (android::hardware::usb::V1_0::implementation::Usb *)param;
+ payload.usb = (android::hardware::usb::V1_1::implementation::Usb *)param;
fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
@@ -444,7 +478,13 @@ void sighandler(int sig) {
signal(SIGUSR1, sighandler);
}
-Return<void> Usb::setCallback(const sp<IUsbCallback> &callback) {
+Return<void> Usb::setCallback(const sp<::android::hardware::usb::V1_0::IUsbCallback> &callback) {
+
+ sp<IUsbCallback> callback_V1_1 = IUsbCallback::castFrom(callback);
+
+ if (callback != NULL)
+ CHECK(callback_V1_1 != NULL);
+
pthread_mutex_lock(&mLock);
/*
* When both the old callback and new callback values are NULL,
@@ -455,12 +495,12 @@ Return<void> Usb::setCallback(const sp<IUsbCallback> &callback) {
*/
if ((mCallback == NULL && callback == NULL) ||
(mCallback != NULL && callback != NULL)) {
- mCallback = callback;
+ mCallback = callback_V1_1;
pthread_mutex_unlock(&mLock);
return Void();
}
- mCallback = callback;
+ mCallback = callback_V1_1;
ALOGI("registering callback");
// Kill the worker thread if the new callback is NULL.
diff --git a/usb/1.1-typec/Usb.h b/usb/1.1-typec/Usb.h
index 4eaecc5..11c18ae 100644
--- a/usb/1.1-typec/Usb.h
+++ b/usb/1.1-typec/Usb.h
@@ -1,27 +1,30 @@
-#ifndef ANDROID_HARDWARE_USB_V1_0_USB_H
-#define ANDROID_HARDWARE_USB_V1_0_USB_H
+#ifndef ANDROID_HARDWARE_USB_V1_1_USB_H
+#define ANDROID_HARDWARE_USB_V1_1_USB_H
-#include <android/hardware/usb/1.0/IUsb.h>
-#include <hidl/MQDescriptor.h>
+#include <android/hardware/usb/1.1/IUsb.h>
+#include <android/hardware/usb/1.1/types.h>
+#include <android/hardware/usb/1.1/IUsbCallback.h>
#include <hidl/Status.h>
#include <utils/Log.h>
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-
-#define LOG_TAG "android.hardware.usb@1.0-service.device"
#define UEVENT_MSG_LEN 2048
namespace android {
namespace hardware {
namespace usb {
-namespace V1_0 {
+namespace V1_1 {
namespace implementation {
-using ::android::hardware::usb::V1_0::IUsb;
-using ::android::hardware::usb::V1_0::IUsbCallback;
using ::android::hardware::usb::V1_0::PortRole;
+using ::android::hardware::usb::V1_0::PortRoleType;
+using ::android::hardware::usb::V1_0::PortDataRole;
+using ::android::hardware::usb::V1_0::PortPowerRole;
+using ::android::hardware::usb::V1_0::Status;
+using ::android::hardware::usb::V1_0::IUsb;
+using ::android::hardware::usb::V1_1::IUsbCallback;
+using ::android::hardware::usb::V1_1::PortMode_1_1;
+using ::android::hardware::usb::V1_1::PortStatus_1_1;
+using ::android::hidl::base::V1_0::DebugInfo;
using ::android::hidl::base::V1_0::IBase;
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
@@ -33,9 +36,10 @@ using ::android::sp;
struct Usb : public IUsb {
Return<void> switchRole(const hidl_string& portName, const PortRole& role) override;
- Return<void> setCallback(const sp<IUsbCallback>& callback) override;
+ Return<void> setCallback(const sp<::android::hardware::usb::V1_0::IUsbCallback>& callback) override;
Return<void> queryPortStatus() override;
+
sp<IUsbCallback> mCallback;
pthread_mutex_t mLock = PTHREAD_MUTEX_INITIALIZER;
@@ -49,4 +53,4 @@ struct Usb : public IUsb {
} // namespace hardware
} // namespace android
-#endif // ANDROID_HARDWARE_USB_V1_0_USB_H
+#endif // ANDROID_HARDWARE_USB_V1_1_USB_H
diff --git a/usb/1.1-typec/android.hardware.usb@1.0-service.device.rc b/usb/1.1-typec/android.hardware.usb@1.1-service.wahoo.rc
index dd74760..e51a870 100644
--- a/usb/1.1-typec/android.hardware.usb@1.0-service.device.rc
+++ b/usb/1.1-typec/android.hardware.usb@1.1-service.wahoo.rc
@@ -1,4 +1,4 @@
-service usb-hal-1-0 /vendor/bin/hw/android.hardware.usb@1.0-service.device
+service usb-hal-1-1 /vendor/bin/hw/android.hardware.usb@1.1-service.wahoo
class hal
user system
group system
diff --git a/usb/1.1-typec/service.cpp b/usb/1.1-typec/service.cpp
index fbc099e..495d76f 100644
--- a/usb/1.1-typec/service.cpp
+++ b/usb/1.1-typec/service.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#define LOG_TAG "android.hardware.usb@1.1-service.wahoo"
+
#include <hidl/HidlTransportSupport.h>
#include "Usb.h"
@@ -25,7 +27,7 @@ using android::hardware::joinRpcThreadpool;
// Generated HIDL files
using android::hardware::usb::V1_0::IUsb;
-using android::hardware::usb::V1_0::implementation::Usb;
+using android::hardware::usb::V1_1::implementation::Usb;
using android::status_t;
using android::OK;