From ae84f8e65e947f5cd3d5715915c32e32b5184e63 Mon Sep 17 00:00:00 2001 From: Brendan Szymanski Date: Fri, 10 Jul 2026 17:56:31 -0400 Subject: [PATCH] Add device tree for Orange Pi 5 Ultra LineageOS ATV --- Android.bp | 6 + AndroidProducts.mk | 13 + BoardConfig.mk | 84 ++ README.md | 17 +- audio/Android.bp | 44 + audio/audio_hw.c | 755 +++++++++++++++++ audio/audio_hw_hdmi.c | 773 ++++++++++++++++++ audio/audio_policy_configuration.xml | 106 +++ bluetooth/Android.bp | 57 ++ bluetooth/BluetoothHci.cpp | 227 +++++ bluetooth/BluetoothHci.h | 75 ++ .../android.hardware.bluetooth-service.opi.rc | 6 + ...android.hardware.bluetooth-service.opi.xml | 6 + bluetooth/apex_file_contexts | 3 + bluetooth/apex_manifest.json | 4 + bluetooth/main.cpp | 36 + bluetooth/net_bluetooth_mgmt.cpp | 278 +++++++ bluetooth/net_bluetooth_mgmt.h | 44 + bootanimation.zip | Bin 0 -> 805210 bytes compatibility_matrix.xml | 36 + device.mk | 303 +++++++ framework_compatibility_matrix.xml | 12 + hdmi/cec/Android.bp | 54 ++ hdmi/cec/HdmiCec.cpp | 457 +++++++++++ hdmi/cec/HdmiCec.h | 100 +++ hdmi/cec/HdmiCecPort.cpp | 103 +++ hdmi/cec/HdmiCecPort.h | 46 ++ ...ndroid.hardware.tv.hdmi.cec-service.opi.rc | 5 + ...droid.hardware.tv.hdmi.cec-service.opi.xml | 10 + hdmi/cec/apex_file_contexts | 3 + hdmi/cec/apex_manifest.json | 4 + hdmi/cec/main.cpp | 37 + hdmi/connection/Android.bp | 51 ++ hdmi/connection/HdmiConnection.cpp | 119 +++ hdmi/connection/HdmiConnection.h | 62 ++ ...hardware.tv.hdmi.connection-service.opi.rc | 5 + ...ardware.tv.hdmi.connection-service.opi.xml | 10 + hdmi/connection/apex_file_contexts | 3 + hdmi/connection/apex_manifest.json | 4 + hdmi/connection/main.cpp | 37 + health/Android.bp | 59 ++ health/HealthImpl.cpp | 82 ++ health/HealthImpl.h | 42 + health/android.hardware.health-service.opi.rc | 6 + .../android.hardware.health-service.opi.xml | 7 + health/apex_file_contexts | 3 + health/apex_manifest.json | 4 + health/main.cpp | 32 + keylayout/Generic.kl | 501 ++++++++++++ light/Android.bp | 50 ++ light/Lights.cpp | 79 ++ light/Lights.h | 36 + light/android.hardware.light-service.opi.rc | 11 + light/android.hardware.light-service.opi.xml | 7 + light/apex_file_contexts | 3 + light/apex_manifest.json | 4 + light/main.cpp | 36 + lineage_orangepi5ultra.mk | 47 ++ manifest.xml | 37 + media/media_codecs.xml | 24 + media/media_codecs_ffmpeg_c2.xml | 109 +++ media/media_codecs_v4l2_c2_video.xml | 29 + mkbootimg.mk | 41 + mkimg.sh | 98 +++ mkimg_gpt.sh | 167 ++++ overlay/AndroidTvOpiOverlay/Android.bp | 11 + .../AndroidTvOpiOverlay/AndroidManifest.xml | 19 + .../AndroidTvOpiOverlay/res/values/config.xml | 51 ++ overlay/BluetoothOpiOverlay/Android.bp | 11 + .../BluetoothOpiOverlay/AndroidManifest.xml | 19 + .../BluetoothOpiOverlay/res/values/config.xml | 24 + .../SettingsProviderTvOpiOverlay/Android.bp | 11 + .../AndroidManifest.xml | 19 + .../res/values/defaults.xml | 35 + overlay/WifiOpiOverlay/Android.bp | 11 + overlay/WifiOpiOverlay/AndroidManifest.xml | 20 + overlay/WifiOpiOverlay/res/values/config.xml | 46 ++ product_manifest.xml | 1 + ramdisk/fstab.opi5ultra | 10 + ramdisk/init.opi5ultra.rc | 25 + ramdisk/init.opi5ultra.usb.rc | 89 ++ ramdisk/ueventd.opi5ultra.rc | 18 + ...d.hardware.media.c2-default-seccomp_policy | 81 ++ ....hardware.media.c2-extended-seccomp_policy | 22 + .../android.hardware.media.c2-ffmpeg.policy | 59 ++ seccomp_policy/mediacodec.policy | 9 + seccomp_policy/mediaswcodec.policy | 3 + sepolicy/bootanim.te | 1 + sepolicy/device.te | 1 + sepolicy/file.te | 2 + sepolicy/file_contexts | 46 ++ sepolicy/genfs_contexts | 18 + sepolicy/hal_audio_default.te | 1 + sepolicy/hal_camera.te | 12 + sepolicy/hal_drm_clearkey.te | 5 + sepolicy/hal_drm_widevine.te | 8 + sepolicy/hal_graphics_allocator_default.te | 1 + sepolicy/hal_graphics_composer_default.te | 5 + sepolicy/hal_keymint_default.te | 1 + sepolicy/hal_tv_hdmi_cec_default.te | 2 + sepolicy/hal_tv_hdmi_connection_default.te | 1 + sepolicy/init.te | 2 + sepolicy/kernel.te | 4 + sepolicy/keystore.te | 1 + sepolicy/mediacodec.te | 3 + sepolicy/mediaserver.te | 1 + sepolicy/mediaswcodec.te | 1 + sepolicy/netd.te | 2 + sepolicy/platform_app.te | 1 + sepolicy/priv_app.te | 1 + sepolicy/proc_net.te | 1 + sepolicy/property.te | 6 + sepolicy/property_contexts | 23 + sepolicy/service_contexts | 10 + sepolicy/surfaceflinger.te | 1 + sepolicy/suspend_blocker.te | 6 + sepolicy/system_app.te | 1 + sepolicy/system_server.te | 2 + sepolicy/te_macros | 9 + sepolicy/untrusted_app_all.te | 1 + sepolicy/vendor_init.te | 7 + suspend_blocker/Android.bp | 34 + suspend_blocker/apex_file_contexts | 3 + suspend_blocker/apex_manifest.json | 4 + suspend_blocker/suspend_blocker_opi.cpp | 20 + suspend_blocker/suspend_blocker_opi.rc | 4 + usb/Android.bp | 54 ++ usb/MonitorFfs.cpp | 272 ++++++ usb/UsbGadget.cpp | 309 +++++++ usb/UsbGadget.h | 99 +++ usb/UsbGadgetCommon.h | 182 +++++ usb/UsbGadgetUtils.cpp | 210 +++++ ...android.hardware.usb.gadget-service.opi.rc | 4 + ...ndroid.hardware.usb.gadget-service.opi.xml | 10 + usb/apex_file_contexts | 3 + usb/apex_manifest.json | 4 + usb/main.cpp | 36 + vendor.prop | 96 +++ wifi/Android.bp | 69 ++ wifi/android.hardware.wifi.hostapd-service.rc | 13 + ...ndroid.hardware.wifi.supplicant-service.rc | 20 + wifi/apex_file_contexts_hostapd | 3 + wifi/apex_file_contexts_supplicant | 3 + wifi/apex_manifest_hostapd.json | 4 + wifi/apex_manifest_supplicant.json | 4 + wifi/wpa_supplicant_overlay.conf | 5 + wrimg.sh | 136 +++ 147 files changed, 7890 insertions(+), 1 deletion(-) create mode 100644 Android.bp create mode 100644 AndroidProducts.mk create mode 100644 BoardConfig.mk create mode 100644 audio/Android.bp create mode 100644 audio/audio_hw.c create mode 100644 audio/audio_hw_hdmi.c create mode 100644 audio/audio_policy_configuration.xml create mode 100644 bluetooth/Android.bp create mode 100644 bluetooth/BluetoothHci.cpp create mode 100644 bluetooth/BluetoothHci.h create mode 100644 bluetooth/android.hardware.bluetooth-service.opi.rc create mode 100644 bluetooth/android.hardware.bluetooth-service.opi.xml create mode 100644 bluetooth/apex_file_contexts create mode 100644 bluetooth/apex_manifest.json create mode 100644 bluetooth/main.cpp create mode 100644 bluetooth/net_bluetooth_mgmt.cpp create mode 100644 bluetooth/net_bluetooth_mgmt.h create mode 100644 bootanimation.zip create mode 100644 compatibility_matrix.xml create mode 100644 device.mk create mode 100644 framework_compatibility_matrix.xml create mode 100644 hdmi/cec/Android.bp create mode 100644 hdmi/cec/HdmiCec.cpp create mode 100644 hdmi/cec/HdmiCec.h create mode 100644 hdmi/cec/HdmiCecPort.cpp create mode 100644 hdmi/cec/HdmiCecPort.h create mode 100644 hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.rc create mode 100644 hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.xml create mode 100644 hdmi/cec/apex_file_contexts create mode 100644 hdmi/cec/apex_manifest.json create mode 100644 hdmi/cec/main.cpp create mode 100644 hdmi/connection/Android.bp create mode 100644 hdmi/connection/HdmiConnection.cpp create mode 100644 hdmi/connection/HdmiConnection.h create mode 100644 hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.rc create mode 100644 hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.xml create mode 100644 hdmi/connection/apex_file_contexts create mode 100644 hdmi/connection/apex_manifest.json create mode 100644 hdmi/connection/main.cpp create mode 100644 health/Android.bp create mode 100644 health/HealthImpl.cpp create mode 100644 health/HealthImpl.h create mode 100644 health/android.hardware.health-service.opi.rc create mode 100644 health/android.hardware.health-service.opi.xml create mode 100644 health/apex_file_contexts create mode 100644 health/apex_manifest.json create mode 100644 health/main.cpp create mode 100644 keylayout/Generic.kl create mode 100644 light/Android.bp create mode 100644 light/Lights.cpp create mode 100644 light/Lights.h create mode 100644 light/android.hardware.light-service.opi.rc create mode 100644 light/android.hardware.light-service.opi.xml create mode 100644 light/apex_file_contexts create mode 100644 light/apex_manifest.json create mode 100644 light/main.cpp create mode 100644 lineage_orangepi5ultra.mk create mode 100644 manifest.xml create mode 100644 media/media_codecs.xml create mode 100644 media/media_codecs_ffmpeg_c2.xml create mode 100644 media/media_codecs_v4l2_c2_video.xml create mode 100644 mkbootimg.mk create mode 100755 mkimg.sh create mode 100644 mkimg_gpt.sh create mode 100644 overlay/AndroidTvOpiOverlay/Android.bp create mode 100644 overlay/AndroidTvOpiOverlay/AndroidManifest.xml create mode 100644 overlay/AndroidTvOpiOverlay/res/values/config.xml create mode 100644 overlay/BluetoothOpiOverlay/Android.bp create mode 100644 overlay/BluetoothOpiOverlay/AndroidManifest.xml create mode 100644 overlay/BluetoothOpiOverlay/res/values/config.xml create mode 100644 overlay/SettingsProviderTvOpiOverlay/Android.bp create mode 100644 overlay/SettingsProviderTvOpiOverlay/AndroidManifest.xml create mode 100644 overlay/SettingsProviderTvOpiOverlay/res/values/defaults.xml create mode 100644 overlay/WifiOpiOverlay/Android.bp create mode 100644 overlay/WifiOpiOverlay/AndroidManifest.xml create mode 100644 overlay/WifiOpiOverlay/res/values/config.xml create mode 100644 product_manifest.xml create mode 100644 ramdisk/fstab.opi5ultra create mode 100644 ramdisk/init.opi5ultra.rc create mode 100644 ramdisk/init.opi5ultra.usb.rc create mode 100644 ramdisk/ueventd.opi5ultra.rc create mode 100644 seccomp_policy/android.hardware.media.c2-default-seccomp_policy create mode 100644 seccomp_policy/android.hardware.media.c2-extended-seccomp_policy create mode 100644 seccomp_policy/android.hardware.media.c2-ffmpeg.policy create mode 100644 seccomp_policy/mediacodec.policy create mode 100644 seccomp_policy/mediaswcodec.policy create mode 100644 sepolicy/bootanim.te create mode 100644 sepolicy/device.te create mode 100644 sepolicy/file.te create mode 100644 sepolicy/file_contexts create mode 100644 sepolicy/genfs_contexts create mode 100644 sepolicy/hal_audio_default.te create mode 100644 sepolicy/hal_camera.te create mode 100644 sepolicy/hal_drm_clearkey.te create mode 100644 sepolicy/hal_drm_widevine.te create mode 100644 sepolicy/hal_graphics_allocator_default.te create mode 100644 sepolicy/hal_graphics_composer_default.te create mode 100644 sepolicy/hal_keymint_default.te create mode 100644 sepolicy/hal_tv_hdmi_cec_default.te create mode 100644 sepolicy/hal_tv_hdmi_connection_default.te create mode 100644 sepolicy/init.te create mode 100644 sepolicy/kernel.te create mode 100644 sepolicy/keystore.te create mode 100644 sepolicy/mediacodec.te create mode 100644 sepolicy/mediaserver.te create mode 100644 sepolicy/mediaswcodec.te create mode 100644 sepolicy/netd.te create mode 100644 sepolicy/platform_app.te create mode 100644 sepolicy/priv_app.te create mode 100644 sepolicy/proc_net.te create mode 100644 sepolicy/property.te create mode 100644 sepolicy/property_contexts create mode 100644 sepolicy/service_contexts create mode 100644 sepolicy/surfaceflinger.te create mode 100644 sepolicy/suspend_blocker.te create mode 100644 sepolicy/system_app.te create mode 100644 sepolicy/system_server.te create mode 100644 sepolicy/te_macros create mode 100644 sepolicy/untrusted_app_all.te create mode 100644 sepolicy/vendor_init.te create mode 100644 suspend_blocker/Android.bp create mode 100644 suspend_blocker/apex_file_contexts create mode 100644 suspend_blocker/apex_manifest.json create mode 100644 suspend_blocker/suspend_blocker_opi.cpp create mode 100644 suspend_blocker/suspend_blocker_opi.rc create mode 100644 usb/Android.bp create mode 100644 usb/MonitorFfs.cpp create mode 100644 usb/UsbGadget.cpp create mode 100644 usb/UsbGadget.h create mode 100644 usb/UsbGadgetCommon.h create mode 100644 usb/UsbGadgetUtils.cpp create mode 100644 usb/android.hardware.usb.gadget-service.opi.rc create mode 100644 usb/android.hardware.usb.gadget-service.opi.xml create mode 100644 usb/apex_file_contexts create mode 100644 usb/apex_manifest.json create mode 100644 usb/main.cpp create mode 100644 vendor.prop create mode 100644 wifi/Android.bp create mode 100644 wifi/android.hardware.wifi.hostapd-service.rc create mode 100644 wifi/android.hardware.wifi.supplicant-service.rc create mode 100644 wifi/apex_file_contexts_hostapd create mode 100644 wifi/apex_file_contexts_supplicant create mode 100644 wifi/apex_manifest_hostapd.json create mode 100644 wifi/apex_manifest_supplicant.json create mode 100644 wifi/wpa_supplicant_overlay.conf create mode 100755 wrimg.sh diff --git a/Android.bp b/Android.bp new file mode 100644 index 0000000..e654877 --- /dev/null +++ b/Android.bp @@ -0,0 +1,6 @@ +// Copyright (C) 2021-2022 KonstaKANG +// +// SPDX-License-Identifier: Apache-2.0 + +soong_namespace { +} diff --git a/AndroidProducts.mk b/AndroidProducts.mk new file mode 100644 index 0000000..829137b --- /dev/null +++ b/AndroidProducts.mk @@ -0,0 +1,13 @@ +# +# Copyright (C) 2021-2023 KonstaKANG +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# Copyright (C) 2026 Brendan Szymanski +# +# SPDX-License-Identifier: Apache-2.0 +# + +PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/lineage_orangepi5ultra.mk + +COMMON_LUNCH_CHOICES := \ + lineage_orangepi5ultra-userdebug diff --git a/BoardConfig.mk b/BoardConfig.mk new file mode 100644 index 0000000..364a169 --- /dev/null +++ b/BoardConfig.mk @@ -0,0 +1,84 @@ +# +# Copyright (C) 2021-2022 KonstaKANG +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# +# SPDX-License-Identifier: Apache-2.0 +# + +DEVICE_PATH := device/rockchip/orangepi5ultra + + +TARGET_ARCH := arm64 +TARGET_ARCH_VARIANT := armv8-a +TARGET_CPU_ABI := arm64-v8a +TARGET_CPU_ABI2 := +TARGET_CPU_VARIANT := generic +TARGET_CPU_VARIANT_RUNTIME := cortex-a76 + + + +# Bluetooth +BOARD_HAVE_BLUETOOTH := true + +# Bootloader +TARGET_NO_BOOTLOADER := true + + +# Display +TARGET_SCREEN_DENSITY := 240 + + + + +# Kernel +BOARD_CUSTOM_BOOTIMG := true +BOARD_CUSTOM_BOOTIMG_MK := $(DEVICE_PATH)/mkbootimg.mk +BOARD_KERNEL_CMDLINE := console=ttyS2,1500000 no_console_suspend root=/dev/ram0 rootwait androidboot.hardware=opi5ultra + +# Manifest +DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := $(DEVICE_PATH)/framework_compatibility_matrix.xml +DEVICE_MANIFEST_FILE := $(DEVICE_PATH)/manifest.xml +PRODUCT_MANIFEST_FILES := $(DEVICE_PATH)/product_manifest.xml + + +# Partition sizes +BOARD_FLASH_BLOCK_SIZE := 4096 +BOARD_USES_METADATA_PARTITION := true +BOARD_BOOTIMAGE_PARTITION_SIZE := 134217728 # 128M +BOARD_METADATAIMAGE_PARTITION_SIZE := 16777216 # 16M +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 3221225472 # 3072M +BOARD_USERDATAIMAGE_PARTITION_SIZE := 134217728 # 128M +BOARD_VENDORIMAGE_PARTITION_SIZE := 402653184 # 384M +BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4 +TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true +TARGET_USERIMAGES_USE_EXT4 := true + + + +# Platform +TARGET_BOARD_PLATFORM := rk3588 + +TARGET_BOOTLOADER_BOARD_NAME := orangepi5ultra + +# Properties +TARGET_VENDOR_PROP += $(DEVICE_PATH)/vendor.prop + +# Recovery +TARGET_NO_RECOVERY := true + +# SELinux +BOARD_SEPOLICY_DIRS += device/rockchip/orangepi5ultra/sepolicy +BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive + +# Treble +TARGET_COPY_OUT_VENDOR := vendor + + +# Wifi +BOARD_WLAN_DEVICE := bcmdhd +BOARD_HOSTAPD_DRIVER := NL80211 +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +#WIFI_HIDL_UNIFIED_SUPPLICANT_SERVICE_RC_ENTRY := true +WPA_SUPPLICANT_VERSION := VER_0_8_X diff --git a/README.md b/README.md index daa0130..6daf288 100644 --- a/README.md +++ b/README.md @@ -1 +1,16 @@ -# android_device_lineage-rockchip_orangepi5ultra +AOSP 16 device configuration for Orangepi 5 Pro. + +Ported from KonstaKang's raspberry vanilla aosp 16 project. + +Not working - + +Camera +3.5 mm audio + +Working - + +everything else including vulkan. + +This project can be ported to any device which utilises Rockchip SoC with minor changes. + +any doubts, feel free to mail me at vdarbha0473@gmail.com diff --git a/audio/Android.bp b/audio/Android.bp new file mode 100644 index 0000000..08d8d36 --- /dev/null +++ b/audio/Android.bp @@ -0,0 +1,44 @@ +// Copyright (C) 2015 The Android Open Source Project +// Copyright (C) 2021-2023 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_library_shared { + name: "audio.primary.opi", + relative_install_path: "hw", + vendor: true, + srcs: ["audio_hw.c"], + include_dirs: [ + "external/expat/lib", + "external/tinyalsa/include", + "system/media/audio_effects/include", + "system/media/audio_utils/include", + ], + header_libs: ["libhardware_headers"], + shared_libs: [ + "libcutils", + "liblog", + "libtinyalsa", + ], + cflags: ["-Wno-unused-parameter"], +} + +cc_library_shared { + name: "audio.primary.opi_hdmi", + relative_install_path: "hw", + vendor: true, + srcs: ["audio_hw_hdmi.c"], + include_dirs: [ + "external/expat/lib", + "system/media/audio_effects/include", + "system/media/audio_utils/include", + ], + header_libs: ["libhardware_headers"], + shared_libs: [ + "libcutils", + "liblog", + "libasound", + ], + cflags: ["-Wno-unused-parameter"], +} diff --git a/audio/audio_hw.c b/audio/audio_hw.c new file mode 100644 index 0000000..ee20ddb --- /dev/null +++ b/audio/audio_hw.c @@ -0,0 +1,755 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2021-2022 KonstaKANG + * Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha + * + * + * 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 "audio_hw_opi" +//#define LOG_NDEBUG 0 + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +/* Minimum granularity - Arbitrary but small value */ +#define CODEC_BASE_FRAME_COUNT 32 + +/* number of base blocks in a short period (low latency) */ +#define PERIOD_MULTIPLIER 32 /* 21 ms */ +/* number of frames per short period (low latency) */ +#define PERIOD_SIZE (CODEC_BASE_FRAME_COUNT * PERIOD_MULTIPLIER) +/* number of pseudo periods for low latency playback */ +#define PLAYBACK_PERIOD_COUNT 4 +#define PLAYBACK_PERIOD_START_THRESHOLD 2 +#define CODEC_SAMPLING_RATE 48000 +#define CHANNEL_STEREO 2 +#define MIN_WRITE_SLEEP_US 5000 + +int pcm_card; +int pcm_device; + +struct stub_stream_in { + struct audio_stream_in stream; +}; + +struct alsa_audio_device { + struct audio_hw_device hw_device; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + int devices; + struct alsa_stream_in *active_input; + struct alsa_stream_out *active_output; + bool mic_mute; +}; + +struct alsa_stream_out { + struct audio_stream_out stream; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + struct pcm_config config; + struct pcm *pcm; + bool unavailable; + int standby; + struct alsa_audio_device *dev; + int write_threshold; + unsigned int written; +}; + +static int probe_pcm_out_card() { + FILE *fp; + char card_node[32]; + char card_id[16]; + + char card_prop[PROPERTY_VALUE_MAX]; + property_get("persist.vendor.audio.device", card_prop, ""); + + for (int i = 0; i < 5; i++) { + snprintf(card_node, sizeof(card_node), "/proc/asound/card%d/id", i); + if ((fp = fopen(card_node, "r")) != NULL) { + fgets(card_id, sizeof(card_id), fp); + ALOGV("%s: %s", card_node, card_id); + if (!strcmp(card_prop, "jack") && (!strncmp(card_id, "Headphones", 10) || !strncmp(card_id, "es8388", 6))) { + fclose(fp); + ALOGI("Using PCM card %d for 3.5mm audio jack", i); + return i; + } else if (!strcmp(card_prop, "dac") && strncmp(card_id, "Headphones", 10) + && strncmp(card_id, "vc4hdmi", 7)) { + fclose(fp); + ALOGI("Using PCM card %d for audio DAC %s", i, card_id); + return i; + } + fclose(fp); + } + } + + ALOGE("Could not probe PCM card for %s, using PCM card 0", card_prop); + return 0; +} + +static int get_pcm_card() +{ + char card[PROPERTY_VALUE_MAX]; + property_get("persist.vendor.audio.pcm.card.auto", card, "false"); + if (!strcmp(card, "true")) + return probe_pcm_out_card(); + + property_get("persist.vendor.audio.pcm.card", card, "0"); + return atoi(card); +} + +static int get_pcm_device() +{ + char device[PROPERTY_VALUE_MAX]; + property_get("persist.vendor.audio.pcm.device", device, "0"); + return atoi(device); +} + +/* must be called with hw device and output stream mutexes locked */ +static int start_output_stream(struct alsa_stream_out *out) +{ + struct alsa_audio_device *adev = out->dev; + + if (out->unavailable) + return -ENODEV; + + /* default to low power: will be corrected in out_write if necessary before first write to + * tinyalsa. + */ + out->write_threshold = PLAYBACK_PERIOD_COUNT * PERIOD_SIZE; + out->config.start_threshold = PLAYBACK_PERIOD_START_THRESHOLD * PERIOD_SIZE; + out->config.avail_min = PERIOD_SIZE; + + //out->pcm = pcm_open(pcm_card, pcm_device, PCM_OUT | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC, &out->config); + out->pcm = pcm_open(get_pcm_card(), get_pcm_device(), PCM_OUT | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC, &out->config); + + if (!pcm_is_ready(out->pcm)) { + ALOGE("cannot open pcm_out driver: %s", pcm_get_error(out->pcm)); + pcm_close(out->pcm); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + + adev->active_output = out; + return 0; +} + +static uint32_t out_get_sample_rate(const struct audio_stream *stream) +{ + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + return out->config.rate; +} + +static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + ALOGV("out_set_sample_rate: %d", 0); + return -ENOSYS; +} + +static size_t out_get_buffer_size(const struct audio_stream *stream) +{ + ALOGV("out_get_buffer_size: %d", 4096); + + /* return the closest majoring multiple of 16 frames, as + * audioflinger expects audio buffers to be a multiple of 16 frames */ + size_t size = PERIOD_SIZE; + size = ((size + 15) / 16) * 16; + return size * audio_stream_out_frame_size((struct audio_stream_out *)stream); +} + +static audio_channel_mask_t out_get_channels(const struct audio_stream *stream) +{ + ALOGV("out_get_channels"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + return audio_channel_out_mask_from_count(out->config.channels); +} + +static audio_format_t out_get_format(const struct audio_stream *stream) +{ + ALOGV("out_get_format"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + return audio_format_from_pcm_format(out->config.format); +} + +static int out_set_format(struct audio_stream *stream, audio_format_t format) +{ + ALOGV("out_set_format: %d",format); + return -ENOSYS; +} + +static int do_output_standby(struct alsa_stream_out *out) +{ + struct alsa_audio_device *adev = out->dev; + + if (!out->standby) { + pcm_close(out->pcm); + out->pcm = NULL; + adev->active_output = NULL; + out->standby = 1; + } + return 0; +} + +static int out_standby(struct audio_stream *stream) +{ + ALOGV("out_standby"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + int status; + + pthread_mutex_lock(&out->dev->lock); + pthread_mutex_lock(&out->lock); + status = do_output_standby(out); + pthread_mutex_unlock(&out->lock); + pthread_mutex_unlock(&out->dev->lock); + return status; +} + +static int out_dump(const struct audio_stream *stream, int fd) +{ + ALOGV("out_dump"); + return 0; +} + +static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + ALOGV("out_set_parameters"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + struct alsa_audio_device *adev = out->dev; + struct str_parms *parms; + char value[32]; + int val = 0; + int ret = -EINVAL; + + if (kvpairs == NULL || kvpairs[0] == 0) { + return 0; + } + + parms = str_parms_create_str(kvpairs); + + if (str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)) >= 0) { + val = atoi(value); + pthread_mutex_lock(&adev->lock); + pthread_mutex_lock(&out->lock); + if (((adev->devices & AUDIO_DEVICE_OUT_ALL) != val) && (val != 0)) { + adev->devices &= ~AUDIO_DEVICE_OUT_ALL; + adev->devices |= val; + } + pthread_mutex_unlock(&out->lock); + pthread_mutex_unlock(&adev->lock); + ret = 0; + } + + str_parms_destroy(parms); + return ret; +} + +static char * out_get_parameters(const struct audio_stream *stream, const char *keys) +{ + ALOGV("out_get_parameters"); + return strdup(""); +} + +static uint32_t out_get_latency(const struct audio_stream_out *stream) +{ + ALOGV("out_get_latency"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + return (PERIOD_SIZE * PLAYBACK_PERIOD_COUNT * 1000) / out->config.rate; +} + +static int out_set_volume(struct audio_stream_out *stream, float left, + float right) +{ + ALOGV("out_set_volume: Left:%f Right:%f", left, right); + return 0; +} + +static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, + size_t bytes) +{ + int ret; + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + struct alsa_audio_device *adev = out->dev; + size_t frame_size = audio_stream_out_frame_size(stream); + size_t out_frames = bytes / frame_size; + + /* acquiring hw device mutex systematically is useful if a low priority thread is waiting + * on the output stream mutex - e.g. executing select_mode() while holding the hw device + * mutex + */ + pthread_mutex_lock(&adev->lock); + pthread_mutex_lock(&out->lock); + if (out->standby) { + ret = start_output_stream(out); + if (ret != 0) { + pthread_mutex_unlock(&adev->lock); + goto exit; + } + out->standby = 0; + } + + pthread_mutex_unlock(&adev->lock); + + ret = pcm_mmap_write(out->pcm, buffer, out_frames * frame_size); + if (ret == 0) { + out->written += out_frames; + } +exit: + pthread_mutex_unlock(&out->lock); + + if (ret != 0) { + usleep((int64_t)bytes * 1000000 / audio_stream_out_frame_size(stream) / + out_get_sample_rate(&stream->common)); + } + + return bytes; +} + +static int out_get_render_position(const struct audio_stream_out *stream, + uint32_t *dsp_frames) +{ + *dsp_frames = 0; + ALOGV("out_get_render_position: dsp_frames: %p", dsp_frames); + return -EINVAL; +} + +static int out_get_presentation_position(const struct audio_stream_out *stream, + uint64_t *frames, struct timespec *timestamp) +{ + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + int ret = -1; + + if (out->pcm) { + unsigned int avail; + if (pcm_get_htimestamp(out->pcm, &avail, timestamp) == 0) { + size_t kernel_buffer_size = out->config.period_size * out->config.period_count; + int64_t signed_frames = out->written - kernel_buffer_size + avail; + if (signed_frames >= 0) { + *frames = signed_frames; + ret = 0; + } + } + } + + return ret; +} + + +static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + ALOGV("out_add_audio_effect: %p", effect); + return 0; +} + +static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + ALOGV("out_remove_audio_effect: %p", effect); + return 0; +} + +static int out_get_next_write_timestamp(const struct audio_stream_out *stream, + int64_t *timestamp) +{ + *timestamp = 0; + ALOGV("out_get_next_write_timestamp: %ld", (long int)(*timestamp)); + return -EINVAL; +} + +/** audio_stream_in implementation **/ +static uint32_t in_get_sample_rate(const struct audio_stream *stream) +{ + ALOGV("in_get_sample_rate"); + return 8000; +} + +static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + ALOGV("in_set_sample_rate: %d", rate); + return -ENOSYS; +} + +static size_t in_get_buffer_size(const struct audio_stream *stream) +{ + ALOGV("in_get_buffer_size: %d", 320); + return 320; +} + +static audio_channel_mask_t in_get_channels(const struct audio_stream *stream) +{ + ALOGV("in_get_channels: %d", AUDIO_CHANNEL_IN_MONO); + return AUDIO_CHANNEL_IN_MONO; +} + +static audio_format_t in_get_format(const struct audio_stream *stream) +{ + return AUDIO_FORMAT_PCM_16_BIT; +} + +static int in_set_format(struct audio_stream *stream, audio_format_t format) +{ + return -ENOSYS; +} + +static int in_standby(struct audio_stream *stream) +{ + return 0; +} + +static int in_dump(const struct audio_stream *stream, int fd) +{ + return 0; +} + +static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + return 0; +} + +static char * in_get_parameters(const struct audio_stream *stream, + const char *keys) +{ + return strdup(""); +} + +static int in_set_gain(struct audio_stream_in *stream, float gain) +{ + return 0; +} + +static ssize_t in_read(struct audio_stream_in *stream, void* buffer, + size_t bytes) +{ + ALOGV("in_read: bytes %zu", bytes); + /* XXX: fake timing for audio input */ + usleep((int64_t)bytes * 1000000 / audio_stream_in_frame_size(stream) / + in_get_sample_rate(&stream->common)); + memset(buffer, 0, bytes); + return bytes; +} + +static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) +{ + return 0; +} + +static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int adev_open_output_stream(struct audio_hw_device *dev, + audio_io_handle_t handle, + audio_devices_t devices, + audio_output_flags_t flags, + struct audio_config *config, + struct audio_stream_out **stream_out, + const char *address __unused) +{ + ALOGV("adev_open_output_stream..."); + + struct alsa_audio_device *ladev = (struct alsa_audio_device *)dev; + struct alsa_stream_out *out; + struct pcm_params *params; + int ret = 0; + + //params = pcm_params_get(pcm_card, pcm_device, PCM_OUT); + params = pcm_params_get(get_pcm_card(), get_pcm_device(), PCM_OUT); + + if (!params) + return -ENOSYS; + + out = (struct alsa_stream_out *)calloc(1, sizeof(struct alsa_stream_out)); + if (!out) + return -ENOMEM; + + out->stream.common.get_sample_rate = out_get_sample_rate; + out->stream.common.set_sample_rate = out_set_sample_rate; + out->stream.common.get_buffer_size = out_get_buffer_size; + out->stream.common.get_channels = out_get_channels; + out->stream.common.get_format = out_get_format; + out->stream.common.set_format = out_set_format; + out->stream.common.standby = out_standby; + out->stream.common.dump = out_dump; + out->stream.common.set_parameters = out_set_parameters; + out->stream.common.get_parameters = out_get_parameters; + out->stream.common.add_audio_effect = out_add_audio_effect; + out->stream.common.remove_audio_effect = out_remove_audio_effect; + out->stream.get_latency = out_get_latency; + out->stream.set_volume = out_set_volume; + out->stream.write = out_write; + out->stream.get_render_position = out_get_render_position; + out->stream.get_next_write_timestamp = out_get_next_write_timestamp; + out->stream.get_presentation_position = out_get_presentation_position; + + out->config.channels = CHANNEL_STEREO; + out->config.rate = CODEC_SAMPLING_RATE; + out->config.format = PCM_FORMAT_S16_LE; + out->config.period_size = PERIOD_SIZE; + out->config.period_count = PLAYBACK_PERIOD_COUNT; + + if (out->config.rate != config->sample_rate || + audio_channel_count_from_out_mask(config->channel_mask) != CHANNEL_STEREO || + out->config.format != pcm_format_from_audio_format(config->format) ) { + config->sample_rate = out->config.rate; + config->format = audio_format_from_pcm_format(out->config.format); + config->channel_mask = audio_channel_out_mask_from_count(CHANNEL_STEREO); + ret = -EINVAL; + } + + ALOGI("adev_open_output_stream selects channels=%d rate=%d format=%d", + out->config.channels, out->config.rate, out->config.format); + + out->dev = ladev; + out->standby = 1; + out->unavailable = false; + + config->format = out_get_format(&out->stream.common); + config->channel_mask = out_get_channels(&out->stream.common); + config->sample_rate = out_get_sample_rate(&out->stream.common); + + *stream_out = &out->stream; + + /* TODO The retry mechanism isn't implemented in AudioPolicyManager/AudioFlinger. */ + ret = 0; + + return ret; +} + +static void adev_close_output_stream(struct audio_hw_device *dev, + struct audio_stream_out *stream) +{ + ALOGV("adev_close_output_stream..."); + free(stream); +} + +static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) +{ + ALOGV("adev_set_parameters"); + return -ENOSYS; +} + +static char * adev_get_parameters(const struct audio_hw_device *dev, + const char *keys) +{ + ALOGV("adev_get_parameters"); + return strdup(""); +} + +static int adev_init_check(const struct audio_hw_device *dev) +{ + ALOGV("adev_init_check"); + return 0; +} + +static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) +{ + ALOGV("adev_set_voice_volume: %f", volume); + return -ENOSYS; +} + +static int adev_set_master_volume(struct audio_hw_device *dev, float volume) +{ + ALOGV("adev_set_master_volume: %f", volume); + return -ENOSYS; +} + +static int adev_get_master_volume(struct audio_hw_device *dev, float *volume) +{ + ALOGV("adev_get_master_volume: %f", *volume); + return -ENOSYS; +} + +static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) +{ + ALOGV("adev_set_master_mute: %d", muted); + return -ENOSYS; +} + +static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) +{ + ALOGV("adev_get_master_mute: %d", *muted); + return -ENOSYS; +} + +static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) +{ + ALOGV("adev_set_mode: %d", mode); + return 0; +} + +static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) +{ + ALOGV("adev_set_mic_mute: %d",state); + return -ENOSYS; +} + +static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) +{ + ALOGV("adev_get_mic_mute"); + return -ENOSYS; +} + +static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, + const struct audio_config *config) +{ + ALOGV("adev_get_input_buffer_size: %d", 320); + return 320; +} + +static int adev_open_input_stream(struct audio_hw_device __unused *dev, + audio_io_handle_t handle, + audio_devices_t devices, + struct audio_config *config, + struct audio_stream_in **stream_in, + audio_input_flags_t flags __unused, + const char *address __unused, + audio_source_t source __unused) +{ + struct stub_stream_in *in; + + ALOGV("adev_open_input_stream..."); + + in = (struct stub_stream_in *)calloc(1, sizeof(struct stub_stream_in)); + if (!in) + return -ENOMEM; + + in->stream.common.get_sample_rate = in_get_sample_rate; + in->stream.common.set_sample_rate = in_set_sample_rate; + in->stream.common.get_buffer_size = in_get_buffer_size; + in->stream.common.get_channels = in_get_channels; + in->stream.common.get_format = in_get_format; + in->stream.common.set_format = in_set_format; + in->stream.common.standby = in_standby; + in->stream.common.dump = in_dump; + in->stream.common.set_parameters = in_set_parameters; + in->stream.common.get_parameters = in_get_parameters; + in->stream.common.add_audio_effect = in_add_audio_effect; + in->stream.common.remove_audio_effect = in_remove_audio_effect; + in->stream.set_gain = in_set_gain; + in->stream.read = in_read; + in->stream.get_input_frames_lost = in_get_input_frames_lost; + + *stream_in = &in->stream; + return 0; +} + +static void adev_close_input_stream(struct audio_hw_device *dev, + struct audio_stream_in *in) +{ + ALOGV("adev_close_input_stream..."); + return; +} + +static int adev_dump(const audio_hw_device_t *device, int fd) +{ + ALOGV("adev_dump"); + return 0; +} + +static int adev_close(hw_device_t *device) +{ + ALOGV("adev_close"); + free(device); + return 0; +} + +static int adev_open(const hw_module_t* module, const char* name, + hw_device_t** device) +{ + struct alsa_audio_device *adev; + + ALOGV("adev_open: %s", name); + + // pcm_card = get_pcm_card(); + // pcm_device = get_pcm_device(); + // ALOGI("adev_open: pcm_card %d, pcm_device %d", pcm_card, pcm_device); + + if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) + return -EINVAL; + + adev = calloc(1, sizeof(struct alsa_audio_device)); + if (!adev) + return -ENOMEM; + + adev->hw_device.common.tag = HARDWARE_DEVICE_TAG; + adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0; + adev->hw_device.common.module = (struct hw_module_t *) module; + adev->hw_device.common.close = adev_close; + adev->hw_device.init_check = adev_init_check; + adev->hw_device.set_voice_volume = adev_set_voice_volume; + adev->hw_device.set_master_volume = adev_set_master_volume; + adev->hw_device.get_master_volume = adev_get_master_volume; + adev->hw_device.set_master_mute = adev_set_master_mute; + adev->hw_device.get_master_mute = adev_get_master_mute; + adev->hw_device.set_mode = adev_set_mode; + adev->hw_device.set_mic_mute = adev_set_mic_mute; + adev->hw_device.get_mic_mute = adev_get_mic_mute; + adev->hw_device.set_parameters = adev_set_parameters; + adev->hw_device.get_parameters = adev_get_parameters; + adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size; + adev->hw_device.open_output_stream = adev_open_output_stream; + adev->hw_device.close_output_stream = adev_close_output_stream; + adev->hw_device.open_input_stream = adev_open_input_stream; + adev->hw_device.close_input_stream = adev_close_input_stream; + adev->hw_device.dump = adev_dump; + + adev->devices = AUDIO_DEVICE_NONE; + + *device = &adev->hw_device.common; + + return 0; +} + +static struct hw_module_methods_t hal_module_methods = { + .open = adev_open, +}; + +struct audio_module HAL_MODULE_INFO_SYM = { + .common = { + .tag = HARDWARE_MODULE_TAG, + .module_api_version = AUDIO_MODULE_API_VERSION_0_1, + .hal_api_version = HARDWARE_HAL_API_VERSION, + .id = AUDIO_HARDWARE_MODULE_ID, + .name = "Orangepi audio HW HAL", + .author = "The Android Open Source Project", + .methods = &hal_module_methods, + }, +}; diff --git a/audio/audio_hw_hdmi.c b/audio/audio_hw_hdmi.c new file mode 100644 index 0000000..28efa67 --- /dev/null +++ b/audio/audio_hw_hdmi.c @@ -0,0 +1,773 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * Copyright (C) 2021-2023 KonstaKANG + * + * 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 "audio_hw_opi_hdmi" +//#define LOG_NDEBUG 0 + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + + +/* Minimum granularity - Arbitrary but small value */ +#define CODEC_BASE_FRAME_COUNT 32 + +/* number of base blocks in a short period (low latency) */ +#define PERIOD_MULTIPLIER 32 /* 21 ms */ +/* number of frames per short period (low latency) */ +#define PERIOD_SIZE (CODEC_BASE_FRAME_COUNT * PERIOD_MULTIPLIER) +/* number of pseudo periods for low latency playback */ +#define PLAYBACK_PERIOD_COUNT 4 +#define PLAYBACK_PERIOD_START_THRESHOLD 2 +#define CODEC_SAMPLING_RATE 48000 +#define CHANNEL_STEREO 2 +#define MIN_WRITE_SLEEP_US 5000 + +char device_name[PROPERTY_VALUE_MAX]; + +struct stub_stream_in { + struct audio_stream_in stream; +}; + +struct alsa_audio_device { + struct audio_hw_device hw_device; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + int devices; + struct alsa_stream_in *active_input; + struct alsa_stream_out *active_output; + bool mic_mute; +}; + +struct alsa_stream_out { + struct audio_stream_out stream; + struct alsa_audio_device *dev; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + snd_pcm_t *pcm; + + snd_pcm_uframes_t period_size; + unsigned int periods; + snd_pcm_uframes_t buffer_size; + + bool unavailable; + int standby; + snd_pcm_uframes_t written; +}; + +static void get_alsa_device_name(char *name) { + char hdmi_device[PROPERTY_VALUE_MAX]; + property_get("persist.vendor.audio.hdmi.device", hdmi_device, "vc4hdmi0"); + + // use card configured in vc4-hdmi.conf to get IEC958 subframe conversion + sprintf(name, "default:CARD=%s", hdmi_device); +} + +/* must be called with hw device and output stream mutexes locked */ +static int start_output_stream(struct alsa_stream_out *out) +{ + struct alsa_audio_device *adev = out->dev; + + if (out->unavailable) + return -ENODEV; + + ALOGI("start_output_stream: %s", device_name); + + int r; + snd_pcm_t *pcm; + + if ((r = snd_pcm_open(&pcm, device_name, SND_PCM_STREAM_PLAYBACK, 0) < 0)) { + ALOGE("cannot open pcm_out driver: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + out->pcm = pcm; + + snd_pcm_hw_params_t *hwp; + snd_pcm_hw_params_alloca(&hwp); + snd_pcm_hw_params_any(pcm, hwp); + snd_pcm_hw_params_set_access(pcm, hwp, SND_PCM_ACCESS_RW_INTERLEAVED); + snd_pcm_hw_params_set_format(pcm, hwp, SND_PCM_FORMAT_S16_LE); + snd_pcm_hw_params_set_rate(pcm, hwp, CODEC_SAMPLING_RATE, 0); + snd_pcm_hw_params_set_channels(pcm, hwp, CHANNEL_STEREO); + + // Configurue period_size, periods and buffer_size + int dir = 0; + out->period_size = PERIOD_SIZE; + if ((r = snd_pcm_hw_params_set_period_size_near(pcm, hwp, &out->period_size, &dir)) < 0) { + ALOGE("cannot snd_pcm_hw_params_set_period_size_near: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + dir = 0; + out->periods = PLAYBACK_PERIOD_COUNT; + if ((r = snd_pcm_hw_params_set_periods_near(pcm, hwp, &out->periods, &dir)) < 0) { + ALOGE("cannot snd_pcm_hw_params_set_periods_near: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + out->buffer_size = out->period_size * out->periods; + if ((r = snd_pcm_hw_params_set_buffer_size_near(pcm, hwp, &out->buffer_size)) < 0) { + ALOGE("cannot snd_pcm_hw_params_set_buffer_size_near: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + + //write the hw params + if ((r = snd_pcm_hw_params(pcm, hwp)) < 0) { + ALOGE("cannot snd_pcm_hw_params: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + + //Software parameters + snd_pcm_sw_params_t *swp; + snd_pcm_sw_params_alloca(&swp); + snd_pcm_sw_params_current(pcm, swp); + + // set avail_min to period_size + if ((r = snd_pcm_sw_params_set_avail_min(pcm, swp, out->period_size)) < 0) { + ALOGE("cannot snd_pcm_sw_params_set_avail_min: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + // set start_threshold to period_size * PLAYBACK_PERIOD_START_THRESHOLD + if ((r = snd_pcm_sw_params_set_start_threshold(pcm, swp, out->period_size * PLAYBACK_PERIOD_START_THRESHOLD)) < 0) { + ALOGE("cannot snd_pcm_sw_params_set_start_threshold: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + //write the sw params + if ((r = snd_pcm_sw_params(pcm, swp)) < 0) { + ALOGE("cannot snd_pcm_sw_params: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + + // prepare + if ((r = snd_pcm_prepare(pcm)) < 0) { + ALOGE("cannot snd_pcm_prepare: %s", snd_strerror(r)); + adev->active_output = NULL; + out->unavailable = true; + return -ENODEV; + } + + adev->active_output = out; + return 0; +} + +static uint32_t out_get_sample_rate(const struct audio_stream *stream) +{ + ALOGV("out_get_sample_rate: %d", CODEC_SAMPLING_RATE); + return CODEC_SAMPLING_RATE; +} + +static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + ALOGV("out_set_sample_rate: %d", 0); + return -ENOSYS; +} + +static size_t out_get_buffer_size(const struct audio_stream *stream) +{ + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + + /* return the closest majoring multiple of 16 frames, as + * audioflinger expects audio buffers to be a multiple of 16 frames */ + size_t size = out->period_size; + size = ((size + 15) / 16) * 16; + ALOGV("out_get_buffer_size: %ld", (long int)size); + return size * audio_stream_out_frame_size((struct audio_stream_out *)stream); +} + +static audio_channel_mask_t out_get_channels(const struct audio_stream *stream) +{ + ALOGV("out_get_channels: %d", CHANNEL_STEREO); + return audio_channel_out_mask_from_count(CHANNEL_STEREO); +} + +static audio_format_t out_get_format(const struct audio_stream *stream) +{ + ALOGV("out_get_format: %d", AUDIO_FORMAT_PCM_16_BIT); + return AUDIO_FORMAT_PCM_16_BIT; +} + +static int out_set_format(struct audio_stream *stream, audio_format_t format) +{ + ALOGV("out_set_format: %d",format); + return -ENOSYS; +} + +static int do_output_standby(struct alsa_stream_out *out) +{ + struct alsa_audio_device *adev = out->dev; + + if (!out->standby) { + snd_pcm_close(out->pcm); + out->pcm = NULL; + adev->active_output = NULL; + out->standby = 1; + } + return 0; +} + +static int out_standby(struct audio_stream *stream) +{ + ALOGV("out_standby"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + int status; + + pthread_mutex_lock(&out->dev->lock); + pthread_mutex_lock(&out->lock); + status = do_output_standby(out); + pthread_mutex_unlock(&out->lock); + pthread_mutex_unlock(&out->dev->lock); + return status; +} + +static int out_dump(const struct audio_stream *stream, int fd) +{ + ALOGV("out_dump"); + return 0; +} + +static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + ALOGV("out_set_parameters"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + struct alsa_audio_device *adev = out->dev; + struct str_parms *parms; + char value[32]; + int val = 0; + int ret = -EINVAL; + + if (kvpairs == NULL || kvpairs[0] == 0) { + return 0; + } + + parms = str_parms_create_str(kvpairs); + + if (str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)) >= 0) { + val = atoi(value); + pthread_mutex_lock(&adev->lock); + pthread_mutex_lock(&out->lock); + if (((adev->devices & AUDIO_DEVICE_OUT_ALL) != val) && (val != 0)) { + adev->devices &= ~AUDIO_DEVICE_OUT_ALL; + adev->devices |= val; + } + pthread_mutex_unlock(&out->lock); + pthread_mutex_unlock(&adev->lock); + ret = 0; + } + + str_parms_destroy(parms); + return ret; +} + +static char * out_get_parameters(const struct audio_stream *stream, const char *keys) +{ + ALOGV("out_get_parameters"); + return strdup(""); +} + +static uint32_t out_get_latency(const struct audio_stream_out *stream) +{ + ALOGV("out_get_latency"); + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + // latency = buffer_size / rate + return (out->buffer_size * 1000) / CODEC_SAMPLING_RATE; +} + +static int out_set_volume(struct audio_stream_out *stream, float left, + float right) +{ + ALOGV("out_set_volume: Left:%f Right:%f", left, right); + return 0; +} + +static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, + size_t bytes) +{ + int ret; + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + struct alsa_audio_device *adev = out->dev; + size_t frame_size = audio_stream_out_frame_size(stream); + snd_pcm_uframes_t out_frames = bytes / frame_size; + + /* acquiring hw device mutex systematically is useful if a low priority thread is waiting + * on the output stream mutex - e.g. executing select_mode() while holding the hw device + * mutex + */ + pthread_mutex_lock(&adev->lock); + pthread_mutex_lock(&out->lock); + if (out->standby) { + ret = start_output_stream(out); + if (ret != 0) { + pthread_mutex_unlock(&adev->lock); + goto exit; + } + out->standby = 0; + } + + pthread_mutex_unlock(&adev->lock); + + ALOGV("out_write: out_frames:%ld", (long int)out_frames); + + ret = snd_pcm_writei(out->pcm, buffer, out_frames); + if (ret == out_frames) { + out->written += out_frames; + } +exit: + pthread_mutex_unlock(&out->lock); + + if (ret != out_frames) { + if (ret == -EPIPE) { + ALOGE("underrun deteced -> redo snd_pcm_prepare"); + snd_pcm_prepare(out->pcm); + } else { + ALOGE("out_write err: %s", snd_strerror(ret)); + usleep((int64_t)bytes * 1000000 / audio_stream_out_frame_size(stream) / + out_get_sample_rate(&stream->common)); + } + } + + return bytes; +} + +static int out_get_render_position(const struct audio_stream_out *stream, + uint32_t *dsp_frames) +{ + *dsp_frames = 0; + ALOGV("out_get_render_position: dsp_frames: %p", dsp_frames); + return -EINVAL; +} + +static int out_get_presentation_position(const struct audio_stream_out *stream, + uint64_t *frames, struct timespec *timestamp) +{ + struct alsa_stream_out *out = (struct alsa_stream_out *)stream; + int ret = -1; + + if (out->pcm) { + snd_pcm_uframes_t avail; + int r; + if ((r = snd_pcm_htimestamp(out->pcm, &avail, timestamp)) == 0) { + int64_t signed_frames = (int64_t)(out->written) - out->buffer_size + avail; + if (signed_frames >= 0) { + *frames = signed_frames; + ret = 0; + } + ALOGV("out_get_presentation_position: %ld", (long int)(*frames)); + } else { + ALOGE("out_get_presentation_position: err: %s", snd_strerror(r)); + } + } else { + ALOGV("out_get_presentation_position: stream in standby"); + } + return ret; +} + + +static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + ALOGV("out_add_audio_effect: %p", effect); + return 0; +} + +static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + ALOGV("out_remove_audio_effect: %p", effect); + return 0; +} + +static int out_get_next_write_timestamp(const struct audio_stream_out *stream, + int64_t *timestamp) +{ + *timestamp = 0; + ALOGV("out_get_next_write_timestamp: %ld", (long int)(*timestamp)); + return -EINVAL; +} + +/** audio_stream_in implementation **/ +static uint32_t in_get_sample_rate(const struct audio_stream *stream) +{ + ALOGV("in_get_sample_rate"); + return 8000; +} + +static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + ALOGV("in_set_sample_rate: %d", rate); + return -ENOSYS; +} + +static size_t in_get_buffer_size(const struct audio_stream *stream) +{ + ALOGV("in_get_buffer_size: %d", 320); + return 320; +} + +static audio_channel_mask_t in_get_channels(const struct audio_stream *stream) +{ + ALOGV("in_get_channels: %d", AUDIO_CHANNEL_IN_MONO); + return AUDIO_CHANNEL_IN_MONO; +} + +static audio_format_t in_get_format(const struct audio_stream *stream) +{ + return AUDIO_FORMAT_PCM_16_BIT; +} + +static int in_set_format(struct audio_stream *stream, audio_format_t format) +{ + return -ENOSYS; +} + +static int in_standby(struct audio_stream *stream) +{ + return 0; +} + +static int in_dump(const struct audio_stream *stream, int fd) +{ + return 0; +} + +static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + return 0; +} + +static char * in_get_parameters(const struct audio_stream *stream, + const char *keys) +{ + return strdup(""); +} + +static int in_set_gain(struct audio_stream_in *stream, float gain) +{ + return 0; +} + +static ssize_t in_read(struct audio_stream_in *stream, void* buffer, + size_t bytes) +{ + ALOGV("in_read: bytes %zu", bytes); + /* XXX: fake timing for audio input */ + usleep((int64_t)bytes * 1000000 / audio_stream_in_frame_size(stream) / + in_get_sample_rate(&stream->common)); + memset(buffer, 0, bytes); + return bytes; +} + +static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) +{ + return 0; +} + +static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int adev_open_output_stream(struct audio_hw_device *dev, + audio_io_handle_t handle, + audio_devices_t devices, + audio_output_flags_t flags, + struct audio_config *config, + struct audio_stream_out **stream_out, + const char *address __unused) +{ + ALOGV("adev_open_output_stream..."); + + struct alsa_audio_device *ladev = (struct alsa_audio_device *)dev; + struct alsa_stream_out *out; + int ret = 0; + + out = (struct alsa_stream_out *)calloc(1, sizeof(struct alsa_stream_out)); + if (!out) + return -ENOMEM; + + out->stream.common.get_sample_rate = out_get_sample_rate; + out->stream.common.set_sample_rate = out_set_sample_rate; + out->stream.common.get_buffer_size = out_get_buffer_size; + out->stream.common.get_channels = out_get_channels; + out->stream.common.get_format = out_get_format; + out->stream.common.set_format = out_set_format; + out->stream.common.standby = out_standby; + out->stream.common.dump = out_dump; + out->stream.common.set_parameters = out_set_parameters; + out->stream.common.get_parameters = out_get_parameters; + out->stream.common.add_audio_effect = out_add_audio_effect; + out->stream.common.remove_audio_effect = out_remove_audio_effect; + out->stream.get_latency = out_get_latency; + out->stream.set_volume = out_set_volume; + out->stream.write = out_write; + out->stream.get_render_position = out_get_render_position; + out->stream.get_next_write_timestamp = out_get_next_write_timestamp; + out->stream.get_presentation_position = out_get_presentation_position; + + out->period_size = PERIOD_SIZE; + out->periods = PLAYBACK_PERIOD_COUNT; + out->buffer_size = out->period_size * out->periods; + + out->dev = ladev; + out->standby = 1; + out->unavailable = false; + + config->format = out_get_format(&out->stream.common); + config->channel_mask = out_get_channels(&out->stream.common); + config->sample_rate = out_get_sample_rate(&out->stream.common); + + *stream_out = &out->stream; + + /* TODO The retry mechanism isn't implemented in AudioPolicyManager/AudioFlinger. */ + ret = 0; + + return ret; +} + +static void adev_close_output_stream(struct audio_hw_device *dev, + struct audio_stream_out *stream) +{ + ALOGV("adev_close_output_stream..."); + free(stream); +} + +static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) +{ + ALOGV("adev_set_parameters"); + return -ENOSYS; +} + +static char * adev_get_parameters(const struct audio_hw_device *dev, + const char *keys) +{ + ALOGV("adev_get_parameters"); + return strdup(""); +} + +static int adev_init_check(const struct audio_hw_device *dev) +{ + ALOGV("adev_init_check"); + return 0; +} + +static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) +{ + ALOGV("adev_set_voice_volume: %f", volume); + return -ENOSYS; +} + +static int adev_set_master_volume(struct audio_hw_device *dev, float volume) +{ + ALOGV("adev_set_master_volume: %f", volume); + return -ENOSYS; +} + +static int adev_get_master_volume(struct audio_hw_device *dev, float *volume) +{ + ALOGV("adev_get_master_volume: %f", *volume); + return -ENOSYS; +} + +static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) +{ + ALOGV("adev_set_master_mute: %d", muted); + return -ENOSYS; +} + +static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) +{ + ALOGV("adev_get_master_mute: %d", *muted); + return -ENOSYS; +} + +static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) +{ + ALOGV("adev_set_mode: %d", mode); + return 0; +} + +static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) +{ + ALOGV("adev_set_mic_mute: %d",state); + return -ENOSYS; +} + +static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) +{ + ALOGV("adev_get_mic_mute"); + return -ENOSYS; +} + +static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, + const struct audio_config *config) +{ + ALOGV("adev_get_input_buffer_size: %d", 320); + return 320; +} + +static int adev_open_input_stream(struct audio_hw_device __unused *dev, + audio_io_handle_t handle, + audio_devices_t devices, + struct audio_config *config, + struct audio_stream_in **stream_in, + audio_input_flags_t flags __unused, + const char *address __unused, + audio_source_t source __unused) +{ + struct stub_stream_in *in; + + ALOGV("adev_open_input_stream..."); + + in = (struct stub_stream_in *)calloc(1, sizeof(struct stub_stream_in)); + if (!in) + return -ENOMEM; + + in->stream.common.get_sample_rate = in_get_sample_rate; + in->stream.common.set_sample_rate = in_set_sample_rate; + in->stream.common.get_buffer_size = in_get_buffer_size; + in->stream.common.get_channels = in_get_channels; + in->stream.common.get_format = in_get_format; + in->stream.common.set_format = in_set_format; + in->stream.common.standby = in_standby; + in->stream.common.dump = in_dump; + in->stream.common.set_parameters = in_set_parameters; + in->stream.common.get_parameters = in_get_parameters; + in->stream.common.add_audio_effect = in_add_audio_effect; + in->stream.common.remove_audio_effect = in_remove_audio_effect; + in->stream.set_gain = in_set_gain; + in->stream.read = in_read; + in->stream.get_input_frames_lost = in_get_input_frames_lost; + + *stream_in = &in->stream; + return 0; +} + +static void adev_close_input_stream(struct audio_hw_device *dev, + struct audio_stream_in *in) +{ + ALOGV("adev_close_input_stream..."); + return; +} + +static int adev_dump(const audio_hw_device_t *device, int fd) +{ + ALOGV("adev_dump"); + return 0; +} + +static int adev_close(hw_device_t *device) +{ + ALOGV("adev_close"); + free(device); + return 0; +} + +static int adev_open(const hw_module_t* module, const char* name, + hw_device_t** device) +{ + struct alsa_audio_device *adev; + + ALOGV("adev_open: %s", name); + + get_alsa_device_name(device_name); + ALOGI("adev_open: %s", device_name); + + if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) + return -EINVAL; + + adev = calloc(1, sizeof(struct alsa_audio_device)); + if (!adev) + return -ENOMEM; + + adev->hw_device.common.tag = HARDWARE_DEVICE_TAG; + adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0; + adev->hw_device.common.module = (struct hw_module_t *) module; + adev->hw_device.common.close = adev_close; + adev->hw_device.init_check = adev_init_check; + adev->hw_device.set_voice_volume = adev_set_voice_volume; + adev->hw_device.set_master_volume = adev_set_master_volume; + adev->hw_device.get_master_volume = adev_get_master_volume; + adev->hw_device.set_master_mute = adev_set_master_mute; + adev->hw_device.get_master_mute = adev_get_master_mute; + adev->hw_device.set_mode = adev_set_mode; + adev->hw_device.set_mic_mute = adev_set_mic_mute; + adev->hw_device.get_mic_mute = adev_get_mic_mute; + adev->hw_device.set_parameters = adev_set_parameters; + adev->hw_device.get_parameters = adev_get_parameters; + adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size; + adev->hw_device.open_output_stream = adev_open_output_stream; + adev->hw_device.close_output_stream = adev_close_output_stream; + adev->hw_device.open_input_stream = adev_open_input_stream; + adev->hw_device.close_input_stream = adev_close_input_stream; + adev->hw_device.dump = adev_dump; + + adev->devices = AUDIO_DEVICE_NONE; + + *device = &adev->hw_device.common; + + return 0; +} + +static struct hw_module_methods_t hal_module_methods = { + .open = adev_open, +}; + +struct audio_module HAL_MODULE_INFO_SYM = { + .common = { + .tag = HARDWARE_MODULE_TAG, + .module_api_version = AUDIO_MODULE_API_VERSION_0_1, + .hal_api_version = HARDWARE_HAL_API_VERSION, + .id = AUDIO_HARDWARE_MODULE_ID, + .name = "Orange Pi audio hdmi HW HAL", + .author = "The Android Open Source Project", + .methods = &hal_module_methods, + }, +}; diff --git a/audio/audio_policy_configuration.xml b/audio/audio_policy_configuration.xml new file mode 100644 index 0000000..b2647e8 --- /dev/null +++ b/audio/audio_policy_configuration.xml @@ -0,0 +1,106 @@ + + + + + + + Speaker + Built-In Mic + + Speaker + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bluetooth/Android.bp b/bluetooth/Android.bp new file mode 100644 index 0000000..13a4a51 --- /dev/null +++ b/bluetooth/Android.bp @@ -0,0 +1,57 @@ +// Copyright (C) 2020 The Android Open Source Project +// Copyright (C) 2024 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.bluetooth-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "BluetoothHci.cpp", + "main.cpp", + "net_bluetooth_mgmt.cpp", + ], + static_libs: [ + "android.hardware.bluetooth.async", + "android.hardware.bluetooth.hci", + ], + shared_libs: [ + "android.hardware.bluetooth-V1-ndk", + "libbase", + "libbinder_ndk", + "liblog", + "libutils", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.bluetooth-service.opi.rc", + src: "android.hardware.bluetooth-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.bluetooth-service.opi.xml", + src: "android.hardware.bluetooth-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.bluetooth.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.bluetooth-service.opi"], + prebuilts: [ + "android.hardware.bluetooth-service.opi.rc", + "android.hardware.bluetooth-service.opi.xml", + ], +} diff --git a/bluetooth/BluetoothHci.cpp b/bluetooth/BluetoothHci.cpp new file mode 100644 index 0000000..191b487 --- /dev/null +++ b/bluetooth/BluetoothHci.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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.bluetooth.service.opi" + +#include "BluetoothHci.h" + +#include "log/log.h" + +using namespace ::android::hardware::bluetooth::hci; +using namespace ::android::hardware::bluetooth::async; +using aidl::android::hardware::bluetooth::Status; + +namespace aidl::android::hardware::bluetooth::impl { + +void OnDeath(void* cookie); + +class BluetoothDeathRecipient { + public: + BluetoothDeathRecipient(BluetoothHci* hci) : mHci(hci) {} + + void LinkToDeath(const std::shared_ptr& cb) { + mCb = cb; + clientDeathRecipient_ = AIBinder_DeathRecipient_new(OnDeath); + auto linkToDeathReturnStatus = AIBinder_linkToDeath( + mCb->asBinder().get(), clientDeathRecipient_, this /* cookie */); + LOG_ALWAYS_FATAL_IF(linkToDeathReturnStatus != STATUS_OK, + "Unable to link to death recipient"); + } + + void UnlinkToDeath(const std::shared_ptr& cb) { + LOG_ALWAYS_FATAL_IF(cb != mCb, "Unable to unlink mismatched pointers"); + } + + void serviceDied() { + if (mCb != nullptr && !AIBinder_isAlive(mCb->asBinder().get())) { + ALOGE("Bluetooth remote service has died"); + } else { + ALOGE("BluetoothDeathRecipient::serviceDied called but service not dead"); + return; + } + { + std::lock_guard guard(mHasDiedMutex); + has_died_ = true; + } + mHci->close(); + } + BluetoothHci* mHci; + std::shared_ptr mCb; + AIBinder_DeathRecipient* clientDeathRecipient_; + bool getHasDied() { + std::lock_guard guard(mHasDiedMutex); + return has_died_; + } + + private: + std::mutex mHasDiedMutex; + bool has_died_{false}; +}; + +void OnDeath(void* cookie) { + auto* death_recipient = static_cast(cookie); + death_recipient->serviceDied(); +} + +BluetoothHci::BluetoothHci() { + mDeathRecipient = std::make_shared(this); +} + +ndk::ScopedAStatus BluetoothHci::initialize( + const std::shared_ptr& cb) { + ALOGI(__func__); + + if (cb == nullptr) { + ALOGE("cb == nullptr! -> Unable to call initializationComplete(ERR)"); + return ndk::ScopedAStatus::fromServiceSpecificError(STATUS_BAD_VALUE); + } + + HalState old_state = HalState::READY; + { + std::lock_guard guard(mStateMutex); + if (mState != HalState::READY) { + old_state = mState; + } else { + mState = HalState::INITIALIZING; + } + } + + if (old_state != HalState::READY) { + ALOGE("initialize: Unexpected State %d", static_cast(old_state)); + close(); + cb->initializationComplete(Status::ALREADY_INITIALIZED); + return ndk::ScopedAStatus::ok(); + } + + mCb = cb; + management_.reset(new NetBluetoothMgmt); + mFd = management_->openHci(); + if (mFd < 0) { + management_.reset(); + + ALOGI("Unable to open Linux interface."); + mState = HalState::READY; + cb->initializationComplete(Status::UNABLE_TO_OPEN_INTERFACE); + return ndk::ScopedAStatus::ok(); + } + + mDeathRecipient->LinkToDeath(mCb); + + mH4 = std::make_shared( + mFd, + [](const std::vector& /* raw_command */) { + LOG_ALWAYS_FATAL("Unexpected command!"); + }, + [this](const std::vector& raw_acl) { + mCb->aclDataReceived(raw_acl); + }, + [this](const std::vector& raw_sco) { + mCb->scoDataReceived(raw_sco); + }, + [this](const std::vector& raw_event) { + mCb->hciEventReceived(raw_event); + }, + [this](const std::vector& raw_iso) { + mCb->isoDataReceived(raw_iso); + }, + [this]() { + ALOGI("HCI socket device disconnected"); + mFdWatcher.StopWatchingFileDescriptors(); + }); + mFdWatcher.WatchFdForNonBlockingReads(mFd, + [this](int) { mH4->OnDataReady(); }); + + { + std::lock_guard guard(mStateMutex); + mState = HalState::ONE_CLIENT; + } + ALOGI("initialization complete"); + auto status = mCb->initializationComplete(Status::SUCCESS); + if (!status.isOk()) { + if (!mDeathRecipient->getHasDied()) { + ALOGE("Error sending init callback, but no death notification"); + } + close(); + return ndk::ScopedAStatus::fromServiceSpecificError( + STATUS_FAILED_TRANSACTION); + } + + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus BluetoothHci::close() { + ALOGI(__func__); + { + std::lock_guard guard(mStateMutex); + if (mState != HalState::ONE_CLIENT) { + LOG_ALWAYS_FATAL_IF(mState == HalState::INITIALIZING, + "mState is INITIALIZING"); + ALOGI("Already closed"); + return ndk::ScopedAStatus::ok(); + } + mState = HalState::CLOSING; + } + + mFdWatcher.StopWatchingFileDescriptors(); + + management_->closeHci(); + + { + std::lock_guard guard(mStateMutex); + mState = HalState::READY; + mH4 = nullptr; + } + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus BluetoothHci::sendHciCommand( + const std::vector& packet) { + return send(PacketType::COMMAND, packet); +} + +ndk::ScopedAStatus BluetoothHci::sendAclData( + const std::vector& packet) { + return send(PacketType::ACL_DATA, packet); +} + +ndk::ScopedAStatus BluetoothHci::sendScoData( + const std::vector& packet) { + return send(PacketType::SCO_DATA, packet); +} + +ndk::ScopedAStatus BluetoothHci::sendIsoData( + const std::vector& packet) { + return send(PacketType::ISO_DATA, packet); +} + +ndk::ScopedAStatus BluetoothHci::send(PacketType type, + const std::vector& v) { + if (v.empty()) { + ALOGE("Packet is empty, no data was found to be sent"); + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } + + std::lock_guard guard(mStateMutex); + if (mH4 == nullptr) { + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); + } + + mH4->Send(type, v); + return ndk::ScopedAStatus::ok(); +} + +} // namespace aidl::android::hardware::bluetooth::impl diff --git a/bluetooth/BluetoothHci.h b/bluetooth/BluetoothHci.h new file mode 100644 index 0000000..a27316c --- /dev/null +++ b/bluetooth/BluetoothHci.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 +#include + +#include "async_fd_watcher.h" +#include "h4_protocol.h" +#include "net_bluetooth_mgmt.h" + +namespace aidl::android::hardware::bluetooth::impl { + +class BluetoothDeathRecipient; + +// This Bluetooth HAL implementation connects with a serial port at dev_path_. +class BluetoothHci : public BnBluetoothHci { + public: + BluetoothHci(); + + ndk::ScopedAStatus initialize( + const std::shared_ptr& cb) override; + + ndk::ScopedAStatus sendHciCommand( + const std::vector& packet) override; + + ndk::ScopedAStatus sendAclData(const std::vector& packet) override; + + ndk::ScopedAStatus sendScoData(const std::vector& packet) override; + + ndk::ScopedAStatus sendIsoData(const std::vector& packet) override; + + ndk::ScopedAStatus close() override; + + private: + int mFd{-1}; + std::shared_ptr mCb = nullptr; + + std::shared_ptr<::android::hardware::bluetooth::hci::H4Protocol> mH4; + + std::shared_ptr mDeathRecipient; + + ::android::hardware::bluetooth::async::AsyncFdWatcher mFdWatcher; + + [[nodiscard]] ndk::ScopedAStatus send( + ::android::hardware::bluetooth::hci::PacketType type, + const std::vector& packet); + std::unique_ptr management_{}; + + // Don't close twice or open before close is complete + std::mutex mStateMutex; + enum class HalState { + READY, + INITIALIZING, + ONE_CLIENT, + CLOSING, + } mState{HalState::READY}; +}; + +} // namespace aidl::android::hardware::bluetooth::impl diff --git a/bluetooth/android.hardware.bluetooth-service.opi.rc b/bluetooth/android.hardware.bluetooth-service.opi.rc new file mode 100644 index 0000000..b962009 --- /dev/null +++ b/bluetooth/android.hardware.bluetooth-service.opi.rc @@ -0,0 +1,6 @@ +service vendor.bluetooth-rpi /apex/com.android.hardware.bluetooth.opi5/bin/hw/android.hardware.bluetooth-service.opi + class hal + capabilities BLOCK_SUSPEND NET_ADMIN SYS_NICE + user bluetooth + group bluetooth + task_profiles HighPerformance diff --git a/bluetooth/android.hardware.bluetooth-service.opi.xml b/bluetooth/android.hardware.bluetooth-service.opi.xml new file mode 100644 index 0000000..bb05995 --- /dev/null +++ b/bluetooth/android.hardware.bluetooth-service.opi.xml @@ -0,0 +1,6 @@ + + + android.hardware.bluetooth + IBluetoothHci/default + + diff --git a/bluetooth/apex_file_contexts b/bluetooth/apex_file_contexts new file mode 100644 index 0000000..77f5897 --- /dev/null +++ b/bluetooth/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.bluetooth-service\.opi u:object_r:hal_bluetooth_default_exec:s0 diff --git a/bluetooth/apex_manifest.json b/bluetooth/apex_manifest.json new file mode 100644 index 0000000..544ae6f --- /dev/null +++ b/bluetooth/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.bluetooth.opi5", + "version": 1 +} diff --git a/bluetooth/main.cpp b/bluetooth/main.cpp new file mode 100644 index 0000000..74a0576 --- /dev/null +++ b/bluetooth/main.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 "BluetoothHci.h" + +#include +#include +#include + +using ::aidl::android::hardware::bluetooth::impl::BluetoothHci; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr bluetooth = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + BluetoothHci::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(bluetooth->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/bluetooth/net_bluetooth_mgmt.cpp b/bluetooth/net_bluetooth_mgmt.cpp new file mode 100644 index 0000000..24b85bd --- /dev/null +++ b/bluetooth/net_bluetooth_mgmt.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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.bluetooth.service.opi" + +#include "net_bluetooth_mgmt.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +// Definitions imported from +#define BTPROTO_HCI 1 + +// Definitions imported from +#define HCI_CHANNEL_USER 1 +#define HCI_CHANNEL_CONTROL 3 +#define HCI_DEV_NONE 0xffff + +struct sockaddr_hci { + sa_family_t hci_family; + unsigned short hci_dev; + unsigned short hci_channel; +}; + +// Definitions imported from +#define MGMT_OP_READ_INDEX_LIST 0x0003 +#define MGMT_EV_INDEX_ADDED 0x0004 +#define MGMT_EV_CMD_COMPLETE 0x0001 +#define MGMT_PKT_SIZE_MAX 1024 +#define MGMT_INDEX_NONE 0xFFFF +#define WRITE_NO_INTR(fn) \ + do { \ + } while ((fn) == -1 && errno == EINTR) + +struct mgmt_pkt { + uint16_t opcode; + uint16_t index; + uint16_t len; + uint8_t data[MGMT_PKT_SIZE_MAX]; +} __attribute__((packed)); + +struct mgmt_ev_read_index_list { + uint16_t opcode; + uint8_t status; + uint16_t num_controllers; + uint16_t index[]; +} __attribute__((packed)); + +namespace aidl::android::hardware::bluetooth::impl { + +// Wait indefinitely for the selected HCI interface to be enabled in the +// bluetooth driver. +int NetBluetoothMgmt::waitHciDev(int hci_interface) { + ALOGI("waiting for hci interface %d", hci_interface); + + int ret = -1; + struct mgmt_pkt cmd; + struct pollfd pollfd; + struct sockaddr_hci hci_addr = { + .hci_family = AF_BLUETOOTH, + .hci_dev = HCI_DEV_NONE, + .hci_channel = HCI_CHANNEL_CONTROL, + }; + + // Open and bind a socket to the bluetooth control interface in the + // kernel driver, used to send control commands and receive control + // events. + int fd = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + if (fd < 0) { + ALOGE("unable to open raw bluetooth socket: %s", strerror(errno)); + return -1; + } + + if (bind(fd, (struct sockaddr*)&hci_addr, sizeof(hci_addr)) < 0) { + ALOGE("unable to bind bluetooth control channel: %s", strerror(errno)); + goto end; + } + + // Send the control command [Read Index List]. + cmd = { + .opcode = MGMT_OP_READ_INDEX_LIST, + .index = MGMT_INDEX_NONE, + .len = 0, + }; + + if (write(fd, &cmd, 6) != 6) { + ALOGE("error writing mgmt command: %s", strerror(errno)); + goto end; + } + + // Poll the control socket waiting for the command response, + // and subsequent [Index Added] events. The loops continue without + // timeout until the selected hci interface is detected. + pollfd = {.fd = fd, .events = POLLIN}; + + for (;;) { + ret = poll(&pollfd, 1, -1); + + // Poll interrupted, try again. + if (ret == -1 && (errno == EINTR || errno == EAGAIN)) { + continue; + } + + // Poll failure, abandon. + if (ret == -1) { + ALOGE("poll error: %s", strerror(errno)); + break; + } + + // Spurious wakeup, try again. + if (ret == 0 || (pollfd.revents & POLLIN) == 0) { + continue; + } + + // Read the next control event. + struct mgmt_pkt ev {}; + ret = read(fd, &ev, sizeof(ev)); + if (ret < 0) { + ALOGE("error reading mgmt event: %s", strerror(errno)); + goto end; + } + + // Received [Read Index List] command response. + if (ev.opcode == MGMT_EV_CMD_COMPLETE) { + struct mgmt_ev_read_index_list* data = + (struct mgmt_ev_read_index_list*)ev.data; + + // Prefer the exact hci_interface + for (int i = 0; i < data->num_controllers; i++) { + if (data->index[i] == hci_interface) { + ALOGI("hci interface %d found", data->index[i]); + ret = data->index[i]; + goto end; + } + } + + // Accept a larger one if we can't find the exact one + for (int i = 0; i < data->num_controllers; i++) { + if (data->index[i] >= hci_interface) { + ALOGI("hci interface %d found", data->index[i]); + ret = data->index[i]; + goto end; + } + } + } + + // Received [Index Added] event. + if (ev.opcode == MGMT_EV_INDEX_ADDED && ev.index == hci_interface) { + ALOGI("hci interface %d added", hci_interface); + ret = hci_interface; + goto end; + } + } + +end: + ::close(fd); + return ret; +} + +int NetBluetoothMgmt::findRfKill() { + char rfkill_type[64]; + char type[16]; + int fd, size, i; + for(i = 0; rfkill_state_ == NULL; i++) + { + snprintf(rfkill_type, sizeof(rfkill_type), "/sys/class/rfkill/rfkill%d/type", i); + if ((fd = open(rfkill_type, O_RDONLY)) < 0) + { + ALOGE("open(%s) failed: %s (%d)\n", rfkill_type, strerror(errno), errno); + return -1; + } + + size = read(fd, &type, sizeof(type)); + ::close(fd); + + if ((size >= 9) && !memcmp(type, "bluetooth", 9)) + { + ::asprintf(&rfkill_state_, "/sys/class/rfkill/rfkill%d/state", i); + break; + } + } + return 0; +} + +int NetBluetoothMgmt::rfKill(int block) { + int fd; + char on = (block)?'1':'0'; + if (findRfKill() != 0) return 0; + + fd = open(rfkill_state_, O_WRONLY); + if (fd < 0) { + ALOGE( "Unable to open /dev/rfkill"); + return -1; + } + ssize_t len; + WRITE_NO_INTR(len = write(fd, &on, 1)); + if (len < 0) { + ALOGE( "Failed to change rfkill state"); + ::close(fd); + return -1; + } + ::close(fd); + return 0; +} + +int NetBluetoothMgmt::openHci(int hci_interface) { + ALOGI("opening hci interface %d", hci_interface); + + // Block Bluetooth. + rfkill_state_ = NULL; + rfKill(1); + + // Wait for the HCI interface to complete initialization or to come online. + int hci = waitHciDev(hci_interface); + if (hci < 0) { + ALOGE("hci interface %d not found", hci_interface); + return -1; + } + + // Open the raw HCI socket. + int fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + if (fd < 0) { + ALOGE("unable to open raw bluetooth socket: %s", strerror(errno)); + return -1; + } + + struct sockaddr_hci hci_addr = { + .hci_family = AF_BLUETOOTH, + .hci_dev = static_cast(hci), + .hci_channel = HCI_CHANNEL_USER, + }; + + // Bind the socket to the selected interface. + if (bind(fd, (struct sockaddr*)&hci_addr, sizeof(hci_addr)) < 0) { + ALOGE("unable to bind bluetooth user channel: %s", strerror(errno)); + ::close(fd); + return -1; + } + + ALOGI("hci interface %d ready", hci); + bt_fd_ = fd; + return fd; +} + +void NetBluetoothMgmt::closeHci() { + if (bt_fd_ != -1) { + ::close(bt_fd_); + bt_fd_ = -1; + } + + // Unblock Bluetooth. + rfKill(0); + free(rfkill_state_); +} + +} // namespace aidl::android::hardware::bluetooth::impl diff --git a/bluetooth/net_bluetooth_mgmt.h b/bluetooth/net_bluetooth_mgmt.h new file mode 100644 index 0000000..b67510f --- /dev/null +++ b/bluetooth/net_bluetooth_mgmt.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 + +namespace aidl::android::hardware::bluetooth::impl { + +class NetBluetoothMgmt { + public: + NetBluetoothMgmt() {} + ~NetBluetoothMgmt() { + ::close(bt_fd_); + } + + int openHci(int hci_interface = 0); + void closeHci(); + + private: + int waitHciDev(int hci_interface); + int findRfKill(); + int rfKill(int block); + char *rfkill_state_; + + // File descriptor opened to the bluetooth user channel. + int bt_fd_{-1}; +}; + +} // namespace aidl::android::hardware::bluetooth::impl diff --git a/bootanimation.zip b/bootanimation.zip new file mode 100644 index 0000000000000000000000000000000000000000..2d58f5981fc4077a014966a35e425e85ab9d3edd GIT binary patch literal 805210 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

yT z!Bdy2k}Y+oTd&A=D36Vn-C?mir?{Q{n2SAIL~!z}oz-h4b+z9ATIg{ccN~ud02RPs{qN8MoC-)Veuowy;;>U6R34}Rzys9(*rouX2Z@Km zJ%k|u4rxgn;t^Oad+e7!F`801p6K{74$#F$2g1 zxCL4dfF=W|v zrul}n$9Ev|$hagKXOO2_8r3tDu6uNm;a_>ZKbrJw;M0uQ2sXP=eLlPFO4`f!4TH^u z#2qON?uP2`3K=oNRH;vuEOKrSs8P`>yYRoQ;0YF**TYn6wzgDSFpp9)qohrfk#^w{G!98cy7VHOf_A79G8Xa%8VQd)iVvR$mI^vd zB-JjMR$~o3xZ&!Epw4ZVLFtbzg^i7`&B*a^*QqcIW9NlW>SF3ac zcsRT6U0zpE<7@oD8Fi07a_%Vem>aO5kM!2qdsAO*or7WtwKx}A=sR_SAo=RTb-zPX zr_mUa#(Rr5x&37$Cb5O)w5g|EAy#P*xU&)|q@6*^_tiN&f|11GX7%jP)E+m9omZ2; z_G^Ou&>?i%j{fr43{z`fR{E1R%~l>YSy}xeD^jk9ZDeC6eJy6=jV(wvgq)FqE zH4U}v?CBEXcd~C9l8T<8Y<(#?WEqNTb}Q+5tFgPFtkI#+>YV5OxVJFWk?q_!q*m}P9+r|xyhNxdNb)v8J^&+&&kwKpR; zb_J2RNbGMhY~pM-SeE0S`NPf>w5jGF$eW9aM{N(aU(CMfy3m&SxO?hS^PUoaz-1+Y zE0zqp+5u^-qSuT?r90y8hf!wfIPEKUnf0nPKM*P<9-rZ_^Fg1g$`T3Qo-4In5+9D6 z3&m(vdn(XcIQC4L@8dmpO)_RSqSe`|4400+PhE*Ym19B0v;wWg_?o3T!TDHxM#cnF zF*`Ft1OvMjj46j(fdk7WjoyvX(vIh7jJJB47n`5THY;ZzoZZqjzto~~z>HmqNyk<7 zIiV&;ndo)1$HhkiTSl$ZH)_c5b7ds#m|y2+Z5*YC414Z^y>)Z2O(`qs2=Hw!jw2OfTWawqxXP>$EB z(HO-oOuX<5frU)6=yRUkx;jpMDUutPLTC)_&WRLdh`DiTZC#Bwl_SZ*_ftC%yFYZp z@cAW0?7FhU8@)t}Z&`R7zWRe>QG{pHdHSn^Py2d*{I03oWc3pPuT&x1Z_^p_Gczw& zG7pm3stUqwx_jzef_e~shXt8^bdfGmMHAB(wfT>C3;Y2W|udoq_($)3y`rnZ^);gkO;w3xo64*~s&6GzV<(c*92xc9?# z0B{$;znD(=@AfH1d!2!|=zy^?V*xv_g z4pzo7Y(PW;kq3xAv@c-^5Zp2Zm;tK} z91w`4q@;i`0`vlw#dp{^_A~%9V21F!i2>dPm>3Yj0Nwzx0AK)qz+zxP4%k6(9De{U zKmuZ9WOO`x3GT#q2jfp+0}u%42yRq{Oa$^2APt>7u_^er{*^TT#f^nNKbjavHx}}W zf0g*kFM<7DqT)ouH8E-FCNJDu&syGF9?Xfgw#+ZI(9gW-Z1x!u>W>U7>W6hfTM2A` zH3{*1b0bdrfMi0@<>!_c?Aoz>Sh~MF(O#Uw_S28$!_<8cd4w7F0W+*Z_F$|bq;(iy z3+527IIM9@pVd4XYxq!I7y}ChsF~ODy_z^Xc#@!)o3D#@$TF-l5hc9Irxcq!XnkpxB;U{aH!c&5dC`Qjbih2K!L$rbjLaLT z)1|A@E8aqJyJGezJ4T*BKl%{VGm?QseA81YTS+jEk$Dliwlg)<7;|a#;E{SOU4Bcv z0pTc&Q4U;#iA0Y1Vok@p0jL0Kx8|=LtS%b42o^$#M9$zjy7Qt|`89ooU$tfixl8Xk ztJyXN?I+X^b?^x%aZ#~V)a-SwIs|xeelpAtnMmbAd!C``G}me$6s1t|O;McdRU%(&> zD^|>_!C7*Sn~#<>CM6Wj49lO$qLnq#qxOt;>L}KY1)Px z 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ξtg0s?=wHv=w`J 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

O1#6ZE_Pw%j3SHUF6Hkb8H)d*IR~Xm%jjArD*v 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�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

Idj2r z+!OC^vaB|JVC%u?SFWF1mlfOE`II}IuEk~`^7)&pe*|*L zShx(d(&v}|v>?DdtXbsaNaIUOV8)ZuBs%_z3wvJ73&<3kSTNb9)m0?e=3vbIg3 zgDA`-7_-oo)m+%!F=H)sMU=^&L??c92N%GgE5}8y5|`E_Fql`f%EjDdheqrXD@P7o z^1ECgT7|YtkO>Y5`es*N+Bm1{=-8(7K{uJ4=B^zu99Y=qWV^UKOTKxX7Gi3<-zg|m zRgiC&!m1j5^DVzDtE>ERq%Q^f#0E84&I=a=SIcKaVua`RO);yBIZ&b41*1waU9XZXU(t4aI9;&8+_D)>3fYC~M+ zIMg6)35M*3UHvNiu+m0=k8!+YmkM`%C9^(2eq%N#b=gH0b56wEXyg8S%H50x;<58P zT|paDb8AW!Wj9=Nfvo+!)>snXkvG3Z>Ob7EkfcD$KGf)TeRroJ&?gzwG0XHy#6d%` z7}OpLa=zTAa0_p5q2?^=R@qs;6Dejlkx>>WR2q-LJqZEsFhNh^a_G!Znk_)==qpyY z%V?5Wp`n-2~2kW*V zWDav}E59fDDhDB@p%dLe*p-@0Zl|xzaVH?&H#7ipR4X75R3GgoI#ng2!_E@60qok0 zWS`YZq0p1UDgLD&$wb5y0hO;6=xyD6(3o>-57$nX4o=4GrCk+X3De3^qsLGH1GyV6 zxvmwNxBnP?NVbREK#Mi`1{bMMh~77o!vVI%tDRU`T0r;`(Hs(~!&4UbzJ@PD0urW$ zUUwK3&aTP_(&i_|*&KBD5l>ZD>%4bdHm-buAgpf?Mgw%eb~CgXOWr3{S|TU9RM(~^ z#zi?XMlGktGiwH|US!fJFR99`im$s8M(G**1sB~#{we8c99cWfEQr){{8*XVUj~bI zf`?HvnRwS29>w}2yV2>4?{__~D*=2UH^eIZytJ*`E|cKVa#U-{i(XMR)ceI)8l0m` zFGD~g8}G>}yooino;<%AOMX)gs*ZhsY_7ObNu`NMCyo)=FB=`siJgSLeJ-bt2z0hw zU%*r3jL>tvPhAIr6i#;coa@)(z)s*lEga`1hyiAB(`X=X3Qe8azaTO0>fRA2gX7%P5>*%qdy@W`u4lWIE$r(+AB;dA}N?MQd$} z@MUv2Kgj^ZH~eTYb{%)rh?(T2go}JE@~#`Mq8(nWNsr}TB1v*W4NE?Ri{<(ke7)i< zC{jvem|Qlvb`0bKjKQsLuo88B7m{+r;pfpfxo^G~-wC5J)O>lTt(Ey+sJybRz~HIo zYTTt%4qAt~?i>Go>WgSgB<~+e%cwij5N9rS(+=@e*aIiNiI^x`T!#mo(@L)i3cg6c z+9QG$Se6{lDi63Z#xkb$9qxhQ#!e>OKgWX!q4qLmtbMtBOKkFCh5&_9SJFg(Dva97 zpgBX2DD=R(F#!)cggr=*vQQFpeAM%Hr?c`zPx-w^sh0h`pn|o>5*k?~aT%L|5y3c< zEC*)QwMRtjCwcFR41(nABK_@~$f_=KtZ{YRYbTvi@Q0=3giwMJDp{5ZiacRBa%hqR z<0Wf-fANA=Yi*|+gVffUNCM0SX_6-HT)HXwK1sP2yO)% zzobUm2qu=oc0rZ0@OZlGhfkyA+LLK}p52FZ5V|g-<}^8Tavi1?m}`AKk1S$6%UPTh zwx;3jSaG(?DH7PP1F6%G6cJ@@QIwp7h!(|ll1O|lDBzc9+ZZ!0P6=~c%z~DkDU21b ziZDYhSn+m@1E=fHOZJnfBpz$a(L8^i@MT9fj;gaBUN;FFN6v0BPuoD8uE(M2#W9lcdLt0S}kp z$UTiH5|iB0e12aP7op8do0p{GLspJRfd7RXr)4Ip%4b>mDQ`KpgE1#A@?gam?^g)w z8<)W_TmQ5K-4p&$avSXUSn(bRqMwwPS99pM=^Q=jKDuI9jL@-WEVSmzJ2D-xc`NrZ z9HLhF9X0$qS`%D*=|~8J)NUEygo2AQqTGa;^eMDXa3H*u_v_+YZJg71>N4SBUApMh zbAF#KT-Y48c40zz*JCi%hty*zB3Sw(Q5w>|IkXg7?pgS3r$!Xr$G+MX;0Q&8PPZ+q z_%l_~BPT6psZ5Kb67mf?#CBw96w&(|xUaVCT0dKkq&s6g3EODoFfu$a|DR26|NnoZ z--g$ka01^O2Kym^s1Q^nD+40R)6yiU>ks-0BisRdJZ>$ZT#osR={`w*Z{Wx!U5_Vpf!Mn z09Jt@2*3t#FJK#>#CZ-nfN=Z`I{pgBvw{FN1C;fw9nV<@(2l=l$Fp_-q65?csO&Fw z0OSBj1Hc2Q9ssK6b62480d@uOqcE1T6?~NZ3qS5T;L<(75C02(1pfzqcmVwPr}f}? z1NjO6%PRu(SG2gVZ-PGtKp^HQq4R2g(N&4`gUpSDfmO#Ciqf#~N zuU_ag`V~iod=PJMbGB%pvdG@%VAuVz{A};$A>(o)`fk2s2uq{3cIj@O+3n|fV!hWH79xbkGiO?f^r>Ccp~3PGa{aH*=VVVL^wL!k zc@Rk*5d?Rdx?f3L(I~Bl*Jf+AEph50H+jC|m*O?D?3k$}C5=;3V2kK9TxU&xducoL z0}0RV@K?ugIpYo6#cejxjr-S0)YQXcEZZ2{(RRx|1eBW$_VWULjH1EICrHF?I=ig8 z?A%=_s2k%FWiN4MbK7~5l;?UluDNPjc4#&~%)Ox^uxBFU5{=x~CNHE~gR8}uCW;xS z*SChpIBNMu^_8wt+pfp#3we~a4#U}@9Q5m0Tv3BaVyV=qhm5SfTu7Op(K7YSdY|-A zMkMPU*^t3?&rp3eI{KYIyS(*vV$@?Z8ICzJ(wznU{@GcEf{Fu0KRm?{82L^5jmNAd zZEhup37Pa&a!`|$0(-HAy%02#)$3=vD)O9CtPp24V zzNx71FA>8{+niUbQMJscXce#pwLpaVkls6Y*ZuiU@oH1;>^V| zFAx*T!I*GcCmtB-6nc|Aij;>cfI9PY6BQ;vSAs6MwVynSJ$Zos-Cg?SqKnLsKhjJBSEZ$6138bqsK4<`nqQp){r#^J8ooXw^WX=jfomfHxQA`CtpumI z`nP_#dvZ5-)y3TG!^#~-=7zm*<>~U2RFbc_@4XIiT#9FAmgmkthVVbWAJH$8rIk;hMNP~Ao zDvEk{I=L2G`()K11VK5IC=m02;YSbD=U1-e9#De_cq#Sjqt^ygxI~FUH24P91q#Dc z)5V@cicax6G5ebOS?ZR+PchfU*R9L8t?6b=o=<0nhkmmCto^Z2teWP0SQW>SGFDFt z>bdQvX(N~u(QX#oZ%LL1b~(@JwRBOiE;Kc&DD^B!ckt}`IN6g37Ba{U4<5=2%jL~a zZ8~|D>feChNw)OH(Zx3=w5DgB>AvfOw)m(Akysnq1sekk>y(E4vHSaEJ-z~AH`RRg zoBFk)mm;6y&ZnQw?bcQ>H(;{^?d1%DmWPCIdR|3Jj>?wyQoXIK{4Ho%e_zl`Jgrpm z@M4~1BQrSn!+_!L4CUJ|Td;w(;#${vJAJ(=Yv$kUV$m5*r%WuT@Q^~+lg|58F1Axl zkK1FyFPIU>pgM`tMuk`LKd-!vfKzdqpg-Ih8%fjkyglM}7}`2Q?kdCeSWd)|<&0E0 zX53q1t#P4f{T{AHL3fGDO000JxLx7NShW`mPgcQod2JhcXM!Qmyrlo~&SNElckd57 z#~mpGoASP`DkEn+X2=B8`UCaT_upOG5-NF*SMcs9D`rvSy?j#JPB&u2jt57avZ1~( zDjen#=f*mg4@S-PQ@Xh_58~+Koj=C-_NFolR3$y^6Qb((BCW!x`>Tp1ot~V!eri`~ zqNeZMfhW$1QxXvxL+vxEq>Z0M>)Im5mfiQheMNgC$PNy_Nw-E}MbqAIoyf3vB}W|e zu^Mx8gL_zH+!U~7xB#eo{ZzT`J!8eI!`9(8awwpKJ`y**ds6w}x1ioH;PLb`Xg zXXHQk@Vxm^S7-HRr6ln*5K|-R1>cFJSL_6>iiMSHejWH5AJ8t$&!(hEUpUj@NvxB0btRMoK7& zE@PXqlrd^7RBzH|5=0-H@$)5(t;tu%WpdChQc#(?-H$xIjFh%arpdc)(+M;)(^ZlY zK++6XSC@ITt0`S#pygna43;Mil~zhg*TMRuNvF7k(NT9#!MAovuj#X+=DLc4R?szs z;P}TRJE$T{q1%*{T{E99ptw+peaFs3vTbu3K(lOq0}l&Y4uPk+%C2 zuJNR;c+wI1|3}?jMOEFm>!W`RKtMveQ4x@CkQR_G>F(~Dw1Cpxoze}`4bt7+(%s$r z`#h}I?ReLJuf31f+UtM=2M#%KIH&Xa{I2_&p$NJC%xL!>!x#nO0>*nDt4HH5;h^EN z>LQ*TF>mGvqzzBTi^1Ts`atc*o^*F0Q;IY?InmtT2$$<*yVGp8f;{PN3+BOdj)mvqA^uo4uB)EshA=DuekJ@VubTZGAYX`Q)zCRjHd za`+@OwaG1iJUwCOWP?iV%KFUqV|Jvxd?>P9+N&0CH|b^f+oMQXbYy&oavUxzD`ZB8 z?y+)c^=LD-9>r_F{LT_EfbPa0z&<-zrH40XhLG&4I6a+Yy<$^T&>3hhF>W6>H%cl& zVllY&Eu`ohj~X6UP}~>_M@cTsnWd0jWkvTyejowAXh6Q6Mo}A7&G0+q+XmsD*X-1@ zkq$%9CsxP{kUS{GbJu`?bJnq^3F33)=n<<-2)KxG`KGoX#m8@@{Ty zRJ=%Af>0eF^0`B4|=<1I#>9rb<7qE!ws`GR^m6;0B#qo#Lviy_m% z?-G-fe=$9gQEy$3Qnz~0Wv@a@wE>qMvS>RWTH0lfftr9*p@adqckI)G7pF_Z=-+hM zFDKbwW*)6l7bh5T-ZjCS&B5;)MP+j%J8-{6lpX(li9-vbYS(SVhGFJ>uxTW>smsT6 zSJDmLp(@CmS?aRAUDzS2Uv#MEf~RlHUZ-YGYLB|loIUqU2ACh4c)Nojlf#C64s;=^j- zIUAHURKdW4BWwW-g@ItqM72#^CDkg5@$6Zto~}HfuqgJX;Dqvm12*<|{S|Yzo3A%W zSRW?NJ|!IG>iw-E{EF{}j_6P~r_hifn@^^`Y~&-D$DcpLzusDK+Zja@=M;E~Kgj%g zD2xa@Riy9-9|_5p54nkn*GY)_LrrAU3yHMT1Q;0`?&&jz4Hc{6cGQ=tJt#awr3JdJ z&v;7TkYhl4@64=ily03et37)98eP?Iwcp{2Je6R7XyBqy%Qj|?a0N>(v&Gl($8fh-Z3pE&_-8Dp?iZfKp>>psjyCVN zj;I1LD99ms&>r<79%h*u>l0uzanx@uAy{KFnUIJ-SR~}Pchu?84|&(4UqP?lv|Bj_tE>)3G~9mH^;DRw8U~`n?uR|o>T?!g!pRx zh?)QleYA=^acn2T2PG;1Zh|;5*-NNASSy(VaaM6Tu!8o2En1XWpa3OXy5y zOMYA`CoX%1lkMHxNivwr*iYUR$KmoUXh`H4(~z;EH)DR(8zlulV#L-H7H?AY0u}5= zKY8y=zGdW1za^!XZq%QACJ9hAUYap(4w#HYR0zBXKOFSQHi;;oXRo5A-eH=wM!CCpKG5| z(3s?)=ml$nMG(f)kQhA<_SsgkHC=Mu<~jAKKo)TDDp9LEQ}X(&VHT1vS7c-Ka9j7H zM3#FwoFG1ag1S6*)ZQT1YbRnvUuukbf+O{-Y4*~hqKE6;vD-p4=ix!5OfyQnBlV}W zIJBl(-m(Z<&dJgR-byZ`V`(sXW-le~!}i@VoTP9$Vq0;Q>7#7~&_#P;(V&uRf;{;Z zB-~UiKi~Ed306#@Y|$QRs)vk^7{pmVr>IqI8=!cJ%<)<5owuoq8~pmkwk7|E4t|tW zLOh#@v8b&Zonp%)&B(5O5 zUhUhBeB4Fx7%R)#rHw@~s7umTH*%`A2bSN@3B0<9Q`gX=@>)y>qnCZ`q$VP%B z3i|s{>4a6FKF-Gt3|WwctMPW;@gfKYd>flNz#kX->Y`eA^}G^gM*a0u5tW+9zX5m@fbhEiH|rHH(tNw<&m)XnV$m*5>_&`*!-GT z@5XSb(yoswMvZk!KDTSirh7EB&~iOnM{DL)*GulM{*{$C7w>9e0Uq_VDdA=%GHAh{ z`sa>~0QQJL1KMolqUfIClLn|J3)-<+lcPZ`p36Li7WZUttkwn;0Y$eb|Iaq@-}RmM zX7@-W$OX4GQv?j)Xa27;5VE{}1Q*~Re}DaF1EKr>iGcw9c>44yh?7B(3~&Pw0e}t= z_5+jvSv%kn00lrffNX$h94G-8zW}lUfC3;1h_oLY86e>XWe^Zx11bUj01|W{1Hd|f zLI4Q?+yUqV#P+~RKn@L(c%T8m1V9Q7(tS|(0Qod96QBp6fB+uy2lxQ&1za`)Kmn`+ zNC-%{0mXoj8wB28`$c>g%z0XzgWCVo$QfJz96=N}JQ0qy{>^Em1OnB~v=RX~3JL=Qkxe{u)V zDxed9m41r{ARQnKfExaD>EriNt49WTtbPCq`Mvr9nkkQ`t$uq5Fd6Vc2G9Y35zzhs zDgxXIkOFWafKdP?9!nqpW+Q-`K;H-O$m3}%z$3q}TLB>f(DZx$1F#YRC_rjJNPu+! zeF9(wFby<)fN=pa15N_O12_rLlHWCuM<)Tg0?HuZ)w^UcJ*C&m#r^sg{3B1IJqzKknbl_ z42Wh+sAwRx?TZ%L*M$yo{!jc`D%4rQ)n#t zHuK!EC374ymjaO@!5eGH{SFVE>*8fxGk4oCB=HvU6znXBdPBN_5 zxCc^KNG{)QmSQH=4zh6!cog$$>GTef3}!jmTJ0xwo3F~G&V5_ z2JyIp450_ru#&PwAc{UEGXYI;_(w$#e7=%5S?zAl@;8w)`Dhn;wTO!ctV_4Aqa_|b z$QxE zq07>RuMs}0NC_$i-@FuQPUn_NU`}F9I_#!vL#-@>#C7Z(V$5-_!HJ~p;i&XeSmOJI2GuCFDy3(_(@Kme z%E~7|ZlJ$+&XzFqCA^q3IWD=K6{6;Unug9m{|t(qY?7Jb;4I>`u@mx>oe5F4b z|FG)lE02|#&&_@nQaCvC-JHz@L$7egps(Wv^&6+&L0V`As7m?}_0Bop2{MA_wXKBJ zyV-9JAKznzjEImB$fP&O%CY=Vl!$g}S896^V5&rqHO89mqZe(_7B?6HZ*fT9Fuddl z%P^}3bGIIFd&4rRCuA%8hSj+@)p1?P4N}RNAJGhb7H?3~X7hdVOW42wYl^TL8^zr~ zl0w3dg2)EjVC0QtLDyYvJLAfTFnd z2-#KQlQSFOCdMy4$b&rF*t|B;HKeen6r}2xR_J35Q{8rOEhZIS0~$o?bhs zW|mSLgvf+$Q7_$;-`Y&WPVAdc%jG z>&RI}l&0ThinA0emi%fP8ed~h=~UelpbaVd)f}Sr-hvE+(q{A<|Mh3w@ZIZFwbjk00a)oy>l1^MFz^-@Rh<%o1eV5&m6T+Wxf!}`4autXo(ck>}3b0l3wtvF2cSvgKrCkvnq>Exz^gDSlw0H z6k-R?e|4BjTYOFMs@^IJd{w_fW30)xAwq7@`XyXqXrBFGiBh`wdorWhXA{do1tKW# zYlM##8aLO*8+d2Y&`fAxuppYD%I_@ z!Pwo*=-b8H+9R4{1@V0S;!73w%xtD0K6)=2y+U$F!!Y4cGac~_B{KE_SX zuQ(l8xdR)tDDhbk_;p#_Fz{?>J{FgfvR3zPIh* zE;lG;G@n&f-K+7fw*=f9wY!hDE-ELD&}BC@$@)U=`PIYQd2Q})VI&-kF-H~(YmYgk zlvlB}6Vbt|)<}~IRk*PiiVB2qO}s$Bgb4`-sj;_vjGG`%YiGwO5jHNBa)!;AwbB^q zdDM%beX_r3aiN3i#azj}Mdap-y0K?&)gwnVe%tTgrI1pw9@Z(Y?1PhQSHShg2@Y!5 z4U@lZgv?bIf}z}&iP_n9taZ*^?sCyxAlnm9y;&vn!!r|ib&D}%c2jh5G5|ey?u?Ul zEBQuNuiD#K=Vt3b^oR&%{ZqTD(#+lsj(gontXD90t;3H?!eki9Zcmgu&J?_>kQK3a z%SEITuKK$?^G=y2yJh*w&NI3)_rJC`xG#Qv}%Kius~uqSN|T`$sljZ`L~ zGq>&caVnpOzK87d?ume-52^!2Rb7s<34J8}aieM`pR!MbT@?#azuRUNz%lQJDj%4> zB7*dXGbdGC3XTx(8@RPQ~tA4e>rV)kT+=e3^%PgF(GL^v!46`+7bhG0h~t zl@N}v*08I6Gz9%k+(W$E^&t1nRnwf|cB6>`&HPj<)vw^A9k=tIrpCgM%nUjUn)%_J z2&06?(}ATJ0Rl&wW=4QOhG&0t3YG}U*@xcEil&-Sj1j_vNn zo!RwOqzBuOOcj<7kVc>@UgbO986#6(p14*W&?w!ikE>~?)H&9 zz~f$R1}uIiABo5$-na&l@z#Grt7Uh-=hIsi5}mnlQPZC~D?$mF?C1tf4{6Cx_ypIt z?NCSRJ>}YvyLr4FE2~38jivH(=wQ?&&Jjg6;}a{fO2m~#`Q`oS-p7_lP<}?zJk>2f*!1JjaWC z>{HbICI6&R7!4_l@*9uzYzxkesEt7}-fAnR{&<75n$lFNl|^x{I^CE%faa!=3%!g`9M4QCt-7Z_<3T7} zlW$OIu}x1(YR0Lc?lNl%`W`$)%+VeW+2I9g7!+ptqpuk4>kKI%0e7pVrg4R&oJ;qUh>Wd}0aO7(e}WPP$-3H| zDtd2Dbkp};e^)$ansC9pNAW^hgRVa6;@YfMN@9g*$qJkRi1 z9oYJi5eH)*uLSTVS-fb{RHD58)$_;*@w~KHw_{Q}(PV?i6Yd= zFICLZY>n8`Y{dk7AF{i{{0Z#sGy{PeG>b^ipz7hEbPK8;B2PmE^!}sjp@TW7_@=GS zuM{=+;(Cuau^qUE&BPf2HJ&@TaJ5PNtLfAg|FAfFXq*nS>5f~H_@A~%V;wiv!3J~y2w(0MAkANCAlWyBO=Mz6NAIa$}Xlc9SckvLxf0jKO{^@$W z2E!hzi<$~+Y5Dyv3yZE5PO|CswW+rIBrNh_kQmgko{Ye9rOagELGcft^-LP#IPtrg zUn1F+w3y{9u&6qqBOyuoXY?-w*s>_lgY#Bd7{W(qexod71MNjdCJ}ZrN+NXu2j$a_K4L)LAuvu!09 zp$cCJ{3%K9Ro6Wp-#XDK2whOu(rb{(2NDalJomq`D#Ss_d7dYj(&g4re?XhtH$s8? zDe9rF@)i%fA#NS1c*GxX74b2O`Xk8YQ4C7v zNts{=U8`Bm3>etT>G1NxXqZjg0Ba2OcFUCzZ7q8%Xp)v~;-|r2beN}994>1XybX6O zSL3CjL?Ql>z457Se=g%^nE#o}Aj*ni-SY74Qsne3YT^xDW{t_X$;0Hp^WhuK=a_!# z!7;=%HVuq0&&qV=iOVX;m8!I`EeP>wR5-8@xY@{inYJC)w@)hqq4yI7{l?{UE&IAk zBIE5@5!_5gJ8%M@r3G|ZK-!!?&D}TLkwpo&Cm#(jOnEWy76&_QV571GJJ8@*=TN6a zV2EapF$ri)lLqG1j(r53k8b>}eW@hEx}K7e!Nfp8Ce6vxSlvrHsYPF?X{BLPswx@$ zL<|B>IJRw_lD-s}I}DilTT1W|iAdO<=VeRzy?le6X;sq4zF5rb=HVQ7%xMBxxgM8b z*jk|U*2f9 z=R>-8Vuz!la+TYzPlWC2`Y=9yHq@6S% z{jueKeMU#&nLiS3_{lF@*`?v+$!9r>nGM6yRr`!O;iI;Cpd~iu)nY2cSmg>*prF8! zul3sUAT3K?2I-Rm9<3U8#45upe zIc$sA45Qi-_$Lyg0>P1;9A%3IeUY_9WhJCa{$1S{8Qpv%TS{CmCuwV zc&NzebiQ`3rqucPcZgIx9t#%(bctZ+bojXCFAovO=)FELwk+io)#HMT#%{Y};?)CiB^8Dlu600Dou$ z)*Ze>!++iI+woI!Duc*uM$6C;vf3|4IT{a7KIo-?(UP?iBkr)M(H=x!|54O~rUtj~ z_!6X4)j_YVJkNVkX3M@|p{X{~np*sK(Zzr9b3XUn5^j8~DwrI0ko(`J8qS<3MPWcR z{{H&UszLuhsTzMAw|Z0!pcf!z2Fu^TBtTdUS_uFW04;!~1|SXK3VHVyaz$OlO3 zLHh$_(;zzrkv(t=@UT6w1YiKbLV$<>cmPHM?i>Mi05Lkqoq=aOE?9%)9Yo~74*-XN z+#E;=&<@aI0CobX08~GKMu0#ZxB@^Cz$&0~0d6?~=KyQ~3;+x|0G|M$0upNA9H6xU za(0lX0~+~l8=&$48X_R^2bA)t8o(X^Cjf^4-T+oD09OE>d4vs6vH-b17=QrO0YZFW zB*0)EZ395gV~+!X&3|6#0C7J^(t$33(ErclRsalutbjvH082pk0hB}lX@IHn$NN^` z7!xpwf4gi2az)SyT8$gwSZTxxJ3djv8)Bsv|JY@yE>aptqj+*^h^Z8`YjocjStWY0gUlD-T|Bg5ZCXn z2k;EQT0k;@asf^QAP21L@tPIz3}6^QM}W!zeR)(3Q0@Sd1XKgS43MzLe#c8SO-=BE z@{eu&7ssv4{$(2oU*ti*<6$E?0L>7^|C9R@v`_EezYFz6gCe4l=kPszFZZTR5t|~1 zL8yc=P!0wK%M%J7VS;X>9FDECz_bD*JCd%#xB|a@8WaN+Dryn3)OIEY4L0@`ocH1P z4DJFqxcr)mmmFDZ2E~^jl5HLi{>O&R;YKyS8?CMzM0vdawwENBH54EtREhRwoSg64m7z#k`plt%Gy>qMP0kY2b$C zNvFrJg#c&Ekk+mUvTi4W?2kW@ZIHe}>4$w;im~xuSiej7_8=G=*TSKg{$@V;TcjcX zgCrTL4}}!W1I4(}+bym6ghV{X(0Ch}I>EMIc~;oKY0-d0n-0>MEOVPN$-(pLB_9 zDVV3A&DL^p>037URQ)2!YU@CL*vo-qrHt-)#6tojkjw=~=WFhn7-$e!BrGHi@6Z=# zKnzvj-5H$E`!en3XW!TwERhgZziXkyj32@*$6qh1Z@$ayD57!u3#4a%?vx(nAh!GL zM7y7P_70zSIqb5fE1Zo@G^g+6^>+9>6-t3}ScUR>j8pP~vTQ068?v_+8MZ5=89_<| z4vS7A{UQSmjR;EqQEumoLe=k%43}9Wq@PBUTaU-3WSzdu>X9MMJs?5M?%qg-@v21& zdrOf*&qSpuF}@M<0&T}IQf38ev@{X-%k@jcF=GB4PF7wkCOwRov>QYM3;RM7d4W-E z_KK#)$3lX3P(6uSoH07d+nem`E|k#UauXTic(|E(Y7R)!I*ejIxM;9EyU)D5lL@#1Hqr;>g)Y>`p@2}zWahxv0Gbi)RuE`#xgZo^mXI()iP3G7QSQkhxsY; zw&U%gD?PnFqow+UQdLq4XtyVHzHggzwT5~Et6!frUIko7iKmQp4<*X0y=jXv?s})> zG{-fXX~tVnM4WJ?6;3fOTy)pUq;zF3{)`*y38vrft-RhX8+?&m>NSoi{r5*R+&gzzkuhxa2u?_!c1>C*8(QMlt%@+08|7`z5-+1 zfz9&W#MbxlS~!lBPVQtYCvdHoNXiza9e!o_dAgie4Xd@1I*a+%$m~SISLw)SgU>w3 zuPq@kA+99uZS6!hu(s=1+2?1t%--i{Rl@cS51)jX&E!+65 zLtutF`EKR8wC*fF;gMYWKNqYF$$jzFv94HT>UNFkGz$D+;uviXa(EcY6fz** zZiQUv;>(Z{WcxYc=opfP zaMo5CuTD40_Luv_9b#y_3*|3<6*axC8V#1NBHzF7W&JiwzvSor<%GXy$OcMV2S!WI zKXT!#bCK%kFm)$KywkyC)q;IfHhNZf-9*UL-i{sRH{CtfGa=iZFa9^?g@ ziI@nu1n(KS9U`_mht%$1EsCCosBC!ODoE{nd!O9ja7E*_M({h| z>vv}QHIfHXJ1G|SE`m=vJw|%fRo}fg`i0)jN>48?+}ksh${7gNf$5I95?11867VrE ztW-+zyj*0;?QH$UHAdMYBwEO(5mN+BmDon*H^rv$^KE0Z@yPZS27UdU7n zbv+E)?rlkt*ZmkQ?d<-L^8smn8!9ay40r6lHBiK9PvXjlaidt>66#XCF%;UZ*t^ z_`^T8lL^vQW%y%?!sMloJ|d~xAUED^X9)>P$%(tOCI^81wY87{`ms!U68?iZdqds*T#uFE#=_`Nyg2hWj{Dfk`Ow(ZnqM&G#`nwwzs zMmh75O5pg&6=U+Nn3Pp7G&1G>;3|x#nTdzj*67ogCUmZp`{MT3yF}7Ja}1;a!p~xR zYmCNmvWY6~W))zz<83`b;qLbKu52@O0&#JYBA0jsj6HhW_GKI^!WHT8OeK^fo@2{a zsH&Qv@|!7RNeT8FUwI?^yU!LswdnQaek}cnbTUbB5T1-P`g^pajM1-drfu#Qo`BN& z*bM`3JuTdX1>%R=z0h_V3&SxMxoqSwU7~6EqP~RuT2AQa+1HNNMQ~QHx4&n$wnZ%t z2`&;|*9P|VZEg`RmSR&tj;t6~W$7V@J;kbrQECsA-zm(i~9B=yE)xlvW{ z!~;#F>H#!rF?6tT(Erd<&MlVG7r9?*{uz`4e@Acj760a zE~!v$qhL6`a^t3vn!%J?93cR+vnT!Weih{B4;@mq(){R#iwmOXUvMJo&3aV(}>d!`94;380kxuh?3I!f%E~tocD{Fnp=`zp$jH2T3mR&=s zPUj&o$9zuKy6R!Jsd)ZKJ+q`{f7*G|6M7|P;e^mcgDsQXP-yq|T`;aCqR`gMSS-8g zToc8~SxA44lz5wp6EVRNXdf~B z?bhKiip1c1gA+#?GguFt;l|v&h)=0QBn!u}oliT{F>Yas2Nw;jr~Ao^D)Td7RrqaE zWxik)JYOojE+VGkT0n%|fX%*36UC$NE!t0R8SjUT(MyFs#A!a$nGk-XSF1+Qprq2> zN7C5as}(;|Hrr-gM{N@!xhJ(^#!IOJs{u)-rTTRe^;LW@@t@U>y_^~9zgIizBr%9y zRJSdS9dwJ^`K>F7miuAR%}V&m#}fnF*b>I4999FT*--?T7>u9#K;~Cp5(kL#^=$Ag zPJQeSFFpOjbU>D=%k)WPVpcF!ca2Z+v_Gk#Z&`mN_1k1TS$98-m=9v9emEFAmMnK} zblN0|70&dHOx~Eri4rVN*KwR1P9@P?yPNf%)?>4TRRg+_`-zm76hALaj|Im`g z`sb9DzD)iHBYjouXdBxQ*)p1tNqdHWfMbCp5}R7qs<|lah>|trni_q%Jj?Sd=Qj9% zjMq_RdZ0X|U^T7VvP)^p*N2W9$j>H^r!t+c36)>m+|sm#39WaG2)$3(KEOP^&-^+a zMeTrkZ!*Jh8H5Sx31~a#43N>LSH3; zuG3gwi<|On%H(XEdqo1K{I%J+a7O?7%WV4*zXK8J;_f94V!Or95`Aj8B%~K~kuoP_ zZ}wxgCEVLUe`A=-D)^FzSKk`nRfK~QfrKWLcyE4&#^?zh`9rE91|cyuOk`2y(?t30 z<+8RcK`ynEqFDQPOX{)|kOOF%+|M@iohwZg+E1C=4WQ6c)>YwvVLC}f)EEyw^4>gD+S>UW-)T9>G{<`mZOiE? ziM0bvhXNxDaPZDwA`&6#j+9mrKE#~-+jYY&XIO^oiBda{QKgU{5^j4_#rD=WyOkcmgt+&$hId=VvbCN)BrH>O& z1A|JA!E1!-#Dv|d?mATX>b~U<3u!~4_UlGL%%_!=y->+a-B`V<;&QD?ZM#{A+J|MN z6nB+pPw*5R^n<stZ@>DzJ0aYKl|nGRP&tMdje4D3ghZoHahyxD6`(avX>NSEt!;f_pQa0igYKg z4wn;|SmCgsjIWWOS8l_3|7FEs<Kph zz+wmX9D=}Jr9Pd4m)R#HLNjJen-?^G?>*ZbCSK|zTbB5GIpx+<6^WbSwbJzW;6`0BvzZsmjAm!A zrUb59N_$H83YpLks^V>UceSFlI<{0^5Nv+YQd$ov(m&MMI)a;rA6)6q`Bsbfg+?Y6 zuRr3Lq)5t#iM&#iSY!z{Id%g_epo4OLa9g$oA)L0NAF=AIZ`jAB9uPG8C&6LD`MX& z-O#G}tcz^@EtT<&6mbs6#Wh(QP37p@%O#@fqv*HRM|bphdqQ!efm(IO z8@^BrqZS8w3O1RwUzf~h>9FFunOC%f9$!S0zGGV|;t&K2NJ_*7(1pF3F!!j-EnqKT zp3W7It7KjYr@LgVMUa-4q%2C+-A|NF;5}^u(WduF;1%}Qk>0+@BpU)#Syq=88P8ST{w$=`{s`8Op6ZR-2 z$IXLI3B0km5ELm*d$p zT%8!Uoap8kb_Uh37h;g9P&#k-(qwqm$p1nh{=2>v$@l5Ah-rp0WxIZ7r-NcjDXx8)I7j81~3A^9DqWAK7iC3 z;0TEBfjEFP`%yYTAP?FgfH?rBfCdGi4InI!(g8AmfG;4!2f_lR1Gotw4^RsMiUGI; zWc2`6{`3wI#s9_*KsKN)01N_j0|0pdh51uGfaZYi1jz8gW(gphf3pt&F@QfnN)NgO zzVIIe=J!+6K@H;2i)vfKokr$M5pSpXBj-njFv=fR8_?I{CPv zyZ)`V@uze=);9j^YykLp#E#$60SxXDJ01^P{fQl*!ZEm>GW;**xD$nq*aE-!Kb*0O z{TFjMC(4c6c1}*?3bH;Udf`rsjYZ&eu zd*+-cIc=cz=Nm4RO^Pd+U;THz#QxjQ33m|VO{5zrz0dzT`WHjIoJQ&|bH6c)6;&ji zA$%#m*fBH&D0|6BSLZ}2-q^G{ioSG)!EIpzp62;itV}nuGx=4eS!MTiUq`<&{#eBk z`%zj;G2*#C=Mgr3NBa#StF!1hDwYCz9!mfIWBxpR&2DtkywCDU>6ht?MAyUES`JX< zyx%|+Qk0iIcs7U&7KIBQynj7-s@uTCgh>{;XFAmgdi26VD=2iDQ*{-GmGlI5J`bqf zK{1pdQ>+!}@eXe2{xZ-)hU2s^ja4O-(AO6~&?hn3XFSuW!v(`pO#neyy;YG;6*SOQ z*Ec#TT_7nc0JRMTUggglNZ9c&*cd{t5pX5cPqkUSMg^&JNC@Hf$=^o>VX=ys;qto> zg$QU&ac5~}6%m{aOT93)ebdL*D=gXVm@8YQ(Yj1cSH-L_;bwGr)7p|##+1WL##$## zSs#y88S76FWw~Z^QQ;VBJt*8(S}T_&cin+8?7d=qS1V0@Y&cPD9!-sG18!6I z&t8(|U*sZKQL0?5xtbC|3a9Ccm37jGkrde-eWv1jYYLf?=da-vw?}<5`<_0rpDKB_g`XRaE-15L)Grsj*Kk!sE)%%3VGZ5bdt9` zri(&Bb1LTe$+EQBSMV4uY1AB2@Ojo!nlu|!T33n-W$&sdm~YJuwi>Ix7E9Ju z-M(g(nBpa`$b|SM<=dKtV~-?~Ti}Q+k-iOMN~-33748J*DXZafz(_YfR$F}PA-npu zH+sHkL(d%b07CLJlAFWiij)_3TFNp#rgr+Z+q?D6me=#sC-Uz)e%$U2*6YN(?2|im zh`hPaad&TU-8qv^k$)r4!uoy?r`8lKx`lk*#^2n$ARo{%*(Y`uvJ!;KL zWJPST@^$$)TxvxuFXjBpT{4_!JQY>aH`K~>Oy%`(uH$Tng?#VAE{c3QWnVj74>Uqt zlVB%tdZe4F4DOFy%DQkybd_zp9!&06%W#=zij>0gq$TgZW_ZK$6!L<82KP5c!dTg7 z;EWSE6NQ3c#!M3XWyZnHk15udreNee{u<4JE5y}#+2{DvDrzEgY=Ug-@i=M8JZNr?N)kl##3l*THutYOdX$gc(K>ULT5*?=C?eF`C zityg9``HeQlk|6ia}!An{KnaxnA<4SblE#zv4_4}G`$cLeDsl8GEzaygiD(>u4%>c ztG`~NESH6Jm_)xbp|;?G5XmSqR*-kKhe-@!k_IgS{!mb3oycRVKB4htzme#fGv>OX zF?ha!8L+STv1$6P?Pd*}UxwV4Cjt5F`Bd#WG}(#aO)yQr<1MVD$^<(5(#SdDZz8!{8#$Ihp`O1XVO zP?bWdMp`4nI3?OwN!Y@43bh-V=>wG|PQ_9m+Lqj)h)%Uzc@4JC&8GxN@Qk^A!)pm* zB7O-7q%Q$S>c^K7jh=(U2snbXvkh8Lcu&T}9?@{=yn6k$g^lj#IkJmV4D!WjNi~TM z)}*Z3TWE`Km2J$lr^R2D+>Wg5h{x22F4IXluEE-|{(NAOw`ryryr032s;};dImy9w z(LUW2wH|3$`l#e;HPLb2yBNCM0CQmfcemqACdON?jl(!q=Q(B|ng)|;NQSh zeK3P02pW!;>o6zD7GrQQn&^)cXcG2v6dtUWx#w#{B{zc_)L9t~t$(aoSm5p<{^h}j zyJ~T#veN;@|4C~EKcU!kl}62=DuBaGL)c=|6ij$jc2H*Zt>{k|;(c#hq^?LoHfIT9 z9pC?=g{eIp*J89%vpl;ud<`xS6$fNhl9c4V>H5L+BtKvQ*{o1}8S!Rhb?mxaKiSZv z$Is9e+*w}{d_Sz_g^l`a=K*sO~J!;%I)dHvoj znG-6rZBl9mS>gs%_sI}H_Sv?sUj%cNEQwciZ`4zQ_cGj3$;KC$eiez!bZsf;KyMVK zr{C&C#fiaAdFI|#V{z|GTyL@xhZTM> zVJ^MBb=T6k7_*#s=~zFEm>!qj1cQM2A_SVcn#BB=wpO9sPDE!5KOsb?)D|lxs}0|* z>XAZB1Vz~E_zLO=vd%V#`*U|koes7pSWw{z9J)U-;!z`8zve2NcQI<*e}!LIn6{-{ zC|I1@yk2S%zMQC-%YxiOlDR60Rw#YD`tr`|@K$*~HQb31g_X>e$};$P>rj2mF7Q`N z`W#+J!dT6@J?M8Fz@M0T+I~Oo$c}XA{P@p+dFG{;O_YN+zpK4e|L*A&Qf9d=zs79Q znBaf}vnRBf;`i5324XXoC%bk;PG?CM>+&XRS0VKkOH0p0`+ayC^y2%NZ#&)09WED) zWm?P42E$Bt#8sUx1X=Jn4XTG}Y}`;xHz`AB$Z!=1#L^pf^7Z43SY5_G)*rk@O^;sg z(IhEmS4WNXm&h$PrcHpeu?SV*9^8hOzw)YRH(PPz?I%lb_}gpM8in~*`5j3gJD)sfEAfdyB!M6k-t9KETU&G=<+ zNv%r!G>hO)-E=oIEUAhaj2t8NWsyks>Zl&PW zg)+_}qD#we=AnvrBJmaerjcnTWw~u5x+(*{*>&MW3^m6|cS6bdWU*;20%Lf1DEk47 zNGJG+{rYXY2uOBe&gX)x^pgmNTr(R>@{rV(oeIdSn<5~XoC{Ei5@|+d zO#ndh;01uddoWc_Bur1}_Z`J6O(BW8G#KuMrdVb_Qx0XmK^f6!@E&#UZnMwKMVG#v z1%n^tzBM*7{I_^~HOGx_+dPBTN&X)Ez}iFQMjdR2kZg=7w2gwvkNlBzPMiOWy1NXj zx^LHquNR;K0!oK~igb5_AR*n|-67p5-AE(d-Q7rccZcMnyW#nIv$u2ouN}|Jd-e-n zFwV$~Gc4CSKfmKRR=Z4dpbHNIh>q$((N!jS$CK=~x=RYXtuTq|JJkX%y!>f-`qO?V zYV$`Wi6?*qO2UeotQVxrZF@x$8XZb!jDNz_f#|eR1!XjzJVEL}e?9K~d-fyn>#gJB zZzVzf4<)Hs(hU?Eu;u7~Duu*Bf>+Hf@YF${uYQh|@(r08{PPVzED=t~9O8y%6;mU& zD7^2^aO*prwSy~YF-7wiaV2Y+!sTZd#1cS)9yGnT$PB zv&cwk$l{%ti;o=M*f~5>XFIW3x(%vXB=~PA57#JoI3ybkfQ(;6chDB@#Gu)8qc@`m z4+nTWh>^FYY)kLbGyo+j`mH2?0VN@NAMr0G!Fn@23+jpvs&#Ri=GbYfebM8>(9tLg z6KTc-5jxQ_thG4@SJ{8Bf3VPY4V0xMT23aUymMIO)F)Nw`t&a)p(?Y`LSfO76?r(b z?IDa9Yh5Dp2^(ZR75Od#7WOgIs^nca)FR<_Oz99t$`Nt|kuL?}=n2=F z6!uDp2*w7L`cG{9byW>>-R@KChpTp>t-n%ZH;6sD1E0}DK1iJSd zR{oinhvoRsxLr%K2sf84dt1Lie(4cdC9?LcDn<2A=6z^6DpP99ap@33@(WSzGn~q} zI-)J!I9u^Wmw7L9{NXv@fe(+`TXC26n-HTF>rKdY4A*C9+)VA~4^9$RSzWIW_`kjh zK5LX|4>C^JNG+=2L69B8Oz`-_XUx)Y}X@mnnBxJhN}ru11qmW7l&!JhOyI9mX;5Z{M)gves2=?Ji!s zZ853PIGEZiq{na9I4Z8lIE&JhcS)AHB(zZqY7H)o3DEcwsFI}dWcKnG(RpUex;4-_ z2&aa#?qM(Se(Q8xtT4BW`@&*Rt<+9J3Io%gt}%cWr}~`}d*RxcLqbq*jicGhWgb&L z0Pk=&Cj+J3=-$Kl5-jp{trg6m^^`zo>l`q2?ck2Tywfi(bI|jwyY3ue6e9K;A=YPZ zW9~)86B0)%5i!wjUQ!;Ut@M@iA-;M27Dtr3)r*0lBAvZi6(0syrsSUGQaul;z4TcB zWnh+w&%Zn*xfO+jX2`Z6VQx+CM>GB>VfhUjL5d zOt=DRt>Gp9KnuldnV=tq{^JyHE{r7;ps^yPZf1=x_WbsuEFJ2R`|Wf-Q#7nieKdhEKuWfIhYO>Qyu?S{e0_JMEdS#FP;1ybmRfh62w zb0zkGNBt|SSxTjLM-GmTR_jsK+`785fMNeKc&+q^bE9D$QksSW4ie*c?}@eGZC)Sq zlZx8^6~e-&+&6D8?Vhqg6(E)zl&v)LfrF(%4X<#yW&Mck189?L(eo3sb6xAkb=v>x z@Fj(=`dQM2-s)j+9Y;d%;C=*VUV_Y$_4RAJ)B2~S!MCSnFNULF#q`jP0=&0t>r*B2 z`|yXK)?sNeQKHUsN_Ex7oEwW)p+8%I-Wd5Y6hd4f0LjY1s_W`Rz7$wMD}QFaW^SXf zoBD>Ptd3N^+!*sy%K|br33S(s{mzfo|G1U?JHADweSn%v*?BQV>irY^{QpxTLVZ># z5ezis_t$?F5r%)Ki2N=40XPJ>2sn|0Yce?Z17iRZ09XR-frH!vun<5a07ZasfM@hU zVG>9V00jX)@i_kg&fI`QzzG|e3Q!7=B>>(4gad>VK)wPH$Yb^cpa@7WfCvOY3jhG1 z`sh(aK=TubE&w0_fdTN;{-cF}Yy&u~0|fyD0!#w*9s$w-WCHH*KtcXQKETl*ga`gC zd4PxonDu@nkVpRjkq?kv0T}=QIpCBJVkDsX=?{TCW6Mn3+|A%C(T z!nwU!;05LXFZ*HipD2P5D?8!XwPcM*k>V`H(=^l3A$JI6Ir2ma{WaR5UmAM+bRM)@)Z{bUb7G_nwGsfozTN#HJ+r zC_=e5@0f`cINy)o!DcSQ3NpTu_#r9GakM3XERTHT~ccveQOw)uTkcI@PE!6w4MQ)*c{$s_EGE{ieJBibZ{8d zT2<7disC=qG@6F{vXzUo-38G*(ve^l*(N35`uf0o!^btJ&<>R;JIKq-4#>HH@+nH{gNcV+)$+o;+@@KhO8jcbA z=>xAF)-K^(MicouBoFEEWji5jajgBI@BdDdwxKH2r?JgiE5@^eX4Fi)Sq5U=bC?k>>EjI7HSths6O zz$lD3wx9G(Oi!H>nX>s@n@R}h#)@lQw>G;|HV2jcZVHK4Heb{-@1`H2b`=MS@gkwc zhc9Irt zwmxOjmIDWO_mtJ)^cg+qrn&BC?uWHv)nSYocajxcqD-beBnO-=Pdzr5U2X-JcgWGqrcr z^q-fgmow&Vs#+S_+pG@Y+fH}IdqBNRr<^mU=N0cd?cS?q<)_QX<1wk~4M}3E{l=f^ zuz!Umz1TQ<;=#+m&!VI`fgYFwdt4@3_HBgID)H8%GNHEb2tIC!+}TOQD!`BK!Oo~! zgDj>uxaUKJ)@EbjXC~Bu(ZOkICOuVcaRVX816LwQPPKM~+AA9^p~7YHE8qU}%o&@e z`zJxs$JQcNtC%MbInS!(QcHA=3j}$c|cgGtAJX$CNqq~wGlrESoDBAG? zc7fY(JZ`CPk$*99TzzFtmCQynJ=DI&?GrW&Ri84oYE}#WRXsg^RK$HBAw8Fg0tMDP z=3$t}r}Ff<853@@mcNEK=S3ctawl5J7%M`hb33aZ^i8?T6_1rfX)Nqh868#TN8qFD zS>9bOxR=%;>9sDBAtfj`Rj~^?^(d2CNK~hn6!(QJ;?XSaypLh#l-vZhNy2^eI_>{eURLh+HdSQ zvFwAhQ}m!1i6SS9L{Bkd*>jDnaiz}~(Xg36XH%6(E0dedhsKzKauxDa^0RvvrG=>I zW%hVWtpcdSaWlnh&s)6|U2$$=%mle2(uL0p?Mz43-%E|8zWhL(xn92cy!YZPT_Px& zBcExZ9Aliw2SVet&qBCZZc$D>IW}T=JwG9ZK`S9AiE-zP&#`uyM8>uXIlLCv44& zNaTC{Um+#-G{SVHF%`kL>oIC|-3<3Tew{HD>m0^Sa_A`YNp^F^!>bCD-ATg29gDV9R+g>&dKaFGRPE zBl9do{3?2zo<6JmHGYxm>Y{ipJ% zIr4Rb)lRp>^Xx2>3FRm&eEu_5BC&bPM#nP(se-;qMY_22JC*%bL^U@TY9WkIz84-o zj1nQ0S@IV|q|Ql-dZ-%o)&sG*lL=10%t_fV25Hf4PkQ&iAXuBN)$ zUer*o9Mwl}Hj%OnA5Qb=jZ7WGx?gzOyF29PuBONZ?k6m1=UFNb)}KEwzBk07#}y2o z+fSG>4KTt;J{w<_8cG%wXsfSUsLkrkNNTD)*lXc-vk+agy4q(tRiQe*KF2~}mv&}% zw`jn{iDqCwYTr|KnMc%-R4HAombk4zx4;x1iF^iTJ8+_nk5G0_1YQyhOA)cyCfb=O zcW>cG7Ro~QCeUM~^b?m% zW=$eV^oM+q^1~NAZCpK%v1o-N@#NQ7jnwQ;QKhHf9!EPuhgXvZ$<45y+ZVPButy~> z5KJ}h_B!=LHe{U(dN|cMs53R!Kev z3wXExfQW+{xtx7r!3Nn`kZ0KQ45c!p>4o2S)*g$5$=~zk;nwr*x4S!OHjO)W^W4*N zvb=~l5U>8S-F0s}rt&apc-D7o-+HeK&BoY}&NwgNE50OckiDUrjGI0^axKEp0uI@ij>Tg&0a`_e=E<57BaZj*b72Y#Cc3Sq= zkZ$fc=@N=)3C*D)>cdHP^nPXKZogVdI1Gb+y(#%ww{=_MTQ)iF61&MUHSh~&sr=S? zJ>G7PaZIL$>j%|5fe3^<-c+++%vYYRQLyov>K7rs!etQ`qIG5B0;z@F4PEuwxW~pk z)p`>1t3WDbeN>LmjcldAdWf?iwy zirhk|=bzIjEYE49tiw>T;cv~cwKc)~j#tOk)xFvq2B*5n%~Tdi#h)_8sTWkRT^h!C z`vFs_;}xT;^?|a!5cBo`JXN(w_#A!-3R`!r(BKDa`VqX_*7&Iwu{^%Wb1zFyG7ZLW zAqYJmebv7rgo-NeR&CP^r{eElh6bOxP1Rs*DSrJZ81~^)R6mkjbeg1|Sg_^&$hgMm zt7MA#P9;T-8O!S3yY4#%q`LkNn^$=SFRni`_4|b*G${`2sj#mN5fKJ!Rm$Vb=$}jV z+?!W5>wX$>zvAId-sVlj*yW^FA|y8KmXpS7ddxn79{>HBB`qcL2#E%OY(u2kUJZSF&G??_pW0xx@ zVFP1)Hy*B{H(3>AFnfz!^k#4Ajqj68BbtR>-wfAD!&*AEF(hYFIiU{gafeMIimG`^ z9t_)#@z17g=!bN<7YdV1GbKk2yU5dA-x|#dI+nRcN?kw^XZns>F@Iy&9*RS5;GbgP z$3vMFB>#Hpv}kwCEW+@$Jcp12^4^AfEly}}$3Ye<&B9@tV;?c-+2QJziPxukoRyy( zv^uph*LH!d^M!>PW`ZmYL9Y>E#x7n(m$$v6STs4Ks2G?b|C-+=M!B7;?DV2f#mvOo zx5TvNRkT%0?wPNnPGp^RCy5bz{&rjFSWNo}-dGXJd1gCix-8Zy;|nv*{kII_fz--j zqjioo_noJP^e=hyU*1!vzwD_K4*HUG9IVPOc>L2TazzGHPmv|}D*W{djkJ}%B?CQ6 zFUNQK>V=>7_Rt#$eXTU3y&mhqD3f=(9x~UcV8erd6+4=5|C-$clhfl)wGj+8jPxLXEhjj9Ovg`-G$1%g@D8*>4LY_fi7etWV42e^E+&KmFicdOK#NE9q=tg3jyuX4CyHYxzmZgUFne zY&?n)QQicsw?BEuO-EEsh1${X=4vD?twOe`OID3!o@I(zJbQ@qe^I^KDs~j+iJRi zY!4-g{BWVk)_Bmix0~xATqJ)|=~*?&ANn3Qm;Fo~xBSAzHAX$hj)uiM#s))n(*Wj| zGo{DvTf0jaGxkw$J&#hZ{(61`B>iRjE`LV&+UMG8Iy=O?2hCPA89uzhC({+`>j=LNLz-&C zZd#~GYHp!Vmo}+;h@hcymuM-~veU_}lGK?$n7uUN*Ekx;o$<7cD>Wsf$md=0*q}D- z_aS5nzS5MdTjDtwJ~7V`vuD~;z_)U7orKl48Qck6!9f$oUstkY9$33cTu+d89@mR~ zK%9<&_kP_+MLRa|O3|~otsfvprsm0)7tnnwxd~v#8#Ae!osW~ONQ;na1=b=qC4ojD zlJgXCRs9=oo#84Ip$4WMG5^x-Jhjfuu--j7!k#=LM7P$Zb(h0AUvHS%FMFsyLHS}} zz&Hwg_{Pwlk^kU~c{YSt4|Tk}AadP&KgCLl>3B`7 zIm^aD*dK{qOP9^{XKe~fHbVtaM4wJ)X5G0qVT_u+#e4 z_F$Cc66x5CtO<tJ}4LP-1OTv@AokM@FoeiFjRmKWGucUP10k7qT&rDm~ z?HCOroUel^VeW9$jF|N)j`*rt`gLFb>O}F>n;4>nDh+wV!$X&tLG8d~HEy^{GQD*{ zW6XMg*sxKaD){o#jT__gna3RXP~wn}Fjd{!n&el)^n9nfj)tp5^JTPL6tdhHZ_9+g zxmw(vn@JuQyez`39yWu+XFEHF97NHRnV;CQs&bT7)^AFKjXN0b;e6~Ojrpn7nn^Kb zF|rfEN(K0L$8dI6(LU1P%U?^#C*hVjbWK|Gy_bKqV9iCID{%;_=@mK0w^y zQAqxX$7A6Y5D&l|fEOOQM%p#xwJ5SafZ{Q-mrpu`{a009t?{`j+C4qWK5_Udul0|Y>TK0S6`0p+l_w+Hj( ze|oO!>+1pL{2A~7!t=Ob{sJI37nk{`dwM?Es$e-{J<4A|MryzVVp& z_^)w~KUohz8~{oFQFZmF=L+}+Xt)Bn@%MTwU}cZ>R{scnJoa4u;SPXo0IYy`0PX8XP2msA6>~m-eD7l2Q+X*&F$l}S6{epHY)D8aV1==onA0*B%G`b#DCxH@3)RO_;-zWG;8*| z#1f}G)55;M8hh!{zq=rcfZo>l$*Hf8qdrEwq|KYu6bqXVUhWIN6)pQyn!%)s0 zp^q($aK9?17C&j}Oppa(P2>#?TT-^xETcb#nLbT|IBCy#Ggg6}~!H;j-N9XRa!g<1NWJQ2^7N~e#LrH=QV(80pH zRU9ajy`5P9iVf9lZ30(-# zh16cqI}=E9ZYi_9yPZ1cF%my?81GbG_t@mmjJjx-tdxsd8!R<<$?_NsipTn~`JAl; zTY{}y02=oHTii zlZ4W|eFPW`xITNMx}N6|03*oK%BSLo0Ju9r>tKhvntd9wTHN9(kNUG%Rgkb8_2f``l3T^wm(NMrm* zSY;r`s0|mj@ZjO^mU3%f2HP5gQo;hf?BwcUu5u-}OunM5tz6FITUg;Esg0#ZC}rYE zWSA%WS1^IA)i0h|bqtTJn`(dkvNRQ3nd!wwWrRmsbBGe?&u*d|SZg6PM|{ndKzA`U zaUyBOPorO)tthceD&Tcr3@bl#{$_&|L%)it19zS@*7-H%kk$Dql4qUOC8O*SMISPu zO=$>p6p^^4b>(7A``-7Bamz{m_FwjbtHg(=3q4sx0r%MtMkyCxm^-Pp%_MaMUBa9t z1KwP1icm3~(Af)V7jf5}Kdg;P@XtJxuup7-cWgf{Le}4cduKRUCQ)wVCCxclyC!`x zuW-1#F6~x9NLFB@4p!aC*8>J6+qA3+#WxEZI8?;)=ZnaTGLRWmUqjm#uo2;W*kIVq z8;UhBm!(G;Nt=+#xZSmhppk{Avk$egO^!6d9-uR!@3fQ43goJerfZ=Um=e9_(3&&S z>(+p)JlPSe8I+WVqq^(BC`uF={7$4|oy&#&U^Qgh267*6B+5%fI8}U5m2lx2Ir}g~ zXEEL({5S_OTWRtp9=X|xI~cQIqx=j$Xdz<>hSx&;q?z;PQEKquY;*1aXIW{ zUVyRnctyisZ}3IVq>qf7M?15-yN zt=Qn$7I7%|9-%aNTuMg7U!WZZ2k;Mb9k>404Z2!Yw;tue`SnYfLcH&HP=urNnUbJpCa!3hi-gi;jsYmCi}7cJ*tpy@L$J(9mMQiA2kLzb09SzMI&yx7@&J$R}2r++uWCwy{u%bA*!IQFw5w znhGSY!_``$#LjHv)9+bFY(0#eT+CuWP@Y>TxZoU4t3SXhU0P{XoTR)^=hin#L7;(S z+}U3-_@1()-Hke~QBcWC~WfrG(UjRdVv`y>*qI z*{JI*>6^?S@$|-QhDG@5PwQWcTXS8!8X~(~u^`pCEYY2fF5N4WU=?)5xKV$V?X9Dy zbbc|E94%SmbmSMVfxI?Q}ik1AGd@^Xd8j|YT$O(5Ap`RY0Y32~d`YbLCkFSACvNRRSMO(KA%eb9X zXDpM(;yDrl_7BY1CvUWiDEH2d0@Kynd(xalhtUXz6l?>^lx{TV?USy3yUd7ItA26Y zO^h>**=9RJGD??RN99*J?m~xL4vtgxc@O4Uw{v%@e6ZZ@RnY6jo;ir}r`&H16)n8k z#|;YDpSGSAXxem)p`yciu;u%eKWpWtRaw~VPeRvU&vOpQY_+9ce5 zgW)t;*J4RvdXT@>C@D@2|BG-*x*V*93YBw|{i)|OnI~psdbVXNFEh^;xvt7)4D>|} z2<{Emk&#Y&N>?}w2nrKQLq)DuDW>K5TMf6m70kEj0`n9|IZyRiY2L0kx8vN{&L+>w z=arJJBL+aMMdNC=;jGVAfNkhsU~%5HnOJnbRD<@v&h0!@8fG|JS(zM%s1xfwd@2+; z%DnckSFhX{&pDDlH#?w1x9#%UFD%sESj~?SW__p>k8m(loNu({$=TZQJ__aIm+z2t zhrCtBR62cVb-h0myKV(EU1N zR(CMgpu<+LIO_B#jBu*c>>>v}R|9HceQ5PMe{CAc1-0j4UgcllWi}?dGcSf9h{XMH z=zl?Zf3E)W0IYt&(=s z{HUTT9K|D9HisbCYvq3Mb7&GcR8%;HtSIQYqQ@A)2jg!hbB8iR>l0v9XzAa|6Y~aleRn@;{$@ekycX!=tZygmT zbp)8R#gZ9ovq`r(*AtQw9#oBgu}rJwaGw+zpimENKG$`(DBfl5!9$s!-!-1GkX$WO zHAjB2viL#oJ12p2)aCrl#@<_xke?M$n8%S6S}p)<4V&T66WLC)aJB>upQ8##{ZNoJy0e75h{*7tK5YtyNOzSEBl=Pz*5ILxOzI zQ`RBz`YdO-sle?5v$BHw^54Vc_J)~bdJsr_a7@4IO1%@i=$M^dvg)r5J@cJh7+bUN zR&!ucfWI}!BXkU|iqpCb4)Fpp?&Aam;&DWU!m~jn_D& z55C@GEbxKE@tu9&>=*1$Qdoy6v4M2JiI(x`h9d|H_B_*|*lLY;S}zv=ypG8l46I|O z=WgL;k5AsmY_zPcId2AIi1ma} zS1quf?#9i_kp;!7Ak=SFP|dL3M=`rO-B1AZ2-L9YN=suO88-{u@3#zW&w>}3W}X)7 z$|4L{$oP0)Np~&%N%ENLiZL7!-6XDJ*%TzvpbK+pJI(=mC43Yg8EkKX3-qTHj z$pm-83$_$*y>f{Z(<)7t#&}AXsW>MwfA<(R*H6!B4;oVmT|-ip9f^e;cW9hZP@5Fc zf~xwGdm?1mWKIr0I5u0wj^?4B{`9-9_|~8E>v@?V-ghT<%^hLJpGJ{0F41hKBq{Lj zR0`taGmTC@Nn=!_|Jp5gTZ)q`S#Xi>+$i@L*~y;a>W!Ea#Ijxb5H3gAbg;CeG_`#r=tQh@R8^*7)6u7%*zrwt$Z+~9qm zO|^b=)b6wjy|(jY9go|a&{SdJ2t`NaZ%Yd?fYoaA&-M{h)XtqWy}90nU541I7}VuP zo3|cY4S~)pQgrde=WfK=!P55PzbDKq8&Bp=!-i&clx?;`A}^7uq^|#(C6R*@hhK7| z$bLP$HZNe9P?bQ>*ys_bAEmGm)pU-;#9RNWWlQ+zoibJ(>Qi`~w<{eS1zVrzTPx^X za0_1s5`S^9r#O$+e|Qy4^9;OzB3i?bP(56JL}DN)WKvXT*J?}_wG^fR6nA`^RpigfuCqBGjx@(s#1L)pn@5{d<&Sh;~<#*C$pu z0Y~;39a~Y#b!wkWC2i+I>;rlX{XNrl=t3&O;tGn+Qa10ORxtvd(tQRtl>BydCsbl@ z6l3d#@Nei__P@F=kJzD3Y0+AF6w4;9~~!IamWj995IFTA#qOv$prbi`%(=?Gqy_4?kBl(E~yiPM6NjDMya z*!0MM!ei~0?B0H}5JRMgExsqwAoyEB9_|L9W@vwKta4t{g*X&{fDCbE(7Ls(vLy-> zhs@O1l`3iI;CRY7WYjywUn;d+DrFzO*FM5Y&xa1p<-HU@C*YQNrLk&&Op-TwoR?JV zJ`5%0^lWH8Jk>B;dy5B0Fn#suE|Wujj9p7b;omsK6>x~3!?;sroa)bjBGjO?m&hmC z+V%xX?`2o8rRs*5p1n04@J{Ec#vYSMQ>*=d|*1PkZku^he^0~OXdW7#3fVn z_*txqGX0gC0c-X+-X2|lBX`@pDoKz7QO*Dff{?93PJ^T{V8Ddpg4Bq=QHVwdI7n2p&K0LnbpW%p|gdE4pNx*S1WXzK^Yu zcDYLfca7{jFX;tyw z;!AmTzjHW(*B{=^N*f=i$(l<-G|lE6;m3FJdFLh>@8!ov1NMhCv{Tdq&Vn_ucv^pWZ@1sn%es{P9TVH z*6=VLb&kdyGZUUEl3?O8%++7(1(I9Y57**4^zpyu=Wdtz$!MKS;LANbzM7>l!UoRz zw3X$FjlaqQZ}9?hYvo5$x3HWiQN(NVq$+GDl!%vaCn@@?biTQnpy@N$z5ODa&S%7< zs8lI5-SEoVCb(76MpHr*ooB*`|wNk)6{scS#0)UVJkOXkZ2gCtx_J0_}!NCF4JApwDASb|2 zz-=2~2;dZO!Uy~Ux}zS$9w03M*a7$e=wSkJg?}&z02Xkw{|AHow|!RtE5Jz}kPa|} zf9MCW8h|Yzfv~;34R`^F5a1f%KLA7ijD7(9_#+{JYyLiH{)iz!8~!lJ-*-QN$vie- zfyl@I!XW=`{T1*iU@{;}^LGPz)Q`sotUoc2zZ=LSfB@(DqaTm;SC8FS|846PC?^99 z0&*!J=>gCQNC-%7fZ)U41NF!0UiSI?N1NZW8~veLjDo< z01Wc}NpH@7GRXh3^6~XQ83f)%ejTiQ3|S)w6CK07z)#!N17PUN~s{&&N@-i7AJ8}K!g&)mn*tCp66Y+IxDv`t88nYU#`ZT z%vo(cXia5Q4}ahoao6-0>%jx(fl&Vg$I#V7^27SOzy2++x`*5zKip$E|AImwiprOK zuBqAj;~MH2k@2!s2$s{6HjXZ`4%yIcT4Xc$)N2f4Sbq@f^E^MM+(9^O8Nxh}e;q;>lg^ z$xevNTqez)(9z0&NWsf#@X+h;Si=Yp9J#Js`dCtZjr8qZ2d+#&ny;Cz9bvoU!~F78 zY9ypc#S0QaPai5!I8jJf(_rYw-m4dz*B8N+HT@GNAb;TUC#fe}11bsknnOnJ*r?Uu z<+#9cc--22e4LRYqgb-vb{)maI7d1YVN~=%;aKvB_wVpIIGj0Lm#(EK?mXrM$^GVhrH91+Y;8s zAG$|OSwj-0vMUEk8Yq0{HDVxnwtQWIU# z$N?V^6Z?y62L7vbO8+8_-OonL={l|mF+aWj*p_}i-0^o8qM6NXYw|7grBRJrMN$~B zIQdv-q7W_n4bzIwyP z_LfYRWiysqI*fcs)wVDxrgos?7i6e^>E;p=>cdo){u6zuR(FlPn8)C&bW4tQD|9Gw zUYN$Fn!T%~Px^ALiTC9ltN34;=T6%`V9UG`8XK{Uj8%~8im1j!GVb*3%Mm{ z8zotkn&V5H{aAKCZ08$oC;q@mjd$(Y%+vX41d{OKkExk<8B92h{uJNs#)W&CppW=TLhd zR>vkdDZkx4TJkG9ubQ(GeLxI-sLWW$qo*x;&csw2?`S~9Mp9@2CTZvw{zG9CAq!n> zDpu1f7J8U%7|YDZ5<6GUS*tF{M79{+(@c`*NzW1GPFJ>I@qSAAD$=o}QzVZoeOn!; zG1_5*3y`f5tBbey_-?wCnx(SChy%9FTP1A6en}W?Ayd9O`8E;_Q%L$Qn|t?ln?-p5 zLzJ-9lj3PAHfOeWHuS93nF|Sw)j=lWcU+RX3!BS0>p^f#su6HZG<6~cX#eWIqICIz5%EvqjH7Q)60_~UVw5#O07CQ%uso^>&3sSie_(9pOTHGL-D3O(RVqGw)F!z-9c zNor|y=bcx=liH9!!+5YUFEQQjq)rp@NRZsyQT1-e{y=N?8O(j0cNRU9?qOy>(BQZg zL2{TaOQP2vjcsW%=f*LdR41s@Vv#PhYC#z2WEke4f0b9_QR=)?&84{OVCdqlo^6PE zVW1-Fr@fi{z+d_cLfcde&tZ08`DBm*;3?sH1g#qt|Fh5o2aHEw6eSn6=aubl)n zy1JKnLA=bq5zRZ>Q0_Mw{(PdzXQ}bgOb|dz!H}T}cW|$Ez5>H$cv#PJNnkC^j*saM*(!=Q-@= z6v&Qx$aisD&4y!TI{b*^XicrX$IO<{iS0Xf>RII)Kd{xYx3g6?XfchBz{^uNzprCw zZ?`?q6!JbZx_dveAcg9zgBNiqZS2}ud(p&w*LJUSPPD6?L%JUIOu`ma^lo$scRG z23gMxPV&>L75pRwyzj_%C4%YK6w$Pqy{}l=L{-nwT+g9alof_|j%N-Q%An|N5Nmo^ z`Mj6Aiu3+#!d+E&`Oup8>8;G_el3f6<`4bQad+Uy+x4_Eok8K zkcm&FS+{C9?_uUiW<$3Z7pU(3s{<;Tpl~G-zN*l0G&S45-ooXVpamYHS`kUf+S!OT z>}@iNz0fCj+jhzIz1#A0yZ*9_B>%3L3ab_qMxL{N6AgF2LdlQnj8OLl^F*n++{2J1 zVo^E?Jq~!i&JQzrAqHI`8Q({0N9D=R&&dKs@MQc}trFOS>?|KBxjGUVecF0oMbf3~>C(6D)lrwVtWq|h z{mSMXDWl?~lCerHH#8y9#Sh{Hc0h7{?e`aKuBPgPwq~lAR1`C#Hj^2&#ujd3;^RU6 zRsV{Q`(3q|{X;?Thl(ZU^7{at`{#yg>AMHLOF-(RHusYMSldqBdh zT83dLE={c64@T`fV%+bUbK0?;QPGjc*t9-mfv7%mPnc~&Yq}r`DqPa!=V%?@!U%1* zuZ-tqdb{&Ng9?n=G{F`~Y<%1AEfDk3RPVn2@8j84bAKAJ_L_$9v5}Z_-~2}d7Fe(@ zrD_^ZeWp196;o6?W>Yepsy=zw)#;(axKClT3;xZLx;3u4!$!#MbIUNPOuOK`G1_OotjooXChL1D?p@uKfXI}9_w0B7)s*Q0DtLC%{CEGA zNZd?J*G@f_2ZG+W1dgsCA=qtIT#Q{;2E2(ALx}Oa&dCp`yHZn@@2Hk3ik9c5-l@iN zyF%Yqy9zzOtw)}FMz3tSe$Uqt&ZT!cebM#>R~72%gVjf7z3$I5GiUoa)Z72jc7?Zm z1e!VnYe!1deh-0^n}gr&ix9qE@uqewlC})?;=H~O3)?H`0k#;?DW&qmu*wSY{5U0- zdk_uA-np1!mIgx1y3cieI06Is8Ke49Waqdy!}}hEXZlr@Sk?{t=;v+H4^0g#5Pa*$ ziYwGneQQv0wf(!|YAWLr!+(K!{QZVsp>_BTW-svpJ@34AeC-S5r9Ldt|nV zlSBGdt!)}Yx$Tk2mH3Efbm;*H0f7IComOLXaB1PqULI&nr9F+6 zEzG#QU>+!I!G;F88b6CSG4=Rrk`B$}-IHt3t4!pP+pSihOvQw*Q?lfJ{c?K`KS#-O~j?n*Zqi?<@7H*InViVOFg$X@8EYJawz zP$OZ_;o>IWDYr*H9Z7&RA7aBm+*lYgnCW8Rk3-0`*?Z)sE;c);FI(9}>XxO&S~bxF zb&kW_X@%dH%CpB&sPyFQOJadVKtc%eDh0BEnVF!Lxp+!Hi30H}X;X=4#iffafuECh zwctHEiO!GmT;rMu%mviNmu}~p190TJa4li)ob_$1VuE{YH$I5y%h9Rihd-O^+ZeEz zf6Hb^mA>JeEU}1Utd4K5nH!AVNj19pY@|GO3ArU#yLIdbnEr5gRn;FXa);bS$`PU6 ze~KhU)QY!?p}84e zfrH}LAvZ-RLMb#VeLYSa`vOROJy`R#FGU&=LTD%;Ontl$-Y~8uyEp=-%I?k-pX=9B z75Pb9Z+_Z(G#IiONL`U!U`DFGcR*eD??Pa;KPhSbR4+zTJ||gbnCQtWAdkwc%`=dS z3pods+Y~C%(4F1>OH@WCNb6zhxmL2ymY+fC6{Cb%+Q(lUaf|th`foypR2%yj{LqJ% zN882`m*GdBJ`E+Z=Zfzilfq&REl!MM@QF%OaI@C9ejik%Iv=3RQv9rKvTMt&; zcd1Bxl065@Y4~3@A-|K&%VT%SN@KP1krg=NNi@m6a( zngEY+C`U|4&Scd0oTyEpS7){Xa%$5csl0BG;twC_Ubd68K(0ndtH&jJ>u24{O=zlIgEO@{|Le6s55!^r^7udi8?ICzw{u zy$Nr7Mx`v`iANNv{ zD)8ZN)=KUjwrKW(Vb|=yEByw&P<+kFG!;VZTkeJoo~~_9$Ez2c%gRRo|Jr*CsI1ns z|Njw1ln^OV5HM(wlr9maJERl@B&9n=QNTh)KpK@4kdjb9M8ZHxDMb-PN>T(w`hV}^ zy#CyKJTtTQta;!6oOPeGzQ-Bsvo`pBc-)_T-B;4!*riB?YPZQXrB}W$ayd?>+fbM+ z%k6owVR5(4IXY4Dlq><8ckSZt3ao40ZS~)^4{Il-~a}$x zH_(Ck0B!(y0$@JCehpv(fGh!X9AMixIBf{rum9D2fRmPh$p8Z&;5aB?HGug5OGALk zXliN#+5cnEUu~ zv=tbm_|A4EX#M9>78Y z+wpVg11N-FRR{1BVE6)T2?qx2r}OwJJbuoA{9JJkwAoMR@nZnw$I6c%+T(}w_<6w9 zk1gjw4goU+B-x*753t`H2oIpges2BvdDzv@0T7^SfP4F~;vBR11MFS_{sRnvfFUMe zKIrTv?7^$aKN|o!`#R%ngX$jyu1Y=CVTtci)`%i{W^^q&)8dI?NgQ8R$Gg} z30KE6GSq$N8^`ANewmb(q0)WQS@tmcMeu*?|E(JEFWmAgxOV$}pH3+$n}ya* z&T7F64;;*otwadzh+=aab$cKDYKM5>KJG$=n0 zNyMu<-hG9w{FphF?;2;{8f^vZDH>&FA!f#nR%g9V*wH9!p0L~}SJT77)tLSGc_!^X z@yj{>^R+7vmujUXKGv;rDXXlb+%Bf{m~@@Ddm3xbM#_l!cd@K-@zop@(KM1%wwzQ5t25Ye5DlnRj=qfN$Hr9pBJ&R8j) zjys-b^!2oZI{T)F?{*Q3j}I^;)le~hv;EFhGVrune_cP-UPbeb-h0zn6|e2s$5!uS z;d886w`haZYO#b^X*uQS(N|+dwEMn}MLxD&d6dGS>LD5&vJfe9nwDH>=t@S|%xYOR z$w%>hZk#e@f|AxZqH}c~K2qv&3mMzJ`!?(6J*2jw>0+Now{^*ENnT-o_&|k9c*YhW5#0 z?Oz9YK3!OH2^vrC4C?#_z0yzL1>RQyma5a@x=SX8q?k zQ#GM!ar+e44qv#;%P#Ac$8bx)$@=E#^0ceEVam+YOr!oAX$}MB>P2KR?14INp{DFZ z7c{Tm;*Z--QT|9o^@%}45=ms%cm8=Vm6?RGi3pmHHV2%$iQG@7EbCl2#@k9}QWw2G zt?%56pn?m03|ev#{X0!7OG7K(5n&}kl~Cx#Uh{e) z-Yr+Mb86*9w;J{iBw8{f>&-vk-~#K-MW!{p-C~#PHNzKtMxs169Q#~0|MiQB5Q}!5 zMRitxr0TvJafgVSSl>BeT5<)VP-H_+4R>jWh7sZN~JCE_!*$jU^bLY`+_a&vS2b&8^O&OI% z?2h(EXLa4mzwCdgp`@$#i@2fM(>+CP(SoOwh`YF7X77Lgz3O2hpV5(cwdI4WS!=Vy zqIVxgL=;3GnaGlKUtDB9I+7A$cSAxY&+o17V_U}+>N(?+di=hIWv*v^lW6karp*b@ z?f(+M9OSiEG?Dj zea(bYb(PAd&wP?~?`MK1qZFi=Dc*7$OB&aaBF3YunYO=k9oYBrWgSh`8A<0RACH8G z+;k2nJSq&?AKM1i3wQ=PB88yOzI>*_Hgs_#B^*lhdNZ3N$l#Ntrx$a8XZ zNBNsBmp9JS8y~%9`}(GX{>0{lE9#Qq@HFn?W8&{cd%?EzeM+mx+Xq5Jg=9%~ni$fb zOO*|HK6jB@P9bRNjB!kr-yvJQRB&?77^- zwG`4;%y#H~B9EfE8BJ~ylf_s}@s@P!(#MC|bh4aFE>#wKuvn=C9>25_?~y=%DD-=grx#&ah__gKCf>CVC7U`yrDTn4?lNMo&)R)d|ZVb9fBEyl}O%ACy4@$%&w ze{cWhENiz%KIiewtnAh8>GZQN_i8ddw)5UP{U9dXo8+K#cfj>S-zUp2{*WC_MK zsTMgl;Cu2u0oivhbm~e$?DIy)2Y$%9^Q}u1A4O~%vh2DnQ*TRvb>}mW`5t#M=T8l_ zf4^sIcZzCX)Q@%N9WBF$O-@~YD8b3y_Sp7TX9Jbve&RwtYk{l>Nj=-$M)b^XQX-tD6sKI-aTd2u9RQ@$dJgruZ|UO{!}R0++iO!Kb;O~HnYRf3t?Yplla zN~^_Q(r73Sj+Xb5RyQ2gPp?udRv8;vuumf73L*Q>iMi%FMW$2ogxa!;m{$`IAd5b} z^)U=Ny|Np6e%_~)rAFCz4@JgPKF8#H&e_@)B;kJA9$uu=&D!QwPTrjbI!*e!w`j-S zO0BI6H|wzJrC%%$z7eV~`re1^=t#fiCF$Bvi+wMgcYf{Ll4@V#yfx+1;E~1ROYytM zmbQD2KKWzI$35ZEjCB(g^bw|)^I7)RB^q#pb?4<}f%6#$TlC3ND6Pod%ap#{^1MPjzCSN5Oc_S~j1xEd|%_bu~XY@S$lPw8L?dy-nkOpSq=|IinD zB~_or(*5$>9wVP4sS|Nw&W>`T~WNl|Ji?dRnlKWoI~U%ni2{)~7}+tHWroUsi->yQ*gr5a+RKu6@0>dBZa*N~YV4Hd4VSS0#ZTop~uj${mpO;D&M}407I&M-N-Qdt)u`EHZ>*tkVc&f|F>1&pBd_d7wf66C8 z(Hv@I-*>W|XcOYt-*?+fOETLj=2Rgqzh$RC#kv@=MEm47_A$1}C5IC(P!&x?jhrz` zQ7^oa++I!HbCC^s6PWL7+IKyG5Ya2a_<+?ab-p>_Z3 z?uN#XO{UhaLZ3&*O|4Z%b;~AN|I^jfPrG(9`R)lCmS^#}^_gTMo9BGq%S)uq-HL&y zIqIsyOv;OP`QD#C+PY90C_0}LaIIS3XpaY#gP0Jx$irIZ<0U2f%R|c#1$l-?ZL_S+ zw&hP*ZxV^xa6FVu|5$;0kd$gu>SoLHVpej8o`5AEbQat;uIrqSopmu^Ef_zuc9X{Q zNmY`CWJi6N<8vl8J)Y0Hi^*S4i{+m?wX4sJw18K~OQCA6yGX+7Ig?0__zTUW(SClh zjGIlSidEi<&!=}WGrXnblJxEWb|yN^{B=^-8>btS#oOq%jPdfw_4eJSDb5qQEOKJn z(_L5iRZc?Ky7tF-H)Vv`J#o8edonGNficO4Tj;)BtG)4Jvg#919&taEN6K!WlYc0Wypdf=Vd5NbWBA?O6-s7rbzFZe?w0K< zHh5C6bgIr|h(k0*FUZTxB*`=Ei0az=XbVtu%`QCU10g= zvol4<^xxg8&DiPN=arT^_}S6ZgLg20s6yMqJuh);YQNIh+baxRdUeeQ4p^EbNsU-s z%YI{fY?^fLz1+% z^JvGzPCwwNq&{(Z{`KwhZss~siahVHv9;^PkEOF`+mUNj-<)J_^hgbE)lOGb<|wt0 ziMnTDE~=sZFk4gSq993wn1XEa#M{V* z0=t!o!d(+L!fLrys7_P9f4`IO2G{(d36to&6QuMcZLY7GD_rH9dZg}sX>p=y7#E4+ z`RdNESnqa!EI7XQHh0aj3-V8n)KKgai0?hdvQyG6-FHea%qHy6&;k2H#KhFYtzRF% zuzU9LO+$(Bd)L#u`){phZlvDv?Xu!0V*|Ds4?TsZ)K~1R(dKL;PkYBBtu`DN*jgPL zU@oK1C@U>oG@y5UZ7AiB{pV(4f?Qz#dDCN`V}UoR+P#m_oIB&rHZ$++oSWrS)saYJ zL778dBujYZmUowZ((XYqb&4}BHwm)+T-jZ*E7CtsWb6DL!$DOwO0Tw&7aeyJNqiZv zmI4CtQwny@{ue}WwJbQg9HHL2-zBC?|nW+HWN5|3)A#EcyVbvzJG26sv$#W*}y;Z4% zcQAUVJx|X)aC^7@SiV$r+bA_%Kf_u@q?V%LC65Rfs;Fxj2W*b>#qU>6tBB!tD%kzi zI6mCSLV&~i5Dm{uujWUaIMst`U$%VN9BM>g+q8aU<49-AoKzVhC-Zb5_lmxB?p^k} z8L;JCky+Z>;r`~!43n)h?T6#?KfIo7Z5uto=(#s-PH21}o@X6pP^HN36Y0UN7gi(t zJSSz&hkNLpDlA%eMsjEKhjnb4T0KeQ_i8QJ(i@l*-rr5A@wj2Cz{tjASaWaU+hK}A z>L%N3#cO;2xSMl#dtKk|&*MxQ9UK&mZu-HKA&FTWiEm_c?wdb(A~$g0JE4cBMBknSTf$kkaX z7Zg!D)%77iVJ&^pp`VjlSR3GTM42va2gh{AK=D6upht%fVI-VUHq^g;07}oANZ+0fExk!18lGW zLg1(R0JoWeBmpV|cn@&f`{%d^xP1;D;|JaYXbo_;{)hAc`UQ9oARmDD0LMQ4@E$*; z2e2-{djO{a?&yOlk{@#)zUpZ^Z}#?upgKW=V06e+;Ioq z)h|0Cob5X@FskU)9Ir;$lHT z!H+%Xz9(Dy36Hp~UfB>KKLx2GL@muu)jvoV~E5D9={O}$>cb@-Ndi(1?8V@_&E1J_Jb_;kG1C?Y_9Hcr_$C^U{=to-VuAYnlmN!ie`B< zRi4hEFh4D0RR5VXyDfK9I&OG+ho++d*}}e`M$< z#FqAUtw;=y&um}mp8Aw5*|nw_>TlCnHY{$_kV z={_3tp5Rkg$&yw7NpmDYk3X{i>^TkA&thjy!|%tEaZs=`-@2;bkUBK5&M?$pwt;;+ zb@qVUCK{=J(t~A3lACYn7Q5XHU}g5(*FgUEiG%gogt`U;AN^fNg+v@iKb+GybR)W2 zcX7@zsM%a+evcT%4hbGRBd!GB?_3?U4-(_b7j-kQJ|Rr1yD<266SC^-4Cg-23Mp7| z`OLc^T^ZiRvS_s+h2b*gi1t;Xb$HR>th6jPjypWe!F$bt!LZSE50Z%+Q%8 zP36IdPURvAD78{=tH+m&Faf@-ML{y{9CMePlYA zrMp$`>G{3SifO&~cK^2>?w=w*4bO@;tKBr?*4F>r;7B(!6v;c-;=OsY zU8-t#_WBFsMWg2LFB)2w^HS*;mm6vR!$k>t>U906(u3RoobYNx8ia2 z=)g(agED$0A@szDvR)7e6@2lN=5w!za+}MXrj#uj$>!($Jd#)M-SxFkAz<6Fex2Ph zuNgx{SRc?UTNRU6Mi7~&^<`ZS`JT!~JFs|;x+0-F#IT#zNv%j?=zz`J1*c7I8XrAo zzDAmB#ca}8y%cR~FXd`qHdwT1q_r_;uW|9H@opJWQx5XD3p&Ij_Q%kgE{Wi8KpvmZOfsY)ywFs=HaM+1y|M2g)E%3d9KMKig} ziR>;D#|yCOwfUJ$ig9|dxNgDTaQ$MTUI&{NmJpf7XB#3l6FR?%$`03s<+dra&2fE^ zW)AXwmXOktda_PP>0^PqHO&=$y3U~&cD_9?kARc-ov2l`!5LUPvqzq`l1@J6m^I-R zTq{i4M4MSNOXnRD&Q-R*{FJ!9QfF_jx4?FAuzN>%o6I}qtFlRVl%Hu4UnjZJ>9{?D z+HJ9oS72sKj*`itv9`Xsl*$}^9xHRMX3W<=66Z>kt;=xFEAX+?r!BcB zkw0~=^puXrV1`Kt!}}GRCXGWyp2Z7yWN$G%G`+~QrN#NN64PSdA%{M$O`2R2;XdCZ zI+BRFX6$CbL+Z(2V)Gq~*-SDidxyBzUmkqV$e#0@vPN|Zo5z%5DYFHNA+`f%A4Jdh zi?34%ntK=@Q{{S(A+z(N{x!)YHujf5&oE6q5M@CN4`70j2Ty%P_u{WYWX{oc^ zB9CXHyS}LQc%77yT+)30>cz8}f%-P0vK-C>y_0JdHtOsaPeN`zwsNX;YSoHeT7EY5 z!GSc;^!pG+P|&KE^c_(qpVMnE9p#?&ezQ(c(hr1TGZtE$ej}BiR zQ5HEqaB4}#Po9$N)k3=d(9E5sb$6{ESf8a1axPdo?~-s}sJ+y)*{d$a{Ro3>=EW(` zXY=0f+3)rParab*?n6sRB>M@^FIKIsAGkxioz+QOQuT!nE1uFGzvRpv#phpmJb+~) z+AXAYf4{3M)l+Z^7LB(`ZQ1enMplB0?6qTUcP1zEc%vN(I$|X*47Q&1b@kSM&rnrV zJg}-=?Co&IJ&Gf7%d59@J90J%8K=8Ev1sM3Ol4^wA+kNrm2-n4Un%#2_XUGFa4NmT zscHH&)%QKSMK;d!=j_kC`Re=|X{yg@Qs%{h)u;9`%%w2Ud9{2qIO6?atLzo-^&S;P zi&k#;NDG_o7V<0@J$qXWWVeAG=ZlH-$>kGH4K3+mGd=^^(uJgV@yg9l<+p7X_!Q2b>8qEMW`2&dlI>oJq)?j@%l_cfwa>9U z)~hW|s5iiF&0u!Ib|$o9qv%L`o92Awx1r__#x&)}A}S_aizhj$rXy$Z{?O8w8@oF^ z-tWzl?w!pCvmRdF`;b|W8HNV0TH=&99UoRMcXYr0Cf(fjj+`u$v(RV3$hSmOXLKy! zV@77$L(bC+9yP@l9`$F>ZU^&DdADMEI&T)7-oBzz?5zqGots><%mzncXXG)7H^uVI?N)gQm>tjpIXw$!^KN0UYCwO$W->SLI zEB$SR__##ZLY}eAn)>`Y%J#iMZiB5Vj|LqpRi8SsME6T)a!pgHrbO$5P3JGJr5CS+ ztAkmOFi%mIl)%dBjbPTpY(B}Q@qtA6NQifaT29-`8RmyhHG%#%x^Kce55(=?IX^`+ zxul=;ws!W*)!LY@_=mGEir615vUDg^J-bi(VN-n5x~wE{7&wXh@V#!&{TZj4)a`eD z@M@{MoBohJwtlQPhqUyPNN3)@*tDABeFGiyS6e3qoR95!y7=L6!mxjA449~T()?ic zWKmDeZB_{p{gua@+a&8uWM+)E`m|rF`rfdkLT!IV+|!OY$ztma+x=b_DTCv79m{4p z_WkP!(Sbyc#BZ0JT;Hfwl>3t!T>e~_l)||t1kS*6@V3or^B?TUm<@efoiVR)z+@+Nn{S zY~q}0n=E`J;mRM@<9b|5qcxlK-E&;!jJh61HMYy+({cy>I&YBgRVB`oPME)Tg(pk3 zSNBu0j>1vLlP4>sw<;W!IbR|!)%`rlC31`Am}O|%C-Z^7-qnt?SJS5thB2J+yw+1xuhAxVTRu>7Qr5trtOD6|Zn{C@>*3W%$_t00 z8z}U*)oNMEpL1SG?F!mk=WN6uUUb{%zEjyqvV~b=W$>`jdG1#m6hiWCSQ(o(gQY@m zGEa}ad%6@;7j7zhLID;J6$(`et1Cg&2 z;(hvfCRce|?S9&y0_20^Hl`>29V3i6E7e6L`9}2Q$7vA(GEt=(-N&C7F!bJrvHy4-sa%WCAC2g^ldpqvVnb5dHL-%#al!~si(sbCxHc`E;?qiqO>fOl) zUoJh`I^S#V6kIcZKe&~5n#@)Ekc}JjX;Ud)ri?W1z-|F|!`BC`+rO=E<-V#Mu(QB3 zeP^GClCzBJPQL-|Dzi&gQ*80Cvv-uIcWN@UADf^4o<9^D+&EOUN95KZSYdBeeHF@ z#>2gWZ={@@uTb=rwOW#eF}$leD{k>j@Y-VOIq}$B_56)(H6K}vU0yJD>eAfY7tGER zp=X!w<+!-PWg#$7_kPw*``QdeRrJ_pps?4B(ql~55As{~n z&$jn{3=?FyQyGJddSuWHvwwO~ZZx?68f*T_3kBP-KK|$nYpVO?O_r;Jw=1~_P;yK3 ziyqA-Z$7-QR`3t|QAEn0i{Z^kYS(yvJ>l_=uZ~JUK}P-I_x)X+2=+ zM_|*9IQc>8g~ZrT)IV*t z*Xmu@UU>XzGC7)OyH-#slWt@QvdVn&yGP)n)|O~}v0Y9Xp#vx8Y|UIx_Y+*ep5^Fk zW;ddndcO;98GNzh^F-RUj@FW>s^mfIi;X32kIdf7I@$fBxk z^heR{@f%?l(dnCHNt_(7vV4wOx--`p_+2?YSW=-lq1iIA!t?(vIp=JuHnb3Id0Fy_k@;9-bvoeUUuq(OSyxIquZNh_7qVP4_~(L zPu`-skInDdZMT-nF9FF7WLekF4co9^ei-)M{V{*jjf=bPm+g5T>c$+aS;(*Og~vW= zaEn#bb_JI_R=>MqnyD7KF6(c6l1!J6DddWu`?6)1rWjpQg%n#fseO5$a(}&NOxyRs z$Tl**)FDdVP+7g3{Pu}1M~z2y=UOXn*zFw@pfK^#@C$H@_nBmUs4#fJEqL^*=BxDl z16495U1mqPhuf_OqZyxtE7qpDrIGlHzLAN)pE!3~yE8H&dfs`x;EBm5Z4P_8E!GzY z6JwRt3+{GHmxo`QHpzI%b)q8VY?-V}cVOnzIJUUkQmwgnOnlskj`sTL*Dp%ub|0b; z7%7?G75>RzgYmjUO$yIwYSZ>;&Rm^+2f~vdY*?I7cZrwsFuWNYR;3UA2CsSNxQ_E4 zC6TnH*AgUzhZb$7B&GWKXWwqMd}Mt2?N+OkX1a#G5pSMt@FTPKe$Y(w*s*|q=ba(b zYe~7j*05oV+y?7w9X``e|6^*#-oGp*SehbR|!GthoJ-L74|ve71; z?9^4sO%>U0Cp0JsHne0%gH1Ks9gjwvhpzHw43pL-Gmd$65=9^OP!OX%7IBxEp!qE~ z)LAc!vv=g~{L+buT)img0e$mJd4|C=1=mHgPi$8lR3M(wu4p)zA69sKK~(Qp9RD!c zKkyR&TR)@~y39wO{CS|OGmHGMKcN4B{^O5hub}^c{sa0Ca}O(mAitpSetx0-{GxjNLJ|kW zBm_nG@$*aY^PgG1n2r)Aj?O3TtbPCd7fjy~*a3b4r^gXPkCWiHmhiB1v~u?_cXavt zUn3;^1F~{SW9*Nh9BEfsPn9i|Ka?H7(etM(0@Sx0sRM@|A6x! zaQ*|%f57< z1fc(b{sa0C=s%$Ufc^ve59mLj|A77j`VZ(op#OmW1Nsl>KcN4B{sa0C=s%$Ufc^ve z59mMstNaHInEy!9yR`PF`#;14f9pS@9bVe_xV*IS^dTdx+c2`8K=|W77qv7LDM%TR z*%At6rNcU4aX}x5?I!RO2oFEMp$6aVvQ*MhClLJD34}A}34}%PU1vrJ1W$efVe|xn zAQ4L-(7Pm-YfBLbL~#E{P0ifgoRyUo-2d_G0(7|l;|R&;^(5>0*$T&3od^V4xc>w0 z|A6~H;QkM|{{!y-fcrn-{tvkS1MdHT`#<3R54isW?*D-MKj8ikxc>w0|A6~H;QkMA zv;9Bv&wuOwkALnzgrNU`^B-{jqK{pWE1IoyB#ACVrv{HA|h|8W5N59mLj|A77jo___; zzk=sq!Sk=+`B(7#D|r4DJpT%we+AFKg6Chs^RM9fSMdBRc>WbU{|cUe1<${N=U>6| zul{1^UkOA10sRN`AJBh5{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx0sRN`AJBh5 z{{j66^dHcF{Kfo-2=pJ&e?b2M{Ri|P(0@Sx0sRN`AJBh5{{j66^dHcFK>q>#2lOA% ze?b2M{Ri|P(0@Sx0sY5c%zubN{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx0sRN` zAJBh5{{j66^dHcFK>q>#2lOA%fBeP#hZyu9(0@Sx0sRN`AJBh5{{j66^dHcFK>q># z2lOA%e?b2M{Ri|P(0@Sx0sRN`AJBh5{{j8SU(A1qL;nH&2lOA%e?b2M{Ri|P(0@Sx z0sRN`AJBh5{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0}~3{D(L{^dHcFK>q>#2lOA% ze?b2M{Ri|P(0@Sx0sRN`AJBh5{{j66^dHcFK>q>#2lOA%e?b2M{l{O-e+WST0sRN` zAJBh5{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx0sRN`AJBh5{{j66^dHcF{Kfo- zAoL&5e?b2M{Ri|P(0@Sx0sRN`AJBh5{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx z0sY5c%zp?${{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx0sRN`AJBh5{{j66^dHcF zK>q>#2lOA%fBeP##{uX+p#OmW1Nsl>KcN4B{sa0C=s%$Ufc^ve59mLj|A77j`VZ(o zp#OmW1Nsl>KcN4B{sa1tznK3JhW-Qk59mLj|A77j`VZ(op#OmW1Nsl>KcN4B{sa0C z=s%$Ufc^ve59mLj|A77j`VZ(op#S)b`45pl^&dgbFKs-1$O!8;jI1XR{`k*DEe%Bq zQU+22fk2_GbXbQ#Sl0()y9xXR!o$yRsKGb8ER}TB2?RfO0^!Vg0$~w+*O?Il!IPgr z7(GECNW>Bd^e&0z+EN4p(TbLu-VyK<)~#DdL`1YLMZ{n>KCI(b3`K<6~lC`taccJ3IU6=;-z9*VWY2goTASZ{Dn> zrKO^xl9Q9e#>RH^=+TUf40Chy)YMdJYHCwc(|7OQIXXJFx3}-vvnMbxu%)Gio}M21 z59mLj|A77j`VZ(op#OmW1Nsl>KcN4B{sa0C=s%$Ufc^ve59mLj|A77j`VZ(op#S(w z_zwX-Yd3R8D>DJ{KldL#F3^7z78WKZCieFBUc7jbpPzqhY|O*M!`a!{!oq@_oZQ#f zHz+7bRaJHS_U$1dAu=*DJ9qAkii&#l=#izRrN6&_WMt&p+S=^w?4d)4E;=;nhq@<*tJbALXxL8n7P*PH2WMm{DAW&XjuB4;{{Ri|P z(0@Sx0sRN`AJBh5{{j66^dHcFK>q>#2lOA%e?b2M{Ri|P(0@Sx0sRN`AO98pV;vFm zdSpt2K-g4hZJexkTWv4+-$*tQwj&{F+> zzZ-R)wK0>vfQ%#qfq;bNm)|YztQGj(T+H1(`2S{CfHC;{=@I~mboi%`s09fxS|S1g z2^z8huxN+?UdT7AK~F{iK!S!?GhrcuzlB8o^DCKZ)>~r-03>KgHwzZ>n`QLi!}Tvf zj&C&k;tc>u&=8|NSjcZSzWi&DkR_Unf?(1I2^zx1hK2m*Shar*QZsO|`TzhRK|_i; zv5?=myMGO0Hb32V5CD*%A#yxeh$!Aq{OOZ^Yg_<;1P$rt!$QRHLSBBUS)>90BxuMn zAuL23FXWm)b(K2+AVEW(iC`cCzi<4%@JD#SII_$V0Fa;|Hzcr--#7kWfTTNrFmeO{ zBxs0+3>JdB@j5(riA?|i2^vCs2n)g8`2L&23)%pH1PyrsChAZxkOH_H&nrgUxO)SE zfCLS3Q^rDYH@-074)G^&6-dyKaWF@Sz7pJx&s2PVW;3`7BxndHm|{dja5sMPmCw`^ zxC$g_$fcuL2=2z8dPk*91+D@K8uHp03&Gv^Mvr=HWfB4b2^u10hJgs;ZhS=?4^=z3 z3M6RA2Wu<@cjNa_1kg=@t3ZN=kU3x>xEpUGr@Vn=6M=vP4bk?%LU1>}=74a{2XGZg z(2&9aEChGsTlU1ReFp#}XvoNUEChGsqpvzN?*JbvBxs0uI2MAt@w?Pxe6|4q5;PPHA z6ZcLX0Fa;|axGX0?#7?#-s>^A8GPbF(2(IbSP1UM=W&`iPXGWCG=%LF7J|F+f((;6 zo5A0Dk)R=`Ca@6PjkoHXb20<~Bxp$EJQjkx@pIG^=D+`i-q8Bd>09?%jiaMQU(YbvVjK+!QJ=+th|x=;3|-yA&Np+2=2zu?o}t) z0RR#-L{kzA!QFU?1sek=06>C5(Px#{000RZQfrTe z;BI`}E`PP(zwcsn$3k#7et4@LIMs$gK!Uy!FMliqcjMJqNW$&|01`BW_&gSZyYZVI zBy2qk07%e~t>IV*?#7pJ4Gy^g01`B0G#U%R-S}={&X!gHK!S!8C1WAD8~=>aTW1ge zkf0$wnOF$!#t)FY8qELz5;TOd5Cajx-FTt*uMMQZ8#^Ruh)p>bg1hmj;%h4p0RR#- zWTh4h!QJ@tuMG|r0ss;;B(@O?!QJ?6(azh(0RRaalG25R;BI^=&v4}x@D>#b8Z!J5 z3&GuZ(>Il8vH$=H8qzS1h2U=d=q_>My8wU$4QZOkLU1>p(zcZK_aCliA|mt~ZV}v# z@9d_#{}NmU67-c6Q(z&u8}Dyl_~iGHuI(6zDDKA7Co}lG1y_LteI<)~u@Kyi4}1NT zhZ5LUBxnc^9~OeU@er-+5%Zv5*;yL-<8 z00{=7i-q8Bywfw@cw+!Sf`&AhVIjC1Z&9*5MhyT+(2$^0SP1UM>mGP1NCN;!(2!9t zEChGsGt07Cb3jLspdm+tu@KyiXZ*;p#|!|FpdrTL7>F3|#&1_5tELA4BxneAEEa;h z@y{8aZ2bnlDk4Ecf>W>%+>MVAn=Ly4t^x@f(s~aI!QJ=?^Or^k0RRaaV)_6J!QJ@7 zJ!{>I0DuGynXkq|a5vub;bGb(06>CH-7%ODs907%dfvMDSCcjIkG{I9SeuUmij+Vy<_0};pF_`vsJPQ&0T zkf5)`g?K&sEs;3x#&alyvonLMK!S!8Y{f!wH$FbutXUZVkf0$PJFyVljklN7k8=V5 zBxp!I2Nr_6@sh>MTxTf2fw~}Q$aNts1b5?;XH^F60RRaaVkd`%;BI_C< z@MvNoxEn9MH{n<$03bm_z8=Fua5uiw&~f+_03bm_KG<2c)sX6=li!32uRQn#}`-# z?#2%_(RC700gDZShTMINh2U=dib!p$A^;#kL)MRBA-Egw=fhol4*-y$A*st)2=2z$ zXx!qA0{|pw$lWa)P+xup@IQ0+>DEidcmP0xhQ#l}LU1>JNxG809RQG^A>o2p2=2z` zo;|hW4gerQL&^_hA-Ef_?n%5Z766c-A;m|r5ZsM_v(uh}2OOl21Pw{I#X@j5zVggO zyaoUuK|{Fxu@Kyirzml(JO}_t(2&+}EChGs)mgsL&;tMxG{pWk7J|F+R%LEtzyEM` z-^W65H$G5kp3WCs1rqd?oPCOc;D6>WAi_QJ1^^&ILv-I@A-EeqEFoU-0RWJoAu?lF z2=2x!%tlJbgING1Xo%-37J|F+Pt_KT<|qjSBxs234r27HupsWnOObZueWwS{+<~AW zrCeAD?#7#ETZ)j=5eP`o5RyY!2=2y|3b|bqwBUgy5Hw_0FcyNl@ntHhN%z5fE+lA(bqofA|CzfuW*7cm06>CIyOY9cuR07%df4rwd|cjH43(QFF=FDXdSkdxXN2>xg8 z>|Xij?gB54NYIc&)>sJc##3F`W%LmMkf0$I{#Xd^#(#Os(`B@cKtO_q%tc@!xEmjJ z-SG2v@TC_C8j^Vz3&Gv^-O^oK9{~UoG-Ue|EChGsbC?e7Ed%47NYIe|Z?F*DjZa@O z@F3j*9LLDJvF&yYVqj z2ZL3?TT~=yNRkW&g8!Mjbf(*9_W}SCG(^q_3&Gv^iH`LHU%-b72^v!Aj)mZEyx=-! zia7v4f`)9oiiO~A{ILr|{0G2?3JDsbcNYu6-FPb-nm_r|^|1yE!QFU|*zz!4@S#G2 zzLH%%SP1UMKjS;zq6z>=(2$02SP1UM4-Qs@3IhNVG{j}=CUoP4aW`IOId!)n03bm_ zR=Kbc+>N&%*)Jds07%e~i}Dx<{%7vUnh$GS0stgv2+MIS1b5>bhx#S^!PgQbXb6!v z7J|F+deoOUHUj_>G(`G37J|F+x~0#J>Hz==8e)}&h2UJ#t05MGyYc?g)OisA zfCLR$biqP!H@z=4z2ao)zs|=Ch~jR%Ul!?|OaMTFhP>HG zihnY(`g(Z)h>HJ%2X=98p%Y3)xwC-zv#?;9WekI%sQ zCy;Yk$nP8f??Do=kl#1{--DE3A-`|@zXxf;LVn-)e-8p4`9d{b?DviT_aFo^4CMEX z|Mws}u#n$3{@;TLVjzF=%-z2SQN==j-}rwIauN&qPc%Ld3;9np{w5akpJ;qO7V@8H r{0l7PKhgM)KOp~bEe<$Z>$iWph{3Ef7&`#}I%t4Lco)F~kc9sa-rAow literal 0 HcmV?d00001 diff --git a/compatibility_matrix.xml b/compatibility_matrix.xml new file mode 100644 index 0000000..2bde0cc --- /dev/null +++ b/compatibility_matrix.xml @@ -0,0 +1,36 @@ + + + android.frameworks.sensorservice + 1.0 + + ISensorManager + default + + + + android.hidl.manager + 1.2 + + IServiceManager + default + + + + android.hidl.memory + 1.0 + + IMapper + ashmem + + + + android.hidl.token + 1.0 + + ITokenManager + default + + + + + diff --git a/device.mk b/device.mk new file mode 100644 index 0000000..061da03 --- /dev/null +++ b/device.mk @@ -0,0 +1,303 @@ +# +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# +# SPDX-License-Identifier: Apache-2.0 +# + +DEVICE_PATH := device/rockchip/orangepi5ultra +PRODUCT_SOONG_NAMESPACES += $(DEVICE_PATH) + +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit_only.mk) +$(call inherit-product, frameworks/native/build/tablet-7in-xhdpi-2048-dalvik-heap.mk) +$(call inherit-product, vendor/lineage-rockchip/opi5ultra-vendor.mk) + +# APEX +$(call inherit-product, $(SRC_TARGET_DIR)/product/updatable_apex.mk) +OVERRIDE_PRODUCT_COMPRESSED_APEX := false + +# API level +PRODUCT_SHIPPING_API_LEVEL := 36 + + +# Audio +PRODUCT_PACKAGES += \ + android.hardware.audio.service \ + android.hardware.audio@7.1-impl \ + android.hardware.audio.effect@7.0-impl \ + audio.r_submix.default \ + audio.usb.default \ + audio.primary.opi \ + audio.primary.opi_hdmi + +PRODUCT_PACKAGES += \ + tinycap \ + tinyhostless \ + tinymix \ + tinypcminfo \ + tinyplay + + +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/audio/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \ + frameworks/av/media/libeffects/data/audio_effects.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_effects.xml \ + frameworks/av/services/audiopolicy/config/audio_policy_volumes.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_volumes.xml \ + frameworks/av/services/audiopolicy/config/default_volume_tables.xml:$(TARGET_COPY_OUT_VENDOR)/etc/default_volume_tables.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 + + +# Bluetooth +PRODUCT_PACKAGES += \ + com.android.hardware.bluetooth.opi5 + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \ + frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml + +PRODUCT_PACKAGES += \ + android.hardware.bluetooth.audio-impl \ + audio.bluetooth.default + +PRODUCT_COPY_FILES += \ + frameworks/av/services/audiopolicy/config/a2dp_in_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/a2dp_in_audio_policy_configuration_7_0.xml \ + frameworks/av/services/audiopolicy/config/bluetooth_audio_policy_configuration_7_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/bluetooth_audio_policy_configuration_7_0.xml + + +# !-----TODO : Camera isn't supported currently and might be implemented in the near future. Kept just in case. +# # Camera +# PRODUCT_PACKAGES += \ +# android.hardware.camera.provider-V1-external-service + +# PRODUCT_COPY_FILES += \ +# $(DEVICE_PATH)/camera/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml + +# PRODUCT_COPY_FILES += \ +# frameworks/native/data/etc/android.hardware.camera.external.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.external.xml + +# PRODUCT_PACKAGES += \ +# android.hardware.camera.provider@2.5-service_64 +# # camera.libcamera \ +# # ipa_rpi_pisp + +# PRODUCT_COPY_FILES += \ +# $(DEVICE_PATH)/camera/android.hardware.camera.provider@2.5-service_64.opi.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/android.hardware.camera.provider@2.5-service_64.opi.rc + +# # PRODUCT_COPY_FILES += \ +# # $(DEVICE_PATH)/camera/camera_hal.yaml:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/camera_hal.yaml \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx219.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx219.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx219_noir.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx219_noir.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx296.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx296.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx296_mono.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx296_mono.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx477.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx477.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx477_noir.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx477_noir.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx477_scientific.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx477_scientific.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx500.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx500.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx519.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx519.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx708.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx708.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx708_noir.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx708_noir.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx708_wide.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx708_wide.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/imx708_wide_noir.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/imx708_wide_noir.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/ov5647.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/ov5647.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/ov5647_noir.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/ov5647_noir.json \ +# # external/libcamera/src/ipa/rpi/pisp/data/ov64a40.json:$(TARGET_COPY_OUT_VENDOR)/etc/libcamera/ipa/rpi/pisp/ov64a40.json + +# PRODUCT_COPY_FILES += \ +# frameworks/native/data/etc/android.hardware.camera.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.xml \ +# frameworks/native/data/etc/android.hardware.camera.concurrent.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.concurrent.xml \ +# frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \ +# frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \ +# frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \ +# frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml + +# PRODUCT_COPY_FILES += \ +# $(DEVICE_PATH)/camera/media_profiles_V1_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml + +# # CEC +# PRODUCT_PACKAGES += \ +# com.android.hardware.tv.hdmi.cec.opi5 \ +# com.android.hardware.tv.hdmi.connection.opi5 + +# PRODUCT_COPY_FILES += \ +# frameworks/native/data/etc/android.hardware.hdmi.cec.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.hdmi.cec.xml + +#cec +PRODUCT_PACKAGES += \ + com.android.hardware.tv.hdmi.connection.opi5 + +# Debugfs +PRODUCT_SET_DEBUGFS_RESTRICTIONS := false + +# DRM +PRODUCT_PACKAGES += \ + com.android.hardware.drm.clearkey + +# Emergency info +PRODUCT_PACKAGES += \ + EmergencyInfo + +# Ethernet +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.ethernet.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.ethernet.xml + +#FFmpeg +PRODUCT_PACKAGES += \ + com.android.hardware.media.c2.ffmpeg + + +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/media/media_codecs_ffmpeg_c2.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_ffmpeg_c2.xml \ + $(DEVICE_PATH)/seccomp_policy/android.hardware.media.c2-ffmpeg.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/android.hardware.media.c2-ffmpeg.policy + +# Gatekeeper +PRODUCT_PACKAGES += \ + com.android.hardware.gatekeeper.nonsecure \ + +# Graphics +PRODUCT_SOONG_NAMESPACES += external/mesa3d-panfrost +PRODUCT_PACKAGES += \ + com.android.hardware.graphics.allocator.minigbm_gbm_mesa + +PRODUCT_PACKAGES += \ + libEGL_mesa \ + libGLESv1_CM_mesa \ + libGLESv2_mesa \ + libgallium_dri + +PRODUCT_PACKAGES += \ + com.android.hardware.vulkan.panfrost + + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.opengles.deqp.level-2024-03-01.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.opengles.deqp.level.xml + + + +PRODUCT_PACKAGES += \ + com.android.hardware.graphics.composer.drm_hwcomposer + + +# Health +PRODUCT_PACKAGES += \ + com.android.hardware.health.opi5 + +# HIDL +PRODUCT_PACKAGES += \ + android.hidl.allocator@1.0-service \ + hwservicemanager + +# Kernel +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)-kernel/Image:$(PRODUCT_OUT)/kernel + +# Keylayout +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/keylayout/Generic.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Generic.kl + +# Keymint +PRODUCT_PACKAGES += \ + com.android.hardware.keymint.rust_nonsecure + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.keystore.app_attest_key.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.keystore.app_attest_key.xml + + # Lights + PRODUCT_PACKAGES += \ + com.android.hardware.light.opi5 + +# Media +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/media/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_c2_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_c2_audio.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_c2_tv.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_c2_tv.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_c2_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_c2_video.xml + +# Power +PRODUCT_PACKAGES += \ + com.android.hardware.power + +# Ramdisk +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/ramdisk/fstab.opi5ultra:$(TARGET_COPY_OUT_RAMDISK)/fstab.opi5ultra \ + $(DEVICE_PATH)/ramdisk/fstab.opi5ultra:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.opi5ultra \ + $(DEVICE_PATH)/ramdisk/init.opi5ultra.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.opi5ultra.rc \ + $(DEVICE_PATH)/ramdisk/init.opi5ultra.usb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.opi5ultra.usb.rc \ + $(DEVICE_PATH)/ramdisk/ueventd.opi5ultra.rc:$(TARGET_COPY_OUT_VENDOR)/etc/ueventd.rc + +# Seccomp +PRODUCT_COPY_FILES += \ + $(DEVICE_PATH)/seccomp_policy/mediacodec.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/mediacodec.policy \ + $(DEVICE_PATH)/seccomp_policy/mediaswcodec.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/mediaswcodec.policy + + +# Soong +PRODUCT_SOONG_NAMESPACES += $(DEVICE_PATH) +# Storage +$(call inherit-product, $(SRC_TARGET_DIR)/product/emulated_storage.mk) + + # Suspend +PRODUCT_PACKAGES += \ + com.android.hardware.suspend_blocker.opi5 + +# Thermal +PRODUCT_PACKAGES += \ + com.android.hardware.thermal + +# Touchscreen +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml + + +# USB +PRODUCT_PACKAGES += \ + com.android.hardware.usb \ + com.android.hardware.usb.gadget.opi5 + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \ + frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \ + frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml + +# V4L-Utils +PRODUCT_PACKAGES += \ + cec-ctl \ + ir-keytable \ + media-ctl \ + v4l2-ctl \ + + +# Virtualization +$(call inherit-product, packages/modules/Virtualization/apex/product_packages.mk) + + + +# Wifi +# PRODUCT_PACKAGES += \ +# android.hardware.wifi-service \ +# hostapd \ +# hostapd_cli \ +# libwpa_client \ +# wificond \ +# wpa_cli \ +# wpa_supplicant \ +# wpa_supplicant.conf + +# PRODUCT_COPY_FILES += \ +# hardware/broadcom/wlan/bcmdhd/config/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf + + +# Wifi +PRODUCT_PACKAGES += \ + com.android.hardware.wifi \ + com.android.hardware.wifi.hostapd.opi5 \ + com.android.hardware.wifi.supplicant.opi5 \ + libwpa_client \ + wificond + +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml + +# Packages +PRODUCT_BROKEN_VERIFY_USES_LIBRARIES := true + +# Window extensions +$(call inherit-product, $(SRC_TARGET_DIR)/product/window_extensions.mk) diff --git a/framework_compatibility_matrix.xml b/framework_compatibility_matrix.xml new file mode 100644 index 0000000..74b65ea --- /dev/null +++ b/framework_compatibility_matrix.xml @@ -0,0 +1,12 @@ + + + + android.hardware.media.c2 + 1 + + IComponentStore + ffmpeg + + + + diff --git a/hdmi/cec/Android.bp b/hdmi/cec/Android.bp new file mode 100644 index 0000000..8f1d93e --- /dev/null +++ b/hdmi/cec/Android.bp @@ -0,0 +1,54 @@ +// Copyright (C) 2021 The Android Open Source Project +// Copyright (C) 2025 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.tv.hdmi.cec-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "HdmiCec.cpp", + "HdmiCecPort.cpp", + "main.cpp", + ], + shared_libs: [ + "android.hardware.tv.hdmi.cec-V1-ndk", + "libbase", + "libbinder_ndk", + "libcutils", + "libhardware", + "liblog", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.tv.hdmi.cec-service.opi.rc", + src: "android.hardware.tv.hdmi.cec-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.tv.hdmi.cec-service.opi.xml", + src: "android.hardware.tv.hdmi.cec-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.tv.hdmi.cec.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.tv.hdmi.cec-service.opi"], + prebuilts: [ + "android.hardware.tv.hdmi.cec-service.opi.rc", + "android.hardware.tv.hdmi.cec-service.opi.xml", + ], +} diff --git a/hdmi/cec/HdmiCec.cpp b/hdmi/cec/HdmiCec.cpp new file mode 100644 index 0000000..8ca412b --- /dev/null +++ b/hdmi/cec/HdmiCec.cpp @@ -0,0 +1,457 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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.tv.hdmi.cec-service.opi" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "HdmiCec.h" + +#define PROPERTY_CEC_DEVICE "persist.vendor.hdmi.cec_device" + +using android::base::GetProperty; +using ndk::ScopedAStatus; +using std::string; + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace cec { +namespace implementation { + +HdmiCec::HdmiCec() { + mCecEnabled = false; + mWakeupEnabled = false; + mCecControlEnabled = false; + mCallback = nullptr; + + Result result = init(); + if (result != Result::SUCCESS) { + LOG(ERROR) << "Failed to init HDMI-CEC HAL"; + } +} + +HdmiCec::~HdmiCec() { + release(); +} + +ScopedAStatus HdmiCec::addLogicalAddress(CecLogicalAddress addr, Result* _aidl_return) { + if (addr < CecLogicalAddress::TV || addr >= CecLogicalAddress::BROADCAST) { + LOG(ERROR) << "Add logical address failed, Invalid address"; + *_aidl_return = Result::FAILURE_INVALID_ARGS; + return ScopedAStatus::ok(); + } + + cec_log_addrs cecLogAddrs; + int ret = ioctl(mHdmiCecPorts[0]->mCecFd, CEC_ADAP_G_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Add logical address failed, Error = " << strerror(errno); + *_aidl_return = Result::FAILURE_BUSY; + return ScopedAStatus::ok(); + } + + cecLogAddrs.cec_version = CEC_OP_CEC_VERSION_1_4; + cecLogAddrs.vendor_id = 0x000c03; // HDMI LLC vendor ID + + unsigned int logAddrType = CEC_LOG_ADDR_TYPE_UNREGISTERED; + unsigned int allDevTypes = 0; + unsigned int primDevType = 0xff; + switch (addr) { + case CecLogicalAddress::TV: + primDevType = CEC_OP_PRIM_DEVTYPE_TV; + logAddrType = CEC_LOG_ADDR_TYPE_TV; + allDevTypes = CEC_OP_ALL_DEVTYPE_TV; + break; + case CecLogicalAddress::RECORDER_1: + case CecLogicalAddress::RECORDER_2: + case CecLogicalAddress::RECORDER_3: + primDevType = CEC_OP_PRIM_DEVTYPE_RECORD; + logAddrType = CEC_LOG_ADDR_TYPE_RECORD; + allDevTypes = CEC_OP_ALL_DEVTYPE_RECORD; + break; + case CecLogicalAddress::TUNER_1: + case CecLogicalAddress::TUNER_2: + case CecLogicalAddress::TUNER_3: + case CecLogicalAddress::TUNER_4: + primDevType = CEC_OP_PRIM_DEVTYPE_TUNER; + logAddrType = CEC_LOG_ADDR_TYPE_TUNER; + allDevTypes = CEC_OP_ALL_DEVTYPE_TUNER; + break; + case CecLogicalAddress::PLAYBACK_1: + case CecLogicalAddress::PLAYBACK_2: + case CecLogicalAddress::PLAYBACK_3: + primDevType = CEC_OP_PRIM_DEVTYPE_PLAYBACK; + logAddrType = CEC_LOG_ADDR_TYPE_PLAYBACK; + allDevTypes = CEC_OP_ALL_DEVTYPE_PLAYBACK; + cecLogAddrs.flags |= CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU; + break; + case CecLogicalAddress::AUDIO_SYSTEM: + primDevType = CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM; + logAddrType = CEC_LOG_ADDR_TYPE_AUDIOSYSTEM; + allDevTypes = CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM; + break; + case CecLogicalAddress::FREE_USE: + primDevType = CEC_OP_PRIM_DEVTYPE_PROCESSOR; + logAddrType = CEC_LOG_ADDR_TYPE_SPECIFIC; + allDevTypes = CEC_OP_ALL_DEVTYPE_SWITCH; + break; + case CecLogicalAddress::UNREGISTERED: + cecLogAddrs.flags |= CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK; + break; + case CecLogicalAddress::BACKUP_1: + case CecLogicalAddress::BACKUP_2: + break; + } + + int logAddrIndex = cecLogAddrs.num_log_addrs; + cecLogAddrs.num_log_addrs += 1; + cecLogAddrs.log_addr[logAddrIndex] = static_cast(addr); + cecLogAddrs.log_addr_type[logAddrIndex] = logAddrType; + cecLogAddrs.primary_device_type[logAddrIndex] = primDevType; + cecLogAddrs.all_device_types[logAddrIndex] = allDevTypes; + cecLogAddrs.features[logAddrIndex][0] = 0; + cecLogAddrs.features[logAddrIndex][1] = 0; + + ret = ioctl(mHdmiCecPorts[0]->mCecFd, CEC_ADAP_S_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Add logical address failed for port " << mHdmiCecPorts[0]->mPortId + << ", Error = " << strerror(errno); + *_aidl_return = Result::FAILURE_BUSY; + return ScopedAStatus::ok(); + } + + *_aidl_return = Result::SUCCESS; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::clearLogicalAddress() { + cec_log_addrs cecLogAddrs; + memset(&cecLogAddrs, 0, sizeof(cecLogAddrs)); + + int ret = ioctl(mHdmiCecPorts[0]->mCecFd, CEC_ADAP_S_LOG_ADDRS, &cecLogAddrs); + if (ret) { + LOG(ERROR) << "Clear logical Address failed for port " << mHdmiCecPorts[0]->mPortId + << ", Error = " << strerror(errno); + } + + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::enableAudioReturnChannel(int32_t portId __unused, bool enable __unused) { + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::getCecVersion(int32_t* _aidl_return) { + *_aidl_return = CEC_OP_CEC_VERSION_1_4; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::getPhysicalAddress(int32_t* _aidl_return) { + uint16_t addr; + + int ret = ioctl(mHdmiCecPorts[0]->mCecFd, CEC_ADAP_G_PHYS_ADDR, &addr); + if (ret) { + LOG(ERROR) << "Get physical address failed, Error = " << strerror(errno); + return ScopedAStatus::fromServiceSpecificError( + static_cast(Result::FAILURE_INVALID_STATE)); + } + + *_aidl_return = addr; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::getVendorId(int32_t* _aidl_return) { + *_aidl_return = 0x000c03; // HDMI LLC vendor ID + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::sendMessage(const CecMessage& message, SendMessageResult* _aidl_return) { + if (!mCecEnabled) { + *_aidl_return = SendMessageResult::FAIL; + return ScopedAStatus::ok(); + } + + cec_msg cecMsg; + memset(&cecMsg, 0, sizeof(cec_msg)); + + int initiator = static_cast(message.initiator); + int destination = static_cast(message.destination); + + cecMsg.msg[0] = (initiator << 4) | destination; + for (size_t i = 0; i < message.body.size(); ++i) { + cecMsg.msg[i + 1] = message.body[i]; + } + cecMsg.len = message.body.size() + 1; + + int ret = ioctl(mHdmiCecPorts[0]->mCecFd, CEC_TRANSMIT, &cecMsg); + if (ret) { + LOG(ERROR) << "Send message failed, Error = " << strerror(errno); + *_aidl_return = SendMessageResult::FAIL; + return ScopedAStatus::ok(); + } + + if (cecMsg.tx_status != CEC_TX_STATUS_OK) { + LOG(ERROR) << "Send message tx_status = " << cecMsg.tx_status; + } + + *_aidl_return = getSendMessageResult(cecMsg.tx_status); + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::setCallback(const std::shared_ptr& callback) { + if (mCallback != nullptr) { + mCallback = nullptr; + } + + if (callback != nullptr) { + mCallback = callback; + } + + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::setLanguage(const std::string& language __unused) { + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::enableWakeupByOtp(bool value) { + mWakeupEnabled = value; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::enableCec(bool value) { + mCecEnabled = value; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiCec::enableSystemCecControl(bool value) { + mCecControlEnabled = value; + return ScopedAStatus::ok(); +} + +// Initialise the cec file descriptor +Result HdmiCec::init() { + string cecDevice = GetProperty(PROPERTY_CEC_DEVICE, "cec0"); + if (cecDevice != "cec0" && cecDevice != "cec1") { + LOG(ERROR) << "Invalid CEC device " << cecDevice; + return Result::FAILURE_NOT_SUPPORTED; + } + + string devicePath = "/dev/" + cecDevice; + int portId = stoi(cecDevice.substr(3)); + + shared_ptr hdmiCecPort(new HdmiCecPort(portId)); + Result result = hdmiCecPort->init(devicePath.c_str()); + if (result != Result::SUCCESS) { + return Result::FAILURE_NOT_SUPPORTED; + } + + thread eventThread(&HdmiCec::event_thread, this, hdmiCecPort.get()); + mEventThreads.push_back(std::move(eventThread)); + mHdmiCecPorts.push_back(std::move(hdmiCecPort)); + LOG(INFO) << "Using CEC device " << devicePath; + + mCecEnabled = true; + mWakeupEnabled = true; + mCecControlEnabled = true; + + return Result::SUCCESS; +} + +void HdmiCec::release() { + mCecEnabled = false; + mWakeupEnabled = false; + mCecControlEnabled = false; + + for (thread& eventThread : mEventThreads) { + if (eventThread.joinable()) { + eventThread.join(); + } + } + setCallback(nullptr); + mHdmiCecPorts.clear(); + mEventThreads.clear(); +} + +void HdmiCec::event_thread(HdmiCecPort* hdmiCecPort) { + struct pollfd ufds[3] = { + {hdmiCecPort->mCecFd, POLLIN, 0}, + {hdmiCecPort->mCecFd, POLLERR, 0}, + {hdmiCecPort->mExitFd, POLLIN, 0}, + }; + + while (1) { + ufds[0].revents = 0; + ufds[1].revents = 0; + ufds[2].revents = 0; + + int ret = poll(ufds, /* size(ufds) = */ 3, /* timeout = */ -1); + + if (ret <= 0) { + continue; + } + + if (ufds[2].revents == POLLIN) { /* Exit */ + break; + } + + if (ufds[1].revents == POLLERR) { /* CEC Event */ + cec_event ev; + ret = ioctl(hdmiCecPort->mCecFd, CEC_DQEVENT, &ev); + + if (ret) { + LOG(ERROR) << "CEC_DQEVENT failed, Error = " << strerror(errno); + continue; + } + + if (!mCecEnabled) { + continue; + } + } + + if (ufds[0].revents == POLLIN) { /* CEC Driver */ + cec_msg msg = {}; + ret = ioctl(hdmiCecPort->mCecFd, CEC_RECEIVE, &msg); + + if (ret) { + LOG(ERROR) << "CEC_RECEIVE failed, Error = " << strerror(errno); + continue; + } + + if (msg.rx_status != CEC_RX_STATUS_OK) { + LOG(ERROR) << "msg rx_status = " << msg.rx_status; + continue; + } + + if (!mCecEnabled) { + continue; + } + + if (!mWakeupEnabled && isWakeupMessage(msg)) { + LOG(DEBUG) << "Filter wakeup message"; + continue; + } + + if (!mCecControlEnabled && !isTransferableInSleep(msg)) { + LOG(DEBUG) << "Filter message in standby mode"; + continue; + } + + if (mCallback != nullptr) { + size_t length = std::min(msg.len - 1, (uint32_t)(CEC_MESSAGE_BODY_MAX_LENGTH - 1)); + CecMessage cecMessage{ + .initiator = static_cast(msg.msg[0] >> 4), + .destination = static_cast(msg.msg[0] & 0xf), + }; + cecMessage.body.resize(length); + for (size_t i = 0; i < length; ++i) { + cecMessage.body[i] = static_cast(msg.msg[i + 1]); + } + mCallback->onCecMessage(cecMessage); + } else { + LOG(ERROR) << "no event callback for message"; + } + } + } +} + +int HdmiCec::getOpcode(cec_msg message) { + return static_cast(message.msg[1]); +} + +bool HdmiCec::isWakeupMessage(cec_msg message) { + int opcode = getOpcode(message); + switch (opcode) { + case CEC_MESSAGE_TEXT_VIEW_ON: + case CEC_MESSAGE_IMAGE_VIEW_ON: + return true; + default: + return false; + } +} + +bool HdmiCec::isTransferableInSleep(cec_msg message) { + int opcode = getOpcode(message); + switch (opcode) { + case CEC_MESSAGE_ABORT: + case CEC_MESSAGE_DEVICE_VENDOR_ID: + case CEC_MESSAGE_GET_CEC_VERSION: + case CEC_MESSAGE_GET_MENU_LANGUAGE: + case CEC_MESSAGE_GIVE_DEVICE_POWER_STATUS: + case CEC_MESSAGE_GIVE_DEVICE_VENDOR_ID: + case CEC_MESSAGE_GIVE_OSD_NAME: + case CEC_MESSAGE_GIVE_PHYSICAL_ADDRESS: + case CEC_MESSAGE_REPORT_PHYSICAL_ADDRESS: + case CEC_MESSAGE_REPORT_POWER_STATUS: + case CEC_MESSAGE_SET_OSD_NAME: + case CEC_MESSAGE_DECK_CONTROL: + case CEC_MESSAGE_PLAY: + case CEC_MESSAGE_IMAGE_VIEW_ON: + case CEC_MESSAGE_TEXT_VIEW_ON: + case CEC_MESSAGE_SYSTEM_AUDIO_MODE_REQUEST: + return true; + case CEC_MESSAGE_USER_CONTROL_PRESSED: + return isPowerUICommand(message); + default: + return false; + } +} + +int HdmiCec::getFirstParam(cec_msg message) { + return static_cast(message.msg[2]); +} + +bool HdmiCec::isPowerUICommand(cec_msg message) { + int uiCommand = getFirstParam(message); + switch (uiCommand) { + case CEC_OP_UI_CMD_POWER: + case CEC_OP_UI_CMD_DEVICE_ROOT_MENU: + case CEC_OP_UI_CMD_POWER_ON_FUNCTION: + return true; + default: + return false; + } +} + +SendMessageResult HdmiCec::getSendMessageResult(int tx_status) { + switch (tx_status) { + case CEC_TX_STATUS_OK: + return SendMessageResult::SUCCESS; + case CEC_TX_STATUS_ARB_LOST: + return SendMessageResult::BUSY; + case CEC_TX_STATUS_NACK: + return SendMessageResult::NACK; + default: + return SendMessageResult::FAIL; + } +} + +} // namespace implementation +} // namespace cec +} // namespace hdmi +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/cec/HdmiCec.h b/hdmi/cec/HdmiCec.h new file mode 100644 index 0000000..68b62fb --- /dev/null +++ b/hdmi/cec/HdmiCec.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 +#include +#include +#include +#include +#include "HdmiCecPort.h" + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace cec { +namespace implementation { + +using std::shared_ptr; +using std::thread; +using std::vector; + +using ::aidl::android::hardware::tv::hdmi::cec::BnHdmiCec; +using ::aidl::android::hardware::tv::hdmi::cec::CecLogicalAddress; +using ::aidl::android::hardware::tv::hdmi::cec::CecMessage; +using ::aidl::android::hardware::tv::hdmi::cec::IHdmiCec; +using ::aidl::android::hardware::tv::hdmi::cec::IHdmiCecCallback; +using ::aidl::android::hardware::tv::hdmi::cec::Result; +using ::aidl::android::hardware::tv::hdmi::cec::SendMessageResult; + +struct HdmiCec : public BnHdmiCec { + public: + HdmiCec(); + ~HdmiCec(); + ::ndk::ScopedAStatus addLogicalAddress(CecLogicalAddress addr, Result* _aidl_return) override; + ::ndk::ScopedAStatus clearLogicalAddress() override; + ::ndk::ScopedAStatus enableAudioReturnChannel(int32_t portId, bool enable) override; + ::ndk::ScopedAStatus getCecVersion(int32_t* _aidl_return) override; + ::ndk::ScopedAStatus getPhysicalAddress(int32_t* _aidl_return) override; + ::ndk::ScopedAStatus getVendorId(int32_t* _aidl_return) override; + ::ndk::ScopedAStatus sendMessage(const CecMessage& message, + SendMessageResult* _aidl_return) override; + ::ndk::ScopedAStatus setCallback(const std::shared_ptr& callback) override; + ::ndk::ScopedAStatus setLanguage(const std::string& language) override; + ::ndk::ScopedAStatus enableWakeupByOtp(bool value) override; + ::ndk::ScopedAStatus enableCec(bool value) override; + ::ndk::ScopedAStatus enableSystemCecControl(bool value) override; + + Result init(); + void release(); + + private: + void event_thread(HdmiCecPort* hdmiCecPort); + static int getOpcode(cec_msg message); + static int getFirstParam(cec_msg message); + static bool isWakeupMessage(cec_msg message); + static bool isTransferableInSleep(cec_msg message); + static bool isPowerUICommand(cec_msg message); + static SendMessageResult getSendMessageResult(int tx_status); + + vector mEventThreads; + vector> mHdmiCecPorts; + + // When set to false, all the CEC commands are discarded. True by default after initialization. + bool mCecEnabled; + /* + * When set to false, HAL does not wake up the system upon receiving or + * . True by default after initialization. + */ + bool mWakeupEnabled; + /* + * Updated when system goes into or comes out of standby mode. + * When set to true, Android system is handling CEC commands. + * When set to false, microprocessor is handling CEC commands. + * True by default after initialization. + */ + bool mCecControlEnabled; + + std::shared_ptr mCallback; +}; + +} // namespace implementation +} // namespace cec +} // namespace hdmi +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/cec/HdmiCecPort.cpp b/hdmi/cec/HdmiCecPort.cpp new file mode 100644 index 0000000..c163169 --- /dev/null +++ b/hdmi/cec/HdmiCecPort.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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.tv.hdmi.cec-service.opi" + +#include +#include +#include +#include +#include +#include + +#include "HdmiCecPort.h" + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace cec { +namespace implementation { + +HdmiCecPort::HdmiCecPort(unsigned int portId) { + mPortId = portId; + mCecFd = -1; + mExitFd = -1; +} + +HdmiCecPort::~HdmiCecPort() { + release(); +} + +// Initialise the cec file descriptor +Result HdmiCecPort::init(const char* path) { + mCecFd = open(path, O_RDWR); + if (mCecFd < 0) { + LOG(ERROR) << "Failed to open " << path << ", Error = " << strerror(errno); + return Result::FAILURE_NOT_SUPPORTED; + } + mExitFd = eventfd(0, EFD_NONBLOCK); + if (mExitFd < 0) { + LOG(ERROR) << "Failed to open eventfd, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + // Ensure the CEC device supports required capabilities + struct cec_caps caps = {}; + int ret = ioctl(mCecFd, CEC_ADAP_G_CAPS, &caps); + if (ret) { + LOG(ERROR) << "Unable to query cec adapter capabilities, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + if (!(caps.capabilities & (CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT | CEC_CAP_PASSTHROUGH))) { + LOG(ERROR) << "Wrong cec adapter capabilities " << caps.capabilities; + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + + uint32_t mode = CEC_MODE_INITIATOR | CEC_MODE_EXCL_FOLLOWER_PASSTHRU; + ret = ioctl(mCecFd, CEC_S_MODE, &mode); + if (ret) { + LOG(ERROR) << "Unable to set initiator mode, Error = " << strerror(errno); + release(); + return Result::FAILURE_NOT_SUPPORTED; + } + return Result::SUCCESS; +} + +void HdmiCecPort::release() { + if (mExitFd > 0) { + uint64_t tmp = 1; + write(mExitFd, &tmp, sizeof(tmp)); + } + if (mExitFd > 0) { + close(mExitFd); + } + if (mCecFd > 0) { + close(mCecFd); + } +} + +} // namespace implementation +} // namespace cec +} // namespace hdmi +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/cec/HdmiCecPort.h b/hdmi/cec/HdmiCecPort.h new file mode 100644 index 0000000..c74c642 --- /dev/null +++ b/hdmi/cec/HdmiCecPort.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace cec { +namespace implementation { + +using ::aidl::android::hardware::tv::hdmi::cec::Result; + +class HdmiCecPort { + public: + HdmiCecPort(unsigned int portId); + ~HdmiCecPort(); + Result init(const char* path); + void release(); + + unsigned int mPortId; + int mCecFd; + int mExitFd; +}; + +} // namespace implementation +} // namespace cec +} // namespace hdmi +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.rc b/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.rc new file mode 100644 index 0000000..210a6bf --- /dev/null +++ b/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.rc @@ -0,0 +1,5 @@ +service vendor.cec-opi /apex/com.android.hardware.tv.hdmi.cec.opi5/bin/hw/android.hardware.tv.hdmi.cec-service.opi + interface aidl android.hardware.tv.hdmi.cec.IHdmiCec/default + class hal + user system + group system diff --git a/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.xml b/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.xml new file mode 100644 index 0000000..d48565c --- /dev/null +++ b/hdmi/cec/android.hardware.tv.hdmi.cec-service.opi.xml @@ -0,0 +1,10 @@ + + + android.hardware.tv.hdmi.cec + 1 + + IHdmiCec + default + + + diff --git a/hdmi/cec/apex_file_contexts b/hdmi/cec/apex_file_contexts new file mode 100644 index 0000000..881bf98 --- /dev/null +++ b/hdmi/cec/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.tv\.hdmi\.cec-service\.opi u:object_r:hal_tv_hdmi_cec_default_exec:s0 diff --git a/hdmi/cec/apex_manifest.json b/hdmi/cec/apex_manifest.json new file mode 100644 index 0000000..46e5822 --- /dev/null +++ b/hdmi/cec/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.tv.hdmi.cec.opi5", + "version": 1 +} diff --git a/hdmi/cec/main.cpp b/hdmi/cec/main.cpp new file mode 100644 index 0000000..597eb4d --- /dev/null +++ b/hdmi/cec/main.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 "HdmiCec.h" + +#include +#include +#include + +using android::hardware::tv::hdmi::cec::implementation::HdmiCec; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + + std::shared_ptr hdmiCecAidl = ndk::SharedRefBase::make(); + const std::string instance = std::string() + HdmiCec::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(hdmiCecAidl->asBinder().get(), instance.c_str()); + CHECK_EQ(status, STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/hdmi/connection/Android.bp b/hdmi/connection/Android.bp new file mode 100644 index 0000000..a26f1bf --- /dev/null +++ b/hdmi/connection/Android.bp @@ -0,0 +1,51 @@ +// Copyright (C) 2022 The Android Open Source Project +// Copyright (C) 2025 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.tv.hdmi.connection-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "HdmiConnection.cpp", + "main.cpp", + ], + shared_libs: [ + "android.hardware.tv.hdmi.connection-V1-ndk", + "libbase", + "libbinder_ndk", + "liblog", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.tv.hdmi.connection-service.opi.rc", + src: "android.hardware.tv.hdmi.connection-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.tv.hdmi.connection-service.opi.xml", + src: "android.hardware.tv.hdmi.connection-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.tv.hdmi.connection.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.tv.hdmi.connection-service.opi"], + prebuilts: [ + "android.hardware.tv.hdmi.connection-service.opi.rc", + "android.hardware.tv.hdmi.connection-service.opi.xml", + ], +} diff --git a/hdmi/connection/HdmiConnection.cpp b/hdmi/connection/HdmiConnection.cpp new file mode 100644 index 0000000..9bd6c57 --- /dev/null +++ b/hdmi/connection/HdmiConnection.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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.tv.hdmi.connection-service.opi" + +#include "HdmiConnection.h" + +#include +#include + +using android::base::ReadFileToString; +using ndk::ScopedAStatus; +using std::string; + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace connection { +namespace implementation { + +static const string drmCard = "card0"; + +HdmiConnection::HdmiConnection() { + mCallback = nullptr; + + for (int i = 0; i < 2; i++) { + mPortInfos.push_back( + {.type = HdmiPortType::OUTPUT, + .portId = i, + .cecSupported = true, + .arcSupported = false, + .eArcSupported = false, + .physicalAddress = 0xFFFF}); + mHpdSignal.push_back(HpdSignal::HDMI_HPD_PHYSICAL); + } +} + +HdmiConnection::~HdmiConnection() { + if (mCallback != nullptr) { + mCallback = nullptr; + } +} + +ScopedAStatus HdmiConnection::getPortInfo(std::vector* _aidl_return) { + *_aidl_return = mPortInfos; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiConnection::isConnected(int32_t portId, bool* _aidl_return) { + if (portId != 0 && portId != 1) { + *_aidl_return = false; + return ScopedAStatus::ok(); + } + + bool connected = false; + string hdmiStatusPath = "/sys/class/drm/" + drmCard + "-HDMI-A-" + to_string(portId + 1) + "/status"; + if (!access(hdmiStatusPath.c_str(), R_OK)) { + string connectedValue; + if (ReadFileToString(hdmiStatusPath, &connectedValue)) { + connected = !connectedValue.compare("connected\n"); + } + } + LOG(INFO) << "portId: " << portId << ", connected: " << connected; + + *_aidl_return = connected; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiConnection::setCallback(const std::shared_ptr& callback) { + if (mCallback != nullptr) { + mCallback = nullptr; + } + + if (callback != nullptr) { + mCallback = callback; + } + + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiConnection::setHpdSignal(HpdSignal signal, int32_t portId) { + if (portId != 0 && portId != 1) { + return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } + + mHpdSignal.at(portId) = signal; + return ScopedAStatus::ok(); +} + +ScopedAStatus HdmiConnection::getHpdSignal(int32_t portId, HpdSignal* _aidl_return) { + if (portId != 0 && portId != 1) { + return ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } + + *_aidl_return = mHpdSignal.at(portId); + return ScopedAStatus::ok(); +} + +} // namespace implementation +} // namespace connection +} // namespace hdmi +} // namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/connection/HdmiConnection.h b/hdmi/connection/HdmiConnection.h new file mode 100644 index 0000000..716b9da --- /dev/null +++ b/hdmi/connection/HdmiConnection.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 +#include +#include +#include + +using namespace std; + +namespace android { +namespace hardware { +namespace tv { +namespace hdmi { +namespace connection { +namespace implementation { + +using ::aidl::android::hardware::tv::hdmi::connection::BnHdmiConnection; +using ::aidl::android::hardware::tv::hdmi::connection::HdmiPortInfo; +using ::aidl::android::hardware::tv::hdmi::connection::HdmiPortType; +using ::aidl::android::hardware::tv::hdmi::connection::HpdSignal; +using ::aidl::android::hardware::tv::hdmi::connection::IHdmiConnection; +using ::aidl::android::hardware::tv::hdmi::connection::IHdmiConnectionCallback; +using ::aidl::android::hardware::tv::hdmi::connection::Result; + +struct HdmiConnection : public BnHdmiConnection { + HdmiConnection(); + ~HdmiConnection(); + ::ndk::ScopedAStatus getPortInfo(std::vector* _aidl_return) override; + ::ndk::ScopedAStatus isConnected(int32_t portId, bool* _aidl_return) override; + ::ndk::ScopedAStatus setCallback( + const std::shared_ptr& callback) override; + ::ndk::ScopedAStatus setHpdSignal(HpdSignal signal, int32_t portId) override; + ::ndk::ScopedAStatus getHpdSignal(int32_t portId, HpdSignal* _aidl_return) override; + + private: + std::vector mPortInfos; + std::vector mHpdSignal; + + std::shared_ptr mCallback; +}; + +} // namespace implementation +} // namespace connection +} // namespace hdmi +} // Namespace tv +} // namespace hardware +} // namespace android diff --git a/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.rc b/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.rc new file mode 100644 index 0000000..70c4ed2 --- /dev/null +++ b/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.rc @@ -0,0 +1,5 @@ +service vendor.hdmi-opi /apex/com.android.hardware.tv.hdmi.connection.opi5/bin/hw/android.hardware.tv.hdmi.connection-service.opi + interface aidl android.hardware.tv.hdmi.connection.IHdmiConnection/default + class hal + user system + group system diff --git a/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.xml b/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.xml new file mode 100644 index 0000000..144fef1 --- /dev/null +++ b/hdmi/connection/android.hardware.tv.hdmi.connection-service.opi.xml @@ -0,0 +1,10 @@ + + + android.hardware.tv.hdmi.connection + 1 + + IHdmiConnection + default + + + diff --git a/hdmi/connection/apex_file_contexts b/hdmi/connection/apex_file_contexts new file mode 100644 index 0000000..5dc54c7 --- /dev/null +++ b/hdmi/connection/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.tv\.hdmi\.connection-service\.opi u:object_r:hal_tv_hdmi_connection_default_exec:s0 diff --git a/hdmi/connection/apex_manifest.json b/hdmi/connection/apex_manifest.json new file mode 100644 index 0000000..0733781 --- /dev/null +++ b/hdmi/connection/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.tv.hdmi.connection.opi5", + "version": 1 +} diff --git a/hdmi/connection/main.cpp b/hdmi/connection/main.cpp new file mode 100644 index 0000000..2b1f991 --- /dev/null +++ b/hdmi/connection/main.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 "HdmiConnection.h" + +#include +#include +#include + +using android::hardware::tv::hdmi::connection::implementation::HdmiConnection; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + + std::shared_ptr hdmiAidl = ndk::SharedRefBase::make(); + const std::string instance = std::string() + HdmiConnection::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(hdmiAidl->asBinder().get(), instance.c_str()); + CHECK_EQ(status, STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/health/Android.bp b/health/Android.bp new file mode 100644 index 0000000..e089055 --- /dev/null +++ b/health/Android.bp @@ -0,0 +1,59 @@ +// Copyright (C) 2018 The Android Open Source Project +// Copyright (C) 2023 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.health-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "HealthImpl.cpp", + "main.cpp", + ], + static_libs: [ + "libbatterymonitor", + "libhealth_aidl_impl", + "libhealthloop", + ], + shared_libs: [ + "android.hardware.health-V4-ndk", + "libbase", + "libbinder_ndk", + "libcutils", + "liblog", + "libutils", + ], + overrides: ["charger"], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.health-service.opi.rc", + src: "android.hardware.health-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.health-service.opi.xml", + src: "android.hardware.health-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.health.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.health-service.opi"], + prebuilts: [ + "android.hardware.health-service.opi.rc", + "android.hardware.health-service.opi.xml", + ], +} diff --git a/health/HealthImpl.cpp b/health/HealthImpl.cpp new file mode 100644 index 0000000..44c7077 --- /dev/null +++ b/health/HealthImpl.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 "HealthImpl.h" + +using ::aidl::android::hardware::health::BatteryHealth; +using ::aidl::android::hardware::health::BatteryStatus; +using ::aidl::android::hardware::health::HealthInfo; + +namespace aidl::android::hardware::health { + +void HealthImpl::UpdateHealthInfo(HealthInfo* health_info) { + health_info->chargerAcOnline = true; + health_info->chargerUsbOnline = true; + health_info->chargerWirelessOnline = false; + health_info->chargerDockOnline = false; + health_info->maxChargingCurrentMicroamps = 500000; + health_info->maxChargingVoltageMicrovolts = 5000000; + health_info->batteryStatus = BatteryStatus::FULL; + health_info->batteryHealth = BatteryHealth::GOOD; + health_info->batteryPresent = true; + health_info->batteryLevel = 100; + health_info->batteryVoltageMillivolts = 5000; + health_info->batteryTemperatureTenthsCelsius = 250; + health_info->batteryCurrentMicroamps = 500000; + health_info->batteryCycleCount = 25; + health_info->batteryFullChargeUah = 5000000; + health_info->batteryChargeCounterUah = 5000000; + health_info->batteryTechnology = "Li-ion"; + health_info->batteryCapacityLevel = BatteryCapacityLevel::FULL; + health_info->batteryFullChargeDesignCapacityUah = 5000000; +} + +ndk::ScopedAStatus HealthImpl::getChargeCounterUah(int32_t* out) { + *out = 5000000; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus HealthImpl::getCurrentNowMicroamps(int32_t* out) { + *out = 500000; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus HealthImpl::getCurrentAverageMicroamps(int32_t*) { + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus HealthImpl::getCapacity(int32_t* out) { + *out = 100; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus HealthImpl::getChargeStatus(BatteryStatus* out) { + *out = BatteryStatus::FULL; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus HealthImpl::getBatteryHealthData(BatteryHealthData* out) { + out->batteryManufacturingDateSeconds = 1231006505; + out->batteryFirstUsageSeconds = 1231469665; + out->batteryStateOfHealth = 99; + out->batterySerialNumber = + "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"; + out->batteryPartStatus = BatteryPartStatus::ORIGINAL; + return ndk::ScopedAStatus::ok(); +} + +} // namespace aidl::android::hardware::health diff --git a/health/HealthImpl.h b/health/HealthImpl.h new file mode 100644 index 0000000..cdad615 --- /dev/null +++ b/health/HealthImpl.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 + +using ::aidl::android::hardware::health::Health; + +namespace aidl::android::hardware::health { + +class HealthImpl : public Health { +public: + using Health::Health; + virtual ~HealthImpl() {} + + ndk::ScopedAStatus getChargeCounterUah(int32_t* out) override; + ndk::ScopedAStatus getCurrentNowMicroamps(int32_t* out) override; + ndk::ScopedAStatus getCurrentAverageMicroamps(int32_t* out) override; + ndk::ScopedAStatus getCapacity(int32_t* out) override; + ndk::ScopedAStatus getChargeStatus(BatteryStatus* out) override; + ndk::ScopedAStatus getBatteryHealthData(BatteryHealthData* out) override; + +protected: + void UpdateHealthInfo(HealthInfo* health_info) override; +}; + +} // namespace aidl::android::hardware::health diff --git a/health/android.hardware.health-service.opi.rc b/health/android.hardware.health-service.opi.rc new file mode 100644 index 0000000..493b9fd --- /dev/null +++ b/health/android.hardware.health-service.opi.rc @@ -0,0 +1,6 @@ +service vendor.health-opi /apex/com.android.hardware.health.opi5/bin/hw/android.hardware.health-service.opi + class hal + user system + group system + capabilities WAKE_ALARM BLOCK_SUSPEND + file /dev/kmsg w diff --git a/health/android.hardware.health-service.opi.xml b/health/android.hardware.health-service.opi.xml new file mode 100644 index 0000000..8ddfbda --- /dev/null +++ b/health/android.hardware.health-service.opi.xml @@ -0,0 +1,7 @@ + + + android.hardware.health + 4 + IHealth/default + + diff --git a/health/apex_file_contexts b/health/apex_file_contexts new file mode 100644 index 0000000..07c184d --- /dev/null +++ b/health/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.health-service\.opi u:object_r:hal_health_default_exec:s0 diff --git a/health/apex_manifest.json b/health/apex_manifest.json new file mode 100644 index 0000000..6d240e7 --- /dev/null +++ b/health/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.health.opi5", + "version": 1 +} diff --git a/health/main.cpp b/health/main.cpp new file mode 100644 index 0000000..877780e --- /dev/null +++ b/health/main.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 "HealthImpl.h" + +#include +#include + +using ::aidl::android::hardware::health::HalHealthLoop; +using ::aidl::android::hardware::health::HealthImpl; + +int main() { + auto config = std::make_unique(); + android::hardware::health::InitHealthdConfig(config.get()); + auto binder = ndk::SharedRefBase::make("default", std::move(config)); + auto hal_health_loop = std::make_shared(binder, binder); + return hal_health_loop->StartLoop(); +} diff --git a/keylayout/Generic.kl b/keylayout/Generic.kl new file mode 100644 index 0000000..697fd1f --- /dev/null +++ b/keylayout/Generic.kl @@ -0,0 +1,501 @@ +# Copyright (C) 2010 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. + +# +# Generic key layout file for full alphabetic US English PC style external keyboards. +# +# This file is intentionally very generic and is intended to support a broad range of keyboards. +# Do not edit the generic key layout to support a specific keyboard; instead, create +# a new key layout file with the required keyboard configuration. +# + +key 1 ESCAPE +key 2 1 +key 3 2 +key 4 3 +key 5 4 +key 6 5 +key 7 6 +key 8 7 +key 9 8 +key 10 9 +key 11 0 +key 12 MINUS +key 13 EQUALS +key 14 DEL +key 15 TAB +key 16 Q +key 17 W +key 18 E +key 19 R +key 20 T +key 21 Y +key 22 U +key 23 I +key 24 O +key 25 P +key 26 LEFT_BRACKET +key 27 RIGHT_BRACKET +key 28 ENTER +key 29 CTRL_LEFT +key 30 A +key 31 S +key 32 D +key 33 F +key 34 G +key 35 H +key 36 J +key 37 K +key 38 L +key 39 SEMICOLON +key 40 APOSTROPHE +key 41 GRAVE +key 42 SHIFT_LEFT +key 43 BACKSLASH +key 44 Z +key 45 X +key 46 C +key 47 V +key 48 B +key 49 N +key 50 M +key 51 COMMA +key 52 PERIOD +key 53 SLASH +key 54 SHIFT_RIGHT +key 55 NUMPAD_MULTIPLY +key 56 ALT_LEFT +key 57 SPACE +key 58 CAPS_LOCK +key 59 F1 +key 60 F2 +key 61 F3 +key 62 F4 +key 63 F5 +key 64 F6 +key 65 F7 +key 66 F8 +key 67 F9 +key 68 F10 +key 69 NUM_LOCK +key 70 SCROLL_LOCK +key 71 NUMPAD_7 +key 72 NUMPAD_8 +key 73 NUMPAD_9 +key 74 NUMPAD_SUBTRACT +key 75 NUMPAD_4 +key 76 NUMPAD_5 +key 77 NUMPAD_6 +key 78 NUMPAD_ADD +key 79 NUMPAD_1 +key 80 NUMPAD_2 +key 81 NUMPAD_3 +key 82 NUMPAD_0 +key 83 NUMPAD_DOT +# key 84 (undefined) +key 85 ZENKAKU_HANKAKU +key 86 BACKSLASH +key 87 F11 +key 88 F12 +key 89 RO +# key 90 "KEY_KATAKANA" +# key 91 "KEY_HIRAGANA" +key 92 HENKAN +key 93 KATAKANA_HIRAGANA +key 94 MUHENKAN +key 95 NUMPAD_COMMA +key 96 NUMPAD_ENTER +key 97 CTRL_RIGHT +key 98 NUMPAD_DIVIDE +key 99 SYSRQ +key 100 ALT_RIGHT +# key 101 "KEY_LINEFEED" +key 102 MOVE_HOME +key 103 DPAD_UP +key 104 PAGE_UP +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 107 MOVE_END +key 108 DPAD_DOWN +key 109 PAGE_DOWN +key 110 INSERT +key 111 FORWARD_DEL +# key 112 "KEY_MACRO" +key 113 VOLUME_MUTE +key 114 VOLUME_DOWN +key 115 VOLUME_UP +key 116 POWER +key 117 NUMPAD_EQUALS +# key 118 "KEY_KPPLUSMINUS" +key 119 BREAK +key 120 RECENT_APPS +key 121 NUMPAD_COMMA +key 122 KANA +key 123 EISU +key 124 YEN +key 125 META_LEFT +key 126 META_RIGHT +key 127 MENU +key 128 MEDIA_STOP +# key 129 "KEY_AGAIN" +# key 130 "KEY_PROPS" +# key 131 "KEY_UNDO" +# key 132 "KEY_FRONT" +key 133 COPY +# key 134 "KEY_OPEN" +key 135 PASTE +# key 136 "KEY_FIND" +key 137 CUT +# key 138 "KEY_HELP" +key 139 MENU +key 140 CALCULATOR +# key 141 "KEY_SETUP" +key 142 SLEEP +key 143 WAKEUP +# key 144 "KEY_FILE" +# key 145 "KEY_SENDFILE" +# key 146 "KEY_DELETEFILE" +# key 147 "KEY_XFER" +# key 148 "KEY_PROG1" +# key 149 "KEY_PROG2" +key 150 EXPLORER +# key 151 "KEY_MSDOS" +key 152 LOCK +# key 153 "KEY_DIRECTION" +# key 154 "KEY_CYCLEWINDOWS" +key 155 ENVELOPE +key 156 BOOKMARK +# key 157 "KEY_COMPUTER" +key 158 BACK +key 159 FORWARD +key 160 MEDIA_CLOSE +key 161 MEDIA_EJECT +key 162 MEDIA_EJECT +key 163 MEDIA_NEXT +key 164 MEDIA_PLAY_PAUSE +key 165 MEDIA_PREVIOUS +key 166 MEDIA_STOP +key 167 MEDIA_RECORD +key 168 MEDIA_REWIND +key 169 CALL +# key 170 "KEY_ISO" +key 171 MUSIC +key 172 HOME +key 173 REFRESH +# key 174 "KEY_EXIT" +# key 175 "KEY_MOVE" +# key 176 "KEY_EDIT" +key 177 PAGE_UP +key 178 PAGE_DOWN +key 179 NUMPAD_LEFT_PAREN +key 180 NUMPAD_RIGHT_PAREN +key 181 NEW +# key 182 "KEY_REDO" +key 183 F13 +key 184 F14 +key 185 F15 +key 186 F16 +key 187 F17 +key 188 F18 +key 189 F19 +key 190 F20 +key 191 F21 +key 192 F22 +key 193 F23 +key 194 F24 +# key 195 (undefined) +# key 196 (undefined) +# key 197 (undefined) +# key 198 (undefined) +# key 199 (undefined) +key 200 MEDIA_PLAY +key 201 MEDIA_PAUSE +# key 202 "KEY_PROG3" +# key 203 "KEY_PROG4" +key 204 NOTIFICATION +# key 205 "KEY_SUSPEND" +key 206 CLOSE +key 207 MEDIA_PLAY +key 208 MEDIA_FAST_FORWARD +# key 209 "KEY_BASSBOOST" +key 210 PRINT +# key 211 "KEY_HP" +key 212 CAMERA +key 213 MUSIC +# key 214 "KEY_QUESTION" +key 215 ENVELOPE +# key 216 "KEY_CHAT" +key 217 SEARCH +# key 218 "KEY_CONNECT" +# key 219 "KEY_FINANCE" +# key 220 "KEY_SPORT" +# key 221 "KEY_SHOP" +# key 222 "KEY_ALTERASE" +# key 223 "KEY_CANCEL" +key 224 BRIGHTNESS_DOWN +key 225 BRIGHTNESS_UP +key 226 HEADSETHOOK +key 228 KEYBOARD_BACKLIGHT_TOGGLE +key 229 KEYBOARD_BACKLIGHT_DOWN +key 230 KEYBOARD_BACKLIGHT_UP +key 248 MUTE + +key 256 BUTTON_1 +key 257 BUTTON_2 +key 258 BUTTON_3 +key 259 BUTTON_4 +key 260 BUTTON_5 +key 261 BUTTON_6 +key 262 BUTTON_7 +key 263 BUTTON_8 +key 264 BUTTON_9 +key 265 BUTTON_10 +key 266 BUTTON_11 +key 267 BUTTON_12 +key 268 BUTTON_13 +key 269 BUTTON_14 +key 270 BUTTON_15 +key 271 BUTTON_16 + +key 288 BUTTON_1 +key 289 BUTTON_2 +key 290 BUTTON_3 +key 291 BUTTON_4 +key 292 BUTTON_5 +key 293 BUTTON_6 +key 294 BUTTON_7 +key 295 BUTTON_8 +key 296 BUTTON_9 +key 297 BUTTON_10 +key 298 BUTTON_11 +key 299 BUTTON_12 +key 300 BUTTON_13 +key 301 BUTTON_14 +key 302 BUTTON_15 +key 303 BUTTON_16 + + +key 304 BUTTON_A +key 305 BUTTON_B +key 306 BUTTON_C +key 307 BUTTON_X +key 308 BUTTON_Y +key 309 BUTTON_Z +key 310 BUTTON_L1 +key 311 BUTTON_R1 +key 312 BUTTON_L2 +key 313 BUTTON_R2 +key 314 BUTTON_SELECT +key 315 BUTTON_START +key 316 BUTTON_MODE +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + + +key 329 STYLUS_BUTTON_TERTIARY +key 331 STYLUS_BUTTON_PRIMARY +key 332 STYLUS_BUTTON_SECONDARY + + +# key 352 "KEY_OK" +key 353 DPAD_CENTER +# key 354 "KEY_GOTO" +# key 355 "KEY_CLEAR" +# key 356 "KEY_POWER2" +# key 357 "KEY_OPTION" +# key 358 "KEY_INFO" +# key 359 "KEY_TIME" +# key 360 "KEY_VENDOR" +# key 361 "KEY_ARCHIVE" +key 362 GUIDE +# key 363 "KEY_CHANNEL" +# key 364 "KEY_FAVORITES" +# key 365 "KEY_EPG" +key 366 DVR +# key 367 "KEY_MHP" +key 368 LANGUAGE_SWITCH +# key 369 "KEY_TITLE" +key 370 CAPTIONS +# key 371 "KEY_ANGLE" +key 372 FULLSCREEN +# key 373 "KEY_MODE" +# key 374 "KEY_KEYBOARD" +# key 375 "KEY_SCREEN" +# key 376 "KEY_PC" +key 377 TV +# key 378 "KEY_TV2" +# key 379 "KEY_VCR" +# key 380 "KEY_VCR2" +# key 381 "KEY_SAT" +# key 382 "KEY_SAT2" +# key 383 "KEY_CD" +# key 384 "KEY_TAPE" +# key 385 "KEY_RADIO" +# key 386 "KEY_TUNER" +# key 387 "KEY_PLAYER" +# key 388 "KEY_TEXT" +# key 389 "KEY_DVD" +# key 390 "KEY_AUX" +# key 391 "KEY_MP3" +# key 392 "KEY_AUDIO" +# key 393 "KEY_VIDEO" +# key 394 "KEY_DIRECTORY" +# key 395 "KEY_LIST" +# key 396 "KEY_MEMO" +key 397 CALENDAR +key 398 PROG_RED +key 399 PROG_GREEN +key 400 PROG_YELLOW +key 401 PROG_BLUE +key 402 CHANNEL_UP +key 403 CHANNEL_DOWN +# key 404 "KEY_FIRST" +key 405 LAST_CHANNEL +# key 406 "KEY_AB" +# key 407 "KEY_NEXT" +# key 408 "KEY_RESTART" +# key 409 "KEY_SLOW" +# key 410 "KEY_SHUFFLE" +# key 411 "KEY_BREAK" +# key 412 "KEY_PREVIOUS" +# key 413 "KEY_DIGITS" +# key 414 "KEY_TEEN" +# key 415 "KEY_TWEN" +# key 418 "KEY_ZOOM_IN" +key 418 ZOOM_IN +# key 419 "KEY_ZOOM_OUT" +key 419 ZOOM_OUT +key 528 FOCUS + +key 429 CONTACTS + +# key 448 "KEY_DEL_EOL" +# key 449 "KEY_DEL_EOS" +# key 450 "KEY_INS_LINE" +# key 451 "KEY_DEL_LINE" + + +key 464 FUNCTION +key 465 ESCAPE FUNCTION +key 466 F1 FUNCTION +key 467 F2 FUNCTION +key 468 F3 FUNCTION +key 469 F4 FUNCTION +key 470 F5 FUNCTION +key 471 F6 FUNCTION +key 472 F7 FUNCTION +key 473 F8 FUNCTION +key 474 F9 FUNCTION +key 475 F10 FUNCTION +key 476 F11 FUNCTION +key 477 F12 FUNCTION +key 478 1 FUNCTION +key 479 2 FUNCTION +key 480 D FUNCTION +key 481 E FUNCTION +key 482 F FUNCTION +key 483 S FUNCTION +key 484 B FUNCTION + + +# key 497 KEY_BRL_DOT1 +# key 498 KEY_BRL_DOT2 +# key 499 KEY_BRL_DOT3 +# key 500 KEY_BRL_DOT4 +# key 501 KEY_BRL_DOT5 +# key 502 KEY_BRL_DOT6 +# key 503 KEY_BRL_DOT7 +# key 504 KEY_BRL_DOT8 + +key 522 STAR +key 523 POUND +key 580 APP_SWITCH +key 582 VOICE_ASSIST +# Linux KEY_ASSISTANT +key 583 ASSIST +key 585 EMOJI_PICKER +key 586 DICTATE +key 591 DO_NOT_DISTURB +key 656 MACRO_1 +key 657 MACRO_2 +key 658 MACRO_3 +key 659 MACRO_4 + +# CEC +key 352 ENTER +key 618 HOME +key 141 POWER +key 174 BACK + +# Keys defined by HID usages +key usage 0x0c0065 SCREENSHOT FALLBACK_USAGE_MAPPING +key usage 0x0c0067 WINDOW FALLBACK_USAGE_MAPPING +key usage 0x0c006F BRIGHTNESS_UP FALLBACK_USAGE_MAPPING +key usage 0x0c0070 BRIGHTNESS_DOWN FALLBACK_USAGE_MAPPING +key usage 0x0c0079 KEYBOARD_BACKLIGHT_UP FALLBACK_USAGE_MAPPING +key usage 0x0c007A KEYBOARD_BACKLIGHT_DOWN FALLBACK_USAGE_MAPPING +key usage 0x0c007C KEYBOARD_BACKLIGHT_TOGGLE FALLBACK_USAGE_MAPPING +key usage 0x0c00D8 DICTATE FALLBACK_USAGE_MAPPING +key usage 0x0c00D9 EMOJI_PICKER FALLBACK_USAGE_MAPPING +key usage 0x0c0173 MEDIA_AUDIO_TRACK FALLBACK_USAGE_MAPPING +key usage 0x0c019C PROFILE_SWITCH FALLBACK_USAGE_MAPPING +key usage 0x0c019F SETTINGS FALLBACK_USAGE_MAPPING +key usage 0x0c01A2 ALL_APPS FALLBACK_USAGE_MAPPING +key usage 0x0c0201 NEW FALLBACK_USAGE_MAPPING +key usage 0x0c0203 CLOSE FALLBACK_USAGE_MAPPING +key usage 0x0c0208 PRINT FALLBACK_USAGE_MAPPING +key usage 0x0c0227 REFRESH FALLBACK_USAGE_MAPPING +key usage 0x0c0232 FULLSCREEN FALLBACK_USAGE_MAPPING +key usage 0x0c029D LANGUAGE_SWITCH FALLBACK_USAGE_MAPPING +key usage 0x0c029F RECENT_APPS FALLBACK_USAGE_MAPPING +key usage 0x0c02A2 ALL_APPS FALLBACK_USAGE_MAPPING +key usage 0x0d0044 STYLUS_BUTTON_PRIMARY FALLBACK_USAGE_MAPPING +key usage 0x0d005a STYLUS_BUTTON_SECONDARY FALLBACK_USAGE_MAPPING + +# Joystick and game controller axes. +# Axes that are not mapped will be assigned generic axis numbers by the input subsystem. +axis 0x00 X +axis 0x01 Y +axis 0x02 Z +axis 0x03 RX +axis 0x04 RY +axis 0x05 RZ +axis 0x06 THROTTLE +axis 0x07 RUDDER +axis 0x08 WHEEL +axis 0x09 RTRIGGER +axis 0x0a LTRIGGER +axis 0x10 HAT_X +axis 0x11 HAT_Y + +# LEDs +led 0x00 NUM_LOCK +led 0x01 CAPS_LOCK +led 0x02 SCROLL_LOCK +led 0x03 COMPOSE +led 0x04 KANA +led 0x05 SLEEP +led 0x06 SUSPEND +led 0x07 MUTE +led 0x08 MISC +led 0x09 MAIL +led 0x0a CHARGING + +# SENSORs +sensor 0x00 ACCELEROMETER X +sensor 0x01 ACCELEROMETER Y +sensor 0x02 ACCELEROMETER Z +sensor 0x03 GYROSCOPE X +sensor 0x04 GYROSCOPE Y +sensor 0x05 GYROSCOPE Z diff --git a/light/Android.bp b/light/Android.bp new file mode 100644 index 0000000..79535e8 --- /dev/null +++ b/light/Android.bp @@ -0,0 +1,50 @@ +// Copyright (C) 2020 The Android Open Source Project +// Copyright (C) 2023 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.light-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "Lights.cpp", + "main.cpp", + ], + shared_libs: [ + "android.hardware.light-V2-ndk", + "libbase", + "libbinder_ndk", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.light-service.opi.rc", + src: "android.hardware.light-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.light-service.opi.xml", + src: "android.hardware.light-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.light.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.light-service.opi"], + prebuilts: [ + "android.hardware.light-service.opi.rc", + "android.hardware.light-service.opi.xml", + ], +} diff --git a/light/Lights.cpp b/light/Lights.cpp new file mode 100644 index 0000000..f4e3d65 --- /dev/null +++ b/light/Lights.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 "Lights.h" + +#include + +using ::android::base::ReadFileToString; +using ::android::base::WriteStringToFile; + +namespace aidl::android::hardware::light { + +static const uint32_t defaultMaxBrightness = 255; + +static const std::string backlightBrightnessPath = "/sys/class/backlight/11-0045/brightness"; +static const std::string backlightMaxBrightnessPath = "/sys/class/backlight/11-0045/max_brightness"; + +static const std::vector availableLights = { + {.id = (int)LightType::BACKLIGHT, .type = LightType::BACKLIGHT, .ordinal = 0} +}; + +Lights::Lights() { + maxBrightness = defaultMaxBrightness; + + if (!access(backlightMaxBrightnessPath.c_str(), R_OK)) { + std::string maxBrightnessValue; + if (ReadFileToString(backlightMaxBrightnessPath, &maxBrightnessValue)) { + maxBrightness = std::stoi(maxBrightnessValue); + } + } +} + +ndk::ScopedAStatus Lights::setLightState(int id, const HwLightState& state) { + HwLight const& light = availableLights[id]; + std::string const brightness = std::to_string(rgbToScaledBrightness(state, maxBrightness)); + + switch (light.type) { + case LightType::BACKLIGHT: + if (!access(backlightBrightnessPath.c_str(), W_OK)) { + WriteStringToFile(brightness, backlightBrightnessPath); + } + break; + default: + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); + } + + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Lights::getLights(std::vector* lights) { + for (auto i = availableLights.begin(); i != availableLights.end(); i++) { + lights->push_back(*i); + } + + return ndk::ScopedAStatus::ok(); +} + +uint32_t Lights::rgbToScaledBrightness(const HwLightState& state, uint32_t maxBrightness) { + uint32_t color = state.color & 0x00ffffff; + uint32_t brightness = ((77 * ((color >> 16) & 0xff)) + (150 * ((color >> 8) & 0xff)) + + (29 * (color & 0xff))) >> 8; + return brightness * maxBrightness / 0xff; +} + +} // aidl::android::hardware::light diff --git a/light/Lights.h b/light/Lights.h new file mode 100644 index 0000000..dc44ac6 --- /dev/null +++ b/light/Lights.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2023 KonstaKANG + * + * 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 + +namespace aidl::android::hardware::light { + +class Lights : public BnLights { +public: + Lights(); + + ndk::ScopedAStatus setLightState(int id, const HwLightState& state) override; + ndk::ScopedAStatus getLights(std::vector* types) override; + +private: + uint32_t maxBrightness; + uint32_t rgbToScaledBrightness(const HwLightState& state, uint32_t maxBrightness); +}; + +} // aidl::android::hardware::light diff --git a/light/android.hardware.light-service.opi.rc b/light/android.hardware.light-service.opi.rc new file mode 100644 index 0000000..22a5d77 --- /dev/null +++ b/light/android.hardware.light-service.opi.rc @@ -0,0 +1,11 @@ +on early-boot + chown system system /sys/class/backlight/11-0045/brightness + chown system system /sys/class/backlight/11-0045/max_brightness + chmod 660 /sys/class/backlight/11-0045/brightness + chmod 440 /sys/class/backlight/11-0045/max_brightness + +service vendor.light-opi /apex/com.android.hardware.light.opi5/bin/hw/android.hardware.light-service.opi + class hal + user system + group system + shutdown critical diff --git a/light/android.hardware.light-service.opi.xml b/light/android.hardware.light-service.opi.xml new file mode 100644 index 0000000..abdd74e --- /dev/null +++ b/light/android.hardware.light-service.opi.xml @@ -0,0 +1,7 @@ + + + android.hardware.light + 2 + ILights/default + + diff --git a/light/apex_file_contexts b/light/apex_file_contexts new file mode 100644 index 0000000..857bb7d --- /dev/null +++ b/light/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.light-service\.opi u:object_r:hal_light_default_exec:s0 diff --git a/light/apex_manifest.json b/light/apex_manifest.json new file mode 100644 index 0000000..1cc6879 --- /dev/null +++ b/light/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.light.opi5", + "version": 1 +} diff --git a/light/main.cpp b/light/main.cpp new file mode 100644 index 0000000..d4ed632 --- /dev/null +++ b/light/main.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2025 KonstaKANG + * + * 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 "Lights.h" + +#include +#include +#include + +using ::aidl::android::hardware::light::Lights; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr lights = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + Lights::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(lights->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/lineage_orangepi5ultra.mk b/lineage_orangepi5ultra.mk new file mode 100644 index 0000000..e6ab18a --- /dev/null +++ b/lineage_orangepi5ultra.mk @@ -0,0 +1,47 @@ +# +# Copyright (C) 2021-2023 KonstaKANG +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# Copyright (C) 2026 Brendan Szymanski +# +# SPDX-License-Identifier: Apache-2.0 +# + +# Inherit device configuration +$(call inherit-product, device/rockchip/orangepi5ultra/device.mk) + +PRODUCT_AAPT_PREF_CONFIG := tvdpi +PRODUCT_CHARACTERISTICS := tv + +# LineageOS ATV base +$(call inherit-product, device/lineage/atv/lineage_atv.mk) +$(call inherit-product, vendor/lineage/build/target/product/lineage_generic_tv_target.mk) + +# Android TV packages +PRODUCT_PACKAGES += \ + DocumentsUI \ + LeanbackIME \ + TvProvision \ + TvSettingsTwoPanel \ + Catapult + +# Bluetooth TV class +PRODUCT_VENDOR_PROPERTIES += \ + bluetooth.device.class_of_device=34,4,36 + +# Boot animation +PRODUCT_COPY_FILES += \ + device/google/atv/products/bootanimations/bootanimation.zip:$(TARGET_COPY_OUT_SYSTEM)/media/bootanimation.zip + +# Overlays +PRODUCT_PACKAGES += \ + AndroidTvOpiOverlay \ + BluetoothOpiOverlay \ + SettingsProviderTvOpiOverlay \ + WifiOpiOverlay + +# Device identifier. This must come after all inclusions. +PRODUCT_DEVICE := orangepi5ultra +PRODUCT_NAME := lineage_orangepi5ultra +PRODUCT_BRAND := Orange +PRODUCT_MODEL := Pi 5 Ultra +PRODUCT_MANUFACTURER := Orange diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..fcf2f80 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,37 @@ + + + android.hardware.audio + hwbinder + 7.1 + + IDevicesFactory + default + + + + android.hardware.audio.effect + hwbinder + 7.0 + + IEffectsFactory + default + + + + android.hardware.camera.provider + 1 + + ICameraProvider + external/0 + + + + android.hardware.camera.provider + hwbinder + 2.5 + + ICameraProvider + legacy/0 + + + diff --git a/media/media_codecs.xml b/media/media_codecs.xml new file mode 100644 index 0000000..9165b42 --- /dev/null +++ b/media/media_codecs.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/media/media_codecs_ffmpeg_c2.xml b/media/media_codecs_ffmpeg_c2.xml new file mode 100644 index 0000000..34c9f5d --- /dev/null +++ b/media/media_codecs_ffmpeg_c2.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/media_codecs_v4l2_c2_video.xml b/media/media_codecs_v4l2_c2_video.xml new file mode 100644 index 0000000..f29fe82 --- /dev/null +++ b/media/media_codecs_v4l2_c2_video.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mkbootimg.mk b/mkbootimg.mk new file mode 100644 index 0000000..d0b01b2 --- /dev/null +++ b/mkbootimg.mk @@ -0,0 +1,41 @@ +# +# Copyright (C) 2021-2022 KonstaKANG +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# +# SPDX-License-Identifier: Apache-2.0 +# + +DEVICE_PATH := device/rockchip/orangepi5ultra +KERNEL_PATH := device/rockchip/orangepi5ultra-kernel + +OPI_BOOT_OUT := $(PRODUCT_OUT)/opiboot +$(OPI_BOOT_OUT): $(INSTALLED_RAMDISK_TARGET) + mkdir -p $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/Image $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588s-orangepi-5-pro-1.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588-orangepi-5-max.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588-orangepi-5-plus.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588-orangepi-5-ultra.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588s-orangepi-5.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/rk3588s-orangepi-5b.dtb $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/android-sdcard.dtbo $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/boot.scr $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/uRamdisk $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/uRecovery $(OPI_BOOT_OUT) + cp $(PRODUCT_OUT)/ramdisk.img $(OPI_BOOT_OUT) + cp $(KERNEL_PATH)/config.txt $(OPI_BOOT_OUT) + + +$(INSTALLED_BOOTIMAGE_TARGET): $(OPI_BOOT_OUT) + $(call pretty,"Target boot image: $@") + + # Determine size in bytes, add 10 MiB padding, convert to 512-byte blocks + BOOT_SIZE_BYTES=`du -s -k $(OPI_BOOT_OUT) | awk '{ print $$1 * 1024 }'`; \ + PADDED_BYTES=`expr $$BOOT_SIZE_BYTES + 10485760`; \ + BLOCKS=`expr $$PADDED_BYTES / 512`; \ + echo "Creating boot image with $$BLOCKS blocks..."; \ + dd if=/dev/zero of=$@ bs=512 count=$$BLOCKS; \ + mkfs.fat -F 32 -n "boot" $@; \ + mcopy -s -i $@ $(OPI_BOOT_OUT)/* :: + + diff --git a/mkimg.sh b/mkimg.sh new file mode 100755 index 0000000..4170f59 --- /dev/null +++ b/mkimg.sh @@ -0,0 +1,98 @@ + +# +# Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +# +# SPDX-License-Identifier: Apache-2.0 +# +#!/bin/bash + +exit_with_error() { + echo $@ + exit 1 +} + +# Check required env vars +if [ -z ${TARGET_PRODUCT} ]; then + exit_with_error "TARGET_PRODUCT environment variable is not set. Run lunch first." +fi + +if [ -z ${ANDROID_PRODUCT_OUT} ]; then + exit_with_error "ANDROID_PRODUCT_OUT environment variable is not set. Run lunch first." +fi + +# Check required images +for PARTITION in "boot" "system" "vendor"; do + if [ ! -f ${ANDROID_PRODUCT_OUT}/${PARTITION}.img ]; then + exit_with_error "Partition image not found: ${PARTITION}.img. Run 'make ${PARTITION}image' first." + fi +done + +UBOOT_BIN=device/rockchip/orangepi5ultra-kernel/u-boot-rockchip.bin + +if [ ! -f ${UBOOT_BIN} ]; then + exit_with_error "Missing u-boot-rockchip.bin! Make sure it's built and placed at ${UBOOT_BIN}" +fi + +VERSION=OrangePi_5Pro_aosp +DATE=$(date +%Y%m%d) +TARGET=$(echo ${TARGET_PRODUCT} | sed 's/^aosp_//') +IMGNAME=${VERSION}-${DATE}-${TARGET}.img +IMGSIZE=19456MiB + +if [ -f ${ANDROID_PRODUCT_OUT}/${IMGNAME} ]; then + exit_with_error "${ANDROID_PRODUCT_OUT}/${IMGNAME} already exists!" +fi + +echo "Creating image file ${ANDROID_PRODUCT_OUT}/${IMGNAME}..." +sudo fallocate -l ${IMGSIZE} ${ANDROID_PRODUCT_OUT}/${IMGNAME} +sync + +echo "Writing U-Boot to sector 64..." +sudo dd if=${UBOOT_BIN} of=${ANDROID_PRODUCT_OUT}/${IMGNAME} seek=64 bs=512 conv=notrunc +sync + +echo "Partitioning image using sfdisk..." +PART_TABLE=$(cat <&2 + cleanup || true + exit 1 +} + +cleanup() { + + if [ -n "${LOOPDEV:-}" ]; then + if sudo kpartx -l "${IMAGE_PATH}" >/dev/null 2>&1; then + sudo kpartx -d "${IMAGE_PATH}" || true + fi + fi +} + +trap cleanup EXIT + + +: "${TARGET_PRODUCT:?TARGET_PRODUCT environment variable is not set. Run lunch first.}" +: "${ANDROID_PRODUCT_OUT:?ANDROID_PRODUCT_OUT environment variable is not set. Run lunch first.}" + + +for PART in boot system vendor; do + if [ ! -f "${ANDROID_PRODUCT_OUT}/${PART}.img" ]; then + exit_with_error "Missing partition image: ${ANDROID_PRODUCT_OUT}/${PART}.img — run 'make ${PART}image' first." + fi +done + +UBOOT_BIN=device/rockchip/orangepi5ultra-kernel/u-boot-rockchip.bin +if [ ! -f "${UBOOT_BIN}" ]; then + exit_with_error "Missing U-Boot: ${UBOOT_BIN}" +fi + +VERSION=OrangePi_5Ultra_lineage_atv +DATE=$(date +%Y%m%d) +TARGET=$(echo "${TARGET_PRODUCT}" | sed 's/^aosp_//') +IMGNAME=${VERSION}-${DATE}-${TARGET}_gpt.img +IMGSIZE=19456MiB +IMAGE_PATH="${ANDROID_PRODUCT_OUT}/${IMGNAME}" + +if [ -f "${IMAGE_PATH}" ]; then + exit_with_error "${IMAGE_PATH} already exists!" +fi + +echo "Creating image file ${IMAGE_PATH} (${IMGSIZE})..." +sudo fallocate -l "${IMGSIZE}" "${IMAGE_PATH}" +sync + +echo "Writing U-Boot to sector 64..." +# write u-boot binary to offset 64*512 = sector 64 +sudo dd if="${UBOOT_BIN}" of="${IMAGE_PATH}" seek=64 bs=512 conv=notrunc status=progress +sync + +echo "Partitioning image using sfdisk (GPT) with explicit partition NAMES..." + + +PART_TABLE=$(cat </dev/null +E2_RC=$? +if [ "${E2_RC}" -ne 0 ]; then + echo "Warning: /dev/mapper/${LOOPDEV}p2 does not appear to be ext4 or e2label failed. Continuing." +fi +sudo e2label "/dev/mapper/${LOOPDEV}p3" vendor 2>/dev/null || echo "Warning: e2label on vendor failed (maybe not ext4)." + +set -e + +# Create/format metadata and userdata partitions and set filesystem labels +sudo mkfs.ext4 -F -L metadata "/dev/mapper/${LOOPDEV}p4" +sudo mkfs.ext4 -F -L userdata "/dev/mapper/${LOOPDEV}p5" +sync + +# Final sanity: list by-name symlinks +echo "Partition mapping summary (kpartx):" +sudo ls -l /dev/mapper/"${LOOPDEV}"* || true + +# Unmap now that we have set labels +sudo kpartx -d "${IMAGE_PATH}" || true +# fix ownership +sudo chown "${USER}:${USER}" "${IMAGE_PATH}" + +echo "✅ Created ${IMAGE_PATH} with GPT partition names and filesystem labels." +echo "You should now be able to write this image to your SD/NVMe and boot RK3588. " + + +sudo sgdisk -p "${IMAGE_PATH}" +exit 0 diff --git a/overlay/AndroidTvOpiOverlay/Android.bp b/overlay/AndroidTvOpiOverlay/Android.bp new file mode 100644 index 0000000..3f02f9c --- /dev/null +++ b/overlay/AndroidTvOpiOverlay/Android.bp @@ -0,0 +1,11 @@ +// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +runtime_resource_overlay { + name: "AndroidTvOpiOverlay", + resource_dirs: ["res"], + sdk_version: "current", + vendor: true, +} diff --git a/overlay/AndroidTvOpiOverlay/AndroidManifest.xml b/overlay/AndroidTvOpiOverlay/AndroidManifest.xml new file mode 100644 index 0000000..9e96248 --- /dev/null +++ b/overlay/AndroidTvOpiOverlay/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/overlay/AndroidTvOpiOverlay/res/values/config.xml b/overlay/AndroidTvOpiOverlay/res/values/config.xml new file mode 100644 index 0000000..1f68152 --- /dev/null +++ b/overlay/AndroidTvOpiOverlay/res/values/config.xml @@ -0,0 +1,51 @@ + + + + + + 128 + + + 20 + + + 20 + + + true + + + 1 + + + false + true + + diff --git a/overlay/BluetoothOpiOverlay/Android.bp b/overlay/BluetoothOpiOverlay/Android.bp new file mode 100644 index 0000000..b04350f --- /dev/null +++ b/overlay/BluetoothOpiOverlay/Android.bp @@ -0,0 +1,11 @@ +// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +runtime_resource_overlay { + name: "BluetoothOpiOverlay", + resource_dirs: ["res"], + sdk_version: "current", + vendor: true, +} diff --git a/overlay/BluetoothOpiOverlay/AndroidManifest.xml b/overlay/BluetoothOpiOverlay/AndroidManifest.xml new file mode 100644 index 0000000..bc5fdd3 --- /dev/null +++ b/overlay/BluetoothOpiOverlay/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/overlay/BluetoothOpiOverlay/res/values/config.xml b/overlay/BluetoothOpiOverlay/res/values/config.xml new file mode 100644 index 0000000..498890a --- /dev/null +++ b/overlay/BluetoothOpiOverlay/res/values/config.xml @@ -0,0 +1,24 @@ + + + + + + + true + + diff --git a/overlay/SettingsProviderTvOpiOverlay/Android.bp b/overlay/SettingsProviderTvOpiOverlay/Android.bp new file mode 100644 index 0000000..a0f603c --- /dev/null +++ b/overlay/SettingsProviderTvOpiOverlay/Android.bp @@ -0,0 +1,11 @@ +// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +runtime_resource_overlay { + name: "SettingsProviderTvOpiOverlay", + resource_dirs: ["res"], + sdk_version: "current", + vendor: true, +} diff --git a/overlay/SettingsProviderTvOpiOverlay/AndroidManifest.xml b/overlay/SettingsProviderTvOpiOverlay/AndroidManifest.xml new file mode 100644 index 0000000..6960baa --- /dev/null +++ b/overlay/SettingsProviderTvOpiOverlay/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/overlay/SettingsProviderTvOpiOverlay/res/values/defaults.xml b/overlay/SettingsProviderTvOpiOverlay/res/values/defaults.xml new file mode 100644 index 0000000..befb71a --- /dev/null +++ b/overlay/SettingsProviderTvOpiOverlay/res/values/defaults.xml @@ -0,0 +1,35 @@ + + + + + + + Orange Pi 5 Pro + + + 128 + + + 0 + + + true + true + + diff --git a/overlay/WifiOpiOverlay/Android.bp b/overlay/WifiOpiOverlay/Android.bp new file mode 100644 index 0000000..d2c1299 --- /dev/null +++ b/overlay/WifiOpiOverlay/Android.bp @@ -0,0 +1,11 @@ +// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +runtime_resource_overlay { + name: "WifiOpiOverlay", + resource_dirs: ["res"], + sdk_version: "current", + vendor: true, +} diff --git a/overlay/WifiOpiOverlay/AndroidManifest.xml b/overlay/WifiOpiOverlay/AndroidManifest.xml new file mode 100644 index 0000000..736acb4 --- /dev/null +++ b/overlay/WifiOpiOverlay/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/overlay/WifiOpiOverlay/res/values/config.xml b/overlay/WifiOpiOverlay/res/values/config.xml new file mode 100644 index 0000000..3a0d5f3 --- /dev/null +++ b/overlay/WifiOpiOverlay/res/values/config.xml @@ -0,0 +1,46 @@ + + + + + + + true + + + true + + + true + + + Orange Pi 5 Pro + + + + 0 + + diff --git a/product_manifest.xml b/product_manifest.xml new file mode 100644 index 0000000..c1edbba --- /dev/null +++ b/product_manifest.xml @@ -0,0 +1 @@ + diff --git a/ramdisk/fstab.opi5ultra b/ramdisk/fstab.opi5ultra new file mode 100644 index 0000000..87c0a6f --- /dev/null +++ b/ramdisk/fstab.opi5ultra @@ -0,0 +1,10 @@ +# Android fstab file. +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK + +# +/dev/block/by-name/system /system ext4 ro,barrier=1,nodelalloc wait,first_stage_mount +/dev/block/by-name/vendor /vendor ext4 ro,barrier=1,nodelalloc wait,check,first_stage_mount +/dev/block/by-name/metadata /metadata ext4 nodev,noatime,nosuid wait,check,formattable,first_stage_mount +/dev/block/by-name/userdata /data ext4 nodev,noatime,nosuid,errors=panic wait,check,formattable,quota +/devices/platform/*.usb/usb* auto auto defaults voldmanaged=usb:auto diff --git a/ramdisk/init.opi5ultra.rc b/ramdisk/init.opi5ultra.rc new file mode 100644 index 0000000..c725355 --- /dev/null +++ b/ramdisk/init.opi5ultra.rc @@ -0,0 +1,25 @@ +import /vendor/etc/init/hw/init.opi5ultra.usb.rc + +on init + symlink /sdcard /storage/sdcard0 + + +on fs + mount_all /vendor/etc/fstab.opi5ultra --early + +on late-fs + mount_all /vendor/etc/fstab.opi5ultra --late + +on boot + chmod 0666 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor + chmod 0666 /sys/devices/system/cpu/cpufreq/boost + + + diff --git a/ramdisk/init.opi5ultra.usb.rc b/ramdisk/init.opi5ultra.usb.rc new file mode 100644 index 0000000..e406934 --- /dev/null +++ b/ramdisk/init.opi5ultra.usb.rc @@ -0,0 +1,89 @@ +on boot + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/bcdDevice 0x0440 + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer "Orange pi" + write /config/usb_gadget/g1/strings/0x409/product "5 Pro" + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/ffs.mtp + mkdir /config/usb_gadget/g1/functions/ffs.ptp + mkdir /config/usb_gadget/g1/functions/accessory.gs2 + mkdir /config/usb_gadget/g1/functions/audio_source.gs3 + mkdir /config/usb_gadget/g1/functions/rndis.gs4 + mkdir /config/usb_gadget/g1/functions/midi.gs5 + mkdir /config/usb_gadget/g1/configs/b.1 0770 + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 + write /config/usb_gadget/g1/configs/b.1/MaxPower 500 + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" + mkdir /dev/usb-ffs 0775 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mkdir /dev/usb-ffs/mtp 0770 mtp mtp + mkdir /dev/usb-ffs/ptp 0770 mtp mtp + setprop sys.usb.mtp.device_type 3 + setprop sys.usb.mtp.batchcancel true + setprop vendor.usb.rndis.config rndis.gs4 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + + chown system system /config/usb_gadget/ + chown system system /config/usb_gadget/g1 + chown system system /config/usb_gadget/g1/UDC + chown system system /config/usb_gadget/g1/bDeviceClass + chown system system /config/usb_gadget/g1/bDeviceProtocol + chown system system /config/usb_gadget/g1/bDeviceSubClass + chown system system /config/usb_gadget/g1/bMaxPacketSize0 + chown system system /config/usb_gadget/g1/bcdDevice + chown system system /config/usb_gadget/g1/bcdUSB + chown system system /config/usb_gadget/g1/configs + chown system system /config/usb_gadget/g1/configs/b.1 + chown system system /config/usb_gadget/g1/configs/b.1/MaxPower + chown system system /config/usb_gadget/g1/configs/b.1/bmAttributes + chown system system /config/usb_gadget/g1/configs/b.1/strings + chown system system /config/usb_gadget/g1/functions + chown system system /config/usb_gadget/g1/functions/accessory.gs2 + chown system system /config/usb_gadget/g1/functions/audio_source.gs3 + chown system system /config/usb_gadget/g1/functions/ffs.adb + chown system system /config/usb_gadget/g1/functions/ffs.mtp + chown system system /config/usb_gadget/g1/functions/ffs.ptp + chown system system /config/usb_gadget/g1/functions/midi.gs5 + chown system system /config/usb_gadget/g1/functions/midi.gs5/buflen + chown system system /config/usb_gadget/g1/functions/midi.gs5/id + chown system system /config/usb_gadget/g1/functions/midi.gs5/in_ports + chown system system /config/usb_gadget/g1/functions/midi.gs5/index + chown system system /config/usb_gadget/g1/functions/midi.gs5/out_ports + chown system system /config/usb_gadget/g1/functions/midi.gs5/qlen + chown system system /config/usb_gadget/g1/functions/rndis.gs4 + chown system system /config/usb_gadget/g1/functions/rndis.gs4/class + chown system system /config/usb_gadget/g1/functions/rndis.gs4/dev_addr + chown system system /config/usb_gadget/g1/functions/rndis.gs4/host_addr + chown system system /config/usb_gadget/g1/functions/rndis.gs4/ifname + chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc + chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis + chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/compatible_id + chown system system /config/usb_gadget/g1/functions/rndis.gs4/os_desc/interface.rndis/sub_compatible_id + chown system system /config/usb_gadget/g1/functions/rndis.gs4/protocol + chown system system /config/usb_gadget/g1/functions/rndis.gs4/qmult + chown system system /config/usb_gadget/g1/functions/rndis.gs4/subclass + chown system system /config/usb_gadget/g1/idProduct + chown system system /config/usb_gadget/g1/idVendor + chown system system /config/usb_gadget/g1/max_speed + chown system system /config/usb_gadget/g1/os_desc + chown system system /config/usb_gadget/g1/os_desc/b.1 + chown system system /config/usb_gadget/g1/os_desc/b_vendor_code + chown system system /config/usb_gadget/g1/os_desc/qw_sign + chown system system /config/usb_gadget/g1/os_desc/use + chown system system /config/usb_gadget/g1/strings + chown system system /config/usb_gadget/g1/strings/0x409 + chown system system /config/usb_gadget/g1/strings/0x409/manufacturer + chown system system /config/usb_gadget/g1/strings/0x409/product + chown system system /config/usb_gadget/g1/strings/0x409/serialnumber + +on property:sys.usb.controller=* + mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000,no_disconnect=1 + mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1 + mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1 + setprop sys.usb.configfs 2 diff --git a/ramdisk/ueventd.opi5ultra.rc b/ramdisk/ueventd.opi5ultra.rc new file mode 100644 index 0000000..6345e5b --- /dev/null +++ b/ramdisk/ueventd.opi5ultra.rc @@ -0,0 +1,18 @@ +# Bluetooth +/dev/rfkill 0660 bluetooth bluetooth + +# Camera +/dev/media* 0660 system camera +/dev/v4l-subdev* 0660 system camera +/dev/video* 0660 system camera + +# DMA +/dev/dma_heap/linux,cma 0666 system graphics +/dev/dma_heap/system 0666 system graphics + +# FFmpeg +/dev/media* 0660 media media +/dev/video* 0660 media media + +# USB +/sys/class/udc/1000480000.usb current_speed 0664 system system diff --git a/seccomp_policy/android.hardware.media.c2-default-seccomp_policy b/seccomp_policy/android.hardware.media.c2-default-seccomp_policy new file mode 100644 index 0000000..5d0284f --- /dev/null +++ b/seccomp_policy/android.hardware.media.c2-default-seccomp_policy @@ -0,0 +1,81 @@ +# Copyright (C) 2021 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. + +futex: 1 +# ioctl calls are filtered via the selinux policy. +ioctl: 1 +sched_yield: 1 +close: 1 +dup: 1 +ppoll: 1 +mprotect: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE +mmap: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE +getuid: 1 +getrlimit: 1 +fstat: 1 +newfstatat: 1 +fstatfs: 1 +memfd_create: 1 +ftruncate: 1 + +# mremap: Ensure |flags| are (MREMAP_MAYMOVE | MREMAP_FIXED) TODO: Once minijail +# parser support for '<' is in this needs to be modified to also prevent +# |old_address| and |new_address| from touching the exception vector page, which +# on ARM is statically loaded at 0xffff 0000. See +# http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Babfeega.html +# for more details. +mremap: arg3 == 3 || arg3 == MREMAP_MAYMOVE +munmap: 1 +prctl: 1 +writev: 1 +sigaltstack: 1 +clone: 1 +exit: 1 +lseek: 1 +rt_sigprocmask: 1 +openat: 1 +write: 1 +nanosleep: 1 +setpriority: 1 +set_tid_address: 1 +getdents64: 1 +readlinkat: 1 +read: 1 +pread64: 1 +gettimeofday: 1 +faccessat: 1 +exit_group: 1 +restart_syscall: 1 +rt_sigreturn: 1 +getrandom: 1 +madvise: 1 + +# crash dump policy additions +clock_gettime: 1 +getpid: 1 +gettid: 1 +pipe2: 1 +recvmsg: 1 +process_vm_readv: 1 +tgkill: 1 +rt_sigaction: 1 +rt_tgsigqueueinfo: 1 +#mprotect: arg2 in 0x1|0x2 +munmap: 1 +#mmap: arg2 in 0x1|0x2 +geteuid: 1 +getgid: 1 +getegid: 1 +getgroups: 1 + diff --git a/seccomp_policy/android.hardware.media.c2-extended-seccomp_policy b/seccomp_policy/android.hardware.media.c2-extended-seccomp_policy new file mode 100644 index 0000000..68819e4 --- /dev/null +++ b/seccomp_policy/android.hardware.media.c2-extended-seccomp_policy @@ -0,0 +1,22 @@ +# device specific syscalls +_llseek: 1 +epoll_create1: 1 +epoll_ctl: 1 +epoll_pwait: 1 +eventfd2: 1 +fstat64: 1 +fstatat64: 1 +fstatfs64: 1 +getcwd: 1 +getdents64: 1 +getegid32: 1 +geteuid32: 1 +getgid32: 1 +getuid32: 1 +mmap2: 1 +open: 1 +pselect6: 1 +sched_getaffinity: 1 +statfs64: 1 +sysinfo: 1 +ugetrlimit: 1 \ No newline at end of file diff --git a/seccomp_policy/android.hardware.media.c2-ffmpeg.policy b/seccomp_policy/android.hardware.media.c2-ffmpeg.policy new file mode 100644 index 0000000..0ee4e78 --- /dev/null +++ b/seccomp_policy/android.hardware.media.c2-ffmpeg.policy @@ -0,0 +1,59 @@ +# device specific syscalls +clock_gettime: 1 +clone: 1 +close: 1 +dup: 1 +eventfd2: 1 +exit_group: 1 +exit: 1 +faccessat: 1 +fstat: 1 +fstatfs: 1 +ftruncate: 1 +futex: 1 +getdents64: 1 +getegid: 1 +geteuid: 1 +getgid: 1 +getgroups: 1 +getpid: 1 +getrandom: 1 +getrlimit: 1 +gettid: 1 +gettimeofday: 1 +getsockopt: 1 +getuid: 1 +ioctl: 1 +lseek: 1 +madvise: 1 +memfd_create: 1 +mmap: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE +mprotect: arg2 in ~PROT_EXEC || arg2 in ~PROT_WRITE +mremap: arg3 == 3 || arg3 == MREMAP_MAYMOVE +munmap: 1 +nanosleep: 1 +newfstatat: 1 +openat: 1 +pipe2: 1 +ppoll: 1 +prctl: 1 +pread64: 1 +process_vm_readv: 1 +read: 1 +readlinkat: 1 +recvmsg: 1 +restart_syscall: 1 +rt_sigaction: 1 +rt_sigprocmask: 1 +rt_sigreturn: 1 +rt_tgsigqueueinfo: 1 +sched_getaffinity: 1 +sched_yield: 1 +set_tid_address: 1 +sendmsg: 1 +setpriority: 1 +sigaltstack: 1 +sysinfo: 1 +tgkill: 1 +write: 1 +writev: 1 diff --git a/seccomp_policy/mediacodec.policy b/seccomp_policy/mediacodec.policy new file mode 100644 index 0000000..77bb74e --- /dev/null +++ b/seccomp_policy/mediacodec.policy @@ -0,0 +1,9 @@ +# device specific syscalls +_llseek: 1 +eventfd2: 1 +getcwd: 1 +pselect6: 1 +recvfrom: 1 +sched_getaffinity: 1 +sendto: 1 +sysinfo: 1 diff --git a/seccomp_policy/mediaswcodec.policy b/seccomp_policy/mediaswcodec.policy new file mode 100644 index 0000000..66da4b7 --- /dev/null +++ b/seccomp_policy/mediaswcodec.policy @@ -0,0 +1,3 @@ +# device specific syscalls +sched_getaffinity: 1 +sysinfo: 1 diff --git a/sepolicy/bootanim.te b/sepolicy/bootanim.te new file mode 100644 index 0000000..e8e7494 --- /dev/null +++ b/sepolicy/bootanim.te @@ -0,0 +1 @@ +gpu_access(bootanim) diff --git a/sepolicy/device.te b/sepolicy/device.te new file mode 100644 index 0000000..14cdde4 --- /dev/null +++ b/sepolicy/device.te @@ -0,0 +1 @@ +type cec_device, dev_type; diff --git a/sepolicy/file.te b/sepolicy/file.te new file mode 100644 index 0000000..c55a5e0 --- /dev/null +++ b/sepolicy/file.te @@ -0,0 +1,2 @@ +type mediadrm_vendor_data_file, file_type, data_file_type; +type sysfs_hdmi, fs_type, sysfs_type; diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts new file mode 100644 index 0000000..cb5d0be --- /dev/null +++ b/sepolicy/file_contexts @@ -0,0 +1,46 @@ +# CEC +/dev/cec0 u:object_r:cec_device:s0 + + +# DRM +/data/vendor/mediadrm(/.*)? u:object_r:mediadrm_vendor_data_file:s0 + + + +# Graphics +#/dev/dri(/.*)? u:object_r:gpu_device:s0 +#/vendor/bin/hw/android\.hardware\.graphics\.allocator-service\.minigbm_gbm_mesa u:object_r:hal_graphics_allocator_default_exec:s0 +#/vendor/bin/hw/android\.hardware\.graphics\.allocator-service\.minigbm u:object_r:hal_graphics_allocator_default_exec:s0 +#/vendor/lib64/hw/mapper\.minigbm_gbm_mesa\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/hw/mapper\.minigbm\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/hw/vulkan\.panfrost\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/dri_gbm\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libdrm\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libgallium_dri\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libgbm_mesa\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libgbm\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libgbm_mesa_wrapper\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libminigbm_gralloc_gbm_mesa\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libminigbm_gralloc\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libminigbm_gralloc4_utils_gbm_mesa\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libminigbm_gralloc4_utils\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/libui\.so u:object_r:same_process_hal_file:s0 +#/vendor/lib64/gralloc\.minigbm\.so u:object_r:same_process_hal_file:s0 + +/dev/dri(/.*)? u:object_r:gpu_device:s0 +/vendor/lib64/android\.hardware\.graphics\.allocator@[2-4]\.0\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/hw/vulkan\.panfrost\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libdrm\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libgallium_dri\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libui\.so u:object_r:same_process_hal_file:s0 + + +# Partitions (gpt) +/dev/block/by-name/system u:object_r:system_block_device:s0 +/dev/block/by-name/vendor u:object_r:system_block_device:s0 +/dev/block/by-name/metadata u:object_r:metadata_block_device:s0 +/dev/block/by-name/userdata u:object_r:userdata_block_device:s0 +/dev/block/by-name/boot u:object_r:boot_block_device:s0 + +#V4L2 +/vendor/bin/hw/android\.hardware\.media\.c2@1\.2-service-v4l2(.*)? u:object_r:mediacodec_exec:s0 \ No newline at end of file diff --git a/sepolicy/genfs_contexts b/sepolicy/genfs_contexts new file mode 100644 index 0000000..a1510cb --- /dev/null +++ b/sepolicy/genfs_contexts @@ -0,0 +1,18 @@ +# CEC +genfscon sysfs /devices/platform/display-subsystem/drm/card0/card0-HDMI-A-1/status u:object_r:sysfs_hdmi:s0 +genfscon sysfs /devices/platform/display-subsystem/drm/card1/card1-HDMI-A-1/status u:object_r:sysfs_hdmi:s0 + +# Graphics +genfscon sysfs /devices/platform/fde60000.gpu u:object_r:sysfs_gpu:s0 +genfscon sysfs /devices/platform/display-subsystem u:object_r:sysfs_gpu:s0 + +# Lights +genfscon sysfs /class/backlight/11-0045/brightness u:object_r:sysfs_leds:s0 +genfscon sysfs /class/backlight/11-0045/max_brightness u:object_r:sysfs_leds:s0 + +# # Serial number +# genfscon sysfs /firmware/devicetree/base/serial-number u:object_r:sysfs_dt_firmware_android:s0 + +# # Suspend +# genfscon sysfs /devices/platform/soc/soc:rpi_rtc/rtc/rtc0/alarmtimer.0.auto/wakeup/wakeup1 u:object_r:sysfs_wakeup:s0 +# genfscon sysfs /devices/platform/soc/soc:rpi_rtc/wakeup/wakeup0 u:object_r:sysfs_wakeup:s0 diff --git a/sepolicy/hal_audio_default.te b/sepolicy/hal_audio_default.te new file mode 100644 index 0000000..e9f5c72 --- /dev/null +++ b/sepolicy/hal_audio_default.te @@ -0,0 +1 @@ +get_prop(hal_audio_default, vendor_audio_config_prop) diff --git a/sepolicy/hal_camera.te b/sepolicy/hal_camera.te new file mode 100644 index 0000000..3a9e61f --- /dev/null +++ b/sepolicy/hal_camera.te @@ -0,0 +1,12 @@ +vndbinder_use(hal_camera_default); + +allow hal_camera_default hal_graphics_mapper_hwservice:hwservice_manager find; +hal_client_domain(hal_camera_default, hal_graphics_allocator); +hal_client_domain(hal_camera_default, hal_graphics_composer); + +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms; + +gpu_access(hal_camera_default) +gpu_access(cameraserver) diff --git a/sepolicy/hal_drm_clearkey.te b/sepolicy/hal_drm_clearkey.te new file mode 100644 index 0000000..0e0a5c2 --- /dev/null +++ b/sepolicy/hal_drm_clearkey.te @@ -0,0 +1,5 @@ +type hal_drm_clearkey, domain; +type hal_drm_clearkey_exec, vendor_file_type, exec_type, file_type; +init_daemon_domain(hal_drm_clearkey) + +hal_server_domain(hal_drm_clearkey, hal_drm) diff --git a/sepolicy/hal_drm_widevine.te b/sepolicy/hal_drm_widevine.te new file mode 100644 index 0000000..08b6582 --- /dev/null +++ b/sepolicy/hal_drm_widevine.te @@ -0,0 +1,8 @@ +type hal_drm_widevine, domain; +type hal_drm_widevine_exec, vendor_file_type, exec_type, file_type; +init_daemon_domain(hal_drm_widevine) + +hal_server_domain(hal_drm_widevine, hal_drm) + +allow hal_drm_widevine mediadrm_vendor_data_file:file create_file_perms; +allow hal_drm_widevine mediadrm_vendor_data_file:dir create_dir_perms; diff --git a/sepolicy/hal_graphics_allocator_default.te b/sepolicy/hal_graphics_allocator_default.te new file mode 100644 index 0000000..00f38cc --- /dev/null +++ b/sepolicy/hal_graphics_allocator_default.te @@ -0,0 +1 @@ +gpu_access(hal_graphics_allocator_default) diff --git a/sepolicy/hal_graphics_composer_default.te b/sepolicy/hal_graphics_composer_default.te new file mode 100644 index 0000000..9c0c169 --- /dev/null +++ b/sepolicy/hal_graphics_composer_default.te @@ -0,0 +1,5 @@ +vndbinder_use(hal_graphics_composer_default) +gpu_access(hal_graphics_composer_default) +get_prop(hal_graphics_composer_default, vendor_hwc_config_prop) + +allow hal_graphics_composer_default self:netlink_kobject_uevent_socket { bind create read }; diff --git a/sepolicy/hal_keymint_default.te b/sepolicy/hal_keymint_default.te new file mode 100644 index 0000000..8b5d0ca --- /dev/null +++ b/sepolicy/hal_keymint_default.te @@ -0,0 +1 @@ +get_prop(hal_keymint_default, serialno_prop) diff --git a/sepolicy/hal_tv_hdmi_cec_default.te b/sepolicy/hal_tv_hdmi_cec_default.te new file mode 100644 index 0000000..2ccb439 --- /dev/null +++ b/sepolicy/hal_tv_hdmi_cec_default.te @@ -0,0 +1,2 @@ +allow hal_tv_hdmi_cec_default cec_device:chr_file rw_file_perms; +get_prop(hal_tv_hdmi_cec_default, vendor_hdmi_config_prop) diff --git a/sepolicy/hal_tv_hdmi_connection_default.te b/sepolicy/hal_tv_hdmi_connection_default.te new file mode 100644 index 0000000..d016287 --- /dev/null +++ b/sepolicy/hal_tv_hdmi_connection_default.te @@ -0,0 +1 @@ +allow hal_tv_hdmi_connection_default sysfs_hdmi:file r_file_perms; diff --git a/sepolicy/init.te b/sepolicy/init.te new file mode 100644 index 0000000..1da3af0 --- /dev/null +++ b/sepolicy/init.te @@ -0,0 +1,2 @@ +allow init kernel:system module_request; +allow init tmpfs:lnk_file create; diff --git a/sepolicy/kernel.te b/sepolicy/kernel.te new file mode 100644 index 0000000..6d977fb --- /dev/null +++ b/sepolicy/kernel.te @@ -0,0 +1,4 @@ +allow kernel self:capability mknod; +allow kernel self:system module_request; +allow kernel device:dir { create write add_name remove_name rmdir }; +allow kernel device:chr_file { create setattr getattr unlink }; diff --git a/sepolicy/keystore.te b/sepolicy/keystore.te new file mode 100644 index 0000000..287151b --- /dev/null +++ b/sepolicy/keystore.te @@ -0,0 +1 @@ +hal_client_domain(keystore, hal_gatekeeper) diff --git a/sepolicy/mediacodec.te b/sepolicy/mediacodec.te new file mode 100644 index 0000000..7a645a2 --- /dev/null +++ b/sepolicy/mediacodec.te @@ -0,0 +1,3 @@ +gpu_access(mediacodec) +get_prop(mediacodec, vendor_ffmpeg_config_prop) +get_prop(mediacodec, vendor_v4l2_config_prop) diff --git a/sepolicy/mediaserver.te b/sepolicy/mediaserver.te new file mode 100644 index 0000000..922af2c --- /dev/null +++ b/sepolicy/mediaserver.te @@ -0,0 +1 @@ +gpu_access(mediaserver) diff --git a/sepolicy/mediaswcodec.te b/sepolicy/mediaswcodec.te new file mode 100644 index 0000000..ff9c5b5 --- /dev/null +++ b/sepolicy/mediaswcodec.te @@ -0,0 +1 @@ +gpu_access(mediaswcodec) diff --git a/sepolicy/netd.te b/sepolicy/netd.te new file mode 100644 index 0000000..00c4a0a --- /dev/null +++ b/sepolicy/netd.te @@ -0,0 +1,2 @@ +dontaudit netd self:capability sys_module; +allow netd kernel:system module_request; diff --git a/sepolicy/platform_app.te b/sepolicy/platform_app.te new file mode 100644 index 0000000..775e964 --- /dev/null +++ b/sepolicy/platform_app.te @@ -0,0 +1 @@ +gpu_access(platform_app) diff --git a/sepolicy/priv_app.te b/sepolicy/priv_app.te new file mode 100644 index 0000000..05c9e47 --- /dev/null +++ b/sepolicy/priv_app.te @@ -0,0 +1 @@ +gpu_access(priv_app) diff --git a/sepolicy/proc_net.te b/sepolicy/proc_net.te new file mode 100644 index 0000000..0f22770 --- /dev/null +++ b/sepolicy/proc_net.te @@ -0,0 +1 @@ +allow proc_net proc:filesystem associate; diff --git a/sepolicy/property.te b/sepolicy/property.te new file mode 100644 index 0000000..195753b --- /dev/null +++ b/sepolicy/property.te @@ -0,0 +1,6 @@ +vendor_internal_prop(vendor_audio_config_prop) +vendor_internal_prop(vendor_ffmpeg_config_prop) +vendor_internal_prop(vendor_hdmi_config_prop) +vendor_internal_prop(vendor_v4l2_config_prop) +vendor_internal_prop(vendor_hwc_config_prop) + diff --git a/sepolicy/property_contexts b/sepolicy/property_contexts new file mode 100644 index 0000000..bdfc5fc --- /dev/null +++ b/sepolicy/property_contexts @@ -0,0 +1,23 @@ +# Audio +persist.vendor.audio.device u:object_r:vendor_audio_config_prop:s0 +persist.vendor.audio.hdmi.device u:object_r:vendor_audio_config_prop:s0 +persist.vendor.audio.pcm.card.auto u:object_r:vendor_audio_config_prop:s0 +persist.vendor.audio.pcm.card u:object_r:vendor_audio_config_prop:s0 +persist.vendor.audio.pcm.device u:object_r:vendor_audio_config_prop:s0 + +# CEC +persist.vendor.hdmi.cec_device u:object_r:vendor_hdmi_config_prop:s0 + +# FFmpeg +persist.vendor.ffmpeg_codec2.rank.audio u:object_r:vendor_ffmpeg_config_prop:s0 +persist.vendor.ffmpeg_codec2.rank.video u:object_r:vendor_ffmpeg_config_prop:s0 +persist.vendor.ffmpeg_codec2.v4l2.h265 u:object_r:vendor_ffmpeg_config_prop:s0 + +#V4L2 +persist.vendor.v4l2_codec2.rank.decoder u:object_r:vendor_v4l2_config_prop:s0 +persist.vendor.v4l2_codec2.rank.encoder u:object_r:vendor_v4l2_config_prop:s0 + +# Graphics +vendor.hwc.drm.ctm u:object_r:vendor_hwc_config_prop:s0 +vendor.hwc.drm.disable_hdr u:object_r:vendor_hwc_config_prop:s0 +vendor.hwc.drm.force_mode u:object_r:vendor_hwc_config_prop:s0 \ No newline at end of file diff --git a/sepolicy/service_contexts b/sepolicy/service_contexts new file mode 100644 index 0000000..0ac9ae9 --- /dev/null +++ b/sepolicy/service_contexts @@ -0,0 +1,10 @@ +# DRM +android.hardware.drm.IDrmFactory/widevine u:object_r:hal_drm_service:s0 + +# Gatekeeper +android.hardware.security.sharedsecret.ISharedSecret/gatekeeper u:object_r:hal_gatekeeper_service:s0 + +# Graphics +mapper/minigbm_gbm_mesa u:object_r:hal_graphics_mapper_service:s0 +mapper/minigbm u:object_r:hal_graphics_mapper_service:s0 + diff --git a/sepolicy/surfaceflinger.te b/sepolicy/surfaceflinger.te new file mode 100644 index 0000000..17b66a8 --- /dev/null +++ b/sepolicy/surfaceflinger.te @@ -0,0 +1 @@ +gpu_access(surfaceflinger) diff --git a/sepolicy/suspend_blocker.te b/sepolicy/suspend_blocker.te new file mode 100644 index 0000000..fa6e02a --- /dev/null +++ b/sepolicy/suspend_blocker.te @@ -0,0 +1,6 @@ +type suspend_blocker, domain; +type suspend_blocker_exec, exec_type, vendor_file_type, file_type; + +init_daemon_domain(suspend_blocker); + +wakelock_use(suspend_blocker); diff --git a/sepolicy/system_app.te b/sepolicy/system_app.te new file mode 100644 index 0000000..4a85066 --- /dev/null +++ b/sepolicy/system_app.te @@ -0,0 +1 @@ +gpu_access(system_app) diff --git a/sepolicy/system_server.te b/sepolicy/system_server.te new file mode 100644 index 0000000..3ea1d13 --- /dev/null +++ b/sepolicy/system_server.te @@ -0,0 +1,2 @@ +gpu_access(system_server) + diff --git a/sepolicy/te_macros b/sepolicy/te_macros new file mode 100644 index 0000000..f94fe2b --- /dev/null +++ b/sepolicy/te_macros @@ -0,0 +1,9 @@ +##################################### +# gpu_access(client_domain) +# Allow client_domain to communicate with the GPU +define(`gpu_access', ` +allow $1 gpu_device:dir r_dir_perms; +allow $1 gpu_device:chr_file rw_file_perms; +allow $1 sysfs_gpu:dir r_dir_perms; +allow $1 sysfs_gpu:file r_file_perms; +') diff --git a/sepolicy/untrusted_app_all.te b/sepolicy/untrusted_app_all.te new file mode 100644 index 0000000..c429fc2 --- /dev/null +++ b/sepolicy/untrusted_app_all.te @@ -0,0 +1 @@ +gpu_access(untrusted_app_all) diff --git a/sepolicy/vendor_init.te b/sepolicy/vendor_init.te new file mode 100644 index 0000000..816ae52 --- /dev/null +++ b/sepolicy/vendor_init.te @@ -0,0 +1,7 @@ +set_prop(vendor_init, vendor_audio_config_prop) +set_prop(vendor_init, vendor_ffmpeg_config_prop) +set_prop(vendor_init, vendor_hdmi_config_prop) +set_prop(vendor_init, vendor_v4l2_config_prop) +set_prop(vendor_init, vendor_hwc_config_prop) + + diff --git a/suspend_blocker/Android.bp b/suspend_blocker/Android.bp new file mode 100644 index 0000000..49bc0ca --- /dev/null +++ b/suspend_blocker/Android.bp @@ -0,0 +1,34 @@ +// Copyright (C) 2019 The Android Open Source Project +// Copyright (C) 2021-2022 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "suspend_blocker_opi", + vendor: true, + srcs: ["suspend_blocker_opi.cpp"], + shared_libs: ["libpower"], + installable: false, +} + +prebuilt_etc { + name: "suspend_blocker_opi.rc", + src: "suspend_blocker_opi.rc", + installable: false, +} + +apex { + name: "com.android.hardware.suspend_blocker.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["suspend_blocker_opi"], + prebuilts: [ + "suspend_blocker_opi.rc", + ], +} diff --git a/suspend_blocker/apex_file_contexts b/suspend_blocker/apex_file_contexts new file mode 100644 index 0000000..d33962d --- /dev/null +++ b/suspend_blocker/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/suspend_blocker_opi u:object_r:suspend_blocker_exec:s0 diff --git a/suspend_blocker/apex_manifest.json b/suspend_blocker/apex_manifest.json new file mode 100644 index 0000000..b2be307 --- /dev/null +++ b/suspend_blocker/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.suspend_blocker.opi5", + "version": 1 +} diff --git a/suspend_blocker/suspend_blocker_opi.cpp b/suspend_blocker/suspend_blocker_opi.cpp new file mode 100644 index 0000000..0e6e1c0 --- /dev/null +++ b/suspend_blocker/suspend_blocker_opi.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2021-2022 KonstaKANG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +int main() { + auto wl = android::wakelock::WakeLock::tryGet("suspend_blocker_opi"); // RAII object + if (!wl.has_value()) { + return EXIT_FAILURE; + } + + sigset_t mask; + sigemptyset(&mask); + return sigsuspend(&mask); // Infinite sleep +} diff --git a/suspend_blocker/suspend_blocker_opi.rc b/suspend_blocker/suspend_blocker_opi.rc new file mode 100644 index 0000000..7a8c608 --- /dev/null +++ b/suspend_blocker/suspend_blocker_opi.rc @@ -0,0 +1,4 @@ +service vendor.suspend_blocker_opi /apex/com.android.hardware.suspend_blocker.opi5/bin/suspend_blocker_opi + class hal + group system + user root diff --git a/usb/Android.bp b/usb/Android.bp new file mode 100644 index 0000000..a18b43e --- /dev/null +++ b/usb/Android.bp @@ -0,0 +1,54 @@ +// Copyright (C) 2020 The Android Open Source Project +// Copyright (C) 2024 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +cc_binary { + name: "android.hardware.usb.gadget-service.opi", + relative_install_path: "hw", + vendor: true, + srcs: [ + "MonitorFfs.cpp", + "UsbGadget.cpp", + "UsbGadgetUtils.cpp", + "main.cpp", + ], + shared_libs: [ + "android.hardware.usb.gadget-V1-ndk", + "libbase", + "libbinder_ndk", + "liblog", + "libutils", + ], + installable: false, +} + +prebuilt_etc { + name: "android.hardware.usb.gadget-service.opi.rc", + src: "android.hardware.usb.gadget-service.opi.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.usb.gadget-service.opi.xml", + src: "android.hardware.usb.gadget-service.opi.xml", + sub_dir: "vintf", + installable: false, +} + +apex { + name: "com.android.hardware.usb.gadget.opi5", + manifest: "apex_manifest.json", + file_contexts: "apex_file_contexts", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: ["android.hardware.usb.gadget-service.opi"], + prebuilts: [ + "android.hardware.usb.gadget-service.opi.rc", + "android.hardware.usb.gadget-service.opi.xml", + ], +} diff --git a/usb/MonitorFfs.cpp b/usb/MonitorFfs.cpp new file mode 100644 index 0000000..54e4764 --- /dev/null +++ b/usb/MonitorFfs.cpp @@ -0,0 +1,272 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 "UsbGadgetCommon.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace usb { +namespace gadget { + +static volatile bool gadgetPullup; + +MonitorFfs::MonitorFfs(const char* const gadget) + : mWatchFd(), + mEndpointList(), + mLock(), + mCv(), + mLockFd(), + mCurrentUsbFunctionsApplied(false), + mMonitor(), + mCallback(NULL), + mPayload(NULL), + mGadgetName(gadget), + mMonitorRunning(false) { + unique_fd eventFd(eventfd(0, 0)); + if (eventFd == -1) { + ALOGE("mEventFd failed to create %d", errno); + abort(); + } + + unique_fd epollFd(epoll_create(2)); + if (epollFd == -1) { + ALOGE("mEpollFd failed to create %d", errno); + abort(); + } + + unique_fd inotifyFd(inotify_init()); + if (inotifyFd < 0) { + ALOGE("inotify init failed"); + abort(); + } + + if (addEpollFd(epollFd, inotifyFd) == -1) abort(); + + if (addEpollFd(epollFd, eventFd) == -1) abort(); + + mEpollFd = std::move(epollFd); + mInotifyFd = std::move(inotifyFd); + mEventFd = std::move(eventFd); + gadgetPullup = false; +} + +static void displayInotifyEvent(struct inotify_event* i) { + ALOGE(" wd =%2d; ", i->wd); + if (i->cookie > 0) ALOGE("cookie =%4d; ", i->cookie); + + ALOGE("mask = "); + if (i->mask & IN_ACCESS) ALOGE("IN_ACCESS "); + if (i->mask & IN_ATTRIB) ALOGE("IN_ATTRIB "); + if (i->mask & IN_CLOSE_NOWRITE) ALOGE("IN_CLOSE_NOWRITE "); + if (i->mask & IN_CLOSE_WRITE) ALOGE("IN_CLOSE_WRITE "); + if (i->mask & IN_CREATE) ALOGE("IN_CREATE "); + if (i->mask & IN_DELETE) ALOGE("IN_DELETE "); + if (i->mask & IN_DELETE_SELF) ALOGE("IN_DELETE_SELF "); + if (i->mask & IN_IGNORED) ALOGE("IN_IGNORED "); + if (i->mask & IN_ISDIR) ALOGE("IN_ISDIR "); + if (i->mask & IN_MODIFY) ALOGE("IN_MODIFY "); + if (i->mask & IN_MOVE_SELF) ALOGE("IN_MOVE_SELF "); + if (i->mask & IN_MOVED_FROM) ALOGE("IN_MOVED_FROM "); + if (i->mask & IN_MOVED_TO) ALOGE("IN_MOVED_TO "); + if (i->mask & IN_OPEN) ALOGE("IN_OPEN "); + if (i->mask & IN_Q_OVERFLOW) ALOGE("IN_Q_OVERFLOW "); + if (i->mask & IN_UNMOUNT) ALOGE("IN_UNMOUNT "); + ALOGE("\n"); + + if (i->len > 0) ALOGE(" name = %s\n", i->name); +} + +void* MonitorFfs::startMonitorFd(void* param) { + MonitorFfs* monitorFfs = (MonitorFfs*)param; + char buf[kBufferSize]; + bool writeUdc = true, stopMonitor = false; + struct epoll_event events[kEpollEvents]; + steady_clock::time_point disconnect; + + bool descriptorWritten = true; + for (int i = 0; i < static_cast(monitorFfs->mEndpointList.size()); i++) { + if (access(monitorFfs->mEndpointList.at(i).c_str(), R_OK)) { + descriptorWritten = false; + break; + } + } + + // notify here if the endpoints are already present. + if (descriptorWritten) { + usleep(kPullUpDelay); + if (!!WriteStringToFile(monitorFfs->mGadgetName, PULLUP_PATH)) { + lock_guard lock(monitorFfs->mLock); + monitorFfs->mCurrentUsbFunctionsApplied = true; + monitorFfs->mCallback(monitorFfs->mCurrentUsbFunctionsApplied, monitorFfs->mPayload); + gadgetPullup = true; + writeUdc = false; + ALOGI("GADGET pulled up"); + monitorFfs->mCv.notify_all(); + } + } + + while (!stopMonitor) { + int nrEvents = epoll_wait(monitorFfs->mEpollFd, events, kEpollEvents, -1); + + if (nrEvents <= 0) { + ALOGE("epoll wait did not return descriptor number"); + continue; + } + + for (int i = 0; i < nrEvents; i++) { + ALOGI("event=%u on fd=%d\n", events[i].events, events[i].data.fd); + + if (events[i].data.fd == monitorFfs->mInotifyFd) { + // Process all of the events in buffer returned by read(). + int numRead = read(monitorFfs->mInotifyFd, buf, kBufferSize); + for (char* p = buf; p < buf + numRead;) { + struct inotify_event* event = (struct inotify_event*)p; + if (kDebug) displayInotifyEvent(event); + + p += sizeof(struct inotify_event) + event->len; + + bool descriptorPresent = true; + for (int j = 0; j < static_cast(monitorFfs->mEndpointList.size()); j++) { + if (access(monitorFfs->mEndpointList.at(j).c_str(), R_OK)) { + if (kDebug) ALOGI("%s absent", monitorFfs->mEndpointList.at(j).c_str()); + descriptorPresent = false; + break; + } + } + + if (!descriptorPresent && !writeUdc) { + if (kDebug) ALOGI("endpoints not up"); + writeUdc = true; + disconnect = std::chrono::steady_clock::now(); + } else if (descriptorPresent && writeUdc) { + steady_clock::time_point temp = steady_clock::now(); + + if (std::chrono::duration_cast(temp - disconnect).count() < + kPullUpDelay) + usleep(kPullUpDelay); + + if (!!WriteStringToFile(monitorFfs->mGadgetName, PULLUP_PATH)) { + lock_guard lock(monitorFfs->mLock); + monitorFfs->mCurrentUsbFunctionsApplied = true; + monitorFfs->mCallback(monitorFfs->mCurrentUsbFunctionsApplied, + monitorFfs->mPayload); + ALOGI("GADGET pulled up"); + writeUdc = false; + gadgetPullup = true; + // notify the main thread to signal userspace. + monitorFfs->mCv.notify_all(); + } + } + } + } else { + uint64_t flag; + read(monitorFfs->mEventFd, &flag, sizeof(flag)); + if (flag == 100) { + stopMonitor = true; + break; + } + } + } + } + return NULL; +} + +void MonitorFfs::reset() { + lock_guard lock(mLockFd); + uint64_t flag = 100; + unsigned long ret; + + if (mMonitorRunning) { + // Stop the monitor thread by writing into signal fd. + ret = TEMP_FAILURE_RETRY(write(mEventFd, &flag, sizeof(flag))); + if (ret < 0) ALOGE("Error writing eventfd errno=%d", errno); + + ALOGI("mMonitor signalled to exit"); + mMonitor->join(); + ALOGI("mMonitor destroyed"); + mMonitorRunning = false; + } + + for (std::vector::size_type i = 0; i != mWatchFd.size(); i++) + inotify_rm_watch(mInotifyFd, mWatchFd[i]); + + mEndpointList.clear(); + gadgetPullup = false; + mCallback = NULL; + mPayload = NULL; +} + +bool MonitorFfs::startMonitor() { + mMonitor = unique_ptr(new thread(this->startMonitorFd, this)); + mMonitorRunning = true; + return true; +} + +bool MonitorFfs::isMonitorRunning() { + return mMonitorRunning; +} + +bool MonitorFfs::waitForPullUp(int timeout_ms) { + std::unique_lock lk(mLock); + + if (gadgetPullup) return true; + + if (mCv.wait_for(lk, timeout_ms * 1ms, [] { return gadgetPullup; })) { + ALOGI("monitorFfs signalled true"); + return true; + } else { + ALOGI("monitorFfs signalled error"); + // continue monitoring as the descriptors might be written at a later + // point. + return false; + } +} + +bool MonitorFfs::addInotifyFd(string fd) { + lock_guard lock(mLockFd); + int wfd; + + wfd = inotify_add_watch(mInotifyFd, fd.c_str(), IN_ALL_EVENTS); + if (wfd == -1) + return false; + else + mWatchFd.push_back(wfd); + + return true; +} + +void MonitorFfs::addEndPoint(string ep) { + lock_guard lock(mLockFd); + + mEndpointList.push_back(ep); +} + +void MonitorFfs::registerFunctionsAppliedCallback(void (*callback)(bool functionsApplied, + void* payload), + void* payload) { + mCallback = callback; + mPayload = payload; +} + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/usb/UsbGadget.cpp b/usb/UsbGadget.cpp new file mode 100644 index 0000000..616c259 --- /dev/null +++ b/usb/UsbGadget.cpp @@ -0,0 +1,309 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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-service.opi" + +#include "UsbGadget.h" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace aidl { +namespace android { +namespace hardware { +namespace usb { +namespace gadget { + +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; +} + +ScopedAStatus UsbGadget::getCurrentUsbFunctions(const shared_ptr& callback, + int64_t in_transactionId) { + if (callback == nullptr) { + return ScopedAStatus::fromExceptionCode(EX_NULL_POINTER); + } + + ScopedAStatus ret = callback->getCurrentUsbFunctionsCb( + mCurrentUsbFunctions, + mCurrentUsbFunctionsApplied ? Status::FUNCTIONS_APPLIED : Status::FUNCTIONS_NOT_APPLIED, + in_transactionId); + if (!ret.isOk()) + ALOGE("Call to getCurrentUsbFunctionsCb failed %s", ret.getDescription().c_str()); + + return ScopedAStatus::ok(); +} + +ScopedAStatus UsbGadget::getUsbSpeed(const shared_ptr &callback, + int64_t in_transactionId) { + std::string current_speed; + if (ReadFileToString(SPEED_PATH, ¤t_speed)) { + current_speed = Trim(current_speed); + ALOGI("current USB speed is %s", current_speed.c_str()); + if (current_speed == "low-speed") + mUsbSpeed = UsbSpeed::LOWSPEED; + else if (current_speed == "full-speed") + mUsbSpeed = UsbSpeed::FULLSPEED; + else if (current_speed == "high-speed") + mUsbSpeed = UsbSpeed::HIGHSPEED; + else if (current_speed == "super-speed") + mUsbSpeed = UsbSpeed::SUPERSPEED; + else if (current_speed == "super-speed-plus") + mUsbSpeed = UsbSpeed::SUPERSPEED_10Gb; + else if (current_speed == "UNKNOWN") + mUsbSpeed = UsbSpeed::UNKNOWN; + else + mUsbSpeed = UsbSpeed::UNKNOWN; + } else { + ALOGE("Fail to read current speed"); + mUsbSpeed = UsbSpeed::UNKNOWN; + } + + if (callback) { + ScopedAStatus ret = callback->getUsbSpeedCb(mUsbSpeed, in_transactionId); + + if (!ret.isOk()) + ALOGE("Call to getUsbSpeedCb failed %s", ret.getDescription().c_str()); + } + + return ScopedAStatus::ok(); +} + +Status UsbGadget::tearDownGadget() { + if (resetGadget() != Status::SUCCESS) return Status::ERROR; + + if (monitorFfs.isMonitorRunning()) { + monitorFfs.reset(); + } else { + ALOGI("mMonitor not running"); + } + return Status::SUCCESS; +} + +ScopedAStatus UsbGadget::reset(const shared_ptr &callback, + int64_t in_transactionId) { + if (!WriteStringToFile("none", PULLUP_PATH)) { + ALOGI("Gadget cannot be pulled down"); + if (callback) + callback->resetCb(Status::ERROR, in_transactionId); + + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Error while calling resetCb"); + } + + usleep(kDisconnectWaitUs); + + if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) { + ALOGI("Gadget cannot be pulled up"); + if (callback) + callback->resetCb(Status::ERROR, in_transactionId); + + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Error while calling resetCb"); + } + + if (callback) + callback->resetCb(Status::SUCCESS, in_transactionId); + + return ScopedAStatus::ok(); +} + +static Status validateAndSetVidPid(uint64_t functions) { + Status ret = Status::SUCCESS; + + switch (functions) { + case GadgetFunction::MTP: + ret = setVidPid("0x18d1", "0x4ee1"); + break; + case GadgetFunction::ADB | GadgetFunction::MTP: + ret = setVidPid("0x18d1", "0x4ee2"); + break; + case GadgetFunction::RNDIS: + ret = setVidPid("0x18d1", "0x4ee3"); + break; + case GadgetFunction::ADB | GadgetFunction::RNDIS: + ret = setVidPid("0x18d1", "0x4ee4"); + break; + case GadgetFunction::PTP: + ret = setVidPid("0x18d1", "0x4ee5"); + break; + case GadgetFunction::ADB | GadgetFunction::PTP: + ret = setVidPid("0x18d1", "0x4ee6"); + break; + case GadgetFunction::ADB: + ret = setVidPid("0x18d1", "0x4ee7"); + break; + case GadgetFunction::MIDI: + ret = setVidPid("0x18d1", "0x4ee8"); + break; + case GadgetFunction::ADB | GadgetFunction::MIDI: + ret = setVidPid("0x18d1", "0x4ee9"); + break; + case GadgetFunction::NCM: + ret = setVidPid("0x18d1", "0x4eeb"); + break; + case GadgetFunction::ADB | GadgetFunction::NCM: + ret = setVidPid("0x18d1", "0x4eec"); + break; + case GadgetFunction::ACCESSORY: + ret = setVidPid("0x18d1", "0x2d00"); + break; + case GadgetFunction::ADB | GadgetFunction::ACCESSORY: + ret = setVidPid("0x18d1", "0x2d01"); + break; + case GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d02"); + break; + case GadgetFunction::ADB | GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d03"); + break; + case GadgetFunction::ACCESSORY | GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d04"); + break; + case GadgetFunction::ADB | GadgetFunction::ACCESSORY | + GadgetFunction::AUDIO_SOURCE: + ret = setVidPid("0x18d1", "0x2d05"); + break; + default: + ALOGE("Combination not supported"); + ret = Status::CONFIGURATION_NOT_SUPPORTED; + } + return ret; +} + +Status UsbGadget::setupFunctions(long functions, + const shared_ptr &callback, uint64_t timeout, + int64_t in_transactionId) { + bool ffsEnabled = false; + int i = 0; + + if (addGenericAndroidFunctions(&monitorFfs, functions, &ffsEnabled, &i) != + Status::SUCCESS) + return Status::ERROR; + + if ((functions & GadgetFunction::ADB) != 0) { + ffsEnabled = true; + if (addAdb(&monitorFfs, &i) != Status::SUCCESS) return Status::ERROR; + } + + // Pull up the gadget right away when there are no ffs functions. + if (!ffsEnabled) { + if (!WriteStringToFile(kGadgetName, PULLUP_PATH)) + return Status::ERROR; + mCurrentUsbFunctionsApplied = true; + + if (callback) + callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS, in_transactionId); + + return Status::SUCCESS; + } + + monitorFfs.registerFunctionsAppliedCallback(¤tFunctionsAppliedCallback, this); + // Monitors the ffs paths to pull up the gadget when descriptors are written. + // Also takes of the pulling up the gadget again if the userspace process + // dies and restarts. + monitorFfs.startMonitor(); + + if (kDebug) ALOGI("Mainthread in Cv"); + + if (callback) { + bool pullup = monitorFfs.waitForPullUp(timeout); + ScopedAStatus ret = callback->setCurrentUsbFunctionsCb(functions, + pullup ? Status::SUCCESS : Status::ERROR, + in_transactionId); + if (!ret.isOk()) + ALOGE("setCurrentUsbFunctionsCb error %s", ret.getMessage()); + } + + return Status::SUCCESS; +} + +ScopedAStatus UsbGadget::setCurrentUsbFunctions(int64_t functions, + const shared_ptr &callback, + int64_t timeoutMs, + int64_t in_transactionId) { + std::unique_lock lk(mLockSetCurrentFunction); + + mCurrentUsbFunctions = functions; + mCurrentUsbFunctionsApplied = false; + + // Unlink the gadget and stop the monitor if running. + Status status = tearDownGadget(); + if (status != 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 == GadgetFunction::NONE) { + if (callback == NULL) + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "callback == NULL"); + ScopedAStatus ret = callback->setCurrentUsbFunctionsCb(functions, Status::SUCCESS, in_transactionId); + if (!ret.isOk()) + ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.getDescription().c_str()); + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Error while calling setCurrentUsbFunctionsCb"); + } + + status = validateAndSetVidPid(functions); + + if (status != Status::SUCCESS) { + goto error; + } + + status = setupFunctions(functions, callback, timeoutMs, in_transactionId); + if (status != Status::SUCCESS) { + goto error; + } + + ALOGI("Usb Gadget setcurrent functions called successfully"); + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Usb Gadget setcurrent functions called successfully"); + +error: + ALOGI("Usb Gadget setcurrent functions failed"); + if (callback == NULL) + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Usb Gadget setcurrent functions failed"); + ScopedAStatus ret = callback->setCurrentUsbFunctionsCb(functions, status, in_transactionId); + if (!ret.isOk()) + ALOGE("Error while calling setCurrentUsbFunctionsCb %s", ret.getDescription().c_str()); + return ScopedAStatus::fromServiceSpecificErrorWithMessage( + -1, "Error while calling setCurrentUsbFunctionsCb"); +} +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +} // aidl diff --git a/usb/UsbGadget.h b/usb/UsbGadget.h new file mode 100644 index 0000000..637dc13 --- /dev/null +++ b/usb/UsbGadget.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace aidl { +namespace android { +namespace hardware { +namespace usb { +namespace gadget { + +using ::aidl::android::hardware::usb::gadget::GadgetFunction; +using ::aidl::android::hardware::usb::gadget::IUsbGadgetCallback; +using ::aidl::android::hardware::usb::gadget::IUsbGadget; +using ::aidl::android::hardware::usb::gadget::Status; +using ::aidl::android::hardware::usb::gadget::UsbSpeed; +using ::android::base::GetProperty; +using ::android::base::SetProperty; +using ::android::base::unique_fd; +using ::android::base::ReadFileToString; +using ::android::base::Trim; +using ::android::base::WriteStringToFile; +using ::ndk::ScopedAStatus; +using ::std::shared_ptr; +using ::std::string; + +//constexpr char kGadgetName[] = "1000480000.usb"; +constexpr char kGadgetName[] = "1000480000.usb"; +static MonitorFfs monitorFfs(kGadgetName); + +#define UDC_PATH "/sys/class/udc/1000480000.usb/" +#define SPEED_PATH UDC_PATH "current_speed" + +struct UsbGadget : public BnUsbGadget { + UsbGadget(); + + // Makes sure that only one request is processed at a time. + std::mutex mLockSetCurrentFunction; + long mCurrentUsbFunctions; + bool mCurrentUsbFunctionsApplied; + UsbSpeed mUsbSpeed; + + ScopedAStatus setCurrentUsbFunctions(int64_t functions, + const shared_ptr &callback, + int64_t timeoutMs, int64_t in_transactionId) override; + + ScopedAStatus getCurrentUsbFunctions(const shared_ptr &callback, + int64_t in_transactionId) override; + + ScopedAStatus reset(const shared_ptr &callback, + int64_t in_transactionId) override; + + ScopedAStatus getUsbSpeed(const shared_ptr &callback, + int64_t in_transactionId) override; + + private: + Status tearDownGadget(); + Status setupFunctions(long functions, const shared_ptr &callback, + uint64_t timeout, int64_t in_transactionId); +}; + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +} // aidl diff --git a/usb/UsbGadgetCommon.h b/usb/UsbGadgetCommon.h new file mode 100644 index 0000000..e928852 --- /dev/null +++ b/usb/UsbGadgetCommon.h @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace aidl { +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"; +constexpr char kVendorRndisConfig[] = "vendor.usb.rndis.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 FUNCTIONS_PATH GADGET_PATH "functions/" +#define FUNCTION_NAME "function" +#define FUNCTION_PATH CONFIG_PATH FUNCTION_NAME +#define RNDIS_PATH FUNCTIONS_PATH "gsi.rndis" + +using ::android::base::GetProperty; +using ::android::base::SetProperty; +using ::android::base::unique_fd; +using ::android::base::WriteStringToFile; +using ::aidl::android::hardware::usb::gadget::GadgetFunction; +using ::aidl::android::hardware::usb::gadget::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; + +// MonitorFfs automously manages gadget pullup by monitoring +// the ep file status. Restarts the usb gadget when the ep +// owner restarts. +class MonitorFfs { + private: + // Monitors the endpoints Inotify events. + unique_fd mInotifyFd; + // Control pipe for shutting down the mMonitor thread. + // mMonitor exits when SHUTDOWN_MONITOR is written into + // mEventFd/ + unique_fd mEventFd; + // Pools on mInotifyFd and mEventFd. + unique_fd mEpollFd; + vector mWatchFd; + + // Maintains the list of Endpoints. + vector mEndpointList; + // protects the CV. + std::mutex mLock; + std::condition_variable mCv; + // protects mInotifyFd, mEpollFd. + std::mutex mLockFd; + + // Flag to maintain the current status of gadget pullup. + bool mCurrentUsbFunctionsApplied; + + // Thread object that executes the ep monitoring logic. + unique_ptr mMonitor; + // Callback to be invoked when gadget is pulled up. + void (*mCallback)(bool functionsApplied, void* payload); + void* mPayload; + // Name of the USB gadget. Used for pullup. + const char* const mGadgetName; + // Monitor State + bool mMonitorRunning; + + public: + MonitorFfs(const char* const gadget); + // Inits all the UniqueFds. + void reset(); + // Starts monitoring endpoints and pullup the gadget when + // the descriptors are written. + bool startMonitor(); + // Waits for timeout_ms for gadget pull up to happen. + // Returns immediately if the gadget is already pulled up. + bool waitForPullUp(int timeout_ms); + // Adds the given fd to the watch list. + bool addInotifyFd(string fd); + // Adds the given endpoint to the watch list. + void addEndPoint(string ep); + // Registers the async callback from the caller to notify the caller + // when the gadget pull up happens. + void registerFunctionsAppliedCallback(void (*callback)(bool functionsApplied, void*(payload)), + void* payload); + bool isMonitorRunning(); + // Ep monitoring and the gadget pull up logic. + static void* startMonitorFd(void* param); +}; + +//**************** Helper functions ************************// + +// Adds the given fd to the epollfd(epfd). +int addEpollFd(const unique_fd& epfd, const unique_fd& fd); +// 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 Adb to the usb configuration. +Status addAdb(MonitorFfs* monitorFfs, int* functionCount); +// Adds all applicable generic android usb functions other than ADB. +Status addGenericAndroidFunctions(MonitorFfs* monitorFfs, uint64_t functions, bool* ffsEnabled, + int* functionCount); +// Pulls down USB gadget. +Status resetGadget(); + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +} // namespace aidl +#endif diff --git a/usb/UsbGadgetUtils.cpp b/usb/UsbGadgetUtils.cpp new file mode 100644 index 0000000..d9843dc --- /dev/null +++ b/usb/UsbGadgetUtils.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 "UsbGadgetCommon.h" + +namespace aidl { +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 addEpollFd(const unique_fd& epfd, const unique_fd& fd) { + struct epoll_event event; + int ret; + + event.data.fd = fd; + event.events = EPOLLIN; + + ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event); + if (ret) ALOGE("epoll_ctl error %d", errno); + + 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 (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) { + if (!WriteStringToFile(vid, VENDOR_ID_PATH)) return Status::ERROR; + + if (!WriteStringToFile(pid, PRODUCT_ID_PATH)) return Status::ERROR; + + 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"); + + if (!WriteStringToFile("0", DEVICE_CLASS_PATH)) return Status::ERROR; + + if (!WriteStringToFile("0", DEVICE_SUB_CLASS_PATH)) return Status::ERROR; + + if (!WriteStringToFile("0", DEVICE_PROTOCOL_PATH)) return Status::ERROR; + + if (!WriteStringToFile("0", DESC_USE_PATH)) return Status::ERROR; + + if (unlinkFunctions(CONFIG_PATH)) return Status::ERROR; + + return Status::SUCCESS; +} + +Status addGenericAndroidFunctions(MonitorFfs* monitorFfs, uint64_t functions, bool* ffsEnabled, + int* functionCount) { + if (((functions & GadgetFunction::MTP) != 0)) { + *ffsEnabled = true; + ALOGI("setCurrentUsbFunctions mtp"); + if (!WriteStringToFile("1", DESC_USE_PATH)) return Status::ERROR; + + if (!monitorFfs->addInotifyFd("/dev/usb-ffs/mtp/")) return Status::ERROR; + + if (linkFunction("ffs.mtp", (*functionCount)++)) return Status::ERROR; + + // Add endpoints to be monitored. + monitorFfs->addEndPoint("/dev/usb-ffs/mtp/ep1"); + monitorFfs->addEndPoint("/dev/usb-ffs/mtp/ep2"); + monitorFfs->addEndPoint("/dev/usb-ffs/mtp/ep3"); + } else if (((functions & GadgetFunction::PTP) != 0)) { + *ffsEnabled = true; + ALOGI("setCurrentUsbFunctions ptp"); + if (!WriteStringToFile("1", DESC_USE_PATH)) return Status::ERROR; + + if (!monitorFfs->addInotifyFd("/dev/usb-ffs/ptp/")) return Status::ERROR; + + if (linkFunction("ffs.ptp", (*functionCount)++)) return Status::ERROR; + + // Add endpoints to be monitored. + monitorFfs->addEndPoint("/dev/usb-ffs/ptp/ep1"); + monitorFfs->addEndPoint("/dev/usb-ffs/ptp/ep2"); + monitorFfs->addEndPoint("/dev/usb-ffs/ptp/ep3"); + } + + 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"); + std::string rndisFunction = GetProperty(kVendorRndisConfig, ""); + if (rndisFunction != "") { + if (linkFunction(rndisFunction.c_str(), (*functionCount)++)) return Status::ERROR; + } else { + // link gsi.rndis for older pixel projects + if (linkFunction("gsi.rndis", (*functionCount)++)) return Status::ERROR; + } + } + + if ((functions & GadgetFunction::NCM) != 0) { + ALOGI("setCurrentUsbFunctions ncm"); + if (linkFunction("ncm.gs6", (*functionCount)++)) return Status::ERROR; + } + + return Status::SUCCESS; +} + +Status addAdb(MonitorFfs* monitorFfs, int* functionCount) { + ALOGI("setCurrentUsbFunctions Adb"); + if (!WriteStringToFile("1", DESC_USE_PATH)) + return Status::ERROR; + + if (!monitorFfs->addInotifyFd("/dev/usb-ffs/adb/")) return Status::ERROR; + + if (linkFunction("ffs.adb", (*functionCount)++)) return Status::ERROR; + monitorFfs->addEndPoint("/dev/usb-ffs/adb/ep1"); + monitorFfs->addEndPoint("/dev/usb-ffs/adb/ep2"); + ALOGI("Service started"); + return Status::SUCCESS; +} + +} // namespace gadget +} // namespace usb +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/usb/android.hardware.usb.gadget-service.opi.rc b/usb/android.hardware.usb.gadget-service.opi.rc new file mode 100644 index 0000000..54a4405 --- /dev/null +++ b/usb/android.hardware.usb.gadget-service.opi.rc @@ -0,0 +1,4 @@ +service vendor.usb_gadget-opi /apex/com.android.hardware.usb.gadget.opi5/bin/hw/android.hardware.usb.gadget-service.opi + class hal + user system + group system shell mtp diff --git a/usb/android.hardware.usb.gadget-service.opi.xml b/usb/android.hardware.usb.gadget-service.opi.xml new file mode 100644 index 0000000..e7eebc3 --- /dev/null +++ b/usb/android.hardware.usb.gadget-service.opi.xml @@ -0,0 +1,10 @@ + + + android.hardware.usb.gadget + 1 + + IUsbGadget + default + + + diff --git a/usb/apex_file_contexts b/usb/apex_file_contexts new file mode 100644 index 0000000..4b14048 --- /dev/null +++ b/usb/apex_file_contexts @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/android\.hardware\.usb\.gadget-service\.opi u:object_r:hal_usb_gadget_default_exec:s0 diff --git a/usb/apex_manifest.json b/usb/apex_manifest.json new file mode 100644 index 0000000..fbd0033 --- /dev/null +++ b/usb/apex_manifest.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.usb.gadget.opi5", + "version": 1 +} diff --git a/usb/main.cpp b/usb/main.cpp new file mode 100644 index 0000000..693a163 --- /dev/null +++ b/usb/main.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * Copyright (C) 2024 KonstaKANG + * + * 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 "UsbGadget.h" + +#include +#include +#include + +using ::aidl::android::hardware::usb::gadget::UsbGadget; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr usbgadget = ndk::SharedRefBase::make(); + + const std::string instance = std::string() + UsbGadget::descriptor + "/default"; + binder_status_t status = AServiceManager_addService(usbgadget->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +} diff --git a/vendor.prop b/vendor.prop new file mode 100644 index 0000000..7d8df4a --- /dev/null +++ b/vendor.prop @@ -0,0 +1,96 @@ +# Audio +persist.vendor.audio.device=jack +persist.vendor.audio.hdmi.device=vc4hdmi0 +#persist.vendor.audio.pcm.card.auto=true +persist.audio.pcm.card=2 +persist.vendor.audio.pcm.device=0 +ro.config.media_vol_default=20 +ro.config.media_vol_steps=25 +ro.hardware.audio.primary=opi + +# Desktop mode +#persist.wm.debug.desktop_experience_devopts=1 +#persist.wm.debug.desktop_mode_enforce_device_restrictions=false +#persist.wm.debug.force_desktop_first_on_default_display_for_testing=true + +# Bluetooth +bluetooth.device.class_of_device?=90,2,12 +bluetooth.device.default_name=OrangePi 5 Pro +bluetooth.profile.a2dp.sink.enabled?=true +bluetooth.profile.a2dp.source.enabled?=true +bluetooth.profile.asha.central.enabled?=true +bluetooth.profile.avrcp.controller.enabled?=true +bluetooth.profile.avrcp.target.enabled?=true +bluetooth.profile.bap.broadcast.assist.enabled?=true +bluetooth.profile.bap.unicast.client.enabled?=true +bluetooth.profile.bas.client.enabled?=true +bluetooth.profile.ccp.server.enabled?=true +bluetooth.profile.csip.set_coordinator.enabled?=true +bluetooth.profile.gatt.enabled?=true +bluetooth.profile.hap.client.enabled?=true +bluetooth.profile.hfp.ag.enabled?=true +bluetooth.profile.hid.device.enabled?=true +bluetooth.profile.hid.host.enabled?=true +bluetooth.profile.map.server.enabled?=true +bluetooth.profile.mcp.server.enabled?=true +bluetooth.profile.opp.enabled?=true +bluetooth.profile.pan.nap.enabled?=true +bluetooth.profile.pan.panu.enabled?=true +bluetooth.profile.pbap.server.enabled?=true +bluetooth.profile.sap.server.enabled?=true +bluetooth.profile.vcp.controller.enabled?=true +persist.bluetooth.a2dp_aac.vbr_supported=true + +# Camera +ro.hardware.camera=libcamera + +# CEC +#persist.vendor.hdmi.cec_device=cec0 +#ro.hdmi.cec_device_types=playback_device +#ro.hdmi.device_type=4 + +# Chipset +ro.soc.manufacturer=Rockchip +ro.soc.model=RK3588s + + +# FFmpeg +persist.vendor.ffmpeg_codec2.rank.audio=16 +persist.vendor.ffmpeg_codec2.rank.video=256 +persist.vendor.ffmpeg_codec2.v4l2.h265=true + +# Graphics + +#ro.vulkan.abi=arm64-v8a +#ro.vulkan.version=1.2.0 +vendor.hwc.drm.ctm=DRM_OR_IGNORE +#vendor.hwc.drm.disable_hdr=1 +#vendor.hwc.drm.force_mode=1920x1080 + +# Lockscreen +ro.lockscreen.disable.default=true + +# Media +debug.stagefright.c2inputsurface=-1 +media.c2.hal.selection=aidl + +# MGLRU +persist.device_config.mglru_native.lru_gen_config=core + +# Virtualization +ro.boot.hypervisor.vm.supported=1 + +# Wifi +ro.boot.wificountrycode=00 +wifi.interface=wlan0 + +# Window extensions +persist.settings.large_screen_opt.enabled=true + +#minigbm +vendor.minigbm.debug=logbos + +# Mesa +ro.hardware.egl=mesa + + diff --git a/wifi/Android.bp b/wifi/Android.bp new file mode 100644 index 0000000..2ac32dc --- /dev/null +++ b/wifi/Android.bp @@ -0,0 +1,69 @@ +// Copyright (C) 2025 KonstaKANG +// Copyright (C) 2025 Venkata Atchuta Bheemeswara Sarma Darbha +// +// SPDX-License-Identifier: Apache-2.0 + +prebuilt_etc { + name: "android.hardware.wifi.hostapd-service.rc", + src: "android.hardware.wifi.hostapd-service.rc", + installable: false, +} + +prebuilt_etc { + name: "android.hardware.wifi.supplicant-service.rc", + src: "android.hardware.wifi.supplicant-service.rc", + installable: false, +} + +prebuilt_etc { + name: "wpa_supplicant.conf.opi", + src: ":wpa_supplicant_template.conf", + filename: "wpa_supplicant.conf", + relative_install_path: "wifi", + installable: false, +} + +prebuilt_etc { + name: "wpa_supplicant_overlay.conf", + src: "wpa_supplicant_overlay.conf", + relative_install_path: "wifi", + installable: false, +} + +apex { + name: "com.android.hardware.wifi.hostapd.opi5", + manifest: "apex_manifest_hostapd.json", + file_contexts: "apex_file_contexts_hostapd", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: [ + "//external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant:hostapd", + ], + prebuilts: [ + "android.hardware.wifi.hostapd-service.rc", + "android.hardware.wifi.hostapd.xml.prebuilt", + ], +} + +apex { + name: "com.android.hardware.wifi.supplicant.opi5", + manifest: "apex_manifest_supplicant.json", + file_contexts: "apex_file_contexts_supplicant", + key: "com.android.hardware.key", + certificate: ":com.android.hardware.certificate", + updatable: false, + vendor: true, + + binaries: [ + "//external/wpa_supplicant_8/wpa_supplicant/wpa_supplicant:wpa_supplicant", + ], + prebuilts: [ + "android.hardware.wifi.supplicant-service.rc", + "android.hardware.wifi.supplicant.xml.prebuilt", + "wpa_supplicant.conf.opi", + "wpa_supplicant_overlay.conf", + ], +} diff --git a/wifi/android.hardware.wifi.hostapd-service.rc b/wifi/android.hardware.wifi.hostapd-service.rc new file mode 100644 index 0000000..8a020b3 --- /dev/null +++ b/wifi/android.hardware.wifi.hostapd-service.rc @@ -0,0 +1,13 @@ +on property:apex.all.ready=true + mkdir /data/vendor/wifi 0770 wifi wifi + mkdir /data/vendor/wifi/hostapd 0770 wifi wifi + mkdir /data/vendor/wifi/hostapd/sockets 0770 wifi wifi + +service hostapd /apex/com.android.hardware.wifi.hostapd.opi5/bin/hw/hostapd + interface aidl android.hardware.wifi.hostapd.IHostapd/default + class main + capabilities NET_ADMIN NET_RAW + user wifi + group wifi net_raw net_admin + disabled + oneshot diff --git a/wifi/android.hardware.wifi.supplicant-service.rc b/wifi/android.hardware.wifi.supplicant-service.rc new file mode 100644 index 0000000..2fef458 --- /dev/null +++ b/wifi/android.hardware.wifi.supplicant-service.rc @@ -0,0 +1,20 @@ +on property:apex.all.ready=true + mkdir /data/vendor/wifi 0770 wifi wifi + mkdir /data/vendor/wifi/wpa 0770 wifi wifi + mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi + +service wpa_supplicant /apex/com.android.hardware.wifi.supplicant.opi5/bin/hw/wpa_supplicant \ + -O/data/vendor/wifi/wpa/sockets -dd \ + -g@android:wpa_wlan0 + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + interface aidl android.hardware.wifi.supplicant.ISupplicant/default + class main + socket wpa_wlan0 dgram 660 wifi wifi + user wifi + group wifi net_raw net_admin + capabilities NET_RAW NET_ADMIN + disabled + oneshot diff --git a/wifi/apex_file_contexts_hostapd b/wifi/apex_file_contexts_hostapd new file mode 100644 index 0000000..aff5bfc --- /dev/null +++ b/wifi/apex_file_contexts_hostapd @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/hostapd u:object_r:hal_wifi_hostapd_default_exec:s0 diff --git a/wifi/apex_file_contexts_supplicant b/wifi/apex_file_contexts_supplicant new file mode 100644 index 0000000..48e4be6 --- /dev/null +++ b/wifi/apex_file_contexts_supplicant @@ -0,0 +1,3 @@ +(/.*)? u:object_r:vendor_file:s0 +/etc(/.*)? u:object_r:vendor_configs_file:s0 +/bin/hw/wpa_supplicant u:object_r:hal_wifi_supplicant_default_exec:s0 diff --git a/wifi/apex_manifest_hostapd.json b/wifi/apex_manifest_hostapd.json new file mode 100644 index 0000000..3171524 --- /dev/null +++ b/wifi/apex_manifest_hostapd.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.wifi.hostapd.opi5", + "version": 1 +} diff --git a/wifi/apex_manifest_supplicant.json b/wifi/apex_manifest_supplicant.json new file mode 100644 index 0000000..2b5aed3 --- /dev/null +++ b/wifi/apex_manifest_supplicant.json @@ -0,0 +1,4 @@ +{ + "name": "com.android.hardware.wifi.supplicant.opi5", + "version": 1 +} diff --git a/wifi/wpa_supplicant_overlay.conf b/wifi/wpa_supplicant_overlay.conf new file mode 100644 index 0000000..740792b --- /dev/null +++ b/wifi/wpa_supplicant_overlay.conf @@ -0,0 +1,5 @@ +disable_scan_offload=1 +wowlan_triggers=any +p2p_disabled=1 +filter_rssi=-75 +no_ctrl_interface= \ No newline at end of file diff --git a/wrimg.sh b/wrimg.sh new file mode 100755 index 0000000..6146266 --- /dev/null +++ b/wrimg.sh @@ -0,0 +1,136 @@ +#!/bin/bash + +# +# Copyright (C) 2025 KonstaKANG +# +# SPDX-License-Identifier: Apache-2.0 +# + +exit_with_error() { + echo $@ + exit 1 +} + +check_device() { + for PARTITION in "1" "2" "3" "4"; do + if [ ! -b /dev/${1}${PARTITION} ]; then + return 1 + fi + done + + PARTITION1=$(lsblk -o LABEL,SIZE -b /dev/${1}1 | tail -n 1) + PARTITION2=$(lsblk -o LABEL,SIZE -b /dev/${1}2 | tail -n 1) + PARTITION3=$(lsblk -o LABEL,SIZE -b /dev/${1}3 | tail -n 1) + PARTITION4=$(lsblk -o LABEL,SIZE -b /dev/${1}4 | tail -n 1) + + if [ $(echo ${PARTITION1} | awk {'print $1'}) != "boot" ] || [ $(echo ${PARTITION1} | awk {'print $2'}) != "134217728" ]; then + return 1 + fi + if [ $(echo ${PARTITION2} | awk {'print $1'}) != "/" ] || [ $(echo ${PARTITION2} | awk {'print $2'}) != "2684354560" ]; then + return 1 + fi + if [ $(echo ${PARTITION3} | awk {'print $1'}) != "vendor" ] || [ $(echo ${PARTITION3} | awk {'print $2'}) != "268435456" ]; then + return 1 + fi + if [ $(echo ${PARTITION4} | awk {'print $1'}) != "userdata" ]; then + return 1 + fi + + DEVICE=${1} + return 0 +} + +find_device() { + for SDX in "sda" "sdb" "sdc" "sdd"; do + check_device ${SDX} + if [ $? == "0" ]; then + break + fi + done + + if [ -z ${DEVICE} ]; then + exit_with_error "Unable to find suitable block device!" + fi +} + +confirm() { + echo "Build target ${1}..." + if [ "${2}" == "wipe" ]; then + echo "Wiping userdata partition..." + else + echo "Writing ${2} image..." + fi + echo "Writing to device /dev/${DEVICE}..." + lsblk -o NAME,LABEL,SIZE /dev/${DEVICE} + + read -p "Continue (y/n)? " -n 1 -r RESPONSE + echo "" + if [[ ! ${RESPONSE} =~ ^[Yy]$ ]]; then + exit_with_error "Exiting!" + fi +} + +write_partition() { + if [ ! -f ${ANDROID_PRODUCT_OUT}/${1}.img ]; then + exit_with_error "Partition image not found. Run 'make ${1}image' first." + fi + + echo "Copying ${1}..." + sudo umount /dev/${DEVICE}${2} + sudo dd if=${ANDROID_PRODUCT_OUT}/${1}.img of=/dev/${DEVICE}${2} bs=1M +} + +wipe_userdata() { + echo "Creating userdata..." + sudo umount /dev/${DEVICE}4 + sudo wipefs -a /dev/${DEVICE}4 + sudo mkfs.ext4 /dev/${DEVICE}4 -I 512 -L userdata +} + +finish() { + sync + echo "Done!" + exit 0 +} + +if [ -z ${TARGET_PRODUCT} ]; then + exit_with_error "TARGET_PRODUCT environment variable is not set. Run lunch first." +fi + +if [ -z ${ANDROID_PRODUCT_OUT} ]; then + exit_with_error "ANDROID_PRODUCT_OUT environment variable is not set. Run lunch first." +fi + +TARGET=$(echo ${TARGET_PRODUCT} | sed 's/^aosp_//') +DEVICE= + +if [ -z $1 ]; then + find_device + confirm ${TARGET} "boot, system, and vendor" + write_partition boot 1 + write_partition system 2 + write_partition vendor 3 + finish +elif [ ! -z $1 ] && [ $1 == "boot" ]; then + find_device + confirm ${TARGET} "boot" + write_partition boot 1 + finish +elif [ ! -z $1 ] && [ $1 == "system" ]; then + find_device + confirm ${TARGET} "system" + write_partition system 2 + finish +elif [ ! -z $1 ] && [ $1 == "vendor" ]; then + find_device + confirm ${TARGET} "vendor" + write_partition vendor 3 + finish +elif [ ! -z $1 ] && [ $1 == "wipe" ]; then + find_device + confirm ${TARGET} "wipe" + wipe_userdata + finish +else + exit_with_error "Usage: $0 [boot|system|vendor|wipe]" +fi