mirror of
https://github.com/Evolution-X-Devices/device_xiaomi_rosemary
synced 2026-01-27 07:49:58 +00:00
rosemary: Checkout packages from V13.0.6.0
* Drop unneeded shims * Spoofing roles is not needed anymore, so drop USB HAL Change-Id: I4af4ace2db11e2388d5c14157f72f30ec5c5e625
This commit is contained in:
72
device.mk
72
device.mk
@@ -50,8 +50,8 @@ PRODUCT_PACKAGES += \
|
||||
# Audio
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.audio.service.mediatek \
|
||||
android.hardware.audio@6.0-impl \
|
||||
android.hardware.audio.effect@6.0-impl \
|
||||
android.hardware.audio@7.0-impl \
|
||||
android.hardware.audio.effect@7.0-impl \
|
||||
android.hardware.bluetooth.audio-impl \
|
||||
android.hardware.soundtrigger@2.3-impl
|
||||
|
||||
@@ -61,12 +61,8 @@ PRODUCT_PACKAGES += \
|
||||
audio.usb.default
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libshim_audio
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libalsautils_legacy \
|
||||
libtinycompress \
|
||||
libtinyxml \
|
||||
libaudiofoundation.vendor \
|
||||
tinymix
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
@@ -82,9 +78,9 @@ PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/configs/audio/usb_audio_accessory_only_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_accessory_only_policy_configuration.xml
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/a2dp_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/r_submix_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/r_submix_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/usb_audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/usb_audio_policy_configuration.xml \
|
||||
frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.xml
|
||||
@@ -109,16 +105,10 @@ PRODUCT_PACKAGES += \
|
||||
PRODUCT_PACKAGES += \
|
||||
libdng_sdk.vendor
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libshim_utils
|
||||
|
||||
# Charger
|
||||
PRODUCT_PACKAGES += \
|
||||
libsuspend
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libshim_showlogo
|
||||
|
||||
# Display
|
||||
TARGET_SCREEN_DENSITY := 440
|
||||
TARGET_SCREEN_HEIGHT := 2400
|
||||
@@ -143,7 +133,7 @@ PRODUCT_PACKAGES += \
|
||||
|
||||
# Display
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.graphics.composer@2.1-service
|
||||
android.hardware.graphics.composer@2.2-service
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.memtrack-service.mediatek-mali
|
||||
@@ -154,6 +144,7 @@ PRODUCT_PACKAGES += \
|
||||
android.hardware.graphics.allocator@4.0.vendor
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libdrm \
|
||||
libdrm.vendor
|
||||
|
||||
# Dynamic Partitions
|
||||
@@ -188,7 +179,8 @@ PRODUCT_PACKAGES += \
|
||||
android.hardware.gnss@2.1.vendor \
|
||||
android.hardware.gnss.measurement_corrections@1.0.vendor \
|
||||
android.hardware.gnss.measurement_corrections@1.1.vendor \
|
||||
android.hardware.gnss.visibility_control@1.0.vendor
|
||||
android.hardware.gnss.visibility_control@1.0.vendor \
|
||||
android.hardware.gnss-V1-ndk_platform.vendor
|
||||
|
||||
# Health
|
||||
PRODUCT_PACKAGES += \
|
||||
@@ -225,9 +217,6 @@ PRODUCT_BOOT_JARS += \
|
||||
mediatek-telephony-base \
|
||||
mediatek-telephony-common
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libshim_vtservice
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/configs/permissions/privapp-permissions-com.mediatek.ims.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/privapp-permissions-com.mediatek.ims.xml
|
||||
|
||||
@@ -238,17 +227,11 @@ PRODUCT_PACKAGES += \
|
||||
|
||||
# Keymaster
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.keymaster@4.0.vendor
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libkeymaster4.vendor \
|
||||
libkeymaster4support.vendor \
|
||||
libkeymaster41.vendor \
|
||||
libkeymaster4_1support.vendor \
|
||||
libpuresoftkeymasterdevice.vendor \
|
||||
libsoft_attestation_cert.vendor
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libshim_beanpod
|
||||
|
||||
# Lights
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.light-service.rosemary
|
||||
@@ -258,6 +241,14 @@ PRODUCT_PACKAGES += \
|
||||
vendor.lineage.health-service.default
|
||||
|
||||
# Media
|
||||
PRODUCT_PACKAGES += \
|
||||
libcodec2_hidl@1.1.vendor \
|
||||
libcodec2_hidl@1.2.vendor \
|
||||
libavservices_minijail_vendor \
|
||||
libstagefright_softomx_plugin.vendor \
|
||||
libsfplugin_ccodec_utils.vendor \
|
||||
libcodec2_soft_common.vendor
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/configs/media/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \
|
||||
$(LOCAL_PATH)/configs/media/media_codecs_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_c2.xml \
|
||||
@@ -378,6 +369,7 @@ PRODUCT_COPY_FILES += \
|
||||
frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml \
|
||||
frameworks/native/data/etc/android.hardware.opengles.aep.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.opengles.aep.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \
|
||||
@@ -402,6 +394,7 @@ PRODUCT_COPY_FILES += \
|
||||
frameworks/native/data/etc/android.software.ipsec_tunnels.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.ipsec_tunnels.xml \
|
||||
frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml \
|
||||
frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.verified_boot.xml \
|
||||
frameworks/native/data/etc/android.software.opengles.deqp.level-2020-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml \
|
||||
frameworks/native/data/etc/android.software.vulkan.deqp.level-2020-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.vulkan.deqp.level.xml \
|
||||
frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml
|
||||
|
||||
@@ -413,11 +406,11 @@ PRODUCT_PACKAGES += \
|
||||
android.hardware.radio@1.3.vendor \
|
||||
android.hardware.radio@1.4.vendor \
|
||||
android.hardware.radio@1.5.vendor \
|
||||
android.hardware.radio@1.6.vendor \
|
||||
android.hardware.radio.config@1.0.vendor \
|
||||
android.hardware.radio.config@1.1.vendor \
|
||||
android.hardware.radio.config@1.2.vendor \
|
||||
android.hardware.radio.deprecated@1.0.vendor \
|
||||
android.hardware.radio-V1.4-java
|
||||
android.hardware.radio.config@1.3.vendor
|
||||
|
||||
# Rootdir
|
||||
PRODUCT_PACKAGES += \
|
||||
@@ -443,6 +436,7 @@ PRODUCT_PACKAGES += \
|
||||
android.hardware.sensors@2.1-service.multihal \
|
||||
android.hardware.sensors@1.0.vendor \
|
||||
android.hardware.sensors@2.0.vendor \
|
||||
android.hardware.sensors@2.1.vendor \
|
||||
android.hardware.sensors@2.0-ScopedWakelock.vendor \
|
||||
android.frameworks.sensorservice@1.0
|
||||
|
||||
@@ -469,7 +463,12 @@ PRODUCT_PACKAGES += \
|
||||
|
||||
# USB
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.usb@1.1-service.rosemary
|
||||
android.hardware.usb@1.0.vendor \
|
||||
android.hardware.usb@1.1.vendor \
|
||||
android.hardware.usb@1.2.vendor \
|
||||
android.hardware.usb@1.3.vendor \
|
||||
android.hardware.usb.gadget@1.0.vendor \
|
||||
android.hardware.usb.gadget@1.1.vendor
|
||||
|
||||
# Vibrator
|
||||
PRODUCT_PACKAGES += \
|
||||
@@ -478,8 +477,6 @@ PRODUCT_PACKAGES += \
|
||||
# VNDK
|
||||
PRODUCT_PACKAGES += \
|
||||
libutils-v32 \
|
||||
libhidlbase-v32 \
|
||||
libui-v32
|
||||
|
||||
# Wi-Fi
|
||||
PRODUCT_PACKAGES += \
|
||||
@@ -487,9 +484,14 @@ PRODUCT_PACKAGES += \
|
||||
android.hardware.wifi.supplicant@1.1.vendor \
|
||||
android.hardware.wifi.supplicant@1.2.vendor \
|
||||
android.hardware.wifi.supplicant@1.3.vendor \
|
||||
android.hardware.wifi.supplicant@1.4.vendor \
|
||||
android.hardware.wifi.hostapd@1.0.vendor \
|
||||
android.hardware.wifi.hostapd@1.1.vendor \
|
||||
android.hardware.wifi.hostapd@1.2.vendor
|
||||
android.hardware.wifi.hostapd@1.2.vendor \
|
||||
android.hardware.wifi.hostapd@1.3.vendor \
|
||||
android.hardware.tetheroffload.config@1.0.vendor \
|
||||
android.hardware.tetheroffload.control@1.0.vendor \
|
||||
android.hardware.tetheroffload.control@1.1.vendor
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.wifi@1.0-service-lazy.rosemary
|
||||
|
||||
@@ -55,12 +55,8 @@ fi
|
||||
|
||||
function blob_fixup {
|
||||
case "$1" in
|
||||
vendor/lib*/hw/audio.primary.mt6785.so)
|
||||
"${PATCHELF}" --add-needed "libshim_audio.so" "${2}"
|
||||
"${PATCHELF}" --replace-needed "libalsautils.so" "libalsautils_legacy.so" "${2}"
|
||||
;;
|
||||
vendor/lib*/hw/audio.usb.mt6785.so)
|
||||
"${PATCHELF}" --replace-needed "libalsautils.so" "libalsautils_legacy.so" "${2}"
|
||||
vendor/bin/hw/vendor.mediatek.hardware.mtkpower@1.0-service)
|
||||
"${PATCHELF}" --replace-needed "android.hardware.power-V2-ndk_platform.so" "android.hardware.power-V2-ndk.so" "${2}"
|
||||
;;
|
||||
vendor/lib64/libwifi-hal-mtk.so)
|
||||
"$PATCHELF" --set-soname libwifi-hal-mtk.so "${2}"
|
||||
@@ -68,41 +64,18 @@ function blob_fixup {
|
||||
vendor/lib64/libmtkcam_stdutils.so)
|
||||
"${PATCHELF}" --replace-needed "libutils.so" "libutils-v32.so" "${2}"
|
||||
;;
|
||||
vendor/lib*/hw/dfps.mt6785.so)
|
||||
"${PATCHELF}" --replace-needed "libutils.so" "libutils-v32.so" "${2}"
|
||||
;;
|
||||
vendor/lib/libMtkOmxVdecEx.so)
|
||||
"${PATCHELF}" --replace-needed "libui.so" "libui-v32.so" "${2}"
|
||||
;;
|
||||
vendor/lib*/hw/vendor.mediatek.hardware.pq@2.6-impl.so)
|
||||
vendor/lib*/hw/vendor.mediatek.hardware.pq@2.13-impl.so)
|
||||
"${PATCHELF}" --replace-needed "libutils.so" "libutils-v32.so" "${2}"
|
||||
;;
|
||||
vendor/lib64/libvendor.goodix.hardware.biometrics.fingerprint@2.1.so)
|
||||
"${PATCHELF_0_8}" --remove-needed "libhidlbase.so" "${2}"
|
||||
sed -i "s/libhidltransport.so/libhidlbase-v32.so\x00/" "${2}"
|
||||
;;
|
||||
vendor/lib64/libcam.halsensor.so)
|
||||
"${PATCHELF}" --add-needed "libshim_utils.so" "${2}"
|
||||
;;
|
||||
vendor/lib64/libgf_hal.so)
|
||||
xxd -p "${2}" | sed "s/ffc301d1fd7b06a9fd830191e8031f2ae2037db2a94300d14ad03bd54a15/000080d2c0035fd6fd830191e8031f2ae2037db2a94300d14ad03bd54a15/g" | xxd -r -p > "${2}".patched
|
||||
mv "${2}".patched "${2}"
|
||||
sed -i 's/\xff\xc3\x01\xd1\xfd\x7b\x06\xa9/\x00\x00\x80\xd2\xc0\x03\x5f\xd6/g' "${2}"
|
||||
;;
|
||||
vendor/lib64/hw/fingerprint.fpc.default.so)
|
||||
xxd -p "${2}" | sed "s/5fd600000000ff4301d1fd7b02a9fd830091f51b00f9f44f04a954d03bd5/5fd600000000c0035fd6fd7b02a9fd830091f51b00f9f44f04a954d03bd5/g" | xxd -r -p > "${2}".patched
|
||||
mv "${2}".patched "${2}"
|
||||
;;
|
||||
vendor/bin/hw/android.hardware.keymaster@4.0-service.beanpod)
|
||||
"${PATCHELF}" --add-needed "libshim_beanpod.so" "${2}"
|
||||
;;
|
||||
vendor/bin/hw/vendor.mediatek.hardware.mtkpower@1.0-service)
|
||||
"${PATCHELF}" --replace-needed "android.hardware.power-V1-ndk_platform.so" "android.hardware.power-V1-ndk.so" "${2}"
|
||||
;;
|
||||
lib/libshowlogo.so)
|
||||
"${PATCHELF}" --add-needed "libshim_showlogo.so" "${2}"
|
||||
;;
|
||||
lib/libsink.so)
|
||||
"${PATCHELF}" --add-needed "libshim_vtservice.so" "${2}"
|
||||
sed -i 's/\xff\x43\x01\xd1\xfd\x7b\x02\xa9/\xc0\x03\x5f\xd6\xfd\x7b\x02\xa9/g' "${2}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
//
|
||||
// Copyright (C) 2022 The LineageOS Project
|
||||
//
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
cc_library_shared {
|
||||
name: "libshim_audio",
|
||||
srcs: [
|
||||
"libshim_audio.cpp"
|
||||
],
|
||||
shared_libs: [
|
||||
"libmedia_helper",
|
||||
"libaudioutils"
|
||||
],
|
||||
vendor: true
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libshim_beanpod",
|
||||
srcs: ["libshim_beanpod.cpp"],
|
||||
vendor: true,
|
||||
shared_libs: [
|
||||
"libkeymaster_messages",
|
||||
],
|
||||
header_libs: [
|
||||
"libhardware_headers",
|
||||
],
|
||||
include_dirs: [ "system/keymaster/include" ],
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libshim_showlogo",
|
||||
srcs: ["libshim_showlogo.cpp"],
|
||||
shared_libs: [
|
||||
"libui",
|
||||
"libgui",
|
||||
"libutils",
|
||||
],
|
||||
local_include_dirs: ["include"]
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libshim_utils",
|
||||
srcs: ["libshim_utils.cpp"],
|
||||
vendor: true,
|
||||
compile_multilib: "64",
|
||||
shared_libs: [
|
||||
"libutils",
|
||||
],
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libshim_vtservice",
|
||||
srcs: ["libshim_vtservice.cpp"],
|
||||
compile_multilib: "32",
|
||||
shared_libs: [
|
||||
"libaudioclient",
|
||||
"libgui",
|
||||
"libstagefright",
|
||||
"libutils",
|
||||
"libbinder",
|
||||
],
|
||||
header_libs: [
|
||||
"libaudioclient_headers",
|
||||
"libmedia_headers",
|
||||
"libmediametrics_headers",
|
||||
],
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include <ui/Size.h>
|
||||
#include <utils/Timers.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
// Configuration supported by physical display.
|
||||
struct DisplayConfig {
|
||||
ui::Size resolution;
|
||||
float xDpi = 0;
|
||||
float yDpi = 0;
|
||||
|
||||
float refreshRate = 0;
|
||||
nsecs_t appVsyncOffset = 0;
|
||||
nsecs_t sfVsyncOffset = 0;
|
||||
nsecs_t presentationDeadline = 0;
|
||||
int configGroup = -1;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
@@ -1,105 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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.
|
||||
*/
|
||||
|
||||
#include <media/TypeConverter.h>
|
||||
|
||||
#define MAKE_STRING_FROM_ENUM(enumval) { #enumval, enumval }
|
||||
#define TERMINATOR { .literal = nullptr }
|
||||
|
||||
namespace android {
|
||||
|
||||
template <>
|
||||
const FormatConverter::Table FormatConverter::mTable[] = {
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_16_BIT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_8_BIT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_32_BIT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_8_24_BIT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_FLOAT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MP3),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AMR_NB),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AMR_WB),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_MAIN),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_SSR),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LTP),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_HE_V1),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_SCALABLE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ERLC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_HE_V2),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ELD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_XHE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_MAIN),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_LC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_SSR),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_LTP),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_HE_V1),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_SCALABLE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_ERLC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_LD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_HE_V2),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_ELD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS_XHE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_VORBIS),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_HE_AAC_V1),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_HE_AAC_V2),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_OPUS),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AC3),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_E_AC3),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DTS),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DTS_HD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_IEC61937),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DOLBY_TRUEHD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_EVRC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_EVRCB),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_EVRCWB),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_EVRCNW),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADIF),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_WMA),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_WMA_PRO),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AMR_WB_PLUS),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MP2),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_QCELP),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_DSD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_FLAC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_ALAC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_APE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_ADTS),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_SBC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_APTX),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_APTX_HD),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AC4),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_LDAC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MAT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_E_AC3_JOC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MAT_1_0),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MAT_2_0),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_MAT_2_1),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LATM),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LATM_LC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LATM_HE_V1),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_AAC_LATM_HE_V2),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_CELT),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_APTX_ADAPTIVE),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_LHDC),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_LHDC_LL),
|
||||
MAKE_STRING_FROM_ENUM(AUDIO_FORMAT_APTX_TWSP),
|
||||
TERMINATOR
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
@@ -1,9 +0,0 @@
|
||||
#include <keymaster/android_keymaster_messages.h>
|
||||
|
||||
extern "C" {
|
||||
void _ZN9keymaster19GenerateKeyResponseD1Ev() {}
|
||||
void _ZN9keymaster17AttestKeyResponseD1Ev() {}
|
||||
void _ZN9keymaster16ImportKeyRequest14SetKeyMaterialEPKvm(keymaster::ImportKeyRequest* thisptr, const uint8_t* key_material, size_t length) {
|
||||
thisptr->key_data = keymaster::KeymasterKeyBlob(key_material, length);
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
#include <DisplayConfig.h>
|
||||
#include <ui/Size.h>
|
||||
#include <gui/SurfaceComposerClient.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
extern "C" {
|
||||
|
||||
void _ZN7android21SurfaceComposerClient13createSurfaceERKNS_7String8EjjijRKNS_2spINS_7IBinderEEENS_13LayerMetadataEPj(const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, const sp<IBinder>& parentHandle, LayerMetadata metadata, uint32_t* outTransformHint);
|
||||
|
||||
void _ZN7android21SurfaceComposerClient13createSurfaceERKNS_7String8EjjijPNS_14SurfaceControlENS_13LayerMetadataEPj(const String8& name, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, SurfaceControl* parent, LayerMetadata metadata, uint32_t* outTransformHint) {
|
||||
_ZN7android21SurfaceComposerClient13createSurfaceERKNS_7String8EjjijRKNS_2spINS_7IBinderEEENS_13LayerMetadataEPj(name, w, h, format, flags, nullptr, metadata, nullptr);
|
||||
}
|
||||
|
||||
void _ZN7android14SurfaceControl10getSurfaceEv(void);
|
||||
|
||||
void _ZNK7android14SurfaceControl10getSurfaceEv(void) {
|
||||
_ZN7android14SurfaceControl10getSurfaceEv();
|
||||
}
|
||||
|
||||
status_t _ZN7android21SurfaceComposerClient20getActiveDisplayModeERKNS_2spINS_7IBinderEEEPNS_2ui11DisplayModeE(const sp<IBinder>& display, ui::DisplayMode* mode);
|
||||
|
||||
status_t _ZN7android21SurfaceComposerClient22getActiveDisplayConfigERKNS_2spINS_7IBinderEEEPNS_13DisplayConfigE(const sp<IBinder>& display, DisplayConfig* config) {
|
||||
return _ZN7android21SurfaceComposerClient20getActiveDisplayModeERKNS_2spINS_7IBinderEEEPNS_2ui11DisplayModeE(display, (ui::DisplayMode*)config);
|
||||
}
|
||||
|
||||
status_t _ZN7android21SurfaceComposerClient11Transaction5applyEbb(void* thisptr, bool synchronous, bool oneWay);
|
||||
|
||||
status_t _ZN7android21SurfaceComposerClient11Transaction5applyEb(void* thisptr, bool synchronous) {
|
||||
return _ZN7android21SurfaceComposerClient11Transaction5applyEbb(thisptr, synchronous, false /* oneWay */);
|
||||
}
|
||||
|
||||
ui::Size _ZN7android2ui4Size7INVALIDE;
|
||||
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The LineageOS Project
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <utils/String8.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
extern "C" {
|
||||
|
||||
void _ZN7android7String87toUpperEv(String8* thisptr) {
|
||||
const size_t length = thisptr->size();
|
||||
if (length == 0) return;
|
||||
|
||||
char* buf = thisptr->lockBuffer(length);
|
||||
for (size_t i = length; i > 0; --i) {
|
||||
*buf = static_cast<char>(toupper(*buf));
|
||||
buf++;
|
||||
}
|
||||
thisptr->unlockBuffer(length);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
#include <gui/SurfaceComposerClient.h>
|
||||
#include <media/AudioTrack.h>
|
||||
#include <media/stagefright/MediaMuxer.h>
|
||||
|
||||
using namespace android;
|
||||
|
||||
extern "C" {
|
||||
void _ZN7android10AudioTrackC1E19audio_stream_type_tj14audio_format_t20audio_channel_mask_tj20audio_output_flags_tPFviPvS5_ES5_i15audio_session_tNS0_13transfer_typeEPK20audio_offload_info_tRKNS_7content22AttributionSourceStateEPK18audio_attributes_tbfi(
|
||||
void* thisptr,
|
||||
audio_stream_type_t streamType,
|
||||
uint32_t sampleRate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
size_t frameCount,
|
||||
audio_output_flags_t flags,
|
||||
android::AudioTrack::legacy_callback_t cbf,
|
||||
void* user,
|
||||
int32_t notificationFrames,
|
||||
audio_session_t sessionId,
|
||||
android::AudioTrack::transfer_type transferType,
|
||||
const audio_offload_info_t *offloadInfo,
|
||||
const AttributionSourceState& attributionSource,
|
||||
const audio_attributes_t* pAttributes,
|
||||
bool doNotReconnect,
|
||||
float maxRequiredSpeed,
|
||||
audio_port_handle_t selectedDeviceId);
|
||||
|
||||
void _ZN7android10AudioTrackC1E19audio_stream_type_tj14audio_format_tjj20audio_output_flags_tPFviPvS4_ES4_i15audio_session_tNS0_13transfer_typeEPK20audio_offload_info_tjiPK18audio_attributes_tbfi(
|
||||
void* thisptr,
|
||||
audio_stream_type_t streamType,
|
||||
uint32_t sampleRate,
|
||||
audio_format_t format,
|
||||
audio_channel_mask_t channelMask,
|
||||
size_t frameCount,
|
||||
audio_output_flags_t flags,
|
||||
android::AudioTrack::legacy_callback_t cbf,
|
||||
void* user,
|
||||
int32_t notificationFrames,
|
||||
audio_session_t sessionId,
|
||||
android::AudioTrack::transfer_type transferType,
|
||||
const audio_offload_info_t *offloadInfo,
|
||||
uid_t uid,
|
||||
pid_t pid,
|
||||
const audio_attributes_t* pAttributes,
|
||||
bool doNotReconnect,
|
||||
float maxRequiredSpeed,
|
||||
audio_port_handle_t selectedDeviceId) {
|
||||
AttributionSourceState attributionSource;
|
||||
attributionSource.uid = uid;
|
||||
attributionSource.pid = pid;
|
||||
attributionSource.packageName = "com.mediatek.ims";
|
||||
attributionSource.token = android::sp<android::BBinder>::make();
|
||||
attributionSource.attributionTag = std::nullopt;
|
||||
_ZN7android10AudioTrackC1E19audio_stream_type_tj14audio_format_t20audio_channel_mask_tj20audio_output_flags_tPFviPvS5_ES5_i15audio_session_tNS0_13transfer_typeEPK20audio_offload_info_tRKNS_7content22AttributionSourceStateEPK18audio_attributes_tbfi(
|
||||
thisptr, streamType, sampleRate, format, channelMask, frameCount, flags, cbf,
|
||||
user, notificationFrames, sessionId, transferType, offloadInfo,
|
||||
attributionSource, pAttributes, doNotReconnect, maxRequiredSpeed, selectedDeviceId);
|
||||
}
|
||||
|
||||
void _ZN7android7SurfaceC1ERKNS_2spINS_22IGraphicBufferProducerEEEbRKNS1_INS_7IBinderEEE(
|
||||
void* thisptr, const sp<IGraphicBufferProducer>& bufferProducer, bool controlledByApp, const sp<IBinder>& surfaceControlHandle);
|
||||
|
||||
void _ZN7android7SurfaceC1ERKNS_2spINS_22IGraphicBufferProducerEEEb(
|
||||
void* thisptr, const sp<IGraphicBufferProducer> &bufferProducer, bool controlledByApp) {
|
||||
_ZN7android7SurfaceC1ERKNS_2spINS_22IGraphicBufferProducerEEEbRKNS1_INS_7IBinderEEE(thisptr, bufferProducer, controlledByApp, nullptr);
|
||||
}
|
||||
|
||||
void _ZN7android10MediaMuxerC1EiNS_14MediaMuxerBase12OutputFormatE(void* thisptr, int fd, android::MediaMuxer::OutputFormat format);
|
||||
|
||||
void _ZN7android10MediaMuxerC1EiNS0_12OutputFormatE(void* thisptr, int fd, android::MediaMuxer::OutputFormat format) {
|
||||
_ZN7android10MediaMuxerC1EiNS_14MediaMuxerBase12OutputFormatE(thisptr, fd, format);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,35 +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.
|
||||
cc_binary {
|
||||
name: "android.hardware.usb@1.1-service.rosemary",
|
||||
relative_install_path: "hw",
|
||||
init_rc: ["android.hardware.usb@1.1-service.rosemary.rc"],
|
||||
vintf_fragments: ["android.hardware.usb@1.1-service.rosemary.xml", "android.hardware.usb.gadget@1.1-service.rosemary.xml"],
|
||||
srcs: ["service.cpp", "Usb.cpp", "UsbGadget.cpp"],
|
||||
shared_libs: [
|
||||
"android.hardware.usb@1.0",
|
||||
"android.hardware.usb@1.1",
|
||||
"android.hardware.usb.gadget@1.0",
|
||||
"android.hardware.usb.gadget@1.1",
|
||||
"libbase",
|
||||
"libcutils",
|
||||
"libhardware",
|
||||
"libhidlbase",
|
||||
"liblog",
|
||||
"libutils",
|
||||
],
|
||||
static_libs: ["libusbconfigfs_rosemary"],
|
||||
proprietary: true,
|
||||
}
|
||||
672
usb/Usb.cpp
672
usb/Usb.cpp
@@ -1,672 +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.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "android.hardware.usb@1.1-service.rosemary"
|
||||
|
||||
#include <android-base/logging.h>
|
||||
#include <assert.h>
|
||||
#include <chrono>
|
||||
#include <dirent.h>
|
||||
#include <pthread.h>
|
||||
#include <regex>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <thread>
|
||||
#include <unistd.h>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <cutils/uevent.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/StrongPointer.h>
|
||||
|
||||
#include "Usb.h"
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
|
||||
// Set by the signal handler to destroy the thread
|
||||
volatile bool destroyThread;
|
||||
|
||||
static int32_t readFile(const std::string &filename, std::string *contents) {
|
||||
FILE *fp;
|
||||
ssize_t read = 0;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
fp = fopen(filename.c_str(), "r");
|
||||
if (fp != NULL) {
|
||||
if ((read = getline(&line, &len, fp)) != -1) {
|
||||
char *pos;
|
||||
if ((pos = strchr(line, '\n')) != NULL) *pos = '\0';
|
||||
*contents = line;
|
||||
}
|
||||
free(line);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
} else {
|
||||
ALOGE("fopen failed in readFile %s, errno=%d", filename.c_str(), errno);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int32_t writeFile(const std::string &filename,
|
||||
const std::string &contents) { // Might remove later
|
||||
FILE *fp;
|
||||
int ret;
|
||||
|
||||
fp = fopen(filename.c_str(), "w");
|
||||
if (fp != NULL) {
|
||||
ret = fputs(contents.c_str(), fp);
|
||||
fclose(fp);
|
||||
if (ret == EOF) {
|
||||
ALOGE("fputs failed in writeFile %s", filename.c_str());
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
} else {
|
||||
ALOGE("fopen failed in writeFile %s, errno=%d", filename.c_str(), errno);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string appendRoleNodeHelper(const std::string &portName,
|
||||
PortRoleType type) {
|
||||
std::string node("/sys/class/dual_role_usb/" + portName); // We have /sys/class/dual_role_usb, not /sys/class/typec
|
||||
|
||||
switch (type) {
|
||||
case PortRoleType::DATA_ROLE:
|
||||
return node + "/data_role";
|
||||
case PortRoleType::POWER_ROLE:
|
||||
return node + "/power_role";
|
||||
case PortRoleType::MODE:
|
||||
return node + "/mode"; // We have a separate file for mode
|
||||
default:
|
||||
return node + "/mode"; // Disassembly shows no separate case for non-matches and MODE case could be removed, leaving just default, but let's keep it like that for now in case we need to change something.
|
||||
}
|
||||
}
|
||||
|
||||
std::string convertRoletoString(PortRole role) {
|
||||
if (role.type == PortRoleType::POWER_ROLE) {
|
||||
if (role.role == static_cast<uint32_t>(PortPowerRole::SOURCE)) return "source";
|
||||
else if (role.role == static_cast<uint32_t>(PortPowerRole::SINK)) return "sink";
|
||||
} else if (role.type == PortRoleType::DATA_ROLE) {
|
||||
if (role.role == static_cast<uint32_t>(PortDataRole::HOST)) return "host";
|
||||
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_1_1::UFP)) return "ufp"; // We probably call these 'ufp' and 'dfp', as seen in switchToDrp for example
|
||||
if (role.role == static_cast<uint32_t>(PortMode_1_1::DFP)) return "dfp";
|
||||
}
|
||||
return "none";
|
||||
}
|
||||
|
||||
void extractRole(std::string *roleName) { // Might remove later.
|
||||
std::size_t first, last;
|
||||
|
||||
first = roleName->find("[");
|
||||
last = roleName->find("]");
|
||||
|
||||
if (first != std::string::npos && last != std::string::npos) {
|
||||
*roleName = roleName->substr(first + 1, last - first - 1);
|
||||
}
|
||||
}
|
||||
|
||||
void switchToDrp(const std::string &portName) {
|
||||
std::string filename =
|
||||
appendRoleNodeHelper(std::string(portName.c_str()), PortRoleType::MODE);
|
||||
FILE *fp;
|
||||
|
||||
if (filename != "") {
|
||||
fp = fopen(filename.c_str(), "w");
|
||||
if (fp != NULL) {
|
||||
int ret = fputs("dfp", fp); // Change dual -> dfp. Based on disassembly of stock HAL.
|
||||
fclose(fp);
|
||||
if (ret == EOF)
|
||||
ALOGE("Fatal: Error while switching back to drp");
|
||||
} else {
|
||||
ALOGE("Fatal: Cannot open file to switch back to drp");
|
||||
}
|
||||
} else {
|
||||
ALOGE("Fatal: invalid node type");
|
||||
}
|
||||
}
|
||||
|
||||
Usb::Usb()
|
||||
: mLock(PTHREAD_MUTEX_INITIALIZER),
|
||||
mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER),
|
||||
mPartnerLock(PTHREAD_MUTEX_INITIALIZER),
|
||||
mPartnerUp(false) {
|
||||
pthread_condattr_t attr;
|
||||
if (pthread_condattr_init(&attr)) {
|
||||
ALOGE("pthread_condattr_init failed: %s", strerror(errno));
|
||||
abort();
|
||||
}
|
||||
if (pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) {
|
||||
ALOGE("pthread_condattr_setclock failed: %s", strerror(errno));
|
||||
abort();
|
||||
}
|
||||
if (pthread_cond_init(&mPartnerCV, &attr)) {
|
||||
ALOGE("pthread_cond_init failed: %s", strerror(errno));
|
||||
abort();
|
||||
}
|
||||
if (pthread_condattr_destroy(&attr)) {
|
||||
ALOGE("pthread_condattr_destroy failed: %s", strerror(errno));
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Return<void> Usb::switchRole(const hidl_string &portName,
|
||||
const V1_0::PortRole &newRole) {
|
||||
std::string filename =
|
||||
appendRoleNodeHelper(std::string(portName.c_str()), newRole.type);
|
||||
std::string written;
|
||||
FILE *fp;
|
||||
bool roleSwitch = false;
|
||||
|
||||
if (filename == "") {
|
||||
ALOGE("Fatal: invalid node type");
|
||||
return Void();
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&mRoleSwitchLock);
|
||||
|
||||
/*
|
||||
It looks like we have some type of loop in the stock HAL.
|
||||
The loop starts at 0x4860 and ends at 0x4D4C in android.hardware.usb@1.1-service-mediatek from V12.0.1.0.QJOEUXM
|
||||
We break out of the loop only if the value at W24 register is equal to zero. Before loop start, we can see that W24 is set to 0x14 = 20.
|
||||
We can also see that before deciding to break out or restart, W24 is decremented by 1 and there is an usleep call.
|
||||
The amount of useconds to sleep is stored in register W19. This register is set to 0xC350 = 50000 before the loop.
|
||||
|
||||
We can conclude that the program attempts to write the role 20 times and waits 50000 useconds before trying again.
|
||||
*/
|
||||
for (int i = 0; i < 20; ++i) {
|
||||
ALOGI("filename write: %s role:%s", filename.c_str(),
|
||||
convertRoletoString(newRole).c_str());
|
||||
|
||||
// We don't need to check role type and use a separate way of setting mode, as we simply have a "mode" file for doing that
|
||||
|
||||
fp = fopen(filename.c_str(), "w");
|
||||
if (fp != NULL) {
|
||||
int ret = fputs(convertRoletoString(newRole).c_str(), fp);
|
||||
fclose(fp);
|
||||
if ((ret != EOF) && !readFile(filename, &written)) {
|
||||
// extractRole(&written);
|
||||
ALOGI("written: %s", written.c_str());
|
||||
if (written == convertRoletoString(newRole)) {
|
||||
roleSwitch = true;
|
||||
break; // Role switched, stop retrying.
|
||||
} else {
|
||||
ALOGE("Role switch failed");
|
||||
}
|
||||
} else {
|
||||
ALOGE("failed to update the new role");
|
||||
}
|
||||
} else {
|
||||
ALOGE("fopen failed");
|
||||
}
|
||||
|
||||
usleep(50000);
|
||||
}
|
||||
|
||||
pthread_mutex_lock(&mLock);
|
||||
if (mCallback_1_0 != NULL) {
|
||||
Return<void> ret =
|
||||
mCallback_1_0->notifyRoleSwitchStatus(portName, newRole,
|
||||
roleSwitch ? Status::SUCCESS : Status::ERROR);
|
||||
if (!ret.isOk())
|
||||
ALOGE("RoleSwitchStatus error %s", ret.description().c_str());
|
||||
} else {
|
||||
ALOGE("Not notifying the userspace. Callback is not set");
|
||||
}
|
||||
pthread_mutex_unlock(&mLock);
|
||||
pthread_mutex_unlock(&mRoleSwitchLock);
|
||||
|
||||
return Void();
|
||||
}
|
||||
|
||||
|
||||
Status getCurrentRoleHelper(const std::string &portName, bool connected,
|
||||
PortRoleType type, uint32_t *currentRole) {
|
||||
std::string filename;
|
||||
std::string roleName;
|
||||
// Accessory stuff removed - stock HAL doesn't have that
|
||||
// Mode
|
||||
|
||||
if (type == PortRoleType::POWER_ROLE) {
|
||||
filename = "/sys/class/dual_role_usb/" + portName + "/power_role";
|
||||
*currentRole = static_cast<uint32_t>(PortPowerRole::NONE);
|
||||
} else if (type == PortRoleType::DATA_ROLE) {
|
||||
filename = "/sys/class/dual_role_usb/" + portName + "/data_role";
|
||||
*currentRole = static_cast<uint32_t>(PortDataRole::NONE);
|
||||
} else if (type == PortRoleType::MODE) {
|
||||
filename = "/sys/class/dual_role_usb/" + portName + "/mode"; // We have a separate file for setting mode.
|
||||
*currentRole = static_cast<uint32_t>(PortMode_1_1::NONE);
|
||||
} else {
|
||||
return Status::ERROR;
|
||||
}
|
||||
|
||||
if (!connected) return Status::SUCCESS;
|
||||
|
||||
if (readFile(filename, &roleName)) {
|
||||
ALOGE("getCurrentRole: Failed to open filesystem node: %s",
|
||||
filename.c_str());
|
||||
return Status::ERROR;
|
||||
}
|
||||
|
||||
// extractRole(&roleName); // Probably don't need to extract. The role names on our device are just single words
|
||||
|
||||
// We have simple role names and don't need to make a distinction based on role type
|
||||
if (roleName == "source") {
|
||||
*currentRole = static_cast<uint32_t>(PortPowerRole::SOURCE);
|
||||
} else if (roleName == "sink") {
|
||||
*currentRole = static_cast<uint32_t>(PortPowerRole::SINK);
|
||||
} else if (roleName == "host") {
|
||||
*currentRole = static_cast<uint32_t>(PortDataRole::HOST);
|
||||
} else if (roleName == "dfp") {
|
||||
*currentRole = static_cast<uint32_t>(PortMode_1_1::DFP);
|
||||
} else if (roleName == "device") {
|
||||
*currentRole = static_cast<uint32_t>(PortDataRole::DEVICE);
|
||||
} else if (roleName == "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.
|
||||
*/
|
||||
return Status::UNRECOGNIZED_ROLE;
|
||||
}
|
||||
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
|
||||
Status getTypeCPortNamesHelper(std::unordered_map<std::string, bool> *names) {
|
||||
DIR *dp;
|
||||
|
||||
dp = opendir("/sys/class/dual_role_usb");
|
||||
if (dp != NULL) {
|
||||
struct dirent *ep;
|
||||
|
||||
while ((ep = readdir(dp))) {
|
||||
if (ep->d_type == DT_LNK) {
|
||||
// We don't have -partner suffixes
|
||||
std::unordered_map<std::string, bool>::const_iterator portName =
|
||||
names->find(ep->d_name);
|
||||
if (portName == names->end()) {
|
||||
names->insert({ep->d_name, true}); // True by default - otherwise getPortStatusHelper will never say if role can be switched
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(dp);
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
|
||||
ALOGE("Failed to open /sys/class/dual_role_usb");
|
||||
return Status::ERROR;
|
||||
}
|
||||
|
||||
bool canSwitchRoleHelper(const std::string &portName, PortRoleType /*type*/) {
|
||||
std::string filename = "/sys/class/tcpc/type_c_port0/pe_ready";
|
||||
std::string supportsPD;
|
||||
|
||||
if (!readFile(filename, &supportsPD)) {
|
||||
if (supportsPD == "yes") {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reuse the same method for both V1_0 and V1_1 callback objects.
|
||||
* The caller of this method would reconstruct the V1_0::PortStatus
|
||||
* object if required.
|
||||
*/
|
||||
Status getPortStatusHelper(hidl_vec<PortStatus_1_1> *currentPortStatus_1_1,
|
||||
bool V1_0) {
|
||||
std::unordered_map<std::string, bool> names;
|
||||
Status result = getTypeCPortNamesHelper(&names);
|
||||
int i = -1;
|
||||
|
||||
if (result == Status::SUCCESS) {
|
||||
currentPortStatus_1_1->resize(names.size());
|
||||
for (const std::pair<std::string, bool>& port : names) {
|
||||
i++;
|
||||
ALOGI("%s", port.first.c_str());
|
||||
(*currentPortStatus_1_1)[i].status.portName = port.first;
|
||||
|
||||
uint32_t currentRole;
|
||||
if (getCurrentRoleHelper(port.first, port.second,
|
||||
PortRoleType::POWER_ROLE,
|
||||
¤tRole) == Status::SUCCESS) {
|
||||
(*currentPortStatus_1_1)[i].status.currentPowerRole =
|
||||
static_cast<PortPowerRole>(currentRole);
|
||||
} else {
|
||||
ALOGE("Error while retreiving portNames");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (getCurrentRoleHelper(port.first, port.second, PortRoleType::DATA_ROLE,
|
||||
¤tRole) == Status::SUCCESS) {
|
||||
/* HACK: Our device has broken roles: they appear to be permanently set
|
||||
to NONE and don't respond to configfs writes. This causes Android to
|
||||
not see the USB port as connected, breaking the USB settings.
|
||||
|
||||
To get USB preferences to work, we have to spoof some roles. */
|
||||
if (port.second == true && currentRole == static_cast<uint32_t>(PortDataRole::NONE)) {
|
||||
currentRole = static_cast<uint32_t>(PortDataRole::DEVICE);
|
||||
}
|
||||
|
||||
(*currentPortStatus_1_1)[i].status.currentDataRole =
|
||||
static_cast<PortDataRole>(currentRole);
|
||||
} else {
|
||||
ALOGE("Error while retreiving current port role");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (getCurrentRoleHelper(port.first, port.second, PortRoleType::MODE,
|
||||
¤tRole) == Status::SUCCESS) {
|
||||
// HACK: see above
|
||||
if (port.second == true && currentRole == static_cast<uint32_t>(PortMode_1_1::NONE)) {
|
||||
currentRole = static_cast<uint32_t>(PortMode_1_1::UFP);
|
||||
}
|
||||
|
||||
(*currentPortStatus_1_1)[i].currentMode =
|
||||
static_cast<PortMode_1_1>(currentRole);
|
||||
(*currentPortStatus_1_1)[i].status.currentMode =
|
||||
static_cast<V1_0::PortMode>(currentRole);
|
||||
} else {
|
||||
ALOGE("Error while retreiving current data role");
|
||||
goto done;
|
||||
}
|
||||
|
||||
// Treat mode change like any type of role change - we have the "mode" file in our port directory.
|
||||
(*currentPortStatus_1_1)[i].status.canChangeMode =
|
||||
port.second ? canSwitchRoleHelper(port.first, PortRoleType::MODE)
|
||||
: false;
|
||||
(*currentPortStatus_1_1)[i].status.canChangeDataRole =
|
||||
port.second ? canSwitchRoleHelper(port.first, PortRoleType::DATA_ROLE)
|
||||
: false;
|
||||
(*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_1_1)[i].status.canChangeMode,
|
||||
(*currentPortStatus_1_1)[i].status.canChangeDataRole,
|
||||
(*currentPortStatus_1_1)[i].status.canChangePowerRole);
|
||||
|
||||
if (V1_0) {
|
||||
(*currentPortStatus_1_1)[i].status.supportedModes = V1_0::PortMode::DFP;
|
||||
} else {
|
||||
(*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;
|
||||
}
|
||||
done:
|
||||
return Status::ERROR;
|
||||
}
|
||||
|
||||
Return<void> Usb::queryPortStatus() {
|
||||
hidl_vec<PortStatus_1_1> currentPortStatus_1_1;
|
||||
hidl_vec<V1_0::PortStatus> currentPortStatus;
|
||||
Status status;
|
||||
sp<IUsbCallback> callback_V1_1 = IUsbCallback::castFrom(mCallback_1_0);
|
||||
|
||||
pthread_mutex_lock(&mLock);
|
||||
if (mCallback_1_0 != NULL) {
|
||||
if (callback_V1_1 != NULL) {
|
||||
status = getPortStatusHelper(¤tPortStatus_1_1, false);
|
||||
} else {
|
||||
status = getPortStatusHelper(¤tPortStatus_1_1, true);
|
||||
currentPortStatus.resize(currentPortStatus_1_1.size());
|
||||
for (unsigned long i = 0; i < currentPortStatus_1_1.size(); i++)
|
||||
currentPortStatus[i] = currentPortStatus_1_1[i].status;
|
||||
}
|
||||
|
||||
Return<void> ret;
|
||||
|
||||
if (callback_V1_1 != NULL)
|
||||
ret = callback_V1_1->notifyPortStatusChange_1_1(currentPortStatus_1_1, status);
|
||||
else
|
||||
ret = mCallback_1_0->notifyPortStatusChange(currentPortStatus, status);
|
||||
|
||||
if (!ret.isOk())
|
||||
ALOGE("queryPortStatus_1_1 error %s", ret.description().c_str());
|
||||
} else {
|
||||
ALOGI("Notifying userspace skipped. Callback is NULL");
|
||||
}
|
||||
pthread_mutex_unlock(&mLock);
|
||||
|
||||
return Void();
|
||||
}
|
||||
|
||||
struct data {
|
||||
int uevent_fd;
|
||||
android::hardware::usb::V1_1::implementation::Usb *usb;
|
||||
};
|
||||
|
||||
static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
|
||||
char msg[UEVENT_MSG_LEN + 2];
|
||||
char *cp;
|
||||
int n;
|
||||
|
||||
n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
|
||||
if (n <= 0) return;
|
||||
if (n >= UEVENT_MSG_LEN) /* overflow -- discard */
|
||||
return;
|
||||
|
||||
msg[n] = '\0';
|
||||
msg[n + 1] = '\0';
|
||||
cp = msg;
|
||||
|
||||
while (*cp) {
|
||||
// Removed regex matching for -partner, as we don't seem to have that in the stock HAL and in /sys/class/dual_role_usb.
|
||||
if (!strncmp(cp, "SUBSYSTEM=dual_role_usb", strlen("SUBSYSTEM=dual_role_usb"))) { // Stock HAL looks for dual_role_usb, and it checks the SUBSYSTEM instead of DEVNAME. 0x62D4 in android.hardware.usb@1.1-service-mediatek from V12.0.1.0.QJOEUXM
|
||||
hidl_vec<PortStatus_1_1> currentPortStatus_1_1;
|
||||
ALOGI("uevent received %s", cp);
|
||||
pthread_mutex_lock(&payload->usb->mLock);
|
||||
if (payload->usb->mCallback_1_0 != NULL) {
|
||||
sp<IUsbCallback> callback_V1_1 = IUsbCallback::castFrom(payload->usb->mCallback_1_0);
|
||||
Return<void> ret;
|
||||
|
||||
// V1_1 callback
|
||||
if (callback_V1_1 != NULL) {
|
||||
Status status = getPortStatusHelper(¤tPortStatus_1_1, false);
|
||||
ret = callback_V1_1->notifyPortStatusChange_1_1(
|
||||
currentPortStatus_1_1, status);
|
||||
} else { // V1_0 callback
|
||||
Status status = getPortStatusHelper(¤tPortStatus_1_1, true);
|
||||
|
||||
/*
|
||||
* Copying the result from getPortStatusHelper
|
||||
* into V1_0::PortStatus to pass back through
|
||||
* the V1_0 callback object.
|
||||
*/
|
||||
hidl_vec<V1_0::PortStatus> currentPortStatus;
|
||||
currentPortStatus.resize(currentPortStatus_1_1.size());
|
||||
for (unsigned long i = 0; i < currentPortStatus_1_1.size(); i++)
|
||||
currentPortStatus[i] = currentPortStatus_1_1[i].status;
|
||||
|
||||
ret = payload->usb->mCallback_1_0->notifyPortStatusChange(
|
||||
currentPortStatus, status);
|
||||
}
|
||||
if (!ret.isOk()) ALOGE("error %s", ret.description().c_str());
|
||||
} else {
|
||||
ALOGI("Notifying userspace skipped. Callback is NULL");
|
||||
}
|
||||
pthread_mutex_unlock(&payload->usb->mLock);
|
||||
|
||||
//Role switch is not in progress and port is in disconnected state
|
||||
if (!pthread_mutex_trylock(&payload->usb->mRoleSwitchLock)) {
|
||||
for (unsigned long i = 0; i < currentPortStatus_1_1.size(); i++) {
|
||||
DIR *dp = opendir(std::string("/sys/class/dual_role_usb/"
|
||||
+ std::string(currentPortStatus_1_1[i].status.portName.c_str())).c_str()); // Stock HAL did not append -partner. Based on disassembly - 0x65E0 in android.hardware.usb@1.1-service-mediatek from V12.0.1.0.QJOEUXM
|
||||
if (dp == NULL) {
|
||||
//PortRole role = {.role = static_cast<uint32_t>(PortMode::UFP)};
|
||||
switchToDrp(currentPortStatus_1_1[i].status.portName);
|
||||
} else {
|
||||
closedir(dp);
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock(&payload->usb->mRoleSwitchLock);
|
||||
}
|
||||
break;
|
||||
} // Removed autosuspend regex match stuff - we don't even have the path that regex was looking for on a live device, and there are no mentions of auto suspend stuff in strings from the stock HAL whatsoever. The functions related to auto suspend afterwards have been nuked too.
|
||||
|
||||
/* advance to after the next \0 */
|
||||
while (*cp++) {}
|
||||
}
|
||||
}
|
||||
|
||||
void *work(void *param) {
|
||||
int epoll_fd, uevent_fd;
|
||||
struct epoll_event ev;
|
||||
int nevents = 0;
|
||||
struct data payload;
|
||||
|
||||
ALOGE("creating thread");
|
||||
|
||||
uevent_fd = uevent_open_socket(64 * 1024, true);
|
||||
|
||||
if (uevent_fd < 0) {
|
||||
ALOGE("uevent_init: uevent_open_socket failed\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
payload.uevent_fd = uevent_fd;
|
||||
payload.usb = (android::hardware::usb::V1_1::implementation::Usb *)param;
|
||||
|
||||
fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
|
||||
|
||||
ev.events = EPOLLIN;
|
||||
ev.data.ptr = (void *)uevent_event;
|
||||
|
||||
epoll_fd = epoll_create(64);
|
||||
if (epoll_fd == -1) {
|
||||
ALOGE("epoll_create failed; errno=%d", errno);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
|
||||
ALOGE("epoll_ctl failed; errno=%d", errno);
|
||||
goto error;
|
||||
}
|
||||
|
||||
while (!destroyThread) {
|
||||
struct epoll_event events[64];
|
||||
|
||||
nevents = epoll_wait(epoll_fd, events, 64, -1);
|
||||
if (nevents == -1) {
|
||||
if (errno == EINTR) continue;
|
||||
ALOGE("usb epoll_wait failed; errno=%d", errno);
|
||||
break;
|
||||
}
|
||||
|
||||
for (int n = 0; n < nevents; ++n) {
|
||||
if (events[n].data.ptr)
|
||||
(*(void (*)(int, struct data *payload))events[n].data.ptr)(
|
||||
events[n].events, &payload);
|
||||
}
|
||||
}
|
||||
|
||||
ALOGI("exiting worker thread");
|
||||
error:
|
||||
close(uevent_fd);
|
||||
|
||||
if (epoll_fd >= 0) close(epoll_fd);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void sighandler(int sig) {
|
||||
if (sig == SIGUSR1) {
|
||||
destroyThread = true;
|
||||
ALOGI("destroy set");
|
||||
return;
|
||||
}
|
||||
signal(SIGUSR1, sighandler);
|
||||
}
|
||||
|
||||
Return<void> Usb::setCallback(const sp<V1_0::IUsbCallback> &callback) {
|
||||
|
||||
sp<IUsbCallback> callback_V1_1 = IUsbCallback::castFrom(callback);
|
||||
|
||||
if (callback != NULL)
|
||||
if (callback_V1_1 == NULL)
|
||||
ALOGI("Registering 1.0 callback");
|
||||
|
||||
pthread_mutex_lock(&mLock);
|
||||
/*
|
||||
* When both the old callback and new callback values are NULL,
|
||||
* there is no need to spin off the worker thread.
|
||||
* When both the values are not NULL, we would already have a
|
||||
* worker thread running, so updating the callback object would
|
||||
* be suffice.
|
||||
*/
|
||||
if ((mCallback_1_0 == NULL && callback == NULL) ||
|
||||
(mCallback_1_0 != NULL && callback != NULL)) {
|
||||
/*
|
||||
* Always store as V1_0 callback object. Type cast to V1_1
|
||||
* when the callback is actually invoked.
|
||||
*/
|
||||
mCallback_1_0 = callback;
|
||||
pthread_mutex_unlock(&mLock);
|
||||
return Void();
|
||||
}
|
||||
|
||||
mCallback_1_0 = callback;
|
||||
ALOGI("registering callback");
|
||||
|
||||
// Kill the worker thread if the new callback is NULL.
|
||||
if (mCallback_1_0 == NULL) {
|
||||
pthread_mutex_unlock(&mLock);
|
||||
if (!pthread_kill(mPoll, SIGUSR1)) {
|
||||
pthread_join(mPoll, NULL);
|
||||
ALOGI("pthread destroyed");
|
||||
}
|
||||
return Void();
|
||||
}
|
||||
|
||||
destroyThread = false;
|
||||
signal(SIGUSR1, sighandler);
|
||||
|
||||
/*
|
||||
* Create a background thread if the old callback value is NULL
|
||||
* and being updated with a new value.
|
||||
*/
|
||||
if (pthread_create(&mPoll, NULL, work, this)) {
|
||||
ALOGE("pthread creation failed %d", errno);
|
||||
mCallback_1_0 = NULL;
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&mLock);
|
||||
return Void();
|
||||
}
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
72
usb/Usb.h
72
usb/Usb.h
@@ -1,72 +0,0 @@
|
||||
#ifndef ANDROID_HARDWARE_USB_V1_1_USB_H
|
||||
#define ANDROID_HARDWARE_USB_V1_1_USB_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>
|
||||
|
||||
#define UEVENT_MSG_LEN 2048
|
||||
// The type-c stack waits for 4.5 - 5.5 secs before declaring a port non-pd.
|
||||
// The -partner directory would not be created until this is done.
|
||||
// Having a margin of ~3 secs for the directory and other related bookeeping
|
||||
// structures created and uvent fired.
|
||||
#define PORT_TYPE_TIMEOUT 8
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
|
||||
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_1::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;
|
||||
using ::android::hardware::hidl_string;
|
||||
using ::android::hardware::hidl_vec;
|
||||
using ::android::hardware::Return;
|
||||
using ::android::hardware::Void;
|
||||
using ::android::sp;
|
||||
|
||||
struct Usb : public IUsb {
|
||||
Usb();
|
||||
|
||||
Return<void> switchRole(const hidl_string& portName, const V1_0::PortRole& role) override;
|
||||
Return<void> setCallback(const sp<V1_0::IUsbCallback>& callback) override;
|
||||
Return<void> queryPortStatus() override;
|
||||
|
||||
|
||||
sp<V1_0::IUsbCallback> mCallback_1_0;
|
||||
// Protects mCallback variable
|
||||
pthread_mutex_t mLock;
|
||||
// Protects roleSwitch operation
|
||||
pthread_mutex_t mRoleSwitchLock;
|
||||
// Threads waiting for the partner to come back wait here
|
||||
pthread_cond_t mPartnerCV;
|
||||
// lock protecting mPartnerCV
|
||||
pthread_mutex_t mPartnerLock;
|
||||
// Variable to signal partner coming back online after type switch
|
||||
bool mPartnerUp;
|
||||
|
||||
private:
|
||||
pthread_t mPoll;
|
||||
};
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_HARDWARE_USB_V1_1_USB_H
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.
|
||||
*/
|
||||
#define LOG_TAG "android.hardware.usb.gadget@1.1-service.rosemary"
|
||||
#include "UsbGadget.h"
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace gadget {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
UsbGadget::UsbGadget() {
|
||||
if (access(OS_DESC_PATH, R_OK) != 0) {
|
||||
ALOGE("configfs setup not done yet");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
void currentFunctionsAppliedCallback(bool functionsApplied, void* payload) {
|
||||
UsbGadget* gadget = (UsbGadget*)payload;
|
||||
gadget->mCurrentUsbFunctionsApplied = functionsApplied;
|
||||
}
|
||||
Return<void> UsbGadget::getCurrentUsbFunctions(const sp<V1_0::IUsbGadgetCallback>& callback) {
|
||||
Return<void> ret = callback->getCurrentUsbFunctionsCb(
|
||||
mCurrentUsbFunctions, mCurrentUsbFunctionsApplied ? Status::FUNCTIONS_APPLIED
|
||||
: Status::FUNCTIONS_NOT_APPLIED);
|
||||
if (!ret.isOk()) ALOGE("Call to getCurrentUsbFunctionsCb failed %s", ret.description().c_str());
|
||||
return Void();
|
||||
}
|
||||
V1_0::Status UsbGadget::tearDownGadget() {
|
||||
if (resetGadget() != V1_0::Status::SUCCESS) return V1_0::Status::ERROR;
|
||||
return V1_0::Status::SUCCESS;
|
||||
}
|
||||
Return<Status> UsbGadget::reset() {
|
||||
if (!WriteStringToFile("none", PULLUP_PATH)) {
|
||||
ALOGI("Gadget cannot be pulled down");
|
||||
return Status::ERROR;
|
||||
}
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
static V1_0::Status validateAndSetVidPid(uint64_t functions) {
|
||||
V1_0::Status ret = V1_0::Status::SUCCESS;
|
||||
switch (functions) {
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::MTP):
|
||||
ret = setVidPid("0x2717", "0xFF40");
|
||||
WriteStringToFile("mtp", CONFIG_STR_PATH);
|
||||
WriteStringToFile("1", DESC_USE_PATH);
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::MTP:
|
||||
ret = setVidPid("0x2717", "0xFF48");
|
||||
WriteStringToFile("mtp_adb", CONFIG_STR_PATH);
|
||||
WriteStringToFile("1", DESC_USE_PATH);
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::RNDIS):
|
||||
ret = setVidPid("0x2717", "0xFF80");
|
||||
WriteStringToFile("rndis", CONFIG_STR_PATH);
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::RNDIS:
|
||||
ret = setVidPid("0x2717", "0xFF88");
|
||||
WriteStringToFile("rndis_adb", CONFIG_STR_PATH);
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::PTP):
|
||||
ret = setVidPid("0x2717", "0xFF10");
|
||||
WriteStringToFile("ptp", CONFIG_STR_PATH);
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::PTP:
|
||||
ret = setVidPid("0x2717", "0xFF18");
|
||||
WriteStringToFile("ptp_adb", CONFIG_STR_PATH);
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::ADB):
|
||||
ret = setVidPid("0x18d1", "0x4ee7");
|
||||
WriteStringToFile("adb", CONFIG_STR_PATH);
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::MIDI):
|
||||
ret = setVidPid("0x0E8D", "0x2046");
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::MIDI:
|
||||
ret = setVidPid("0x0E8D", "0x2048");
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::ACCESSORY):
|
||||
ret = setVidPid("0x18d1", "0x2d00");
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::ACCESSORY:
|
||||
ret = setVidPid("0x18d1", "0x2d01");
|
||||
break;
|
||||
case static_cast<uint64_t>(V1_0::GadgetFunction::AUDIO_SOURCE):
|
||||
ret = setVidPid("0x18d1", "0x2d02");
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::AUDIO_SOURCE:
|
||||
ret = setVidPid("0x18d1", "0x2d03");
|
||||
break;
|
||||
case V1_0::GadgetFunction::ACCESSORY | V1_0::GadgetFunction::AUDIO_SOURCE:
|
||||
ret = setVidPid("0x18d1", "0x2d04");
|
||||
break;
|
||||
case V1_0::GadgetFunction::ADB | V1_0::GadgetFunction::ACCESSORY |
|
||||
V1_0::GadgetFunction::AUDIO_SOURCE:
|
||||
ret = setVidPid("0x18d1", "0x2d05");
|
||||
break;
|
||||
default:
|
||||
ALOGE("Combination not supported");
|
||||
ret = V1_0::Status::CONFIGURATION_NOT_SUPPORTED;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
V1_0::Status UsbGadget::setupFunctions(uint64_t functions,
|
||||
const sp<V1_0::IUsbGadgetCallback>& callback,
|
||||
uint64_t timeout) {
|
||||
int i = 1;
|
||||
if (addGenericAndroidFunctions(functions, &i) !=
|
||||
V1_0::Status::SUCCESS)
|
||||
return V1_0::Status::ERROR;
|
||||
|
||||
if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) return V1_0::Status::ERROR;
|
||||
mCurrentUsbFunctionsApplied = true;
|
||||
if (callback) callback->setCurrentUsbFunctionsCb(functions, V1_0::Status::SUCCESS);
|
||||
return V1_0::Status::SUCCESS;
|
||||
}
|
||||
|
||||
Return<void> UsbGadget::setCurrentUsbFunctions(uint64_t functions,
|
||||
const sp<V1_0::IUsbGadgetCallback>& callback,
|
||||
uint64_t timeout) {
|
||||
std::unique_lock<std::mutex> lk(mLockSetCurrentFunction);
|
||||
mCurrentUsbFunctions = functions;
|
||||
mCurrentUsbFunctionsApplied = false;
|
||||
// Unlink the gadget
|
||||
V1_0::Status status = tearDownGadget();
|
||||
if (status != V1_0::Status::SUCCESS) {
|
||||
goto error;
|
||||
}
|
||||
ALOGI("Returned from tearDown gadget");
|
||||
// Leave the gadget pulled down to give time for the host to sense disconnect.
|
||||
usleep(kDisconnectWaitUs);
|
||||
if (functions == static_cast<uint64_t>(V1_0::GadgetFunction::NONE)) {
|
||||
if (callback == NULL) return Void();
|
||||
Return<void> ret = callback->setCurrentUsbFunctionsCb(functions, V1_0::Status::SUCCESS);
|
||||
if (!ret.isOk())
|
||||
ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str());
|
||||
return Void();
|
||||
}
|
||||
status = validateAndSetVidPid(functions);
|
||||
if (status != V1_0::Status::SUCCESS) {
|
||||
goto error;
|
||||
}
|
||||
status = setupFunctions(functions, callback, timeout);
|
||||
if (status != V1_0::Status::SUCCESS) {
|
||||
goto error;
|
||||
}
|
||||
ALOGI("Usb Gadget setcurrent functions called successfully");
|
||||
return Void();
|
||||
error:
|
||||
ALOGI("Usb Gadget setcurrent functions failed");
|
||||
if (callback == NULL) return Void();
|
||||
Return<void> ret = callback->setCurrentUsbFunctionsCb(functions, status);
|
||||
if (!ret.isOk())
|
||||
ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.description().c_str());
|
||||
return Void();
|
||||
}
|
||||
} // namespace implementation
|
||||
} // namespace V1_1
|
||||
} // namespace gadget
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
@@ -1,94 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_HARDWARE_USB_GADGET_V1_1_USBGADGET_H
|
||||
#define ANDROID_HARDWARE_USB_GADGET_V1_1_USBGADGET_H
|
||||
|
||||
#include <UsbGadgetCommon.h>
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <android/hardware/usb/gadget/1.1/IUsbGadget.h>
|
||||
#include <hidl/MQDescriptor.h>
|
||||
#include <hidl/Status.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <sys/eventfd.h>
|
||||
#include <utils/Log.h>
|
||||
#include <chrono>
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace gadget {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
|
||||
using ::android::sp;
|
||||
using ::android::base::GetProperty;
|
||||
using ::android::base::SetProperty;
|
||||
using ::android::base::unique_fd;
|
||||
using ::android::base::WriteStringToFile;
|
||||
using ::android::hardware::hidl_array;
|
||||
using ::android::hardware::hidl_memory;
|
||||
using ::android::hardware::hidl_string;
|
||||
using ::android::hardware::hidl_vec;
|
||||
using ::android::hardware::Return;
|
||||
using ::android::hardware::Void;
|
||||
using ::android::hardware::usb::gadget::getVendorFunctions;
|
||||
using ::android::hardware::usb::gadget::kDebug;
|
||||
using ::android::hardware::usb::gadget::kDisconnectWaitUs;
|
||||
using ::android::hardware::usb::gadget::linkFunction;
|
||||
using ::android::hardware::usb::gadget::resetGadget;
|
||||
using ::android::hardware::usb::gadget::setVidPid;
|
||||
using ::android::hardware::usb::gadget::unlinkFunctions;
|
||||
using ::std::string;
|
||||
|
||||
constexpr char kGadgetName[] = "musb-hdrc";
|
||||
|
||||
struct UsbGadget : public IUsbGadget {
|
||||
UsbGadget();
|
||||
|
||||
// Makes sure that only one request is processed at a time.
|
||||
std::mutex mLockSetCurrentFunction;
|
||||
uint64_t mCurrentUsbFunctions;
|
||||
bool mCurrentUsbFunctionsApplied;
|
||||
|
||||
Return<void> setCurrentUsbFunctions(uint64_t functions,
|
||||
const sp<V1_0::IUsbGadgetCallback>& callback,
|
||||
uint64_t timeout) override;
|
||||
|
||||
Return<void> getCurrentUsbFunctions(const sp<V1_0::IUsbGadgetCallback>& callback) override;
|
||||
|
||||
Return<Status> reset() override;
|
||||
|
||||
private:
|
||||
V1_0::Status tearDownGadget();
|
||||
V1_0::Status setupFunctions(uint64_t functions, const sp<V1_0::IUsbGadgetCallback>& callback,
|
||||
uint64_t timeout);
|
||||
};
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_1
|
||||
} // namespace gadget
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_HARDWARE_USB_V1_1_USBGADGET_H
|
||||
@@ -1,11 +0,0 @@
|
||||
<manifest version="1.0" type="device">
|
||||
<hal format="hidl">
|
||||
<name>android.hardware.usb.gadget</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IUsbGadget</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
</manifest>
|
||||
@@ -1,13 +0,0 @@
|
||||
service vendor.usb-hal-1-1 /vendor/bin/hw/android.hardware.usb@1.1-service.rosemary
|
||||
class hal
|
||||
user root
|
||||
group root system shell mtp
|
||||
capabilities
|
||||
|
||||
on boot
|
||||
chown root system /sys/class/dual_role_usb/dual-role-type_c_port0/power_role
|
||||
chown root system /sys/class/dual_role_usb/dual-role-type_c_port0/data_role
|
||||
chown root system /sys/class/dual_role_usb/dual-role-type_c_port0/port_type
|
||||
chmod 664 /sys/class/dual_role_usb/dual-role-type_c_port0/power_role
|
||||
chmod 664 /sys/class/dual_role_usb/dual-role-type_c_port0/data_role
|
||||
chmod 664 /sys/class/dual_role_usb/dual-role-type_c_port0/port_type
|
||||
@@ -1,11 +0,0 @@
|
||||
<manifest version="1.0" type="device">
|
||||
<hal format="hidl">
|
||||
<name>android.hardware.usb</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IUsb</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
</manifest>
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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_library_static {
|
||||
name: "libusbconfigfs_rosemary",
|
||||
vendor_available: true,
|
||||
export_include_dirs: ["include"],
|
||||
|
||||
srcs: [
|
||||
"UsbGadgetUtils.cpp",
|
||||
],
|
||||
|
||||
cflags: [
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-Wno-error=unused-parameter",
|
||||
],
|
||||
|
||||
shared_libs: [
|
||||
"android.hardware.usb.gadget@1.0",
|
||||
"android.hardware.usb.gadget@1.1",
|
||||
"libbase",
|
||||
"libcutils",
|
||||
"libhidlbase",
|
||||
"libutils",
|
||||
],
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "libusbconfigfs"
|
||||
|
||||
#include "include/UsbGadgetCommon.h"
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace gadget {
|
||||
|
||||
int unlinkFunctions(const char* path) {
|
||||
DIR* config = opendir(path);
|
||||
struct dirent* function;
|
||||
char filepath[kMaxFilePathLength];
|
||||
int ret = 0;
|
||||
|
||||
if (config == NULL) return -1;
|
||||
|
||||
// d_type does not seems to be supported in /config
|
||||
// so filtering by name.
|
||||
while (((function = readdir(config)) != NULL)) {
|
||||
if ((strstr(function->d_name, FUNCTION_NAME) == NULL)) continue;
|
||||
// build the path for each file in the folder.
|
||||
sprintf(filepath, "%s/%s", path, function->d_name);
|
||||
ret = remove(filepath);
|
||||
if (ret) {
|
||||
ALOGE("Unable remove file %s errno:%d", filepath, errno);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
closedir(config);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int linkFunction(const char* function, int index) {
|
||||
char functionPath[kMaxFilePathLength];
|
||||
char link[kMaxFilePathLength];
|
||||
|
||||
sprintf(functionPath, "%s%s", FUNCTIONS_PATH, function);
|
||||
sprintf(link, "%s%d", FUNCTION_PATH, index);
|
||||
if (strcmp(function, "rndis.gs4") == 0) {
|
||||
mkdir(functionPath, 0755);
|
||||
}
|
||||
if (symlink(functionPath, link)) {
|
||||
ALOGE("Cannot create symlink %s -> %s errno:%d", link, functionPath, errno);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Status setVidPid(const char* vid, const char* pid) {
|
||||
ALOGI("setVidPid %s %s", vid, pid);
|
||||
if (!WriteStringToFile(vid, VENDOR_ID_PATH)) return Status::ERROR;
|
||||
|
||||
if (!WriteStringToFile(pid, PRODUCT_ID_PATH)) return Status::ERROR;
|
||||
ALOGI("setVidPid %s %s: success", vid, pid);
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
|
||||
std::string getVendorFunctions() {
|
||||
if (GetProperty(kBuildType, "") == "user") return "user";
|
||||
|
||||
std::string bootMode = GetProperty(PERSISTENT_BOOT_MODE, "");
|
||||
std::string persistVendorFunctions = GetProperty(kPersistentVendorConfig, "");
|
||||
std::string vendorFunctions = GetProperty(kVendorConfig, "");
|
||||
std::string ret = "";
|
||||
|
||||
if (vendorFunctions != "") {
|
||||
ret = vendorFunctions;
|
||||
} else if (bootMode == "usbradio" || bootMode == "factory" || bootMode == "ffbm-00" ||
|
||||
bootMode == "ffbm-01") {
|
||||
if (persistVendorFunctions != "")
|
||||
ret = persistVendorFunctions;
|
||||
else
|
||||
ret = "diag";
|
||||
// vendor.usb.config will reflect the current configured functions
|
||||
SetProperty(kVendorConfig, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Status resetGadget() {
|
||||
ALOGI("setCurrentUsbFunctions None");
|
||||
|
||||
if (!WriteStringToFile("none", PULLUP_PATH)) ALOGI("Gadget cannot be pulled down");
|
||||
ALOGI("RESETGADGET: gadget pulled down");
|
||||
if (!WriteStringToFile("0", DEVICE_CLASS_PATH)) return Status::ERROR;
|
||||
ALOGI("RESETGADGET: class reset");
|
||||
if (!WriteStringToFile("0", DEVICE_SUB_CLASS_PATH)) return Status::ERROR;
|
||||
ALOGI("RESETGADGET: subclass reset");
|
||||
if (!WriteStringToFile("0", DEVICE_PROTOCOL_PATH)) return Status::ERROR;
|
||||
ALOGI("RESETGADGET: protocol reset");
|
||||
if (!WriteStringToFile("0", DESC_USE_PATH)) return Status::ERROR;
|
||||
ALOGI("RESETGADGET: use set to 0");
|
||||
if (unlinkFunctions(CONFIG_PATH)) return Status::ERROR;
|
||||
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
|
||||
Status addGenericAndroidFunctions(uint64_t functions, int* functionCount) {
|
||||
if ((functions & GadgetFunction::MTP) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions MTP");
|
||||
if (linkFunction("mtp.gs0", (*functionCount)++)) return Status::ERROR;
|
||||
} else if ((functions & GadgetFunction::PTP) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions PTP");
|
||||
if (linkFunction("ptp.gs1", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
if ((functions & GadgetFunction::MIDI) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions MIDI");
|
||||
if (linkFunction("midi.gs5", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
|
||||
if ((functions & GadgetFunction::ACCESSORY) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions Accessory");
|
||||
if (linkFunction("accessory.gs2", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
|
||||
if ((functions & GadgetFunction::AUDIO_SOURCE) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions Audio Source");
|
||||
if (linkFunction("audio_source.gs3", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
|
||||
if ((functions & GadgetFunction::RNDIS) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions rndis");
|
||||
if (linkFunction("rndis.gs4", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
|
||||
if ((functions & GadgetFunction::ADB) != 0) {
|
||||
ALOGI("setCurrentUsbFunctions ADB");
|
||||
if (linkFunction("ffs.adb", (*functionCount)++)) return Status::ERROR;
|
||||
}
|
||||
return Status::SUCCESS;
|
||||
}
|
||||
|
||||
} // namespace gadget
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
@@ -1,114 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.
|
||||
*/
|
||||
|
||||
#ifndef HARDWARE_USB_USBGADGETCOMMON_H
|
||||
#define HARDWARE_USB_USBGADGETCOMMON_H
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
#include <android/hardware/usb/gadget/1.1/IUsbGadget.h>
|
||||
|
||||
#include <dirent.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <sys/eventfd.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <utils/Log.h>
|
||||
#include <chrono>
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace usb {
|
||||
namespace gadget {
|
||||
|
||||
constexpr int kBufferSize = 512;
|
||||
constexpr int kMaxFilePathLength = 256;
|
||||
constexpr int kEpollEvents = 10;
|
||||
constexpr bool kDebug = false;
|
||||
constexpr int kDisconnectWaitUs = 100000;
|
||||
constexpr int kPullUpDelay = 500000;
|
||||
constexpr int kShutdownMonitor = 100;
|
||||
|
||||
constexpr char kBuildType[] = "ro.build.type";
|
||||
constexpr char kPersistentVendorConfig[] = "persist.vendor.usb.usbradio.config";
|
||||
constexpr char kVendorConfig[] = "vendor.usb.config";
|
||||
|
||||
#define GADGET_PATH "/config/usb_gadget/g1/"
|
||||
#define PULLUP_PATH GADGET_PATH "UDC"
|
||||
#define PERSISTENT_BOOT_MODE "ro.bootmode"
|
||||
#define VENDOR_ID_PATH GADGET_PATH "idVendor"
|
||||
#define PRODUCT_ID_PATH GADGET_PATH "idProduct"
|
||||
#define DEVICE_CLASS_PATH GADGET_PATH "bDeviceClass"
|
||||
#define DEVICE_SUB_CLASS_PATH GADGET_PATH "bDeviceSubClass"
|
||||
#define DEVICE_PROTOCOL_PATH GADGET_PATH "bDeviceProtocol"
|
||||
#define DESC_USE_PATH GADGET_PATH "os_desc/use"
|
||||
#define OS_DESC_PATH GADGET_PATH "os_desc/b.1"
|
||||
#define CONFIG_PATH GADGET_PATH "configs/b.1/"
|
||||
#define CONFIG_STR_PATH CONFIG_PATH "strings/0x409/configuration"
|
||||
#define FUNCTIONS_PATH GADGET_PATH "functions/"
|
||||
#define FUNCTION_NAME "f"
|
||||
#define FUNCTION_PATH CONFIG_PATH FUNCTION_NAME
|
||||
#define RNDIS_PATH FUNCTIONS_PATH "rndis.gs4"
|
||||
|
||||
using ::android::base::GetProperty;
|
||||
using ::android::base::SetProperty;
|
||||
using ::android::base::unique_fd;
|
||||
using ::android::base::WriteStringToFile;
|
||||
using ::android::hardware::usb::gadget::V1_0::GadgetFunction;
|
||||
using ::android::hardware::usb::gadget::V1_0::Status;
|
||||
|
||||
using ::std::lock_guard;
|
||||
using ::std::move;
|
||||
using ::std::mutex;
|
||||
using ::std::string;
|
||||
using ::std::thread;
|
||||
using ::std::unique_ptr;
|
||||
using ::std::vector;
|
||||
using ::std::chrono::microseconds;
|
||||
using ::std::chrono::steady_clock;
|
||||
using ::std::literals::chrono_literals::operator""ms;
|
||||
|
||||
//**************** Helper functions ************************//
|
||||
|
||||
// Removes all the usb functions link in the specified path.
|
||||
int unlinkFunctions(const char* path);
|
||||
// Craetes a configfs link for the function.
|
||||
int linkFunction(const char* function, int index);
|
||||
// Sets the USB VID and PID.
|
||||
Status setVidPid(const char* vid, const char* pid);
|
||||
// Extracts vendor functions from the vendor init properties.
|
||||
std::string getVendorFunctions();
|
||||
// Adds all applicable generic android usb functions other than ADB.
|
||||
Status addGenericAndroidFunctions(uint64_t functions, int* functionCount);
|
||||
// Pulls down USB gadget.
|
||||
Status resetGadget();
|
||||
|
||||
} // namespace gadget
|
||||
} // namespace usb
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
#endif
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016 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.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "android.hardware.usb@1.1-service.rosemary"
|
||||
|
||||
#include <hidl/HidlTransportSupport.h>
|
||||
#include "Usb.h"
|
||||
#include "UsbGadget.h"
|
||||
|
||||
using android::sp;
|
||||
|
||||
// libhwbinder:
|
||||
using android::hardware::configureRpcThreadpool;
|
||||
using android::hardware::joinRpcThreadpool;
|
||||
|
||||
// Generated HIDL files
|
||||
using android::hardware::usb::gadget::V1_1::IUsbGadget;
|
||||
using android::hardware::usb::gadget::V1_1::implementation::UsbGadget;
|
||||
using android::hardware::usb::V1_1::IUsb;
|
||||
using android::hardware::usb::V1_1::implementation::Usb;
|
||||
|
||||
using android::OK;
|
||||
using android::status_t;
|
||||
|
||||
int main() {
|
||||
android::sp<IUsb> service = new Usb();
|
||||
android::sp<IUsbGadget> service2 = new UsbGadget();
|
||||
|
||||
configureRpcThreadpool(2, true /*callerWillJoin*/);
|
||||
status_t status = service->registerAsService();
|
||||
|
||||
if (status != OK) {
|
||||
ALOGE("Cannot register USB HAL service");
|
||||
return 1;
|
||||
}
|
||||
|
||||
status = service2->registerAsService();
|
||||
|
||||
if (status != OK) {
|
||||
ALOGE("Cannot register USB Gadget HAL service");
|
||||
return 1;
|
||||
}
|
||||
|
||||
ALOGI("USB HAL Ready.");
|
||||
joinRpcThreadpool();
|
||||
// Under noraml cases, execution will not reach this line.
|
||||
ALOGI("USB HAL failed to join thread pool.");
|
||||
return 1;
|
||||
}
|
||||
@@ -12,26 +12,3 @@ LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_CHECK_ELF_FILES := false
|
||||
LOCAL_VENDOR_MODULE := true
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libhidlbase-v32
|
||||
LOCAL_SRC_FILES_arm64 := v32/arm64/arch-arm64-armv8-a/shared/vndk-sp/libhidlbase.so
|
||||
LOCAL_MODULE_SUFFIX := .so
|
||||
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
|
||||
LOCAL_MODULE_TARGET_ARCH := arm64
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_CHECK_ELF_FILES := false
|
||||
LOCAL_VENDOR_MODULE := true
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libui-v32
|
||||
LOCAL_SRC_FILES := v32/arm64/arch-arm-armv8-a/shared/vndk-core/libui.so
|
||||
LOCAL_MODULE_SUFFIX := .so
|
||||
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
|
||||
LOCAL_MODULE_TARGET_ARCH := arm
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_CHECK_ELF_FILES := false
|
||||
LOCAL_VENDOR_MODULE := true
|
||||
LOCAL_REQUIRED_MODULES := android.hardware.graphics.common-V2-ndk_platform
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
Reference in New Issue
Block a user