Compare commits

...

12 Commits

Author SHA1 Message Date
Peter Cai b591179d67 init_gsi: Add generic mechanism to preset properties 2023-08-22 05:23:42 -04:00
Peter Cai b9fb2010ee init_gsi: quirks: Add support for Jelly Star touch keys handling 2023-08-21 05:21:26 -04:00
Peter Cai c935edd3d8 init_gsi: Ignore trustkernel hack if key{master,mint} is new enough
The hack is no longer required on newer MTK devices and retaining the
hack may cause more problems than it solves.
2023-08-21 04:30:08 -04:00
Peter Cai 3c0173bcc1 gsi: Enable android.software.telecom feature unconditionally
This is checked by some VoIP software for dialer integration
2023-04-27 15:30:58 -04:00
Peter Cai 8bb3c4bb3d gsi: Allow system apps to access aguiledbelt
For Unihertz Luna LEDs
2023-04-25 13:02:16 -04:00
Peter Cai 9bee6c0d9e interfaces: Correct LedBeltType usage 2023-04-23 15:39:22 -04:00
Peter Cai cdd0128b5b Add aguiledbeltctl command to control LEDs on Unihertz Luna 2023-04-23 15:38:51 -04:00
Peter Cai a426233cb6 Add reversed aguiledbelt HIDL HAL 2023-04-23 13:14:53 -04:00
LuK1337 bfc4cd8de6 overlay: Set config_displayLightSensorType to android.sensor.light 2023-04-20 15:46:33 -04:00
Peter Cai 15872eb9da Fake device properties for MTK trustkernel TEE
MTK doesn't want their devices to boot non-Google GSIs from the **same**
month with the **same** version.

Co-authored-by: Pierre-Hugues Husson <phh@phh.me>
2023-04-19 21:05:32 -04:00
Peter Cai ad6573714d gsi: Fix typo copying sysbta audio policy configuration
Thanks phhusson
2022-12-06 18:32:12 -05:00
Andy CrossGate Yan 3d5b846424 gsi: Build QcRilAm and import SEPolicy for it
Fixes in-call audio on QCOM
2022-11-07 22:14:27 -05:00
25 changed files with 315 additions and 35 deletions

12
cmds/Android.bp Normal file
View File

@ -0,0 +1,12 @@
cc_binary {
name: "aguiledbeltctl",
system_ext_specific: true,
srcs: [
"aguiledbeltctl.cpp",
],
shared_libs: [
"vendor.mediatek.hardware.aguiledbelt@1.0",
"libutils",
"libhidlbase",
],
}

62
cmds/aguiledbeltctl.cpp Normal file
View File

@ -0,0 +1,62 @@
// vim: expandtab tabstop=4 shiftwidth=4
#include <iostream>
#include <string>
#include <vendor/mediatek/hardware/aguiledbelt/1.0/IAguiLedBeltLight.h>
#include <vendor/mediatek/hardware/aguiledbelt/1.0/types.h>
using namespace ::vendor::mediatek::hardware::aguiledbelt::V1_0;
void print_usage() {
std::cerr << "Usage: aguiledbeltctl <light_bit_field> <r> <g> <b> <brightness>" << std::endl;
std::cerr << " aguiledbeltctl clear" << std::endl;
std::cerr << std::endl;
std::cerr << "<light_bit_field> should be a binary string where each bit (0 or 1) corresponds to the ON state of each physical light belt" << std::endl;
}
int main(int argc, char **argv) {
auto service = IAguiLedBeltLight::getService();
if (argc <= 1) {
print_usage();
return -1;
}
std::string arg1(argv[1]);
if (arg1 == "clear") {
service->setLedBeltAlwaysOnState(0, 0, 0, false);
return 0;
}
uint32_t light_id = std::stoi(std::string(argv[1]), nullptr, 2);
if (light_id > 31) {
std::cerr << "First argument should be a bit field with each bit corresponding to one physical light belt" << std::endl;
return 0;
}
if (argc < 6) {
print_usage();
return -1;
}
uint32_t r = std::stoi(std::string(argv[2]));
uint32_t g = std::stoi(std::string(argv[3]));
uint32_t b = std::stoi(std::string(argv[4]));
if (r > 255 || g > 255 || b > 255) {
std::cerr << "Color channels must be bewteen 0 and 255" << std::endl;
return -1;
}
uint32_t brightness = std::stoi(std::string(argv[5]));
if (brightness > 100) {
std::cerr << "Brightness must be between 0 and 100" << std::endl;
return -1;
}
service->setLedBeltAlwaysOnState(light_id, (r << 16) + (g << 8) + b, brightness, false);
return 0;
}

View File

