From 05cedc1314cc86b47dcac0372f2923725eb1b833 Mon Sep 17 00:00:00 2001 From: RD Babiera Date: Tue, 19 Sep 2023 19:14:39 +0000 Subject: [PATCH] usb: enable/disable displayport alt mode through enableUsbData Adds functionality for enabling and disabling DisplayPort Alt Mode on the port through enableUsbData in the USB HAL to comply with USB restrictions for heightened security mode. Test: manual test on device - use enableUsbData dumpsys command to turn off DisplayPort and then turn it back on while connected to a partner sink. Bug: 297208252 Change-Id: I9f071bce802b728f2229abc08efb2204e4c2505a Signed-off-by: RD Babiera --- conf/ueventd.zuma.rc | 3 ++ usb/usb/Usb.cpp | 43 +++++++++++++++++++++++++ usb/usb/Usb.h | 2 ++ usb/usb/android.hardware.usb-service.rc | 2 ++ 4 files changed, 50 insertions(+) diff --git a/conf/ueventd.zuma.rc b/conf/ueventd.zuma.rc index 9f4d2b31..dc2c2d4f 100644 --- a/conf/ueventd.zuma.rc +++ b/conf/ueventd.zuma.rc @@ -239,3 +239,6 @@ /sys/bus/aoc/devices/control udfps_set_clock_source 0220 system system /sys/bus/aoc/devices/control udfps_get_osc_freq 0440 system system /sys/bus/aoc/devices/control udfps_get_disp_freq 0440 system system + +# USB Alt Modes +/sys/devices/platform/10cb0000.hsi2c/i2c-*/*-0025/typec/port0/port0-partner/port0-partner.* mode1/active 0664 system system \ No newline at end of file diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 93ea07c4..bac8dd60 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -105,6 +105,7 @@ ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable, int64_t in_transactionId) { bool result = true; std::vector currentPortStatus; + string displayPortPartnerPath; ALOGI("Userspace turn %s USB data signaling. opID:%ld", in_enable ? "on" : "off", in_transactionId); @@ -120,6 +121,27 @@ ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable, ALOGE("Gadget cannot be pulled up"); result = false; } + + if (!WriteStringToFile("1", DISPLAYPORT_ACTIVE_PATH)) { + ALOGE("Failed to enable DisplayPort Alt Mode on port"); + } else { + ALOGI("Successfully enabled DisplayPort Alt Mode on port"); + } + + if (getDisplayPortUsbPathHelper(&displayPortPartnerPath) == Status::SUCCESS) { + size_t pos = displayPortPartnerPath.find("/displayport"); + if (pos != string::npos) { + displayPortPartnerPath = displayPortPartnerPath.substr(0, pos) + "/mode1/active"; + } + if (!WriteStringToFile("1", displayPortPartnerPath)) { + ALOGE("Failed to enable DisplayPort Alt Mode on partner at %s", + displayPortPartnerPath.c_str()); + } else { + ALOGI("Successfully enabled DisplayPort Alt Mode on partner at %s", + displayPortPartnerPath.c_str()); + setupDisplayPortPoll(); + } + } } } else { if (!WriteStringToFile("1", ID_PATH)) { @@ -141,6 +163,27 @@ ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable, ALOGE("Gadget cannot be pulled down"); result = false; } + + if (getDisplayPortUsbPathHelper(&displayPortPartnerPath) == Status::SUCCESS) { + size_t pos = displayPortPartnerPath.find("/displayport"); + if (pos != string::npos) { + displayPortPartnerPath = displayPortPartnerPath.substr(0, pos) + "/mode1/active"; + } + if (!WriteStringToFile("0", displayPortPartnerPath)) { + ALOGE("Failed to disable DisplayPort Alt Mode on partner at %s", + displayPortPartnerPath.c_str()); + } else { + ALOGI("Successfully disabled DisplayPort Alt Mode on partner at %s", + displayPortPartnerPath.c_str()); + shutdownDisplayPortPoll(true); + } + } + + if (!WriteStringToFile("0", DISPLAYPORT_ACTIVE_PATH)) { + ALOGE("Failed to disable DisplayPort Alt Mode on port"); + } else { + ALOGI("Successfully disabled DisplayPort Alt Mode on port"); + } } if (result) { diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h index 566fc73c..ad3be974 100644 --- a/usb/usb/Usb.h +++ b/usb/usb/Usb.h @@ -59,6 +59,8 @@ constexpr char kGadgetName[] = "11210000.dwc3"; #define VBUS_PATH NEW_UDC_PATH "dwc3_exynos_otg_b_sess" #define USB_DATA_PATH NEW_UDC_PATH "usb_data_enabled" +#define DISPLAYPORT_ACTIVE_PATH "/sys/class/typec/port0/port0.0/mode1/active" + #define LINK_TRAINING_STATUS_UNKNOWN "0" #define LINK_TRAINING_STATUS_SUCCESS "1" #define LINK_TRAINING_STATUS_FAILURE "2" diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc index e764ad88..d4db81df 100644 --- a/usb/usb/android.hardware.usb-service.rc +++ b/usb/usb/android.hardware.usb-service.rc @@ -8,6 +8,7 @@ on post-fs chown root system /sys/class/typec/port0/power_role chown root system /sys/class/typec/port0/data_role chown root system /sys/class/typec/port0/port_type + chown root system /sys/class/typec/port0/port0.0/mode1/active chown root system /sys/devices/platform/10cb0000.hsi2c/i2c-0/0-0025/contaminant_detection chown root system /sys/devices/platform/10cb0000.hsi2c/i2c-1/1-0025/contaminant_detection chown root system /sys/devices/platform/10cb0000.hsi2c/i2c-2/2-0025/contaminant_detection @@ -80,6 +81,7 @@ on post-fs chmod 664 /sys/class/typec/port0/power_role chmod 664 /sys/class/typec/port0/data_role chmod 664 /sys/class/typec/port0/port_type + chmod 664 /sys/class/typec/port0/port0.0/mode1/active chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_b_sess chmod 664 /sys/devices/platform/11110000.usb/dwc3_exynos_otg_id chmod 664 /sys/devices/platform/11110000.usb/usb_data_enabled