From 15d11de1444d33b37d6567bb6b05572100736f8f Mon Sep 17 00:00:00 2001 From: Adam Shih Date: Thu, 30 Mar 2023 13:53:05 +0800 Subject: [PATCH 1/3] move wlan dump to relevant devices Bug: 273380509 Test: adb bugreport Change-Id: Id3e11e69a1a0c6502ab2e7883cec34659922f660 --- dumpstate/Dumpstate.cpp | 28 ---------------------------- dumpstate/Dumpstate.h | 8 -------- 2 files changed, 36 deletions(-) diff --git a/dumpstate/Dumpstate.cpp b/dumpstate/Dumpstate.cpp index 828964fb..4221fbbd 100644 --- a/dumpstate/Dumpstate.cpp +++ b/dumpstate/Dumpstate.cpp @@ -68,29 +68,12 @@ void endSection(int fd, const std::string §ionName, timepoint_t startTime) { "\n", fd); } -Dumpstate::Dumpstate() - : mTextSections{ - { "wlan", [this](int fd) { dumpWlanSection(fd); } }, - } {} - // Dump data requested by an argument to the "dump" interface, or help info // if the specified section is not supported. void Dumpstate::dumpTextSection(int fd, const std::string §ionName) { bool dumpAll = (sectionName == kAllSections); std::string dumpFiles; - for (const auto §ion : mTextSections) { - if (dumpAll || sectionName == section.first) { - auto startTime = startSection(fd, section.first); - section.second(fd); - endSection(fd, section.first, startTime); - - if (!dumpAll) { - return; - } - } - } - // Execute all or designated programs under vendor/bin/dump/ std::unique_ptr dir(opendir("/vendor/bin/dump"), closedir); if (!dir) { @@ -124,22 +107,11 @@ void Dumpstate::dumpTextSection(int fd, const std::string §ionName) { // An unsupported section was requested on the command line ::android::base::WriteStringToFd("Unrecognized text section: " + sectionName + "\n", fd); ::android::base::WriteStringToFd("Try \"" + kAllSections + "\" or one of the following:", fd); - for (const auto §ion : mTextSections) { - ::android::base::WriteStringToFd(" " + section.first, fd); - } ::android::base::WriteStringToFd(dumpFiles, fd); ::android::base::WriteStringToFd("\nNote: sections with attachments (e.g. modem) are" "not avalable from the command line.\n", fd); } -// Dump items related to wlan -void Dumpstate::dumpWlanSection(int fd) { - // Dump firmware symbol table for firmware log decryption - DumpFileToFd(fd, "WLAN FW Log Symbol Table", "/vendor/firmware/Data.msc"); - RunCommandToFd(fd, "WLAN TWT Dump", {"/vendor/bin/sh", "-c", - "cat /sys/wlan_ptracker/twt/*"}); -} - void Dumpstate::dumpLogSection(int fd, int fd_bin) { std::string logDir = MODEM_LOG_DIRECTORY; diff --git a/dumpstate/Dumpstate.h b/dumpstate/Dumpstate.h index f4902b39..94546fed 100644 --- a/dumpstate/Dumpstate.h +++ b/dumpstate/Dumpstate.h @@ -27,8 +27,6 @@ namespace dumpstate { class Dumpstate : public BnDumpstateDevice { public: - Dumpstate(); - ::ndk::ScopedAStatus dumpstateBoard(const std::vector<::ndk::ScopedFileDescriptor>& in_fds, IDumpstateDevice::DumpstateMode in_mode, int64_t in_timeoutMillis) override; @@ -42,14 +40,8 @@ class Dumpstate : public BnDumpstateDevice { private: const std::string kAllSections = "all"; - std::vector>> mTextSections; - void dumpTextSection(int fd, std::string const& sectionName); - // Text sections that can be dumped individually on the command line in - // addition to being included in full dumps - void dumpWlanSection(int fd); - void dumpLogSection(int fd, int fdModem); //bool getVerboseLoggingEnabledImpl(); From fdb65f4d141ff81503a14ac807c83c8110450068 Mon Sep 17 00:00:00 2001 From: Roy Luo Date: Fri, 17 Mar 2023 00:44:01 +0000 Subject: [PATCH 2/3] Support GL852G USB hub JK level tuning The JK level setting is configured to the hub via a vendor USB command whenever the hub is enabled. The shell command can be used to change the JK setting for testing purpose, but the values take effect next time the hub is enumerated. Bug: 261923350 Test: adb shell cmd android.hardware.usb.IUsb/default hub-vendor-cmd Test: verify on user/userdebug builds the vendor command is triggered in the following scenarios. 1. boot with Kolan docked 2. undock and dock Kolan 3. kill android.hardware.usb.IUsb/default Change-Id: I8873695c42f362138d99b45ffa2ef637c357202b --- usb/usb/Usb.cpp | 164 +++++++++++++++++++++++++----------------------- usb/usb/Usb.h | 4 ++ 2 files changed, 88 insertions(+), 80 deletions(-) diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 617b3f2e..d5a9ced5 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "android.hardware.usb.aidl-service" #include +#include #include #include #include @@ -95,6 +96,9 @@ void queryVersionHelper(android::hardware::usb::Usb *usb, #define GL852G_PRODUCT_ID1 0x0608 #define GL852G_PRODUCT_ID2 0x0610 #define GL852G_VENDOR_CMD_REQ 0xe3 +// GL852G port 1 and port 2 JK level default settings +#define GL852G_VENDOR_CMD_VALUE_DEFAULT 0x0008 +#define GL852G_VENDOR_CMD_INDEX_DEFAULT 0x0404 ScopedAStatus Usb::enableUsbData(const string& in_portName, bool in_enable, int64_t in_transactionId) { @@ -452,6 +456,61 @@ bool switchMode(const string &portName, const PortRole &in_role, struct Usb *usb return roleSwitch; } +static int usbDeviceRemoved(const char *devname, void* client_data) { + return 0; +} + +static int usbDeviceAdded(const char *devname, void* client_data) { + uint16_t vendorId, productId; + struct usb_device *device; + ::aidl::android::hardware::usb::Usb *usb; + int value, index; + + device = usb_device_open(devname); + if (!device) { + ALOGE("usb_device_open failed\n"); + return 0; + } + + usb = (::aidl::android::hardware::usb::Usb *)client_data; + value = usb->mUsbHubVendorCmdValue; + index = usb->mUsbHubVendorCmdIndex; + + // The vendor cmd only applies to USB Hubs of Genesys Logic, Inc. + // The request field of vendor cmd is fixed to 0xe3. + vendorId = usb_device_get_vendor_id(device); + productId = usb_device_get_product_id(device); + if (vendorId == GL852G_VENDOR_ID && + (productId == GL852G_PRODUCT_ID1 || productId == GL852G_PRODUCT_ID2)) { + int ret = usb_device_control_transfer(device, + USB_DIR_OUT | USB_TYPE_VENDOR, GL852G_VENDOR_CMD_REQ, value, index, + NULL, 0, CTRL_TRANSFER_TIMEOUT_MSEC); + ALOGI("USB hub vendor cmd %s (wValue 0x%x, wIndex 0x%x, return %d)\n", + ret? "failed" : "succeeded", value, index, ret); + } + + usb_device_close(device); + + return 0; +} + +void *usbHostWork(void *param) { + struct usb_host_context *ctx; + + ALOGI("creating USB host thread\n"); + + ctx = usb_host_init(); + if (!ctx) { + ALOGE("usb_host_init failed\n"); + return NULL; + } + + // This will never return, it will keep monitoring USB sysfs inotify events + usb_host_run(ctx, usbDeviceAdded, usbDeviceRemoved, NULL, param); + + return NULL; +} + Usb::Usb() : mLock(PTHREAD_MUTEX_INITIALIZER), mRoleSwitchLock(PTHREAD_MUTEX_INITIALIZER), @@ -465,7 +524,9 @@ Usb::Usb() ThrottlingSeverity::NONE), ZoneInfo(TemperatureType::UNKNOWN, kThermalZoneForTempReadSecondary2, ThrottlingSeverity::NONE)}, kSamplingIntervalSec), - mUsbDataEnabled(true) { + mUsbDataEnabled(true), + mUsbHubVendorCmdValue(GL852G_VENDOR_CMD_VALUE_DEFAULT), + mUsbHubVendorCmdIndex(GL852G_VENDOR_CMD_INDEX_DEFAULT) { pthread_condattr_t attr; if (pthread_condattr_init(&attr)) { ALOGE("pthread_condattr_init failed: %s", strerror(errno)); @@ -483,6 +544,10 @@ Usb::Usb() ALOGE("pthread_condattr_destroy failed: %s", strerror(errno)); abort(); } + if (pthread_create(&mUsbHost, NULL, usbHostWork, this)) { + ALOGE("pthread creation failed %d\n", errno); + abort(); + } } ScopedAStatus Usb::switchRole(const string& in_portName, const PortRole& in_role, @@ -1095,82 +1160,6 @@ ScopedAStatus Usb::setCallback(const shared_ptr& in_callback) { return ScopedAStatus::ok(); } -struct hub_vendor_cmd { - // wValue filed of standard device request - int value; - // wIndex field of standard device request - int index; - // Output pipe to shell command - int out; - // Whether the hub is found - bool found; -}; - -static int usbDeviceAdded(const char *devname, void* client_data) { - struct hub_vendor_cmd *cmd = (struct hub_vendor_cmd *)client_data; - uint16_t vendorId, productId; - struct usb_device *device = usb_device_open(devname); - - if (!device) { - dprintf(cmd->out, "usb_device_open failed\n"); - return 0; - } - - // The vendor cmd only applies to USB Hubs of Genesys Logic, Inc. - // The request field of vendor cmd is fixed to 0xe3. - vendorId = usb_device_get_vendor_id(device); - productId = usb_device_get_product_id(device); - if (vendorId == GL852G_VENDOR_ID && - (productId == GL852G_PRODUCT_ID1 || productId == GL852G_PRODUCT_ID2)) { - int ret = usb_device_control_transfer( - device, USB_DIR_OUT | USB_TYPE_VENDOR, - GL852G_VENDOR_CMD_REQ, cmd->value, cmd->index, NULL, 0, - CTRL_TRANSFER_TIMEOUT_MSEC); - dprintf(cmd->out, "Vendor cmd %s (wValue %x, wIndex %x, return %d)\n", - ret? "failed" : "succeeded", cmd->value, cmd->index, ret); - // Stop iterating through usb devices once the hub is found. - cmd->found = true; - return 1; - } - - return 0; -} - -static int usbDiscoveryDone(void *client_data) -{ - struct hub_vendor_cmd *cmd = (struct hub_vendor_cmd *)client_data; - - dprintf(cmd->out, "Done USB discovery, hub %s found\n", - cmd->found ? "is" : "not"); - - return 1; -} - -static status_t sendHubVendorCmd(int out, Vector& args) { - if (args.size() < 3) { - dprintf(out, "Incorrect number of argument supplied\n"); - return ::android::UNKNOWN_ERROR; - } - struct hub_vendor_cmd cmd = { - .value = std::stoi(args[1].c_str(), NULL, 16), - .index = std::stoi(args[2].c_str(), NULL, 16), - .out = out, - .found = false - }; - - struct usb_host_context *ctx; - ctx = usb_host_init(); - if (!ctx) { - dprintf(out, "usb_host_init failed\n"); - return ::android::UNKNOWN_ERROR; - } - - usb_host_run(ctx, usbDeviceAdded, NULL, usbDiscoveryDone, &cmd); - usb_host_cleanup(ctx); - - return ::android::NO_ERROR; -} - status_t Usb::handleShellCommand(int in, int out, int err, const char** argv, uint32_t argc) { uid_t uid = AIBinder_getCallingUid(); @@ -1186,13 +1175,28 @@ status_t Usb::handleShellCommand(int in, int out, int err, const char** argv, if (argc >= 1) { if (!utf8Args[0].compare(String8("hub-vendor-cmd"))) { - return sendHubVendorCmd(out, utf8Args); + if (utf8Args.size() < 3) { + dprintf(out, "Incorrect number of argument supplied\n"); + return ::android::UNKNOWN_ERROR; + } + int value, index; + if (!::android::base::ParseInt(utf8Args[1].c_str(), &value) || + !::android::base::ParseInt(utf8Args[2].c_str(), &index)) { + dprintf(out, "Fail to parse arguments\n"); + return ::android::UNKNOWN_ERROR; + } + mUsbHubVendorCmdValue = value; + mUsbHubVendorCmdIndex = index; + ALOGI("USB hub vendor cmd update (wValue 0x%x, wIndex 0x%x)\n", + mUsbHubVendorCmdValue, mUsbHubVendorCmdIndex); + return ::android::NO_ERROR; } } dprintf(out, "usage: adb shell cmd hub-vendor-cmd VALUE INDEX\n" - " VALUE wValue field in hex format, e.g. f321\n" - " INDEX wIndex field in hex format, e.g. f321\n"); + " VALUE wValue field in hex format, e.g. 0xf321\n" + " INDEX wIndex field in hex format, e.g. 0xf321\n" + " The settings take effect next time the hub is enabled\n"); return ::android::NO_ERROR; } diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h index 121694a2..e45a5ed0 100644 --- a/usb/usb/Usb.h +++ b/usb/usb/Usb.h @@ -93,8 +93,12 @@ struct Usb : public BnUsb { float mPluggedTemperatureCelsius; // Usb Data status bool mUsbDataEnabled; + // Usb hub vendor command settings for JK level tuning + int mUsbHubVendorCmdValue; + int mUsbHubVendorCmdIndex; private: pthread_t mPoll; + pthread_t mUsbHost; }; } // namespace usb From cfaaafcf40c7248eb253891aa02104741bacdb95 Mon Sep 17 00:00:00 2001 From: Woody Lin Date: Sun, 5 Feb 2023 12:26:40 +0800 Subject: [PATCH 3/3] DO NOT MERGE: gs201: init.debug.rc: Enable etm/etm2dram when ramdump is enabled Bug: 265382296 Change-Id: Ib215551397a361f5734401173e62a15691e45425 (cherry picked from commit 7d695f4bff77b8b34f75150825d4ba5e141dcca2) --- conf/init.debug.rc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/conf/init.debug.rc b/conf/init.debug.rc index 4d5e4c77..d609d7ec 100644 --- a/conf/init.debug.rc +++ b/conf/init.debug.rc @@ -41,3 +41,8 @@ on property:ro.revision=PROTO1.1 setprop debug.hypervisor.metrics_tag "hwrev_a0" on property:ro.revision=EVT1.0 setprop debug.hypervisor.metrics_tag "hwrev_a0" + +# Enable etm/etm2dram when ramdump is enabled. +on property:ro.boot.ramdump=enabled + write /sys/devices/platform/exynos-etm/etm_on 1 + write /sys/devices/platform/etm2dram/arm 1