@ -48,6 +48,10 @@ PRODUCT_COPY_FILES += \
PRODUCT_PACKAGES += \
OpenEUICC
# Telecom API (Phone Accounts, etc.)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.software.telecom.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/android.software.telecom.xml
# vendor/foss
include vendor/foss/foss.mk
@ -67,10 +71,18 @@ PRODUCT_PACKAGES += \
PRODUCT_COPY_FILES += \
device/peter/gsi/bluetooth/audio/config/sysbta_audio_policy_configuration.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/sysbta_audio_policy_configuration.xml \
device/peter/gsi/bluetooth/audio/config/sysbta_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUTY_SYSTEM)/etc/sysbta_audio_policy_configuration_7_0.xml
device/peter/gsi/bluetooth/audio/config/sysbta_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/sysbta_audio_policy_configuration_7_0.xml
# QcRilAm service for QCOM in-call audio (packages/apps/QcRilAm)
PRODUCT_PACKAGES += \
QcRilAm
# Enable ro.adb.secure on userdebug and user
ifeq (,$(filter eng,$(TARGET_BUILD_VARIANT)))
PRODUCT_SYSTEM_EXT_PROPERTIES += \
ro.adb.secure=1
endif
# Custom commands
PRODUCT_PACKAGES += \
aguiledbeltctl

View File

@ -4,14 +4,17 @@ cc_binary {
srcs: [
"init_gsi.cpp",
"quirks.cpp",
// Per-device / SoC preset properties
"quirks/preset_props.cpp",
// SoC-specific quirks
"quirks/soc/mtk_ril.cpp",
"quirks/soc/mtk_trustkernel.cpp",
"quirks/soc/caf_audio.cpp",
// Device-specific quirks
"quirks/device/unihertz_keylayout.cpp",
"quirks/device/ulefone_power_armor_13.cpp",
],
shared_libs: ["libbase", "libdl", "liblog", "libutils"],
static_libs: ["libresetprop", "libc++fs"],

View File

@ -9,9 +9,6 @@
using namespace android;
using namespace std;
// From libresetprop
extern int setprop(const char *name, const char *value, bool trigger);
void override_ro_prop(string prefix, string source, string postfix, string value) {
if (value.length() == 0) return;

View File

@ -3,6 +3,7 @@
#include "quirks.h"
#include <cstdarg>
#include <regex>
#include <sstream>
#include <vector>
@ -11,6 +12,19 @@
#include <sys/stat.h>
#include <unistd.h>
// Utility function used with preset properties
void __set_props(int _ignore, ...) {
va_list args;
va_start(args, _ignore);
while (auto key = va_arg(args, const char*)) {
auto val = va_arg(args, const char*);
setprop(key, val, true);
}
va_end(args);
}
// Default constructor to add self to the loaded list of quirks
DeviceQuirk::DeviceQuirk() {
Quirks::Add(this);

View File

@ -8,6 +8,9 @@
#include <sys/wait.h>
#include <unistd.h>
// From libresetprop
extern int setprop(const char *name, const char *value, bool trigger);
#define PROP_STARTS_WITH(prop, prefix) \
(android::base::GetProperty(prop, "").rfind(prefix, 0) == 0)
#define FP_STARTS_WITH(prefix) \
@ -37,6 +40,20 @@ public:
#define LOAD_QUIRK(NAME) \
static NAME _ignored;
void __set_props(int _ignore, ...);
#define CONCAT_(x,y) x##y
#define CONCAT(x,y) CONCAT_(x,y)
#define UNIQUE_NAME CONCAT(_unique_name_, __LINE__)
#define PRESET_PROPS(cond, ...) \
class UNIQUE_NAME: DeviceQuirk { \
public: \
bool ShouldRun() { return cond; } \
void Run() { __set_props(0, __VA_ARGS__, NULL); } \
}; \
static UNIQUE_NAME CONCAT(_ignored, UNIQUE_NAME);
namespace Quirks {
void Add(DeviceQuirk* quirk);
void Run();

View File

@ -1,22 +0,0 @@
#include "../../quirks.h"
#include <android-base/properties.h>
#include <filesystem>
using namespace std;
class UlefonePowerArmor13Quirks : DeviceQuirk {
public:
bool ShouldRun() {
return FP_STARTS_WITH("Ulefone/Power_Armor_13/");
}
void Run() {
// Set the A2DP offload properties to disabled so legacy policy is loaded
android::base::SetProperty("persist.bluetooth.a2dp_offload.disabled", "true");
android::base::SetProperty("persist.bluetooth.bluetooth_audio_hal.disabled", "true");
}
};
LOAD_QUIRK(UlefonePowerArmor13Quirks);

View File

@ -16,7 +16,8 @@ public:
Quirks::OverrideFolderWith("/system/usr/keylayout", [](auto p) {
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-fingerprint_key.kl", p / "fingerprint_key.kl");
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-mtk-tpd.kl", p / "mtk-tpd.kl");
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-mtk-tpd-kpd.kl", p / "mtk-tpd-kpd.kl");
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-mtk-tpd.kl", p / "mtk-tpd-kpd.kl");
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-mtk-tpd.kl", p / "cap_touch.kl");
Quirks::CopyFileKeepPerms("/system/system_ext/quirks/keylayout/unihertz-mtk-kpd.kl", p / "mtk-kpd.kl");
});
}

View File

@ -0,0 +1,15 @@
#include "../quirks.h"
#include <android-base/properties.h>
// Disable navbar by default on devices known to have physical keys
PRESET_PROPS(
FP_STARTS_WITH("Unihertz/Jelly") || FP_STARTS_WITH("Unihertz/Atom"),
"persist.sys.gsi.hw.mainkeys", "1"
);
// Some xiaomi devices: Override default network mode to enable 5G
PRESET_PROPS(
FP_STARTS_WITH("Redmi/gauguin"),
"ro.telephony.default_network", "33,22"
);

View File

@ -0,0 +1,75 @@
#include "../../quirks.h"
#include <android-base/properties.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstdlib>
#include <filesystem>
#include <optional>
#include <string>
#include <utility>
using namespace std;
#define AVB_PROP_OS_VERSION "com.android.build.boot.os_version"
#define AVB_PROP_SPL "com.android.build.boot.security_patch"
optional<pair<string, string>> try_get_spl() {
string boot_part = "/dev/block/by-name/boot" + android::base::GetProperty("ro.boot.slot_suffix", "");
// Read from AVB footer, https://github.com/TrebleDroid/device_phh_treble/blob/android-13.0/fixSPL/getSPL.c
// First read into memory
int fd = open(boot_part.c_str(), O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
char *buf = (char *) malloc(size);
read(fd, buf, size);
// Search for AVB footer property directly in the binary
char* p = (char *) memmem(buf, size, AVB_PROP_OS_VERSION, sizeof(AVB_PROP_OS_VERSION));
if (p == nullptr)
return nullopt;
p += sizeof(AVB_PROP_OS_VERSION);
string os_version(p);
p = (char *) memmem(buf, size, AVB_PROP_SPL, sizeof(AVB_PROP_SPL));
if (p == nullptr)
return nullopt;
p += sizeof(AVB_PROP_SPL);
string spl(p);
return make_pair(os_version, spl);
}
class MtkTkQuirk : DeviceQuirk {
public:
bool ShouldRun() {
return filesystem::exists("/proc/tkcore/tkcore_log")
// No longer an issue after MediaTek upgraded to KeyMint AIDL services
&& !filesystem::exists("/vendor/bin/hw/android.hardware.security.keymint-service.trustkernel");
}
void Run() {
android::base::SetProperty("debug.phh.props.ice.trustkernel", "keymaster");
android::base::SetProperty("debug.phh.props.teed", "keymaster");
android::base::SetProperty("ro.keymaster.brn", "Android");
android::base::SetProperty("ro.keymaster.mod", "AOSP on ARM64");
auto res = try_get_spl();
if (res) {
android::base::SetProperty("ro.keymaster.xxx.release", res->first);
android::base::SetProperty("ro.keymaster.xxx.security_patch", res->second);
}
android::base::SetProperty("ctl.restart", "teed");
}
};
LOAD_QUIRK(MtkTkQuirk)

5
interfaces/Android.bp Normal file
View File

@ -0,0 +1,5 @@
hidl_package_root {
name: "vendor",
path: "device/peter/gsi/interfaces/vendor",
}

View File

@ -0,0 +1,16 @@
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "vendor.mediatek.hardware.aguiledbelt@1.0",
root: "vendor",
system_ext_specific: true,
srcs: [
"types.hal",
"IAguiLedBeltLight.hal",
"ILedBeltLightCallback.hal",
],
interfaces: [
"android.hidl.base@1.0",
],
gen_java: true,
}

View File

@ -0,0 +1,15 @@
package vendor.mediatek.hardware.aguiledbelt@1.0;
import vendor.mediatek.hardware.aguiledbelt@1.0::ILedBeltLightCallback;
import vendor.mediatek.hardware.aguiledbelt@1.0::LedBeltType;
interface IAguiLedBeltLight {
setLedBeltLightMusicState(uint32_t lightId, uint32_t color, uint32_t brightness, bool isRandom);
setLedBeltLightAtomphereState(uint32_t lightId, uint32_t color, uint32_t brightness);
setLedBeltLightState(LedBeltType type, uint32_t color, uint32_t brightness);
setLedBeltBrightnessState(uint32_t lightId, uint32_t color, uint32_t brightness, bool isRandom);
setLedBeltPatternSettingsState(uint32_t lightId, uint32_t color, uint32_t brightness, bool isRandom);
setLedBeltAlwaysOnState(uint32_t lightId, uint32_t color, uint32_t brightness, bool isRandom);
setCallback(ILedBeltLightCallback callback);
setLedBeltChargingState(uint32_t lightId, uint32_t color);
};

View File

@ -0,0 +1,5 @@
package vendor.mediatek.hardware.aguiledbelt@1.0;
interface ILedBeltLightCallback {
onStateChanged(uint32_t id, uint32_t state);
};

View File

@ -0,0 +1,15 @@
package vendor.mediatek.hardware.aguiledbelt@1.0;
enum LedBeltType: uint8_t {
BATTERY = 0x64,
WLR_BATTERY = 0x65,
NOTIFICATIONS = 0x66,
CALL = 0x67,
LIGHT_ID_VOICE_ASSISTANT = 0x68,
MUSIC = 0x6b,
LIGHT_ID_FLIP = 0x6c,
BRIGHTNESS = 0x6e,
ATMOSPHERE = 0x6f,
PATTERN_SETTINGS = 0x70,
ALWAYS_ON = 0x71,
};

View File

@ -64,4 +64,8 @@
<!-- Suppress Intent Filter Verification Service crashes -->
<string translatable="false" name="config_appsNotReportingCrashes">com.android.statementservice</string>
<!-- The type of the light sensor to be used by the display framework for things like
auto-brightness. If unset, then it just gets the default sensor of type TYPE_LIGHT. -->
<string name="config_displayLightSensorType" translatable="false">android.sensor.light</string>
</resources>

View File

@ -1,6 +0,0 @@
# Keylayout for Unihertz devices with capacitive keys
# Capacitive navigation
key 172 HOME VIRTUAL
key 580 APP_SWITCH VIRTUAL
key 158 BACK VIRTUAL

View File

@ -4,5 +4,4 @@ LOCAL_PATH := device/peter/gsi/quirks
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/keylayout/unihertz-fingerprint_key.kl:$(TARGET_COPY_OUT_SYSTEM_EXT)/quirks/keylayout/unihertz-fingerprint_key.kl \
$(LOCAL_PATH)/keylayout/unihertz-mtk-kpd.kl:$(TARGET_COPY_OUT_SYSTEM_EXT)/quirks/keylayout/unihertz-mtk-kpd.kl \
$(LOCAL_PATH)/keylayout/unihertz-mtk-tpd-kpd.kl:$(TARGET_COPY_OUT_SYSTEM_EXT)/quirks/keylayout/unihertz-mtk-tpd-kpd.kl \
$(LOCAL_PATH)/keylayout/unihertz-mtk-tpd.kl:$(TARGET_COPY_OUT_SYSTEM_EXT)/quirks/keylayout/unihertz-mtk-tpd.kl \

View File

@ -0,0 +1,4 @@
type hal_aguiledbelt_hwservice, hwservice_manager_type;
allow system_app hal_aguiledbelt_hwservice:hwservice_manager { find };
type hal_aguiledbelt, domain;
allow system_app hal_aguiledbelt:binder { call };

View File

@ -0,0 +1,4 @@
type rild, domain;
allow system_app hal_telephony_hwservice:hwservice_manager find;
allow { rild system_app } { rild system_app }:binder { call transfer };

View File

@ -0,0 +1,3 @@
# HIDL interface for QcRilAm
vendor.qti.hardware.radio.am::IQcRilAudio u:object_r:hal_telephony_hwservice:s0
vendor.qti.qcril.am::IQcRilAudio u:object_r:hal_telephony_hwservice:s0

View File

@ -0,0 +1,7 @@
# Access to fake keymaster SPL/Android version props -- from TrebleDroid
get_prop(hal_keymaster, default_prop);
get_prop(tee, default_prop);
get_prop(hal_keymaster, system_prop);
get_prop(hal_gatekeeper, system_prop);

View File

@ -0,0 +1,22 @@
type qcrilam_app, domain;
app_domain(qcrilam_app)
# Needed to get access to /data/data/com.sony.qcrilam
# Only getattr and search are requested since qcrilam does not write to its own directory
# /data/data/com.sony.qcrilam only has two empty subdirs
dontaudit qcrilam_app app_data_file:dir { getattr search };
# Access services that should be available to all apps
allow qcrilam_app app_api_service:service_manager find;
# Find media.audio_flinger
allow qcrilam_app audioserver_service:service_manager find;
# Find isub
allow qcrilam_app radio_service:service_manager find;
# Find the vendor.qti.hardware.radio.am::IQcRilAudio HIDL service
# And grant binder access to the host (`rild`)
hal_client_domain(qcrilam_app, hal_telephony)
allow qcrilam_app cgroup:file w_file_perms;

View File

@ -0,0 +1 @@
user=_app seinfo=platform name=com.sony.qcrilam domain=qcrilam_app type=app_data_file