From 1c2dbd8222ff7e51bf344765acd252859fbf09f7 Mon Sep 17 00:00:00 2001 From: Alex Hong Date: Fri, 16 Aug 2019 01:22:57 +0800 Subject: [PATCH] Create aosp_redfin target Bug: 139478768 Change-Id: I061f89a72b5e7b81280406abf85cca479b86f340 --- Android.bp | 6 + Android.mk | 22 + AndroidProducts.mk | 21 + BoardConfig-common.mk | 259 +++ CleanSpec.mk | 90 + WCNSS_qcom_cfg.ini | 429 +++++ aosp_redfin.mk | 47 + board-info.txt | 1 + compatibility_matrix.xml | 58 + config.fs | 91 + default-permissions.xml | 58 + device-common.mk | 66 + device-redfin.mk | 23 + device.mk | 784 ++++++++ device_framework_matrix.xml | 241 +++ dumpstate/Android.mk | 43 + dumpstate/DumpstateDevice.cpp | 488 +++++ dumpstate/DumpstateDevice.h | 54 + ...d.hardware.dumpstate@1.0-service.redfin.rc | 10 + dumpstate/service.cpp | 43 + framework_manifest.xml | 39 + fstab.hardware | 12 + fstab.persist | 4 + fstab.postinstall | 17 + gps.conf | 297 +++ gpt-utils/Android.mk | 46 + gpt-utils/gpt-utils.cpp | 1542 +++++++++++++++ gpt-utils/gpt-utils.h | 196 ++ health/Android.bp | 54 + health/HealthService.cpp | 139 ++ ...roid.hardware.health@2.0-service.redfin.rc | 5 + hidl/android.hidl.base@1.0.so-32 | Bin 0 -> 84880 bytes hidl/android.hidl.base@1.0.so-64 | Bin 0 -> 98936 bytes init.hardware.chamber.rc.userdebug | 26 + init.hardware.diag.rc.user | 19 + init.hardware.diag.rc.userdebug | 110 ++ init.hardware.ipa.rc.userdebug | 19 + init.hardware.mpssrfs.rc.user | 5 + init.hardware.mpssrfs.rc.userdebug | 11 + init.hardware.rc | 755 ++++++++ init.hardware.usb.rc | 103 + init.insmod.redfin.cfg | 19 + init.insmod.sh | 31 + init.logging.rc | 4 + init.mdm.sh | 34 + init.msm.usb.configfs.rc | 1216 ++++++++++++ init.power.rc | 114 ++ init.qcom.modem_links.sh | 132 ++ init.qcom.usb.rc | 1665 +++++++++++++++++ init.qcom.usb.sh | 245 +++ init.qcom.wlan.sh | 6 + init.qti.getbootdevice.sh | 55 + init.qti.qseecomd.sh | 35 + init.radio.sh | 38 + init.recovery.device.rc | 10 + init.sensors.sh | 6 + json-c/AUTHORS | 5 + json-c/Android.configure.mk | 39 + json-c/Android.mk | 35 + json-c/COPYING | 42 + json-c/ChangeLog | 218 +++ json-c/Doxyfile | 1153 ++++++++++++ json-c/Makefile.am | 74 + json-c/Makefile.am.inc | 2 + json-c/README | 0 json-c/README-WIN32.html | 50 + json-c/README.html | 34 + json-c/README.md | 63 + json-c/RELEASE_CHECKLIST.txt | 132 ++ json-c/arraylist.c | 102 + json-c/arraylist.h | 56 + json-c/autogen.sh | 13 + json-c/bits.h | 35 + json-c/check.log | 2 + json-c/config.h | 178 ++ json-c/config.h.in | 177 ++ json-c/configure.ac | 107 ++ json-c/debug.c | 83 + json-c/debug.h | 71 + json-c/json-c-uninstalled.pc.in | 11 + json-c/json-c.pc.in | 11 + json-c/json.h | 33 + json-c/json_c_version.c | 20 + json-c/json_c_version.h | 22 + json-c/json_config.h | 4 + json-c/json_config.h.in | 3 + json-c/json_inttypes.h | 28 + json-c/json_object.c | 913 +++++++++ json-c/json_object.h | 617 ++++++ json-c/json_object_iterator.c | 168 ++ json-c/json_object_iterator.h | 239 +++ json-c/json_object_private.h | 47 + json-c/json_tokener.c | 887 +++++++++ json-c/json_tokener.h | 208 ++ json-c/json_util.c | 299 +++ json-c/json_util.h | 50 + json-c/libjson.c | 26 + json-c/linkhash.c | 602 ++++++ json-c/linkhash.h | 292 +++ json-c/math_compat.h | 28 + json-c/printbuf.c | 193 ++ json-c/printbuf.h | 77 + json-c/random_seed.c | 237 +++ json-c/random_seed.h | 25 + keymaster/Android.bp | 27 + keymaster/wait_for_strongbox.cpp | 59 + manifest.xml | 605 ++++++ media_codecs.xml | 422 +++++ media_codecs_performance.xml | 141 ++ media_codecs_vendor_audio.xml | 28 + media_profiles.xml | 1650 ++++++++++++++++ media_profiles_V1_0.xml | 551 ++++++ nfc/libese-hal-st.conf | 6 + nfc/libnfc-hal-st.conf | 148 ++ nfc/libnfc-nci.conf | 102 + .../res/res/values-mcc440-mnc20/config.xml | 30 + .../base/core/res/res/values/config.xml | 293 +++ .../base/core/res/res/values/strings.xml | 25 + .../res/values-mcc440-mnc20/config.xml | 26 + .../apps/Bluetooth/res/values/config.xml | 18 + .../face_enroll_introduction_animation.mp4 | Bin 0 -> 967535 bytes .../res/values-mcc262-mnc01/strings.xml | 22 + .../apps/Settings/res/values/bools.xml | 20 + .../apps/Settings/res/values/config.xml | 23 + .../services/Telephony/res/values/config.xml | 31 + p2p_supplicant_overlay.conf | 2 + pixelstats/Android.bp | 36 + pixelstats/pixelstats-vendor.redfin.rc | 4 + pixelstats/service.cpp | 62 + power/hint-data.h | 62 + power/list.h | 41 + power/metadata-defs.h | 54 + power/performance.h | 265 +++ power/power-common.h | 49 + power/powerhintparser.h | 48 + power/utils.h | 47 + powerhint.json | 650 +++++++ product.prop | 94 + recovery.wipe | 12 + recovery/Android.bp | 39 + recovery/recovery_ui.cpp | 92 + redfin/AndroidBoard.mk | 56 + redfin/BoardConfig.mk | 21 + redfin/init.redfin.rc | 24 + .../base/core/res/res/values/config.xml | 692 +++++++ .../base/core/res/res/xml/power_profile.xml | 207 ++ .../packages/SystemUI/res/values/config.xml | 61 + sec_config | 330 ++++ seccomp_policy/mediacodec.policy | 9 + sensors.hals.conf | 1 + thermal-engine-redfin.conf | 58 + thermal-engine/thermal_client.h | 94 + thermal_info_config_redfin.json | 346 ++++ ueventd.rc | 139 ++ usb/.clang-format | 14 + usb/Android.bp | 36 + usb/Usb.cpp | 785 ++++++++ usb/Usb.h | 81 + usb/UsbGadget.cpp | 344 ++++ usb/UsbGadget.h | 95 + ...android.hardware.usb@1.2-service.redfin.rc | 12 + usb/service.cpp | 62 + utils.mk | 201 ++ vibrator/Android.bp | 82 + vibrator/AndroidTest.xml | 28 + vibrator/Hardware.cpp | 209 +++ vibrator/Hardware.h | 134 ++ vibrator/OWNERS | 3 + vibrator/Vibrator.cpp | 415 ++++ vibrator/Vibrator.h | 166 ++ ...id.hardware.vibrator@1.3-service.redfin.rc | 38 + ...d.hardware.vibrator@1.3-service.redfin.xml | 11 + vibrator/service.cpp | 48 + vibrator/tests/main.cpp | 22 + vibrator/tests/mocks.h | 60 + vibrator/tests/test-hwapi.cpp | 322 ++++ vibrator/tests/test-hwcal.cpp | 302 +++ vibrator/tests/test-vibrator.cpp | 464 +++++ vibrator/tests/types.h | 33 + vibrator/tests/utils.h | 39 + vibrator/utils.h | 35 + voice_processing/Android.mk | 29 + .../voice_processing_descriptors.c | 47 + wifi_concurrency_cfg.txt | 3 + wpa_supplicant_overlay.conf | 8 + wpa_supplicant_wcn.conf | 830 ++++++++ 186 files changed, 30334 insertions(+) create mode 100644 Android.bp create mode 100644 Android.mk create mode 100644 AndroidProducts.mk create mode 100644 BoardConfig-common.mk create mode 100644 CleanSpec.mk create mode 100644 WCNSS_qcom_cfg.ini create mode 100644 aosp_redfin.mk create mode 100644 board-info.txt create mode 100644 compatibility_matrix.xml create mode 100644 config.fs create mode 100644 default-permissions.xml create mode 100644 device-common.mk create mode 100644 device-redfin.mk create mode 100644 device.mk create mode 100644 device_framework_matrix.xml create mode 100644 dumpstate/Android.mk create mode 100755 dumpstate/DumpstateDevice.cpp create mode 100644 dumpstate/DumpstateDevice.h create mode 100644 dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc create mode 100644 dumpstate/service.cpp create mode 100644 framework_manifest.xml create mode 100644 fstab.hardware create mode 100644 fstab.persist create mode 100644 fstab.postinstall create mode 100644 gps.conf create mode 100644 gpt-utils/Android.mk create mode 100644 gpt-utils/gpt-utils.cpp create mode 100644 gpt-utils/gpt-utils.h create mode 100644 health/Android.bp create mode 100644 health/HealthService.cpp create mode 100644 health/android.hardware.health@2.0-service.redfin.rc create mode 100755 hidl/android.hidl.base@1.0.so-32 create mode 100755 hidl/android.hidl.base@1.0.so-64 create mode 100644 init.hardware.chamber.rc.userdebug create mode 100644 init.hardware.diag.rc.user create mode 100644 init.hardware.diag.rc.userdebug create mode 100644 init.hardware.ipa.rc.userdebug create mode 100644 init.hardware.mpssrfs.rc.user create mode 100644 init.hardware.mpssrfs.rc.userdebug create mode 100644 init.hardware.rc create mode 100644 init.hardware.usb.rc create mode 100644 init.insmod.redfin.cfg create mode 100755 init.insmod.sh create mode 100644 init.logging.rc create mode 100644 init.mdm.sh create mode 100644 init.msm.usb.configfs.rc create mode 100644 init.power.rc create mode 100644 init.qcom.modem_links.sh create mode 100644 init.qcom.usb.rc create mode 100644 init.qcom.usb.sh create mode 100644 init.qcom.wlan.sh create mode 100644 init.qti.getbootdevice.sh create mode 100644 init.qti.qseecomd.sh create mode 100644 init.radio.sh create mode 100644 init.recovery.device.rc create mode 100644 init.sensors.sh create mode 100644 json-c/AUTHORS create mode 100644 json-c/Android.configure.mk create mode 100644 json-c/Android.mk create mode 100644 json-c/COPYING create mode 100644 json-c/ChangeLog create mode 100644 json-c/Doxyfile create mode 100644 json-c/Makefile.am create mode 100644 json-c/Makefile.am.inc create mode 100644 json-c/README create mode 100644 json-c/README-WIN32.html create mode 100644 json-c/README.html create mode 100644 json-c/README.md create mode 100644 json-c/RELEASE_CHECKLIST.txt create mode 100644 json-c/arraylist.c create mode 100644 json-c/arraylist.h create mode 100755 json-c/autogen.sh create mode 100644 json-c/bits.h create mode 100644 json-c/check.log create mode 100644 json-c/config.h create mode 100644 json-c/config.h.in create mode 100644 json-c/configure.ac create mode 100644 json-c/debug.c create mode 100644 json-c/debug.h create mode 100644 json-c/json-c-uninstalled.pc.in create mode 100644 json-c/json-c.pc.in create mode 100644 json-c/json.h create mode 100644 json-c/json_c_version.c create mode 100644 json-c/json_c_version.h create mode 100644 json-c/json_config.h create mode 100644 json-c/json_config.h.in create mode 100644 json-c/json_inttypes.h create mode 100644 json-c/json_object.c create mode 100644 json-c/json_object.h create mode 100644 json-c/json_object_iterator.c create mode 100644 json-c/json_object_iterator.h create mode 100644 json-c/json_object_private.h create mode 100644 json-c/json_tokener.c create mode 100644 json-c/json_tokener.h create mode 100644 json-c/json_util.c create mode 100644 json-c/json_util.h create mode 100644 json-c/libjson.c create mode 100644 json-c/linkhash.c create mode 100644 json-c/linkhash.h create mode 100644 json-c/math_compat.h create mode 100644 json-c/printbuf.c create mode 100644 json-c/printbuf.h create mode 100644 json-c/random_seed.c create mode 100644 json-c/random_seed.h create mode 100644 keymaster/Android.bp create mode 100644 keymaster/wait_for_strongbox.cpp create mode 100644 manifest.xml create mode 100644 media_codecs.xml create mode 100644 media_codecs_performance.xml create mode 100644 media_codecs_vendor_audio.xml create mode 100644 media_profiles.xml create mode 100644 media_profiles_V1_0.xml create mode 100644 nfc/libese-hal-st.conf create mode 100644 nfc/libnfc-hal-st.conf create mode 100644 nfc/libnfc-nci.conf create mode 100644 overlay/frameworks/base/core/res/res/values-mcc440-mnc20/config.xml create mode 100755 overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 overlay/frameworks/base/core/res/res/values/strings.xml create mode 100644 overlay/frameworks/base/packages/SystemUI/res/values-mcc440-mnc20/config.xml create mode 100644 overlay/packages/apps/Bluetooth/res/values/config.xml create mode 100644 overlay/packages/apps/Settings/res/raw/face_enroll_introduction_animation.mp4 create mode 100644 overlay/packages/apps/Settings/res/values-mcc262-mnc01/strings.xml create mode 100755 overlay/packages/apps/Settings/res/values/bools.xml create mode 100755 overlay/packages/apps/Settings/res/values/config.xml create mode 100644 overlay/packages/services/Telephony/res/values/config.xml create mode 100644 p2p_supplicant_overlay.conf create mode 100644 pixelstats/Android.bp create mode 100644 pixelstats/pixelstats-vendor.redfin.rc create mode 100644 pixelstats/service.cpp create mode 100644 power/hint-data.h create mode 100644 power/list.h create mode 100644 power/metadata-defs.h create mode 100644 power/performance.h create mode 100644 power/power-common.h create mode 100644 power/powerhintparser.h create mode 100644 power/utils.h create mode 100644 powerhint.json create mode 100644 product.prop create mode 100644 recovery.wipe create mode 100644 recovery/Android.bp create mode 100644 recovery/recovery_ui.cpp create mode 100644 redfin/AndroidBoard.mk create mode 100644 redfin/BoardConfig.mk create mode 100644 redfin/init.redfin.rc create mode 100755 redfin/overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 redfin/overlay/frameworks/base/core/res/res/xml/power_profile.xml create mode 100644 redfin/overlay/frameworks/base/packages/SystemUI/res/values/config.xml create mode 100644 sec_config create mode 100644 seccomp_policy/mediacodec.policy create mode 100644 sensors.hals.conf create mode 100644 thermal-engine-redfin.conf create mode 100644 thermal-engine/thermal_client.h create mode 100644 thermal_info_config_redfin.json create mode 100644 ueventd.rc create mode 100644 usb/.clang-format create mode 100644 usb/Android.bp create mode 100644 usb/Usb.cpp create mode 100644 usb/Usb.h create mode 100644 usb/UsbGadget.cpp create mode 100644 usb/UsbGadget.h create mode 100644 usb/android.hardware.usb@1.2-service.redfin.rc create mode 100644 usb/service.cpp create mode 100644 utils.mk create mode 100644 vibrator/Android.bp create mode 100644 vibrator/AndroidTest.xml create mode 100644 vibrator/Hardware.cpp create mode 100644 vibrator/Hardware.h create mode 100644 vibrator/OWNERS create mode 100644 vibrator/Vibrator.cpp create mode 100644 vibrator/Vibrator.h create mode 100644 vibrator/android.hardware.vibrator@1.3-service.redfin.rc create mode 100644 vibrator/android.hardware.vibrator@1.3-service.redfin.xml create mode 100644 vibrator/service.cpp create mode 100644 vibrator/tests/main.cpp create mode 100644 vibrator/tests/mocks.h create mode 100644 vibrator/tests/test-hwapi.cpp create mode 100644 vibrator/tests/test-hwcal.cpp create mode 100644 vibrator/tests/test-vibrator.cpp create mode 100644 vibrator/tests/types.h create mode 100644 vibrator/tests/utils.h create mode 100644 vibrator/utils.h create mode 100644 voice_processing/Android.mk create mode 100644 voice_processing/voice_processing_descriptors.c create mode 100644 wifi_concurrency_cfg.txt create mode 100644 wpa_supplicant_overlay.conf create mode 100644 wpa_supplicant_wcn.conf diff --git a/Android.bp b/Android.bp new file mode 100644 index 0000000..e69df8d --- /dev/null +++ b/Android.bp @@ -0,0 +1,6 @@ +soong_namespace { + imports: [ + "hardware/google/interfaces", + "hardware/google/pixel", + ], +} diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..cb53d63 --- /dev/null +++ b/Android.mk @@ -0,0 +1,22 @@ +# +# Copyright 2018 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. +# + +LOCAL_PATH := $(call my-dir) + +ifeq ($(USES_DEVICE_GOOGLE_REDFIN),true) + subdir_makefiles=$(call first-makefiles-under,$(LOCAL_PATH)) + $(foreach mk,$(subdir_makefiles),$(info including $(mk) ...)$(eval include $(mk))) +endif diff --git a/AndroidProducts.mk b/AndroidProducts.mk new file mode 100644 index 0000000..3e36787 --- /dev/null +++ b/AndroidProducts.mk @@ -0,0 +1,21 @@ +# +# Copyright 2018 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. +# + +PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/aosp_redfin.mk \ + +COMMON_LUNCH_CHOICES := \ + aosp_redfin-userdebug \ diff --git a/BoardConfig-common.mk b/BoardConfig-common.mk new file mode 100644 index 0000000..55f8c46 --- /dev/null +++ b/BoardConfig-common.mk @@ -0,0 +1,259 @@ +# +# Copyright (C) 2016 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +include build/make/target/board/BoardConfigMainlineCommon.mk + +TARGET_BOARD_PLATFORM := lito +TARGET_BOARD_INFO_FILE := device/google/redfin/board-info.txt +USES_DEVICE_GOOGLE_REDFIN := true +TARGET_ARCH := arm64 +TARGET_ARCH_VARIANT := armv8-2a +TARGET_CPU_ABI := arm64-v8a +TARGET_CPU_ABI2 := +TARGET_CPU_VARIANT := cortex-a76 + +TARGET_2ND_ARCH := arm +TARGET_2ND_ARCH_VARIANT := armv8-a +TARGET_2ND_CPU_ABI := armeabi-v7a +TARGET_2ND_CPU_ABI2 := armeabi +TARGET_2ND_CPU_VARIANT := cortex-a76 + +BUILD_BROKEN_ENG_DEBUG_TAGS := true + +TARGET_BOARD_COMMON_PATH := device/google/redfin/sm7250 + +BOARD_KERNEL_CMDLINE += console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on +BOARD_KERNEL_CMDLINE += msm_rtb.filter=0x237 +BOARD_KERNEL_CMDLINE += ehci-hcd.park=3 +BOARD_KERNEL_CMDLINE += service_locator.enable=1 +BOARD_KERNEL_CMDLINE += androidboot.memcg=1 cgroup.memory=nokmem +BOARD_KERNEL_CMDLINE += lpm_levels.sleep_disabled=1 # STOPSHIP b/113233473 +BOARD_KERNEL_CMDLINE += usbcore.autosuspend=7 +BOARD_KERNEL_CMDLINE += androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 +BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive # STOPSHIP b/113232677 +BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/1d84000.ufshc + +BOARD_KERNEL_BASE := 0x00000000 +BOARD_KERNEL_PAGESIZE := 4096 + +BOARD_INCLUDE_DTB_IN_BOOTIMG := true +BOARD_BOOT_HEADER_VERSION := 2 +BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOT_HEADER_VERSION) + +# DTBO partition definitions +BOARD_PREBUILT_DTBOIMAGE := device/google/redfin-kernel/dtbo.img +BOARD_DTBOIMG_PARTITION_SIZE := 8388608 + +TARGET_NO_KERNEL := false +BOARD_USES_RECOVERY_AS_BOOT := true +BOARD_USES_METADATA_PARTITION := true + +AB_OTA_UPDATER := true + +AB_OTA_PARTITIONS += \ + boot \ + system \ + vbmeta \ + dtbo \ + product \ + vbmeta_system + +# Partitions (listed in the file) to be wiped under recovery. +TARGET_RECOVERY_WIPE := device/google/redfin/recovery.wipe +TARGET_RECOVERY_FSTAB := device/google/redfin/fstab.hardware +TARGET_RECOVERY_PIXEL_FORMAT := RGBX_8888 +TARGET_RECOVERY_UI_LIB := \ + librecovery_ui_redfin \ + libnos_citadel_for_recovery \ + libnos_for_recovery + +# Enable chain partition for system. +BOARD_AVB_VBMETA_SYSTEM := system +BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem +BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048 +BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) +BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1 + +# product.img +BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := ext4 + +# userdata.img +TARGET_USERIMAGES_USE_F2FS := true +BOARD_USERDATAIMAGE_PARTITION_SIZE := 10737418240 +BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := f2fs + +# persist.img +BOARD_PERSISTIMAGE_PARTITION_SIZE := 33554432 +BOARD_PERSISTIMAGE_FILE_SYSTEM_TYPE := ext4 + +# boot.img +BOARD_BOOTIMAGE_PARTITION_SIZE := 0x04000000 + +BOARD_FLASH_BLOCK_SIZE := 131072 + +BOARD_ROOT_EXTRA_SYMLINKS := /vendor/lib/dsp:/dsp +BOARD_ROOT_EXTRA_SYMLINKS += /mnt/vendor/persist:/persist + +include device/google/redfin-sepolicy/redfin-sepolicy.mk + +TARGET_FS_CONFIG_GEN := device/google/redfin/config.fs + +QCOM_BOARD_PLATFORMS += lito +QC_PROP_ROOT := vendor/qcom/sm7250/proprietary +QC_PROP_PATH := $(QC_PROP_ROOT) +BOARD_HAVE_BLUETOOTH_QCOM := true +BOARD_HAVE_QCOM_FM := false +BOARD_USES_COMMON_BLUETOOTH_HAL := true + +# Camera +TARGET_USES_AOSP := true +BOARD_QTI_CAMERA_32BIT_ONLY := false +CAMERA_DAEMON_NOT_PRESENT := true +TARGET_USES_ION := true + +# GPS +TARGET_NO_RPC := true +TARGET_USES_HARDWARE_QCOM_GPS := false +BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE := default +BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET := true + +# RenderScript +OVERRIDE_RS_DRIVER := libRSDriver_adreno.so + +# Sensors +USE_SENSOR_MULTI_HAL := true +TARGET_SUPPORT_DIRECT_REPORT := true +# Enable sensor Version V_2 +USE_SENSOR_HAL_VER := 2.0 + +# wlan +BOARD_WLAN_DEVICE := qcwcn +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +BOARD_HOSTAPD_DRIVER := NL80211 +WIFI_DRIVER_DEFAULT := qca_cld3 +WPA_SUPPLICANT_VERSION := VER_0_8_X +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE) +WIFI_HIDL_FEATURE_AWARE := true +WIFI_HIDL_FEATURE_DUAL_INTERFACE:= true + +# Audio +BOARD_USES_ALSA_AUDIO := true +AUDIO_FEATURE_ENABLED_MULTI_VOICE_SESSIONS := true +AUDIO_FEATURE_ENABLED_SND_MONITOR := true +AUDIO_FEATURE_ENABLED_USB_TUNNEL := true +AUDIO_FEATURE_ENABLED_CIRRUS_SPKR_PROTECTION := true +BOARD_SUPPORTS_SOUND_TRIGGER := true +AUDIO_FEATURE_FLICKER_SENSOR_INPUT := true +SOUND_TRIGGER_FEATURE_LPMA_ENABLED := true +AUDIO_FEATURE_ENABLED_MAXX_AUDIO := true +AUDIO_FEATURE_ENABLED_24BITS_CAMCORDER := true +AUDIO_FEATURE_ENABLED_AUDIO_ZOOM := true +AUDIO_FEATURE_ENABLED_INSTANCE_ID := true + +# Audio hal flag +TARGET_USES_HARDWARE_QCOM_AUDIO := true +TARGET_USES_HARDWARE_QCOM_AUDIO_PLATFORM_8974 := true +TARGET_USES_HARDWARE_QCOM_AUDIO_POSTPROC := true +TARGET_USES_HARDWARE_QCOM_AUDIO_VOLUME_LISTENER := true +TARGET_USES_HARDWARE_QCOM_AUDIO_GET_MMAP_DATA_FD := true +TARGET_USES_HARDWARE_QCOM_AUDIO_APP_TYPE_CFG := true +TARGET_USES_HARDWARE_QCOM_AUDIO_ACDB_INIT_V2_CVD := true +TARGET_USES_HARDWARE_QCOM_AUDIO_MAX_TARGET_SPECIFIC_CHANNEL_CNT := "4" +TARGET_USES_HARDWARE_QCOM_AUDIO_INCALL_MUSIC_ENABLED := true +TARGET_USES_HARDWARE_QCOM_AUDIO_MULTIPLE_HW_VARIANTS_ENABLED := true +TARGET_USES_HARDWARE_QCOM_AUDIO_INCALL_STEREO_CAPTURE_ENABLED := true + +# Graphics +TARGET_USES_GRALLOC1 := true +TARGET_USES_HWC2 := true + +VSYNC_EVENT_PHASE_OFFSET_NS := 2000000 +SF_VSYNC_EVENT_PHASE_OFFSET_NS := 6000000 + +# Display +TARGET_USES_DISPLAY_RENDER_INTENTS := true +TARGET_USES_COLOR_METADATA := true +TARGET_USES_DRM_PP := true + +# Misc +TARGET_USES_HARDWARE_QCOM_BOOTCTRL := true + + +# Vendor Interface Manifest +DEVICE_MANIFEST_FILE := device/google/redfin/manifest.xml +DEVICE_MATRIX_FILE := device/google/redfin/compatibility_matrix.xml +DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := device/google/redfin/device_framework_matrix.xml +DEVICE_FRAMEWORK_MANIFEST_FILE := device/google/redfin/framework_manifest.xml + +# Use mke2fs to create ext4 images +TARGET_USES_MKE2FS := true + +BOARD_EXT4_SHARE_DUP_BLOCKS := true + +# Kernel modules +ifeq (,$(filter-out redfin_kasan, $(TARGET_PRODUCT))) +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/kasan/*.ko) +else ifeq (,$(filter-out redfin_kernel_debug_memory, $(TARGET_PRODUCT))) +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/debug_memory/*.ko) +else ifeq (,$(filter-out redfin_kernel_debug_locking, $(TARGET_PRODUCT))) +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/debug_locking/*.ko) +else ifeq (,$(filter-out redfin_kernel_debug_hang, $(TARGET_PRODUCT))) +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/debug_hang/*.ko) +else ifeq (,$(filter-out redfin_kernel_debug_api, $(TARGET_PRODUCT))) +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/debug_api/*.ko) +else +BOARD_VENDOR_KERNEL_MODULES += \ + $(wildcard device/google/redfin-kernel/*.ko) +endif + +BOARD_SUPER_PARTITION_SIZE := 9755951104 +BOARD_SUPER_PARTITION_GROUPS := google_dynamic_partitions +BOARD_GOOGLE_DYNAMIC_PARTITIONS_PARTITION_LIST := \ + system \ + vendor \ + product + +#BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE is set to BOARD_SUPER_PARTITION_SIZE / 2 - 4MB +BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 4873781248 + +# Set error limit to BOARD_SUPER_PARTITON_SIZE - 500MB +BOARD_SUPER_PARTITION_ERROR_LIMIT := 9231663104 + +# DTB +ifeq (,$(filter-out redfin_kasan, $(TARGET_PRODUCT))) +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/kasan +else ifeq (,$(filter-out redfin_kernel_debug_memory, $(TARGET_PRODUCT))) +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_memory +else ifeq (,$(filter-out redfin_kernel_debug_locking, $(TARGET_PRODUCT))) +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_locking +else ifeq (,$(filter-out redfin_kernel_debug_hang, $(TARGET_PRODUCT))) +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_hang +else ifeq (,$(filter-out redfin_kernel_debug_api, $(TARGET_PRODUCT))) +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_api +else +BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel +endif + +# Testing related defines +#BOARD_PERFSETUP_SCRIPT := platform_testing/scripts/perf-setup/r3-setup.sh + +-include vendor/google_devices/redfin/proprietary/BoardConfigVendor.mk diff --git a/CleanSpec.mk b/CleanSpec.mk new file mode 100644 index 0000000..5643126 --- /dev/null +++ b/CleanSpec.mk @@ -0,0 +1,90 @@ +# Copyright 2018 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. +# + +# If you don't need to do a full clean build but would like to touch +# a file or delete some intermediate files, add a clean step to the end +# of the list. These steps will only be run once, if they haven't been +# run before. +# +# E.g.: +# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) +# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) +# +# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with +# files that are missing or have been moved. +# +# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. +# Use $(OUT_DIR) to refer to the "out" directory. +# +# If you need to re-do something that's already mentioned, just copy +# the command and add it to the bottom of the list. E.g., if a change +# that you made last week required touching a file and a change you +# made today requires touching the same file, just copy the old +# touch step and add it to the end of the list. +# +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +# For example: +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) +#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) +#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) + + +# Remove default android.hardware.health@2.0-service +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.health@2.0-service) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.health@2.0-service.rc) + +# Remove healthd +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/healthd) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/healthd.rc) + +# Move libnfc-nci.conf to /vendor +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/libnfc-nci.conf) + +# Remove /firmware which used to be a symlink to /vendor/firmware_mnt +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/firmware) + +# Remove thermalHAL 1.0 +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.thermal@1.0-service.redfin.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.thermal@1.0-service.redfin) + +# Remove default android.hardware.composer@2.2 +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.graphics.composer@2.2-service) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.graphics.composer@2.2-service.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/lib64/hw/android.hardware.graphics.composer@2.2-impl.so) + +# Remove default android.hardware.graphics.composer@2.3-service +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.graphics.composer@2.3-service) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.graphics.composer@2.3-service.rc) + +# Remove super_empty.img +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/super_empty.img) + +# Remove Vibrator HAL 1.2 +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.vibrator@1.2-service.redfin.rc) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.vibrator@1.2-service.redfin) + +# Remove Misnamed Vibrator VINTF Fragment +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/manifest.xml) + +# Rename power HAL +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.power@1.3-service.redfin-libperfmgr.rc) + +# Remove VR permission +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/permissions/android.hardware.vr.headtracking.xml) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/permissions/android.hardware.vr.high_performance.xml) diff --git a/WCNSS_qcom_cfg.ini b/WCNSS_qcom_cfg.ini new file mode 100644 index 0000000..24563f7 --- /dev/null +++ b/WCNSS_qcom_cfg.ini @@ -0,0 +1,429 @@ +# This file allows user to override the factory +# defaults for the WLAN Driver + +############################################# +# Power related configurations +############################################# +# Phy Mode (auto, b, g, n, etc) +# Valid values are 0-9, with 0 = Auto, 4 = 11n, 9 = 11ac +# 1 = 11abg, 2 = 11b, 3 = 11g, 5 = 11g only, 6 = 11n only +# 7 = 11b only 8 = 11ac only. +gDot11Mode=0 + +############################################# +# STA related general configurations +############################################# +# UAPSD service interval for VO,VI, BE, BK traffic +InfraUapsdVoSrvIntv=0 +InfraUapsdViSrvIntv=0 +InfraUapsdBeSrvIntv=0 +InfraUapsdBkSrvIntv=0 + +# Flag to allow STA send AddTspec even when ACM is Off +gAddTSWhenACMIsOff=1 + +############################################# +# SAP related configurations +############################################# +#Enable OBSS protection +gEnableApOBSSProt=1 + +# Maximum Tx power +# gTxPowerCap=30 + +# Fragmentation Threshold +# gFragmentationThreshold=2346 + +# RTS threshold +RTSThreshold=1048576 + +# 802.11d support +g11dSupportEnabled=0 + +# DFS Master Capability +gEnableDFSMasterCap=1 + +gNeighborLookupThreshold=76 + +# Legacy (non-ESE, non-802.11r) Fast Roaming Support +# To enable, set FastRoamEnabled=1 +# To disable, set FastRoamEnabled=0 +FastRoamEnabled=1 + +# Check if the AP to which we are roaming is better than current AP in +# terms of RSSI. Checking is disabled if set to Zero.Otherwise it will +# use this value as to how better the RSSI of the new/roamable AP should +# be for roaming +RoamRssiDiff=3 + +#Channel Bonding +gChannelBondingMode5GHz=1 + +#Say gGoKeepAlivePeriod(5 seconds) and gGoLinkMonitorPeriod(10 seconds). +#For every 10 seconds DUT send Qos Null frame(i.e., Keep Alive frame if link +#is idle for last 10 seconds.) For both active and power save clients. + +#Power save clients: DUT set TIM bit from 10th second onwards and till client +#honors TIM bit. If doesn't honor for 5 seconds then DUT remove client. + +#Active clients: DUT send Qos Null frame for 10th seconds onwards if it is not +#success still we try on 11th second if not tries on 12th and so on till 15th +#second. Hence before disconnection DUT will send 5 NULL frames. Hence in any +#case DUT will detect client got removed in (10+5) seconds. +#i.e., (gGoKeepAlivePeriod + gGoLinkMonitorPeriod).. + +#gGoLinkMonitorPeriod/ gApLinkMonitorPeriod is period where link is idle and +#it is period where we send NULL frame. +#gApLinkMonitorPeriod = 10 +#gGoLinkMonitorPeriod = 10 + +# Enable DFS channel roam +# 0: DISABLE, 1: ENABLED_NORMAL, 2: ENABLED_ACTIVE +gAllowDFSChannelRoam=1 + +# chain mask related params +# +# Set txchainmask and rxchainmask +# These parameters are used only if gEnable2x2 is 0 +# Valid values are 1,2 +# Set gSetTxChainmask1x1=1 or gSetRxChainmask1x1=1 to select chain0. +# Set gSetTxChainmask1x1=2 or gSetRxChainmask1x1=2 to select chain1. +gSetTxChainmask1x1=1 +gSetRxChainmask1x1=1 + +# MCC to SCC Switch mode: +# 0-Disable +# 1-Enable +# 2-Force SCC if same band, with SAP restart +# 3-Force SCC if same band, without SAP restart by sending (E)CSA +# 4-Force SCC if same band (or) use SAP mandatory channel for DBS, +# without SAP restart by sending (E)CSA +gWlanMccToSccSwitchMode = 3 + +# 1=enable tx STBC; 0=disable +gEnableTXSTBC=1 + +# 1=enable rx LDPC; 0=disable +gEnableRXLDPC=1 + +#Enable/Disable Tx beamformee in SAP mode +gEnableTxBFeeSAP=1 + +# Enable Tx beamforming in VHT20MHz +# Valid values are 0,1. If commented out, the default value is 0. +# 0=disable, 1=enable +gEnableTxBFin20MHz=1 + +# 802.11K support +gRrmEnable=1 + +#Enable Power Save offload +gEnablePowerSaveOffload=2 + +# Maximum Receive AMPDU size (VHT only. Valid values: +# 0->8k 1->16k 2->32k 3->64k 4->128k) +gVhtAmpduLenExponent=7 + +# Maximum MPDU length (VHT only. Valid values: +# 0->3895 octets, 1->7991 octets, 2->11454 octets) +gVhtMpduLen=2 + +# Maximum number of wow filters required +#gMaxWoWFilters=22 + +# WOW Enable/Disable. +# 0 - Disable both magic pattern match and pattern byte match. +# 1 - Enable magic pattern match on all interfaces. +# 2 - Enable pattern byte match on all interfaces. +# 3 - Enable both magic pattern and pattern byte match on all interfaces. +# Default value of gEnableWoW is 3. +# gEnableWoW=0 + +############################################# +# P2P related configurations +############################################# +#Enable or Disable p2p device address administered +isP2pDeviceAddrAdministrated=0 + +# Set Thermal Power limit +TxPower2g=10 +TxPower5g=10 + +#Enable VHT on 2.4Ghz +gEnableVhtFor24GHzBand=1 + +############################################# +# Offload related configurations +############################################# +#Maximum number of offload peers supported +# gMaxOffloadPeers=2 + +# controlling the following offload patterns +# through ini parameter. Default value is 1 +# to disable set it to zero. ssdp = 0 +# Setup multicast pattern for mDNS 224.0.0.251, +# SSDP 239.255.255.250 and LLMNR 224.0.0.252 +ssdp=0 + +# Regulatory Setting; 0=STRICT; 1=CUSTOM +gRegulatoryChangeCountry=1 + +# RA filtering rate limit param, the current value would not +# help if the lifetime in RA is less than 3*60=3min. Then +# we need to change it, though it is uncommon. +# gRAFilterEnable=0 +gRArateLimitInterval=600 + +# Disable/Enable GreenAP +# 0 to disable, 1 to enable, default: 1 +gEnableGreenAp=0 + +#Enable/Disable LPASS support +# 0 to disable, 1 to enable +gEnableLpassSupport=1 + +# Whether userspace country code setting shld have priority +gCountryCodePriority=1 + +# Enable or Disable Multi-user MIMO +# 1=Enable (default), 0=Disable +gEnableMuBformee=1 + +# Inactivity time (in ms) to end TX Service Period while in IBSS power save mode +gIbssTxSpEndInactivityTime=10 + +############################################# +# TDLS related configurations +############################################# +# Enable support for TDLS +# 0 - disable +# 1 - enable +gEnableTDLSSupport=1 + +# Enable support for Implicit Trigger of TDLS. That is, wlan driver shall +# initiate TDLS Discovery towards a peer whenever setup criteria (throughput +# and RSSI) is met and then will initiate teardown when teardown criteria +# (idle packet count and RSSI) is met. +# 0 - disable +# 1 - enable +gEnableTDLSImplicitTrigger=1 + +# Enable support for TDLS off-channel operation +# 0 - disable +# 1 - enable +# TDLS off-channel operation will be invoked when there is only one +# TDLS connection. +gEnableTDLSOffChannel=1 + +# Tx/Rx Packet threshold for initiating TDLS. +# This ini is used to configure the number of Tx/Rx packets during the period of +# gTDLSTxStatsPeriod when exceeded, a TDLS Discovery request is triggered. +gTDLSTxPacketThreshold=10 + +# Number of idle packet. +# This ini is used to configure the number of Tx/Rx packet, below which +# within last gTDLSTxStatsPeriod period is considered as idle condition. +gTDLSIdlePacketThreshold=1 + +# VHT Tx/Rx MCS values +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gVhtRxMCS=2 +gVhtTxMCS=2 + +# VHT Tx/Rx MCS values for 2x2 +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gEnable2x2=1 +gVhtRxMCS2x2=2 +gVhtTxMCS2x2=2 + +#IPA config is a bit mask and following are the configurations. +#bit0 IPA Enable +#bit1 IPA PRE Filter enable +#bit2 IPv6 enable +#bit3 IPA Resource Manager (RM) enable +#bit4 IPA Clock scaling enable +#bit5 IPA uC ENABLE +#bit6 IPA uC STA ENABLE +#bit8 IPA Real Time Debugging +gIPAConfig=0x7d + +# Enable Rx handling options +# Rx_thread=1 RPS=2(default for ROME) NAPI=4(default for ihelium) +# Rx_thread + NAPI = 5 +rx_mode=5 + +# Enable(Tx) fastpath for data traffic. +# 1 - enable(default) 0 - disable +gEnableFastPath=1 + +# Enable TCP Segmentation Offload +# 1 - enable 0 - disable +TSOEnable=1 + +# Enable Generic Receive Offload +# LRO and GRO are exclusive to each other +# LRO support is deprecated on latest 4.9(SDM845) kernel +# 1 - enable(default) 0 - disable +GROEnable=1 + +# Enable HT MPDU Density +# 4 for 2 micro sec +ght_mpdu_density=4 + +# Enable flow steering to enable multiple CEs for Rx flows. +# Multiple Rx CEs<==>Multiple Rx IRQs<==>probably different CPUs. +# Parallel Rx paths. +# 1 - enable 0 - disable(default) +gEnableFlowSteering=1 + +# Time in microseconds after which a NAPI poll must yield +ce_service_max_yield_time=500 + +#Maximum number of HTT messages to be processed per NAPI poll +ce_service_max_rx_ind_flush=1 + +# Maximum number of MSDUs the firmware will pack in one HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND +maxMSDUsPerRxInd=8 +################ Datapath feature set End ################ + +################ NAN feature set start ################### + +# Enable NAN discovery (NAN 1.0) +# 1 - enable 0 - disable(default) +gEnableNanSupport=1 +################ NAN feature set end ##################### + +hostscan_adaptive_dwell_mode=1 + +# Create another interface during driver load +gEnableConcurrentSTA=wlan1 + +#Enable/Disable dual MAC feature +# 0 - enable DBS +# 1 - disable DBS +# 2 - disable DBS for connection but keep DBS for scan +# 3 - disable DBS for connection but keep DBS scan with async +# scan policy disabled +# 4 - enable DBS for connection as well as for scan with async +# scan policy disabled +# 5 - enable DBS for connection but disable dbs for scan. +# 6 - enable DBS for connection but disable simultaneous scan from +# upper layer (DBS scan remains enabled in FW). +gDualMacFeatureDisable=6 + +#Enable/Disable latency mode +# 0 disable +# 1 enable +wlm_latency_enable=1 + +# Enable/Disable NUD Tracking within driver +gEnableNUDTracking=0 + +# Configure hardware filter for DTIM mode +# The hardware filter is only effective in DTIM mode. +# Use this configuration to blanket drop broadcast/multicast packets at the hardware level +# without waking up the firmware +# +# Takes a bitmap of frame types to drop +# +# 0 = disable feature +# 1 = drop all broadcast frames, except ARP (default) +# 2 = drop all multicast frames, except ICMPv6 +# 3 = drop all broadcast and multicast frames, except ARP and ICMPv6 +gHwFilterMode=0 + +# Enables SNR Monitoring +# This ini is used to set default snr monitor +gEnableSNRMonitoring=1 + +# Control to enable TCP limit output byte +# This ini is used to enable dynamic configuration of TCP limit output bytes +# tcp_limit_output_bytes param. +# Enabling this will let driver post message to cnss-daemon, +# accordingly cnss-daemon will modify the tcp_limit_output_bytes. +gTcpLimitOutputEnable=0 + +# Enable Target Wake Time support. +# This ini is used to enable or disable TWT support. +enable_twt=0 + +# For NLO/PNO, enable MAWC based scan +# Enable/Disable the Motion Aided Wireless Connectivity based NLO using this parameter +mawc_nlo_enabled=0 + +# Force 1x1 when connecting to certain peer +# This INI when enabled will force 1x1 connection with certain peer. +gForce1x1Exception=0 + +# Enable/disable oce feature for STA +# This ini is used to enable/disable oce feature for STA +oce_sta_enable=0 + +# Enable/disable oce feature for SAP +# This ini is used to enable/disable oce feature for SAP +oce_sap_enable=0 + +# Set probe request rate +# This ini is used to set probe request rate to 5.5Mbps as per OCE requirement in 2.4G band +oce_enable_probe_req_rate=0 + +# HE caps Weightage to calculate best candidate +# This ini is used to increase/decrease HE caps weightage in best candidate selection. +# If AP supports HE caps, AP will get additional weightage with this param. +# Weightage will be given only if dot11mode is HE capable. +he_caps_weightage=0 + +# PCL Weightage to calculate best candidate +# This ini is used to increase/decrease PCL weightage in best candidate selection. +# If some APs are in PCL list, those AP will get addition weightage. +pcl_weightage=0 + +# Enable/disable esp feature +# This ini is used to enable/disable ESP(Estimated service parameters) IE parsing and decides +# whether firmware will include this in its scoring algo. +enable_esp_for_roam=0 + +# Bitmask to enable 11k offload to FW. +# This ini is used to set which of the 11k features is offloaded to FW +# Currently Neighbor Report Request is supported for offload and is enabled by default. +# B0: Offload 11k neighbor report requests +# B1-B31: Reserved +11k_offload_enable_bitmask=0 + +# Set channel selection logic for different concurrency combinations to DBS or inter band MCC. +# Default is DBS for STA+STA and STA+P2P. +# 0 - inter-band MCC +# 1 - DBS +# +# BIT 0: STA+STA +# BIT 1: STA+P2P +# BIT 2-31: Reserved +channel_select_logic_conc=0 + +# Configure BTM +# Bit 0: Enable/Disable the BTM offload. Set this to 1 will enable and 0 will disable BTM offload. +# BIT 2, 1: Action on non matching candidate with cache. If a BTM request is received from AP +# then the candidate AP's may/may-not be present in the firmware scan cache. +# Based on below config firmware will decide whether to forward BTM frame to host or +# consume with firmware and proceed with Roaming to candidate AP. +# +# 00 scan and consume +# 01 no scan and forward to host +# 10, 11 reserved +# BIT 5, 4, 3: Roaming handoff decisions on multiple candidates match +# 000 match if exact BSSIDs are found +# 001 match if at least one top priority BSSID only +# 010, 011, 100, 101, 110, 111 reserved +# BIT 6: Set this to 1 will send BTM query frame and 0 not sent. +# BIT 7-31: Reserved +btm_offload_config=0 + +#Timer waiting for interface up from the upper layer +gInterfaceChangeWait=1000 + +END + +# Note: Configuration parser would not read anything past the END marker + diff --git a/aosp_redfin.mk b/aosp_redfin.mk new file mode 100644 index 0000000..e06fd95 --- /dev/null +++ b/aosp_redfin.mk @@ -0,0 +1,47 @@ +# +# Copyright 2018 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. +# + +# Inherit from the common Open Source product configuration +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/mainline.mk) + +$(call inherit-product, device/google/redfin/device-redfin.mk) +$(call inherit-product-if-exists, vendor/google_devices/redfin/proprietary/device-vendor.mk) +$(call inherit-product-if-exists, vendor/google_devices/redfin/prebuilts/device-vendor-redfin.mk) + +PRODUCT_PROPERTY_OVERRIDES += \ + ro.config.ringtone=Ring_Synth_04.ogg \ + ro.com.android.dataroaming=true \ + +PRODUCT_PACKAGES += \ + PhotoTable \ + WallpaperPicker \ + WAPPushManager \ + +# Don't build super.img. +PRODUCT_BUILD_SUPER_PARTITION := false + +# b/113232673 STOPSHIP deal with Qualcomm stuff later +# PRODUCT_RESTRICT_VENDOR_FILES := all + +PRODUCT_MANUFACTURER := Google +PRODUCT_BRAND := Android +PRODUCT_NAME := aosp_redfin +PRODUCT_DEVICE := redfin +PRODUCT_MODEL := AOSP on redfin + +PRODUCT_COPY_FILES += \ + device/sample/etc/apns-full-conf.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/apns-conf.xml diff --git a/board-info.txt b/board-info.txt new file mode 100644 index 0000000..afcad10 --- /dev/null +++ b/board-info.txt @@ -0,0 +1 @@ +require board=redfin diff --git a/compatibility_matrix.xml b/compatibility_matrix.xml new file mode 100644 index 0000000..8b06eef --- /dev/null +++ b/compatibility_matrix.xml @@ -0,0 +1,58 @@ + + + android.frameworks.schedulerservice + 1.0 + + ISchedulingPolicyService + default + + + + android.frameworks.sensorservice + 1.0 + + ISensorManager + default + + + + android.hidl.allocator + 1.0 + + IAllocator + ashmem + + + + android.hidl.manager + 1.0 + + IServiceManager + default + + + + android.hidl.memory + 1.0 + + IMapper + ashmem + + + + android.hidl.token + 1.0 + + ITokenManager + default + + + + android.system.wifi.keystore + 1.0 + + IKeystore + default + + + diff --git a/config.fs b/config.fs new file mode 100644 index 0000000..d9c2dfa --- /dev/null +++ b/config.fs @@ -0,0 +1,91 @@ +# Copyright (C) 2018 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. +# + +# This file is used to define the properties of the filesystem +# images generated by build tools (mkbootfs and mkyaffs2image) and +# by the device side of adb. + +[AID_VENDOR_QDSS] +value:2902 + +[AID_VENDOR_RFS] +value:2903 + +[AID_VENDOR_RFS_SHARED] +value:2904 + +[AID_VENDOR_ADPL_ODL] +value:2905 + +[AID_VENDOR_QRTR] +value:2906 + +[AID_VENDOR_AIRBRUSH] +value:2907 + +[vendor/bin/pm-service] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE + +[vendor/bin/cnss-daemon] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE + +[vendor/bin/imsdatadaemon] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE + +[vendor/bin/imsrcsd] +mode: 0755 +user: AID_SYSTEM +group: AID_RADIO +caps: NET_BIND_SERVICE BLOCK_SUSPEND WAKE_ALARM + +[vendor/bin/cnd] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN + +[vendor/bin/ims_rtp_daemon] +mode: 0755 +user: AID_SYSTEM +group: AID_RADIO +caps: NET_BIND_SERVICE + +[vendor/bin/hw/android.hardware.health@2.0-service.redfin] +mode: 0755 +user: AID_SYSTEM +group: AID_SYSTEM +caps: WAKE_ALARM + +[vendor/bin/loc_launcher] +mode: 0755 +user: AID_GPS +group: AID_GPS +caps: SETUID SETGID + +[system/vendor/bin/loc_launcher] +mode: 0755 +user: AID_GPS +group: AID_GPS +caps: SETUID SETGID + diff --git a/default-permissions.xml b/default-permissions.xml new file mode 100644 index 0000000..64f9eaf --- /dev/null +++ b/default-permissions.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device-common.mk b/device-common.mk new file mode 100644 index 0000000..80b80d6 --- /dev/null +++ b/device-common.mk @@ -0,0 +1,66 @@ +# +# Copyright (C) 2018 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# define hardware platform +PRODUCT_PLATFORM := sm7250 + +include device/google/redfin/device.mk + +# Set Vendor SPL to match platform +VENDOR_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH) + +# A2DP offload enabled for compilation +AUDIO_FEATURE_ENABLED_A2DP_OFFLOAD := true + +# A2DP offload supported +PRODUCT_PROPERTY_OVERRIDES += \ +ro.bluetooth.a2dp_offload.supported=true + +# A2DP offload disabled (UI toggle property) +PRODUCT_PROPERTY_OVERRIDES += \ +persist.bluetooth.a2dp_offload.disabled=false + +# A2DP offload DSP supported encoder list +PRODUCT_PROPERTY_OVERRIDES += \ +persist.bluetooth.a2dp_offload.cap=sbc-aac-aptx-aptxhd-ldac + +# Enable AAC frame ctl for A2DP sinks +PRODUCT_PROPERTY_OVERRIDES += \ +persist.vendor.bt.aac_frm_ctl.enabled=true + +# Set lmkd options +PRODUCT_PRODUCT_PROPERTIES += \ + ro.config.low_ram = false \ + ro.lmk.kill_heaviest_task = true \ + ro.lmk.kill_timeout_ms = 100 \ + ro.lmk.use_minfree_levels = true \ + ro.lmk.log_stats = true \ + +# Modem logging file +PRODUCT_COPY_FILES += \ + device/google/redfin/init.logging.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).logging.rc + +# Pixelstats broken mic detection +PRODUCT_PROPERTY_OVERRIDES += vendor.audio.mic_break=true + +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_color_management=true +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_wide_color_display=true +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_HDR_display=true +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_idle_timer_ms=50 + +# MIDI feature +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml diff --git a/device-redfin.mk b/device-redfin.mk new file mode 100644 index 0000000..1a99e2a --- /dev/null +++ b/device-redfin.mk @@ -0,0 +1,23 @@ +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +PRODUCT_HARDWARE := redfin + +include device/google/redfin/device-common.mk + +DEVICE_PACKAGE_OVERLAYS += device/google/redfin/redfin/overlay + +# Audio XMLs for redfin diff --git a/device.mk b/device.mk new file mode 100644 index 0000000..a49e7e5 --- /dev/null +++ b/device.mk @@ -0,0 +1,784 @@ +# +# Copyright (C) 2018 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. +# + +LOCAL_PATH := device/google/redfin + +PRODUCT_VENDOR_MOVE_ENABLED := true + +PRODUCT_SOONG_NAMESPACES += \ + hardware/google/av \ + hardware/google/interfaces \ + hardware/google/pixel \ + device/google/redfin \ + hardware/qcom/sm7250 \ + vendor/google/airbrush/floral \ + vendor/google/biometrics/face \ + vendor/google/darwinn \ + hardware/qcom/sm7250/display \ + vendor/google/camera \ + vendor/qcom/sm7250 \ + vendor/google/interfaces + +PRODUCT_PROPERTY_OVERRIDES += \ + keyguard.no_require_sim=true + +# enable cal by default on accel sensor +PRODUCT_PRODUCT_PROPERTIES += \ + persist.vendor.debug.sensors.accel_cal=1 + +# The default value of this variable is false and should only be set to true when +# the device allows users to retain eSIM profiles after factory reset of user data. +PRODUCT_PRODUCT_PROPERTIES += \ + masterclear.allow_retain_esim_profiles_after_fdr=true + +PRODUCT_COPY_FILES += \ + device/google/redfin/default-permissions.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/default-permissions/default-permissions.xml \ + frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \ + frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/android.software.verified_boot.xml + +PRODUCT_PACKAGES += \ + messaging + +TARGET_PRODUCT_PROP := $(LOCAL_PATH)/product.prop + +$(call inherit-product, $(LOCAL_PATH)/utils.mk) + +# Installs gsi keys into ramdisk, to boot a GSI with verified boot. +$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_keys.mk) + +ifeq ($(wildcard vendor/google_devices/redfin/proprietary/device-vendor-redfin.mk),) + BUILD_WITHOUT_VENDOR := true +endif + +ifeq ($(TARGET_PREBUILT_KERNEL),) + LOCAL_KERNEL := device/google/redfin-kernel/Image.lz4 +else + LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL) +endif +PRODUCT_VENDOR_KERNEL_HEADERS := device/google/redfin-kernel/sm7250/kernel-headers + + +PRODUCT_CHARACTERISTICS := nosdcard +PRODUCT_SHIPPING_API_LEVEL := 28 + +DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay + +# +PRODUCT_COPY_FILES += \ + $(LOCAL_KERNEL):kernel \ + $(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM) \ + $(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM) \ + $(LOCAL_PATH)/fstab.persist:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.persist \ + $(LOCAL_PATH)/init.hardware.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).rc \ + $(LOCAL_PATH)/init.power.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).power.rc \ + $(LOCAL_PATH)/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh \ + $(LOCAL_PATH)/init.hardware.usb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).usb.rc \ + $(LOCAL_PATH)/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \ + $(LOCAL_PATH)/init.qcom.wlan.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.qcom.wlan.sh \ + $(LOCAL_PATH)/init.sensors.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.sensors.sh \ + $(LOCAL_PATH)/sensors.hals.conf:$(TARGET_COPY_OUT_VENDOR)/etc/sensors/hals.conf \ + $(LOCAL_PATH)/thermal-engine-$(PRODUCT_HARDWARE).conf:$(TARGET_COPY_OUT_VENDOR)/etc/thermal-engine-$(PRODUCT_HARDWARE).conf \ + $(LOCAL_PATH)/ueventd.rc:$(TARGET_COPY_OUT_VENDOR)/ueventd.rc + + +MSM_VIDC_TARGET_LIST := lito # Get the color format from kernel headers +MASTER_SIDE_CP_TARGET_LIST := lito # ION specific settings + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.mpssrfs.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).mpssrfs.rc + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.diag.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).diag.rc + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.chamber.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_PLATFORM).chamber.rc + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.ipa.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_PLATFORM).ipa.rc +else + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.mpssrfs.rc.user:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).mpssrfs.rc + PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.hardware.diag.rc.user:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).diag.rc +endif + +# A/B support +PRODUCT_PACKAGES += \ + otapreopt_script \ + cppreopts.sh \ + update_engine \ + update_verifier + +# Use Sdcardfs +PRODUCT_PRODUCT_PROPERTIES += \ + ro.sys.sdcardfs=1 + +PRODUCT_PACKAGES += \ + bootctrl.lito + +PRODUCT_PROPERTY_OVERRIDES += \ + ro.cp_system_other_odex=1 + +AB_OTA_POSTINSTALL_CONFIG += \ + RUN_POSTINSTALL_system=true \ + POSTINSTALL_PATH_system=system/bin/otapreopt_script \ + FILESYSTEM_TYPE_system=ext4 \ + POSTINSTALL_OPTIONAL_system=true + +# Enable update engine sideloading by including the static version of the +# boot_control HAL and its dependencies. +PRODUCT_STATIC_BOOT_CONTROL_HAL := \ + bootctrl.lito \ + libgptutils \ + libz \ + libcutils + +PRODUCT_PACKAGES += \ + update_engine_sideload \ + sg_write_buffer \ + f2fs_io \ + check_f2fs + +AB_OTA_POSTINSTALL_CONFIG += \ + RUN_POSTINSTALL_vendor=true \ + POSTINSTALL_PATH_vendor=bin/checkpoint_gc \ + FILESYSTEM_TYPE_vendor=ext4 \ + POSTINSTALL_OPTIONAL_vendor=true + +# Userdata Checkpointing OTA GC +PRODUCT_PACKAGES += \ + checkpoint_gc + +# The following modules are included in debuggable builds only. +PRODUCT_PACKAGES_DEBUG += \ + bootctl \ + r.vendor \ + update_engine_client + +PRODUCT_COPY_FILES += \ + 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\ + 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 \ + frameworks/native/data/etc/android.hardware.biometrics.face.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.biometrics.face.xml\ + frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.assist.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.assist.xml \ + frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \ + frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \ + frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \ + frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml \ + frameworks/native/data/etc/android.hardware.sensor.hifi_sensors.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.hifi_sensors.xml \ + frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml \ + frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \ + frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \ + frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml \ + frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ + frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \ + frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \ + frameworks/native/data/etc/android.hardware.wifi.aware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.aware.xml \ + frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \ + frameworks/native/data/etc/android.hardware.wifi.rtt.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.rtt.xml \ + frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \ + 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.hardware.opengles.aep.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.opengles.aep.xml \ + frameworks/native/data/etc/android.hardware.nfc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.xml \ + frameworks/native/data/etc/android.hardware.nfc.hce.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hce.xml \ + frameworks/native/data/etc/android.hardware.nfc.hcef.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hcef.xml \ + frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \ + frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \ + frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \ + frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml \ + frameworks/native/data/etc/android.hardware.strongbox_keystore.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.strongbox_keystore.xml \ + frameworks/native/data/etc/android.hardware.nfc.uicc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.uicc.xml \ + frameworks/native/data/etc/android.hardware.nfc.ese.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.ese.xml + +# Audio fluence, ns, aec property, voice and media volume steps +PRODUCT_PROPERTY_OVERRIDES += \ + ro.qc.sdk.audio.fluencetype=fluencepro \ + persist.audio.fluence.voicecall=true \ + persist.audio.fluence.speaker=true \ + persist.audio.fluence.voicecomm=true \ + persist.audio.fluence.voicerec=false \ + ro.config.vc_call_vol_steps=7 \ + ro.config.media_vol_steps=25 \ + +# Audio Features +PRODUCT_PROPERTY_OVERRIDES += \ + vendor.audio.feature.external_dsp.enable=true \ + vendor.audio.feature.external_speaker.enable=true \ + vendor.audio.feature.concurrent_capture.enable=false \ + vendor.audio.feature.a2dp_offload.enable=true \ + vendor.audio.feature.hfp.enable=true \ + vendor.audio.feature.hwdep_cal.enable=true \ + vendor.audio.feature.incall_music.enable=true \ + vendor.audio.feature.maxx_audio.enable=true \ + vendor.audio.feature.spkr_prot.enable=true \ + vendor.audio.feature.usb_offload.enable=true \ + vendor.audio.feature.audiozoom.enable=true \ + vendor.audio.feature.snd_mon.enable=true \ + +# MaxxAudio effect and add rotation monitor +PRODUCT_PROPERTY_OVERRIDES += \ + ro.audio.monitorRotation=true + +# Iaxxx streming and factory binary +PRODUCT_PACKAGES += \ + libtunnel \ + libodsp \ + adnc_strm.primary.default \ + sound_trigger.primary.lito + +# Add Oslo test for debug rom +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +PRODUCT_PACKAGES += \ + tunneling_hal_test \ + sensor_param_test \ + oslo_config_test \ + odsp_api_test \ + crash_event_logger \ + dump_debug_info \ + get_pwr_stats \ + crash_trigger_test +endif + +# graphics +PRODUCT_PROPERTY_OVERRIDES += \ + ro.opengles.version=196610 + +PRODUCT_PROPERTY_OVERRIDES += \ + ro.vendor.display.foss=1 \ + ro.vendor.display.paneltype=2 \ + ro.vendor.display.sensortype=2 \ + vendor.display.foss.config=1 \ + vendor.display.foss.config_path=/vendor/etc/FOSSConfig.xml + +# camera google face detection +PRODUCT_PROPERTY_OVERRIDES += \ + persist.camera.googfd.enable=1 + +# camera disable FaceSSD temporarily +PRODUCT_PROPERTY_OVERRIDES += \ + persist.camera.facessd.enable=0 + +# camera hal buffer management +PRODUCT_PROPERTY_OVERRIDES += \ + persist.camera.managebuffer.enable=1 + +# Lets the vendor library that Google Camera HWL is enabled +PRODUCT_PROPERTY_OVERRIDES += \ + persist.camera.google_hwl.enabled=true \ + persist.camera.google_hwl.name=libgooglecamerahwl_impl.so + +# OEM Unlock reporting +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + ro.oem_unlock_supported=1 + +PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.cne.feature=1 \ + persist.vendor.data.iwlan.enable=true \ + persist.radio.RATE_ADAPT_ENABLE=1 \ + persist.radio.ROTATION_ENABLE=1 \ + persist.radio.VT_ENABLE=1 \ + persist.radio.VT_HYBRID_ENABLE=1 \ + persist.vendor.radio.apm_sim_not_pwdn=1 \ + persist.vendor.radio.custom_ecc=1 \ + persist.vendor.radio.data_ltd_sys_ind=1 \ + persist.radio.videopause.mode=1 \ + persist.vendor.radio.multisim_switch_support=true \ + persist.vendor.radio.sib16_support=1 \ + persist.vendor.radio.data_con_rprt=true \ + persist.vendor.radio.relay_oprt_change=1 \ + persist.vendor.radio.no_wait_for_card=1 \ + persist.vendor.radio.sap_silent_pin=1 \ + persist.rcs.supported=1 \ + vendor.rild.libpath=/vendor/lib64/libril-qc-hal-qmi.so \ + ro.hardware.keystore_desede=true \ + +# Disable snapshot timer +PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.radio.snapshot_enabled=0 \ + persist.vendor.radio.snapshot_timer=0 + +PRODUCT_PACKAGES += \ + hwcomposer.lito \ + android.hardware.graphics.composer@2.3-service-sm7250 \ + gralloc.lito \ + android.hardware.graphics.mapper@3.0-impl-qti-display \ + vendor.qti.hardware.display.allocator-service + +# RenderScript HAL +PRODUCT_PACKAGES += \ + android.hardware.renderscript@1.0-impl + +# Light HAL +PRODUCT_PACKAGES += \ + lights.lito \ + hardware.google.light@1.0-service + +# Memtrack HAL +PRODUCT_PACKAGES += \ + memtrack.lito \ + android.hardware.memtrack@1.0-impl \ + android.hardware.memtrack@1.0-service + +# Bluetooth HAL +PRODUCT_PACKAGES += \ + android.hardware.bluetooth@1.0-impl-qti \ + android.hardware.bluetooth@1.0-service-qti + +#Bluetooth SAR HAL +PRODUCT_PACKAGES += \ + vendor.qti.hardware.bluetooth_sar@1.0-impl + +# Bluetooth SoC +PRODUCT_PROPERTY_OVERRIDES += \ + vendor.qcom.bluetooth.soc=cherokee + +# Property for loading BDA from device tree +PRODUCT_PROPERTY_OVERRIDES += \ + ro.vendor.bt.bdaddr_path=/proc/device-tree/chosen/cdt/cdb2/bt_addr + +# Bluetooth WiPower +PRODUCT_PROPERTY_OVERRIDES += \ + ro.vendor.bluetooth.emb_wp_mode=false \ + ro.vendor.bluetooth.wipower=false + +# DRM HAL +PRODUCT_PACKAGES += \ + android.hardware.drm@1.0-impl \ + android.hardware.drm@1.0-service \ + android.hardware.drm@1.2-service.clearkey \ + android.hardware.drm@1.2-service.widevine + +# NFC and Secure Element packages +PRODUCT_PACKAGES += \ + NfcNci \ + Tag \ + SecureElement \ + android.hardware.nfc@1.2-service.st \ + android.hardware.secure_element@1.0-service.st + +PRODUCT_COPY_FILES += \ + device/google/redfin/nfc/libnfc-hal-st.conf:$(TARGET_COPY_OUT_VENDOR)/etc/libnfc-hal-st.conf \ + device/google/redfin/nfc/libese-hal-st.conf:$(TARGET_COPY_OUT_VENDOR)/etc/libese-hal-st.conf \ + device/google/redfin/nfc/libnfc-nci.conf:$(TARGET_COPY_OUT_PRODUCT)/etc/libnfc-nci.conf + +PRODUCT_PACKAGES += \ + android.hardware.usb@1.2-service.redfin + +PRODUCT_PACKAGES += \ + android.hardware.health@2.0-service.redfin + +# Storage health HAL +PRODUCT_PACKAGES += \ + android.hardware.health.storage@1.0-service + +PRODUCT_PACKAGES += \ + libmm-omxcore \ + libOmxCore \ + libstagefrighthw \ + libOmxVdec \ + libOmxVdecHevc \ + libOmxVenc \ + libc2dcolorconvert + +# Enable Codec 2.0 +PRODUCT_PACKAGES += \ + libqcodec2 \ + vendor.qti.media.c2@1.0-service \ + +PRODUCT_PACKAGES += \ + android.hardware.camera.provider@2.4-impl-google \ + android.hardware.camera.provider@2.4-service-google \ + camera.lito \ + libgooglecamerahal \ + libgooglecamerahwl_impl \ + libgoogle_camera_hal_tests \ + libqomx_core \ + libmmjpeg_interface \ + libmmcamera_interface \ + libcameradepthcalibrator + +PRODUCT_PACKAGES += \ + sensors.$(PRODUCT_HARDWARE) \ + android.hardware.sensors@2.0-impl \ + android.hardware.sensors@2.0-service \ + android.hardware.sensors@2.0-service.rc + +PRODUCT_PACKAGES += \ + fs_config_dirs \ + fs_config_files + +# Context hub HAL +PRODUCT_PACKAGES += \ + android.hardware.contexthub@1.0-impl.generic \ + android.hardware.contexthub@1.0-service + +# Boot control HAL +PRODUCT_PACKAGES += \ + android.hardware.boot@1.0-impl \ + android.hardware.boot@1.0-service \ + +# Vibrator HAL +PRODUCT_PACKAGES += \ + android.hardware.vibrator@1.3-service.redfin \ + +# Thermal HAL +PRODUCT_PACKAGES += \ + android.hardware.thermal@2.0-service.pixel \ + +# Thermal HAL config +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/thermal_info_config_$(PRODUCT_HARDWARE).json:$(TARGET_COPY_OUT_VENDOR)/etc/thermal_info_config.json \ + +#GNSS HAL +PRODUCT_PACKAGES += \ + libgps.utils \ + libgnss \ + liblocation_api \ + android.hardware.gnss@2.0-impl-qti \ + android.hardware.gnss@2.0-service-qti + +# Wireless Charger HAL +PRODUCT_PACKAGES += \ + vendor.google.wireless_charger@1.0 + +ENABLE_VENDOR_RIL_SERVICE := true + +HOSTAPD := hostapd +HOSTAPD += hostapd_cli +PRODUCT_PACKAGES += $(HOSTAPD) + +WPA := wpa_supplicant.conf +WPA += wpa_supplicant_wcn.conf +WPA += wpa_supplicant +PRODUCT_PACKAGES += $(WPA) + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +PRODUCT_PACKAGES += wpa_cli +endif + +# Wifi +PRODUCT_PACKAGES += \ + android.hardware.wifi@1.0-service \ + wificond \ + libwpa_client + +# WLAN driver configuration files +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf \ + $(LOCAL_PATH)/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \ + $(LOCAL_PATH)/wifi_concurrency_cfg.txt:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wifi_concurrency_cfg.txt \ + $(LOCAL_PATH)/WCNSS_qcom_cfg.ini:$(TARGET_COPY_OUT_VENDOR)/firmware/wlan/qca_cld/WCNSS_qcom_cfg.ini \ + +LIB_NL := libnl_2 +PRODUCT_PACKAGES += $(LIB_NL) + +# Factory OTA +PRODUCT_PACKAGES += \ + FactoryOta + +# Audio effects +PRODUCT_PACKAGES += \ + libvolumelistener \ + libqcomvisualizer \ + libqcomvoiceprocessing \ + libqcomvoiceprocessingdescriptors \ + libqcompostprocbundle + +PRODUCT_PACKAGES += \ + audio.primary.lito \ + audio.a2dp.default \ + audio.usb.default \ + audio.r_submix.default \ + libaudio-resampler \ + audio.hearing_aid.default \ + audio.bluetooth.default + +PRODUCT_PACKAGES += \ + android.hardware.audio@5.0-impl:32 \ + android.hardware.audio.effect@5.0-impl:32 \ + android.hardware.broadcastradio@1.0-impl \ + android.hardware.soundtrigger@2.2-impl \ + android.hardware.bluetooth.audio@2.0-impl \ + android.hardware.audio@2.0-service + +# Modules for Audio HAL +PRODUCT_PACKAGES += \ + libcirrusspkrprot \ + libsndmonitor \ + libmalistener \ + liba2dpoffload \ + btaudio_offload_if \ + libmaxxaudio \ + libaudiozoom + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +PRODUCT_PACKAGES += \ + tinyplay \ + tinycap \ + tinymix \ + tinypcminfo \ + cplay +endif + +# Audio hal xmls + +# Audio Policy tables + +# Audio ACDB data + +# Audio ACDB workspace files for QACT + +# Audio speaker tunning config data + +# Audio audiozoom config data + +# and ensure that the xaac decoder is built +PRODUCT_PACKAGES += \ + libstagefright_soft_xaacdec.vendor + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \ + $(LOCAL_PATH)/media_profiles_V1_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml + +# Vendor seccomp policy files for media components: +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/seccomp_policy/mediacodec.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/mediacodec.policy + +PRODUCT_PROPERTY_OVERRIDES += \ + audio.snd_card.open.retries=50 + + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +# Subsystem ramdump +PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.sys.ssr.enable_ramdumps=1 +endif + +# Subsystem silent restart +PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.sys.ssr.restart_level=modem,SDXPRAIRIE,adsp,slpi + +# setup dalvik vm configs +$(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk) + +# Use the default charger mode images +PRODUCT_PACKAGES += \ + charger_res_images + +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +# b/36703476: Set default log size to 1M +PRODUCT_PROPERTY_OVERRIDES += \ + ro.logd.size=1M +# b/114766334: persist all logs by default rotating on 30 files of 1MiB +PRODUCT_PROPERTY_OVERRIDES += \ + logd.logpersistd=logcatd \ + logd.logpersistd.size=30 +endif + +# Dumpstate HAL +PRODUCT_PACKAGES += \ + android.hardware.dumpstate@1.0-service.redfin + +# Citadel +PRODUCT_PACKAGES += \ + citadeld \ + citadel_updater \ + android.hardware.authsecret@1.0-service.citadel \ + android.hardware.oemlock@1.0-service.citadel \ + android.hardware.weaver@1.0-service.citadel \ + android.hardware.keymaster@4.0-service.citadel \ + wait_for_strongbox + +# Citadel debug stuff +PRODUCT_PACKAGES_DEBUG += \ + test_citadel + +# Storage: for factory reset protection feature +PRODUCT_PROPERTY_OVERRIDES += \ + ro.frp.pst=/dev/block/bootdevice/by-name/frp + +PRODUCT_PACKAGES += \ + vndk-sp + +PRODUCT_ENFORCE_RRO_TARGETS := * + +# Override heap growth limit due to high display density on device +PRODUCT_PROPERTY_OVERRIDES += \ + dalvik.vm.heapgrowthlimit=256m + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-32:system/lib/android.hidl.base@1.0.so \ + $(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-64:system/lib64/android.hidl.base@1.0.so \ + $(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-32:vendor/lib/android.hidl.base@1.0.so \ + $(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-64:vendor/lib64/android.hidl.base@1.0.so \ + +PRODUCT_PACKAGES += \ + ipacm \ + IPACM_cfg.xml + +#Set default CDMA subscription to RUIM +PRODUCT_PROPERTY_OVERRIDES += \ + ro.telephony.default_cdma_sub=0 + +# Set display color mode to Adaptive by default +PRODUCT_PROPERTY_OVERRIDES += \ + persist.sys.sf.color_saturation=1.0 \ + persist.sys.sf.native_mode=2 \ + persist.sys.sf.color_mode=9 + +# Keymaster configuration +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.software.device_id_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.device_id_attestation.xml + +# Enable modem logging +PRODUCT_PROPERTY_OVERRIDES += \ + ro.radio.log_loc="/data/vendor/modem_dump" \ + ro.radio.log_prefix="modem_log_" + +# Enable modem logging for debug +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.sys.modem.diag.mdlog=true \ + persist.vendor.sys.modem.diag.mdlog_br_num=5 +else +endif + +# Preopt SystemUI +PRODUCT_DEXPREOPT_SPEED_APPS += \ + SystemUIGoogle + +# Enable stats logging in LMKD +TARGET_LMKD_STATS_LOG := true +PRODUCT_PRODUCT_PROPERTIES += \ + ro.lmk.log_stats=true + +# default usb oem functions +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) + PRODUCT_PROPERTY_OVERRIDES += \ + persist.vendor.usb.usbradio.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl_gsi,rmnet_gsi +endif + +# Early phase offset configuration for SurfaceFlinger (b/75985430) +PRODUCT_PROPERTY_OVERRIDES += \ + debug.sf.early_phase_offset_ns=500000 +PRODUCT_PROPERTY_OVERRIDES += \ + debug.sf.early_app_phase_offset_ns=500000 +PRODUCT_PROPERTY_OVERRIDES += \ + debug.sf.early_gl_phase_offset_ns=3000000 +PRODUCT_PROPERTY_OVERRIDES += \ + debug.sf.early_gl_app_phase_offset_ns=15000000 + +# Do not skip init trigger by default +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + vendor.skip.init=0 + +BOARD_USES_QCNE := true + +#per device +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/redfin/init.redfin.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.redfin.rc + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/sec_config:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config + +# power HAL +PRODUCT_PACKAGES += \ + android.hardware.power@1.3-service.pixel-libperfmgr + +# Disable ro.adb.secure for the factory build to work around dead touchscreens +# Bug: 116250643 +PRODUCT_PRODUCT_PROPERTIES += \ + ro.adb.secure=0 + +# GPS configuration file +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/gps.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gps.conf + +# default atrace HAL +PRODUCT_PACKAGES += \ + android.hardware.atrace@1.0-service + +# Reliability reporting +PRODUCT_PACKAGES += \ + pixelstats-vendor + +PRODUCT_USE_DYNAMIC_PARTITIONS := true + +# fastbootd +PRODUCT_PACKAGES += \ + android.hardware.fastboot@1.0-impl.pixel \ + fastbootd + +# insmod files +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.insmod.redfin.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/init.insmod.redfin.cfg + +# Use /product/etc/fstab.postinstall to mount system_other +PRODUCT_PRODUCT_PROPERTIES += \ + ro.postinstall.fstab.prefix=/product + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/fstab.postinstall:$(TARGET_COPY_OUT_PRODUCT)/etc/fstab.postinstall + +# powerstats HAL +PRODUCT_PACKAGES += \ + android.hardware.power.stats@1.0-service.pixel + +# Recovery +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/init.recovery.device.rc:recovery/root/init.recovery.redfin.rc + +# Do not skip init trigger by default +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + vendor.skip.init=0 + +# Oslo feature flag +PRODUCT_PRODUCT_PROPERTIES += \ + ro.vendor.aware_available=true + +QTI_TELEPHONY_UTILS := qti-telephony-utils +QTI_TELEPHONY_UTILS += qti_telephony_utils.xml +PRODUCT_PACKAGES += $(QTI_TELEPHONY_UTILS) + +HIDL_WRAPPER := qti-telephony-hidl-wrapper +HIDL_WRAPPER += qti_telephony_hidl_wrapper.xml +PRODUCT_PACKAGES += $(HIDL_WRAPPER) + +# Increment the SVN for any official public releases +PRODUCT_PROPERTY_OVERRIDES += \ + ro.vendor.build.svn=1 + +# ZRAM writeback +PRODUCT_PROPERTY_OVERRIDES += \ + ro.zram.mark_idle_delay_mins=60 \ + ro.zram.first_wb_delay_mins=180 \ + ro.zram.periodic_wb_delay_hours=24 + +# Disable SPU usage +PRODUCT_PROPERTY_OVERRIDES += \ + vendor.gatekeeper.disable_spu = true + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/powerhint.json:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint.json diff --git a/device_framework_matrix.xml b/device_framework_matrix.xml new file mode 100644 index 0000000..d9f509f --- /dev/null +++ b/device_framework_matrix.xml @@ -0,0 +1,241 @@ + + + com.qualcomm.qti.imscmservice + 2.1 + + IImsCmService + qti.ims.connectionmanagerservice + + + + com.qualcomm.qti.uceservice + 2.0 + + IUceService + com.qualcomm.qti.uceservice + + + + vendor.qti.data.factory + hwbinder + 1.0 + + IFactory + default + + + + com.quicinc.cne.api + 1.1 + + IApiService + cnd + + + + com.quicinc.cne.server + 2.1 + + IServer + cnd + + + + hardware.google.media.c2 + 1.0 + + IComponentStore + default + software + + + IConfigurable + default + software + + + + android.hardware.radio.config + 1.1 + + IRadioConfig + default + + + + vendor.display.config + 1.1 + + IDisplayConfig + default + + + + vendor.google.radioext + 1.1 + + IRadioExt + default + + + + vendor.google.wireless_charger + 1.0 + + IWirelessCharger + default + + + + vendor.google.airbrush.manager + 1.0 + + IAirbrushManager + default + + + + vendor.qti.hardware.radio.am + 1.0 + + IQcRilAudio + slot1 + slot2 + + + + vendor.qti.hardware.radio.atcmdfwd + 1.0 + + IAtCmdFwd + AtCmdFwdService + + + + vendor.qti.hardware.radio.ims + 1.4 + + IImsRadio + imsradio0 + imsradio1 + + + + vendor.qti.hardware.radio.lpa + 1.0 + + IUimLpa + UimLpa0 + + + + vendor.qti.hardware.radio.qcrilhook + 1.0 + + IQtiOemHook + oemhook0 + oemhook1 + + + + vendor.qti.hardware.radio.uim + 1.1 + + IUim + Uim0 + Uim1 + + + + vendor.qti.hardware.radio.uim_remote_client + 1.0 + + IUimRemoteServiceClient + uimRemoteClient0 + uimRemoteClient1 + + + + vendor.qti.hardware.radio.uim_remote_server + 1.0 + + IUimRemoteServiceServer + uimRemoteServer0 + uimRemoteServer1 + + + + vendor.qti.hardware.tui_comm + 1.0 + + ITuiComm + default + + + + vendor.qti.hardware.display.allocator + 3.0 + + IQtiAllocator + default + + + + vendor.qti.hardware.display.mapper + 3.0 + + IQtiMapper + default + + + + vendor.qti.hardware.display.mapperextensions + 1.0 + + IQtiMapperExtensions + default + + + + vendor.qti.imsrtpservice + 2.0 + + IRTPService + imsrtpservice + + + + vendor.qti.ims.callinfo + hwbinder + 1.0 + + IService + default + + + + hardware.google.light + 1.0 + + ILight + default + + + + vendor.qti.hardware.bluetooth_sar + 1.0 + + IBluetoothSar + default + + + + vendor.google.wifi_ext + hwbinder + 1.0 + + IWifiExt + default + + + diff --git a/dumpstate/Android.mk b/dumpstate/Android.mk new file mode 100644 index 0000000..d42821e --- /dev/null +++ b/dumpstate/Android.mk @@ -0,0 +1,43 @@ +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.dumpstate@1.0-service.redfin +LOCAL_INIT_RC := android.hardware.dumpstate@1.0-service.redfin.rc +LOCAL_MODULE_RELATIVE_PATH := hw + +LOCAL_SRC_FILES := \ + DumpstateDevice.cpp \ + service.cpp + +LOCAL_SHARED_LIBRARIES := \ + android.hardware.dumpstate@1.0 \ + libbase \ + libcutils \ + libdumpstateutil \ + libhidlbase \ + libhidltransport \ + libhwbinder \ + liblog \ + libutils + +LOCAL_CFLAGS := -Werror -Wall + +LOCAL_MODULE_TAGS := optional +LOCAL_PROPRIETARY_MODULE := true + +include $(BUILD_EXECUTABLE) diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp new file mode 100755 index 0000000..3f0143b --- /dev/null +++ b/dumpstate/DumpstateDevice.cpp @@ -0,0 +1,488 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "dumpstate" + +#include "DumpstateDevice.h" + +#include +#include +#include +#include + +#include +#include + +#define _SVID_SOURCE +#include + +#include "DumpstateUtil.h" + +#define MODEM_LOG_PREFIX_PROPERTY "ro.radio.log_prefix" +#define MODEM_LOG_LOC_PROPERTY "ro.radio.log_loc" +#define MODEM_LOGGING_SWITCH "persist.radio.smlog_switch" + +#define DIAG_MDLOG_PERSIST_PROPERTY "persist.vendor.sys.modem.diag.mdlog" +#define DIAG_MDLOG_PROPERTY "vendor.sys.modem.diag.mdlog" +#define DIAG_MDLOG_STATUS_PROPERTY "vendor.sys.modem.diag.mdlog_on" + +#define DIAG_MDLOG_NUMBER_BUGREPORT "persist.vendor.sys.modem.diag.mdlog_br_num" + +#define UFS_BOOTDEVICE "ro.boot.bootdevice" + +#define TCPDUMP_NUMBER_BUGREPORT "persist.vendor.tcpdump.log.br_num" +#define TCPDUMP_PERSIST_PROPERTY "persist.vendor.tcpdump.log.alwayson" + +#define MODEM_EFS_DUMP_PROPERTY "vendor.sys.modem.diag.efsdump" + +using android::os::dumpstate::CommandOptions; +using android::os::dumpstate::DumpFileToFd; +using android::os::dumpstate::PropertiesHelper; +using android::os::dumpstate::RunCommandToFd; + +namespace android { +namespace hardware { +namespace dumpstate { +namespace V1_0 { +namespace implementation { + +#define DIAG_LOG_PREFIX "diag_log_" +#define TCPDUMP_LOG_PREFIX "tcpdump" +#define EXTENDED_LOG_PREFIX "extended_log_" + +void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir, + int maxFileNum, const char *logPrefix) { + struct dirent **dirent_list = NULL; + int num_entries = scandir(srcDir.c_str(), + &dirent_list, + 0, + (int (*)(const struct dirent **, const struct dirent **)) alphasort); + if (!dirent_list) { + return; + } else if (num_entries <= 0) { + return; + } + + int copiedFiles = 0; + + for (int i = num_entries - 1; i >= 0; i--) { + ALOGD("Found %s\n", dirent_list[i]->d_name); + + if (0 != strncmp(dirent_list[i]->d_name, logPrefix, strlen(logPrefix))) { + continue; + } + + if ((copiedFiles >= maxFileNum) && (maxFileNum != -1)) { + ALOGD("Skipped %s\n", dirent_list[i]->d_name); + continue; + } + + copiedFiles++; + + CommandOptions options = CommandOptions::WithTimeout(120).Build(); + std::string srcLogFile = srcDir + "/" + dirent_list[i]->d_name; + std::string destLogFile = destDir + "/" + dirent_list[i]->d_name; + + std::string copyCmd = "/vendor/bin/cp " + srcLogFile + " " + destLogFile; + + ALOGD("Copying %s to %s\n", srcLogFile.c_str(), destLogFile.c_str()); + RunCommandToFd(fd, "CP DIAG LOGS", { "/vendor/bin/sh", "-c", copyCmd.c_str() }, options); + } + + while (num_entries--) { + free(dirent_list[num_entries]); + } + + free(dirent_list); +} + +void DumpstateDevice::dumpModem(int fd, int fdModem) +{ + std::string modemLogDir = android::base::GetProperty(MODEM_LOG_LOC_PROPERTY, ""); + if (modemLogDir.empty()) { + ALOGD("No modem log place is set"); + return; + } + + std::string filePrefix = android::base::GetProperty(MODEM_LOG_PREFIX_PROPERTY, ""); + + if (filePrefix.empty()) { + ALOGD("Modem log prefix is not set"); + return; + } + + const std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar"; + const std::string modemLogAllDir = modemLogDir + "/modem_log"; + + RunCommandToFd(fd, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + + if (!PropertiesHelper::IsUserBuild()) { + char cmd[256] = { 0 }; + + RunCommandToFd(fd, "MODEM RFS INFO", {"/vendor/bin/find /data/vendor/rfs/mpss/OEMFI/"}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(fd, "MODEM DIAG SYSTEM PROPERTIES", {"/vendor/bin/getprop | grep vendor.sys.modem.diag"}, CommandOptions::WithTimeout(2).Build()); + + android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "true"); + + const std::string diagLogDir = "/data/vendor/radio/diag_logs/logs"; + const std::string tcpdumpLogDir = "/data/vendor/tcpdump_logger/logs"; + const std::string extendedLogDir = "/data/vendor/radio/extended_logs"; + const std::vector rilAndNetmgrLogs + { + "/data/vendor/radio/ril_log0", + "/data/vendor/radio/ril_log0_old", + "/data/vendor/radio/ril_log1", + "/data/vendor/radio/ril_log1_old", + "/data/vendor/radio/qmi_fw_log", + "/data/vendor/radio/qmi_fw_log_old", + "/data/vendor/radio/imsdatadaemon_log", + "/data/vendor/radio/imsdatadaemon_log_old", + "/data/vendor/netmgr/netmgr_log", + "/data/vendor/netmgr/netmgr_log_old", + "/data/vendor/radio/power_anomaly_data.txt", + "/data/vendor/radio/diag_logs/diag_trace.txt", + "/data/vendor/radio/diag_logs/diag_trace_old.txt", + "/data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl", + "/data/vendor/radio/metrics_data", + "/data/vendor/ssrlog/ssr_log.txt", + "/data/vendor/ssrlog/ssr_log_old.txt", + "/data/vendor/rfs/mpss/modem_efs" + }; + + bool smlogEnabled = android::base::GetBoolProperty(MODEM_LOGGING_SWITCH, false) && !access("/vendor/bin/smlog_dump", X_OK); + bool diagLogEnabled = android::base::GetBoolProperty(DIAG_MDLOG_PERSIST_PROPERTY, false); + bool tcpdumpEnabled = android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false); + + if (smlogEnabled) { + RunCommandToFd(fd, "SMLOG DUMP", {"smlog_dump", "-d", "-o", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(10).Build()); + } else if (diagLogEnabled) { + bool diagLogStarted = android::base::GetBoolProperty( DIAG_MDLOG_STATUS_PROPERTY, false); + + if (diagLogStarted) { + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false"); + ALOGD("Stopping diag_mdlog...\n"); + if (android::base::WaitForProperty(DIAG_MDLOG_STATUS_PROPERTY, "false", std::chrono::seconds(20))) { + ALOGD("diag_mdlog exited"); + } else { + ALOGE("Waited mdlog timeout after 20 second"); + } + } else { + ALOGD("diag_mdlog is not running"); + } + + dumpLogs(fd, diagLogDir, modemLogAllDir, android::base::GetIntProperty(DIAG_MDLOG_NUMBER_BUGREPORT, 100), DIAG_LOG_PREFIX); + + if (diagLogStarted) { + ALOGD("Restarting diag_mdlog..."); + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true"); + } + } + + if (tcpdumpEnabled) { + dumpLogs(fd, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX); + } + + for (const auto& logFile : rilAndNetmgrLogs) { + RunCommandToFd(fd, "CP MODEM LOG", {"/vendor/bin/cp", logFile.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + } + + //Dump IPA log + snprintf(cmd, sizeof(cmd), + "cat /d/ipc_logging/ipa/log > %s/ipa_log", + modemLogAllDir.c_str()); + RunCommandToFd(fd, "Dump IPA log", {"/vendor/bin/sh", "-c", cmd}); + + // Dump esoc-mdm log + snprintf(cmd, sizeof(cmd), + "cat /sys/kernel/debug/ipc_logging/esoc-mdm/log > %s/esoc-mdm_log.txt", + modemLogAllDir.c_str()); + RunCommandToFd(fd, "ESOC-MDM LOG", {"/vendor/bin/sh", "-c", cmd}); + + // Dump pcie0 log + snprintf(cmd, sizeof(cmd), + "cat /sys/kernel/debug/ipc_logging/pcie0-long/log > %s/pcie0-long_log.txt", + modemLogAllDir.c_str()); + RunCommandToFd(fd, "PCIE0-LONG LOG", {"/vendor/bin/sh", "-c", cmd}); + + snprintf(cmd, sizeof(cmd), + "cat /sys/kernel/debug/ipc_logging/pcie0-short/log > %s/pcie0-short_log.txt", + modemLogAllDir.c_str()); + RunCommandToFd(fd, "PCIE0-SHORT LOG", {"/vendor/bin/sh", "-c", cmd}); + + dumpLogs(fd, extendedLogDir, modemLogAllDir, 100, EXTENDED_LOG_PREFIX); + android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "false"); + } + + RunCommandToFd(fd, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(120).Build()); + RunCommandToFd(fd, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); + + std::vector buffer(65536); + android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK))); + + if (fdLog >= 0) { + while (1) { + ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fdLog, buffer.data(), buffer.size())); + + if (bytes_read == 0) { + break; + } else if (bytes_read < 0) { + ALOGD("read(%s): %s\n", modemLogCombined.c_str(), strerror(errno)); + break; + } + + ssize_t result = TEMP_FAILURE_RETRY(write(fdModem, buffer.data(), bytes_read)); + + if (result != bytes_read) { + ALOGD("Failed to write %ld bytes, actually written: %ld", bytes_read, result); + break; + } + } + } + + RunCommandToFd(fd, "RM MODEM DIR", { "/vendor/bin/rm", "-r", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); + RunCommandToFd(fd, "RM LOG", { "/vendor/bin/rm", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); +} + +static void DumpTouch(int fd) { + const char touch_spi_path[] = "/sys/class/spi_master/spi1/spi1.0"; + char cmd[256]; + + snprintf(cmd, sizeof(cmd), "%s/appid", touch_spi_path); + if (!access(cmd, R_OK)) { + // Touch firmware version + DumpFileToFd(fd, "STM touch firmware version", cmd); + + // Touch controller status + snprintf(cmd, sizeof(cmd), "%s/status", touch_spi_path); + DumpFileToFd(fd, "STM touch status", cmd); + + // Mutual raw data + snprintf(cmd, sizeof(cmd), + "echo 13 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd", + touch_spi_path, touch_spi_path); + RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd}); + + // Mutual strength data + snprintf(cmd, sizeof(cmd), + "echo 17 > %s/stm_fts_cmd && cat %s/stm_fts_cmd", + touch_spi_path, touch_spi_path); + RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd}); + + // Self raw data + snprintf(cmd, sizeof(cmd), + "echo 15 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd", + touch_spi_path, touch_spi_path); + RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd}); + } + + if (!access("/proc/fts/driver_test", R_OK)) { + RunCommandToFd(fd, "Mutual Raw Data", + {"/vendor/bin/sh", "-c", + "echo 23 00 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Mutual Baseline Data", + {"/vendor/bin/sh", "-c", + "echo 23 03 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Mutual Strength Data", + {"/vendor/bin/sh", "-c", + "echo 23 02 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Self Raw Data", + {"/vendor/bin/sh", "-c", + "echo 24 00 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Self Baseline Data", + {"/vendor/bin/sh", "-c", + "echo 24 03 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Self Strength Data", + {"/vendor/bin/sh", "-c", + "echo 24 02 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Mutual Compensation", + {"/vendor/bin/sh", "-c", + "echo 32 10 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + RunCommandToFd(fd, "Self Compensation", + {"/vendor/bin/sh", "-c", + "echo 33 12 > /proc/fts/driver_test && " + "cat /proc/fts/driver_test"}); + } +} + +static void DumpF2FS(int fd) { + DumpFileToFd(fd, "F2FS", "/sys/kernel/debug/f2fs/status"); + DumpFileToFd(fd, "F2FS - fragmentation", "/proc/fs/f2fs/dm-3/segment_info"); +} + +static void DumpUFS(int fd) { + DumpFileToFd(fd, "UFS model", "/sys/block/sda/device/model"); + DumpFileToFd(fd, "UFS rev", "/sys/block/sda/device/rev"); + DumpFileToFd(fd, "UFS size", "/sys/block/sda/size"); + DumpFileToFd(fd, "UFS show_hba", "/sys/kernel/debug/ufshcd0/show_hba"); + DumpFileToFd(fd, "UFS err_stats", "/sys/kernel/debug/ufshcd0/stats/err_stats"); + DumpFileToFd(fd, "UFS io_stats", "/sys/kernel/debug/ufshcd0/stats/io_stats"); + DumpFileToFd(fd, "UFS req_stats", "/sys/kernel/debug/ufshcd0/stats/req_stats"); + + std::string bootdev = android::base::GetProperty(UFS_BOOTDEVICE, ""); + if (!bootdev.empty()) { + DumpFileToFd(fd, "UFS Slow IO Read", "/sys/devices/platform/soc/" + bootdev + "/slowio_read_cnt"); + DumpFileToFd(fd, "UFS Slow IO Write", "/sys/devices/platform/soc/" + bootdev + "/slowio_write_cnt"); + DumpFileToFd(fd, "UFS Slow IO Unmap", "/sys/devices/platform/soc/" + bootdev + "/slowio_unmap_cnt"); + DumpFileToFd(fd, "UFS Slow IO Sync", "/sys/devices/platform/soc/" + bootdev + "/slowio_sync_cnt"); + + std::string ufs_health = "for f in $(find /sys/devices/platform/soc/" + bootdev + "/health -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; echo ''; fi; done"; + RunCommandToFd(fd, "UFS health", {"/vendor/bin/sh", "-c", ufs_health.c_str()}); + } +} + +static void DumpVibrator(int fd) { + const std::string dir = "/sys/class/leds/vibrator/device/"; + const std::vector files { + "asp_enable", + "comp_enable", + "cp_dig_scale", + "cp_trigger_duration", + "cp_trigger_index", + "cp_trigger_q_sub", + "cp_trigger_queue", + "dig_scale", + "exc_enable", + "f0_stored", + "fw_rev", + "heartbeat", + "hw_reset", + "leds/vibrator/activate", + "leds/vibrator/duration", + "leds/vibrator/state", + "num_waves", + "q_stored", + "redc_comp_enable", + "redc_stored", + "standby_timeout", + "vbatt_max", + "vbatt_min", + }; + + for (const auto &file : files) { + DumpFileToFd(fd, "Vibrator", dir+file); + } +} + +// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. +Return DumpstateDevice::dumpstateBoard(const hidl_handle& handle) { + // Exit when dump is completed since this is a lazy HAL. + addPostCommandTask([]() { + exit(0); + }); + + if (handle == nullptr || handle->numFds < 1) { + ALOGE("no FDs\n"); + return Void(); + } + + int fd = handle->data[0]; + if (fd < 0) { + ALOGE("invalid FD: %d\n", handle->data[0]); + return Void(); + } + + RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"}); + DumpFileToFd(fd, "SoC serial number", "/sys/devices/soc0/serial_number"); + DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present"); + DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online"); + DumpTouch(fd); + + DumpF2FS(fd); + DumpUFS(fd); + + DumpFileToFd(fd, "INTERRUPTS", "/proc/interrupts"); + DumpFileToFd(fd, "Sleep Stats", "/sys/power/system_sleep/stats"); + DumpFileToFd(fd, "Power Management Stats", "/sys/power/rpmh_stats/master_stats"); + DumpFileToFd(fd, "WLAN Power Stats", "/sys/kernel/wlan/power_stats"); + DumpFileToFd(fd, "LL-Stats", "/d/wlan0/ll_stats"); + DumpFileToFd(fd, "WLAN Connect Info", "/d/wlan0/connect_info"); + DumpFileToFd(fd, "WLAN Offload Info", "/d/wlan0/offload_info"); + DumpFileToFd(fd, "WLAN Roaming Stats", "/d/wlan0/roam_stats"); + DumpFileToFd(fd, "ICNSS Stats", "/d/icnss/stats"); + DumpFileToFd(fd, "SMD Log", "/d/ipc_logging/smd/log"); + RunCommandToFd(fd, "ION HEAPS", {"/vendor/bin/sh", "-c", "for d in $(ls -d /d/ion/*); do for f in $(ls $d); do echo --- $d/$f; cat $d/$f; done; done"}); + DumpFileToFd(fd, "dmabuf info", "/d/dma_buf/bufinfo"); + DumpFileToFd(fd, "dmabuf process info", "/d/dma_buf/dmaprocs"); + RunCommandToFd(fd, "Temperatures", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/thermal* ; do type=`cat $f/type` ; temp=`cat $f/temp` ; echo \"$type: $temp\" ; done"}); + RunCommandToFd(fd, "Cooling Device Current State", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; do type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \"$type: $temp\" ; done"}); + RunCommandToFd( + fd, "LMH info", + {"/vendor/bin/sh", "-c", + "for f in /sys/bus/platform/drivers/msm_lmh_dcvs/*qcom,limits-dcvs@*/lmh_freq_limit; do " + "state=`cat $f` ; echo \"$f: $state\" ; done"}); + RunCommandToFd(fd, "CPU time-in-state", {"/vendor/bin/sh", "-c", "for cpu in /sys/devices/system/cpu/cpu*; do f=$cpu/cpufreq/stats/time_in_state; if [ ! -f $f ]; then continue; fi; echo $f:; cat $f; done"}); + RunCommandToFd(fd, "CPU cpuidle", {"/vendor/bin/sh", "-c", "for cpu in /sys/devices/system/cpu/cpu*; do for d in $cpu/cpuidle/state*; do if [ ! -d $d ]; then continue; fi; echo \"$d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage`\"; done; done"}); + RunCommandToFd(fd, "Airbrush debug info", {"/vendor/bin/sh", "-c", "for f in `ls /sys/devices/platform/soc/c84000.i2c/i2c-4/4-0066/@(*curr|temperature|vbat|total_power)`; do echo \"$f: `cat $f`\" ; done; file=/d/airbrush/airbrush_sm/chip_state; echo \"$file: `cat $file`\""}); + DumpFileToFd(fd, "MDP xlogs", "/data/vendor/display/mdp_xlog"); + DumpFileToFd(fd, "TCPM logs", "/d/tcpm/usbpd0"); + DumpFileToFd(fd, "PD Engine", "/d/pd_engine/usbpd0"); + DumpFileToFd(fd, "ipc-local-ports", "/d/msm_ipc_router/dump_local_ports"); + RunCommandToFd(fd, "USB Device Descriptors", {"/vendor/bin/sh", "-c", "cd /sys/bus/usb/devices/1-1 && cat product && cat bcdDevice; cat descriptors | od -t x1 -w16 -N96"}); + RunCommandToFd(fd, "Power supply properties", {"/vendor/bin/sh", "-c", "for f in `ls /sys/class/power_supply/*/uevent` ; do echo \"------ $f\\n`cat $f`\\n\" ; done"}); + RunCommandToFd(fd, "PMIC Votables", {"/vendor/bin/sh", "-c", "cat /sys/kernel/debug/pmic-votable/*/status"}); + DumpFileToFd(fd, "Battery cycle count", "/d/google_battery/cycle_count_bins"); + DumpFileToFd(fd, "Maxim FG History", "/dev/maxfg_history"); + DumpFileToFd(fd, "Maxim FG registers", "/d/regmap/1-0036/registers"); + DumpFileToFd(fd, "Maxim FG NV RAM", "/d/regmap/1-000b/registers"); + RunCommandToFd(fd, "Google Charger", {"/vendor/bin/sh", "-c", "cd /d/google_charger/; for f in `ls pps_*` ; do echo \"$f: `cat $f`\" ; done"}); + RunCommandToFd(fd, "Google Battery", {"/vendor/bin/sh", "-c", "cd /d/google_battery/; for f in `ls ssoc_*` ; do echo \"$f: `cat $f`\" ; done"}); + DumpFileToFd(fd, "WLC VER", "/sys/devices/platform/soc/a88000.i2c/i2c-0/0-0061/version"); + DumpFileToFd(fd, "WLC STATUS", "/sys/devices/platform/soc/a88000.i2c/i2c-0/0-0061/status"); + + RunCommandToFd(fd, "eSIM Status", {"/vendor/bin/sh", "-c", "od -t x1 /sys/firmware/devicetree/base/chosen/cdt/cdb2/esim"}); + DumpFileToFd(fd, "Modem Stat", "/data/vendor/modem_stat/debug.txt"); + DumpFileToFd(fd, "Pixel trace", "/d/tracing/instances/pixel-trace/trace"); + + // Slower dump put later in case stuck the rest of dump + // Timeout after 3s as TZ log missing EOF + RunCommandToFd(fd, "QSEE logs", {"/vendor/bin/sh", "-c", "/vendor/bin/timeout 3 cat /d/tzdbg/qsee_log"}); + if (handle->numFds < 2) { + ALOGE("no FD for modem\n"); + } else { + int fdModem = handle->data[1]; + dumpModem(fd, fdModem); + } + + // Citadel info (only enabled on -eng and -userdebug builds) + if (!PropertiesHelper::IsUserBuild()) { + RunCommandToFd(fd, "Citadel ID", {"/vendor/bin/hw/citadel_updater", "--id"}); + RunCommandToFd(fd, "Citadel VER", {"/vendor/bin/hw/citadel_updater", "-lv"}); + RunCommandToFd(fd, "Citadel SELFTEST", {"/vendor/bin/hw/citadel_updater", "--selftest"}); + } + + DumpVibrator(fd); + + // Dump various events in WiFi data path + DumpFileToFd(fd, "WLAN DP Trace", "/d/wlan/dpt_stats/dump_set_dpt_logs"); + + // Keep this at the end as very long on not for humans + DumpFileToFd(fd, "WLAN FW Log Symbol Table", "/vendor/firmware/Data.msc"); + + return Void(); +} + +} // namespace implementation +} // namespace V1_0 +} // namespace dumpstate +} // namespace hardware +} // namespace android diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h new file mode 100644 index 0000000..7c60083 --- /dev/null +++ b/dumpstate/DumpstateDevice.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H +#define ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace dumpstate { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::dumpstate::V1_0::IDumpstateDevice; +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_handle; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +struct DumpstateDevice : public IDumpstateDevice { + // Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. + Return dumpstateBoard(const hidl_handle& h) override; + + void dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum, + const char *logPrefix); + void dumpModem(int fd, int fdModem); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace dumpstate +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H diff --git a/dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc b/dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc new file mode 100644 index 0000000..a3ee8fc --- /dev/null +++ b/dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc @@ -0,0 +1,10 @@ +service vendor.dumpstate-1-0 /vendor/bin/hw/android.hardware.dumpstate@1.0-service.redfin + class hal + user system + group system vendor_rfs + interface android.hardware.dumpstate@1.0::IDumpstateDevice default + oneshot + disabled + +on boot + chmod 0444 /sys/kernel/debug/tzdbg/qsee_log diff --git a/dumpstate/service.cpp b/dumpstate/service.cpp new file mode 100644 index 0000000..2eb0fdc --- /dev/null +++ b/dumpstate/service.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define LOG_TAG "android.hardware.dumpstate@1.0-service.redfin" + +#include +#include + +#include "DumpstateDevice.h" + +using ::android::hardware::configureRpcThreadpool; +using ::android::hardware::dumpstate::V1_0::IDumpstateDevice; +using ::android::hardware::dumpstate::V1_0::implementation::DumpstateDevice; +using ::android::hardware::joinRpcThreadpool; +using ::android::sp; + + +int main(int /* argc */, char* /* argv */ []) { + sp dumpstate = new DumpstateDevice; + configureRpcThreadpool(1, true); + + android::status_t status = dumpstate->registerAsService(); + + if (status != android::OK) + { + ALOGE("Could not register DumpstateDevice service (%d).", status); + return -1; + } + + joinRpcThreadpool(); +} diff --git a/framework_manifest.xml b/framework_manifest.xml new file mode 100644 index 0000000..b2276a5 --- /dev/null +++ b/framework_manifest.xml @@ -0,0 +1,39 @@ + + + + + vendor.qti.hardware.radio.atcmdfwd + hwbinder + 1.0 + + IAtCmdFwd + AtCmdFwdService + + + diff --git a/fstab.hardware b/fstab.hardware new file mode 100644 index 0000000..b601aad --- /dev/null +++ b/fstab.hardware @@ -0,0 +1,12 @@ +# Android fstab file. + +# +system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount +vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount +product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount +/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount +/dev/block/bootdevice/by-name/modem /vendor/firmware_mnt vfat ro,shortname=lower,uid=0,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait,slotselect +/dev/block/bootdevice/by-name/misc /misc emmc defaults defaults +/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,quota,formattable,fileencryption=ice,reservedsize=128M,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs +/devices/platform/soc/a600000.ssusb/a600000.dwc3* auto vfat defaults voldmanaged=usb:auto +/dev/block/zram0 none swap defaults zramsize=2147483648,max_comp_streams=8,zram_loopback_path=/data/unencrypted/zram_swap,zram_loopback_size=512M diff --git a/fstab.persist b/fstab.persist new file mode 100644 index 0000000..f3840b1 --- /dev/null +++ b/fstab.persist @@ -0,0 +1,4 @@ +# Keep persist in an fstab file, since we need to run fsck on it after abnormal shutdown. + +# +/dev/block/platform/soc/1d84000.ufshc/by-name/persist /mnt/vendor/persist ext4 nosuid,nodev,noatime,barrier=1 wait diff --git a/fstab.postinstall b/fstab.postinstall new file mode 100644 index 0000000..83bb3c6 --- /dev/null +++ b/fstab.postinstall @@ -0,0 +1,17 @@ +# +# Copyright (C) 2018 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. + +# +system /postinstall ext4 ro,nosuid,nodev,noexec slotselect_other,logical,avb_keys=/product/etc/security/avb/system_other.avbpubkey diff --git a/gps.conf b/gps.conf new file mode 100644 index 0000000..9f5a702 --- /dev/null +++ b/gps.conf @@ -0,0 +1,297 @@ +#Version check for XTRA +#DISABLE = 0 +#AUTO = 1 +#XTRA2 = 2 +#XTRA3 = 3 +XTRA_VERSION_CHECK=0 + +# Error Estimate +# _SET = 1 +# _CLEAR = 0 +ERR_ESTIMATE=0 + +#NTP server +#NTP_SERVER setting is in modem NV + +#XTRA CA path +XTRA_CA_PATH=/system/etc/security/cacerts + +# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info +# 4 - Debug, 5 - Verbose +# If DEBUG_LEVEL is commented, Android's logging levels will be used +DEBUG_LEVEL = 2 + +# Intermediate position report, 1=enable, 0=disable +INTERMEDIATE_POS=0 + +# Below bit mask configures how GPS functionalities +# should be locked when user turns off GPS on Settings +# Set bit 0x1 if MO GPS functionalities are to be locked +# Set bit 0x2 if NI GPS functionalities are to be locked +# default – both MO and NI locked for maximal privacy +#GPS_LOCK = 3 + +# supl version 1.0 +#SUPL_VER=0x10000 + +# Emergency SUPL, 1=enable, 0=disable +SUPL_ES=1 + +#Choose PDN for Emergency SUPL +#1 - Use emergency PDN +#0 - Use regular SUPL PDN for Emergency SUPL +#USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=0 + +#SUPL_MODE is a bit mask set in config.xml per carrier by default. +#If it is uncommented here, this value will overwrite the value from +#config.xml. +#MSA=0X2 +#MSB=0X1 +#SUPL_MODE= + +# GPS Capabilities bit mask +# SCHEDULING = 0x01 +# MSB = 0x02 +# MSA = 0x04 +# ON_DEMAND_TIME = 0x10 +# GEOFENCE = 0x20 +# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE +CAPABILITIES=0x37 + +# Accuracy threshold for intermediate positions +# less accurate positions are ignored, 0 for passing all positions +# ACCURACY_THRES=5000 + +################################ +##### AGPS server settings ##### +################################ + +# FOR SUPL SUPPORT, set the following +# SUPL_HOST=supl.host.com or IP +# SUPL_PORT=1234 + +# FOR MO SUPL SUPPORT, set the following +# MO_SUPL_HOST=supl.host.com or IP +# MO_SUPL_PORT=1234 + +# FOR C2K PDE SUPPORT, set the following +# C2K_HOST=c2k.pde.com or IP +# C2K_PORT=1234 + +# Bitmask of slots that are available +# for write/install to, where 1s indicate writable, +# and the default value is 0 where no slots +# are writable. For example, AGPS_CERT_WRITABLE_MASK +# of b1000001010 makes 3 slots available +# and the remaining 7 slots unwritable. +#AGPS_CERT_WRITABLE_MASK=0 + +#################################### +# LTE Positioning Profile Settings +#################################### +# 0: Enable RRLP on LTE(Default) +# 1: Enable LPP_User_Plane on LTE +# 2: Enable LPP_Control_Plane +# 3: Enable both LPP_User_Plane and LPP_Control_Plane +#LPP_PROFILE = 2 + +#################################### +#Datum Type +#################################### +# 0: WGS-84 +# 1: PZ-90 +DATUM_TYPE = 0 + +################################ +# EXTRA SETTINGS +################################ +# NMEA provider (1=Modem Processor, 0=Application Processor) +NMEA_PROVIDER=0 +# Mark if it is a SGLTE target (1=SGLTE, 0=nonSGLTE) +SGLTE_TARGET=0 + +################################################## +# Select Positioning Protocol on A-GLONASS system +################################################## +# 0x1: RRC CPlane +# 0x2: RRLP UPlane +# 0x4: LLP Uplane +#A_GLONASS_POS_PROTOCOL_SELECT = 0 + +################################################## +# Select technology for LPPe Control Plane +################################################## +# 0x1: DBH for LPPe CP +# 0x2: WLAN AP Measurements for LPPe CP +# 0x4: SRN AP measurement for CP +# 0x8: Sensor Barometer Measurement LPPe CP +#LPPE_CP_TECHNOLOGY = 0 + +################################################## +# Select technology for LPPe User Plane +################################################## +# 0x1: DBH for LPPe UP +# 0x2: WLAN AP Measurements for LPPe UP +# 0x4: SRN AP measurement for UP +# 0x8: Sensor Barometer Measurement LPPe UP +#LPPE_UP_TECHNOLOGY = 0 + +################################################## +# AGPS_CONFIG_INJECT +################################################## +# enable/disable injection of AGPS configurations: +# SUPL_VER +# SUPL_HOST +# SUPL_PORT +# MO_SUPL_HOST +# MO_SUPL_PORT +# C2K_HOST +# C2K_PORT +# LPP_PROFILE +# A_GLONASS_POS_PROTOCOL_SELECT +# 0: disable +# 1: enable +AGPS_CONFIG_INJECT = 1 + +################################################## +# GNSS settings for automotive use cases +# Configurations in following section are +# specific to automotive use cases, others +# please do not change, keep the default values +################################################## + +# AP Coarse Timestamp Uncertainty +################################################## +# default : 10 +# AP time stamp uncertainty, until GNSS receiver +# is able to acquire better timing information +AP_TIMESTAMP_UNCERTAINTY = 10 + +################################################## +# QDR engine availability status +################################################## +# 0 : NO QDR (default) +# 1 : QDR enabled +# This settings enables QDR Configuration for +# automotive use case, if enabled then +# DR_AP_Service needs to be enabled in izat.conf +#EXTERNAL_DR_ENABLED = 0 + +##################################### +# DR_SYNC Pulse Availability +##################################### +# 0 : DR_SYNC pulse not available (default) +# 1 : DR_SYNC pulse available +# This configuration enables the driver to make use +# of PPS events generated by DR_SYNC pulse +# Standard Linux PPS driver needs to be enabled +DR_SYNC_ENABLED = 0 + +##################################### +# PPS Device name +##################################### +PPS_DEVICENAME = /dev/pps0 + +##################################### +# Ignore PPS at Startup and after long outage +##################################### +IGNORE_PPS_PULSE_COUNT = 1 + +##################################### +# Long GNSS RF outage in seconds +##################################### +GNSS_OUTAGE_DURATION = 10 + +##################################### +# AP Clock Accuracy +##################################### +# Quality of APPS processor clock (in PPM). +# Value specified is used for calculation of +# APPS time stamp uncertainty +AP_CLOCK_PPM = 100 + +##################################### +# MAX ms difference to detect missing pulse +##################################### +# Specifies time threshold in ms to validate any missing PPS pulses +MISSING_PULSE_TIME_DELTA = 900 + +##################################### +# Propagation time uncertainty +##################################### +# This settings enables time uncertainty propagation +# logic incase of missing PPS pulse +PROPAGATION_TIME_UNCERTAINTY = 1 + +####################################### +# APN / IP Type Configuration +# APN and IP Type to use for setting +# up WWAN call. +# Use below values for IP Type: +# v4 = 4 +# v6 = 6 +# v4v6 = 10 +####################################### +# INTERNET_APN = abc.xyz +# INTERNET_IP_TYPE = 4 +# SUPL_APN = abc.xyz +# SUPL_IP_TYPE = 4 + +##################################### +# Modem type +##################################### +# This setting configures modem type +# (external=0 or internal=1) +# comment out the next line to vote +# for the first modem in the list +MODEM_TYPE = 0 + +################################################## +# CONSTRAINED TIME UNCERTAINTY MODE +################################################## +# 0 : disabled (default) +# 1 : enabled +# This setting enables GPS engine to keep its time +# uncertainty below the specified constraint +#CONSTRAINED_TIME_UNCERTAINTY_ENABLED = 0 + +# If constrained time uncertainty mode is enabled, +# this setting specifies the time uncertainty +# threshold that gps engine need to maintain. +# In unit of milli-seconds. +# Default is 0.0 meaning that modem default value +# of time uncertainty threshold will be used. +#CONSTRAINED_TIME_UNCERTAINTY_THRESHOLD = 0.0 + +# If constrained time uncertainty mode is enabled, +# this setting specifies the power budget that +# gps engine is allowed to spend to maintain the time +# uncertainty. +# Default is 0 meaning that GPS engine is not constained +# by power budget and can spend as much power as needed. +# In unit of 0.1 milli watt second. +#CONSTRAINED_TIME_UNCERTAINTY_ENERGY_BUDGET = 0 + +################################################## +# POSITION ASSISTED CLOCK ESTIMATOR +################################################## +# 0 : disabled (default) +# 1 : enabled +# This setting enables GPS engine to estimate clock +# bias and drift when the signal from at least 1 +# SV is available and the UE’s position is known by +# other position engines. +#POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED = 0 + +##################################### +# proxyAppPackageName +##################################### +# This is a string that is sent to the framework +# in nfwNotifyCb callback +PROXY_APP_PACKAGE_NAME = com.google.android.carrierlocation + +##################################### +# CP_MTLR_ES +##################################### +# CP MTLR ES, 1=enable, 0=disable +CP_MTLR_ES=1 diff --git a/gpt-utils/Android.mk b/gpt-utils/Android.mk new file mode 100644 index 0000000..6dd1a44 --- /dev/null +++ b/gpt-utils/Android.mk @@ -0,0 +1,46 @@ +# +# Copyright 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := gpt-utils.cpp +ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) +LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +endif +LOCAL_SHARED_LIBRARIES := liblog libz +LOCAL_MODULE := libgptutils +LOCAL_MODULE_OWNER := qti +include $(BUILD_STATIC_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := gpt-utils.cpp +ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) +LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +endif +LOCAL_SHARED_LIBRARIES += liblog libcutils libz +LOCAL_EXPORT_HEADER_LIBRARY_HEADERS := libgptutils_headers +LOCAL_MODULE := libgptutils +LOCAL_MODULE_OWNER := qti +LOCAL_PROPRIETARY_MODULE := true +include $(BUILD_SHARED_LIBRARY) + +include $(CLEAR_VARS) +LOCAL_MODULE := libgptutils_headers +LOCAL_EXPORT_C_INCLUDE_DIRS:=$(LOCAL_PATH) +include $(BUILD_HEADER_LIBRARY) diff --git a/gpt-utils/gpt-utils.cpp b/gpt-utils/gpt-utils.cpp new file mode 100644 index 0000000..8636c40 --- /dev/null +++ b/gpt-utils/gpt-utils.cpp @@ -0,0 +1,1542 @@ +/* + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define _LARGEFILE64_SOURCE /* enable lseek64() */ + +/****************************************************************************** + * INCLUDE SECTION + ******************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define LOG_TAG "gpt-utils" +#include +#include +#include "gpt-utils.h" +#include +#include + + +/****************************************************************************** + * DEFINE SECTION + ******************************************************************************/ +#define BLK_DEV_FILE "/dev/block/mmcblk0" +/* list the names of the backed-up partitions to be swapped */ +/* extension used for the backup partitions - tzbak, abootbak, etc. */ +#define BAK_PTN_NAME_EXT "bak" +#define XBL_PRIMARY "/dev/block/platform/soc/1d84000.ufshc/by-name/xbl" +#define XBL_BACKUP "/dev/block/platform/soc/1d84000.ufshc/by-name/xblbak" +#define XBL_AB_PRIMARY "/dev/block/platform/soc/1d84000.ufshc/by-name/xbl_a" +#define XBL_AB_SECONDARY "/dev/block/platform/soc/1d84000.ufshc/by-name/xbl_b" +/* GPT defines */ +#define MAX_LUNS 26 +//Size of the buffer that needs to be passed to the UFS ioctl +#define UFS_ATTR_DATA_SIZE 32 +//This will allow us to get the root lun path from the path to the partition. +//i.e: from /dev/block/sdaXXX get /dev/block/sda. The assumption here is that +//the boot critical luns lie between sda to sdz which is acceptable because +//only user added external disks,etc would lie beyond that limit which do not +//contain partitions that interest us here. +#define PATH_TRUNCATE_LOC (sizeof("/dev/block/sda") - 1) + +//From /dev/block/sda get just sda +#define LUN_NAME_START_LOC (sizeof("/dev/block/") - 1) +#define BOOT_LUN_A_ID 1 +#define BOOT_LUN_B_ID 2 +/****************************************************************************** + * MACROS + ******************************************************************************/ + + +#define GET_4_BYTES(ptr) ((uint32_t) *((uint8_t *)(ptr)) | \ + ((uint32_t) *((uint8_t *)(ptr) + 1) << 8) | \ + ((uint32_t) *((uint8_t *)(ptr) + 2) << 16) | \ + ((uint32_t) *((uint8_t *)(ptr) + 3) << 24)) + +#define GET_8_BYTES(ptr) ((uint64_t) *((uint8_t *)(ptr)) | \ + ((uint64_t) *((uint8_t *)(ptr) + 1) << 8) | \ + ((uint64_t) *((uint8_t *)(ptr) + 2) << 16) | \ + ((uint64_t) *((uint8_t *)(ptr) + 3) << 24) | \ + ((uint64_t) *((uint8_t *)(ptr) + 4) << 32) | \ + ((uint64_t) *((uint8_t *)(ptr) + 5) << 40) | \ + ((uint64_t) *((uint8_t *)(ptr) + 6) << 48) | \ + ((uint64_t) *((uint8_t *)(ptr) + 7) << 56)) + +#define PUT_4_BYTES(ptr, y) *((uint8_t *)(ptr)) = (y) & 0xff; \ + *((uint8_t *)(ptr) + 1) = ((y) >> 8) & 0xff; \ + *((uint8_t *)(ptr) + 2) = ((y) >> 16) & 0xff; \ + *((uint8_t *)(ptr) + 3) = ((y) >> 24) & 0xff; + +/****************************************************************************** + * TYPES + ******************************************************************************/ +using namespace std; +enum gpt_state { + GPT_OK = 0, + GPT_BAD_SIGNATURE, + GPT_BAD_CRC +}; +//List of LUN's containing boot critical images. +//Required in the case of UFS devices +struct update_data { + char lun_list[MAX_LUNS][PATH_MAX]; + uint32_t num_valid_entries; +}; + +/****************************************************************************** + * FUNCTIONS + ******************************************************************************/ +/** + * ========================================================================== + * + * \brief Read/Write len bytes from/to block dev + * + * \param [in] fd block dev file descriptor (returned from open) + * \param [in] rw RW flag: 0 - read, != 0 - write + * \param [in] offset block dev offset [bytes] - RW start position + * \param [in] buf Pointer to the buffer containing the data + * \param [in] len RW size in bytes. Buf must be at least that big + * + * \return 0 on success + * + * ========================================================================== + */ +static int blk_rw(int fd, int rw, int64_t offset, uint8_t *buf, unsigned len) +{ + int r; + + if (lseek64(fd, offset, SEEK_SET) < 0) { + fprintf(stderr, "block dev lseek64 %" PRIi64 " failed: %s\n", offset, + strerror(errno)); + return -1; + } + + if (rw) + r = write(fd, buf, len); + else + r = read(fd, buf, len); + + if (r < 0) + fprintf(stderr, "block dev %s failed: %s\n", rw ? "write" : "read", + strerror(errno)); + else + r = 0; + + return r; +} + + + +/** + * ========================================================================== + * + * \brief Search within GPT for partition entry with the given name + * or it's backup twin (name-bak). + * + * \param [in] ptn_name Partition name to seek + * \param [in] pentries_start Partition entries array start pointer + * \param [in] pentries_end Partition entries array end pointer + * \param [in] pentry_size Single partition entry size [bytes] + * + * \return First partition entry pointer that matches the name or NULL + * + * ========================================================================== + */ +static uint8_t *gpt_pentry_seek(const char *ptn_name, + const uint8_t *pentries_start, + const uint8_t *pentries_end, + uint32_t pentry_size) +{ + char *pentry_name; + unsigned len = strlen(ptn_name); + + for (pentry_name = (char *) (pentries_start + PARTITION_NAME_OFFSET); + pentry_name < (char *) pentries_end; pentry_name += pentry_size) { + char name8[MAX_GPT_NAME_SIZE / 2]; + unsigned i; + + /* Partition names in GPT are UTF-16 - ignoring UTF-16 2nd byte */ + for (i = 0; i < sizeof(name8); i++) + name8[i] = pentry_name[i * 2]; + if (!strncmp(ptn_name, name8, len)) + if (name8[len] == 0 || !strcmp(&name8[len], BAK_PTN_NAME_EXT)) + return (uint8_t *) (pentry_name - PARTITION_NAME_OFFSET); + } + + return NULL; +} + + + +/** + * ========================================================================== + * + * \brief Swaps boot chain in GPT partition entries array + * + * \param [in] pentries_start Partition entries array start + * \param [in] pentries_end Partition entries array end + * \param [in] pentry_size Single partition entry size + * + * \return 0 on success, 1 if no backup partitions found + * + * ========================================================================== + */ +static int gpt_boot_chain_swap(const uint8_t *pentries_start, + const uint8_t *pentries_end, + uint32_t pentry_size) +{ + const char ptn_swap_list[][MAX_GPT_NAME_SIZE] = { PTN_SWAP_LIST }; + + int backup_not_found = 1; + unsigned i; + + for (i = 0; i < ARRAY_SIZE(ptn_swap_list); i++) { + uint8_t *ptn_entry; + uint8_t *ptn_bak_entry; + uint8_t ptn_swap[PTN_ENTRY_SIZE]; + //Skip the xbl partition on UFS devices. That is handled + //seperately. + if (gpt_utils_is_ufs_device() && !strncmp(ptn_swap_list[i], + PTN_XBL, + strlen(PTN_XBL))) + continue; + + ptn_entry = gpt_pentry_seek(ptn_swap_list[i], pentries_start, + pentries_end, pentry_size); + if (ptn_entry == NULL) + continue; + + ptn_bak_entry = gpt_pentry_seek(ptn_swap_list[i], + ptn_entry + pentry_size, pentries_end, pentry_size); + if (ptn_bak_entry == NULL) { + fprintf(stderr, "'%s' partition not backup - skip safe update\n", + ptn_swap_list[i]); + continue; + } + + /* swap primary <-> backup partition entries */ + memcpy(ptn_swap, ptn_entry, PTN_ENTRY_SIZE); + memcpy(ptn_entry, ptn_bak_entry, PTN_ENTRY_SIZE); + memcpy(ptn_bak_entry, ptn_swap, PTN_ENTRY_SIZE); + backup_not_found = 0; + } + + return backup_not_found; +} + + + +/** + * ========================================================================== + * + * \brief Sets secondary GPT boot chain + * + * \param [in] fd block dev file descriptor + * \param [in] boot Boot chain to switch to + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt2_set_boot_chain(int fd, enum boot_chain boot) +{ + int64_t gpt2_header_offset; + uint64_t pentries_start_offset; + uint32_t gpt_header_size; + uint32_t pentry_size; + uint32_t pentries_array_size; + + uint8_t *gpt_header = NULL; + uint8_t *pentries = NULL; + uint32_t crc; + uint32_t blk_size = 0; + int r; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + r = -1; + goto EXIT; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "Failed to allocate memory to hold GPT block\n"); + r = -1; + goto EXIT; + } + gpt2_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt2_header_offset < 0) { + fprintf(stderr, "Getting secondary GPT header offset failed: %s\n", + strerror(errno)); + r = -1; + goto EXIT; + } + + /* Read primary GPT header from block dev */ + r = blk_rw(fd, 0, blk_size, gpt_header, blk_size); + + if (r) { + fprintf(stderr, "Failed to read primary GPT header from blk dev\n"); + goto EXIT; + } + pentries_start_offset = + GET_8_BYTES(gpt_header + PENTRIES_OFFSET) * blk_size; + pentry_size = GET_4_BYTES(gpt_header + PENTRY_SIZE_OFFSET); + pentries_array_size = + GET_4_BYTES(gpt_header + PARTITION_COUNT_OFFSET) * pentry_size; + + pentries = (uint8_t *) calloc(1, pentries_array_size); + if (pentries == NULL) { + fprintf(stderr, + "Failed to alloc memory for GPT partition entries array\n"); + r = -1; + goto EXIT; + } + /* Read primary GPT partititon entries array from block dev */ + r = blk_rw(fd, 0, pentries_start_offset, pentries, pentries_array_size); + if (r) + goto EXIT; + + crc = crc32(0, pentries, pentries_array_size); + if (GET_4_BYTES(gpt_header + PARTITION_CRC_OFFSET) != crc) { + fprintf(stderr, "Primary GPT partition entries array CRC invalid\n"); + r = -1; + goto EXIT; + } + + /* Read secondary GPT header from block dev */ + r = blk_rw(fd, 0, gpt2_header_offset, gpt_header, blk_size); + if (r) + goto EXIT; + + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + pentries_start_offset = + GET_8_BYTES(gpt_header + PENTRIES_OFFSET) * blk_size; + + if (boot == BACKUP_BOOT) { + r = gpt_boot_chain_swap(pentries, pentries + pentries_array_size, + pentry_size); + if (r) + goto EXIT; + } + + crc = crc32(0, pentries, pentries_array_size); + PUT_4_BYTES(gpt_header + PARTITION_CRC_OFFSET, crc); + + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + crc = crc32(0, gpt_header, gpt_header_size); + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, crc); + + /* Write the modified GPT header back to block dev */ + r = blk_rw(fd, 1, gpt2_header_offset, gpt_header, blk_size); + if (!r) + /* Write the modified GPT partititon entries array back to block dev */ + r = blk_rw(fd, 1, pentries_start_offset, pentries, + pentries_array_size); + +EXIT: + if(gpt_header) + free(gpt_header); + if (pentries) + free(pentries); + return r; +} + +/** + * ========================================================================== + * + * \brief Checks GPT state (header signature and CRC) + * + * \param [in] fd block dev file descriptor + * \param [in] gpt GPT header to be checked + * \param [out] state GPT header state + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt_get_state(int fd, enum gpt_instance gpt, enum gpt_state *state) +{ + int64_t gpt_header_offset; + uint32_t gpt_header_size; + uint8_t *gpt_header = NULL; + uint32_t crc; + uint32_t blk_size = 0; + + *state = GPT_OK; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + goto error; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "gpt_get_state:Failed to alloc memory for header\n"); + goto error; + } + if (gpt == PRIMARY_GPT) + gpt_header_offset = blk_size; + else { + gpt_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt_header_offset < 0) { + fprintf(stderr, "gpt_get_state:Seek to end of GPT part fail\n"); + goto error; + } + } + + if (blk_rw(fd, 0, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "gpt_get_state: blk_rw failed\n"); + goto error; + } + if (memcmp(gpt_header, GPT_SIGNATURE, sizeof(GPT_SIGNATURE))) + *state = GPT_BAD_SIGNATURE; + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + + crc = GET_4_BYTES(gpt_header + HEADER_CRC_OFFSET); + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + if (crc32(0, gpt_header, gpt_header_size) != crc) + *state = GPT_BAD_CRC; + free(gpt_header); + return 0; +error: + if (gpt_header) + free(gpt_header); + return -1; +} + + + +/** + * ========================================================================== + * + * \brief Sets GPT header state (used to corrupt and fix GPT signature) + * + * \param [in] fd block dev file descriptor + * \param [in] gpt GPT header to be checked + * \param [in] state GPT header state to set (GPT_OK or GPT_BAD_SIGNATURE) + * + * \return 0 on success + * + * ========================================================================== + */ +static int gpt_set_state(int fd, enum gpt_instance gpt, enum gpt_state state) +{ + int64_t gpt_header_offset; + uint32_t gpt_header_size; + uint8_t *gpt_header = NULL; + uint32_t crc; + uint32_t blk_size = 0; + + if (ioctl(fd, BLKSSZGET, &blk_size) != 0) { + fprintf(stderr, "Failed to get GPT device block size: %s\n", + strerror(errno)); + goto error; + } + gpt_header = (uint8_t*)malloc(blk_size); + if (!gpt_header) { + fprintf(stderr, "Failed to alloc memory for gpt header\n"); + goto error; + } + if (gpt == PRIMARY_GPT) + gpt_header_offset = blk_size; + else { + gpt_header_offset = lseek64(fd, 0, SEEK_END) - blk_size; + if (gpt_header_offset < 0) { + fprintf(stderr, "Failed to seek to end of GPT device\n"); + goto error; + } + } + if (blk_rw(fd, 0, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "Failed to r/w gpt header\n"); + goto error; + } + if (state == GPT_OK) + memcpy(gpt_header, GPT_SIGNATURE, sizeof(GPT_SIGNATURE)); + else if (state == GPT_BAD_SIGNATURE) + *gpt_header = 0; + else { + fprintf(stderr, "gpt_set_state: Invalid state\n"); + goto error; + } + + gpt_header_size = GET_4_BYTES(gpt_header + HEADER_SIZE_OFFSET); + + /* header CRC is calculated with this field cleared */ + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, 0); + crc = crc32(0, gpt_header, gpt_header_size); + PUT_4_BYTES(gpt_header + HEADER_CRC_OFFSET, crc); + + if (blk_rw(fd, 1, gpt_header_offset, gpt_header, blk_size)) { + fprintf(stderr, "gpt_set_state: blk write failed\n"); + goto error; + } + return 0; +error: + if(gpt_header) + free(gpt_header); + return -1; +} + +int get_scsi_node_from_bootdevice(const char *bootdev_path, + char *sg_node_path, + size_t buf_size) +{ + char sg_dir_path[PATH_MAX] = {0}; + char real_path[PATH_MAX] = {0}; + DIR *scsi_dir = NULL; + struct dirent *de; + int node_found = 0; + if (!bootdev_path || !sg_node_path) { + fprintf(stderr, "%s : invalid argument\n", + __func__); + goto error; + } + if (readlink(bootdev_path, real_path, sizeof(real_path) - 1) < 0) { + fprintf(stderr, "failed to resolve link for %s(%s)\n", + bootdev_path, + strerror(errno)); + goto error; + } + if(strlen(real_path) < PATH_TRUNCATE_LOC + 1){ + fprintf(stderr, "Unrecognized path :%s:\n", + real_path); + goto error; + } + //For the safe side in case there are additional partitions on + //the XBL lun we truncate the name. + real_path[PATH_TRUNCATE_LOC] = '\0'; + if(strlen(real_path) < LUN_NAME_START_LOC + 1){ + fprintf(stderr, "Unrecognized truncated path :%s:\n", + real_path); + goto error; + } + //This will give us /dev/block/sdb/device/scsi_generic + //which contains a file sgY whose name gives us the path + //to /dev/sgY which we return + snprintf(sg_dir_path, sizeof(sg_dir_path) - 1, + "/sys/block/%s/device/scsi_generic", + &real_path[LUN_NAME_START_LOC]); + scsi_dir = opendir(sg_dir_path); + if (!scsi_dir) { + fprintf(stderr, "%s : Failed to open %s(%s)\n", + __func__, + sg_dir_path, + strerror(errno)); + goto error; + } + while((de = readdir(scsi_dir))) { + if (de->d_name[0] == '.') + continue; + else if (!strncmp(de->d_name, "sg", 2)) { + snprintf(sg_node_path, + buf_size -1, + "/dev/%s", + de->d_name); + fprintf(stderr, "%s:scsi generic node is :%s:\n", + __func__, + sg_node_path); + node_found = 1; + break; + } + } + if(!node_found) { + fprintf(stderr,"%s: Unable to locate scsi generic node\n", + __func__); + goto error; + } + closedir(scsi_dir); + return 0; +error: + if (scsi_dir) + closedir(scsi_dir); + return -1; +} + +int set_boot_lun(char *sg_dev, uint8_t boot_lun_id) +{ + int fd = -1; + int rc; + struct ufs_ioctl_query_data *data = NULL; + size_t ioctl_data_size = sizeof(struct ufs_ioctl_query_data) + UFS_ATTR_DATA_SIZE; + + data = (struct ufs_ioctl_query_data*)malloc(ioctl_data_size); + if (!data) { + fprintf(stderr, "%s: Failed to alloc query data struct\n", + __func__); + goto error; + } + memset(data, 0, ioctl_data_size); + data->opcode = UPIU_QUERY_OPCODE_WRITE_ATTR; + data->idn = QUERY_ATTR_IDN_BOOT_LU_EN; + data->buf_size = UFS_ATTR_DATA_SIZE; + data->buffer[0] = boot_lun_id; + fd = open(sg_dev, O_RDWR); + if (fd < 0) { + fprintf(stderr, "%s: Failed to open %s(%s)\n", + __func__, + sg_dev, + strerror(errno)); + goto error; + } + rc = ioctl(fd, UFS_IOCTL_QUERY, data); + if (rc) { + fprintf(stderr, "%s: UFS query ioctl failed(%s)\n", + __func__, + strerror(errno)); + goto error; + } + close(fd); + free(data); + return 0; +error: + if (fd >= 0) + close(fd); + if (data) + free(data); + return -1; +} + +//Swtich betwieen using either the primary or the backup +//boot LUN for boot. This is required since UFS boot partitions +//cannot have a backup GPT which is what we use for failsafe +//updates of the other 'critical' partitions. This function will +//not be invoked for emmc targets and on UFS targets is only required +//to be invoked for XBL. +// +//The algorithm to do this is as follows: +//- Find the real block device(eg: /dev/block/sdb) that corresponds +// to the /dev/block/bootdevice/by-name/xbl(bak) symlink +// +//- Once we have the block device 'node' name(sdb in the above example) +// use this node to to locate the scsi generic device that represents +// it by checking the file /sys/block/sdb/device/scsi_generic/sgY +// +//- Once we locate sgY we call the query ioctl on /dev/sgy to switch +//the boot lun to either LUNA or LUNB +int gpt_utils_set_xbl_boot_partition(enum boot_chain chain) +{ + struct stat st; + ///sys/block/sdX/device/scsi_generic/ + char sg_dev_node[PATH_MAX] = {0}; + uint8_t boot_lun_id = 0; + const char *boot_dev = NULL; + + if (chain == BACKUP_BOOT) { + boot_lun_id = BOOT_LUN_B_ID; + if (!stat(XBL_BACKUP, &st)) + boot_dev = XBL_BACKUP; + else if (!stat(XBL_AB_SECONDARY, &st)) + boot_dev = XBL_AB_SECONDARY; + else { + fprintf(stderr, "%s: Failed to locate secondary xbl\n", + __func__); + goto error; + } + } else if (chain == NORMAL_BOOT) { + boot_lun_id = BOOT_LUN_A_ID; + if (!stat(XBL_PRIMARY, &st)) + boot_dev = XBL_PRIMARY; + else if (!stat(XBL_AB_PRIMARY, &st)) + boot_dev = XBL_AB_PRIMARY; + else { + fprintf(stderr, "%s: Failed to locate primary xbl\n", + __func__); + goto error; + } + } else { + fprintf(stderr, "%s: Invalid boot chain id\n", __func__); + goto error; + } + //We need either both xbl and xblbak or both xbl_a and xbl_b to exist at + //the same time. If not the current configuration is invalid. + if((stat(XBL_PRIMARY, &st) || + stat(XBL_BACKUP, &st)) && + (stat(XBL_AB_PRIMARY, &st) || + stat(XBL_AB_SECONDARY, &st))) { + fprintf(stderr, "%s:primary/secondary XBL prt not found(%s)\n", + __func__, + strerror(errno)); + goto error; + } + fprintf(stderr, "%s: setting %s lun as boot lun\n", + __func__, + boot_dev); + if (get_scsi_node_from_bootdevice(boot_dev, + sg_dev_node, + sizeof(sg_dev_node))) { + fprintf(stderr, "%s: Failed to get scsi node path for xblbak\n", + __func__); + goto error; + } + if (set_boot_lun(sg_dev_node, boot_lun_id)) { + fprintf(stderr, "%s: Failed to set xblbak as boot partition\n", + __func__); + goto error; + } + return 0; +error: + return -1; +} + +int gpt_utils_is_ufs_device() +{ + char bootdevice[PROPERTY_VALUE_MAX] = {0}; + property_get("ro.boot.bootdevice", bootdevice, "N/A"); + if (strlen(bootdevice) < strlen(".ufshc") + 1) + return 0; + return (!strncmp(&bootdevice[strlen(bootdevice) - strlen(".ufshc")], + ".ufshc", + sizeof(".ufshc"))); +} +//dev_path is the path to the block device that contains the GPT image that +//needs to be updated. This would be the device which holds one or more critical +//boot partitions and their backups. In the case of EMMC this function would +//be invoked only once on /dev/block/mmcblk1 since it holds the GPT image +//containing all the partitions For UFS devices it could potentially be +//invoked multiple times, once for each LUN containing critical image(s) and +//their backups +int prepare_partitions(enum boot_update_stage stage, const char *dev_path) +{ + int r = 0; + int fd = -1; + int is_ufs = gpt_utils_is_ufs_device(); + enum gpt_state gpt_prim, gpt_second; + enum boot_update_stage internal_stage; + struct stat xbl_partition_stat; + struct stat ufs_dir_stat; + + if (!dev_path) { + fprintf(stderr, "%s: Invalid dev_path\n", + __func__); + r = -1; + goto EXIT; + } + fd = open(dev_path, O_RDWR); + if (fd < 0) { + fprintf(stderr, "%s: Opening '%s' failed: %s\n", + __func__, + BLK_DEV_FILE, + strerror(errno)); + r = -1; + goto EXIT; + } + r = gpt_get_state(fd, PRIMARY_GPT, &gpt_prim) || + gpt_get_state(fd, SECONDARY_GPT, &gpt_second); + if (r) { + fprintf(stderr, "%s: Getting GPT headers state failed\n", + __func__); + goto EXIT; + } + + /* These 2 combinations are unexpected and unacceptable */ + if (gpt_prim == GPT_BAD_CRC || gpt_second == GPT_BAD_CRC) { + fprintf(stderr, "%s: GPT headers CRC corruption detected, aborting\n", + __func__); + r = -1; + goto EXIT; + } + if (gpt_prim == GPT_BAD_SIGNATURE && gpt_second == GPT_BAD_SIGNATURE) { + fprintf(stderr, "%s: Both GPT headers corrupted, aborting\n", + __func__); + r = -1; + goto EXIT; + } + + /* Check internal update stage according GPT headers' state */ + if (gpt_prim == GPT_OK && gpt_second == GPT_OK) + internal_stage = UPDATE_MAIN; + else if (gpt_prim == GPT_BAD_SIGNATURE) + internal_stage = UPDATE_BACKUP; + else if (gpt_second == GPT_BAD_SIGNATURE) + internal_stage = UPDATE_FINALIZE; + else { + fprintf(stderr, "%s: Abnormal GPTs state: primary (%d), secondary (%d), " + "aborting\n", __func__, gpt_prim, gpt_second); + r = -1; + goto EXIT; + } + + /* Stage already set - ready for update, exitting */ + if ((int) stage == (int) internal_stage - 1) + goto EXIT; + /* Unexpected stage given */ + if (stage != internal_stage) { + r = -1; + goto EXIT; + } + + switch (stage) { + case UPDATE_MAIN: + if (is_ufs) { + if(stat(XBL_PRIMARY, &xbl_partition_stat)|| + stat(XBL_BACKUP, &xbl_partition_stat)){ + //Non fatal error. Just means this target does not + //use XBL but relies on sbl whose update is handled + //by the normal methods. + fprintf(stderr, "%s: xbl part not found(%s).Assuming sbl in use\n", + __func__, + strerror(errno)); + } else { + //Switch the boot lun so that backup boot LUN is used + r = gpt_utils_set_xbl_boot_partition(BACKUP_BOOT); + if(r){ + fprintf(stderr, "%s: Failed to set xbl backup partition as boot\n", + __func__); + goto EXIT; + } + } + } + //Fix up the backup GPT table so that it actually points to + //the backup copy of the boot critical images + fprintf(stderr, "%s: Preparing for primary partition update\n", + __func__); + r = gpt2_set_boot_chain(fd, BACKUP_BOOT); + if (r) { + if (r < 0) + fprintf(stderr, + "%s: Setting secondary GPT to backup boot failed\n", + __func__); + /* No backup partitions - do not corrupt GPT, do not flag error */ + else + r = 0; + goto EXIT; + } + //corrupt the primary GPT so that the backup(which now points to + //the backup boot partitions is used) + r = gpt_set_state(fd, PRIMARY_GPT, GPT_BAD_SIGNATURE); + if (r) { + fprintf(stderr, "%s: Corrupting primary GPT header failed\n", + __func__); + goto EXIT; + } + break; + case UPDATE_BACKUP: + if (is_ufs) { + if(stat(XBL_PRIMARY, &xbl_partition_stat)|| + stat(XBL_BACKUP, &xbl_partition_stat)){ + //Non fatal error. Just means this target does not + //use XBL but relies on sbl whose update is handled + //by the normal methods. + fprintf(stderr, "%s: xbl part not found(%s).Assuming sbl in use\n", + __func__, + strerror(errno)); + } else { + //Switch the boot lun so that backup boot LUN is used + r = gpt_utils_set_xbl_boot_partition(NORMAL_BOOT); + if(r) { + fprintf(stderr, "%s: Failed to set xbl backup partition as boot\n", + __func__); + goto EXIT; + } + } + } + //Fix the primary GPT header so that is used + fprintf(stderr, "%s: Preparing for backup partition update\n", + __func__); + r = gpt_set_state(fd, PRIMARY_GPT, GPT_OK); + if (r) { + fprintf(stderr, "%s: Fixing primary GPT header failed\n", + __func__); + goto EXIT; + } + //Corrupt the scondary GPT header + r = gpt_set_state(fd, SECONDARY_GPT, GPT_BAD_SIGNATURE); + if (r) { + fprintf(stderr, "%s: Corrupting secondary GPT header failed\n", + __func__); + goto EXIT; + } + break; + case UPDATE_FINALIZE: + //Undo the changes we had made in the UPDATE_MAIN stage so that the + //primary/backup GPT headers once again point to the same set of + //partitions + fprintf(stderr, "%s: Finalizing partitions\n", + __func__); + r = gpt2_set_boot_chain(fd, NORMAL_BOOT); + if (r < 0) { + fprintf(stderr, "%s: Setting secondary GPT to normal boot failed\n", + __func__); + goto EXIT; + } + + r = gpt_set_state(fd, SECONDARY_GPT, GPT_OK); + if (r) { + fprintf(stderr, "%s: Fixing secondary GPT header failed\n", + __func__); + goto EXIT; + } + break; + default:; + } + +EXIT: + if (fd >= 0) { + fsync(fd); + close(fd); + } + return r; +} + +int add_lun_to_update_list(char *lun_path, struct update_data *dat) +{ + uint32_t i = 0; + struct stat st; + if (!lun_path || !dat){ + fprintf(stderr, "%s: Invalid data", + __func__); + return -1; + } + if (stat(lun_path, &st)) { + fprintf(stderr, "%s: Unable to access %s. Skipping adding to list", + __func__, + lun_path); + return -1; + } + if (dat->num_valid_entries == 0) { + fprintf(stderr, "%s: Copying %s into lun_list[%d]\n", + __func__, + lun_path, + i); + strlcpy(dat->lun_list[0], lun_path, + PATH_MAX * sizeof(char)); + dat->num_valid_entries = 1; + } else { + for (i = 0; (i < dat->num_valid_entries) && + (dat->num_valid_entries < MAX_LUNS - 1); i++) { + //Check if the current LUN is not already part + //of the lun list + if (!strncmp(lun_path,dat->lun_list[i], + strlen(dat->lun_list[i]))) { + //LUN already in list..Return + return 0; + } + } + fprintf(stderr, "%s: Copying %s into lun_list[%d]\n", + __func__, + lun_path, + dat->num_valid_entries); + //Add LUN path lun list + strlcpy(dat->lun_list[dat->num_valid_entries], lun_path, + PATH_MAX * sizeof(char)); + dat->num_valid_entries++; + } + return 0; +} + +int prepare_boot_update(enum boot_update_stage stage) +{ + int r, fd; + int is_ufs = gpt_utils_is_ufs_device(); + struct stat ufs_dir_stat; + struct update_data data; + int rcode = 0; + uint32_t i = 0; + int is_error = 0; + const char ptn_swap_list[][MAX_GPT_NAME_SIZE] = { PTN_SWAP_LIST }; + //Holds /dev/block/bootdevice/by-name/*bak entry + char buf[PATH_MAX] = {0}; + //Holds the resolved path of the symlink stored in buf + char real_path[PATH_MAX] = {0}; + + if (!is_ufs) { + //emmc device. Just pass in path to mmcblk0 + return prepare_partitions(stage, BLK_DEV_FILE); + } else { + //Now we need to find the list of LUNs over + //which the boot critical images are spread + //and set them up for failsafe updates.To do + //this we find out where the symlinks for the + //each of the paths under + ///dev/block/bootdevice/by-name/PTN_SWAP_LIST + //actually point to. + fprintf(stderr, "%s: Running on a UFS device\n", + __func__); + memset(&data, '\0', sizeof(struct update_data)); + for (i=0; i < ARRAY_SIZE(ptn_swap_list); i++) { + //XBL on UFS does not follow the convention + //of being loaded based on well known GUID'S. + //We take care of switching the UFS boot LUN + //explicitly later on. + if (!strncmp(ptn_swap_list[i], + PTN_XBL, + strlen(PTN_XBL))) + continue; + snprintf(buf, sizeof(buf), + "%s/%sbak", + BOOT_DEV_DIR, + ptn_swap_list[i]); + if (stat(buf, &ufs_dir_stat)) { + continue; + } + if (readlink(buf, real_path, sizeof(real_path) - 1) < 0) + { + fprintf(stderr, "%s: readlink error. Skipping %s", + __func__, + strerror(errno)); + } else { + if(strlen(real_path) < PATH_TRUNCATE_LOC + 1){ + fprintf(stderr, "Unknown path.Skipping :%s:\n", + real_path); + } else { + real_path[PATH_TRUNCATE_LOC] = '\0'; + add_lun_to_update_list(real_path, &data); + } + } + memset(buf, '\0', sizeof(buf)); + memset(real_path, '\0', sizeof(real_path)); + } + for (i=0; i < data.num_valid_entries; i++) { + fprintf(stderr, "%s: Preparing %s for update stage %d\n", + __func__, + data.lun_list[i], + stage); + rcode = prepare_partitions(stage, data.lun_list[i]); + if (rcode != 0) + { + fprintf(stderr, "%s: Failed to prepare %s.Continuing..\n", + __func__, + data.lun_list[i]); + is_error = 1; + } + } + } + if (is_error) + return -1; + return 0; +} + +//Given a parttion name(eg: rpm) get the path to the block device that +//represents the GPT disk the partition resides on. In the case of emmc it +//would be the default emmc dev(/dev/block/mmcblk0). In the case of UFS we look +//through the /dev/block/bootdevice/by-name/ tree for partname, and resolve +//the path to the LUN from there. +static int get_dev_path_from_partition_name(const char *partname, + char *buf, + size_t buflen) +{ + struct stat st; + char path[PATH_MAX] = {0}; + if (!partname || !buf || buflen < ((PATH_TRUNCATE_LOC) + 1)) { + ALOGE("%s: Invalid argument", __func__); + goto error; + } + if (gpt_utils_is_ufs_device()) { + //Need to find the lun that holds partition partname + snprintf(path, sizeof(path), + "%s/%s", + BOOT_DEV_DIR, + partname); + if (stat(path, &st)) { + goto error; + } + if (readlink(path, buf, buflen) < 0) + { + goto error; + } else { + buf[PATH_TRUNCATE_LOC] = '\0'; + } + } else { + snprintf(buf, buflen, "/dev/block/mmcblk0"); + } + return 0; + +error: + return -1; +} + +int gpt_utils_get_partition_map(vector& ptn_list, + map>& partition_map) { + char devpath[PATH_MAX] = {'\0'}; + map>::iterator it; + if (ptn_list.size() < 1) { + fprintf(stderr, "%s: Invalid ptn list\n", __func__); + return -1; + } + //Go through the passed in list + for (uint32_t i = 0; i < ptn_list.size(); i++) + { + //Key in the map is the path to the device that holds the + //partition + if (get_dev_path_from_partition_name(ptn_list[i].c_str(), + devpath, + sizeof(devpath))) { + //Not necessarily an error. The partition may just + //not be present. + continue; + } + string path = devpath; + it = partition_map.find(path); + if (it != partition_map.end()) { + it->second.push_back(ptn_list[i]); + } else { + vector str_vec; + str_vec.push_back( ptn_list[i]); + partition_map.insert(pair> + (path, str_vec)); + } + memset(devpath, '\0', sizeof(devpath)); + } + return 0; +} + +//Get the block size of the disk represented by decsriptor fd +static uint32_t gpt_get_block_size(int fd) +{ + uint32_t block_size = 0; + if (fd < 0) { + ALOGE("%s: invalid descriptor", + __func__); + goto error; + } + if (ioctl(fd, BLKSSZGET, &block_size) != 0) { + ALOGE("%s: Failed to get GPT dev block size : %s", + __func__, + strerror(errno)); + goto error; + } + return block_size; +error: + return 0; +} + +//Write the GPT header present in the passed in buffer back to the +//disk represented by fd +static int gpt_set_header(uint8_t *gpt_header, int fd, + enum gpt_instance instance) +{ + uint32_t block_size = 0; + off_t gpt_header_offset = 0; + if (!gpt_header || fd < 0) { + ALOGE("%s: Invalid arguments", + __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + ALOGI("%s: Block size is : %d", __func__, block_size); + if (block_size == 0) { + ALOGE("%s: Failed to get block size", __func__); + goto error; + } + if (instance == PRIMARY_GPT) + gpt_header_offset = block_size; + else + gpt_header_offset = lseek64(fd, 0, SEEK_END) - block_size; + if (gpt_header_offset <= 0) { + ALOGE("%s: Failed to get gpt header offset",__func__); + goto error; + } + ALOGI("%s: Writing back header to offset %ld", __func__, + gpt_header_offset); + if (blk_rw(fd, 1, gpt_header_offset, gpt_header, block_size)) { + ALOGE("%s: Failed to write back GPT header", __func__); + goto error; + } + return 0; +error: + return -1; +} + +//Read out the GPT header for the disk that contains the partition partname +static uint8_t* gpt_get_header(const char *partname, enum gpt_instance instance) +{ + uint8_t* hdr = NULL; + char devpath[PATH_MAX] = {0}; + int64_t hdr_offset = 0; + uint32_t block_size = 0; + int fd = -1; + if (!partname) { + ALOGE("%s: Invalid partition name", __func__); + goto error; + } + if (get_dev_path_from_partition_name(partname, devpath, sizeof(devpath)) + != 0) { + ALOGE("%s: Failed to resolve path for %s", + __func__, + partname); + goto error; + } + fd = open(devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s : %s", + __func__, + devpath, + strerror(errno)); + goto error; + } + block_size = gpt_get_block_size(fd); + if (block_size == 0) + { + ALOGE("%s: Failed to get gpt block size for %s", + __func__, + partname); + goto error; + } + + hdr = (uint8_t*)malloc(block_size); + if (!hdr) { + ALOGE("%s: Failed to allocate memory for gpt header", + __func__); + } + if (instance == PRIMARY_GPT) + hdr_offset = block_size; + else { + hdr_offset = lseek64(fd, 0, SEEK_END) - block_size; + } + if (hdr_offset < 0) { + ALOGE("%s: Failed to get gpt header offset", + __func__); + goto error; + } + if (blk_rw(fd, 0, hdr_offset, hdr, block_size)) { + ALOGE("%s: Failed to read GPT header from device", + __func__); + goto error; + } + close(fd); + return hdr; +error: + if (fd >= 0) + close(fd); + if (hdr) + free(hdr); + return NULL; +} + +//Returns the partition entry array based on the +//passed in buffer which contains the gpt header. +//The fd here is the descriptor for the 'disk' which +//holds the partition +static uint8_t* gpt_get_pentry_arr(uint8_t *hdr, int fd) +{ + uint64_t pentries_start = 0; + uint32_t pentry_size = 0; + uint32_t block_size = 0; + uint32_t pentries_arr_size = 0; + uint8_t *pentry_arr = NULL; + int rc = 0; + if (!hdr) { + ALOGE("%s: Invalid header", __func__); + goto error; + } + if (fd < 0) { + ALOGE("%s: Invalid fd", __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + if (!block_size) { + ALOGE("%s: Failed to get gpt block size for", + __func__); + goto error; + } + pentries_start = GET_8_BYTES(hdr + PENTRIES_OFFSET) * block_size; + pentry_size = GET_4_BYTES(hdr + PENTRY_SIZE_OFFSET); + pentries_arr_size = + GET_4_BYTES(hdr + PARTITION_COUNT_OFFSET) * pentry_size; + pentry_arr = (uint8_t*)calloc(1, pentries_arr_size); + if (!pentry_arr) { + ALOGE("%s: Failed to allocate memory for partition array", + __func__); + goto error; + } + rc = blk_rw(fd, 0, + pentries_start, + pentry_arr, + pentries_arr_size); + if (rc) { + ALOGE("%s: Failed to read partition entry array", + __func__); + goto error; + } + return pentry_arr; +error: + if (pentry_arr) + free(pentry_arr); + return NULL; +} + +static int gpt_set_pentry_arr(uint8_t *hdr, int fd, uint8_t* arr) +{ + uint32_t block_size = 0; + uint64_t pentries_start = 0; + uint32_t pentry_size = 0; + uint32_t pentries_arr_size = 0; + int rc = 0; + if (!hdr || fd < 0 || !arr) { + ALOGE("%s: Invalid argument", __func__); + goto error; + } + block_size = gpt_get_block_size(fd); + if (!block_size) { + ALOGE("%s: Failed to get gpt block size for", + __func__); + goto error; + } + ALOGI("%s : Block size is %d", __func__, block_size); + pentries_start = GET_8_BYTES(hdr + PENTRIES_OFFSET) * block_size; + pentry_size = GET_4_BYTES(hdr + PENTRY_SIZE_OFFSET); + pentries_arr_size = + GET_4_BYTES(hdr + PARTITION_COUNT_OFFSET) * pentry_size; + ALOGI("%s: Writing partition entry array of size %d to offset %" PRIu64, + __func__, + pentries_arr_size, + pentries_start); + rc = blk_rw(fd, 1, + pentries_start, + arr, + pentries_arr_size); + if (rc) { + ALOGE("%s: Failed to read partition entry array", + __func__); + goto error; + } + return 0; +error: + return -1; +} + + + +//Allocate a handle used by calls to the "gpt_disk" api's +struct gpt_disk * gpt_disk_alloc() +{ + struct gpt_disk *disk; + disk = (struct gpt_disk *)malloc(sizeof(struct gpt_disk)); + if (!disk) { + ALOGE("%s: Failed to allocate memory", __func__); + goto end; + } + memset(disk, 0, sizeof(struct gpt_disk)); +end: + return disk; +} + +//Free previously allocated/initialized handle +void gpt_disk_free(struct gpt_disk *disk) +{ + if (!disk) + return; + if (disk->hdr) + free(disk->hdr); + if (disk->hdr_bak) + free(disk->hdr_bak); + if (disk->pentry_arr) + free(disk->pentry_arr); + if (disk->pentry_arr_bak) + free(disk->pentry_arr_bak); + free(disk); + return; +} + +//fills up the passed in gpt_disk struct with information about the +//disk represented by path dev. Returns 0 on success and -1 on error. +int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *dsk) +{ + struct gpt_disk *disk = NULL; + int fd = -1; + uint32_t gpt_header_size = 0; + + if (!dsk || !dev) { + ALOGE("%s: Invalid arguments", __func__); + goto error; + } + disk = dsk; + disk->hdr = gpt_get_header(dev, PRIMARY_GPT); + if (!disk->hdr) { + ALOGE("%s: Failed to get primary header", __func__); + goto error; + } + gpt_header_size = GET_4_BYTES(disk->hdr + HEADER_SIZE_OFFSET); + disk->hdr_crc = crc32(0, disk->hdr, gpt_header_size); + disk->hdr_bak = gpt_get_header(dev, PRIMARY_GPT); + if (!disk->hdr_bak) { + ALOGE("%s: Failed to get backup header", __func__); + goto error; + } + disk->hdr_bak_crc = crc32(0, disk->hdr_bak, gpt_header_size); + + //Descriptor for the block device. We will use this for further + //modifications to the partition table + if (get_dev_path_from_partition_name(dev, + disk->devpath, + sizeof(disk->devpath)) != 0) { + ALOGE("%s: Failed to resolve path for %s", + __func__, + dev); + goto error; + } + fd = open(disk->devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s: %s", + __func__, + disk->devpath, + strerror(errno)); + goto error; + } + disk->pentry_arr = gpt_get_pentry_arr(disk->hdr, fd); + if (!disk->pentry_arr) { + ALOGE("%s: Failed to obtain partition entry array", + __func__); + goto error; + } + disk->pentry_arr_bak = gpt_get_pentry_arr(disk->hdr_bak, fd); + if (!disk->pentry_arr_bak) { + ALOGE("%s: Failed to obtain backup partition entry array", + __func__); + goto error; + } + disk->pentry_size = GET_4_BYTES(disk->hdr + PENTRY_SIZE_OFFSET); + disk->pentry_arr_size = + GET_4_BYTES(disk->hdr + PARTITION_COUNT_OFFSET) * + disk->pentry_size; + disk->pentry_arr_crc = GET_4_BYTES(disk->hdr + PARTITION_CRC_OFFSET); + disk->pentry_arr_bak_crc = GET_4_BYTES(disk->hdr_bak + + PARTITION_CRC_OFFSET); + disk->block_size = gpt_get_block_size(fd); + close(fd); + disk->is_initialized = GPT_DISK_INIT_MAGIC; + return 0; +error: + if (fd >= 0) + close(fd); + return -1; +} + +//Get pointer to partition entry from a allocated gpt_disk structure +uint8_t* gpt_disk_get_pentry(struct gpt_disk *disk, + const char *partname, + enum gpt_instance instance) +{ + uint8_t *ptn_arr = NULL; + if (!disk || !partname || disk->is_initialized != GPT_DISK_INIT_MAGIC) { + ALOGE("%s: Invalid argument",__func__); + goto error; + } + ptn_arr = (instance == PRIMARY_GPT) ? + disk->pentry_arr : disk->pentry_arr_bak; + return (gpt_pentry_seek(partname, ptn_arr, + ptn_arr + disk->pentry_arr_size , + disk->pentry_size)); +error: + return NULL; +} + +//Update CRC values for the various components of the gpt_disk +//structure. This function should be called after any of the fields +//have been updated before the structure contents are written back to +//disk. +int gpt_disk_update_crc(struct gpt_disk *disk) +{ + uint32_t gpt_header_size = 0; + if (!disk || (disk->is_initialized != GPT_DISK_INIT_MAGIC)) { + ALOGE("%s: invalid argument", __func__); + goto error; + } + //Recalculate the CRC of the primary partiton array + disk->pentry_arr_crc = crc32(0, + disk->pentry_arr, + disk->pentry_arr_size); + //Recalculate the CRC of the backup partition array + disk->pentry_arr_bak_crc = crc32(0, + disk->pentry_arr_bak, + disk->pentry_arr_size); + //Update the partition CRC value in the primary GPT header + PUT_4_BYTES(disk->hdr + PARTITION_CRC_OFFSET, disk->pentry_arr_crc); + //Update the partition CRC value in the backup GPT header + PUT_4_BYTES(disk->hdr_bak + PARTITION_CRC_OFFSET, + disk->pentry_arr_bak_crc); + //Update the CRC value of the primary header + gpt_header_size = GET_4_BYTES(disk->hdr + HEADER_SIZE_OFFSET); + //Header CRC is calculated with its own CRC field set to 0 + PUT_4_BYTES(disk->hdr + HEADER_CRC_OFFSET, 0); + PUT_4_BYTES(disk->hdr_bak + HEADER_CRC_OFFSET, 0); + disk->hdr_crc = crc32(0, disk->hdr, gpt_header_size); + disk->hdr_bak_crc = crc32(0, disk->hdr_bak, gpt_header_size); + PUT_4_BYTES(disk->hdr + HEADER_CRC_OFFSET, disk->hdr_crc); + PUT_4_BYTES(disk->hdr_bak + HEADER_CRC_OFFSET, disk->hdr_bak_crc); + return 0; +error: + return -1; +} + +//Write the contents of struct gpt_disk back to the actual disk +int gpt_disk_commit(struct gpt_disk *disk) +{ + int fd = -1; + if (!disk || (disk->is_initialized != GPT_DISK_INIT_MAGIC)){ + ALOGE("%s: Invalid args", __func__); + goto error; + } + fd = open(disk->devpath, O_RDWR); + if (fd < 0) { + ALOGE("%s: Failed to open %s: %s", + __func__, + disk->devpath, + strerror(errno)); + goto error; + } + ALOGI("%s: Writing back primary GPT header", __func__); + //Write the primary header + if(gpt_set_header(disk->hdr, fd, PRIMARY_GPT) != 0) { + ALOGE("%s: Failed to update primary GPT header", + __func__); + goto error; + } + ALOGI("%s: Writing back primary partition array", __func__); + //Write back the primary partition array + if (gpt_set_pentry_arr(disk->hdr, fd, disk->pentry_arr)) { + ALOGE("%s: Failed to write primary GPT partition arr", + __func__); + goto error; + } + close(fd); + return 0; +error: + if (fd >= 0) + close(fd); + return -1; +} diff --git a/gpt-utils/gpt-utils.h b/gpt-utils/gpt-utils.h new file mode 100644 index 0000000..da473be --- /dev/null +++ b/gpt-utils/gpt-utils.h @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __GPT_UTILS_H__ +#define __GPT_UTILS_H__ +#include +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +#include +#include +/****************************************************************************** + * GPT HEADER DEFINES + ******************************************************************************/ +#define GPT_SIGNATURE "EFI PART" +#define HEADER_SIZE_OFFSET 12 +#define HEADER_CRC_OFFSET 16 +#define PRIMARY_HEADER_OFFSET 24 +#define BACKUP_HEADER_OFFSET 32 +#define FIRST_USABLE_LBA_OFFSET 40 +#define LAST_USABLE_LBA_OFFSET 48 +#define PENTRIES_OFFSET 72 +#define PARTITION_COUNT_OFFSET 80 +#define PENTRY_SIZE_OFFSET 84 +#define PARTITION_CRC_OFFSET 88 + +#define TYPE_GUID_OFFSET 0 +#define TYPE_GUID_SIZE 16 +#define PTN_ENTRY_SIZE 128 +#define UNIQUE_GUID_OFFSET 16 +#define FIRST_LBA_OFFSET 32 +#define LAST_LBA_OFFSET 40 +#define ATTRIBUTE_FLAG_OFFSET 48 +#define PARTITION_NAME_OFFSET 56 +#define MAX_GPT_NAME_SIZE 72 + +/****************************************************************************** + * AB RELATED DEFINES + ******************************************************************************/ +//Bit 48 onwords in the attribute field are the ones where we are allowed to +//store our AB attributes. +#define AB_FLAG_OFFSET (ATTRIBUTE_FLAG_OFFSET + 6) +#define GPT_DISK_INIT_MAGIC 0xABCD +#define AB_PARTITION_ATTR_SLOT_ACTIVE (0x1<<2) +#define AB_PARTITION_ATTR_BOOT_SUCCESSFUL (0x1<<6) +#define AB_PARTITION_ATTR_UNBOOTABLE (0x1<<7) +#define AB_SLOT_ACTIVE_VAL 0x3F +#define AB_SLOT_INACTIVE_VAL 0x0 +#define AB_SLOT_ACTIVE 1 +#define AB_SLOT_INACTIVE 0 +#define AB_SLOT_A_SUFFIX "_a" +#define AB_SLOT_B_SUFFIX "_b" +#define PTN_XBL "xbl" +#define PTN_SWAP_LIST PTN_XBL, \ + "abl", "aop", "devcfg", \ + "dtbo", "hyp", "keymaster", "qupfw", "storsec", \ + "tz", "vbmeta", "vbmeta_system", "xbl_config" + +#define AB_PTN_LIST PTN_SWAP_LIST, "boot", "system", "vendor", "modem", "product" +#define BOOT_DEV_DIR "/dev/block/bootdevice/by-name" + +/****************************************************************************** + * HELPER MACROS + ******************************************************************************/ +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +/****************************************************************************** + * TYPES + ******************************************************************************/ +enum boot_update_stage { + UPDATE_MAIN = 1, + UPDATE_BACKUP, + UPDATE_FINALIZE +}; + +enum gpt_instance { + PRIMARY_GPT = 0, + SECONDARY_GPT +}; + +enum boot_chain { + NORMAL_BOOT = 0, + BACKUP_BOOT +}; + +struct gpt_disk { + //GPT primary header + uint8_t *hdr; + //primary header crc + uint32_t hdr_crc; + //GPT backup header + uint8_t *hdr_bak; + //backup header crc + uint32_t hdr_bak_crc; + //Partition entries array + uint8_t *pentry_arr; + //Partition entries array for backup table + uint8_t *pentry_arr_bak; + //Size of the pentry array + uint32_t pentry_arr_size; + //Size of each element in the pentry array + uint32_t pentry_size; + //CRC of the partition entry array + uint32_t pentry_arr_crc; + //CRC of the backup partition entry array + uint32_t pentry_arr_bak_crc; + //Path to block dev representing the disk + char devpath[PATH_MAX]; + //Block size of disk + uint32_t block_size; + uint32_t is_initialized; +}; + +/****************************************************************************** + * FUNCTION PROTOTYPES + ******************************************************************************/ +int prepare_boot_update(enum boot_update_stage stage); +//GPT disk methods +struct gpt_disk* gpt_disk_alloc(); +//Free previously allocated gpt_disk struct +void gpt_disk_free(struct gpt_disk *disk); +//Get the details of the disk holding the partition whose name +//is passed in via dev +int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *disk); + +//Get pointer to partition entry from a allocated gpt_disk structure +uint8_t* gpt_disk_get_pentry(struct gpt_disk *disk, + const char *partname, + enum gpt_instance instance); + +//Update the crc fields of the modified disk structure +int gpt_disk_update_crc(struct gpt_disk *disk); + +//Write the contents of struct gpt_disk back to the actual disk +int gpt_disk_commit(struct gpt_disk *disk); + +//Return if the current device is UFS based or not +int gpt_utils_is_ufs_device(); + +//Swtich betwieen using either the primary or the backup +//boot LUN for boot. This is required since UFS boot partitions +//cannot have a backup GPT which is what we use for failsafe +//updates of the other 'critical' partitions. This function will +//not be invoked for emmc targets and on UFS targets is only required +//to be invoked for XBL. +// +//The algorithm to do this is as follows: +//- Find the real block device(eg: /dev/block/sdb) that corresponds +// to the /dev/block/bootdevice/by-name/xbl(bak) symlink +// +//- Once we have the block device 'node' name(sdb in the above example) +// use this node to to locate the scsi generic device that represents +// it by checking the file /sys/block/sdb/device/scsi_generic/sgY +// +//- Once we locate sgY we call the query ioctl on /dev/sgy to switch +//the boot lun to either LUNA or LUNB +int gpt_utils_set_xbl_boot_partition(enum boot_chain chain); + +//Given a vector of partition names as a input and a reference to a map, +//populate the map to indicate which physical disk each of the partitions +//sits on. The key in the map is the path to the block device where the +//partition lies and the value is a vector of strings indicating which of +//the passed in partition names sits on that device. +int gpt_utils_get_partition_map(std::vector& partition_list, + std::map>& partition_map); +#ifdef __cplusplus +} +#endif +#endif /* __GPT_UTILS_H__ */ diff --git a/health/Android.bp b/health/Android.bp new file mode 100644 index 0000000..4c2cb19 --- /dev/null +++ b/health/Android.bp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +cc_binary { + name: "android.hardware.health@2.0-service.redfin", + init_rc: ["android.hardware.health@2.0-service.redfin.rc"], + proprietary: true, + relative_install_path: "hw", + srcs: [ + "HealthService.cpp", + ], + + cflags: [ + "-Wall", + "-Werror", + ], + + static_libs: [ + "android.hardware.health@2.0-impl", + "android.hardware.health@1.0-convert", + "libhealthservice", + "libbatterymonitor", + ], + + shared_libs: [ + "libbase", + "libcutils", + "libhidlbase", + "libhidltransport", + "libhwbinder", + "libpixelhealth", + "libutils", + "android.hardware.health@2.0", + ], + + header_libs: ["libhealthd_headers"], + + overrides: [ + "healthd", + ], +} diff --git a/health/HealthService.cpp b/health/HealthService.cpp new file mode 100644 index 0000000..605d3d9 --- /dev/null +++ b/health/HealthService.cpp @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define LOG_TAG "android.hardware.health@2.0-service.redfin" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace { + +using android::hardware::health::V2_0::DiskStats; +using android::hardware::health::V2_0::StorageAttribute; +using android::hardware::health::V2_0::StorageInfo; +using hardware::google::pixel::health::BatteryMetricsLogger; +using hardware::google::pixel::health::CycleCountBackupRestore; +using hardware::google::pixel::health::DeviceHealth; +using hardware::google::pixel::health::LowBatteryShutdownMetrics; + +#define FG_DIR "/sys/class/power_supply/maxfg" +constexpr char kBatteryResistance[] {FG_DIR "/resistance"}; +constexpr char kBatteryOCV[] {FG_DIR "/voltage_ocv"}; +constexpr char kVoltageAvg[] {FG_DIR "/voltage_avg"}; +constexpr char kCycleCountsBins[] {FG_DIR "/cycle_counts_bins"}; +constexpr char kGaugeSerial[] {FG_DIR "/serial_number"}; + +static BatteryMetricsLogger battMetricsLogger(kBatteryResistance, kBatteryOCV); +static LowBatteryShutdownMetrics shutdownMetrics(kVoltageAvg); +static CycleCountBackupRestore ccBackupRestoreMAX( + 10, kCycleCountsBins, "/persist/battery/max_cycle_counts_bins", kGaugeSerial); +static DeviceHealth deviceHealth; + +#define UFS_DIR "/sys/devices/platform/soc/1d84000.ufshc" +constexpr char kUfsHealthEol[]{UFS_DIR "/health/eol"}; +constexpr char kUfsHealthLifetimeA[]{UFS_DIR "/health/lifetimeA"}; +constexpr char kUfsHealthLifetimeB[]{UFS_DIR "/health/lifetimeB"}; +constexpr char kUfsVersion[]{UFS_DIR "/version"}; +constexpr char kDiskStatsFile[]{"/sys/block/sda/stat"}; +constexpr char kUFSName[]{"UFS0"}; + +constexpr char kTCPMPSYName[]{"tcpm-source-psy-usbpd0"}; + +std::ifstream assert_open(const std::string &path) { + std::ifstream stream(path); + if (!stream.is_open()) { + LOG(FATAL) << "Cannot read " << path; + } + return stream; +} + +template +void read_value_from_file(const std::string &path, T *field) { + auto stream = assert_open(path); + stream.unsetf(std::ios_base::basefield); + stream >> *field; +} + +void read_ufs_version(StorageInfo *info) { + uint64_t value; + read_value_from_file(kUfsVersion, &value); + std::stringstream ss; + ss << "ufs " << std::hex << value; + info->version = ss.str(); +} + +void fill_ufs_storage_attribute(StorageAttribute *attr) { + attr->isInternal = true; + attr->isBootDevice = true; + attr->name = kUFSName; +} + +} // anonymous namespace + +void healthd_board_init(struct healthd_config *hc) { + hc->ignorePowerSupplyNames.push_back(android::String8(kTCPMPSYName)); + ccBackupRestoreMAX.Restore(); +} + +int healthd_board_battery_update(struct android::BatteryProperties *props) { + deviceHealth.update(props); + battMetricsLogger.logBatteryProperties(props); + shutdownMetrics.logShutdownVoltage(props); + ccBackupRestoreMAX.Backup(props->batteryLevel); + return 0; +} + +void get_storage_info(std::vector &vec_storage_info) { + vec_storage_info.resize(1); + StorageInfo *storage_info = &vec_storage_info[0]; + fill_ufs_storage_attribute(&storage_info->attr); + + read_ufs_version(storage_info); + read_value_from_file(kUfsHealthEol, &storage_info->eol); + read_value_from_file(kUfsHealthLifetimeA, &storage_info->lifetimeA); + read_value_from_file(kUfsHealthLifetimeB, &storage_info->lifetimeB); + return; +} + +void get_disk_stats(std::vector &vec_stats) { + vec_stats.resize(1); + DiskStats *stats = &vec_stats[0]; + fill_ufs_storage_attribute(&stats->attr); + + auto stream = assert_open(kDiskStatsFile); + // Regular diskstats entries + stream >> stats->reads >> stats->readMerges >> stats->readSectors >> + stats->readTicks >> stats->writes >> stats->writeMerges >> + stats->writeSectors >> stats->writeTicks >> stats->ioInFlight >> + stats->ioTicks >> stats->ioInQueue; + return; +} + +int main(void) { return health_service_main(); } diff --git a/health/android.hardware.health@2.0-service.redfin.rc b/health/android.hardware.health@2.0-service.redfin.rc new file mode 100644 index 0000000..ae82091 --- /dev/null +++ b/health/android.hardware.health@2.0-service.redfin.rc @@ -0,0 +1,5 @@ +service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.redfin + class hal + user system + group system + file /dev/kmsg w diff --git a/hidl/android.hidl.base@1.0.so-32 b/hidl/android.hidl.base@1.0.so-32 new file mode 100755 index 0000000000000000000000000000000000000000..b8c51c8a3cb170e083fbd76e7ee1e289fb592539 GIT binary patch literal 84880 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 literal 0 HcmV?d00001 diff --git a/hidl/android.hidl.base@1.0.so-64 b/hidl/android.hidl.base@1.0.so-64 new file mode 100755 index 0000000000000000000000000000000000000000..a3c76e7be437ba444920ffc10ae79d6a5256449a GIT binary patch literal 98936 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 I2DOX@6fbSkcZ-eDJ}%{#N2`#O|*#g*WDLh&wm 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 TSu;5LoJOfHm%WLyjsO1uR<=6@ literal 0 HcmV?d00001 diff --git a/init.hardware.chamber.rc.userdebug b/init.hardware.chamber.rc.userdebug new file mode 100644 index 0000000..ebfb336 --- /dev/null +++ b/init.hardware.chamber.rc.userdebug @@ -0,0 +1,26 @@ +# +# Copyright (C) 2018 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. +# + +on property:init.svc.vendor.thermal-engine=running && property:persist.vendor.disable.thermal.control=1 + stop vendor.thermal-engine + +on property:persist.vendor.disable.thermal.control=1 + write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/emul_temp 25000 + write /sys/devices/virtual/thermal/tz-by-name/usbc-therm/emul_temp 25000 + write /sys/module/overheat_mitigation/parameters/enable 0 + +on property:persist.vendor.disable.usb.overheat.mitigation=1 + write /sys/devices/virtual/thermal/tz-by-name/usbc-therm/emul_temp 25000 diff --git a/init.hardware.diag.rc.user b/init.hardware.diag.rc.user new file mode 100644 index 0000000..2f1a417 --- /dev/null +++ b/init.hardware.diag.rc.user @@ -0,0 +1,19 @@ +# +# Copyright (C) 2018 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. +# + +on property:ro.boot.mode=normal + rm /dev/diag + rm /dev/diagtest diff --git a/init.hardware.diag.rc.userdebug b/init.hardware.diag.rc.userdebug new file mode 100644 index 0000000..43661e7 --- /dev/null +++ b/init.hardware.diag.rc.userdebug @@ -0,0 +1,110 @@ +# +# Copyright (C) 2018 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. +# + +on init + chmod 666 /dev/diag + +on post-fs-data + # Modem logging collection + mkdir /data/vendor/radio 0777 radio radio + mkdir /data/vendor/radio/diag_logs 0777 system system + rm /data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl + # WLAN logging collection + mkdir /data/vendor/wifi 0777 system system + mkdir /data/vendor/wifi/cnss_diag 0777 system system + +service diag_mdlog_start /vendor/bin/diag_mdlog + class late_start + user shell + group system diag media_rw + disabled + oneshot + +service diag_mdlog_stop /vendor/bin/diag_mdlog -k + class late_start + user shell + group system diag media_rw + disabled + oneshot + +on boot && property:persist.vendor.sys.modem.diag.mdlog=* + rm /data/vendor/radio/diag_logs/diag_mdlog_pid + setprop vendor.sys.modem.diag.mdlog ${persist.vendor.sys.modem.diag.mdlog} + +on property:vendor.sys.modem.diag.mdlog=true + start diag_mdlog_start + +on property:vendor.sys.modem.diag.mdlog=false + start diag_mdlog_stop + +on property:persist.vendor.sys.cnss.diag_qxdm=true + start vendor.cnss_diag + +on property:persist.vendor.sys.cnss.diag_qxdm=false + stop vendor.cnss_diag + +on property:persist.vendor.sys.cnss.diag_txt=true + start vendor.cnss_diag_txt + +on property:persist.vendor.sys.cnss.diag_txt=false + stop vendor.cnss_diag_txt + +service vendor.cnss_diag /vendor/bin/cnss_diag -q -u -w + class late_start + user system + group system + disabled + oneshot + +service vendor.cnss_diag_txt /vendor/bin/cnss_diag -s -f -P -m /data/vendor/wifi/cnss_diag/cnss_diag.conf -t HELIUM + class late_start + user system + group system + disabled + oneshot + +on property:vendor.debug.ramdump.force_crash=true + write /proc/sysrq-trigger "c" + +on property:ro.vendor.bluetooth.ftm_enabled=true + start ftmd + +service ftmd /vendor/bin/ftmdaemon + class late_start + user root + group bluetooth net_bt_admin misc diag net_bt + disabled + oneshot + +on property:vendor.sys.logger.bluetooth=true + setprop persist.vendor.service.bdroid.snooplog true + setprop persist.vendor.service.bdroid.fwsnoop true + +on property:vendor.sys.logger.bluetooth=false + setprop persist.vendor.service.bdroid.snooplog false + setprop persist.vendor.service.bdroid.fwsnoop false + +on property:persist.bluetooth.btsnoopenable=true + setprop persist.vendor.service.bdroid.soclog true + +on property:persist.bluetooth.btsnoopenable=false + setprop persist.vendor.service.bdroid.soclog false + +on property:vendor.usb.config=* + start usbd + +on property:persist.vendor.usb.usbradio.config=* + start usbd diff --git a/init.hardware.ipa.rc.userdebug b/init.hardware.ipa.rc.userdebug new file mode 100644 index 0000000..a690c0d --- /dev/null +++ b/init.hardware.ipa.rc.userdebug @@ -0,0 +1,19 @@ +# +# Copyright (C) 2018 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. +# + +on boot + # Enable RmNet IPA3 TX timeout detection + write /d/ipawwan/debug 1 diff --git a/init.hardware.mpssrfs.rc.user b/init.hardware.mpssrfs.rc.user new file mode 100644 index 0000000..f75a413 --- /dev/null +++ b/init.hardware.mpssrfs.rc.user @@ -0,0 +1,5 @@ +on post-fs-data + # Modem Remote FS + mkdir /data/vendor/rfs 0770 vendor_rfs vendor_rfs + mkdir /data/vendor/rfs/mpss 0770 vendor_rfs vendor_rfs + mkdir /data/vendor/tombstones/rfs 0770 vendor_rfs vendor_rfs diff --git a/init.hardware.mpssrfs.rc.userdebug b/init.hardware.mpssrfs.rc.userdebug new file mode 100644 index 0000000..5939bfc --- /dev/null +++ b/init.hardware.mpssrfs.rc.userdebug @@ -0,0 +1,11 @@ +on post-fs-data + # Modem Remote FS + mkdir /data/vendor/rfs 0770 vendor_rfs vendor_rfs + mkdir /data/vendor/rfs/mpss 0770 vendor_rfs vendor_rfs + mkdir /data/vendor/tombstones/rfs 0770 vendor_rfs vendor_rfs + write /data/vendor/rfs/mpss/mcfg_nv_list_flag "1" + chown vendor_rfs vendor_rfs /data/vendor/rfs/mpss/mcfg_nv_list_flag + chmod 0700 /data/vendor/rfs/mpss/mcfg_nv_list_flag + +on property:vendor.sys.modem.diag.efsdump=true + chmod 0660 /data/vendor/rfs/mpss/modem_efs diff --git a/init.hardware.rc b/init.hardware.rc new file mode 100644 index 0000000..449c277 --- /dev/null +++ b/init.hardware.rc @@ -0,0 +1,755 @@ +# +# Copyright (C) 2018 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. +# + +import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.usb.rc +import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.diag.rc +import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.logging.rc +import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.mpssrfs.rc +import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.power.rc + +service vendor.charger /charger + class charger + seclabel u:r:charger:s0 + +on early-init + mount debugfs debugfs /sys/kernel/debug + chmod 0755 /sys/kernel/debug + + # Disable EAS + write /sys/kernel/debug/sched_features NO_ENERGY_AWARE + mount_all /vendor/etc/fstab.persist --early + +# Disable VDSO on JAWS boards. +on early-init && property:ro.revision="DEV1.0" + write /sys/module/vdso/parameters/enable_32 0 + +# Skip init trigger for charger mode +on early-init && property:ro.boot.mode=charger + setprop vendor.skip.init 1 + +# We need vold early for metadata encryption +on early-fs + start vold + +on init && property:vendor.skip.init=0 + # Disable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 0 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0 + + # Disable powersaving + write /sys/module/lpm_levels/parameters/sleep_disabled 1 + + wait /dev/block/platform/soc/${ro.boot.bootdevice} + symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice + + # start qseecomd early as we mount system/ vendor/ early + # vold needs keymaster that needs qseecomd + start vendor.qseecomd + start keymaster-4-0 + + start vendor.citadeld + start vendor.keymaster-4-0-citadel + + # Support legacy paths + symlink /sdcard /mnt/sdcard + symlink /sdcard /storage/sdcard0 + + # Loading kernel modules in background + start insmod_sh + + # bring back all cores + write /sys/devices/system/cpu/cpu0/online 1 + write /sys/devices/system/cpu/cpu1/online 1 + write /sys/devices/system/cpu/cpu2/online 1 + write /sys/devices/system/cpu/cpu3/online 1 + write /sys/devices/system/cpu/cpu4/online 1 + write /sys/devices/system/cpu/cpu5/online 1 + write /sys/devices/system/cpu/cpu6/online 1 + write /sys/devices/system/cpu/cpu7/online 1 + + # configure governor settings for little cluster + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor schedutil + write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us 500 + write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us 20000 + + # configure governor settings for big cluster + write /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor schedutil + write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/up_rate_limit_us 500 + write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/down_rate_limit_us 20000 + + # configure governor settings for big big CPU + write /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor schedutil + write /sys/devices/system/cpu/cpu7/cpufreq/schedutil/up_rate_limit_us 500 + write /sys/devices/system/cpu/cpu7/cpufreq/schedutil/down_rate_limit_us 20000 + + # ZRAM setup + write /sys/block/zram0/comp_algorithm lz4 + write /proc/sys/vm/page-cluster 0 + + # Some user code relies on ro.boot.hardware.revision + setprop ro.boot.hardware.revision ${ro.revision} + + # set default schedTune value for foreground/top-app + write /dev/stune/foreground/schedtune.prefer_idle 1 + write /dev/stune/top-app/schedtune.boost 10 + write /dev/stune/top-app/schedtune.prefer_idle 1 + + mkdir /dev/cpuset/camera-daemon + write /dev/cpuset/camera-daemon/cpus 0-7 + write /dev/cpuset/camera-daemon/mems 0 + chown system system /dev/cpuset/camera-daemon + chown system system /dev/cpuset/camera-daemon/tasks + chmod 0664 /dev/cpuset/camera-daemon/tasks + + # Enable suspend clock reporting + write /sys/kernel/debug/clk/debug_suspend 1 + +on late-init + setprop vendor.thermal.config thermal_info_config.json + +on fs + mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early + + mkdir /mnt/vendor/persist/audio 0770 media audio + mkdir /mnt/vendor/persist/data 0700 system system + mkdir /mnt/vendor/persist/display 0770 system graphics + mkdir /mnt/vendor/persist/haptics 0770 system system + mkdir /mnt/vendor/persist/rfs 0770 root system + mkdir /mnt/vendor/persist/hlos_rfs 0770 root system + mkdir /mnt/vendor/persist/oslo 0770 system system + mkdir /mnt/vendor/persist/touch 0770 system system + chmod 0770 /mnt/vendor/persist/rfs + chmod 0770 /mnt/vendor/persist/rfs/shared + chmod 0770 /mnt/vendor/persist/rfs/msm + chmod 0770 /mnt/vendor/persist/rfs/msm/adsp + chmod 0770 /mnt/vendor/persist/rfs/msm/mpss + chmod 0770 /mnt/vendor/persist/rfs/msm/slpi + chmod 0770 /mnt/vendor/persist/rfs/mdm + chmod 0770 /mnt/vendor/persist/rfs/mdm/adsp + chmod 0770 /mnt/vendor/persist/rfs/mdm/mpss + chmod 0770 /mnt/vendor/persist/rfs/mdm/slpi + chmod 0770 /mnt/vendor/persist/rfs/mdm/tn + chmod 0770 /mnt/vendor/persist/rfs/apq + chmod 0770 /mnt/vendor/persist/rfs/apq/gnss + chmod 0770 /mnt/vendor/persist/hlos_rfs + + # for cycle count backup + mkdir /mnt/vendor/persist/battery 0700 system system + + restorecon_recursive /mnt/vendor/persist + +on post-fs + # set RLIMIT_MEMLOCK to 64MB + setrlimit 8 67108864 67108864 + + # Wait qseecomd started + wait_for_prop vendor.sys.listeners.registered true + + # load IPA FWs + # This must be started when vendor.sys.listeners.registered is true + write /dev/ipa 1 + +on late-fs + # Start services for bootanim + start color_init + wait_for_prop vendor.display.native_display_primaries_ready 1 + setprop ro.surface_flinger.display_primary_red ${vendor.display.primary_red} + setprop ro.surface_flinger.display_primary_green ${vendor.display.primary_green} + setprop ro.surface_flinger.display_primary_blue ${vendor.display.primary_blue} + setprop ro.surface_flinger.display_primary_white ${vendor.display.primary_white} + start surfaceflinger + start bootanim + start vendor.hwcomposer-2-3 + start vendor.configstore-hal + start vendor.qti.hardware.display.allocator + + # Wait for keymaster HALs (TEE and StrongBox) + exec_start wait_for_strongbox + + + # Mount RW partitions which need run fsck + mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late + + # Required for time_daemon + mkdir /mnt/vendor/persist/time 0770 system system + + # Start time daemon early so that the system time can be set early + start time_daemon + + # Init sensor specific services + start init-sensors-sh + + # turn off vblank irq immediately after turning off + write /sys/module/drm/parameters/vblankoffdelay -1 + +on post-fs-data + mkdir /vendor/data/tombstones 0771 system system + mkdir /tombstones/modem 0771 system system + mkdir /tombstones/lpass 0771 system system + mkdir /tombstones/wcnss 0771 system system + mkdir /tombstones/dsps 0771 system system + mkdir /data/vendor/hbtp 0750 system system + mkdir /data/misc/seemp 0700 system system + mkdir /data/vendor/tloc 0700 system drmrpc + mkdir /data/vendor/nnhal 0700 system system + mkdir /data/vendor/time 0770 system system + mkdir /data/vendor/modem_fdr 0700 root system + mkdir /data/vendor/display 0770 system graphics + +on zygote-start + # zygote is started in common init.rc + # and now we can continue initialize /data/ + mkdir /data/vendor/ipa 0770 radio radio + chown radio radio /data/vendor/ipa + + # Create the directories used by the Wireless subsystem + mkdir /data/vendor/wifi 0771 wifi wifi + mkdir /data/vendor/wifi/wpa 0770 wifi wifi + mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi + + # Create the directories used by CnE subsystem + mkdir /data/vendor/connectivity 0771 radio radio + chown radio radio /data/vendor/connectivity + + # Create directory for radio + mkdir /data/vendor/radio 0773 system radio + mkdir /data/vendor/modem_stat 0771 system radio + write /data/vendor/modem_stat/debug.txt "" + chown system radio /data/vendor/modem_stat/debug.txt + chmod 0664 /data/vendor/modem_stat/debug.txt + + # Mark the copy complete flag to not completed + write /data/vendor/radio/copy_complete 0 + chown radio radio /data/vendor/radio/copy_complete + chmod 0660 /data/vendor/radio/copy_complete + + # File flags for prebuilt ril db file + write /data/vendor/radio/prebuilt_db_support 1 + chown radio radio /data/vendor/radio/prebuilt_db_support + chmod 0400 /data/vendor/radio/prebuilt_db_support + write /data/vendor/radio/db_check_done 0 + chown radio radio /data/vendor/radio/db_check_done + chmod 0660 /data/vendor/radio/db_check_done + + # Create directories for Location services + mkdir /data/vendor/location 0770 gps gps + mkdir /data/vendor/location/mq 0770 gps gps + mkdir /data/vendor/location/xtwifi 0770 gps gps + mkdir /dev/socket/location 0770 gps gps + mkdir /dev/socket/location/mq 0770 gps gps + mkdir /dev/socket/location/xtra 0770 gps gps + +on early-boot + # Set up sensors-related directories and permissions + chmod 775 /mnt/vendor/persist/sensors + chmod 664 /mnt/vendor/persist/sensors/sensors_settings + chown root system /mnt/vendor/persist/sensors/registry + chmod 775 /mnt/vendor/persist/sensors/registry + chown root system /mnt/vendor/persist/sensors/registry/registry + chmod 775 /mnt/vendor/persist/sensors/registry/registry + chmod 664 /mnt/vendor/persist/sensors/registry/registry/sensors_registry + chown system root /mnt/vendor/persist/sensors/sensors_settings + chown root root /mnt/vendor/persist/sensors/registry/registry/sensors_settings + + mkdir /data/vendor/sensors 0770 + chown system system /data/vendor/sensors + + chmod 770 /mnt/vendor/persist/audio + chmod 660 /mnt/vendor/persist/audio/audio.cal + chown media audio /mnt/vendor/persist/audio + chown audioserver audio /mnt/vendor/persist/audio/audio.cal + + # Set up haptics-related directories and permissions + chmod 770 /mnt/vendor/persist/haptics + chmod 440 /mnt/vendor/persist/haptics/cs40l25a.cal + chown system system /mnt/vendor/persist/haptics + chown system system /mnt/vendor/persist/haptics/cs40l25a.cal + + # Set up oslo-related directories and permissions + chmod 770 /mnt/vendor/persist/oslo + chmod 660 /mnt/vendor/persist/oslo/oslo.cal + chown system system /mnt/vendor/persist/oslo + chown system system /mnt/vendor/persist/oslo/oslo.cal + + # Set up touch directories and permissions + chmod 770 /mnt/vendor/persist/touch + chown system system /mnt/vendor/persist/touch + + # Permission for lights driver + chown system system /sys/class/backlight/panel0-backlight/brightness + chown system system /sys/class/backlight/panel0-backlight/vr_mode + chown system system /sys/class/backlight/panel0-backlight/hbm_mode + + # Wait for insmod_sh to finish all modules + wait_for_prop vendor.all.modules.ready 1 + + # Update dm-verity state and set partition.*.verified properties + verity_update_state + + # Wait for insmod_sh to finish all boot devices + wait_for_prop vendor.all.devices.ready 1 + + # Permission for Vibrator + chown system system /sys/class/leds/vibrator/device/asp_enable + chown system system /sys/class/leds/vibrator/device/comp_enable + chown system system /sys/class/leds/vibrator/device/cp_dig_scale + chown system system /sys/class/leds/vibrator/device/cp_trigger_duration + chown system system /sys/class/leds/vibrator/device/cp_trigger_index + chown system system /sys/class/leds/vibrator/device/cp_trigger_q_sub + chown system system /sys/class/leds/vibrator/device/cp_trigger_queue + chown system system /sys/class/leds/vibrator/device/dig_scale + chown system system /sys/class/leds/vibrator/device/exc_enable + chown system system /sys/class/leds/vibrator/device/f0_stored + chown system system /sys/class/leds/vibrator/device/fw_rev + chown system system /sys/class/leds/vibrator/device/gpio1_fall_dig_scale + chown system system /sys/class/leds/vibrator/device/gpio1_fall_index + chown system system /sys/class/leds/vibrator/device/gpio1_rise_dig_scale + chown system system /sys/class/leds/vibrator/device/gpio1_rise_index + chown system system /sys/class/leds/vibrator/device/heartbeat + chown system system /sys/class/leds/vibrator/device/hw_reset + chown system system /sys/class/leds/vibrator/device/num_waves + chown system system /sys/class/leds/vibrator/device/q_stored + chown system system /sys/class/leds/vibrator/device/redc_comp_enable + chown system system /sys/class/leds/vibrator/device/redc_stored + chown system system /sys/class/leds/vibrator/device/standby_timeout + chown system system /sys/class/leds/vibrator/device/vbatt_max + chown system system /sys/class/leds/vibrator/device/vbatt_min + + # Permission for Rainbow sensor + chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_enable + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,rainbow@20/rainbow_enable + chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_read_byte + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,rainbow@20/rainbow_read_byte + chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_write_byte + chmod 0660 /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_write_byte + chown system system /dev/vd6281 + chmod 0660 /dev/vd6281 + + # Permission for Athletico + chown system system /dev/sensor_tunnel + chmod 0660 /dev/sensor_tunnel + + # Permission for Dot and Flood + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_enable + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_enable + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_certified + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_certified + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_write_byte + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_write_byte + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_silego_validated + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_silego_validated + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_read_byte + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_read_byte + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/itoc_cali_data_store + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/itoc_cali_data_store + chown system system /dev/lm36011_flood + chmod 0660 /dev/lm36011_flood + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_enable + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_enable + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_certified + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_certified + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_write_byte + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_write_byte + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_silego_validated + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_silego_validated + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_read_byte + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_read_byte + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/itoc_cali_data_store + chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/itoc_cali_data_store + chown system system /dev/lm36011_dot + chmod 0660 /dev/lm36011_dot + + # Permission for camera sensor + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@3/set_strobe_type + chmod 0660 sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@3/set_strobe_type + chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@4/set_strobe_type + chmod 0660 sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@4/set_strobe_type + + # FG cycle count read from dumpstate + backup restore from health HAL (and pixelstats) + chown system system /sys/class/power_supply/maxfg/cycle_counts_bins + + # Permission for Pixelstats + chown system system /sys/class/misc/msm_cirrus_playback/resistance_left_right + chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_read_cnt + chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_write_cnt + chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_unmap_cnt + chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_sync_cnt + + # Permission for Health Storage HAL + chown system system /sys/devices/platform/soc/1d84000.ufshc/manual_gc + + # Permissions for reading display native color gamut + chown system graphics /mnt/vendor/persist/display/native_gamut.csv + +on boot + # This location is used by QCRIL to host UNIX domain + # socket files used for internal IPC within QCRIL + # modules + mkdir /dev/socket/qmux_radio 0770 radio radio + chmod 2770 /dev/socket/qmux_radio + + setprop wifi.interface wlan0 + + chown system system /sys/kernel/hbtp/display_pwr + start rmt_storage + start rfs_access + + # default country code + setprop ro.boot.wificountrycode 00 + + # WLAN debug access + chown system system /d/icnss/stats + +service init-radio-sh /vendor/bin/init.radio.sh + class late_start + user radio + group root radio + oneshot + +on charger + stop vendor.qseecomd + stop keymaster-4-0 + setprop sys.usb.configfs 1 + + # Enable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1 + + # Enable EAS + write /sys/kernel/debug/sched_features ENERGY_AWARE + + # Enable powersaving + write /sys/module/lpm_levels/parameters/sleep_disabled 0 + +on property:sys.boot_completed=1 + # Enable EAS + write /sys/kernel/debug/sched_features ENERGY_AWARE + + # No sleep till proto! + exec - system system -- svc power stayon true + + # Enable UFS powersaving + write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1 + write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1 + + # Enable powersaving + write /sys/module/lpm_levels/parameters/sleep_disabled 0 + + # F2FS tuning: issue discard commands up to 128MB + write /sys/block/dm-7/queue/discard_max_bytes 134217728 + + # Block layer tuning: discard chunk size up to 128MB + # Otherwise, contiguous discards can be merged + write /sys/block/sda/queue/discard_max_bytes 134217728 + + # Enable ZRAM on boot_complete + swapon_all /vendor/etc/fstab.${ro.boot.hardware.platform} + write /proc/sys/vm/swappiness 100 + + # Setup runtime cpusets + write /dev/cpuset/top-app/cpus 0-7 + write /dev/cpuset/foreground/cpus 0-3,5-6 + write /dev/cpuset/background/cpus 0-1 + write /dev/cpuset/system-background/cpus 0-3 + write /dev/cpuset/restricted/cpus 0-3 + + # Setup runtime blkio + # value for group_idle is us + write /dev/blkio/blkio.weight 1000 + write /dev/blkio/background/blkio.weight 10 + write /dev/blkio/blkio.group_idle 2000 + write /dev/blkio/background/blkio.group_idle 0 + + # UFS health + chmod 755 /sys/kernel/debug/ufshcd0 + chmod 644 /sys/kernel/debug/ufshcd0/show_hba + chmod 644 /sys/kernel/debug/ufshcd0/stats/err_stats + chmod 644 /sys/kernel/debug/ufshcd0/stats/io_stats + chmod 644 /sys/kernel/debug/ufshcd0/stats/req_stats + + # HardwareInfo needs to be able to read display info + chmod 444 /sys/devices/platform/soc/soc:qcom,dsi-display-primary/panel_info/panel0/serial_number + chmod 444 /sys/devices/platform/soc/soc:qcom,dsi-display-primary/panel_info/panel0/panel_vendor_name + + # Maxim FG dump for dumpstate + chown system system /sys/kernel/debug/regmap/1-0036/registers + chown system system /sys/kernel/debug/regmap/1-000b/registers + chown system system /sys/kernel/debug/google_battery/cycle_count_bins + chown system system /sys/kernel/debug/google_battery/ssoc_gdf + chown system system /sys/kernel/debug/google_battery/ssoc_rls + chown system system /sys/kernel/debug/google_battery/ssoc_uic + chown system system /sys/kernel/debug/google_battery/ssoc_uicurve + chown system system /sys/kernel/debug/google_charger/pps_op_ua + chown system system /sys/kernel/debug/google_charger/pps_out_uv + + # Permission for Athletico + chown system system /dev/iaxxx-module-celldrv + chmod 0660 /dev/iaxxx-module-celldrv + +service vendor.per_mgr /vendor/bin/pm-service + class core + user system + group system + ioprio rt 4 + +service per_proxy /vendor/bin/pm-proxy + class core + user system + group system + disabled + +on property:init.svc.vendor.per_mgr=running + start per_proxy + +on property:sys.shutdown.requested=* + stop per_proxy + +service vendor.qseecomd /vendor/bin/qseecomd + class core + user root + group root + +service vendor.thermal-engine /vendor/bin/thermal-engine -c /vendor/etc/thermal-engine-${ro.hardware}.conf + class main + user root + socket thermal-send-client stream 0666 system system + socket thermal-recv-client stream 0660 system system + socket thermal-recv-passive-client stream 0666 system system + socket thermal-send-rule stream 0660 system system + group root + +service init-sensors-sh /vendor/bin/init.sensors.sh + class main + user root + group root system + disabled + oneshot + +service sensors.qti /vendor/bin/sensors.qti + class core + user system + group system + # Grants the ability for this daemon to bind IPC router ports so it can + # register QMI services + capabilities NET_BIND_SERVICE + +service vendor.sscrpcd /vendor/bin/sscrpcd sensorspd + class core + user system + group system + +service vendor.adsprpcd /vendor/bin/adsprpcd + class main + user root + group media + setenv ADSP_LIBRARY_PATH /vendor/dsp;/vendor/lib/rfsa/adsp;/system/lib/rfsa/adsp + +service vendor.adsprpcd_audiopd /vendor/bin/adsprpcd audiopd + class main + user media + group media + +service vendor.cdsprpcd /vendor/bin/cdsprpcd + class main + user system + group system + +service vendor.lowi /vendor/bin/sscrpcd + class core + user system + group system + +service vendor.imsqmidaemon /system/vendor/bin/imsqmidaemon + class main + user radio + socket ims_qmid stream 0660 system radio + group radio log diag + +service vendor.imsdatadaemon /system/vendor/bin/imsdatadaemon + class main + user radio + socket ims_datad stream 0660 system radio + group radio wifi inet log diag + disabled + +service vendor.imsrcsservice /system/vendor/bin/imsrcsd + class main + user radio + group radio diag inet log wakelock + +on property:vendor.ims.QMI_DAEMON_STATUS=1 + start vendor.imsdatadaemon + +service vendor.ims_rtp_daemon /system/vendor/bin/ims_rtp_daemon + class main + user radio + group radio inet log + +service cnd /vendor/bin/cnd + class main + user system + group system wifi inet radio wakelock net_admin + +service vendor.chre /vendor/bin/chre + class late_start + user system + group system wakelock + capabilities BLOCK_SUSPEND + socket chre seqpacket 0660 root system + shutdown critical + +service wait_for_strongbox /vendor/bin/hw/wait_for_strongbox + user root + group root system + priority -20 + ioprio rt 0 + +on property:vendor.ims.DATA_DAEMON_STATUS=1 + restart vendor.ims_rtp_daemon + +service time_daemon /vendor/bin/time_daemon + class core + user root + group root + +service vendor.qrtr-ns /vendor/bin/qrtr-ns -f + class core + user vendor_qrtr + group vendor_qrtr + capabilities NET_BIND_SERVICE + +service irsc_util /vendor/bin/irsc_util "/vendor/etc/sec_config" + class core + user root + oneshot + +service rmt_storage /vendor/bin/rmt_storage + class core + user root + ioprio rt 0 + shutdown critical + +service tftp_server /vendor/bin/tftp_server + class core + user root + group root system + +service modem_svc /vendor/bin/modem_svc + class core + user root + group system + capabilities NET_BIND_SERVICE + +service vendor.ss_ramdump /vendor/bin/subsystem_ramdump + class main + user root + group system + disabled + +service vendor.ssr_setup /vendor/bin/ssr_setup + oneshot + disabled + +on property:persist.vendor.sys.ssr.restart_level=* + start vendor.ssr_setup + +on property:persist.vendor.sys.ssr.enable_ramdumps=1 + write /sys/module/subsystem_restart/parameters/enable_ramdumps 1 + mkdir /data/vendor/wifidump 771 root system + mkdir /data/vendor/ramdump 771 root system + mkdir /data/vendor/ssrdump 771 root system + mkdir /data/vendor/ssrlog 771 root system + start vendor.ss_ramdump + +on property:persist.vendor.sys.ssr.enable_ramdumps=0 + write /sys/module/subsystem_restart/parameters/enable_ramdumps 0 + +service wpa_supplicant /vendor/bin/hw/wpa_supplicant \ + -O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1 -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 android.hardware.wifi.supplicant@1.0::ISupplicant default + interface android.hardware.wifi.supplicant@1.1::ISupplicant default + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +on property:init.svc.vendor.hwcomposer-2-3=stopped + stop ppd + +on property:init.svc.vendor.hwcomposer-2-3=running + start ppd + +on property:wlan.driver.status=ok + # Get the wlan driver/fw version + start vendor.wlan_sh + + # Change permission for dumpstate + chmod 444 /sys/kernel/wlan/power_stats + +service insmod_sh /vendor/bin/init.insmod.sh /vendor/etc/init.insmod.${ro.hardware}.cfg + class main + user root + group root system + disabled + oneshot + +service vendor.msm_irqbalance /vendor/bin/msm_irqbalance -f /vendor/etc/msm_irqbalance.conf + socket msm_irqbalance seqpacket 660 root system + class core + user root + group root + writepid /dev/cpuset/system-background/tasks + +service pd_mapper /vendor/bin/pd-mapper + class core + user system + group system + capabilities NET_BIND_SERVICE + +service cnss-daemon /vendor/bin/cnss-daemon -n -l + class late_start + user system + group system inet wifi + +service loc_launcher /vendor/bin/loc_launcher + class late_start + user gps + group gps + +# bugreport is triggered by holding down volume down, volume up and power +service bugreport /system/bin/dumpstate -d -p -B -z \ + -o /data/user_de/0/com.android.shell/files/bugreports/bugreport + class main + disabled + oneshot + keycodes 114 115 116 + +service vendor.wlan_sh /vendor/bin/init.qcom.wlan.sh + class main + user root + group root + disabled + oneshot + +# DSDS feature +# Enable 2nd qcrild when the property set to dsds +on property:persist.radio.multisim.config=dsds + start vendor.qcrild2 diff --git a/init.hardware.usb.rc b/init.hardware.usb.rc new file mode 100644 index 0000000..9eb5b1e --- /dev/null +++ b/init.hardware.usb.rc @@ -0,0 +1,103 @@ +# +# Copyright (C) 2016 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +on early-boot + mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/bcdDevice 0x0440 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/accessory.gs2 + mkdir /config/usb_gadget/g1/functions/audio_source.gs3 + mkdir /config/usb_gadget/g1/functions/midi.gs5 + 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/diag.diag + mkdir /config/usb_gadget/g1/functions/diag.diag_mdm + mkdir /config/usb_gadget/g1/functions/cser.dun.0 + mkdir /config/usb_gadget/g1/functions/cser.nmea.1 + mkdir /config/usb_gadget/g1/functions/gsi.rmnet + mkdir /config/usb_gadget/g1/functions/gsi.rndis + mkdir /config/usb_gadget/g1/functions/gsi.dpl + mkdir /config/usb_gadget/g1/functions/qdss.qdss + mkdir /config/usb_gadget/g1/functions/qdss.qdss_mdm + 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/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 + mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000,no_disconnect=1 + mkdir /dev/usb-ffs/mtp 0770 mtp mtp + mkdir /dev/usb-ffs/ptp 0770 mtp mtp + 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.mtp.device_type 3 + setprop sys.usb.controller "a600000.dwc3" + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + write /sys/module/libcomposite/parameters/disable_l1_for_hs "y" + write /config/usb_gadget/g1/functions/gsi.rndis/rndis_class_id 1 + +on property:init.svc.console=running + write /sys/class/power_supply/usb/moisture_detection_enabled 0 + +on boot + setprop sys.usb.configfs 2 + +on property:sys.usb.config=none && property:sys.usb.configfs=1 + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + +on charger + mkdir /config/usb_gadget/g1 0770 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/bcdDevice 0x0440 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer Google + write /config/usb_gadget/g1/strings/0x409/product Pixel + 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 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + setprop sys.usb.controller "a600000.dwc3" + +on property:ro.bootmode=charger + setprop sys.usb.config midi + +on property:sys.usb.config=midi && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4eea + symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} diff --git a/init.insmod.redfin.cfg b/init.insmod.redfin.cfg new file mode 100644 index 0000000..d8d0efe --- /dev/null +++ b/init.insmod.redfin.cfg @@ -0,0 +1,19 @@ +############################################# +# init.insmod.cfg # +# This file contains kernel modules to load # +# at init time by init.insmod.sh script # +############################################# + +# Load kernel modules +modprobe|wlan.ko msm_11ad_proxy.ko pinctrl_wcd_dlkm.ko wcd_core_dlkm.ko wcd_spi_dlkm.ko wglink_dlkm.ko q6_pdr_dlkm.ko q6_notifier_dlkm.ko apr_dlkm.ko swr_dlkm.ko q6_dlkm.ko cs35l36_dlkm.ko swr_ctrl_dlkm.ko wcd9xxx_dlkm.ko mbhc_dlkm.ko wcd9360_dlkm.ko wcd934x_dlkm.ko wsa881x_dlkm.ko wcd_cpe_dlkm.ko platform_dlkm.ko machine_dlkm.ko native_dlkm.ko usf_dlkm.ko stub_dlkm.ko adsp_loader_dlkm.ko lkdtm.ko videobuf2-memops.ko videobuf2-vmalloc.ko heatmap.ko ftm5.ko + +# All modules loaded +setprop|vendor.all.modules.ready + +# Boot devices +enable|/sys/kernel/boot_adsp/boot +enable|/sys/kernel/boot_cdsp/boot +enable|/sys/kernel/boot_slpi/boot + +# All devices enabled +setporp|vendor.all.devices.ready diff --git a/init.insmod.sh b/init.insmod.sh new file mode 100755 index 0000000..c7ac027 --- /dev/null +++ b/init.insmod.sh @@ -0,0 +1,31 @@ +#!/vendor/bin/sh + +######################################################## +### init.insmod.cfg format: ### +### ----------------------------------------------- ### +### [insmod|setprop|enable/moprobe] [path|prop name] ### +### ... ### +######################################################## + +if [ $# -eq 1 ]; then + cfg_file=$1 +else + exit 1 +fi + +if [ -f $cfg_file ]; then + while IFS="|" read -r action arg + do + case $action in + "insmod") insmod $arg ;; + "setprop") setprop $arg 1 ;; + "enable") echo 1 > $arg ;; + "modprobe") modprobe -a -d /vendor/lib/modules $arg ;; + esac + done < $cfg_file +fi + +# set property even if there is no insmod config +# as property value "1" is expected in early-boot trigger +setprop vendor.all.modules.ready 1 +setprop vendor.all.devices.ready 1 diff --git a/init.logging.rc b/init.logging.rc new file mode 100644 index 0000000..969d548 --- /dev/null +++ b/init.logging.rc @@ -0,0 +1,4 @@ +on post-fs-data + mkdir /data/vendor/modem_dump 0777 system system + mkdir /data/vendor/radio/diag_logs/logs 0777 system system + mkdir /data/vendor/radio/extended_logs 0770 system radio diff --git a/init.mdm.sh b/init.mdm.sh new file mode 100644 index 0000000..3ed7ed5 --- /dev/null +++ b/init.mdm.sh @@ -0,0 +1,34 @@ +#! /vendor/bin/sh + +# Copyright (c) 2013, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +baseband=`getprop ro.baseband` +if [ "$baseband" = "mdm" ] || [ "$baseband" = "mdm2" ]; then + start vendor.mdm_helper +fi + diff --git a/init.msm.usb.configfs.rc b/init.msm.usb.configfs.rc new file mode 100644 index 0000000..e57f699 --- /dev/null +++ b/init.msm.usb.configfs.rc @@ -0,0 +1,1216 @@ +# Copyright (c) 2016-2018, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# USB compositions +on property:sys.usb.config=none && property:sys.usb.configfs=1 + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + +on property:sys.usb.config=mass_storage && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "msc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0xF000 + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb_msc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9015 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/mass_storage.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901D + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x900E + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default composition" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9091 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "Default comp without ADB" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9092 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:vendor.usb.tethering=true + write /sys/class/net/rndis0/queues/rx-0/rps_cpus ${vendor.usb.rps_mask} + +on property:sys.usb.config=rndis + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra} + +on property:sys.usb.config=rndis,none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0xF00E + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,adb + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra},adb + +on property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9024 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902C + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x902D + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,serial_cdev,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B4 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_dun_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90B6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=mtp,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901B + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x903A + symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x904A + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9060 + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9083 + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,qdss,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_qdss_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9084 + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9081 + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9082 + write /config/usb_gadget/g1/functions/qdss.qdss/enable_debug_inface 1 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ncm" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0xA4A1 + symlink /config/usb_gadget/g1/functions/ncm.0 /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ncm,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ncm_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x908C + symlink /config/usb_gadget/g1/functions/ncm.0 /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x9004 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,serial_cdev && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb,serial_cdev && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb_dun" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901f + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90b7 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90b8 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90bf + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90c0 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=ccid && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CE + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ccid,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CF + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,diag && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_diag" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D0 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ccid,diag,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ccid,diag,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ccid_diag_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D1 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,ccid && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_ccid" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D2 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,ccid,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,ccid,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_ccid_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D3 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/ccid.ccid /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D7 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90D8 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_dpl_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DD + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,serial_cdev_mdm,dpl,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm,qdss_qdss_mdm_dun_dun_mdm_dpl_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DE + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.2 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f8 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_qdss" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DC + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f5 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,serial_cdev,rmnet,dpl,qdss,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_dun_rmnet_dpl_qdss_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DB + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f6 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uac2,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CA + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2 && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x901C + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uvc,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uvc,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uvc_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CB + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uvc && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uvc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90DF + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f2 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,uvc,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,uac2,uvc,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_uvc_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90CC + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f4 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,uac2,uvc && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_uac2_uvc" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E0 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/uac2.0 /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/uvc.0 /config/usb_gadget/g1/configs/b.1/f3 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm_qdss_qdss_mdm_dun_dpl_rmnet" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E4 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_diag_mdm_qdss_qdss_mdm_dun_dpl_rmnet_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E5 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.rmnet.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_diag_mdm_qdss_qdss_mdm_dun_dpl" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,adb && property:sys.usb.configfs=1 + start adbd + +on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "rndis_diag_diag_mdm_qdss_qdss_mdm_dun_dpl_adb" + rm /config/usb_gadget/g1/configs/b.1/f1 + rm /config/usb_gadget/g1/configs/b.1/f2 + rm /config/usb_gadget/g1/configs/b.1/f3 + rm /config/usb_gadget/g1/configs/b.1/f4 + rm /config/usb_gadget/g1/configs/b.1/f5 + rm /config/usb_gadget/g1/configs/b.1/f6 + rm /config/usb_gadget/g1/configs/b.1/f7 + rm /config/usb_gadget/g1/configs/b.1/f8 + rm /config/usb_gadget/g1/configs/b.1/f9 + write /config/usb_gadget/g1/idVendor 0x05C6 + write /config/usb_gadget/g1/idProduct 0x90E7 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rndis.func.name}.rndis /config/usb_gadget/g1/configs/b.1/f1 + symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f2 + symlink /config/usb_gadget/g1/functions/diag.diag_mdm /config/usb_gadget/g1/configs/b.1/f3 + symlink /config/usb_gadget/g1/functions/qdss.qdss /config/usb_gadget/g1/configs/b.1/f4 + symlink /config/usb_gadget/g1/functions/qdss.qdss_mdm /config/usb_gadget/g1/configs/b.1/f5 + symlink /config/usb_gadget/g1/functions/cser.dun.0 /config/usb_gadget/g1/configs/b.1/f6 + symlink /config/usb_gadget/g1/functions/${vendor.usb.rmnet.func.name}.${vendor.usb.dpl.inst.name} /config/usb_gadget/g1/configs/b.1/f7 + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f8 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee7 + +on property:sys.usb.config=mtp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee1 + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee2 + +on property:sys.usb.config=ptp && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee5 + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee6 + +on property:sys.usb.config=accessory && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d00 + +on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d01 + +on property:sys.usb.config=audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d02 + +on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d03 + +on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d04 + +on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x2d05 + +on property:sys.usb.config=midi && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee8 + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idVendor 0x18d1 + write /config/usb_gadget/g1/idProduct 0x4ee9 + +on property:vendor.usb.eud=1 + write /config/usb_gadget/g1/configs/b.1/MaxPower 1 + write /sys/module/eud/parameters/enable 1 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_active 1 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_val 500 + +on property:vendor.usb.eud=0 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_active 0 + write /sys/kernel/debug/pmic-votable/USB_ICL/force_val 0 + write /config/usb_gadget/g1/configs/b.1/MaxPower 0 + write /sys/module/eud/parameters/enable 0 diff --git a/init.power.rc b/init.power.rc new file mode 100644 index 0000000..221805a --- /dev/null +++ b/init.power.rc @@ -0,0 +1,114 @@ +# +# Copyright (C) 2017 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +on property:sys.boot_completed=1 + # Enable bus-dcvs + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/governor bw_hwmon + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/polling_interval 40 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/mbps_zones "2288 4577 7110 9155 12298 14236 15258" + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/sample_ms 4 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/io_percent 50 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/hist_memory 20 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/hyst_length 10 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/down_thres 30 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/guard_band_mbps 0 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/up_scale 250 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/idle_mbps 1600 + write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/max_freq 14236 + + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/governor bw_hwmon + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/polling_interval 40 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/mbps_zones "1720 2929 3879 5931 6881 7980" + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/sample_ms 4 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/io_percent 80 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/hist_memory 20 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/hyst_length 10 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/down_thres 30 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/guard_band_mbps 0 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/up_scale 250 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/idle_mbps 1600 + write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/max_freq 6881 + + write /sys/devices/virtual/npu/msm_npu/pwr 1 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/governor bw_hwmon + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/polling_interval 40 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/mbps_zones "1720 2929 3879 5931 6881 7980" + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/sample_ms 4 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/io_percent 80 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/hist_memory 20 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/hyst_length 6 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/down_thres 30 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/guard_band_mbps 0 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/up_scale 250 + write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/idle_mbps 0 + write /sys/devices/virtual/npu/msm_npu/pwr 0 + + #Enable mem_latency governor for L3, LLCC, and DDR scaling + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/polling_interval 10 + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/mem_latency/ratio_ceil 400 + + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/polling_interval 10 + write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/mem_latency/ratio_ceil 400 + + write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/polling_interval 10 + write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/mem_latency/ratio_ceil 400 + + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/polling_interval 10 + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/mem_latency/ratio_ceil 400 + + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/polling_interval 10 + #Gold L3 ratio ceil is 4000 + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/mem_latency/ratio_ceil 4000 + + write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/polling_interval 10 + #Gold+ L3 ratio ceil is 20000 + write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/mem_latency/ratio_ceil 20000 + + write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/governor mem_latency + write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/polling_interval 10 + write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/mem_latency/ratio_ceil 400 + + #Enable userspace governor for L3 cdsp nodes + write /sys/devices/platform/soc/soc:qcom,cdsp-cdsp-l3-lat/devfreq/soc:qcom,cdsp-cdsp-l3-lat/governor cdspl3 + + #Enable compute governor for gold latfloor + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-ddr-latfloor/devfreq/soc:qcom,cpu4-cpu-ddr-latfloor/governor compute + write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-ddr-latfloor/devfreq/soc:qcom,cpu4-cpu-ddr-latfloor/polling_interval 10 + + write /sys/module/lpm_levels/parameters/sleep_disabled 0 + + # Enable idle state listener + write /sys/class/drm/card0/device/idle_encoder_mask 1 + write /sys/class/drm/card0/device/idle_timeout_ms 100 + + chown system system /sys/class/devfreq/soc:qcom,l3-cdsp/userspace/set_freq + + #Enable PowerHAL hint processing + setprop vendor.powerhal.init 1 + +# Disable console_suspend to get better logging for kernel crashes +on boot + write /sys/module/printk/parameters/console_suspend N + +# If UART is on, enable console_suspend on boot_complete to save power +on property:sys.boot_completed=1 && property:init.svc.console=running + write /sys/module/printk/parameters/console_suspend Y diff --git a/init.qcom.modem_links.sh b/init.qcom.modem_links.sh new file mode 100644 index 0000000..8aba652 --- /dev/null +++ b/init.qcom.modem_links.sh @@ -0,0 +1,132 @@ +#!/system/bin/sh +# Copyright (c) 2013, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# No path is set up at this point so we have to do it here. +PATH=/sbin:/system/sbin:/system/bin:/system/xbin +export PATH + +# Check for images and set up symlinks +cd /firmware/image + +# Get the list of files in /firmware/image +# for which sym links have to be created + +fwfiles=`ls modem* adsp* wcnss* mba*` + +# Check if the links with similar names +# have been created in /system/etc/firmware + +cd /system/etc/firmware +linksNeeded=0 + +# For everyfile in fwfiles check if +# the corresponding file exists +for fwfile in $fwfiles; do + + # if (condition) does not seem to work + # with the android shell. Therefore + # make do with case statements instead. + # if a file named $fwfile is present + # no need to create links. If the file + # with the name $fwfile is not present + # need to create links. + + case `ls $fwfile` in + $fwfile) + continue;; + *) + # file with $fwfile does not exist + # need to create links + linksNeeded=1 + break;; + esac + +done + +# symlinks created for qca6714 firmware +ln -s /firmware/image/athwlan.bin /system/etc/firmware/athwlan.bin +ln -s /firmware/image/fakeboar.bin /system/etc/firmware/fakeBoardData_AR6004.bin +ln -s /firmware/image/otp.bin /system/etc/firmware/otp.bin +ln -s /firmware/image/utf.bin /system/etc/firmware/utf.bin + +case $linksNeeded in + 1) + cd /firmware/image + + case `ls modem.mdt 2>/dev/null` in + modem.mdt) + for imgfile in modem*; do + ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null + done + ;; + *) + # trying to log here but nothing will be logged since it is + # early in the boot process. Is there a way to log this message? + log -p w -t PIL no modem image found;; + esac + + case `ls adsp.mdt 2>/dev/null` in + adsp.mdt) + for imgfile in adsp*; do + ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null + done + ;; + *) + log -p w -t PIL no adsp image found;; + esac + + case `ls wcnss.mdt 2>/dev/null` in + wcnss.mdt) + for imgfile in wcnss*; do + ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null + done + ;; + *) + log -p w -t PIL no wcnss image found;; + esac + + case `ls mba.mdt 2>/dev/null` in + mba.mdt) + for imgfile in mba*; do + ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null + done + ;; + *) + log -p w -t PIL no mba image found;; + esac + + ;; + + *) + # Nothing to do. No links needed + ;; +esac + +cd / diff --git a/init.qcom.usb.rc b/init.qcom.usb.rc new file mode 100644 index 0000000..bebc807 --- /dev/null +++ b/init.qcom.usb.rc @@ -0,0 +1,1665 @@ +# Copyright (c) 2011-2016, 2018 The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of The Linux Foundation nor +# the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# controller name can be overridden from boot command line +on init + setprop sys.usb.controller ${ro.boot.usbcontroller} + +on property:ro.boot.usbcontroller=* + setprop sys.usb.controller ${ro.boot.usbcontroller} + +on charger + mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 shell shell + mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + write /sys/class/android_usb/android0/f_ffs/aliases adb + enable vendor.qcom-usb-sh + start vendor.qcom-usb-sh + setprop sys.usb.config mass_storage + +on boot + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 shell shell + mkdir /config/usb_gadget/g1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/bcdUSB 0x0200 + write /config/usb_gadget/g1/os_desc/use 1 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/mass_storage.0 + mkdir /config/usb_gadget/g1/functions/mtp.gs0 + mkdir /config/usb_gadget/g1/functions/ptp.gs1 + mkdir /config/usb_gadget/g1/functions/accessory.gs2 + mkdir /config/usb_gadget/g1/functions/audio_source.gs3 + mkdir /config/usb_gadget/g1/functions/midi.gs5 + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/diag.diag + mkdir /config/usb_gadget/g1/functions/diag.diag_mdm + mkdir /config/usb_gadget/g1/functions/cser.dun.0 + mkdir /config/usb_gadget/g1/functions/cser.nmea.1 + mkdir /config/usb_gadget/g1/functions/cser.dun.2 + mkdir /config/usb_gadget/g1/functions/gsi.rmnet + mkdir /config/usb_gadget/g1/functions/gsi.rndis + mkdir /config/usb_gadget/g1/functions/gsi.dpl + mkdir /config/usb_gadget/g1/functions/qdss.qdss + mkdir /config/usb_gadget/g1/functions/qdss.qdss_mdm + mkdir /config/usb_gadget/g1/functions/rndis_bam.rndis + mkdir /config/usb_gadget/g1/functions/rndis.rndis + mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet + mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl + mkdir /config/usb_gadget/g1/functions/rmnet_bam.rmnet_bam_dmux + mkdir /config/usb_gadget/g1/functions/rmnet_bam.dpl_bam_dmux + mkdir /config/usb_gadget/g1/functions/ncm.0 + mkdir /config/usb_gadget/g1/functions/ccid.ccid + mkdir /config/usb_gadget/g1/functions/uac2.0 + mkdir /config/usb_gadget/g1/functions/uvc.0 + mkdir /config/usb_gadget/g1/configs/b.1 0770 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1 + write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100" + symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1 + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + write /sys/class/android_usb/android0/f_ffs/aliases adb + +on load_persist_props_action + enable vendor.qcom-usb-sh + +service vendor.qcom-usb-sh /vendor/bin/init.qcom.usb.sh + class core + user root + oneshot + disabled + +on property:persist.vendor.usb.config=* + setprop persist.sys.usb.config ${persist.vendor.usb.config} + +on boot && property:ro.boot.usbconfigfs=true + setprop sys.usb.configfs 1 + +# Following are the parameters required for usb functionality. They provide configurable options like +# product_id/vendor id and allows specifying required functions: +# +# Required parameters: +# +# /sys/class/android_usb/android0/enable: Enables/disables usb composition +# Value: 0 (disable), 1 (enable) +# +# /sys/class/android_usb/android0/idVendor: Stores Vendor ID +# Value: 05c6 (Vendor id for Qualcomm Inc) +# +# /sys/class/android_usb/android0/idProduct: Stores Product id corresponding to usb composition +# Value: 0x9xxx for composite interface, 0xFxxx for single interface +# +# /sys/class/android_usb/android0/f_diag/clients: Stores name of clients representing a diag interface. +# Value: Passed one per interface. e.g. diag[,diag_mdm, diag_qsc, diag_mdm2] +# +# /sys/class/android_usb/android0/functions: Stores name of the function drivers used in usb composition. +# Value: Passed one per function driver. e.g. diag[,adb] +# +#Optional parameters: +# +# /sys/class/android_usb/android0/f_serial/transports: Stores type of underlying transports used to +# communicate to serial interface. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. smd[,sdio,tty,hsic] +# Only required if serial interface is present. +# +# /sys/class/android_usb/android0/f_serial/transport_names: Stores name of the underlying transports +# used to communicate to serial interface. This is used to distinguish between more than one interface +# using same transport type. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. serial_hsic[,serial_hsusb] +# Only required for transport type hsic, optional for other transport types. +# +# /sys/class/android_usb/android0/f_rmnet/transports: Stores type of underlying transports used to +# communicate to rmnet interface. +# Value: Passed two per interface as control, data transport type pair. +# e.g. smd,bam[,hsuart,hsuart] +# Only required if rmnet interface is present. +# +# /sys/class/android_usb/android0/f_rmnet/transport_names: Stores name of the underlying transports +# used to communicate to rmnet interface. This is used to distinguish between more than one interface +# using same transport type. +# Value: Passed one per interface. One value represents control and data transport together. +# e.g. rmnet_hsic[,rmnet_hsusb] +# Only required for transport type hsic, optional for other transport types. + +# USB compositions +on property:sys.usb.config=diag,serial_tty,serial_smd && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9002 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,smd + write /sys/class/android_usb/android0/functions diag,serial + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_smd,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9020 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,serial + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 901D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 900E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_smd,rmnet_smd_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9037 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,smd + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_smd,rmnet_smd_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,smd + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_smd,rmnet_smd_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9038 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,smd + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_smd,rmnet_smd_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903C + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,smd + write /sys/class/android_usb/android0/functions diag,acm,rmnet_smd_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_tty,rmnet_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9031 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_tty,rmnet_sdio,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_sdio,serial_tty,rmnet_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9032 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports sdio,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,acm_sdio,acm_tty,rmnet_sdio,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903C + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_acm/acm_transports sdio,tty + write /sys/class/android_usb/android0/functions diag,acm,rmnet_sdio,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_tty,acm_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports tty,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_tty,serial_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports tty,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_tty,acm_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports tty,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_smd,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903D + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/functions diag,adb,acm,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + start vendor.port-bridge + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,acm_smd,acm_tty,rmnet_smd,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903E + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_acm/acm_transports smd,tty + write /sys/class/android_usb/android0/functions diag,serial,rmnet_smd,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# RmNet using USB BAM to IPA BAM +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9026 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9091 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9092 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition +on property:sys.usb.config=diag,serial_hsic,serial_tty,rmnet_hsic,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9025 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition with diag_mdm and adb +on property:sys.usb.config=diag,diag_mdm,serial_hsic,serial_tty,rmnet_hsic,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9031 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 composition with diag_mdm +on property:sys.usb.config=diag,diag_mdm,serial_hsic,serial_tty,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9032 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic,tty + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA composition with adb +on property:sys.usb.config=diag,diag_mdm,diag_qsc,serial_hsic,serial_hsuart,rmnet_hsic,rmnet_hsuart,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9065 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports hsic,hsuart + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsuart + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsuart,hsuart + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsuart + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA composition without adb +on property:sys.usb.config=diag,diag_mdm,diag_qsc,serial_hsic,serial_hsuart,rmnet_hsic,rmnet_hsuart,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9066 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports hsic,hsuart + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsuart + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsuart,hsuart + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsuart + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA2 composition with adb +on property:sys.usb.config=diag,diag_mdm,diag_mdm2,serial_hsic,serial_hsusb,rmnet_hsic,rmnet_hsusb,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9065 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_mdm2 + write /sys/class/android_usb/android0/f_serial/transports hsic,hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsusb + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsusb + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 3 DSDA2 composition without adb +on property:sys.usb.config=diag,diag_mdm,diag_mdm2,serial_hsic,serial_hsusb,rmnet_hsic,rmnet_hsusb,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9066 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_mdm2 + write /sys/class/android_usb/android0/f_serial/transports hsic,hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic,serial_hsusb + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic,hsic,hsic + write /sys/class/android_usb/android0/f_rmnet/transport_names rmnet_hsic,rmnet_hsusb + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/module/mdm_bridge/parameters/rx_rmnet_buffer_size 16384 + write /sys/module/mdm_bridge/parameters/max_rx_urbs 20 + write /sys/module/g_android/parameters/ghsic_data_rx_req_size 16384 + write /sys/module/g_android/parameters/ghsic_data_rmnet_rx_q_size 20 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm and adb +# Serial & RmNet bridged in userspace with tty and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm +# Serial & RmNet bridged in userspace with tty and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion HSIC/PCIe Hybrid composition with diag_mdm and adb +# RmNet is bridged over PCIe using qti,ether ctrl/data transports +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion HSIC/PCIe Hybrid composition with diag_mdm +# RmNet is bridged over PCIe using qti,ether ctrl/data transports +on property:sys.usb.config=diag,diag_mdm,serial_hsic,rmnet_hsic,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports hsic + write /sys/class/android_usb/android0/f_serial/transport_names serial_hsic + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Fusion PCIe composition with diag_mdm +# Serial & RmNet bridged in userspace with port bridge and qti/ether +on property:sys.usb.config=diag,diag_mdm,serial_cdev,rmnet_qti_ether,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9036 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_cdev,rmnet_qti_ether,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9035 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 2.2 composition with diag_qsc and adb +on property:sys.usb.config=diag,diag_qsc,serial_smd,serial_tty,serial_hsuart,rmnet_hsuart,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9053 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports smd,tty,hsuart + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam,hsuart,hsuart + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Fusion 2.2 composition with diag_qsc +on property:sys.usb.config=diag,diag_qsc,serial_smd,serial_tty,serial_hsuart,rmnet_hsuart,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9054 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_qsc + write /sys/class/android_usb/android0/f_serial/transports smd,tty,hsuart + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam,hsuart,hsuart + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:vendor.usb.tethering=true + write /sys/class/net/rndis0/queues/rx-0/rps_cpus ${vendor.usb.rps_mask} + +on property:sys.usb.config=rndis + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra} + +on property:sys.usb.config=rndis,none && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F00E + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/functions rndis + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,adb && property:sys.usb.configfs=0 + setprop sys.usb.config rndis,${persist.vendor.usb.config.extra},adb + +on property:sys.usb.config=rndis,none,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9024 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/functions rndis,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 902C + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 902D + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +# DPL is implemented using QDSS +on property:sys.usb.config=rndis,diag,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BF + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +# DPL is implemented using QDSS +on property:sys.usb.config=rndis,diag,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90C0 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_smd && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B3 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_smd,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B4 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_smd,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B5 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_smd,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B6 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/functions rndis,serial,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,serial_cdev,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B5 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/functions rndis,serial,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,serial_cdev,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B6 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge + write /sys/class/android_usb/android0/functions rndis,serial,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag,diag_mdm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9041 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9042 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=rndis,diag,diag_mdm,diag_qsc && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9086 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions rndis,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state rndis + +on property:sys.usb.config=rndis,diag,diag_mdm,diag_qsc,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9087 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions rndis,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state rndis,adb + +on property:sys.usb.config=ptp && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904D + write /sys/class/android_usb/android0/functions ptp + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904E + write /sys/class/android_usb/android0/functions ptp,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F003 + write /sys/class/android_usb/android0/functions mtp + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9039 + write /sys/class/android_usb/android0/functions mtp,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 901B + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903A + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9040 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 903F + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,diag_qsc && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9088 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions mtp,diag + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,diag,diag_mdm,diag_qsc,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9089 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm,diag_qsc + write /sys/class/android_usb/android0/functions mtp,diag,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,ccid && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9045 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions diag,ccid + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,ccid,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9044 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/functions diag,adb,ccid + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9015 + write /sys/class/android_usb/android0/functions adb,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +#Mass-storage only composition +on property:sys.usb.config=mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F000 + write /sys/class/android_usb/android0/functions mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 904A + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9060 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9099 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9098 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_qti_bam && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_qti_bam,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_ipa && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9083 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,qdss,rmnet_ipa,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9084 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,rmnet_hsic && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 909B + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss,rmnet_hsic,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 909A + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss_apq,qdss_mdm,rmnet_hsic && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90A3 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports bam,hsic + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam,qdss_hsic + write /sys/class/android_usb/android0/functions diag,qdss,rmnet + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,qdss_apq,qdss_mdm,rmnet_hsic,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90A2 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_rmnet/transports hsic,hsic + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports bam,hsic + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam,qdss_hsic + write /sys/class/android_usb/android0/functions diag,qdss,adb,rmnet + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9081 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,diag,qdss,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 9082 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_qdss/debug_intf 1 + write /sys/class/android_usb/android0/f_qdss/transports bam + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/functions rndis,diag,qdss,adb + write /sys/module/dwc3/parameters/tx_fifo_resize_enable 1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# same as 9025, plus data packet logging (DPL) using QDSS +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AD + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# same as 9026, plus data packet logging (DPL) +on property:sys.usb.config=diag,serial_smd,serial_tty,rmnet_ipa,mass_storage,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B0 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AD + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B0 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports char_bridge,tty +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,mass_storage,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 0525 + write /sys/class/android_usb/android0/idProduct A4A1 + write /sys/class/android_usb/android0/functions ncm + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 908C + write /sys/class/android_usb/android0/functions ncm,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=charging && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct F006 + write /sys/class/android_usb/android0/functions charging + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,dpl_qti_bam_dmux && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B7 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/transports qti,bam_dmux + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_qti_bam,dpl_qti_bam_dmux,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B8 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam + write /sys/class/android_usb/android0/f_qdss/transports qti,bam_dmux + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_cnss,serial_smd,serial_tty,rmnet_bam,mass_storage,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B2 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_cnss + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,diag_cnss,adb,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_cnss,serial_smd,serial_tty,rmnet_bam,mass_storage && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B3 + write /sys/class/android_usb/android0/f_diag/clients diag,diag_cnss + write /sys/class/android_usb/android0/f_serial/transports smd,tty + write /sys/class/android_usb/android0/f_rmnet/transports smd,bam + write /sys/class/android_usb/android0/functions diag,diag_cnss,serial,rmnet,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BA + write /sys/class/android_usb/android0/functions midi + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=midi,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90BB + write /sys/class/android_usb/android0/functions midi,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,dpl && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B7 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,serial_smd,rmnet_ipa,dpl,adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90B8 + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/f_serial/transports smd +# DPL is implemented using QDSS + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_bam + write /sys/class/android_usb/android0/f_rmnet/transports qti,bam2bam_ipa + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,adb + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,dpl_ether,mass_storage,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AE + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_dpl + write /sys/class/android_usb/android0/functions diag,adb,serial,rmnet,qdss,mass_storage + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,diag_mdm,serial_tty,rmnet_qti_ether,dpl_ether,mass_storage + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90AF + write /sys/class/android_usb/android0/f_diag/clients diag,diag_mdm + write /sys/class/android_usb/android0/f_serial/transports tty + write /sys/class/android_usb/android0/f_rmnet/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/debug_intf 0 + write /sys/class/android_usb/android0/f_qdss/transports qti,ether + write /sys/class/android_usb/android0/f_qdss/transport_names qdss_dpl + write /sys/class/android_usb/android0/functions diag,serial,rmnet,qdss,mass_storage + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,uac2 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CA + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,uac2_func + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,video && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CB + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,video + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=diag,adb,uac2,video && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 05C6 + write /sys/class/android_usb/android0/idProduct 90CC + write /sys/class/android_usb/android0/f_diag/clients diag + write /sys/class/android_usb/android0/functions diag,adb,uac2_func,video + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + diff --git a/init.qcom.usb.sh b/init.qcom.usb.sh new file mode 100644 index 0000000..081a125 --- /dev/null +++ b/init.qcom.usb.sh @@ -0,0 +1,245 @@ +#!/vendor/bin/sh +# Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +# Set platform variables +if [ -f /sys/devices/soc0/hw_platform ]; then + soc_hwplatform=`cat /sys/devices/soc0/hw_platform` 2> /dev/null +else + soc_hwplatform=`cat /sys/devices/system/soc/soc0/hw_platform` 2> /dev/null +fi + +if [ -f /sys/devices/soc0/machine ]; then + soc_machine=`cat /sys/devices/soc0/machine` 2> /dev/null +else + soc_machine=`cat /sys/devices/system/soc/soc0/machine` 2> /dev/null +fi + +# +# Check ESOC for external MDM +# +# Note: currently only a single MDM is supported +# +if [ -d /sys/bus/esoc/devices ]; then +for f in /sys/bus/esoc/devices/*; do + if [ -d $f ]; then + if [ `grep -e "^MDM" -e "^SDX" $f/esoc_name` ]; then + esoc_link=`cat $f/esoc_link` + break + fi + fi +done +fi + +target=`getprop ro.board.platform` + +# soc_ids for 8937 +if [ -f /sys/devices/soc0/soc_id ]; then + soc_id=`cat /sys/devices/soc0/soc_id` +else + soc_id=`cat /sys/devices/system/soc/soc0/id` +fi + +# +# Allow USB enumeration with default PID/VID +# +baseband=`getprop ro.baseband` + +echo 1 > /sys/class/android_usb/f_mass_storage/lun/nofua +usb_config=`getprop persist.vendor.usb.config` +if [ "$usb_config" == "" ]; then #USB persist config not set, select default configuration + if [ "$esoc_link" != "" ]; then + setprop persist.vendor.usb.config diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb + else + case "$baseband" in + "apq") + setprop persist.vendor.usb.config diag,adb + ;; + *) + case "$soc_hwplatform" in + "Dragon" | "SBC") + setprop persist.vendor.usb.config diag,adb + ;; + *) + soc_machine=${soc_machine:0:3} + case "$soc_machine" in + "SDA") + setprop persist.vendor.usb.config diag,adb + ;; + *) + case "$target" in + "msm8996") + setprop persist.vendor.usb.config diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,adb + ;; + "msm8909") + setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb + ;; + "msm8937") + if [ -d /config/usb_gadget ]; then + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb + else + case "$soc_id" in + "313" | "320") + echo BAM2BAM_IPA > /sys/class/android_usb/android0/f_rndis_qc/rndis_transports + setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb + ;; + *) + setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb + ;; + esac + fi + ;; + "msm8953") + if [ -d /config/usb_gadget ]; then + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb + else + setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb + fi + ;; + "msm8998" | "sdm660" | "apq8098_latv") + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,adb + ;; + "sdm845" | "sdm710") + setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb + ;; + #"lito") + # setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,qdss,adb + #;; + *) + setprop persist.vendor.usb.config diag,adb + ;; + esac + ;; + esac + ;; + esac + ;; + esac + fi +fi + +# set device mode notification to USB driver for SA8150 Auto ADP +product=`getprop ro.build.product` + +case "$product" in + "lito_au") + echo peripheral > /sys/bus/platform/devices/a600000.ssusb/mode + ;; + *) + ;; +esac + +# check configfs is mounted or not +if [ -d /config/usb_gadget ]; then + # Chip-serial is used for unique MSM identification in Product string + msm_serial=`cat /sys/devices/soc0/serial_number`; + msm_serial_hex=`printf %08X $msm_serial` + machine_type=`cat /sys/devices/soc0/machine` + product_string="$machine_type-$soc_hwplatform _SN:$msm_serial_hex" + echo "$product_string" > /config/usb_gadget/g1/strings/0x409/product + + # ADB requires valid iSerialNumber; if ro.serialno is missing, use dummy + serialnumber=`cat /config/usb_gadget/g1/strings/0x409/serialnumber` 2> /dev/null + if [ "$serialnumber" == "" ]; then + serialno=1234567 + echo $serialno > /config/usb_gadget/g1/strings/0x409/serialnumber + fi +fi + +# +# Initialize RNDIS Diag option. If unset, set it to 'none'. +# +diag_extra=`getprop persist.vendor.usb.config.extra` +if [ "$diag_extra" == "" ]; then + setprop persist.vendor.usb.config.extra none +fi + +# enable rps cpus on msm8937 target +setprop vendor.usb.rps_mask 0 +case "$soc_id" in + "294" | "295" | "353" | "354") + setprop vendor.usb.rps_mask 40 + ;; +esac + +# +# Initialize UVC conifguration. +# +if [ -d /config/usb_gadget/g1/functions/uvc.0 ]; then + cd /config/usb_gadget/g1/functions/uvc.0 + + echo 3072 > streaming_maxpacket + echo 1 > streaming_maxburst + mkdir control/header/h + ln -s control/header/h control/class/fs/ + ln -s control/header/h control/class/ss + + mkdir -p streaming/uncompressed/u/360p + echo "666666\n1000000\n5000000\n" > streaming/uncompressed/u/360p/dwFrameInterval + + mkdir -p streaming/uncompressed/u/720p + echo 1280 > streaming/uncompressed/u/720p/wWidth + echo 720 > streaming/uncompressed/u/720p/wWidth + echo 29491200 > streaming/uncompressed/u/720p/dwMinBitRate + echo 29491200 > streaming/uncompressed/u/720p/dwMaxBitRate + echo 1843200 > streaming/uncompressed/u/720p/dwMaxVideoFrameBufferSize + echo 5000000 > streaming/uncompressed/u/720p/dwDefaultFrameInterval + echo "5000000\n" > streaming/uncompressed/u/720p/dwFrameInterval + + mkdir -p streaming/mjpeg/m/360p + echo "666666\n1000000\n5000000\n" > streaming/mjpeg/m/360p/dwFrameInterval + + mkdir -p streaming/mjpeg/m/720p + echo 1280 > streaming/mjpeg/m/720p/wWidth + echo 720 > streaming/mjpeg/m/720p/wWidth + echo 29491200 > streaming/mjpeg/m/720p/dwMinBitRate + echo 29491200 > streaming/mjpeg/m/720p/dwMaxBitRate + echo 1843200 > streaming/mjpeg/m/720p/dwMaxVideoFrameBufferSize + echo 5000000 > streaming/mjpeg/m/720p/dwDefaultFrameInterval + echo "5000000\n" > streaming/mjpeg/m/720p/dwFrameInterval + + echo 0x04 > /config/usb_gadget/g1/functions/uvc.0/streaming/mjpeg/m/bmaControls + + mkdir -p streaming/h264/h/960p + echo 1920 > streaming/h264/h/960p/wWidth + echo 960 > streaming/h264/h/960p/wWidth + echo 40 > streaming/h264/h/960p/bLevelIDC + echo "333667\n" > streaming/h264/h/960p/dwFrameInterval + + mkdir -p streaming/h264/h/1920p + echo "333667\n" > streaming/h264/h/1920p/dwFrameInterval + + mkdir streaming/header/h + ln -s streaming/uncompressed/u streaming/header/h + ln -s streaming/mjpeg/m streaming/header/h + ln -s streaming/h264/h streaming/header/h + ln -s streaming/header/h streaming/class/fs/ + ln -s streaming/header/h streaming/class/hs/ + ln -s streaming/header/h streaming/class/ss/ +fi diff --git a/init.qcom.wlan.sh b/init.qcom.wlan.sh new file mode 100644 index 0000000..92dd25b --- /dev/null +++ b/init.qcom.wlan.sh @@ -0,0 +1,6 @@ +#! /vendor/bin/sh + +wlan_driver_version=`cat /sys/kernel/wlan/wlan/driver_version` +setprop vendor.wlan.driver.version "${wlan_driver_version:0:91}" +wlan_fw_version=`cat /sys/kernel/wlan/fw/1/version` +setprop vendor.wlan.firmware.version "${wlan_fw_version:0:91}" diff --git a/init.qti.getbootdevice.sh b/init.qti.getbootdevice.sh new file mode 100644 index 0000000..fa6f740 --- /dev/null +++ b/init.qti.getbootdevice.sh @@ -0,0 +1,55 @@ +#!/vendor/bin/sh +# Copyright (c) 2018, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +#Script to find if the boot device is SD card or UFS + + +echo "Bootdevice setup: Starting..." > /dev/kmsg + +bootdevice=`getprop ro.boot.bootdevice` + +if [ "$bootdevice" = "8804000.sdhci" ]; then + ln -s /dev/block/platform/soc/8804000.sdhci /dev/block/bootdevice + echo "Waiting for SDHCI device to show up..." > /dev/kmsg + while [ ! -e "/dev/block/platform/soc/8804000.sdhci" ]; do + sleep 1 + done +elif [ "$bootdevice" = "1d84000.ufshc" ]; then + ln -s /dev/block/platform/soc/1d84000.ufshc /dev/block/bootdevice + echo "Waiting for UFS device to show up..." > /dev/kmsg + while [ ! -e "/dev/block/platform/soc/1d84000.ufshc" ]; do + sleep 1; + done +else + while true; do + echo "Boot failure - invalid bootdevice ($bootdevice)" > /dev/kmsg + sleep 30; + done +fi +echo "Bootdevice setup: Completed ($bootdevice)" > /dev/kmsg diff --git a/init.qti.qseecomd.sh b/init.qti.qseecomd.sh new file mode 100644 index 0000000..eb2eec9 --- /dev/null +++ b/init.qti.qseecomd.sh @@ -0,0 +1,35 @@ +#!/vendor/bin/sh +# Copyright (c) 2017, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# + +while [ "$registered" != "true" ] +do + sleep 0.1 + registered="`getprop vendor.sys.listeners.registered`" +done diff --git a/init.radio.sh b/init.radio.sh new file mode 100644 index 0000000..df54a66 --- /dev/null +++ b/init.radio.sh @@ -0,0 +1,38 @@ +#! /vendor/bin/sh + +# +# Copy qcril.db if needed for RIL +# +if [ -f /vendor/radio/qcril_database/qcril.db -a ! -f /data/vendor/radio/qcril.db ]; then + cp /vendor/radio/qcril_database/qcril.db /data/vendor/radio/qcril.db + chown -h radio.radio /data/vendor/radio/qcril.db +fi +echo 1 > /data/vendor/radio/db_check_done + +cp /vendor/radio/qcril_database/qcril.db /data/vendor/radio/qcril_prebuilt.db +chown radio.radio /data/vendor/radio/qcril_prebuilt.db +chmod 0660 /data/vendor/radio/qcril_prebuilt.db + +# +# Make modem config folder and copy firmware config to that folder for RIL +# +if [ -f /data/vendor/radio/ver_info.txt ]; then + prev_version_info=`cat /data/vendor/radio/ver_info.txt` +else + prev_version_info="" +fi + +cur_version_info=`cat /vendor/firmware_mnt/verinfo/ver_info.txt` +if [ ! -f /vendor/firmware_mnt/verinfo/ver_info.txt -o "$prev_version_info" != "$cur_version_info" ]; then + rm -rf /data/vendor/radio/modem_config + mkdir /data/vendor/radio/modem_config + chmod 770 /data/vendor/radio/modem_config + cp -r /vendor/firmware_mnt/image/modem_pr/mcfg/configs/* /data/vendor/radio/modem_config + chown -hR radio.radio /data/vendor/radio/modem_config + cp /vendor/firmware_mnt/verinfo/ver_info.txt /data/vendor/radio/ver_info.txt + chown radio.radio /data/vendor/radio/ver_info.txt +fi +cp /vendor/firmware_mnt/image/modem_pr/mbn_ota.txt /data/vendor/radio/modem_config +chown radio.radio /data/vendor/radio/modem_config/mbn_ota.txt +echo 1 > /data/vendor/radio/copy_complete + diff --git a/init.recovery.device.rc b/init.recovery.device.rc new file mode 100644 index 0000000..092221a --- /dev/null +++ b/init.recovery.device.rc @@ -0,0 +1,10 @@ +on fs + wait /dev/block/platform/soc/${ro.boot.bootdevice} + symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice + +on init + setprop sys.usb.configfs 1 + # Don't lose recovery logs- keep warm reset for coming out of recovery. + write /sys/module/msm_poweroff/parameters/warm_reset 1 + # Enable thermal mitigation + write /sys/devices/virtual/thermal/tz-by-name/backup-charge/mode enabled diff --git a/init.sensors.sh b/init.sensors.sh new file mode 100644 index 0000000..6325038 --- /dev/null +++ b/init.sensors.sh @@ -0,0 +1,6 @@ +#! /vendor/bin/sh + +version=`grep -ao "OEM_IMAGE_VERSION_STRING[ -~]*" \ + /vendor/firmware/slpi.b04 | \ + sed -e s/OEM_IMAGE_VERSION_STRING=SLPI.version.// -e s/\(.*\).//` +setprop sys.slpi.firmware.version "$version" diff --git a/json-c/AUTHORS b/json-c/AUTHORS new file mode 100644 index 0000000..b389989 --- /dev/null +++ b/json-c/AUTHORS @@ -0,0 +1,5 @@ +Michael Clark +Jehiah Czebotar +Eric Haszlakiewicz +C. Watford (christopher.watford@gmail.com) + diff --git a/json-c/Android.configure.mk b/json-c/Android.configure.mk new file mode 100644 index 0000000..a6265ad --- /dev/null +++ b/json-c/Android.configure.mk @@ -0,0 +1,39 @@ +# This file is the top android makefile for all sub-modules. + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +json_c_TOP := $(LOCAL_PATH) + +JSON_C_BUILT_SOURCES := Android.mk + +JSON_C_BUILT_SOURCES := $(patsubst %, $(abspath $(json_c_TOP))/%, $(JSON_C_BUILT_SOURCES)) + +.PHONY: json-c-configure json-c-configure-real +json-c-configure-real: + echo $(JSON_C_BUILT_SOURCES) + cd $(json_c_TOP) ; \ + $(abspath $(json_c_TOP))/autogen.sh && \ + CC="$(CONFIGURE_CC)" \ + CFLAGS="$(CONFIGURE_CFLAGS)" \ + LD=$(TARGET_LD) \ + LDFLAGS="$(CONFIGURE_LDFLAGS)" \ + CPP=$(CONFIGURE_CPP) \ + CPPFLAGS="$(CONFIGURE_CPPFLAGS)" \ + PKG_CONFIG_LIBDIR=$(CONFIGURE_PKG_CONFIG_LIBDIR) \ + PKG_CONFIG_TOP_BUILD_DIR=/ \ + ac_cv_func_malloc_0_nonnull=yes \ + ac_cv_func_realloc_0_nonnull=yes \ + $(abspath $(json_c_TOP))/$(CONFIGURE) --host=$(CONFIGURE_HOST) \ + --prefix=/system \ + && \ + for file in $(JSON_C_BUILT_SOURCES); do \ + rm -f $$file && \ + make -C $$(dirname $$file) $$(basename $$file) ; \ + done + +json-c-configure: json-c-configure-real + +PA_CONFIGURE_TARGETS += json-c-configure + +-include $(json_c_TOP)/Android.mk diff --git a/json-c/Android.mk b/json-c/Android.mk new file mode 100644 index 0000000..139a10c --- /dev/null +++ b/json-c/Android.mk @@ -0,0 +1,35 @@ +LIBJSON_ROOT := $(call my-dir) +include $(CLEAR_VARS) +LOCAL_MODULE := libjson +LOCAL_PATH := $(LIBJSON_ROOT) +LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +LOCAL_COPY_HEADERS_TO := libjson/inc +LOCAL_COPY_HEADERS := bits.h \ + config.h \ + debug.h \ + linkhash.h \ + arraylist.h \ + json.h \ + json_config.h \ + json_inttypes.h \ + json_util.h \ + json_object.h \ + json_tokener.h \ + json_object_iterator.h \ + json_c_version.h +LOCAL_SRC_FILES := arraylist.c \ + debug.c \ + json_c_version.c \ + json_object.c \ + json_object_iterator.c \ + json_tokener.c \ + json_util.c \ + libjson.c \ + linkhash.c \ + printbuf.c \ + random_seed.c +LOCAL_SHARED_LIBRARIES := libcutils libutils +LOCAL_MODULE_TAG := optional +LOCAL_VENDOR_MODULE := true +include $(BUILD_SHARED_LIBRARY) diff --git a/json-c/COPYING b/json-c/COPYING new file mode 100644 index 0000000..740d125 --- /dev/null +++ b/json-c/COPYING @@ -0,0 +1,42 @@ + +Copyright (c) 2009-2012 Eric Haszlakiewicz + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +---------------------------------------------------------------- + +Copyright (c) 2004, 2005 Metaparadigm Pte Ltd + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/json-c/ChangeLog b/json-c/ChangeLog new file mode 100644 index 0000000..584ed1f --- /dev/null +++ b/json-c/ChangeLog @@ -0,0 +1,218 @@ + +NEXT.VERSION + + ...nothing yet... + +0.12 + + * Address security issues: + * CVE-2013-6371: hash collision denial of service + * CVE-2013-6370: buffer overflow if size_t is larger than int + + * Avoid potential overflow in json_object_get_double + + * Eliminate the mc_abort() function and MC_ABORT macro. + + * Make the json_tokener_errors array local. It has been deprecated for + a while, and json_tokener_error_desc() should be used instead. + + * change the floating point output format to %.17g so values with + more than 6 digits show up in the output. + + * Remove the old libjson.so name compatibility support. The library is + only created as libjson-c.so now and headers are only installed + into the ${prefix}/json-c directory. + + * When supported by the linker, add the -Bsymbolic-functions flag. + + * Various changes to fix the build on MSVC. + + * Make strict mode more strict: + * number must not start with 0 + * no single-quote strings + * no comments + * trailing char not allowed + * only allow lowercase literals + + * Added a json_object_new_double_s() convenience function to allow + an exact string representation of a double to be specified when + creating the object and use it in json_tokener_parse_ex() so + a re-serialized object more exactly matches the input. + + * Add support NaN and Infinity + + +0.11 + + * IMPORTANT: the name of the library has changed to libjson-c.so and + the header files are now in include/json-c. + The pkgconfig name has also changed from json to json-c. + You should change your build to use appropriate -I and -l options. + A compatibility shim is in place so builds using the old name will + continue to work, but that will be removed in the next release. + * Maximum recursion depth is now a runtime option. + json_tokener_new() is provided for compatibility. + json_tokener_new_ex(depth) + * Include json_object_iterator.h in the installed headers. + * Add support for building on Android. + * Rewrite json_object_object_add to replace just the value if the key already exists so keys remain valid. + * Make it safe to delete keys while iterating with the json_object_object_foreach macro. + * Add a json_set_serializer() function to allow the string output of a json_object to be customized. + * Make float parsing locale independent. + * Add a json_tokener_set_flags() function and a JSON_TOKENER_STRICT flag. + * Enable -Werror when building. + * speed improvements to parsing 64-bit integers on systems with working sscanf + * Add a json_object_object_length function. + * Fix a bug (buffer overrun) when expanding arrays to more than 64 entries. + +0.10 + + * Add a json_object_to_json_string_ext() function to allow output to be + formatted in a more human readable form. + * Add json_object_object_get_ex(), a NULL-safe get object method, to be able + to distinguish between a key not present and the value being NULL. + * Add an alternative iterator implementation, see json_object_iterator.h + * Make json_object_iter public to enable external use of the + json_object_object_foreachC macro. + * Add a printbuf_memset() function to provide an effecient way to set and + append things like whitespace indentation. + * Adjust json_object_is_type and json_object_get_type so they return + json_type_null for NULL objects and handle NULL passed to + json_objct_object_get(). + * Rename boolean type to json_bool. + * Fix various compile issues for Visual Studio and MinGW. + * Allow json_tokener_parse_ex() to be re-used to parse multiple object. + Also, fix some parsing issues with capitalized hexadecimal numbers and + number in E notation. + * Add json_tokener_get_error() and json_tokener_error_desc() to better + encapsulate the process of retrieving errors while parsing. + * Various improvements to the documentation of many functions. + * Add new json_object_array_sort() function. + * Fix a bug in json_object_get_int(), which would incorrectly return 0 + when called on a string type object. + Eric Haszlakiewicz + * Add a json_type_to_name() function. + Eric Haszlakiewicz + * Add a json_tokener_parse_verbose() function. + Jehiah Czebotar + * Improve support for null bytes within JSON strings. + Jehiah Czebotar + * Fix file descriptor leak if memory allocation fails in json_util + Zachary Blair, zack_blair at hotmail dot com + * Add int64 support. Two new functions json_object_net_int64 and + json_object_get_int64. Binary compatibility preserved. + Eric Haszlakiewicz, EHASZLA at transunion com + Rui Miguel Silva Seabra, rms at 1407 dot org + * Fix subtle bug in linkhash where lookup could hang after all slots + were filled then successively freed. + Spotted by Jean-Marc Naud, j dash m at newtraxtech dot com + * Make json_object_from_file take const char *filename + Spotted by Vikram Raj V, vsagar at attinteractive dot com + * Add handling of surrogate pairs (json_tokener.c, test4.c, Makefile.am) + Brent Miller, bdmiller at yahoo dash inc dot com + * Correction to comment describing printbuf_memappend in printbuf.h + Brent Miller, bdmiller at yahoo dash inc dot com + +0.9 + * Add README.html README-WIN32.html config.h.win32 to Makefile.am + Michael Clark, + * Add const qualifier to the json_tokener_parse functions + Eric Haszlakiewicz, EHASZLA at transunion dot com + * Rename min and max so we can never clash with C or C++ std library + Ian Atha, thatha at yahoo dash inc dot com + * Fix any noticeable spelling or grammar errors. + * Make sure every va_start has a va_end. + * Check all pointers for validity. + Erik Hovland, erik at hovland dot org + * Fix json_object_get_boolean to return false for empty string + Spotted by Vitaly Kruglikov, Vitaly dot Kruglikov at palm dot com + * optimizations to json_tokener_parse_ex(), printbuf_memappend() + Brent Miller, bdmiller at yahoo dash inc dot com + * Disable REFCOUNT_DEBUG by default in json_object.c + * Don't use this as a variable, so we can compile with a C++ compiler + * Add casts from void* to type of assignment when using malloc + * Add #ifdef __cplusplus guards to all of the headers + * Add typedefs for json_object, json_tokener, array_list, printbuf, lh_table + Michael Clark, + * Null pointer dereference fix. Fix json_object_get_boolean strlen test + to not return TRUE for zero length string. Remove redundant includes. + Erik Hovland, erik at hovland dot org + * Fixed warning reported by adding -Wstrict-prototypes + -Wold-style-definition to the compilatin flags. + Dotan Barak, dotanba at gmail dot com + * Add const correctness to public interfaces + Gerard Krol, g dot c dot krol at student dot tudelft dot nl + +0.8 + * Add va_end for every va_start + Dotan Barak, dotanba at gmail dot com + * Add macros to enable compiling out debug code + Geoffrey Young, geoff at modperlcookbook dot org + * Fix bug with use of capital E in numbers with exponents + Mateusz Loskot, mateusz at loskot dot net + * Add stddef.h include + * Patch allows for json-c compile with -Werror and not fail due to + -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations + Geoffrey Young, geoff at modperlcookbook dot org + +0.7 + * Add escaping of backslash to json output + * Add escaping of foward slash on tokenizing and output + * Changes to internal tokenizer from using recursion to + using a depth state structure to allow incremental parsing + +0.6 + * Fix bug in escaping of control characters + Johan Björklund, johbjo09 at kth dot se + * Remove include "config.h" from headers (should only + be included from .c files) + Michael Clark + +0.5 + * Make headers C++ compatible by change *this to *obj + * Add ifdef C++ extern "C" to headers + * Use simpler definition of min and max in bits.h + Larry Lansing, llansing at fuzzynerd dot com + + * Remove automake 1.6 requirement + * Move autogen commands into autogen.sh. Update README + * Remove error pointer special case for Windows + * Change license from LGPL to MIT + Michael Clark + +0.4 + * Fix additional error case in object parsing + * Add back sign reversal in nested object parse as error pointer + value is negative, while error value is positive. + Michael Clark + +0.3 + * fix pointer arithmetic bug for error pointer check in is_error() macro + * fix type passed to printbuf_memappend in json_tokener + * update autotools bootstrap instructions in README + Michael Clark + +0.2 + * printbuf.c - C. Watford (christopher.watford@gmail.com) + Added a Win32/Win64 compliant implementation of vasprintf + * debug.c - C. Watford (christopher.watford@gmail.com) + Removed usage of vsyslog on Win32/Win64 systems, needs to be handled + by a configure script + * json_object.c - C. Watford (christopher.watford@gmail.com) + Added scope operator to wrap usage of json_object_object_foreach, this + needs to be rethought to be more ANSI C friendly + * json_object.h - C. Watford (christopher.watford@gmail.com) + Added Microsoft C friendly version of json_object_object_foreach + * json_tokener.c - C. Watford (christopher.watford@gmail.com) + Added a Win32/Win64 compliant implementation of strndup + * json_util.c - C. Watford (christopher.watford@gmail.com) + Added cast and mask to suffice size_t v. unsigned int conversion + correctness + * json_tokener.c - sign reversal issue on error info for nested object parse + spotted by Johan Björklund (johbjo09 at kth.se) + * json_object.c - escape " in json_escape_str + * Change to automake and libtool to build shared and static library + Michael Clark + +0.1 + * initial release diff --git a/json-c/Doxyfile b/json-c/Doxyfile new file mode 100644 index 0000000..da39aca --- /dev/null +++ b/json-c/Doxyfile @@ -0,0 +1,1153 @@ +# Doxyfile 1.3.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = json-c + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.12.99 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = *.h + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/json-c/Makefile.am b/json-c/Makefile.am new file mode 100644 index 0000000..26ced27 --- /dev/null +++ b/json-c/Makefile.am @@ -0,0 +1,74 @@ +include Makefile.am.inc + +EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj +SUBDIRS = . tests + +lib_LTLIBRARIES = libjson-c.la + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = json-c.pc + +libjson_cincludedir = $(includedir)/json-c +libjson_cinclude_HEADERS = \ + arraylist.h \ + bits.h \ + debug.h \ + json.h \ + json_config.h \ + json_c_version.h \ + json_inttypes.h \ + json_object.h \ + json_object_iterator.h \ + json_object_private.h \ + json_tokener.h \ + json_util.h \ + linkhash.h \ + printbuf.h \ + random_seed.h + +#libjsonx_includedir = $(libdir)/json-c-@VERSION@ +# +#libjsonx_include_HEADERS = \ +# json_config.h + +libjson_c_la_LDFLAGS = -version-info 2:0:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@ + +libjson_c_la_SOURCES = \ + arraylist.c \ + debug.c \ + json_c_version.c \ + json_object.c \ + json_object_iterator.c \ + json_tokener.c \ + json_util.c \ + linkhash.c \ + printbuf.c \ + random_seed.c + + +distclean-local: + -rm -rf $(testsubdir) + -rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub depcomp install-sh ltmain.sh missing + -rm -f INSTALL test-driver tests/Makefile.in compile + +maintainer-clean-local: + -rm -rf configure + +uninstall-local: + rm -rf "$(DESTDIR)@includedir@/json-c" + rm -f "$(DESTDIR)@includedir@/json" + +ANDROID_CFLAGS = -I$(top_srcdir) -DHAVE_CONFIG_H + +Android.mk: Makefile.am + androgenizer -:PROJECT json-c \ + -:SHARED libjson-c \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libjson_c_la_SOURCES) $(nodist_libjson_c_la_SOURCES) \ + -:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libjson_c_la_CFLAGS) \ + -:LDFLAGS $(libjson_c_la_LDFLAGS) $(libjson_c_la_LIBADD) \ + -:HEADER_TARGET json-c \ + -:HEADERS $(libjson_cinclude_HEADERS) \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + > $@ diff --git a/json-c/Makefile.am.inc b/json-c/Makefile.am.inc new file mode 100644 index 0000000..fec591b --- /dev/null +++ b/json-c/Makefile.am.inc @@ -0,0 +1,2 @@ +AM_CFLAGS = -Wall -Werror -Wno-error=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -std=gnu99 -D_GNU_SOURCE -D_REENTRANT + diff --git a/json-c/README b/json-c/README new file mode 100644 index 0000000..e69de29 diff --git a/json-c/README-WIN32.html b/json-c/README-WIN32.html new file mode 100644 index 0000000..abdb39e --- /dev/null +++ b/json-c/README-WIN32.html @@ -0,0 +1,50 @@ + + + + JSON-C - A JSON implementation in C - Win32 specific notes + + + +

Windows specific notes for JSON-C

+

Please send Win32 bug reports to christopher.watford@gmail.com

+

Win32 Specific Changes:

+
    +
  • + Various functions have been redefined to their Win32 version (i.e. open + on win32 is _open)
  • +
  • + Implemented missing functions from MS's libc (i.e. vasprintf)
  • +
  • + Added code to allow Win64 support without integer resizing issues, this + probably makes it much nicer on 64bit machines everywhere (i.e. using ptrdiff_t + for pointer math)
  • +
+

Porting Changelog:

+
+
printbuf.c - C. Watford (christopher.watford@gmail.com)
+
+ Added a Win32/Win64 compliant implementation of vasprintf
+
debug.c - C. Watford (christopher.watford@gmail.com)
+
+ Removed usage of vsyslog on Win32/Win64 systems, needs to be handled + by a configure script
+
json_object.c - C. Watford (christopher.watford@gmail.com)
+
+ Added scope operator to wrap usage of json_object_object_foreach, this needs to be + rethought to be more ANSI C friendly
+
json_object.h - C. Watford (christopher.watford@gmail.com)
+
+ Added Microsoft C friendly version of json_object_object_foreach
+
json_tokener.c - C. Watford (christopher.watford@gmail.com)
+
+ Added a Win32/Win64 compliant implementation of strndup
+
json_util.c - C. Watford (christopher.watford@gmail.com)
+
+ Added cast and mask to suffice size_t v. unsigned int + conversion correctness
+
+

This program is free software; you can redistribute it and/or modify it under + the terms of the MIT License. See COPYING for details.

+
+ + diff --git a/json-c/README.html b/json-c/README.html new file mode 100644 index 0000000..dc696af --- /dev/null +++ b/json-c/README.html @@ -0,0 +1,34 @@ + + + + JSON-C - A JSON implementation in C + + + +

JSON-C - A JSON implementation in C

+ +

Overview

+

JSON-C implements a reference counting object model that allows you to easily + construct JSON objects in C, output them as JSON formatted strings and parse + JSON formatted strings back into the C representation of JSON objects.

+ +

Building

+

To setup JSON-C to build on your system please run configure and make.

+

If you are on Win32 and are not using the VS project file, be sure + to rename config.h.win32 to config.h before building.

+ +

Documentation

+

Doxygen generated documentation exists here + and Win32 specific notes can be found here.

+ +

GIT Reposository

+

git clone https://github.com/json-c/json-c.git

+ +

Mailing List

+ Send email to json-c <at> googlegroups <dot> com

+ +

License

+

This program is free software; you can redistribute it and/or modify it under the terms of the MIT License..

+
+ + diff --git a/json-c/README.md b/json-c/README.md new file mode 100644 index 0000000..bf4d2e4 --- /dev/null +++ b/json-c/README.md @@ -0,0 +1,63 @@ +`json-c` +======== + +Building on Unix with `git`, `gcc` and `autotools` +-------------------------------------------------- + +Home page for json-c: https://github.com/json-c/json-c/wiki + +Caution: do **NOT** use sources from svn.metaparadigm.com, +they are old. + +Prerequisites: + + - `gcc`, `clang`, or another C compiler + - `libtool` + +If you're not using a release tarball, you'll also need: + + - `autoconf` (`autoreconf`) + - `automake` + +Make sure you have a complete `libtool` install, including `libtoolize`. + +`json-c` GitHub repo: https://github.com/json-c/json-c + +```bash +$ git clone https://github.com/json-c/json-c.git +$ cd json-c +$ sh autogen.sh +``` + +followed by + +```bash +$ ./configure +$ make +$ make install +``` + +To build and run the test programs: + +```bash +$ make check +``` + +Linking to `libjson-c` +---------------------- + +If your system has `pkgconfig`, +then you can just add this to your `makefile`: + +```make +CFLAGS += $(shell pkg-config --cflags json-c) +LDFLAGS += $(shell pkg-config --libs json-c) +``` + +Without `pkgconfig`, you would do something like this: + +```make +JSON_C_DIR=/path/to/json_c/install +CFLAGS += -I$(JSON_C_DIR)/include/json-c +LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c +``` diff --git a/json-c/RELEASE_CHECKLIST.txt b/json-c/RELEASE_CHECKLIST.txt new file mode 100644 index 0000000..4713258 --- /dev/null +++ b/json-c/RELEASE_CHECKLIST.txt @@ -0,0 +1,132 @@ + +Release checklist: + +release=0.12 +git clone https://github.com/json-c/json-c json-c-${release} +cd json-c-${release} + +Check that the compile works on Linux +Check that the compile works on NetBSD +Check that the compile works on Windows +Check ChangeLog to see if anything should be added. +Make any fixes/changes *before* branching. + + git branch json-c-${release} + git checkout json-c-${release} + +------------ + +Update the version in json_c_version.h +Update the version in Doxyfile +Update the version in configure.ac + Use ${release}. + +Update the libjson_la_LDFLAGS line in Makefile.am to the new version. + Generally, unless we're doing a major release, change: + -version-info x:y:z + to + -version-info x:y+1:z + +------------ + +Generate the configure script and other files: + sh autogen.sh + git add -f Makefile.in aclocal.m4 config.guess \ + config.sub configure depcomp install-sh \ + ltmain.sh missing tests/Makefile.in \ + INSTALL + + # check for anything else to be added: + git status --ignored + git commit + +------------ + +Generate the doxygen documentation: + doxygen + git add -f doc + git commit doc + +------------ + +cd .. +echo .git > excludes +echo autom4te.cache >> excludes +tar -czf json-c-${release}.tar.gz -X excludes json-c-${release} + +echo doc >> excludes +tar -czf json-c-${release}-nodoc.tar.gz -X excludes json-c-${release} + +------------ + +Tag the branch: +cd json-c-${release} +git tag -a json-c-${release}-$(date +%Y%m%d) -m "Release json-c-${release}" + +git push origin json-c-${release} +git push --tags + +------------ + +Go to Amazon S3 service at: + https://console.aws.amazon.com/s3/ + +Upload the two tarballs in the json-c_releases folder. + When uploading, use "Reduced Redundancy", and make the uploaded files publicly accessible. + +Logout of Amazon S3, and verify that the files are visible. + https://s3.amazonaws.com/json-c_releases/releases/index.html + +=================================== + +Post-release checklist: + +git checkout master +Add new section to ChangeLog +Update the version in json_c_version.h +Update the version in Doxyfile +Update the version in configure.ac + Use ${release}.99 to indicate a version "newer" than anything on the branch. + +Leave the libjson_la_LDFLAGS line in Makefile.am alone. + For more details see: + http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html + +------------ + +Update the gh-pages branch with new docs: + +cd json-c-${release} +git checkout json-c-${release} +cd .. + +git clone -b gh-pages https://github.com/json-c/json-c json-c-pages +cd json-c-pages +mkdir json-c-${release} +cp -R ../json-c-${release}/doc json-c-${release}/. +cp ../json-c-${release}/README-WIN32.html json-c-${release}/. +git add json-c-${release} +git commit + +vi index.html + Add/change links to current release. + +git commit index.html + +git push + +------------ + +Update checksums on wiki page. + +cd .. +openssl sha -sha256 json-c*gz +openssl md5 json-c*gz + +Copy and paste this output into the wiki page at: + https://github.com/json-c/json-c/wiki + +------------ + +Send an email to the mailing list. + diff --git a/json-c/arraylist.c b/json-c/arraylist.c new file mode 100644 index 0000000..1d899fa --- /dev/null +++ b/json-c/arraylist.c @@ -0,0 +1,102 @@ +/* + * $Id: arraylist.c,v 1.4 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include "config.h" + +#ifdef STDC_HEADERS +# include +# include +#endif /* STDC_HEADERS */ + +#if defined(HAVE_STRINGS_H) && !defined(_STRING_H) && !defined(__USE_BSD) +# include +#endif /* HAVE_STRINGS_H */ + +#include "arraylist.h" + +struct array_list* +array_list_new(array_list_free_fn *free_fn) +{ + struct array_list *arr; + + arr = (struct array_list*)calloc(1, sizeof(struct array_list)); + if(!arr) return NULL; + arr->size = ARRAY_LIST_DEFAULT_SIZE; + arr->length = 0; + arr->free_fn = free_fn; + if(!(arr->array = (void**)calloc(sizeof(void*), arr->size))) { + free(arr); + return NULL; + } + return arr; +} + +extern void +array_list_free(struct array_list *arr) +{ + int i; + for(i = 0; i < arr->length; i++) + if(arr->array[i]) arr->free_fn(arr->array[i]); + free(arr->array); + free(arr); +} + +void* +array_list_get_idx(struct array_list *arr, int i) +{ + if(i >= arr->length) return NULL; + return arr->array[i]; +} + +static int array_list_expand_internal(struct array_list *arr, int max) +{ + void *t; + int new_size; + + if(max < arr->size) return 0; + new_size = arr->size << 1; + if (new_size < max) + new_size = max; + if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1; + arr->array = (void**)t; + (void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*)); + arr->size = new_size; + return 0; +} + +int +array_list_put_idx(struct array_list *arr, int idx, void *data) +{ + if(array_list_expand_internal(arr, idx+1)) return -1; + if(arr->array[idx]) arr->free_fn(arr->array[idx]); + arr->array[idx] = data; + if(arr->length <= idx) arr->length = idx + 1; + return 0; +} + +int +array_list_add(struct array_list *arr, void *data) +{ + return array_list_put_idx(arr, arr->length, data); +} + +void +array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *)) +{ + qsort(arr->array, arr->length, sizeof(arr->array[0]), + (int (*)(const void *, const void *))sort_fn); +} + +int +array_list_length(struct array_list *arr) +{ + return arr->length; +} diff --git a/json-c/arraylist.h b/json-c/arraylist.h new file mode 100644 index 0000000..4f3113c --- /dev/null +++ b/json-c/arraylist.h @@ -0,0 +1,56 @@ +/* + * $Id: arraylist.h,v 1.4 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _arraylist_h_ +#define _arraylist_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ARRAY_LIST_DEFAULT_SIZE 32 + +typedef void (array_list_free_fn) (void *data); + +struct array_list +{ + void **array; + int length; + int size; + array_list_free_fn *free_fn; +}; + +extern struct array_list* +array_list_new(array_list_free_fn *free_fn); + +extern void +array_list_free(struct array_list *al); + +extern void* +array_list_get_idx(struct array_list *al, int i); + +extern int +array_list_put_idx(struct array_list *al, int i, void *data); + +extern int +array_list_add(struct array_list *al, void *data); + +extern int +array_list_length(struct array_list *al); + +extern void +array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *)); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/autogen.sh b/json-c/autogen.sh new file mode 100755 index 0000000..69e765a --- /dev/null +++ b/json-c/autogen.sh @@ -0,0 +1,13 @@ +#!/bin/sh +autoreconf -v --install || exit 1 + +# If there are any options, assume the user wants to run configure. +# To run configure w/o any options, use ./autogen.sh --configure +if [ $# -gt 0 ] ; then + case "$1" in + --conf*) + shift 1 + ;; + esac + exec ./configure "$@" +fi diff --git a/json-c/bits.h b/json-c/bits.h new file mode 100644 index 0000000..d14a1db --- /dev/null +++ b/json-c/bits.h @@ -0,0 +1,35 @@ +/** + * @file + * @deprecated Use json_util.h instead. + * + * $Id: bits.h,v 1.10 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _bits_h_ +#define _bits_h_ + +/** + * @deprecated + */ +#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9) +/** + * @deprecated + */ +#define error_ptr(error) ((void*)error) +/** + * @deprecated + */ +#define error_description(error) (json_tokener_get_error(error)) +/** + * @deprecated + */ +#define is_error(ptr) (ptr == NULL) + +#endif diff --git a/json-c/check.log b/json-c/check.log new file mode 100644 index 0000000..3c73d2a --- /dev/null +++ b/json-c/check.log @@ -0,0 +1,2 @@ +HEAD is now at 6442a2f... json-c: Add libjson to the vendor image +HEAD is now at 6442a2f... json-c: Add libjson to the vendor image diff --git a/json-c/config.h b/json-c/config.h new file mode 100644 index 0000000..f958d44 --- /dev/null +++ b/json-c/config.h @@ -0,0 +1,178 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Enable RDRANR Hardware RNG Hash Seed */ +/* #undef ENABLE_RDRAND */ + +/* Define if .gnu.warning accepts long strings. */ +/* #undef HAS_GNU_WARNING_LONG */ + +/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you + don't. */ +#define HAVE_DECL_INFINITY 1 + +/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. + */ +#define HAVE_DECL_ISINF 1 + +/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. + */ +#define HAVE_DECL_ISNAN 1 + +/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */ +#define HAVE_DECL_NAN 1 + +/* Define to 1 if you have the declaration of `_finite', and to 0 if you + don't. */ +#define HAVE_DECL__FINITE 0 + +/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't. + */ +#define HAVE_DECL__ISNAN 0 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ENDIAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `open' function. */ +#define HAVE_OPEN 1 + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#define HAVE_REALLOC 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_CDEFS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define HAVE_VASPRINTF 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the `vsyslog' function. */ +#define HAVE_VSYSLOG 1 + +/* Public define for json_inttypes.h */ +#define JSON_C_HAVE_INTTYPES_H 1 + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "json-c" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "json-c@googlegroups.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "json-c" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "json-c 0.12.99" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "json-c" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.12.99" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "0.12.99" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to rpl_malloc if the replacement function should be used. */ +/* #undef malloc */ + +/* Define to rpl_realloc if the replacement function should be used. */ +/* #undef realloc */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/json-c/config.h.in b/json-c/config.h.in new file mode 100644 index 0000000..af2e5fc --- /dev/null +++ b/json-c/config.h.in @@ -0,0 +1,177 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Enable RDRANR Hardware RNG Hash Seed */ +#undef ENABLE_RDRAND + +/* Define if .gnu.warning accepts long strings. */ +#undef HAS_GNU_WARNING_LONG + +/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you + don't. */ +#undef HAVE_DECL_INFINITY + +/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't. + */ +#undef HAVE_DECL_ISINF + +/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't. + */ +#undef HAVE_DECL_ISNAN + +/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */ +#undef HAVE_DECL_NAN + +/* Define to 1 if you have the declaration of `_finite', and to 0 if you + don't. */ +#undef HAVE_DECL__FINITE + +/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't. + */ +#undef HAVE_DECL__ISNAN + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +#undef HAVE_DOPRNT + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `open' function. */ +#undef HAVE_OPEN + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if you have the `snprintf' function. */ +#undef HAVE_SNPRINTF + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror' function. */ +#undef HAVE_STRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_CDEFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vasprintf' function. */ +#undef HAVE_VASPRINTF + +/* Define to 1 if you have the `vprintf' function. */ +#undef HAVE_VPRINTF + +/* Define to 1 if you have the `vsnprintf' function. */ +#undef HAVE_VSNPRINTF + +/* Define to 1 if you have the `vsyslog' function. */ +#undef HAVE_VSYSLOG + +/* Public define for json_inttypes.h */ +#undef JSON_C_HAVE_INTTYPES_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +#undef NO_MINUS_C_MINUS_O + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/json-c/configure.ac b/json-c/configure.ac new file mode 100644 index 0000000..c50f81b --- /dev/null +++ b/json-c/configure.ac @@ -0,0 +1,107 @@ +AC_PREREQ(2.52) + +# Process this file with autoconf to produce a configure script. +AC_INIT([json-c], 0.12.99, [json-c@googlegroups.com]) + +AM_INIT_AUTOMAKE + +AC_PROG_MAKE_SET + +AC_ARG_ENABLE(rdrand, + AS_HELP_STRING([--enable-rdrand], + [Enable RDRAND Hardware RNG Hash Seed generation on supported x86/x64 platforms.]), +[if test x$enableval = xyes; then + enable_rdrand=yes + AC_DEFINE(ENABLE_RDRAND, 1, [Enable RDRANR Hardware RNG Hash Seed]) +fi]) + +if test "x$enable_rdrand" = "xyes"; then + AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed enabled on supported x86/x64 platforms]) +else + AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed disabled. Use --enable-rdrand to enable]) +fi + +# Checks for programs. + +# Checks for libraries. + +# Checks for header files. +AM_PROG_CC_C_O +AC_CONFIG_HEADER(config.h) +AC_CONFIG_HEADER(json_config.h) +AC_HEADER_STDC +AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/cdefs.h] [sys/param.h] stdarg.h locale.h endian.h) +AC_CHECK_HEADER(inttypes.h,[AC_DEFINE([JSON_C_HAVE_INTTYPES_H],[1],[Public define for json_inttypes.h])]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_SIZE_T + +# Checks for library functions. +AC_FUNC_VPRINTF +AC_FUNC_MEMCMP +AC_FUNC_MALLOC +AC_FUNC_REALLOC +AC_CHECK_FUNCS(strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale) +AC_CHECK_DECLS([INFINITY], [], [], [[#include ]]) +AC_CHECK_DECLS([nan], [], [], [[#include ]]) +AC_CHECK_DECLS([isnan], [], [], [[#include ]]) +AC_CHECK_DECLS([isinf], [], [], [[#include ]]) +AC_CHECK_DECLS([_isnan], [], [], [[#include ]]) +AC_CHECK_DECLS([_finite], [], [], [[#include ]]) + +#check if .section.gnu.warning accepts long strings (for __warn_references) +AC_LANG_PUSH([C]) + +AC_MSG_CHECKING([if .gnu.warning accepts long strings]) +AC_LINK_IFELSE([AC_LANG_SOURCE([[ +extern void json_object_get(); +__asm__(".section .gnu.json_object_get,\n\t.ascii \"Please link against libjson-c instead of libjson\"\n\t.text"); + +int main(int c,char* v) {return 0;} +]])], [ + AC_DEFINE(HAS_GNU_WARNING_LONG, 1, [Define if .gnu.warning accepts long strings.]) + AC_MSG_RESULT(yes) +], [ + AC_MSG_RESULT(no) +]) + +AC_LANG_POP([C]) + +AM_PROG_LIBTOOL + +# Check for the -Bsymbolic-functions linker flag +AC_ARG_ENABLE([Bsymbolic], + [AS_HELP_STRING([--disable-Bsymbolic], [Avoid linking with -Bsymbolic-function])], + [], + [enable_Bsymbolic=check]) + +AS_IF([test "x$enable_Bsymbolic" = "xcheck"], + [ + saved_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([for -Bsymbolic-functions linker flag]) + LDFLAGS=-Wl,-Bsymbolic-functions + AC_TRY_LINK([], [int main (void) { return 0; }], + [ + AC_MSG_RESULT([yes]) + enable_Bsymbolic=yes + ], + [ + AC_MSG_RESULT([no]) + enable_Bsymbolic=no + ]) + LDFLAGS="${saved_LDFLAGS}" + ]) + +AS_IF([test "x$enable_Bsymbolic" = "xyes"], [JSON_BSYMBOLIC_LDFLAGS=-Wl[,]-Bsymbolic-functions]) +AC_SUBST(JSON_BSYMBOLIC_LDFLAGS) + +AC_CONFIG_FILES([ +Makefile +json-c.pc +tests/Makefile +json-c-uninstalled.pc +]) + +AC_OUTPUT + diff --git a/json-c/debug.c b/json-c/debug.c new file mode 100644 index 0000000..3b64b59 --- /dev/null +++ b/json-c/debug.c @@ -0,0 +1,83 @@ +/* + * $Id: debug.c,v 1.5 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include "config.h" + +#include +#include +#include +#include + +#if HAVE_SYSLOG_H +# include +#endif /* HAVE_SYSLOG_H */ + +#if HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ + +#if HAVE_SYS_PARAM_H +#include +#endif /* HAVE_SYS_PARAM_H */ + +#include "debug.h" + +static int _syslog = 0; +static int _debug = 0; + +void mc_set_debug(int debug) { _debug = debug; } +int mc_get_debug(void) { return _debug; } + +extern void mc_set_syslog(int syslog) +{ + _syslog = syslog; +} + +void mc_debug(const char *msg, ...) +{ + va_list ap; + if(_debug) { + va_start(ap, msg); +#if HAVE_VSYSLOG + if(_syslog) { + vsyslog(LOG_DEBUG, msg, ap); + } else +#endif + vprintf(msg, ap); + va_end(ap); + } +} + +void mc_error(const char *msg, ...) +{ + va_list ap; + va_start(ap, msg); +#if HAVE_VSYSLOG + if(_syslog) { + vsyslog(LOG_ERR, msg, ap); + } else +#endif + vfprintf(stderr, msg, ap); + va_end(ap); +} + +void mc_info(const char *msg, ...) +{ + va_list ap; + va_start(ap, msg); +#if HAVE_VSYSLOG + if(_syslog) { + vsyslog(LOG_INFO, msg, ap); + } else +#endif + vfprintf(stderr, msg, ap); + va_end(ap); +} diff --git a/json-c/debug.h b/json-c/debug.h new file mode 100644 index 0000000..80ca3e4 --- /dev/null +++ b/json-c/debug.h @@ -0,0 +1,71 @@ +/* + * $Id: debug.h,v 1.5 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern void mc_set_debug(int debug); +extern int mc_get_debug(void); + +extern void mc_set_syslog(int syslog); + +extern void mc_debug(const char *msg, ...); +extern void mc_error(const char *msg, ...); +extern void mc_info(const char *msg, ...); + +#ifndef __STRING +#define __STRING(x) #x +#endif + +#ifndef PARSER_BROKEN_FIXED + +#define JASSERT(cond) do {} while(0) + +#else + +#define JASSERT(cond) do { \ + if (!(cond)) { \ + mc_error("cjson assert failure %s:%d : cond \"" __STRING(cond) "failed\n", __FILE__, __LINE__); \ + *(int *)0 = 1;\ + abort(); \ + }\ + } while(0) + +#endif + +#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__) + +#ifdef MC_MAINTAINER_MODE +#define MC_SET_DEBUG(x) mc_set_debug(x) +#define MC_GET_DEBUG() mc_get_debug() +#define MC_SET_SYSLOG(x) mc_set_syslog(x) +#define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__) +#define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__) +#else +#define MC_SET_DEBUG(x) if (0) mc_set_debug(x) +#define MC_GET_DEBUG() (0) +#define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x) +#define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__) +#define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__) +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/json-c-uninstalled.pc.in b/json-c/json-c-uninstalled.pc.in new file mode 100644 index 0000000..dab2bab --- /dev/null +++ b/json-c/json-c-uninstalled.pc.in @@ -0,0 +1,11 @@ +prefix= +exec_prefix= +libdir=@abs_top_builddir@ +includedir=@abs_top_srcdir@ + +Name: json +Description: JSON implementation in C +Version: @VERSION@ +Requires: +Libs: -L@abs_top_builddir@ -ljson-c +Cflags: -I@abs_top_srcdir@ diff --git a/json-c/json-c.pc.in b/json-c/json-c.pc.in new file mode 100644 index 0000000..037739d --- /dev/null +++ b/json-c/json-c.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: json-c +Description: JSON implementation in C +Version: @VERSION@ +Requires: +Libs: -L${libdir} -ljson-c +Cflags: -I${includedir}/json-c diff --git a/json-c/json.h b/json-c/json.h new file mode 100644 index 0000000..e198f5d --- /dev/null +++ b/json-c/json.h @@ -0,0 +1,33 @@ +/* + * $Id: json.h,v 1.6 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _json_h_ +#define _json_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "debug.h" +#include "linkhash.h" +#include "arraylist.h" +#include "json_util.h" +#include "json_object.h" +#include "json_tokener.h" +#include "json_object_iterator.h" +#include "json_c_version.h" + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/json_c_version.c b/json-c/json_c_version.c new file mode 100644 index 0000000..13eb188 --- /dev/null +++ b/json-c/json_c_version.c @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2012 Eric Haszlakiewicz + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + */ +#include "config.h" + +#include "json_c_version.h" + +const char *json_c_version(void) +{ + return JSON_C_VERSION; +} + +int json_c_version_num(void) +{ + return JSON_C_VERSION_NUM; +} + diff --git a/json-c/json_c_version.h b/json-c/json_c_version.h new file mode 100644 index 0000000..d77f1a7 --- /dev/null +++ b/json-c/json_c_version.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2012 Eric Haszlakiewicz + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + */ + +#ifndef _json_c_version_h_ +#define _json_c_version_h_ + +#define JSON_C_MAJOR_VERSION 0 +#define JSON_C_MINOR_VERSION 12 +#define JSON_C_MICRO_VERSION 99 +#define JSON_C_VERSION_NUM ((JSON_C_MAJOR_VERSION << 16) | \ + (JSON_C_MINOR_VERSION << 8) | \ + JSON_C_MICRO_VERSION) +#define JSON_C_VERSION "0.12.99" + +const char *json_c_version(void); /* Returns JSON_C_VERSION */ +int json_c_version_num(void); /* Returns JSON_C_VERSION_NUM */ + +#endif diff --git a/json-c/json_config.h b/json-c/json_config.h new file mode 100644 index 0000000..965ff1c --- /dev/null +++ b/json-c/json_config.h @@ -0,0 +1,4 @@ +/* json_config.h. Generated from json_config.h.in by configure. */ + +/* Define to 1 if you have the header file. */ +#define JSON_C_HAVE_INTTYPES_H 1 diff --git a/json-c/json_config.h.in b/json-c/json_config.h.in new file mode 100644 index 0000000..7888e02 --- /dev/null +++ b/json-c/json_config.h.in @@ -0,0 +1,3 @@ + +/* Define to 1 if you have the header file. */ +#undef JSON_C_HAVE_INTTYPES_H diff --git a/json-c/json_inttypes.h b/json-c/json_inttypes.h new file mode 100644 index 0000000..9de8d24 --- /dev/null +++ b/json-c/json_inttypes.h @@ -0,0 +1,28 @@ + +#ifndef _json_inttypes_h_ +#define _json_inttypes_h_ + +#include "json_config.h" + +#if defined(_MSC_VER) && _MSC_VER <= 1700 + +/* Anything less than Visual Studio C++ 10 is missing stdint.h and inttypes.h */ +typedef __int32 int32_t; +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX ((int32_t)_I32_MAX) +typedef __int64 int64_t; +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX ((int64_t)_I64_MAX) +#define PRId64 "I64d" +#define SCNd64 "I64d" + +#else + +#ifdef JSON_C_HAVE_INTTYPES_H +#include +#endif +/* inttypes.h includes stdint.h */ + +#endif + +#endif diff --git a/json-c/json_object.c b/json-c/json_object.c new file mode 100644 index 0000000..8ed0239 --- /dev/null +++ b/json-c/json_object.c @@ -0,0 +1,913 @@ +/* + * $Id: json_object.c,v 1.17 2006/07/25 03:24:50 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "printbuf.h" +#include "linkhash.h" +#include "arraylist.h" +#include "json_inttypes.h" +#include "json_object.h" +#include "json_object_private.h" +#include "json_util.h" +#include "math_compat.h" + +#if !defined(HAVE_STRDUP) && defined(_MSC_VER) + /* MSC has the version as _strdup */ +# define strdup _strdup +#elif !defined(HAVE_STRDUP) +# error You do not have strdup on your system. +#endif /* HAVE_STRDUP */ + +#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) + /* MSC has the version as _snprintf */ +# define snprintf _snprintf +#elif !defined(HAVE_SNPRINTF) +# error You do not have snprintf on your system. +#endif /* HAVE_SNPRINTF */ + +// Don't define this. It's not thread-safe. +/* #define REFCOUNT_DEBUG 1 */ + +const char *json_number_chars = "0123456789.+-eE"; +const char *json_hex_chars = "0123456789abcdefABCDEF"; + +static void json_object_generic_delete(struct json_object* jso); +static struct json_object* json_object_new(enum json_type o_type); + +static json_object_to_json_string_fn json_object_object_to_json_string; +static json_object_to_json_string_fn json_object_boolean_to_json_string; +static json_object_to_json_string_fn json_object_int_to_json_string; +static json_object_to_json_string_fn json_object_double_to_json_string; +static json_object_to_json_string_fn json_object_string_to_json_string; +static json_object_to_json_string_fn json_object_array_to_json_string; + + +/* ref count debugging */ + +#ifdef REFCOUNT_DEBUG + +static struct lh_table *json_object_table; + +static void json_object_init(void) __attribute__ ((constructor)); +static void json_object_init(void) { + MC_DEBUG("json_object_init: creating object table\n"); + json_object_table = lh_kptr_table_new(128, "json_object_table", NULL); +} + +static void json_object_fini(void) __attribute__ ((destructor)); +static void json_object_fini(void) +{ + struct lh_entry *ent; + if (MC_GET_DEBUG()) + { + if (json_object_table->count) + { + MC_DEBUG("json_object_fini: %d referenced objects at exit\n", + json_object_table->count); + lh_foreach(json_object_table, ent) + { + struct json_object* obj = (struct json_object*)ent->v; + MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj); + } + } + } + MC_DEBUG("json_object_fini: freeing object table\n"); + lh_table_free(json_object_table); +} +#endif /* REFCOUNT_DEBUG */ + + +/* string escaping */ + +static int json_escape_str(struct printbuf *pb, char *str, int len) +{ + int pos = 0, start_offset = 0; + unsigned char c; + while (len--) + { + c = str[pos]; + switch(c) + { + case '\b': + case '\n': + case '\r': + case '\t': + case '\f': + case '"': + case '\\': + case '/': + if(pos - start_offset > 0) + printbuf_memappend(pb, str + start_offset, pos - start_offset); + + if(c == '\b') printbuf_memappend(pb, "\\b", 2); + else if(c == '\n') printbuf_memappend(pb, "\\n", 2); + else if(c == '\r') printbuf_memappend(pb, "\\r", 2); + else if(c == '\t') printbuf_memappend(pb, "\\t", 2); + else if(c == '\f') printbuf_memappend(pb, "\\f", 2); + else if(c == '"') printbuf_memappend(pb, "\\\"", 2); + else if(c == '\\') printbuf_memappend(pb, "\\\\", 2); + else if(c == '/') printbuf_memappend(pb, "\\/", 2); + + start_offset = ++pos; + break; + default: + if(c < ' ') + { + if(pos - start_offset > 0) + printbuf_memappend(pb, str + start_offset, pos - start_offset); + sprintbuf(pb, "\\u00%c%c", + json_hex_chars[c >> 4], + json_hex_chars[c & 0xf]); + start_offset = ++pos; + } else + pos++; + } + } + if (pos - start_offset > 0) + printbuf_memappend(pb, str + start_offset, pos - start_offset); + return 0; +} + + +/* reference counting */ + +extern struct json_object* json_object_get(struct json_object *jso) +{ + if (jso) + jso->_ref_count++; + return jso; +} + +int json_object_put(struct json_object *jso) +{ + if(jso) + { + jso->_ref_count--; + if(!jso->_ref_count) + { + if (jso->_user_delete) + jso->_user_delete(jso, jso->_userdata); + jso->_delete(jso); + return 1; + } + } + return 0; +} + + +/* generic object construction and destruction parts */ + +static void json_object_generic_delete(struct json_object* jso) +{ +#ifdef REFCOUNT_DEBUG + MC_DEBUG("json_object_delete_%s: %p\n", + json_type_to_name(jso->o_type), jso); + lh_table_delete(json_object_table, jso); +#endif /* REFCOUNT_DEBUG */ + printbuf_free(jso->_pb); + free(jso); +} + +static struct json_object* json_object_new(enum json_type o_type) +{ + struct json_object *jso; + + jso = (struct json_object*)calloc(sizeof(struct json_object), 1); + if (!jso) + return NULL; + jso->o_type = o_type; + jso->_ref_count = 1; + jso->_delete = &json_object_generic_delete; +#ifdef REFCOUNT_DEBUG + lh_table_insert(json_object_table, jso, jso); + MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso); +#endif /* REFCOUNT_DEBUG */ + return jso; +} + + +/* type checking functions */ + +int json_object_is_type(struct json_object *jso, enum json_type type) +{ + if (!jso) + return (type == json_type_null); + return (jso->o_type == type); +} + +enum json_type json_object_get_type(struct json_object *jso) +{ + if (!jso) + return json_type_null; + return jso->o_type; +} + +/* set a custom conversion to string */ + +void json_object_set_serializer(json_object *jso, + json_object_to_json_string_fn to_string_func, + void *userdata, + json_object_delete_fn *user_delete) +{ + // First, clean up any previously existing user info + if (jso->_user_delete) + { + jso->_user_delete(jso, jso->_userdata); + } + jso->_userdata = NULL; + jso->_user_delete = NULL; + + if (to_string_func == NULL) + { + // Reset to the standard serialization function + switch(jso->o_type) + { + case json_type_null: + jso->_to_json_string = NULL; + break; + case json_type_boolean: + jso->_to_json_string = &json_object_boolean_to_json_string; + break; + case json_type_double: + jso->_to_json_string = &json_object_double_to_json_string; + break; + case json_type_int: + jso->_to_json_string = &json_object_int_to_json_string; + break; + case json_type_object: + jso->_to_json_string = &json_object_object_to_json_string; + break; + case json_type_array: + jso->_to_json_string = &json_object_array_to_json_string; + break; + case json_type_string: + jso->_to_json_string = &json_object_string_to_json_string; + break; + } + return; + } + + jso->_to_json_string = to_string_func; + jso->_userdata = userdata; + jso->_user_delete = user_delete; +} + + +/* extended conversion to string */ + +const char* json_object_to_json_string_ext(struct json_object *jso, int flags) +{ + if (!jso) + return "null"; + + if ((!jso->_pb) && !(jso->_pb = printbuf_new())) + return NULL; + + printbuf_reset(jso->_pb); + + if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0) + return NULL; + + return jso->_pb->buf; +} + +/* backwards-compatible conversion to string */ + +const char* json_object_to_json_string(struct json_object *jso) +{ + return json_object_to_json_string_ext(jso, JSON_C_TO_STRING_SPACED); +} + +static void indent(struct printbuf *pb, int level, int flags) +{ + if (flags & JSON_C_TO_STRING_PRETTY) + { + printbuf_memset(pb, -1, ' ', level * 2); + } +} + +/* json_object_object */ + +static int json_object_object_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + int had_children = 0; + struct json_object_iter iter; + + sprintbuf(pb, "{" /*}*/); + if (flags & JSON_C_TO_STRING_PRETTY) + sprintbuf(pb, "\n"); + json_object_object_foreachC(jso, iter) + { + if (had_children) + { + sprintbuf(pb, ","); + if (flags & JSON_C_TO_STRING_PRETTY) + sprintbuf(pb, "\n"); + } + had_children = 1; + if (flags & JSON_C_TO_STRING_SPACED) + sprintbuf(pb, " "); + indent(pb, level+1, flags); + sprintbuf(pb, "\""); + json_escape_str(pb, iter.key, strlen(iter.key)); + if (flags & JSON_C_TO_STRING_SPACED) + sprintbuf(pb, "\": "); + else + sprintbuf(pb, "\":"); + if(iter.val == NULL) + sprintbuf(pb, "null"); + else + iter.val->_to_json_string(iter.val, pb, level+1,flags); + } + if (flags & JSON_C_TO_STRING_PRETTY) + { + if (had_children) + sprintbuf(pb, "\n"); + indent(pb,level,flags); + } + if (flags & JSON_C_TO_STRING_SPACED) + return sprintbuf(pb, /*{*/ " }"); + else + return sprintbuf(pb, /*{*/ "}"); +} + + +static void json_object_lh_entry_free(struct lh_entry *ent) +{ + free(ent->k); + json_object_put((struct json_object*)ent->v); +} + +static void json_object_object_delete(struct json_object* jso) +{ + lh_table_free(jso->o.c_object); + json_object_generic_delete(jso); +} + +struct json_object* json_object_new_object(void) +{ + struct json_object *jso = json_object_new(json_type_object); + if (!jso) + return NULL; + jso->_delete = &json_object_object_delete; + jso->_to_json_string = &json_object_object_to_json_string; + jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES, + NULL, &json_object_lh_entry_free); + if (!jso->o.c_object) + { + json_object_generic_delete(jso); + errno = ENOMEM; + return NULL; + } + return jso; +} + +struct lh_table* json_object_get_object(struct json_object *jso) +{ + if (!jso) + return NULL; + switch(jso->o_type) + { + case json_type_object: + return jso->o.c_object; + default: + return NULL; + } +} + +void json_object_object_add(struct json_object* jso, const char *key, + struct json_object *val) +{ + // We lookup the entry and replace the value, rather than just deleting + // and re-adding it, so the existing key remains valid. + json_object *existing_value = NULL; + struct lh_entry *existing_entry; + existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key); + if (!existing_entry) + { + lh_table_insert(jso->o.c_object, strdup(key), val); + return; + } + existing_value = (void *)existing_entry->v; + if (existing_value) + json_object_put(existing_value); + existing_entry->v = val; +} + +int json_object_object_length(struct json_object *jso) +{ + return lh_table_length(jso->o.c_object); +} + +struct json_object* json_object_object_get(struct json_object* jso, const char *key) +{ + struct json_object *result = NULL; + json_object_object_get_ex(jso, key, &result); + return result; +} + +json_bool json_object_object_get_ex(struct json_object* jso, const char *key, struct json_object **value) +{ + if (value != NULL) + *value = NULL; + + if (NULL == jso) + return FALSE; + + switch(jso->o_type) + { + case json_type_object: + return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value); + default: + if (value != NULL) + *value = NULL; + return FALSE; + } +} + +void json_object_object_del(struct json_object* jso, const char *key) +{ + lh_table_delete(jso->o.c_object, key); +} + + +/* json_object_boolean */ + +static int json_object_boolean_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + if (jso->o.c_boolean) + return sprintbuf(pb, "true"); + else + return sprintbuf(pb, "false"); +} + +struct json_object* json_object_new_boolean(json_bool b) +{ + struct json_object *jso = json_object_new(json_type_boolean); + if (!jso) + return NULL; + jso->_to_json_string = &json_object_boolean_to_json_string; + jso->o.c_boolean = b; + return jso; +} + +json_bool json_object_get_boolean(struct json_object *jso) +{ + if (!jso) + return FALSE; + switch(jso->o_type) + { + case json_type_boolean: + return jso->o.c_boolean; + case json_type_int: + return (jso->o.c_int64 != 0); + case json_type_double: + return (jso->o.c_double != 0); + case json_type_string: + return (jso->o.c_string.len != 0); + default: + return FALSE; + } +} + + +/* json_object_int */ + +static int json_object_int_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + return sprintbuf(pb, "%"PRId64, jso->o.c_int64); +} + +struct json_object* json_object_new_int(int32_t i) +{ + struct json_object *jso = json_object_new(json_type_int); + if (!jso) + return NULL; + jso->_to_json_string = &json_object_int_to_json_string; + jso->o.c_int64 = i; + return jso; +} + +int32_t json_object_get_int(struct json_object *jso) +{ + int64_t cint64; + enum json_type o_type; + + if(!jso) return 0; + + o_type = jso->o_type; + cint64 = jso->o.c_int64; + + if (o_type == json_type_string) + { + /* + * Parse strings into 64-bit numbers, then use the + * 64-to-32-bit number handling below. + */ + if (json_parse_int64(jso->o.c_string.str, &cint64) != 0) + return 0; /* whoops, it didn't work. */ + o_type = json_type_int; + } + + switch(o_type) { + case json_type_int: + /* Make sure we return the correct values for out of range numbers. */ + if (cint64 <= INT32_MIN) + return INT32_MIN; + else if (cint64 >= INT32_MAX) + return INT32_MAX; + else + return (int32_t)cint64; + case json_type_double: + return (int32_t)jso->o.c_double; + case json_type_boolean: + return jso->o.c_boolean; + default: + return 0; + } +} + +struct json_object* json_object_new_int64(int64_t i) +{ + struct json_object *jso = json_object_new(json_type_int); + if (!jso) + return NULL; + jso->_to_json_string = &json_object_int_to_json_string; + jso->o.c_int64 = i; + return jso; +} + +int64_t json_object_get_int64(struct json_object *jso) +{ + int64_t cint; + + if (!jso) + return 0; + switch(jso->o_type) + { + case json_type_int: + return jso->o.c_int64; + case json_type_double: + return (int64_t)jso->o.c_double; + case json_type_boolean: + return jso->o.c_boolean; + case json_type_string: + if (json_parse_int64(jso->o.c_string.str, &cint) == 0) + return cint; + default: + return 0; + } +} + + +/* json_object_double */ + +static int json_object_double_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + char buf[128], *p, *q; + int size; + /* Although JSON RFC does not support + NaN or Infinity as numeric values + ECMA 262 section 9.8.1 defines + how to handle these cases as strings */ + if(isnan(jso->o.c_double)) + size = snprintf(buf, sizeof(buf), "NaN"); + else if(isinf(jso->o.c_double)) + if(jso->o.c_double > 0) + size = snprintf(buf, sizeof(buf), "Infinity"); + else + size = snprintf(buf, sizeof(buf), "-Infinity"); + else + size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double); + + p = strchr(buf, ','); + if (p) { + *p = '.'; + } else { + p = strchr(buf, '.'); + } + if (p && (flags & JSON_C_TO_STRING_NOZERO)) { + /* last useful digit, always keep 1 zero */ + p++; + for (q=p ; *q ; q++) { + if (*q!='0') p=q; + } + /* drop trailing zeroes */ + *(++p) = 0; + size = p-buf; + } + printbuf_memappend(pb, buf, size); + return size; +} + +struct json_object* json_object_new_double(double d) +{ + struct json_object *jso = json_object_new(json_type_double); + if (!jso) + return NULL; + jso->_to_json_string = &json_object_double_to_json_string; + jso->o.c_double = d; + return jso; +} + +struct json_object* json_object_new_double_s(double d, const char *ds) +{ + struct json_object *jso = json_object_new_double(d); + if (!jso) + return NULL; + + char *new_ds = strdup(ds); + if (!new_ds) + { + json_object_generic_delete(jso); + errno = ENOMEM; + return NULL; + } + json_object_set_serializer(jso, json_object_userdata_to_json_string, + new_ds, json_object_free_userdata); + return jso; +} + +int json_object_userdata_to_json_string(struct json_object *jso, + struct printbuf *pb, int level, int flags) +{ + int userdata_len = strlen(jso->_userdata); + printbuf_memappend(pb, jso->_userdata, userdata_len); + return userdata_len; +} + +void json_object_free_userdata(struct json_object *jso, void *userdata) +{ + free(userdata); +} + +double json_object_get_double(struct json_object *jso) +{ + double cdouble; + char *errPtr = NULL; + + if(!jso) return 0.0; + switch(jso->o_type) { + case json_type_double: + return jso->o.c_double; + case json_type_int: + return jso->o.c_int64; + case json_type_boolean: + return jso->o.c_boolean; + case json_type_string: + errno = 0; + cdouble = strtod(jso->o.c_string.str,&errPtr); + + /* if conversion stopped at the first character, return 0.0 */ + if (errPtr == jso->o.c_string.str) + return 0.0; + + /* + * Check that the conversion terminated on something sensible + * + * For example, { "pay" : 123AB } would parse as 123. + */ + if (*errPtr != '\0') + return 0.0; + + /* + * If strtod encounters a string which would exceed the + * capacity of a double, it returns +/- HUGE_VAL and sets + * errno to ERANGE. But +/- HUGE_VAL is also a valid result + * from a conversion, so we need to check errno. + * + * Underflow also sets errno to ERANGE, but it returns 0 in + * that case, which is what we will return anyway. + * + * See CERT guideline ERR30-C + */ + if ((HUGE_VAL == cdouble || -HUGE_VAL == cdouble) && + (ERANGE == errno)) + cdouble = 0.0; + return cdouble; + default: + return 0.0; + } +} + + +/* json_object_string */ + +static int json_object_string_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + sprintbuf(pb, "\""); + json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len); + sprintbuf(pb, "\""); + return 0; +} + +static void json_object_string_delete(struct json_object* jso) +{ + free(jso->o.c_string.str); + json_object_generic_delete(jso); +} + +struct json_object* json_object_new_string(const char *s) +{ + struct json_object *jso = json_object_new(json_type_string); + if (!jso) + return NULL; + jso->_delete = &json_object_string_delete; + jso->_to_json_string = &json_object_string_to_json_string; + jso->o.c_string.str = strdup(s); + if (!jso->o.c_string.str) + { + json_object_generic_delete(jso); + errno = ENOMEM; + return NULL; + } + jso->o.c_string.len = strlen(s); + return jso; +} + +struct json_object* json_object_new_string_len(const char *s, int len) +{ + struct json_object *jso = json_object_new(json_type_string); + if (!jso) + return NULL; + jso->_delete = &json_object_string_delete; + jso->_to_json_string = &json_object_string_to_json_string; + jso->o.c_string.str = (char*)malloc(len + 1); + if (!jso->o.c_string.str) + { + json_object_generic_delete(jso); + errno = ENOMEM; + return NULL; + } + memcpy(jso->o.c_string.str, (void *)s, len); + jso->o.c_string.str[len] = '\0'; + jso->o.c_string.len = len; + return jso; +} + +const char* json_object_get_string(struct json_object *jso) +{ + if (!jso) + return NULL; + switch(jso->o_type) + { + case json_type_string: + return jso->o.c_string.str; + default: + return json_object_to_json_string(jso); + } +} + +int json_object_get_string_len(struct json_object *jso) +{ + if (!jso) + return 0; + switch(jso->o_type) + { + case json_type_string: + return jso->o.c_string.len; + default: + return 0; + } +} + + +/* json_object_array */ + +static int json_object_array_to_json_string(struct json_object* jso, + struct printbuf *pb, + int level, + int flags) +{ + int had_children = 0; + int ii; + sprintbuf(pb, "["); + if (flags & JSON_C_TO_STRING_PRETTY) + sprintbuf(pb, "\n"); + for(ii=0; ii < json_object_array_length(jso); ii++) + { + struct json_object *val; + if (had_children) + { + sprintbuf(pb, ","); + if (flags & JSON_C_TO_STRING_PRETTY) + sprintbuf(pb, "\n"); + } + had_children = 1; + if (flags & JSON_C_TO_STRING_SPACED) + sprintbuf(pb, " "); + indent(pb, level + 1, flags); + val = json_object_array_get_idx(jso, ii); + if(val == NULL) + sprintbuf(pb, "null"); + else + val->_to_json_string(val, pb, level+1, flags); + } + if (flags & JSON_C_TO_STRING_PRETTY) + { + if (had_children) + sprintbuf(pb, "\n"); + indent(pb,level,flags); + } + + if (flags & JSON_C_TO_STRING_SPACED) + return sprintbuf(pb, " ]"); + else + return sprintbuf(pb, "]"); +} + +static void json_object_array_entry_free(void *data) +{ + json_object_put((struct json_object*)data); +} + +static void json_object_array_delete(struct json_object* jso) +{ + array_list_free(jso->o.c_array); + json_object_generic_delete(jso); +} + +struct json_object* json_object_new_array(void) +{ + struct json_object *jso = json_object_new(json_type_array); + if (!jso) + return NULL; + jso->_delete = &json_object_array_delete; + jso->_to_json_string = &json_object_array_to_json_string; + jso->o.c_array = array_list_new(&json_object_array_entry_free); + return jso; +} + +struct array_list* json_object_get_array(struct json_object *jso) +{ + if (!jso) + return NULL; + switch(jso->o_type) + { + case json_type_array: + return jso->o.c_array; + default: + return NULL; + } +} + +void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *)) +{ + array_list_sort(jso->o.c_array, sort_fn); +} + +int json_object_array_length(struct json_object *jso) +{ + return array_list_length(jso->o.c_array); +} + +int json_object_array_add(struct json_object *jso,struct json_object *val) +{ + return array_list_add(jso->o.c_array, val); +} + +int json_object_array_put_idx(struct json_object *jso, int idx, + struct json_object *val) +{ + return array_list_put_idx(jso->o.c_array, idx, val); +} + +struct json_object* json_object_array_get_idx(struct json_object *jso, + int idx) +{ + return (struct json_object*)array_list_get_idx(jso->o.c_array, idx); +} + diff --git a/json-c/json_object.h b/json-c/json_object.h new file mode 100644 index 0000000..0dca0b1 --- /dev/null +++ b/json-c/json_object.h @@ -0,0 +1,617 @@ +/* + * $Id: json_object.h,v 1.12 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _json_object_h_ +#define _json_object_h_ + +#ifdef __GNUC__ +#define THIS_FUNCTION_IS_DEPRECATED(func) func __attribute__ ((deprecated)) +#elif defined(_MSC_VER) +#define THIS_FUNCTION_IS_DEPRECATED(func) __declspec(deprecated) func +#else +#define THIS_FUNCTION_IS_DEPRECATED(func) func +#endif + +#include "json_inttypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define JSON_OBJECT_DEF_HASH_ENTRIES 16 + +/** + * A flag for the json_object_to_json_string_ext() and + * json_object_to_file_ext() functions which causes the output + * to have no extra whitespace or formatting applied. + */ +#define JSON_C_TO_STRING_PLAIN 0 +/** + * A flag for the json_object_to_json_string_ext() and + * json_object_to_file_ext() functions which causes the output to have + * minimal whitespace inserted to make things slightly more readable. + */ +#define JSON_C_TO_STRING_SPACED (1<<0) +/** + * A flag for the json_object_to_json_string_ext() and + * json_object_to_file_ext() functions which causes + * the output to be formatted. + * + * See the "Two Space Tab" option at http://jsonformatter.curiousconcept.com/ + * for an example of the format. + */ +#define JSON_C_TO_STRING_PRETTY (1<<1) +/** + * A flag to drop trailing zero for float values + */ +#define JSON_C_TO_STRING_NOZERO (1<<2) + +#undef FALSE +#define FALSE ((json_bool)0) + +#undef TRUE +#define TRUE ((json_bool)1) + +extern const char *json_number_chars; +extern const char *json_hex_chars; + +/* CAW: added for ANSI C iteration correctness */ +struct json_object_iter +{ + char *key; + struct json_object *val; + struct lh_entry *entry; +}; + +/* forward structure definitions */ + +typedef int json_bool; +typedef struct printbuf printbuf; +typedef struct lh_table lh_table; +typedef struct array_list array_list; +typedef struct json_object json_object; +typedef struct json_object_iter json_object_iter; +typedef struct json_tokener json_tokener; + +/** + * Type of custom user delete functions. See json_object_set_serializer. + */ +typedef void (json_object_delete_fn)(struct json_object *jso, void *userdata); + +/** + * Type of a custom serialization function. See json_object_set_serializer. + */ +typedef int (json_object_to_json_string_fn)(struct json_object *jso, + struct printbuf *pb, + int level, + int flags); + +/* supported object types */ + +typedef enum json_type { + /* If you change this, be sure to update json_type_to_name() too */ + json_type_null, + json_type_boolean, + json_type_double, + json_type_int, + json_type_object, + json_type_array, + json_type_string +} json_type; + +/* reference counting functions */ + +/** + * Increment the reference count of json_object, thereby grabbing shared + * ownership of obj. + * + * @param obj the json_object instance + */ +extern struct json_object* json_object_get(struct json_object *obj); + +/** + * Decrement the reference count of json_object and free if it reaches zero. + * You must have ownership of obj prior to doing this or you will cause an + * imbalance in the reference count. + * + * @param obj the json_object instance + * @returns 1 if the object was freed. + */ +int json_object_put(struct json_object *obj); + +/** + * Check if the json_object is of a given type + * @param obj the json_object instance + * @param type one of: + json_type_null (i.e. obj == NULL), + json_type_boolean, + json_type_double, + json_type_int, + json_type_object, + json_type_array, + json_type_string + */ +extern int json_object_is_type(struct json_object *obj, enum json_type type); + +/** + * Get the type of the json_object. See also json_type_to_name() to turn this + * into a string suitable, for instance, for logging. + * + * @param obj the json_object instance + * @returns type being one of: + json_type_null (i.e. obj == NULL), + json_type_boolean, + json_type_double, + json_type_int, + json_type_object, + json_type_array, + json_type_string + */ +extern enum json_type json_object_get_type(struct json_object *obj); + + +/** Stringify object to json format. + * Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED) + * The pointer you get is an internal of your json object. You don't + * have to free it, later use of json_object_put() should be sufficient. + * If you can not ensure there's no concurrent access to *obj use + * strdup(). + * @param obj the json_object instance + * @returns a string in JSON format + */ +extern const char* json_object_to_json_string(struct json_object *obj); + +/** Stringify object to json format + * @see json_object_to_json_string() for details on how to free string. + * @param obj the json_object instance + * @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants + * @returns a string in JSON format + */ +extern const char* json_object_to_json_string_ext(struct json_object *obj, int +flags); + +/** + * Set a custom serialization function to be used when this particular object + * is converted to a string by json_object_to_json_string. + * + * If a custom serializer is already set on this object, any existing + * user_delete function is called before the new one is set. + * + * If to_string_func is NULL, the other parameters are ignored + * and the default behaviour is reset. + * + * The userdata parameter is optional and may be passed as NULL. If provided, + * it is passed to to_string_func as-is. This parameter may be NULL even + * if user_delete is non-NULL. + * + * The user_delete parameter is optional and may be passed as NULL, even if + * the userdata parameter is non-NULL. It will be called just before the + * json_object is deleted, after it's reference count goes to zero + * (see json_object_put()). + * If this is not provided, it is up to the caller to free the userdata at + * an appropriate time. (i.e. after the json_object is deleted) + * + * @param jso the object to customize + * @param to_string_func the custom serialization function + * @param userdata an optional opaque cookie + * @param user_delete an optional function from freeing userdata + */ +extern void json_object_set_serializer(json_object *jso, + json_object_to_json_string_fn to_string_func, + void *userdata, + json_object_delete_fn *user_delete); + +/** + * Simply call free on the userdata pointer. + * Can be used with json_object_set_serializer(). + * + * @param jso unused + * @param userdata the pointer that is passed to free(). + */ +json_object_delete_fn json_object_free_userdata; + +/** + * Copy the jso->_userdata string over to pb as-is. + * Can be used with json_object_set_serializer(). + * + * @param jso The object whose _userdata is used. + * @param pb The destination buffer. + * @param level Ignored. + * @param flags Ignored. + */ +json_object_to_json_string_fn json_object_userdata_to_json_string; + + +/* object type methods */ + +/** Create a new empty object with a reference count of 1. The caller of + * this object initially has sole ownership. Remember, when using + * json_object_object_add or json_object_array_put_idx, ownership will + * transfer to the object/array. Call json_object_get if you want to maintain + * shared ownership or also add this object as a child of multiple objects or + * arrays. Any ownerships you acquired but did not transfer must be released + * through json_object_put. + * + * @returns a json_object of type json_type_object + */ +extern struct json_object* json_object_new_object(void); + +/** Get the hashtable of a json_object of type json_type_object + * @param obj the json_object instance + * @returns a linkhash + */ +extern struct lh_table* json_object_get_object(struct json_object *obj); + +/** Get the size of an object in terms of the number of fields it has. + * @param obj the json_object whose length to return + */ +extern int json_object_object_length(struct json_object* obj); + +/** Add an object field to a json_object of type json_type_object + * + * The reference count will *not* be incremented. This is to make adding + * fields to objects in code more compact. If you want to retain a reference + * to an added object, independent of the lifetime of obj, you must wrap the + * passed object with json_object_get. + * + * Upon calling this, the ownership of val transfers to obj. Thus you must + * make sure that you do in fact have ownership over this object. For instance, + * json_object_new_object will give you ownership until you transfer it, + * whereas json_object_object_get does not. + * + * @param obj the json_object instance + * @param key the object field name (a private copy will be duplicated) + * @param val a json_object or NULL member to associate with the given field + */ +extern void json_object_object_add(struct json_object* obj, const char *key, + struct json_object *val); + +/** Get the json_object associate with a given object field + * + * *No* reference counts will be changed. There is no need to manually adjust + * reference counts through the json_object_put/json_object_get methods unless + * you need to have the child (value) reference maintain a different lifetime + * than the owning parent (obj). Ownership of the returned value is retained + * by obj (do not do json_object_put unless you have done a json_object_get). + * If you delete the value from obj (json_object_object_del) and wish to access + * the returned reference afterwards, make sure you have first gotten shared + * ownership through json_object_get (& don't forget to do a json_object_put + * or transfer ownership to prevent a memory leak). + * + * @param obj the json_object instance + * @param key the object field name + * @returns the json_object associated with the given field name + * @deprecated Please use json_object_object_get_ex + */ +THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(struct json_object* obj, + const char *key)); + +/** Get the json_object associated with a given object field. + * + * This returns true if the key is found, false in all other cases (including + * if obj isn't a json_type_object). + * + * *No* reference counts will be changed. There is no need to manually adjust + * reference counts through the json_object_put/json_object_get methods unless + * you need to have the child (value) reference maintain a different lifetime + * than the owning parent (obj). Ownership of value is retained by obj. + * + * @param obj the json_object instance + * @param key the object field name + * @param value a pointer where to store a reference to the json_object + * associated with the given field name. + * + * It is safe to pass a NULL value. + * @returns whether or not the key exists + */ +extern json_bool json_object_object_get_ex(struct json_object* obj, + const char *key, + struct json_object **value); + +/** Delete the given json_object field + * + * The reference count will be decremented for the deleted object. If there + * are no more owners of the value represented by this key, then the value is + * freed. Otherwise, the reference to the value will remain in memory. + * + * @param obj the json_object instance + * @param key the object field name + */ +extern void json_object_object_del(struct json_object* obj, const char *key); + +/** + * Iterate through all keys and values of an object. + * + * Adding keys to the object while iterating is NOT allowed. + * + * Deleting an existing key, or replacing an existing key with a + * new value IS allowed. + * + * @param obj the json_object instance + * @param key the local name for the char* key variable defined in the body + * @param val the local name for the json_object* object variable defined in + * the body + */ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L + +# define json_object_object_foreach(obj,key,val) \ + char *key; \ + struct json_object *val __attribute__((__unused__)); \ + for(struct lh_entry *entry ## key = json_object_get_object(obj)->head, *entry_next ## key = NULL; \ + ({ if(entry ## key) { \ + key = (char*)entry ## key->k; \ + val = (struct json_object*)entry ## key->v; \ + entry_next ## key = entry ## key->next; \ + } ; entry ## key; }); \ + entry ## key = entry_next ## key ) + +#else /* ANSI C or MSC */ + +# define json_object_object_foreach(obj,key,val) \ + char *key;\ + struct json_object *val; \ + struct lh_entry *entry ## key; \ + struct lh_entry *entry_next ## key = NULL; \ + for(entry ## key = json_object_get_object(obj)->head; \ + (entry ## key ? ( \ + key = (char*)entry ## key->k, \ + val = (struct json_object*)entry ## key->v, \ + entry_next ## key = entry ## key->next, \ + entry ## key) : 0); \ + entry ## key = entry_next ## key) + +#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L */ + +/** Iterate through all keys and values of an object (ANSI C Safe) + * @param obj the json_object instance + * @param iter the object iterator + */ +#define json_object_object_foreachC(obj,iter) \ + for(iter.entry = json_object_get_object(obj)->head; (iter.entry ? (iter.key = (char*)iter.entry->k, iter.val = (struct json_object*)iter.entry->v, iter.entry) : 0); iter.entry = iter.entry->next) + +/* Array type methods */ + +/** Create a new empty json_object of type json_type_array + * @returns a json_object of type json_type_array + */ +extern struct json_object* json_object_new_array(void); + +/** Get the arraylist of a json_object of type json_type_array + * @param obj the json_object instance + * @returns an arraylist + */ +extern struct array_list* json_object_get_array(struct json_object *obj); + +/** Get the length of a json_object of type json_type_array + * @param obj the json_object instance + * @returns an int + */ +extern int json_object_array_length(struct json_object *obj); + +/** Sorts the elements of jso of type json_type_array +* +* Pointers to the json_object pointers will be passed as the two arguments +* to @sort_fn +* +* @param obj the json_object instance +* @param sort_fn a sorting function +*/ +extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *)); + +/** Add an element to the end of a json_object of type json_type_array + * + * The reference count will *not* be incremented. This is to make adding + * fields to objects in code more compact. If you want to retain a reference + * to an added object you must wrap the passed object with json_object_get + * + * @param obj the json_object instance + * @param val the json_object to be added + */ +extern int json_object_array_add(struct json_object *obj, + struct json_object *val); + +/** Insert or replace an element at a specified index in an array (a json_object of type json_type_array) + * + * The reference count will *not* be incremented. This is to make adding + * fields to objects in code more compact. If you want to retain a reference + * to an added object you must wrap the passed object with json_object_get + * + * The reference count of a replaced object will be decremented. + * + * The array size will be automatically be expanded to the size of the + * index if the index is larger than the current size. + * + * @param obj the json_object instance + * @param idx the index to insert the element at + * @param val the json_object to be added + */ +extern int json_object_array_put_idx(struct json_object *obj, int idx, + struct json_object *val); + +/** Get the element at specificed index of the array (a json_object of type json_type_array) + * @param obj the json_object instance + * @param idx the index to get the element at + * @returns the json_object at the specified index (or NULL) + */ +extern struct json_object* json_object_array_get_idx(struct json_object *obj, + int idx); + +/* json_bool type methods */ + +/** Create a new empty json_object of type json_type_boolean + * @param b a json_bool TRUE or FALSE (0 or 1) + * @returns a json_object of type json_type_boolean + */ +extern struct json_object* json_object_new_boolean(json_bool b); + +/** Get the json_bool value of a json_object + * + * The type is coerced to a json_bool if the passed object is not a json_bool. + * integer and double objects will return FALSE if there value is zero + * or TRUE otherwise. If the passed object is a string it will return + * TRUE if it has a non zero length. If any other object type is passed + * TRUE will be returned if the object is not NULL. + * + * @param obj the json_object instance + * @returns a json_bool + */ +extern json_bool json_object_get_boolean(struct json_object *obj); + + +/* int type methods */ + +/** Create a new empty json_object of type json_type_int + * Note that values are stored as 64-bit values internally. + * To ensure the full range is maintained, use json_object_new_int64 instead. + * @param i the integer + * @returns a json_object of type json_type_int + */ +extern struct json_object* json_object_new_int(int32_t i); + + +/** Create a new empty json_object of type json_type_int + * @param i the integer + * @returns a json_object of type json_type_int + */ +extern struct json_object* json_object_new_int64(int64_t i); + + +/** Get the int value of a json_object + * + * The type is coerced to a int if the passed object is not a int. + * double objects will return their integer conversion. Strings will be + * parsed as an integer. If no conversion exists then 0 is returned + * and errno is set to EINVAL. null is equivalent to 0 (no error values set) + * + * Note that integers are stored internally as 64-bit values. + * If the value of too big or too small to fit into 32-bit, INT32_MAX or + * INT32_MIN are returned, respectively. + * + * @param obj the json_object instance + * @returns an int + */ +extern int32_t json_object_get_int(struct json_object *obj); + +/** Get the int value of a json_object + * + * The type is coerced to a int64 if the passed object is not a int64. + * double objects will return their int64 conversion. Strings will be + * parsed as an int64. If no conversion exists then 0 is returned. + * + * NOTE: Set errno to 0 directly before a call to this function to determine + * whether or not conversion was successful (it does not clear the value for + * you). + * + * @param obj the json_object instance + * @returns an int64 + */ +extern int64_t json_object_get_int64(struct json_object *obj); + + +/* double type methods */ + +/** Create a new empty json_object of type json_type_double + * @param d the double + * @returns a json_object of type json_type_double + */ +extern struct json_object* json_object_new_double(double d); + +/** + * Create a new json_object of type json_type_double, using + * the exact serialized representation of the value. + * + * This allows for numbers that would otherwise get displayed + * inefficiently (e.g. 12.3 => "12.300000000000001") to be + * serialized with the more convenient form. + * + * Note: this is used by json_tokener_parse_ex() to allow for + * an exact re-serialization of a parsed object. + * + * An equivalent sequence of calls is: + * @code + * jso = json_object_new_double(d); + * json_object_set_serializer(d, json_object_userdata_to_json_string, + * strdup(ds), json_object_free_userdata) + * @endcode + * + * @param d the numeric value of the double. + * @param ds the string representation of the double. This will be copied. + */ +extern struct json_object* json_object_new_double_s(double d, const char *ds); + +/** Get the double floating point value of a json_object + * + * The type is coerced to a double if the passed object is not a double. + * integer objects will return their double conversion. Strings will be + * parsed as a double. If no conversion exists then 0.0 is returned and + * errno is set to EINVAL. null is equivalent to 0 (no error values set) + * + * If the value is too big to fit in a double, then the value is set to + * the closest infinity with errno set to ERANGE. If strings cannot be + * converted to their double value, then EINVAL is set & NaN is returned. + * + * Arrays of length 0 are interpreted as 0 (with no error flags set). + * Arrays of length 1 are effectively cast to the equivalent object and + * converted using the above rules. All other arrays set the error to + * EINVAL & return NaN. + * + * NOTE: Set errno to 0 directly before a call to this function to + * determine whether or not conversion was successful (it does not clear + * the value for you). + * + * @param obj the json_object instance + * @returns a double floating point number + */ +extern double json_object_get_double(struct json_object *obj); + + +/* string type methods */ + +/** Create a new empty json_object of type json_type_string + * + * A copy of the string is made and the memory is managed by the json_object + * + * @param s the string + * @returns a json_object of type json_type_string + */ +extern struct json_object* json_object_new_string(const char *s); + +extern struct json_object* json_object_new_string_len(const char *s, int len); + +/** Get the string value of a json_object + * + * If the passed object is not of type json_type_string then the JSON + * representation of the object is returned. + * + * The returned string memory is managed by the json_object and will + * be freed when the reference count of the json_object drops to zero. + * + * @param obj the json_object instance + * @returns a string + */ +extern const char* json_object_get_string(struct json_object *obj); + +/** Get the string length of a json_object + * + * If the passed object is not of type json_type_string then zero + * will be returned. + * + * @param obj the json_object instance + * @returns int + */ +extern int json_object_get_string_len(struct json_object *obj); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/json_object_iterator.c b/json-c/json_object_iterator.c new file mode 100644 index 0000000..7066649 --- /dev/null +++ b/json-c/json_object_iterator.c @@ -0,0 +1,168 @@ +/** +******************************************************************************* +* @file json_object_iterator.c +* +* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P. +* +* This library is free software; you can redistribute it and/or modify +* it under the terms of the MIT license. See COPYING for details. +* +* @brief json-c forces clients to use its private data +* structures for JSON Object iteration. This API +* implementation corrects that by abstracting the +* private json-c details. +* +******************************************************************************* +*/ + +#include + +#include "json.h" +#include "json_object_private.h" + +#include "json_object_iterator.h" + +/** + * How It Works + * + * For each JSON Object, json-c maintains a linked list of zero + * or more lh_entry (link-hash entry) structures inside the + * Object's link-hash table (lh_table). + * + * Each lh_entry structure on the JSON Object's linked list + * represents a single name/value pair. The "next" field of the + * last lh_entry in the list is set to NULL, which terminates + * the list. + * + * We represent a valid iterator that refers to an actual + * name/value pair via a pointer to the pair's lh_entry + * structure set as the iterator's opaque_ field. + * + * We follow json-c's current pair list representation by + * representing a valid "end" iterator (one that refers past the + * last pair) with a NULL value in the iterator's opaque_ field. + * + * A JSON Object without any pairs in it will have the "head" + * field of its lh_table structure set to NULL. For such an + * object, json_object_iter_begin will return an iterator with + * the opaque_ field set to NULL, which is equivalent to the + * "end" iterator. + * + * When iterating, we simply update the iterator's opaque_ field + * to point to the next lh_entry structure in the linked list. + * opaque_ will become NULL once we iterate past the last pair + * in the list, which makes the iterator equivalent to the "end" + * iterator. + */ + +/// Our current representation of the "end" iterator; +/// +/// @note May not always be NULL +static const void* kObjectEndIterValue = NULL; + +/** + * **************************************************************************** + */ +struct json_object_iterator +json_object_iter_begin(struct json_object* obj) +{ + struct json_object_iterator iter; + struct lh_table* pTable; + + /// @note json_object_get_object will return NULL if passed NULL + /// or a non-json_type_object instance + pTable = json_object_get_object(obj); + JASSERT(NULL != pTable); + + /// @note For a pair-less Object, head is NULL, which matches our + /// definition of the "end" iterator + iter.opaque_ = pTable->head; + return iter; +} + +/** + * **************************************************************************** + */ +struct json_object_iterator +json_object_iter_end(const struct json_object* obj) +{ + struct json_object_iterator iter; + + JASSERT(NULL != obj); + JASSERT(json_object_is_type(obj, json_type_object)); + + iter.opaque_ = kObjectEndIterValue; + + return iter; +} + +/** + * **************************************************************************** + */ +void +json_object_iter_next(struct json_object_iterator* iter) +{ + JASSERT(NULL != iter); + JASSERT(kObjectEndIterValue != iter->opaque_); + + iter->opaque_ = ((struct lh_entry *)iter->opaque_)->next; +} + + +/** + * **************************************************************************** + */ +const char* +json_object_iter_peek_name(const struct json_object_iterator* iter) +{ + JASSERT(NULL != iter); + JASSERT(kObjectEndIterValue != iter->opaque_); + + return (const char*)(((struct lh_entry *)iter->opaque_)->k); +} + + +/** + * **************************************************************************** + */ +struct json_object* +json_object_iter_peek_value(const struct json_object_iterator* iter) +{ + JASSERT(NULL != iter); + JASSERT(kObjectEndIterValue != iter->opaque_); + + return (struct json_object*)(((struct lh_entry *)iter->opaque_)->v); +} + + +/** + * **************************************************************************** + */ +json_bool +json_object_iter_equal(const struct json_object_iterator* iter1, + const struct json_object_iterator* iter2) +{ + JASSERT(NULL != iter1); + JASSERT(NULL != iter2); + + return (iter1->opaque_ == iter2->opaque_); +} + + +/** + * **************************************************************************** + */ +struct json_object_iterator +json_object_iter_init_default(void) +{ + struct json_object_iterator iter; + + /** + * @note Make this a negative, invalid value, such that + * accidental access to it would likely be trapped by the + * hardware as an invalid address. + */ + iter.opaque_ = NULL; + + return iter; +} diff --git a/json-c/json_object_iterator.h b/json-c/json_object_iterator.h new file mode 100644 index 0000000..44c9fb2 --- /dev/null +++ b/json-c/json_object_iterator.h @@ -0,0 +1,239 @@ +/** +******************************************************************************* +* @file json_object_iterator.h +* +* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P. +* +* This library is free software; you can redistribute it and/or modify +* it under the terms of the MIT license. See COPYING for details. +* +* @brief json-c forces clients to use its private data +* structures for JSON Object iteration. This API +* corrects that by abstracting the private json-c +* details. +* +* API attributes:
+* * Thread-safe: NO
+* * Reentrant: NO +* +******************************************************************************* +*/ + + +#ifndef JSON_OBJECT_ITERATOR_H +#define JSON_OBJECT_ITERATOR_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Forward declaration for the opaque iterator information. + */ +struct json_object_iter_info_; + +/** + * The opaque iterator that references a name/value pair within + * a JSON Object instance or the "end" iterator value. + */ +struct json_object_iterator { + const void* opaque_; +}; + + +/** + * forward declaration of json-c's JSON value instance structure + */ +struct json_object; + + +/** + * Initializes an iterator structure to a "default" value that + * is convenient for initializing an iterator variable to a + * default state (e.g., initialization list in a class' + * constructor). + * + * @code + * struct json_object_iterator iter = json_object_iter_init_default(); + * MyClass() : iter_(json_object_iter_init_default()) + * @endcode + * + * @note The initialized value doesn't reference any specific + * pair, is considered an invalid iterator, and MUST NOT + * be passed to any json-c API that expects a valid + * iterator. + * + * @note User and internal code MUST NOT make any assumptions + * about and dependencies on the value of the "default" + * iterator value. + * + * @return json_object_iterator + */ +struct json_object_iterator +json_object_iter_init_default(void); + +/** Retrieves an iterator to the first pair of the JSON Object. + * + * @warning Any modification of the underlying pair invalidates all + * iterators to that pair. + * + * @param obj JSON Object instance (MUST be of type json_object) + * + * @return json_object_iterator If the JSON Object has at + * least one pair, on return, the iterator refers + * to the first pair. If the JSON Object doesn't + * have any pairs, the returned iterator is + * equivalent to the "end" iterator for the same + * JSON Object instance. + * + * @code + * struct json_object_iterator it; + * struct json_object_iterator itEnd; + * struct json_object* obj; + * + * obj = json_tokener_parse("{'first':'george', 'age':100}"); + * it = json_object_iter_begin(obj); + * itEnd = json_object_iter_end(obj); + * + * while (!json_object_iter_equal(&it, &itEnd)) { + * printf("%s\n", + * json_object_iter_peek_name(&it)); + * json_object_iter_next(&it); + * } + * + * @endcode + */ +struct json_object_iterator +json_object_iter_begin(struct json_object* obj); + +/** Retrieves the iterator that represents the position beyond the + * last pair of the given JSON Object instance. + * + * @warning Do NOT write code that assumes that the "end" + * iterator value is NULL, even if it is so in a + * particular instance of the implementation. + * + * @note The reason we do not (and MUST NOT) provide + * "json_object_iter_is_end(json_object_iterator* iter)" + * type of API is because it would limit the underlying + * representation of name/value containment (or force us + * to add additional, otherwise unnecessary, fields to + * the iterator structure). The "end" iterator and the + * equality test method, on the other hand, permit us to + * cleanly abstract pretty much any reasonable underlying + * representation without burdening the iterator + * structure with unnecessary data. + * + * @note For performance reasons, memorize the "end" iterator prior + * to any loop. + * + * @param obj JSON Object instance (MUST be of type json_object) + * + * @return json_object_iterator On return, the iterator refers + * to the "end" of the Object instance's pairs + * (i.e., NOT the last pair, but "beyond the last + * pair" value) + */ +struct json_object_iterator +json_object_iter_end(const struct json_object* obj); + +/** Returns an iterator to the next pair, if any + * + * @warning Any modification of the underlying pair + * invalidates all iterators to that pair. + * + * @param iter [IN/OUT] Pointer to iterator that references a + * name/value pair; MUST be a valid, non-end iterator. + * WARNING: bad things will happen if invalid or "end" + * iterator is passed. Upon return will contain the + * reference to the next pair if there is one; if there + * are no more pairs, will contain the "end" iterator + * value, which may be compared against the return value + * of json_object_iter_end() for the same JSON Object + * instance. + */ +void +json_object_iter_next(struct json_object_iterator* iter); + + +/** Returns a const pointer to the name of the pair referenced + * by the given iterator. + * + * @param iter pointer to iterator that references a name/value + * pair; MUST be a valid, non-end iterator. + * + * @warning bad things will happen if an invalid or + * "end" iterator is passed. + * + * @return const char* Pointer to the name of the referenced + * name/value pair. The name memory belongs to the + * name/value pair, will be freed when the pair is + * deleted or modified, and MUST NOT be modified or + * freed by the user. + */ +const char* +json_object_iter_peek_name(const struct json_object_iterator* iter); + + +/** Returns a pointer to the json-c instance representing the + * value of the referenced name/value pair, without altering + * the instance's reference count. + * + * @param iter pointer to iterator that references a name/value + * pair; MUST be a valid, non-end iterator. + * + * @warning bad things will happen if invalid or + * "end" iterator is passed. + * + * @return struct json_object* Pointer to the json-c value + * instance of the referenced name/value pair; the + * value's reference count is not changed by this + * function: if you plan to hold on to this json-c node, + * take a look at json_object_get() and + * json_object_put(). IMPORTANT: json-c API represents + * the JSON Null value as a NULL json_object instance + * pointer. + */ +struct json_object* +json_object_iter_peek_value(const struct json_object_iterator* iter); + + +/** Tests two iterators for equality. Typically used to test + * for end of iteration by comparing an iterator to the + * corresponding "end" iterator (that was derived from the same + * JSON Object instance). + * + * @note The reason we do not (and MUST NOT) provide + * "json_object_iter_is_end(json_object_iterator* iter)" + * type of API is because it would limit the underlying + * representation of name/value containment (or force us + * to add additional, otherwise unnecessary, fields to + * the iterator structure). The equality test method, on + * the other hand, permits us to cleanly abstract pretty + * much any reasonable underlying representation. + * + * @param iter1 Pointer to first valid, non-NULL iterator + * @param iter2 POinter to second valid, non-NULL iterator + * + * @warning if a NULL iterator pointer or an uninitialized + * or invalid iterator, or iterators derived from + * different JSON Object instances are passed, bad things + * will happen! + * + * @return json_bool non-zero if iterators are equal (i.e., both + * reference the same name/value pair or are both at + * "end"); zero if they are not equal. + */ +json_bool +json_object_iter_equal(const struct json_object_iterator* iter1, + const struct json_object_iterator* iter2); + + +#ifdef __cplusplus +} +#endif + + +#endif /* JSON_OBJECT_ITERATOR_H */ diff --git a/json-c/json_object_private.h b/json-c/json_object_private.h new file mode 100644 index 0000000..5ed791b --- /dev/null +++ b/json-c/json_object_private.h @@ -0,0 +1,47 @@ +/* + * $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _json_object_private_h_ +#define _json_object_private_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (json_object_private_delete_fn)(struct json_object *o); + +struct json_object +{ + enum json_type o_type; + json_object_private_delete_fn *_delete; + json_object_to_json_string_fn *_to_json_string; + int _ref_count; + struct printbuf *_pb; + union data { + json_bool c_boolean; + double c_double; + int64_t c_int64; + struct lh_table *c_object; + struct array_list *c_array; + struct { + char *str; + int len; + } c_string; + } o; + json_object_delete_fn *_user_delete; + void *_userdata; +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/json_tokener.c b/json-c/json_tokener.c new file mode 100644 index 0000000..60e81f2 --- /dev/null +++ b/json-c/json_tokener.c @@ -0,0 +1,887 @@ +/* + * $Id: json_tokener.c,v 1.20 2006/07/25 03:24:50 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + * + * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved. + * The copyrights to the contents of this file are licensed under the MIT License + * (http://www.opensource.org/licenses/mit-license.php) + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "debug.h" +#include "printbuf.h" +#include "arraylist.h" +#include "json_inttypes.h" +#include "json_object.h" +#include "json_tokener.h" +#include "json_util.h" + +#ifdef HAVE_LOCALE_H +#include +#endif /* HAVE_LOCALE_H */ + +#define jt_hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9) + +#if !HAVE_STRDUP && defined(_MSC_VER) + /* MSC has the version as _strdup */ +# define strdup _strdup +#elif !HAVE_STRDUP +# error You do not have strdup on your system. +#endif /* HAVE_STRDUP */ + +#if !HAVE_STRNCASECMP && defined(_MSC_VER) + /* MSC has the version as _strnicmp */ +# define strncasecmp _strnicmp +#elif !HAVE_STRNCASECMP +# error You do not have strncasecmp on your system. +#endif /* HAVE_STRNCASECMP */ + +/* Use C99 NAN by default; if not available, nan("") should work too. */ +#ifndef NAN +#define NAN nan("") +#endif /* !NAN */ + +static const char json_null_str[] = "null"; +static const int json_null_str_len = sizeof(json_null_str) - 1; +static const char json_inf_str[] = "Infinity"; +static const int json_inf_str_len = sizeof(json_inf_str) - 1; +static const char json_nan_str[] = "NaN"; +static const int json_nan_str_len = sizeof(json_nan_str) - 1; +static const char json_true_str[] = "true"; +static const int json_true_str_len = sizeof(json_true_str) - 1; +static const char json_false_str[] = "false"; +static const int json_false_str_len = sizeof(json_false_str) - 1; + +static const char* json_tokener_errors[] = { + "success", + "continue", + "nesting too deep", + "unexpected end of data", + "unexpected character", + "null expected", + "boolean expected", + "number expected", + "array value separator ',' expected", + "quoted object property name expected", + "object property name separator ':' expected", + "object value separator ',' expected", + "invalid string sequence", + "expected comment", + "buffer size overflow" +}; + +const char *json_tokener_error_desc(enum json_tokener_error jerr) +{ + int jerr_int = (int)jerr; + if (jerr_int < 0 || jerr_int >= (int)(sizeof(json_tokener_errors) / sizeof(json_tokener_errors[0]))) + return "Unknown error, invalid json_tokener_error value passed to json_tokener_error_desc()"; + return json_tokener_errors[jerr]; +} + +enum json_tokener_error json_tokener_get_error(json_tokener *tok) +{ + return tok->err; +} + +/* Stuff for decoding unicode sequences */ +#define IS_HIGH_SURROGATE(uc) (((uc) & 0xFC00) == 0xD800) +#define IS_LOW_SURROGATE(uc) (((uc) & 0xFC00) == 0xDC00) +#define DECODE_SURROGATE_PAIR(hi,lo) ((((hi) & 0x3FF) << 10) + ((lo) & 0x3FF) + 0x10000) +static unsigned char utf8_replacement_char[3] = { 0xEF, 0xBF, 0xBD }; + +struct json_tokener* json_tokener_new_ex(int depth) +{ + struct json_tokener *tok; + + tok = (struct json_tokener*)calloc(1, sizeof(struct json_tokener)); + if (!tok) return NULL; + tok->stack = (struct json_tokener_srec *)calloc(depth, sizeof(struct json_tokener_srec)); + if (!tok->stack) { + free(tok); + return NULL; + } + tok->pb = printbuf_new(); + tok->max_depth = depth; + json_tokener_reset(tok); + return tok; +} + +struct json_tokener* json_tokener_new(void) +{ + return json_tokener_new_ex(JSON_TOKENER_DEFAULT_DEPTH); +} + +void json_tokener_free(struct json_tokener *tok) +{ + json_tokener_reset(tok); + if (tok->pb) printbuf_free(tok->pb); + if (tok->stack) free(tok->stack); + free(tok); +} + +static void json_tokener_reset_level(struct json_tokener *tok, int depth) +{ + tok->stack[depth].state = json_tokener_state_eatws; + tok->stack[depth].saved_state = json_tokener_state_start; + json_object_put(tok->stack[depth].current); + tok->stack[depth].current = NULL; + free(tok->stack[depth].obj_field_name); + tok->stack[depth].obj_field_name = NULL; +} + +void json_tokener_reset(struct json_tokener *tok) +{ + int i; + if (!tok) + return; + + for(i = tok->depth; i >= 0; i--) + json_tokener_reset_level(tok, i); + tok->depth = 0; + tok->err = json_tokener_success; +} + +struct json_object* json_tokener_parse(const char *str) +{ + enum json_tokener_error jerr_ignored; + struct json_object* obj; + obj = json_tokener_parse_verbose(str, &jerr_ignored); + return obj; +} + +struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error) +{ + struct json_tokener* tok; + struct json_object* obj; + + tok = json_tokener_new(); + if (!tok) + return NULL; + obj = json_tokener_parse_ex(tok, str, -1); + *error = tok->err; + if(tok->err != json_tokener_success) { + if (obj != NULL) + json_object_put(obj); + obj = NULL; + } + + json_tokener_free(tok); + return obj; +} + +#define state tok->stack[tok->depth].state +#define saved_state tok->stack[tok->depth].saved_state +#define current tok->stack[tok->depth].current +#define obj_field_name tok->stack[tok->depth].obj_field_name + +/* Optimization: + * json_tokener_parse_ex() consumed a lot of CPU in its main loop, + * iterating character-by character. A large performance boost is + * achieved by using tighter loops to locally handle units such as + * comments and strings. Loops that handle an entire token within + * their scope also gather entire strings and pass them to + * printbuf_memappend() in a single call, rather than calling + * printbuf_memappend() one char at a time. + * + * PEEK_CHAR() and ADVANCE_CHAR() macros are used for code that is + * common to both the main loop and the tighter loops. + */ + +/* PEEK_CHAR(dest, tok) macro: + * Peeks at the current char and stores it in dest. + * Returns 1 on success, sets tok->err and returns 0 if no more chars. + * Implicit inputs: str, len vars + */ +#define PEEK_CHAR(dest, tok) \ + (((tok)->char_offset == len) ? \ + (((tok)->depth == 0 && state == json_tokener_state_eatws && saved_state == json_tokener_state_finish) ? \ + (((tok)->err = json_tokener_success), 0) \ + : \ + (((tok)->err = json_tokener_continue), 0) \ + ) : \ + (((dest) = *str), 1) \ + ) + +/* ADVANCE_CHAR() macro: + * Incrementes str & tok->char_offset. + * For convenience of existing conditionals, returns the old value of c (0 on eof) + * Implicit inputs: c var + */ +#define ADVANCE_CHAR(str, tok) \ + ( ++(str), ((tok)->char_offset)++, c) + + +/* End optimization macro defs */ + + +struct json_object* json_tokener_parse_ex(struct json_tokener *tok, + const char *str, int len) +{ + struct json_object *obj = NULL; + char c = '\1'; +#ifdef HAVE_SETLOCALE + char *oldlocale=NULL, *tmplocale; + + tmplocale = setlocale(LC_NUMERIC, NULL); + if (tmplocale) oldlocale = strdup(tmplocale); + setlocale(LC_NUMERIC, "C"); +#endif + + tok->char_offset = 0; + tok->err = json_tokener_success; + + /* this interface is presently not 64-bit clean due to the int len argument + and the internal printbuf interface that takes 32-bit int len arguments + so the function limits the maximum string size to INT32_MAX (2GB). + If the function is called with len == -1 then strlen is called to check + the string length is less than INT32_MAX (2GB) */ + if ((len < -1) || (len == -1 && strlen(str) > INT32_MAX)) { + tok->err = json_tokener_error_size; + return NULL; + } + + while (PEEK_CHAR(c, tok)) { + + redo_char: + switch(state) { + + case json_tokener_state_eatws: + /* Advance until we change state */ + while (isspace((int)c)) { + if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok))) + goto out; + } + if(c == '/' && !(tok->flags & JSON_TOKENER_STRICT)) { + printbuf_reset(tok->pb); + printbuf_memappend_fast(tok->pb, &c, 1); + state = json_tokener_state_comment_start; + } else { + state = saved_state; + goto redo_char; + } + break; + + case json_tokener_state_start: + switch(c) { + case '{': + state = json_tokener_state_eatws; + saved_state = json_tokener_state_object_field_start; + current = json_object_new_object(); + break; + case '[': + state = json_tokener_state_eatws; + saved_state = json_tokener_state_array; + current = json_object_new_array(); + break; + case 'I': + case 'i': + state = json_tokener_state_inf; + printbuf_reset(tok->pb); + tok->st_pos = 0; + goto redo_char; + case 'N': + case 'n': + state = json_tokener_state_null; // or NaN + printbuf_reset(tok->pb); + tok->st_pos = 0; + goto redo_char; + case '\'': + if (tok->flags & JSON_TOKENER_STRICT) { + /* in STRICT mode only double-quote are allowed */ + tok->err = json_tokener_error_parse_unexpected; + goto out; + } + case '"': + state = json_tokener_state_string; + printbuf_reset(tok->pb); + tok->quote_char = c; + break; + case 'T': + case 't': + case 'F': + case 'f': + state = json_tokener_state_boolean; + printbuf_reset(tok->pb); + tok->st_pos = 0; + goto redo_char; +#if defined(__GNUC__) + case '0' ... '9': +#else + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': +#endif + case '-': + state = json_tokener_state_number; + printbuf_reset(tok->pb); + tok->is_double = 0; + goto redo_char; + default: + tok->err = json_tokener_error_parse_unexpected; + goto out; + } + break; + + case json_tokener_state_finish: + if(tok->depth == 0) goto out; + obj = json_object_get(current); + json_tokener_reset_level(tok, tok->depth); + tok->depth--; + goto redo_char; + + case json_tokener_state_inf: /* aka starts with 'i' */ + { + int size_inf; + int is_negative = 0; + + printbuf_memappend_fast(tok->pb, &c, 1); + size_inf = json_min(tok->st_pos+1, json_inf_str_len); + char *infbuf = tok->pb->buf; + if (*infbuf == '-') + { + infbuf++; + is_negative = 1; + } + if ((!(tok->flags & JSON_TOKENER_STRICT) && + strncasecmp(json_inf_str, infbuf, size_inf) == 0) || + (strncmp(json_inf_str, infbuf, size_inf) == 0) + ) + { + if (tok->st_pos == json_inf_str_len) + { + current = json_object_new_double(is_negative ? -INFINITY : INFINITY); + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + } else { + tok->err = json_tokener_error_parse_unexpected; + goto out; + } + tok->st_pos++; + } + break; + case json_tokener_state_null: /* aka starts with 'n' */ + { + int size; + int size_nan; + printbuf_memappend_fast(tok->pb, &c, 1); + size = json_min(tok->st_pos+1, json_null_str_len); + size_nan = json_min(tok->st_pos+1, json_nan_str_len); + if((!(tok->flags & JSON_TOKENER_STRICT) && + strncasecmp(json_null_str, tok->pb->buf, size) == 0) + || (strncmp(json_null_str, tok->pb->buf, size) == 0) + ) { + if (tok->st_pos == json_null_str_len) { + current = NULL; + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + } + else if ((!(tok->flags & JSON_TOKENER_STRICT) && + strncasecmp(json_nan_str, tok->pb->buf, size_nan) == 0) || + (strncmp(json_nan_str, tok->pb->buf, size_nan) == 0) + ) + { + if (tok->st_pos == json_nan_str_len) + { + current = json_object_new_double(NAN); + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + } else { + tok->err = json_tokener_error_parse_null; + goto out; + } + tok->st_pos++; + } + break; + + case json_tokener_state_comment_start: + if(c == '*') { + state = json_tokener_state_comment; + } else if(c == '/') { + state = json_tokener_state_comment_eol; + } else { + tok->err = json_tokener_error_parse_comment; + goto out; + } + printbuf_memappend_fast(tok->pb, &c, 1); + break; + + case json_tokener_state_comment: + { + /* Advance until we change state */ + const char *case_start = str; + while(c != '*') { + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + goto out; + } + } + printbuf_memappend_fast(tok->pb, case_start, 1+str-case_start); + state = json_tokener_state_comment_end; + } + break; + + case json_tokener_state_comment_eol: + { + /* Advance until we change state */ + const char *case_start = str; + while(c != '\n') { + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + goto out; + } + } + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf); + state = json_tokener_state_eatws; + } + break; + + case json_tokener_state_comment_end: + printbuf_memappend_fast(tok->pb, &c, 1); + if(c == '/') { + MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf); + state = json_tokener_state_eatws; + } else { + state = json_tokener_state_comment; + } + break; + + case json_tokener_state_string: + { + /* Advance until we change state */ + const char *case_start = str; + while(1) { + if(c == tok->quote_char) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos); + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + break; + } else if(c == '\\') { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + saved_state = json_tokener_state_string; + state = json_tokener_state_string_escape; + break; + } + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + goto out; + } + } + } + break; + + case json_tokener_state_string_escape: + switch(c) { + case '"': + case '\\': + case '/': + printbuf_memappend_fast(tok->pb, &c, 1); + state = saved_state; + break; + case 'b': + case 'n': + case 'r': + case 't': + case 'f': + if(c == 'b') printbuf_memappend_fast(tok->pb, "\b", 1); + else if(c == 'n') printbuf_memappend_fast(tok->pb, "\n", 1); + else if(c == 'r') printbuf_memappend_fast(tok->pb, "\r", 1); + else if(c == 't') printbuf_memappend_fast(tok->pb, "\t", 1); + else if(c == 'f') printbuf_memappend_fast(tok->pb, "\f", 1); + state = saved_state; + break; + case 'u': + tok->ucs_char = 0; + tok->st_pos = 0; + state = json_tokener_state_escape_unicode; + break; + default: + tok->err = json_tokener_error_parse_string; + goto out; + } + break; + + case json_tokener_state_escape_unicode: + { + unsigned int got_hi_surrogate = 0; + + /* Handle a 4-byte sequence, or two sequences if a surrogate pair */ + while(1) { + if(strchr(json_hex_chars, c)) { + tok->ucs_char += ((unsigned int)jt_hexdigit(c) << ((3-tok->st_pos++)*4)); + if(tok->st_pos == 4) { + unsigned char unescaped_utf[4]; + + if (got_hi_surrogate) { + if (IS_LOW_SURROGATE(tok->ucs_char)) { + /* Recalculate the ucs_char, then fall thru to process normally */ + tok->ucs_char = DECODE_SURROGATE_PAIR(got_hi_surrogate, tok->ucs_char); + } else { + /* Hi surrogate was not followed by a low surrogate */ + /* Replace the hi and process the rest normally */ + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + } + got_hi_surrogate = 0; + } + + if (tok->ucs_char < 0x80) { + unescaped_utf[0] = tok->ucs_char; + printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 1); + } else if (tok->ucs_char < 0x800) { + unescaped_utf[0] = 0xc0 | (tok->ucs_char >> 6); + unescaped_utf[1] = 0x80 | (tok->ucs_char & 0x3f); + printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 2); + } else if (IS_HIGH_SURROGATE(tok->ucs_char)) { + /* Got a high surrogate. Remember it and look for the + * the beginning of another sequence, which should be the + * low surrogate. + */ + got_hi_surrogate = tok->ucs_char; + /* Not at end, and the next two chars should be "\u" */ + if ((tok->char_offset+1 != len) && + (tok->char_offset+2 != len) && + (str[1] == '\\') && + (str[2] == 'u')) + { + /* Advance through the 16 bit surrogate, and move on to the + * next sequence. The next step is to process the following + * characters. + */ + if( !ADVANCE_CHAR(str, tok) || !ADVANCE_CHAR(str, tok) ) { + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + } + /* Advance to the first char of the next sequence and + * continue processing with the next sequence. + */ + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + goto out; + } + tok->ucs_char = 0; + tok->st_pos = 0; + continue; /* other json_tokener_state_escape_unicode */ + } else { + /* Got a high surrogate without another sequence following + * it. Put a replacement char in for the hi surrogate + * and pretend we finished. + */ + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + } + } else if (IS_LOW_SURROGATE(tok->ucs_char)) { + /* Got a low surrogate not preceded by a high */ + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + } else if (tok->ucs_char < 0x10000) { + unescaped_utf[0] = 0xe0 | (tok->ucs_char >> 12); + unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 6) & 0x3f); + unescaped_utf[2] = 0x80 | (tok->ucs_char & 0x3f); + printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 3); + } else if (tok->ucs_char < 0x110000) { + unescaped_utf[0] = 0xf0 | ((tok->ucs_char >> 18) & 0x07); + unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 12) & 0x3f); + unescaped_utf[2] = 0x80 | ((tok->ucs_char >> 6) & 0x3f); + unescaped_utf[3] = 0x80 | (tok->ucs_char & 0x3f); + printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 4); + } else { + /* Don't know what we got--insert the replacement char */ + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + } + state = saved_state; + break; + } + } else { + tok->err = json_tokener_error_parse_string; + goto out; + } + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + if (got_hi_surrogate) /* Clean up any pending chars */ + printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3); + goto out; + } + } + } + break; + + case json_tokener_state_boolean: + { + int size1, size2; + printbuf_memappend_fast(tok->pb, &c, 1); + size1 = json_min(tok->st_pos+1, json_true_str_len); + size2 = json_min(tok->st_pos+1, json_false_str_len); + if((!(tok->flags & JSON_TOKENER_STRICT) && + strncasecmp(json_true_str, tok->pb->buf, size1) == 0) + || (strncmp(json_true_str, tok->pb->buf, size1) == 0) + ) { + if(tok->st_pos == json_true_str_len) { + current = json_object_new_boolean(1); + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + } else if((!(tok->flags & JSON_TOKENER_STRICT) && + strncasecmp(json_false_str, tok->pb->buf, size2) == 0) + || (strncmp(json_false_str, tok->pb->buf, size2) == 0)) { + if(tok->st_pos == json_false_str_len) { + current = json_object_new_boolean(0); + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + } else { + tok->err = json_tokener_error_parse_boolean; + goto out; + } + tok->st_pos++; + } + break; + + case json_tokener_state_number: + { + /* Advance until we change state */ + const char *case_start = str; + int case_len=0; + while(c && strchr(json_number_chars, c)) { + ++case_len; + if(c == '.' || c == 'e' || c == 'E') + tok->is_double = 1; + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, case_start, case_len); + goto out; + } + } + if (case_len>0) + printbuf_memappend_fast(tok->pb, case_start, case_len); + + // Check for -Infinity + if (tok->pb->buf[0] == '-' && case_len == 1 && + (c == 'i' || c == 'I')) + { + state = json_tokener_state_inf; + goto redo_char; + } + } + { + int64_t num64; + double numd; + if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) { + if (num64 && tok->pb->buf[0]=='0' && (tok->flags & JSON_TOKENER_STRICT)) { + /* in strict mode, number must not start with 0 */ + tok->err = json_tokener_error_parse_number; + goto out; + } + current = json_object_new_int64(num64); + } + else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0) + { + current = json_object_new_double_s(numd, tok->pb->buf); + } else { + tok->err = json_tokener_error_parse_number; + goto out; + } + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + goto redo_char; + } + break; + + case json_tokener_state_array_after_sep: + case json_tokener_state_array: + if(c == ']') { + if (state == json_tokener_state_array_after_sep && + (tok->flags & JSON_TOKENER_STRICT)) + { + tok->err = json_tokener_error_parse_unexpected; + goto out; + } + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else { + if(tok->depth >= tok->max_depth-1) { + tok->err = json_tokener_error_depth; + goto out; + } + state = json_tokener_state_array_add; + tok->depth++; + json_tokener_reset_level(tok, tok->depth); + goto redo_char; + } + break; + + case json_tokener_state_array_add: + json_object_array_add(current, obj); + saved_state = json_tokener_state_array_sep; + state = json_tokener_state_eatws; + goto redo_char; + + case json_tokener_state_array_sep: + if(c == ']') { + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else if(c == ',') { + saved_state = json_tokener_state_array_after_sep; + state = json_tokener_state_eatws; + } else { + tok->err = json_tokener_error_parse_array; + goto out; + } + break; + + case json_tokener_state_object_field_start: + case json_tokener_state_object_field_start_after_sep: + if(c == '}') { + if (state == json_tokener_state_object_field_start_after_sep && + (tok->flags & JSON_TOKENER_STRICT)) + { + tok->err = json_tokener_error_parse_unexpected; + goto out; + } + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else if (c == '"' || c == '\'') { + tok->quote_char = c; + printbuf_reset(tok->pb); + state = json_tokener_state_object_field; + } else { + tok->err = json_tokener_error_parse_object_key_name; + goto out; + } + break; + + case json_tokener_state_object_field: + { + /* Advance until we change state */ + const char *case_start = str; + while(1) { + if(c == tok->quote_char) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + obj_field_name = strdup(tok->pb->buf); + saved_state = json_tokener_state_object_field_end; + state = json_tokener_state_eatws; + break; + } else if(c == '\\') { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + saved_state = json_tokener_state_object_field; + state = json_tokener_state_string_escape; + break; + } + if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) { + printbuf_memappend_fast(tok->pb, case_start, str-case_start); + goto out; + } + } + } + break; + + case json_tokener_state_object_field_end: + if(c == ':') { + saved_state = json_tokener_state_object_value; + state = json_tokener_state_eatws; + } else { + tok->err = json_tokener_error_parse_object_key_sep; + goto out; + } + break; + + case json_tokener_state_object_value: + if(tok->depth >= tok->max_depth-1) { + tok->err = json_tokener_error_depth; + goto out; + } + state = json_tokener_state_object_value_add; + tok->depth++; + json_tokener_reset_level(tok, tok->depth); + goto redo_char; + + case json_tokener_state_object_value_add: + json_object_object_add(current, obj_field_name, obj); + free(obj_field_name); + obj_field_name = NULL; + saved_state = json_tokener_state_object_sep; + state = json_tokener_state_eatws; + goto redo_char; + + case json_tokener_state_object_sep: + if(c == '}') { + saved_state = json_tokener_state_finish; + state = json_tokener_state_eatws; + } else if(c == ',') { + saved_state = json_tokener_state_object_field_start_after_sep; + state = json_tokener_state_eatws; + } else { + tok->err = json_tokener_error_parse_object_value_sep; + goto out; + } + break; + + } + if (!ADVANCE_CHAR(str, tok)) + goto out; + } /* while(POP_CHAR) */ + + out: + if (c && + (state == json_tokener_state_finish) && + (tok->depth == 0) && + (tok->flags & JSON_TOKENER_STRICT)) { + /* unexpected char after JSON data */ + tok->err = json_tokener_error_parse_unexpected; + } + if (!c) { /* We hit an eof char (0) */ + if(state != json_tokener_state_finish && + saved_state != json_tokener_state_finish) + tok->err = json_tokener_error_parse_eof; + } + +#ifdef HAVE_SETLOCALE + setlocale(LC_NUMERIC, oldlocale); + if (oldlocale) free(oldlocale); +#endif + + if (tok->err == json_tokener_success) + { + json_object *ret = json_object_get(current); + int ii; + + /* Partially reset, so we parse additional objects on subsequent calls. */ + for(ii = tok->depth; ii >= 0; ii--) + json_tokener_reset_level(tok, ii); + return ret; + } + + MC_DEBUG("json_tokener_parse_ex: error %s at offset %d\n", + json_tokener_errors[tok->err], tok->char_offset); + return NULL; +} + +void json_tokener_set_flags(struct json_tokener *tok, int flags) +{ + tok->flags = flags; +} diff --git a/json-c/json_tokener.h b/json-c/json_tokener.h new file mode 100644 index 0000000..a72d2bd --- /dev/null +++ b/json-c/json_tokener.h @@ -0,0 +1,208 @@ +/* + * $Id: json_tokener.h,v 1.10 2006/07/25 03:24:50 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _json_tokener_h_ +#define _json_tokener_h_ + +#include +#include "json_object.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum json_tokener_error { + json_tokener_success, + json_tokener_continue, + json_tokener_error_depth, + json_tokener_error_parse_eof, + json_tokener_error_parse_unexpected, + json_tokener_error_parse_null, + json_tokener_error_parse_boolean, + json_tokener_error_parse_number, + json_tokener_error_parse_array, + json_tokener_error_parse_object_key_name, + json_tokener_error_parse_object_key_sep, + json_tokener_error_parse_object_value_sep, + json_tokener_error_parse_string, + json_tokener_error_parse_comment, + json_tokener_error_size +}; + +enum json_tokener_state { + json_tokener_state_eatws, + json_tokener_state_start, + json_tokener_state_finish, + json_tokener_state_null, + json_tokener_state_comment_start, + json_tokener_state_comment, + json_tokener_state_comment_eol, + json_tokener_state_comment_end, + json_tokener_state_string, + json_tokener_state_string_escape, + json_tokener_state_escape_unicode, + json_tokener_state_boolean, + json_tokener_state_number, + json_tokener_state_array, + json_tokener_state_array_add, + json_tokener_state_array_sep, + json_tokener_state_object_field_start, + json_tokener_state_object_field, + json_tokener_state_object_field_end, + json_tokener_state_object_value, + json_tokener_state_object_value_add, + json_tokener_state_object_sep, + json_tokener_state_array_after_sep, + json_tokener_state_object_field_start_after_sep, + json_tokener_state_inf +}; + +struct json_tokener_srec +{ + enum json_tokener_state state, saved_state; + struct json_object *obj; + struct json_object *current; + char *obj_field_name; +}; + +#define JSON_TOKENER_DEFAULT_DEPTH 32 + +struct json_tokener +{ + char *str; + struct printbuf *pb; + int max_depth, depth, is_double, st_pos, char_offset; + enum json_tokener_error err; + unsigned int ucs_char; + char quote_char; + struct json_tokener_srec *stack; + int flags; +}; + +/** + * Be strict when parsing JSON input. Use caution with + * this flag as what is considered valid may become more + * restrictive from one release to the next, causing your + * code to fail on previously working input. + * + * This flag is not set by default. + * + * @see json_tokener_set_flags() + */ +#define JSON_TOKENER_STRICT 0x01 + +/** + * Given an error previously returned by json_tokener_get_error(), + * return a human readable description of the error. + * + * @return a generic error message is returned if an invalid error value is provided. + */ +const char *json_tokener_error_desc(enum json_tokener_error jerr); + +/** + * Retrieve the error caused by the last call to json_tokener_parse_ex(), + * or json_tokener_success if there is no error. + * + * When parsing a JSON string in pieces, if the tokener is in the middle + * of parsing this will return json_tokener_continue. + * + * See also json_tokener_error_desc(). + */ +enum json_tokener_error json_tokener_get_error(struct json_tokener *tok); + +extern struct json_tokener* json_tokener_new(void); +extern struct json_tokener* json_tokener_new_ex(int depth); +extern void json_tokener_free(struct json_tokener *tok); +extern void json_tokener_reset(struct json_tokener *tok); +extern struct json_object* json_tokener_parse(const char *str); +extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error); + +/** + * Set flags that control how parsing will be done. + */ +extern void json_tokener_set_flags(struct json_tokener *tok, int flags); + +/** + * Parse a string and return a non-NULL json_object if a valid JSON value + * is found. The string does not need to be a JSON object or array; + * it can also be a string, number or boolean value. + * + * A partial JSON string can be parsed. If the parsing is incomplete, + * NULL will be returned and json_tokener_get_error() will be return + * json_tokener_continue. + * json_tokener_parse_ex() can then be called with additional bytes in str + * to continue the parsing. + * + * If json_tokener_parse_ex() returns NULL and the error anything other than + * json_tokener_continue, a fatal error has occurred and parsing must be + * halted. Then tok object must not be re-used until json_tokener_reset() is + * called. + * + * When a valid JSON value is parsed, a non-NULL json_object will be + * returned. Also, json_tokener_get_error() will return json_tokener_success. + * Be sure to check the type with json_object_is_type() or + * json_object_get_type() before using the object. + * + * @b XXX this shouldn't use internal fields: + * Trailing characters after the parsed value do not automatically cause an + * error. It is up to the caller to decide whether to treat this as an + * error or to handle the additional characters, perhaps by parsing another + * json value starting from that point. + * + * Extra characters can be detected by comparing the tok->char_offset against + * the length of the last len parameter passed in. + * + * The tokener does \b not maintain an internal buffer so the caller is + * responsible for calling json_tokener_parse_ex with an appropriate str + * parameter starting with the extra characters. + * + * This interface is presently not 64-bit clean due to the int len argument + * so the function limits the maximum string size to INT32_MAX (2GB). + * If the function is called with len == -1 then strlen is called to check + * the string length is less than INT32_MAX (2GB) + * + * Example: + * @code +json_object *jobj = NULL; +const char *mystring = NULL; +int stringlen = 0; +enum json_tokener_error jerr; +do { + mystring = ... // get JSON string, e.g. read from file, etc... + stringlen = strlen(mystring); + jobj = json_tokener_parse_ex(tok, mystring, stringlen); +} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue); +if (jerr != json_tokener_success) +{ + fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr)); + // Handle errors, as appropriate for your application. +} +if (tok->char_offset < stringlen) // XXX shouldn't access internal fields +{ + // Handle extra characters after parsed object as desired. + // e.g. issue an error, parse another object from that point, etc... +} +// Success, use jobj here. + +@endcode + * + * @param tok a json_tokener previously allocated with json_tokener_new() + * @param str an string with any valid JSON expression, or portion of. This does not need to be null terminated. + * @param len the length of str + */ +extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok, + const char *str, int len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/json_util.c b/json-c/json_util.c new file mode 100644 index 0000000..2a5621b --- /dev/null +++ b/json-c/json_util.c @@ -0,0 +1,299 @@ +/* + * $Id: json_util.c,v 1.4 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include "config.h" +#undef realloc + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif /* HAVE_SYS_TYPES_H */ + +#ifdef HAVE_SYS_STAT_H +#include +#endif /* HAVE_SYS_STAT_H */ + +#ifdef HAVE_FCNTL_H +#include +#endif /* HAVE_FCNTL_H */ + +#ifdef HAVE_UNISTD_H +# include +#endif /* HAVE_UNISTD_H */ + +#ifdef WIN32 +# define WIN32_LEAN_AND_MEAN +# include +# include +#endif /* defined(WIN32) */ + +#if !defined(HAVE_OPEN) && defined(WIN32) +# define open _open +#endif + +#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) + /* MSC has the version as _snprintf */ +# define snprintf _snprintf +#elif !defined(HAVE_SNPRINTF) +# error You do not have snprintf on your system. +#endif /* HAVE_SNPRINTF */ + +#include "debug.h" +#include "printbuf.h" +#include "json_inttypes.h" +#include "json_object.h" +#include "json_tokener.h" +#include "json_util.h" + +static int sscanf_is_broken = 0; +static int sscanf_is_broken_testdone = 0; +static void sscanf_is_broken_test(void); + +struct json_object* json_object_from_file(const char *filename) +{ + struct printbuf *pb; + struct json_object *obj; + char buf[JSON_FILE_BUF_SIZE]; + int fd, ret; + + if((fd = open(filename, O_RDONLY)) < 0) { + MC_ERROR("json_object_from_file: error opening file %s: %s\n", + filename, strerror(errno)); + return NULL; + } + if(!(pb = printbuf_new())) { + close(fd); + MC_ERROR("json_object_from_file: printbuf_new failed\n"); + return NULL; + } + while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) { + printbuf_memappend(pb, buf, ret); + } + close(fd); + if(ret < 0) { + MC_ERROR("json_object_from_file: error reading file %s: %s\n", + filename, strerror(errno)); + printbuf_free(pb); + return NULL; + } + obj = json_tokener_parse(pb->buf); + printbuf_free(pb); + return obj; +} + +/* extended "format and write to file" function */ + +int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags) +{ + const char *json_str; + int fd, ret; + unsigned int wpos, wsize; + + if(!obj) { + MC_ERROR("json_object_to_file: object is null\n"); + return -1; + } + + if((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) { + MC_ERROR("json_object_to_file: error opening file %s: %s\n", + filename, strerror(errno)); + return -1; + } + + if(!(json_str = json_object_to_json_string_ext(obj,flags))) { + close(fd); + return -1; + } + + wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */ + wpos = 0; + while(wpos < wsize) { + if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) { + close(fd); + MC_ERROR("json_object_to_file: error writing file %s: %s\n", + filename, strerror(errno)); + return -1; + } + + /* because of the above check for ret < 0, we can safely cast and add */ + wpos += (unsigned int)ret; + } + + close(fd); + return 0; +} + +// backwards compatible "format and write to file" function + +int json_object_to_file(const char *filename, struct json_object *obj) +{ + return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN); +} + +int json_parse_double(const char *buf, double *retval) +{ + return (sscanf(buf, "%lf", retval)==1 ? 0 : 1); +} + +/* + * Not all implementations of sscanf actually work properly. + * Check whether the one we're currently using does, and if + * it's broken, enable the workaround code. + */ +static void sscanf_is_broken_test() +{ + int64_t num64; + int ret_errno, is_int64_min, ret_errno2, is_int64_max; + + (void)sscanf(" -01234567890123456789012345", "%" SCNd64, &num64); + ret_errno = errno; + is_int64_min = (num64 == INT64_MIN); + + (void)sscanf(" 01234567890123456789012345", "%" SCNd64, &num64); + ret_errno2 = errno; + is_int64_max = (num64 == INT64_MAX); + + if (ret_errno != ERANGE || !is_int64_min || + ret_errno2 != ERANGE || !is_int64_max) + { + MC_DEBUG("sscanf_is_broken_test failed, enabling workaround code\n"); + sscanf_is_broken = 1; + } +} + +int json_parse_int64(const char *buf, int64_t *retval) +{ + int64_t num64; + const char *buf_sig_digits; + int orig_has_neg; + int saved_errno; + + if (!sscanf_is_broken_testdone) + { + sscanf_is_broken_test(); + sscanf_is_broken_testdone = 1; + } + + // Skip leading spaces + while (isspace((int)*buf) && *buf) + buf++; + + errno = 0; // sscanf won't always set errno, so initialize + if (sscanf(buf, "%" SCNd64, &num64) != 1) + { + MC_DEBUG("Failed to parse, sscanf != 1\n"); + return 1; + } + + saved_errno = errno; + buf_sig_digits = buf; + orig_has_neg = 0; + if (*buf_sig_digits == '-') + { + buf_sig_digits++; + orig_has_neg = 1; + } + + // Not all sscanf implementations actually work + if (sscanf_is_broken && saved_errno != ERANGE) + { + char buf_cmp[100]; + char *buf_cmp_start = buf_cmp; + int recheck_has_neg = 0; + int buf_cmp_len; + + // Skip leading zeros, but keep at least one digit + while (buf_sig_digits[0] == '0' && buf_sig_digits[1] != '\0') + buf_sig_digits++; + if (num64 == 0) // assume all sscanf impl's will parse -0 to 0 + orig_has_neg = 0; // "-0" is the same as just plain "0" + + snprintf(buf_cmp_start, sizeof(buf_cmp), "%" PRId64, num64); + if (*buf_cmp_start == '-') + { + recheck_has_neg = 1; + buf_cmp_start++; + } + // No need to skip leading spaces or zeros here. + + buf_cmp_len = strlen(buf_cmp_start); + /** + * If the sign is different, or + * some of the digits are different, or + * there is another digit present in the original string + * then we have NOT successfully parsed the value. + */ + if (orig_has_neg != recheck_has_neg || + strncmp(buf_sig_digits, buf_cmp_start, strlen(buf_cmp_start)) != 0 || + ((int)strlen(buf_sig_digits) != buf_cmp_len && + isdigit((int)buf_sig_digits[buf_cmp_len]) + ) + ) + { + saved_errno = ERANGE; + } + } + + // Not all sscanf impl's set the value properly when out of range. + // Always do this, even for properly functioning implementations, + // since it shouldn't slow things down much. + if (saved_errno == ERANGE) + { + if (orig_has_neg) + num64 = INT64_MIN; + else + num64 = INT64_MAX; + } + *retval = num64; + return 0; +} + +#ifndef HAVE_REALLOC +void* rpl_realloc(void* p, size_t n) +{ + if (n == 0) + n = 1; + if (p == 0) + return malloc(n); + return realloc(p, n); +} +#endif + +#define NELEM(a) (sizeof(a) / sizeof(a[0])) +static const char* json_type_name[] = { + /* If you change this, be sure to update the enum json_type definition too */ + "null", + "boolean", + "double", + "int", + "object", + "array", + "string", +}; + +const char *json_type_to_name(enum json_type o_type) +{ + int o_type_int = (int)o_type; + if (o_type_int < 0 || o_type_int >= (int)NELEM(json_type_name)) + { + MC_ERROR("json_type_to_name: type %d is out of range [0,%d]\n", o_type, NELEM(json_type_name)); + return NULL; + } + return json_type_name[o_type]; +} + diff --git a/json-c/json_util.h b/json-c/json_util.h new file mode 100644 index 0000000..387dbc4 --- /dev/null +++ b/json-c/json_util.h @@ -0,0 +1,50 @@ +/* + * $Id: json_util.h,v 1.4 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _json_util_h_ +#define _json_util_h_ + +#include "json_object.h" + +#ifndef json_min +#define json_min(a,b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef json_max +#define json_max(a,b) ((a) > (b) ? (a) : (b)) +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +#define JSON_FILE_BUF_SIZE 4096 + +/* utility functions */ +extern struct json_object* json_object_from_file(const char *filename); +extern int json_object_to_file(const char *filename, struct json_object *obj); +extern int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags); +extern int json_parse_int64(const char *buf, int64_t *retval); +extern int json_parse_double(const char *buf, double *retval); + + +/** + * Return a string describing the type of the object. + * e.g. "int", or "object", etc... + */ +extern const char *json_type_to_name(enum json_type o_type); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/libjson.c b/json-c/libjson.c new file mode 100644 index 0000000..5284fd0 --- /dev/null +++ b/json-c/libjson.c @@ -0,0 +1,26 @@ + +/* dummy source file for compatibility purposes */ + +#if defined(HAVE_CDEFS_H) +#include +#endif + +#ifndef __warn_references + +#if defined(__GNUC__) && defined (HAS_GNU_WARNING_LONG) + +#define __warn_references(sym,msg) \ + __asm__(".section .gnu" #sym ",\n\t.ascii \"" msg "\"\n\t.text"); + +#else +#define __warn_references(sym,msg) /* nothing */ +#endif + +#endif + +#include "json_object.h" + +__warn_references(json_object_get, "Warning: please link against libjson-c instead of libjson"); + +/* __asm__(".section .gnu.warning." __STRING(sym) \ + " ; .ascii \"" msg "\" ; .text") */ diff --git a/json-c/linkhash.c b/json-c/linkhash.c new file mode 100644 index 0000000..712c387 --- /dev/null +++ b/json-c/linkhash.c @@ -0,0 +1,602 @@ +/* + * $Id: linkhash.c,v 1.4 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_ENDIAN_H +# include /* attempt to define endianness */ +#endif + +#include "random_seed.h" +#include "linkhash.h" + +void lh_abort(const char *msg, ...) +{ + va_list ap; + va_start(ap, msg); + vprintf(msg, ap); + va_end(ap); + exit(1); +} + +unsigned long lh_ptr_hash(const void *k) +{ + /* CAW: refactored to be 64bit nice */ + return (unsigned long)((((ptrdiff_t)k * LH_PRIME) >> 4) & ULONG_MAX); +} + +int lh_ptr_equal(const void *k1, const void *k2) +{ + return (k1 == k2); +} + +/* + * hashlittle from lookup3.c, by Bob Jenkins, May 2006, Public Domain. + * http://burtleburtle.net/bob/c/lookup3.c + * minor modifications to make functions static so no symbols are exported + * minor mofifications to compile with -Werror + */ + +/* +------------------------------------------------------------------------------- +lookup3.c, by Bob Jenkins, May 2006, Public Domain. + +These are functions for producing 32-bit hashes for hash table lookup. +hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final() +are externally useful functions. Routines to test the hash are included +if SELF_TEST is defined. You can use this free for any purpose. It's in +the public domain. It has no warranty. + +You probably want to use hashlittle(). hashlittle() and hashbig() +hash byte arrays. hashlittle() is is faster than hashbig() on +little-endian machines. Intel and AMD are little-endian machines. +On second thought, you probably want hashlittle2(), which is identical to +hashlittle() except it returns two 32-bit hashes for the price of one. +You could implement hashbig2() if you wanted but I haven't bothered here. + +If you want to find a hash of, say, exactly 7 integers, do + a = i1; b = i2; c = i3; + mix(a,b,c); + a += i4; b += i5; c += i6; + mix(a,b,c); + a += i7; + final(a,b,c); +then use c as the hash value. If you have a variable length array of +4-byte integers to hash, use hashword(). If you have a byte array (like +a character string), use hashlittle(). If you have several byte arrays, or +a mix of things, see the comments above hashlittle(). + +Why is this so big? I read 12 bytes at a time into 3 4-byte integers, +then mix those integers. This is fast (you can do a lot more thorough +mixing with 12*3 instructions on 3 integers than you can with 3 instructions +on 1 byte), but shoehorning those bytes into integers efficiently is messy. +------------------------------------------------------------------------------- +*/ + +/* + * My best guess at if you are big-endian or little-endian. This may + * need adjustment. + */ +#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN) || \ + (defined(i386) || defined(__i386__) || defined(__i486__) || \ + defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL)) +# define HASH_LITTLE_ENDIAN 1 +# define HASH_BIG_ENDIAN 0 +#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ + __BYTE_ORDER == __BIG_ENDIAN) || \ + (defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel)) +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 1 +#else +# define HASH_LITTLE_ENDIAN 0 +# define HASH_BIG_ENDIAN 0 +#endif + +#define hashsize(n) ((uint32_t)1<<(n)) +#define hashmask(n) (hashsize(n)-1) +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) + +/* +------------------------------------------------------------------------------- +mix -- mix 3 32-bit values reversibly. + +This is reversible, so any information in (a,b,c) before mix() is +still in (a,b,c) after mix(). + +If four pairs of (a,b,c) inputs are run through mix(), or through +mix() in reverse, there are at least 32 bits of the output that +are sometimes the same for one pair and different for another pair. +This was tested for: +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that +satisfy this are + 4 6 8 16 19 4 + 9 15 3 18 27 15 + 14 9 3 7 17 3 +Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing +for "differ" defined as + with a one-bit base and a two-bit delta. I +used http://burtleburtle.net/bob/hash/avalanche.html to choose +the operations, constants, and arrangements of the variables. + +This does not achieve avalanche. There are input bits of (a,b,c) +that fail to affect some output bits of (a,b,c), especially of a. The +most thoroughly mixed value is c, but it doesn't really even achieve +avalanche in c. + +This allows some parallelism. Read-after-writes are good at doubling +the number of bits affected, so the goal of mixing pulls in the opposite +direction as the goal of parallelism. I did what I could. Rotates +seem to cost as much as shifts on every machine I could lay my hands +on, and rotates are much kinder to the top and bottom bits, so I used +rotates. +------------------------------------------------------------------------------- +*/ +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} + +/* +------------------------------------------------------------------------------- +final -- final mixing of 3 32-bit values (a,b,c) into c + +Pairs of (a,b,c) values differing in only a few bits will usually +produce values of c that look totally different. This was tested for +* pairs that differed by one bit, by two bits, in any combination + of top bits of (a,b,c), or in any combination of bottom bits of + (a,b,c). +* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed + the output delta to a Gray code (a^(a>>1)) so a string of 1's (as + is commonly produced by subtraction) look like a single 1-bit + difference. +* the base values were pseudorandom, all zero but one bit set, or + all zero plus a counter that starts at zero. + +These constants passed: + 14 11 25 16 4 14 24 + 12 14 25 16 4 14 24 +and these came close: + 4 8 15 26 3 22 24 + 10 8 15 26 3 22 24 + 11 8 15 26 3 22 24 +------------------------------------------------------------------------------- +*/ +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + + +/* +------------------------------------------------------------------------------- +hashlittle() -- hash a variable-length key into a 32-bit value + k : the key (the unaligned variable-length array of bytes) + length : the length of the key, counting by bytes + initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Two keys differing by one or two bits will have +totally different hash values. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do + h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (uint8_t **)k, do it like this: + for (i=0, h=0; i 12) + { + a += k[0]; + b += k[1]; + c += k[2]; + mix(a,b,c); + length -= 12; + k += 3; + } + + /*----------------------------- handle the last (probably partial) block */ + /* + * "k[2]&0xffffff" actually reads beyond the end of the string, but + * then masks off the part it's not allowed to read. Because the + * string is aligned, the masked-off tail is in the same word as the + * rest of the string. Every machine with memory protection I've seen + * does it on word boundaries, so is OK with this. But VALGRIND will + * still catch it and complain. The masking trick does make the hash + * noticably faster for short strings (like English words). + */ +#ifndef VALGRIND + + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break; + case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break; + case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break; + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=k[1]&0xffffff; a+=k[0]; break; + case 6 : b+=k[1]&0xffff; a+=k[0]; break; + case 5 : b+=k[1]&0xff; a+=k[0]; break; + case 4 : a+=k[0]; break; + case 3 : a+=k[0]&0xffffff; break; + case 2 : a+=k[0]&0xffff; break; + case 1 : a+=k[0]&0xff; break; + case 0 : return c; /* zero length strings require no mixing */ + } + +#else /* make valgrind happy */ + + const uint8_t *k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[2]; b+=k[1]; a+=k[0]; break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k8[9])<<8; /* fall through */ + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[1]; a+=k[0]; break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */ + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]; break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */ + case 1 : a+=k8[0]; break; + case 0 : return c; + } + +#endif /* !valgrind */ + + } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) { + const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */ + const uint8_t *k8; + + /*--------------- all but last block: aligned reads and different mixing */ + while (length > 12) + { + a += k[0] + (((uint32_t)k[1])<<16); + b += k[2] + (((uint32_t)k[3])<<16); + c += k[4] + (((uint32_t)k[5])<<16); + mix(a,b,c); + length -= 12; + k += 6; + } + + /*----------------------------- handle the last (probably partial) block */ + k8 = (const uint8_t *)k; + switch(length) + { + case 12: c+=k[4]+(((uint32_t)k[5])<<16); + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 11: c+=((uint32_t)k8[10])<<16; /* fall through */ + case 10: c+=k[4]; + b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 9 : c+=k8[8]; /* fall through */ + case 8 : b+=k[2]+(((uint32_t)k[3])<<16); + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */ + case 6 : b+=k[2]; + a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 5 : b+=k8[4]; /* fall through */ + case 4 : a+=k[0]+(((uint32_t)k[1])<<16); + break; + case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */ + case 2 : a+=k[0]; + break; + case 1 : a+=k8[0]; + break; + case 0 : return c; /* zero length requires no mixing */ + } + + } else { /* need to read the key one byte at a time */ + const uint8_t *k = (const uint8_t *)key; + + /*--------------- all but the last block: affect some 32 bits of (a,b,c) */ + while (length > 12) + { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + /*-------------------------------- last block: affect all 32 bits of (c) */ + switch(length) /* all the case statements fall through */ + { + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : return c; + } + } + + final(a,b,c); + return c; +} + +unsigned long lh_char_hash(const void *k) +{ + static volatile int random_seed = -1; + + if (random_seed == -1) { + int seed; + /* we can't use -1 as it is the unitialized sentinel */ + while ((seed = json_c_get_random_seed()) == -1); +#if defined __GNUC__ + __sync_val_compare_and_swap(&random_seed, -1, seed); +#elif defined _MSC_VER + InterlockedCompareExchange(&random_seed, seed, -1); +#else +#warning "racy random seed initializtion if used by multiple threads" + random_seed = seed; /* potentially racy */ +#endif + } + + return hashlittle((const char*)k, strlen((const char*)k), random_seed); +} + +int lh_char_equal(const void *k1, const void *k2) +{ + return (strcmp((const char*)k1, (const char*)k2) == 0); +} + +struct lh_table* lh_table_new(int size, const char *name, + lh_entry_free_fn *free_fn, + lh_hash_fn *hash_fn, + lh_equal_fn *equal_fn) +{ + int i; + struct lh_table *t; + + t = (struct lh_table*)calloc(1, sizeof(struct lh_table)); + if(!t) lh_abort("lh_table_new: calloc failed\n"); + t->count = 0; + t->size = size; + t->name = name; + t->table = (struct lh_entry*)calloc(size, sizeof(struct lh_entry)); + if(!t->table) lh_abort("lh_table_new: calloc failed\n"); + t->free_fn = free_fn; + t->hash_fn = hash_fn; + t->equal_fn = equal_fn; + for(i = 0; i < size; i++) t->table[i].k = LH_EMPTY; + return t; +} + +struct lh_table* lh_kchar_table_new(int size, const char *name, + lh_entry_free_fn *free_fn) +{ + return lh_table_new(size, name, free_fn, lh_char_hash, lh_char_equal); +} + +struct lh_table* lh_kptr_table_new(int size, const char *name, + lh_entry_free_fn *free_fn) +{ + return lh_table_new(size, name, free_fn, lh_ptr_hash, lh_ptr_equal); +} + +void lh_table_resize(struct lh_table *t, int new_size) +{ + struct lh_table *new_t; + struct lh_entry *ent; + + new_t = lh_table_new(new_size, t->name, NULL, t->hash_fn, t->equal_fn); + ent = t->head; + while(ent) { + lh_table_insert(new_t, ent->k, ent->v); + ent = ent->next; + } + free(t->table); + t->table = new_t->table; + t->size = new_size; + t->head = new_t->head; + t->tail = new_t->tail; + t->resizes++; + free(new_t); +} + +void lh_table_free(struct lh_table *t) +{ + struct lh_entry *c; + for(c = t->head; c != NULL; c = c->next) { + if(t->free_fn) { + t->free_fn(c); + } + } + free(t->table); + free(t); +} + + +int lh_table_insert(struct lh_table *t, void *k, const void *v) +{ + unsigned long h, n; + + t->inserts++; + if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2); + + h = t->hash_fn(k); + n = h % t->size; + + while( 1 ) { + if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) break; + t->collisions++; + if ((int)++n == t->size) n = 0; + } + + t->table[n].k = k; + t->table[n].v = v; + t->count++; + + if(t->head == NULL) { + t->head = t->tail = &t->table[n]; + t->table[n].next = t->table[n].prev = NULL; + } else { + t->tail->next = &t->table[n]; + t->table[n].prev = t->tail; + t->table[n].next = NULL; + t->tail = &t->table[n]; + } + + return 0; +} + + +struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k) +{ + unsigned long h = t->hash_fn(k); + unsigned long n = h % t->size; + int count = 0; + + t->lookups++; + while( count < t->size ) { + if(t->table[n].k == LH_EMPTY) return NULL; + if(t->table[n].k != LH_FREED && + t->equal_fn(t->table[n].k, k)) return &t->table[n]; + if ((int)++n == t->size) n = 0; + count++; + } + return NULL; +} + + +const void* lh_table_lookup(struct lh_table *t, const void *k) +{ + void *result; + lh_table_lookup_ex(t, k, &result); + return result; +} + +json_bool lh_table_lookup_ex(struct lh_table* t, const void* k, void **v) +{ + struct lh_entry *e = lh_table_lookup_entry(t, k); + if (e != NULL) { + if (v != NULL) *v = (void *)e->v; + return TRUE; /* key found */ + } + if (v != NULL) *v = NULL; + return FALSE; /* key not found */ +} + +int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e) +{ + ptrdiff_t n = (ptrdiff_t)(e - t->table); /* CAW: fixed to be 64bit nice, still need the crazy negative case... */ + + /* CAW: this is bad, really bad, maybe stack goes other direction on this machine... */ + if(n < 0) { return -2; } + + if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) return -1; + t->count--; + if(t->free_fn) t->free_fn(e); + t->table[n].v = NULL; + t->table[n].k = LH_FREED; + if(t->tail == &t->table[n] && t->head == &t->table[n]) { + t->head = t->tail = NULL; + } else if (t->head == &t->table[n]) { + t->head->next->prev = NULL; + t->head = t->head->next; + } else if (t->tail == &t->table[n]) { + t->tail->prev->next = NULL; + t->tail = t->tail->prev; + } else { + t->table[n].prev->next = t->table[n].next; + t->table[n].next->prev = t->table[n].prev; + } + t->table[n].next = t->table[n].prev = NULL; + return 0; +} + + +int lh_table_delete(struct lh_table *t, const void *k) +{ + struct lh_entry *e = lh_table_lookup_entry(t, k); + if(!e) return -1; + return lh_table_delete_entry(t, e); +} + +int lh_table_length(struct lh_table *t) +{ + return t->count; +} diff --git a/json-c/linkhash.h b/json-c/linkhash.h new file mode 100644 index 0000000..950d09f --- /dev/null +++ b/json-c/linkhash.h @@ -0,0 +1,292 @@ +/* + * $Id: linkhash.h,v 1.6 2006/01/30 23:07:57 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * Copyright (c) 2009 Hewlett-Packard Development Company, L.P. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef _linkhash_h_ +#define _linkhash_h_ + +#include "json_object.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * golden prime used in hash functions + */ +#define LH_PRIME 0x9e370001UL + +/** + * The fraction of filled hash buckets until an insert will cause the table + * to be resized. + * This can range from just above 0 up to 1.0. + */ +#define LH_LOAD_FACTOR 0.66 + +/** + * sentinel pointer value for empty slots + */ +#define LH_EMPTY (void*)-1 + +/** + * sentinel pointer value for freed slots + */ +#define LH_FREED (void*)-2 + +struct lh_entry; + +/** + * callback function prototypes + */ +typedef void (lh_entry_free_fn) (struct lh_entry *e); +/** + * callback function prototypes + */ +typedef unsigned long (lh_hash_fn) (const void *k); +/** + * callback function prototypes + */ +typedef int (lh_equal_fn) (const void *k1, const void *k2); + +/** + * An entry in the hash table + */ +struct lh_entry { + /** + * The key. + */ + void *k; + /** + * The value. + */ + const void *v; + /** + * The next entry + */ + struct lh_entry *next; + /** + * The previous entry. + */ + struct lh_entry *prev; +}; + + +/** + * The hash table structure. + */ +struct lh_table { + /** + * Size of our hash. + */ + int size; + /** + * Numbers of entries. + */ + int count; + + /** + * Number of collisions. + */ + int collisions; + + /** + * Number of resizes. + */ + int resizes; + + /** + * Number of lookups. + */ + int lookups; + + /** + * Number of inserts. + */ + int inserts; + + /** + * Number of deletes. + */ + int deletes; + + /** + * Name of the hash table. + */ + const char *name; + + /** + * The first entry. + */ + struct lh_entry *head; + + /** + * The last entry. + */ + struct lh_entry *tail; + + struct lh_entry *table; + + /** + * A pointer onto the function responsible for freeing an entry. + */ + lh_entry_free_fn *free_fn; + lh_hash_fn *hash_fn; + lh_equal_fn *equal_fn; +}; + + +/** + * Pre-defined hash and equality functions + */ +extern unsigned long lh_ptr_hash(const void *k); +extern int lh_ptr_equal(const void *k1, const void *k2); + +extern unsigned long lh_char_hash(const void *k); +extern int lh_char_equal(const void *k1, const void *k2); + + +/** + * Convenience list iterator. + */ +#define lh_foreach(table, entry) \ +for(entry = table->head; entry; entry = entry->next) + +/** + * lh_foreach_safe allows calling of deletion routine while iterating. + */ +#define lh_foreach_safe(table, entry, tmp) \ +for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp) + + + +/** + * Create a new linkhash table. + * @param size initial table size. The table is automatically resized + * although this incurs a performance penalty. + * @param name the table name. + * @param free_fn callback function used to free memory for entries + * when lh_table_free or lh_table_delete is called. + * If NULL is provided, then memory for keys and values + * must be freed by the caller. + * @param hash_fn function used to hash keys. 2 standard ones are defined: + * lh_ptr_hash and lh_char_hash for hashing pointer values + * and C strings respectively. + * @param equal_fn comparison function to compare keys. 2 standard ones defined: + * lh_ptr_hash and lh_char_hash for comparing pointer values + * and C strings respectively. + * @return a pointer onto the linkhash table. + */ +extern struct lh_table* lh_table_new(int size, const char *name, + lh_entry_free_fn *free_fn, + lh_hash_fn *hash_fn, + lh_equal_fn *equal_fn); + +/** + * Convenience function to create a new linkhash + * table with char keys. + * @param size initial table size. + * @param name table name. + * @param free_fn callback function used to free memory for entries. + * @return a pointer onto the linkhash table. + */ +extern struct lh_table* lh_kchar_table_new(int size, const char *name, + lh_entry_free_fn *free_fn); + + +/** + * Convenience function to create a new linkhash + * table with ptr keys. + * @param size initial table size. + * @param name table name. + * @param free_fn callback function used to free memory for entries. + * @return a pointer onto the linkhash table. + */ +extern struct lh_table* lh_kptr_table_new(int size, const char *name, + lh_entry_free_fn *free_fn); + + +/** + * Free a linkhash table. + * If a callback free function is provided then it is called for all + * entries in the table. + * @param t table to free. + */ +extern void lh_table_free(struct lh_table *t); + + +/** + * Insert a record into the table. + * @param t the table to insert into. + * @param k a pointer to the key to insert. + * @param v a pointer to the value to insert. + */ +extern int lh_table_insert(struct lh_table *t, void *k, const void *v); + + +/** + * Lookup a record into the table. + * @param t the table to lookup + * @param k a pointer to the key to lookup + * @return a pointer to the record structure of the value or NULL if it does not exist. + */ +extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k); + +/** + * Lookup a record into the table + * @param t the table to lookup + * @param k a pointer to the key to lookup + * @return a pointer to the found value or NULL if it does not exist. + * @deprecated Use lh_table_lookup_ex instead. + */ +THIS_FUNCTION_IS_DEPRECATED(extern const void* lh_table_lookup(struct lh_table *t, const void *k)); + +/** + * Lookup a record in the table + * @param t the table to lookup + * @param k a pointer to the key to lookup + * @param v a pointer to a where to store the found value (set to NULL if it doesn't exist). + * @return whether or not the key was found + */ +extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v); + +/** + * Delete a record from the table. + * If a callback free function is provided then it is called for the + * for the item being deleted. + * @param t the table to delete from. + * @param e a pointer to the entry to delete. + * @return 0 if the item was deleted. + * @return -1 if it was not found. + */ +extern int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e); + + +/** + * Delete a record from the table. + * If a callback free function is provided then it is called for the + * for the item being deleted. + * @param t the table to delete from. + * @param k a pointer to the key to delete. + * @return 0 if the item was deleted. + * @return -1 if it was not found. + */ +extern int lh_table_delete(struct lh_table *t, const void *k); + +extern int lh_table_length(struct lh_table *t); + +void lh_abort(const char *msg, ...); +void lh_table_resize(struct lh_table *t, int new_size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/math_compat.h b/json-c/math_compat.h new file mode 100644 index 0000000..f40b8fa --- /dev/null +++ b/json-c/math_compat.h @@ -0,0 +1,28 @@ +#ifndef __math_compat_h +#define __math_compat_h + +/* Define isnan and isinf on Windows/MSVC */ + +#ifndef HAVE_DECL_ISNAN +# ifdef HAVE_DECL__ISNAN +#include +#define isnan(x) _isnan(x) +# endif +#endif + +#ifndef HAVE_DECL_ISINF +# ifdef HAVE_DECL__FINITE +#include +#define isinf(x) (!_finite(x)) +# endif +#endif + +#ifndef HAVE_DECL_NAN +#error This platform does not have nan() +#endif + +#ifndef HAVE_DECL_INFINITY +#error This platform does not have INFINITY +#endif + +#endif diff --git a/json-c/printbuf.c b/json-c/printbuf.c new file mode 100644 index 0000000..fe952b4 --- /dev/null +++ b/json-c/printbuf.c @@ -0,0 +1,193 @@ +/* + * $Id: printbuf.c,v 1.5 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + * + * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved. + * The copyrights to the contents of this file are licensed under the MIT License + * (http://www.opensource.org/licenses/mit-license.php) + */ + +#include "config.h" + +#include +#include +#include + +#ifdef HAVE_STDARG_H +# include +#else /* !HAVE_STDARG_H */ +# error Not enough var arg support! +#endif /* HAVE_STDARG_H */ + +#include "debug.h" +#include "printbuf.h" + +static int printbuf_extend(struct printbuf *p, int min_size); + +struct printbuf* printbuf_new(void) +{ + struct printbuf *p; + + p = (struct printbuf*)calloc(1, sizeof(struct printbuf)); + if(!p) return NULL; + p->size = 32; + p->bpos = 0; + if(!(p->buf = (char*)malloc(p->size))) { + free(p); + return NULL; + } + return p; +} + + +/** + * Extend the buffer p so it has a size of at least min_size. + * + * If the current size is large enough, nothing is changed. + * + * Note: this does not check the available space! The caller + * is responsible for performing those calculations. + */ +static int printbuf_extend(struct printbuf *p, int min_size) +{ + char *t; + int new_size; + + if (p->size >= min_size) + return 0; + + new_size = p->size * 2; + if (new_size < min_size + 8) + new_size = min_size + 8; +#ifdef PRINTBUF_DEBUG + MC_DEBUG("printbuf_memappend: realloc " + "bpos=%d min_size=%d old_size=%d new_size=%d\n", + p->bpos, min_size, p->size, new_size); +#endif /* PRINTBUF_DEBUG */ + if(!(t = (char*)realloc(p->buf, new_size))) + return -1; + p->size = new_size; + p->buf = t; + return 0; +} + +int printbuf_memappend(struct printbuf *p, const char *buf, int size) +{ + if (p->size <= p->bpos + size + 1) { + if (printbuf_extend(p, p->bpos + size + 1) < 0) + return -1; + } + memcpy(p->buf + p->bpos, buf, size); + p->bpos += size; + p->buf[p->bpos]= '\0'; + return size; +} + +int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len) +{ + int size_needed; + + if (offset == -1) + offset = pb->bpos; + size_needed = offset + len; + if (pb->size < size_needed) + { + if (printbuf_extend(pb, size_needed) < 0) + return -1; + } + + memset(pb->buf + offset, charvalue, len); + if (pb->bpos < size_needed) + pb->bpos = size_needed; + + return 0; +} + +#if !defined(HAVE_VSNPRINTF) && defined(_MSC_VER) +# define vsnprintf _vsnprintf +#elif !defined(HAVE_VSNPRINTF) /* !HAVE_VSNPRINTF */ +# error Need vsnprintf! +#endif /* !HAVE_VSNPRINTF && defined(WIN32) */ + +#if !defined(HAVE_VASPRINTF) +/* CAW: compliant version of vasprintf */ +static int vasprintf(char **buf, const char *fmt, va_list ap) +{ +#ifndef WIN32 + static char _T_emptybuffer = '\0'; +#endif /* !defined(WIN32) */ + int chars; + char *b; + + if(!buf) { return -1; } + +#ifdef WIN32 + chars = _vscprintf(fmt, ap)+1; +#else /* !defined(WIN32) */ + /* CAW: RAWR! We have to hope to god here that vsnprintf doesn't overwrite + our buffer like on some 64bit sun systems.... but hey, its time to move on */ + chars = vsnprintf(&_T_emptybuffer, 0, fmt, ap)+1; + if(chars < 0) { chars *= -1; } /* CAW: old glibc versions have this problem */ +#endif /* defined(WIN32) */ + + b = (char*)malloc(sizeof(char)*chars); + if(!b) { return -1; } + + if((chars = vsprintf(b, fmt, ap)) < 0) + { + free(b); + } else { + *buf = b; + } + + return chars; +} +#endif /* !HAVE_VASPRINTF */ + +int sprintbuf(struct printbuf *p, const char *msg, ...) +{ + va_list ap; + char *t; + int size; + char buf[128]; + + /* user stack buffer first */ + va_start(ap, msg); + size = vsnprintf(buf, 128, msg, ap); + va_end(ap); + /* if string is greater than stack buffer, then use dynamic string + with vasprintf. Note: some implementation of vsnprintf return -1 + if output is truncated whereas some return the number of bytes that + would have been written - this code handles both cases. */ + if(size == -1 || size > 127) { + va_start(ap, msg); + if((size = vasprintf(&t, msg, ap)) < 0) { va_end(ap); return -1; } + va_end(ap); + printbuf_memappend(p, t, size); + free(t); + return size; + } else { + printbuf_memappend(p, buf, size); + return size; + } +} + +void printbuf_reset(struct printbuf *p) +{ + p->buf[0] = '\0'; + p->bpos = 0; +} + +void printbuf_free(struct printbuf *p) +{ + if(p) { + free(p->buf); + free(p); + } +} diff --git a/json-c/printbuf.h b/json-c/printbuf.h new file mode 100644 index 0000000..b1bde7f --- /dev/null +++ b/json-c/printbuf.h @@ -0,0 +1,77 @@ +/* + * $Id: printbuf.h,v 1.4 2006/01/26 02:16:28 mclark Exp $ + * + * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + * + * Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved. + * The copyrights to the contents of this file are licensed under the MIT License + * (http://www.opensource.org/licenses/mit-license.php) + */ + +#ifndef _printbuf_h_ +#define _printbuf_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +struct printbuf { + char *buf; + int bpos; + int size; +}; + +extern struct printbuf* +printbuf_new(void); + +/* As an optimization, printbuf_memappend_fast is defined as a macro + * that handles copying data if the buffer is large enough; otherwise + * it invokes printbuf_memappend_real() which performs the heavy + * lifting of realloc()ing the buffer and copying data. + * Your code should not use printbuf_memappend directly--use + * printbuf_memappend_fast instead. + */ +extern int +printbuf_memappend(struct printbuf *p, const char *buf, int size); + +#define printbuf_memappend_fast(p, bufptr, bufsize) \ +do { \ + if ((p->size - p->bpos) > bufsize) { \ + memcpy(p->buf + p->bpos, (bufptr), bufsize); \ + p->bpos += bufsize; \ + p->buf[p->bpos]= '\0'; \ + } else { printbuf_memappend(p, (bufptr), bufsize); } \ +} while (0) + +#define printbuf_length(p) ((p)->bpos) + +/** + * Set len bytes of the buffer to charvalue, starting at offset offset. + * Similar to calling memset(x, charvalue, len); + * + * The memory allocated for the buffer is extended as necessary. + * + * If offset is -1, this starts at the end of the current data in the buffer. + */ +extern int +printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len); + +extern int +sprintbuf(struct printbuf *p, const char *msg, ...); + +extern void +printbuf_reset(struct printbuf *p); + +extern void +printbuf_free(struct printbuf *p); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/json-c/random_seed.c b/json-c/random_seed.c new file mode 100644 index 0000000..f671929 --- /dev/null +++ b/json-c/random_seed.c @@ -0,0 +1,237 @@ +/* + * random_seed.c + * + * Copyright (c) 2013 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#include +#include "config.h" + +#define DEBUG_SEED(s) + + +#if defined ENABLE_RDRAND + +/* cpuid */ + +#if defined __GNUC__ && (defined __i386__ || defined __x86_64__) +#define HAS_X86_CPUID 1 + +static void do_cpuid(int regs[], int h) +{ + __asm__ __volatile__( +#if defined __x86_64__ + "pushq %%rbx;\n" +#else + "pushl %%ebx;\n" +#endif + "cpuid;\n" +#if defined __x86_64__ + "popq %%rbx;\n" +#else + "popl %%ebx;\n" +#endif + : "=a"(regs[0]), [ebx] "=r"(regs[1]), "=c"(regs[2]), "=d"(regs[3]) + : "a"(h)); +} + +#elif defined _MSC_VER + +#define HAS_X86_CPUID 1 +#define do_cpuid __cpuid + +#endif + +/* has_rdrand */ + +#if HAS_X86_CPUID + +static int has_rdrand() +{ + // CPUID.01H:ECX.RDRAND[bit 30] == 1 + int regs[4]; + do_cpuid(regs, 1); + return (regs[2] & (1 << 30)) != 0; +} + +#endif + +/* get_rdrand_seed - GCC x86 and X64 */ + +#if defined __GNUC__ && (defined __i386__ || defined __x86_64__) + +#define HAVE_RDRAND 1 + +static int get_rdrand_seed() +{ + DEBUG_SEED("get_rdrand_seed"); + int _eax; + // rdrand eax + __asm__ __volatile__("1: .byte 0x0F\n" + " .byte 0xC7\n" + " .byte 0xF0\n" + " jnc 1b;\n" + : "=a" (_eax)); + return _eax; +} + +#endif + +#if defined _MSC_VER + +#if _MSC_VER >= 1700 +#define HAVE_RDRAND 1 + +/* get_rdrand_seed - Visual Studio 2012 and above */ + +static int get_rdrand_seed() +{ + DEBUG_SEED("get_rdrand_seed"); + int r; + while (_rdrand32_step(&r) == 0); + return r; +} + +#elif defined _M_IX86 +#define HAVE_RDRAND 1 + +/* get_rdrand_seed - Visual Studio 2010 and below - x86 only */ + +static int get_rdrand_seed() +{ + DEBUG_SEED("get_rdrand_seed"); + int _eax; +retry: + // rdrand eax + __asm _emit 0x0F __asm _emit 0xC7 __asm _emit 0xF0 + __asm jnc retry + __asm mov _eax, eax + return _eax; +} + +#endif +#endif + +#endif /* defined ENABLE_RDRAND */ + + +/* has_dev_urandom */ + +#if defined (__APPLE__) || defined(__unix__) || defined(__linux__) + +#include +#include +#include +#include +#include +#include + +#define HAVE_DEV_RANDOM 1 + +static const char *dev_random_file = "/dev/urandom"; + +static int has_dev_urandom() +{ + struct stat buf; + if (stat(dev_random_file, &buf)) { + return 0; + } + return ((buf.st_mode & S_IFCHR) != 0); +} + + +/* get_dev_random_seed */ + +static int get_dev_random_seed() +{ + DEBUG_SEED("get_dev_random_seed"); + + int fd = open(dev_random_file, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "error opening %s: %s", dev_random_file, strerror(errno)); + exit(1); + } + + int r; + ssize_t nread = read(fd, &r, sizeof(r)); + if (nread != sizeof(r)) { + fprintf(stderr, "error short read %s: %s", dev_random_file, strerror(errno)); + exit(1); + } + + close(fd); + return r; +} + +#endif + + +/* get_cryptgenrandom_seed */ + +#ifdef WIN32 + +#define HAVE_CRYPTGENRANDOM 1 + +#include +#include +#ifndef __GNUC__ +#pragma comment(lib, "advapi32.lib") +#endif + +static int get_cryptgenrandom_seed() +{ + DEBUG_SEED("get_cryptgenrandom_seed"); + + HCRYPTPROV hProvider = 0; + int r; + + if (!CryptAcquireContextW(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { + fprintf(stderr, "error CryptAcquireContextW"); + exit(1); + } + + if (!CryptGenRandom(hProvider, sizeof(r), (BYTE*)&r)) { + fprintf(stderr, "error CryptGenRandom"); + exit(1); + } + + CryptReleaseContext(hProvider, 0); + + return r; +} + +#endif + + +/* get_time_seed */ + +#include + +static int get_time_seed() +{ + DEBUG_SEED("get_time_seed"); + + return (int)time(NULL) * 433494437; +} + + +/* json_c_get_random_seed */ + +int json_c_get_random_seed() +{ +#if HAVE_RDRAND + if (has_rdrand()) return get_rdrand_seed(); +#endif +#if HAVE_DEV_RANDOM + if (has_dev_urandom()) return get_dev_random_seed(); +#endif +#if HAVE_CRYPTGENRANDOM + return get_cryptgenrandom_seed(); +#endif + return get_time_seed(); +} diff --git a/json-c/random_seed.h b/json-c/random_seed.h new file mode 100644 index 0000000..7362d67 --- /dev/null +++ b/json-c/random_seed.h @@ -0,0 +1,25 @@ +/* + * random_seed.h + * + * Copyright (c) 2013 Metaparadigm Pte. Ltd. + * Michael Clark + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See COPYING for details. + * + */ + +#ifndef seed_h +#define seed_h + +#ifdef __cplusplus +extern "C" { +#endif + +extern int json_c_get_random_seed(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/keymaster/Android.bp b/keymaster/Android.bp new file mode 100644 index 0000000..02d52a9 --- /dev/null +++ b/keymaster/Android.bp @@ -0,0 +1,27 @@ +// +// Copyright (C) 2018 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +cc_binary { + name: "wait_for_strongbox", + relative_install_path: "hw", + srcs: [ "wait_for_strongbox.cpp" ], + cflags: [ "-Werror", "-Wall" ], + shared_libs: [ + "android.hardware.keymaster@4.0", + "libbase", + "libkeymaster4support", + ], + proprietary: true, +} diff --git a/keymaster/wait_for_strongbox.cpp b/keymaster/wait_for_strongbox.cpp new file mode 100644 index 0000000..8f95741 --- /dev/null +++ b/keymaster/wait_for_strongbox.cpp @@ -0,0 +1,59 @@ +/* + ** Copyright 2018, The Android Open Source Project + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ + +#include + +#define LOG_TAG "wait_for_strongbox" +#include + +#include + +using android::hardware::keymaster::V4_0::SecurityLevel; +using android::hardware::keymaster::V4_0::support::Keymaster; + +useconds_t kWaitTimeMicroseconds = 1 * 1000; // 1 milliseconds + +int main() { + for (unsigned cycleCount = 0; /* Forever */; ++cycleCount) { + auto keymasters = Keymaster::enumerateAvailableDevices(); + + bool foundStrongBox = false; + bool foundTee = false; + for (auto &dev : keymasters) { + SecurityLevel securityLevel = dev->halVersion().securityLevel; + uint8_t majorVersion = dev->halVersion().majorVersion; + if (securityLevel == SecurityLevel::STRONGBOX && majorVersion == 4) { + foundStrongBox = true; + } + if (securityLevel == SecurityLevel::TRUSTED_ENVIRONMENT && majorVersion == 4) { + foundTee = true; + } + } + + if (foundTee && foundStrongBox) { + return 0; + } + if (cycleCount % 10 == 1) { + if (!foundStrongBox) { + LOG(WARNING) << "Still waiting for StrongBox Keymaster"; + } + if (!foundTee) { + LOG(WARNING) << "Still waiting for TEE Keymaster"; + } + } + usleep(kWaitTimeMicroseconds); + } +} diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..574bf49 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,605 @@ + + + + android.hardware.boot + hwbinder + + 1.0 + + IBootControl + default + + + + android.hardware.health + hwbinder + 2.0 + + IHealth + default + + + + android.hardware.audio + hwbinder + 5.0 + + IDevicesFactory + default + + + + android.hardware.audio.effect + hwbinder + 5.0 + + IEffectsFactory + default + + + + android.hardware.usb + hwbinder + 1.2 + + IUsb + default + + + + android.hardware.usb.gadget + hwbinder + 1.0 + + IUsbGadget + default + + + + android.hardware.confirmationui + hwbinder + 1.0 + + IConfirmationUI + default + + + + android.hardware.soundtrigger + hwbinder + 2.2 + + ISoundTriggerHw + default + + + + + android.hardware.media.omx + hwbinder + + 1.0 + + IOmx + default + + + IOmxStore + default + + + + + + android.hardware.graphics.allocator + hwbinder + + 3.0 + + IAllocator + default + + + + android.hardware.graphics.mapper + passthrough + + 3.0 + + IMapper + default + + + + vendor.qti.hardware.display.allocator + hwbinder + 3.0 + + IQtiAllocator + default + + + + vendor.qti.hardware.display.mapper + passthrough + 3.0 + + IQtiMapper + default + + + + vendor.qti.hardware.display.mapperextensions + passthrough + 1.0 + + IQtiMapperExtensions + default + + + + android.hardware.graphics.composer + hwbinder + + 2.3 + + IComposer + default + + + + vendor.display.config + hwbinder + + 1.1 + + IDisplayConfig + default + + + + vendor.google.radioext + hwbinder + 1.1 + + IRadioExt + default + + + + android.hardware.configstore + hwbinder + + 1.1 + + ISurfaceFlingerConfigs + default + + + + android.hardware.memtrack + hwbinder + + 1.0 + + IMemtrack + default + + + + android.hardware.secure_element + hwbinder + 1.0 + + ISecureElement + eSE1 + SIM1 + + + + android.hardware.sensors + hwbinder + 2.0 + + ISensors + default + + + + android.hardware.camera.provider + hwbinder + + 2.4 + + ICameraProvider + internal/0 + + + + + android.hardware.gatekeeper + hwbinder + 1.0 + + IGatekeeper + default + + + + android.hardware.gnss + hwbinder + @1.1::IGnss/default + @2.0::IGnss/default + + + + vendor.qti.hardware.radio.qcrilhook + hwbinder + 1.0 + + IQtiOemHook + oemhook0 + oemhook1 + + + + vendor.qti.hardware.radio.ims + hwbinder + 1.4 + + IImsRadio + imsradio0 + imsradio1 + + + + vendor.qti.hardware.radio.uim + hwbinder + 1.1 + + IUim + Uim0 + Uim1 + + + + + vendor.qti.hardware.radio.uim_remote_client + hwbinder + 1.0 + + IUimRemoteServiceClient + uimRemoteClient0 + uimRemoteClient1 + + + + + vendor.qti.hardware.radio.uim_remote_server + hwbinder + 1.0 + + IUimRemoteServiceServer + uimRemoteServer0 + uimRemoteServer1 + + + + + vendor.qti.imsrtpservice + hwbinder + + 2.0 + + IRTPService + imsrtpservice + + + + + android.hardware.bluetooth + hwbinder + + 1.0 + + IBluetoothHci + default + + + + android.hardware.bluetooth.a2dp + hwbinder + 1.0 + + IBluetoothAudioOffload + default + + + + android.hardware.bluetooth.audio + hwbinder + 2.0 + + IBluetoothAudioProvidersFactory + default + + + + + com.qualcomm.qti.uceservice + hwbinder + 2.0 + + IUceService + com.qualcomm.qti.uceservice + + + + + vendor.qti.ims.callinfo + hwbinder + 1.0 + + IService + default + + + + com.qualcomm.qti.imscmservice + hwbinder + 2.1 + + IImsCmService + qti.ims.connectionmanagerservice + + + + vendor.qti.hardware.radio.am + hwbinder + 1.0 + + IQcRilAudio + slot1 + slot2 + + + + android.hardware.wifi + hwbinder + 1.3 + + IWifi + default + + + + android.hardware.wifi.supplicant + hwbinder + 1.2 + + ISupplicant + default + + + + android.hardware.wifi.hostapd + hwbinder + 1.1 + + IHostapd + default + + + + vendor.qti.data.factory + hwbinder + 1.0 + + IFactory + default + + + + com.quicinc.cne.server + hwbinder + + 2.1 + + IServer + cnd + + + + com.quicinc.cne.api + hwbinder + + 1.1 + + IApiService + cnd + + + + android.hardware.drm + hwbinder + + 1.0 + + ICryptoFactory + widevine + default + + + IDrmFactory + widevine + default + + @1.2::ICryptoFactory/clearkey + @1.2::IDrmFactory/clearkey + @1.2::ICryptoFactory/widevine + @1.2::IDrmFactory/widevine + + + android.hardware.radio + hwbinder + 1.2 + + IRadio + slot1 + slot2 + + + ISap + slot1 + + + + android.hardware.radio.config + hwbinder + 1.1 + + IRadioConfig + default + + + + android.hardware.nfc + hwbinder + 1.2 + + INfc + default + + + + + android.hardware.contexthub + hwbinder + 1.0 + + IContexthub + default + + + + + android.hardware.neuralnetworks + hwbinder + 1.2 + + IDevice + darwinn + default + + + + + android.hardware.keymaster + hwbinder + 4.0 + + IKeymasterDevice + default + strongbox + + + + android.hardware.power.stats + hwbinder + 1.0 + + IPowerStats + default + + + + + android.hardware.light + hwbinder + 2.0 + + ILight + default + + + + hardware.google.light + hwbinder + 1.0 + + ILight + default + + + + vendor.google.airbrush.manager + hwbinder + 1.0 + + IAirbrushManager + default + + + + android.hardware.weaver + hwbinder + 1.0 + + IWeaver + default + + + + android.hardware.dumpstate + hwbinder + 1.0 + + IDumpstateDevice + default + + + + vendor.qti.hardware.bluetooth_sar + hwbinder + 1.0 + + IBluetoothSar + default + + + + vendor.qti.hardware.tui_comm + hwbinder + 1.0 + + ITuiComm + default + + + diff --git a/media_codecs.xml b/media_codecs.xml new file mode 100644 index 0000000..5685092 --- /dev/null +++ b/media_codecs.xml @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media_codecs_performance.xml b/media_codecs_performance.xml new file mode 100644 index 0000000..b0fbf33 --- /dev/null +++ b/media_codecs_performance.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media_codecs_vendor_audio.xml b/media_codecs_vendor_audio.xml new file mode 100644 index 0000000..dd77026 --- /dev/null +++ b/media_codecs_vendor_audio.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/media_profiles.xml b/media_profiles.xml new file mode 100644 index 0000000..24f4475 --- /dev/null +++ b/media_profiles.xml @@ -0,0 +1,1650 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media_profiles_V1_0.xml b/media_profiles_V1_0.xml new file mode 100644 index 0000000..bee4016 --- /dev/null +++ b/media_profiles_V1_0.xml @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nfc/libese-hal-st.conf b/nfc/libese-hal-st.conf new file mode 100644 index 0000000..1954bf7 --- /dev/null +++ b/nfc/libese-hal-st.conf @@ -0,0 +1,6 @@ +########################### Start of libese-hal-st.conf ########################### +############################################################################### +############################################################################### +# ST HAL trace log level +STESE_HAL_LOGLEVEL=1 +ST_ESE_DEV_NODE="/dev/st54j_se" diff --git a/nfc/libnfc-hal-st.conf b/nfc/libnfc-hal-st.conf new file mode 100644 index 0000000..47153d9 --- /dev/null +++ b/nfc/libnfc-hal-st.conf @@ -0,0 +1,148 @@ +########################### Start of libnf-hal-st_aosp.conf ########################### + +############################################################################### +############################################################################### +# ST HAL trace log level +STNFC_HAL_LOGLEVEL=1 +NFC_DEBUG_ENABLED=0 + +############################################################################### +# Vendor specific mode to enable FW (RF & SWP) traces. +STNFC_FW_DEBUG_ENABLED=0 + +############################################################################### +# File used for NFA storage +NFA_STORAGE="/data/nfc" + +############################################################################### +# Keep the nfa storage file. +PRESERVE_STORAGE=1 + +############################################################################### +# In Switch OFF mode (phone switched-off), specify the desired CE mode to +# the controller. +# 0: No card-emulation; DEFAULT +# 1: Switch-off card-emulation enabled +CE_ON_SWITCH_OFF_STATE=1 + +############################################################################### +# Vendor specific mode to support the USB charging mode if VPSIO=1 in switch off. +STNFC_USB_CHARGING_MODE=1 + +############################################################################### +# Vendor Specific Proprietary Protocol & Discovery Configuration +# Set to 0xFF if unsupported +# byte[0] NCI_PROTOCOL_18092_ACTIVE +# byte[1] NCI_PROTOCOL_B_PRIME +# byte[2] NCI_PROTOCOL_DUAL +# byte[3] NCI_PROTOCOL_15693 +# byte[4] NCI_PROTOCOL_KOVIO +# byte[5] NCI_PROTOCOL_MIFARE +# byte[6] NCI_DISCOVERY_TYPE_POLL_KOVIO +# byte[7] NCI_DISCOVERY_TYPE_POLL_B_PRIME +# byte[8] NCI_DISCOVERY_TYPE_LISTEN_B_PRIME +NFA_PROPRIETARY_CFG={05:FF:FF:06:8A:90:77:FF:FF} + +############################################################################### +# Choose the presence-check algorithm for type-4 tag. If not defined, +# the default value is 1. +# 0 NFA_RW_PRES_CHK_DEFAULT; Let stack selects an algorithm +# 1 NFA_RW_PRES_CHK_I_BLOCK; ISO-DEP protocol's empty I-block +# 2 NFA_RW_PRES_CHK_RESET; Deactivate to Sleep, then re-activate +# 3 NFA_RW_PRES_CHK_RB_CH0; Type-4 tag protocol's ReadBinary command on channel 0 +# 4 NFA_RW_PRES_CHK_RB_CH3; Type-4 tag protocol's ReadBinary command on channel 3 +# 5 NFA_RW_PRES_CHK_ISO_DEP_NAK; presence check command ISO-DEP NAK as per NCI2.0 +PRESENCE_CHECK_ALGORITHM=5 + +############################################################################### +# Name of the NCI HAL module to use +# If unset, falls back to nfc_nci.bcm2079x +NCI_HAL_MODULE="nfc_nci.st21nfc" + +############################################################################### +# White list to be set at startup. +DEVICE_HOST_WHITE_LIST={02:C0} + +############################################################################### +# BAIL OUT value for P2P +# Implements algorithm for NFC-DEP protocol priority over ISO-DEP protocol. +POLL_BAIL_OUT_MODE=1 + +############################################################################### +# Extended APDU length for ISO_DEP +ISO_DEP_MAX_TRANSCEIVE=0xFEFF + +############################################################################### +# Configure the NFC Extras to open and use a static pipe. If the value is +# not set or set to 0, then the default is use a dynamic pipe based on a +# destination gate (see NFA_HCI_DEFAULT_DEST_GATE). Note there is a value +# for each EE (ESE/SIM) +OFF_HOST_ESE_PIPE_ID=0x5E +OFF_HOST_SIM_PIPE_ID=0x3E + +############################################################################### +#Set the default Felica T3T System Code OffHost route Location : +#This settings will be used when application does not set this parameter +# host 0x00 +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +DEFAULT_SYS_CODE_ROUTE=0x86 + +############################################################################### +#Set the Felica T3T System Code supported power state: +DEFAULT_SYS_CODE_PWR_STATE=0x3B + +############################################################################### +# Path and Files used for FW update binaries storage +STNFC_FW_PATH_STORAGE="/vendor/firmware" +STNFC_FW_BIN_NAME="/st54j_fw.bin" +STNFC_FW_CONF_NAME="/st54j_conf.bin" + +############################################################################### +# Default off-host route for Felica. +# This settings will be used when application does not set this parameter +# host 0x00 +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +DEFAULT_NFCF_ROUTE=0x86 + +############################################################################### +# Configure the default off-host route. +# used for technology A and B routing +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +DEFAULT_OFFHOST_ROUTE=0x81 + +############################################################################### +# Configure the default AID route. +# host 0x00 +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +DEFAULT_ROUTE=0x00 + +############################################################################### +# Configure the NFCEEIDs of offhost UICC. +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +OFFHOST_ROUTE_UICC={81} + +############################################################################### +# Configure the NFCEEIDs of offhost eSEs. +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +OFFHOST_ROUTE_ESE={86} + +############################################################################### +# Configure the list of NFCEE for the ISO-DEP routing. +# host 0x00 +# eSE 0x82 (eSE), 0x86 (eUICC/SPI-SE) +# UICC 0x81 (UICC_1), 0x85 (UICC_2) +DEFAULT_ISODEP_ROUTE=0x81 + +############################################################################### +# Core configuration settings +CORE_CONF_PROP={ 20, 02, 0a, 03, + a1, 01, 1e, + a2, 01, 19, + 80, 01, 01 +} + + diff --git a/nfc/libnfc-nci.conf b/nfc/libnfc-nci.conf new file mode 100644 index 0000000..149f1bb --- /dev/null +++ b/nfc/libnfc-nci.conf @@ -0,0 +1,102 @@ +############################################################################### +# Application options +NFC_DEBUG_ENABLED=0 + +############################################################################### +# File used for NFA storage +NFA_STORAGE="/data/nfc" + +############################################################################### +# Force UICC to only listen to the following technology(s). +# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h. +# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | NFA_TECHNOLOGY_MASK_F +UICC_LISTEN_TECH_MASK=0x07 + +############################################################################### +# AID for Empty Select command +# If specified, this AID will be substituted when an Empty SELECT command is +# detected. The first byte is the length of the AID. Maximum length is 16. +AID_FOR_EMPTY_SELECT={08:A0:00:00:01:51:00:00:00} + +############################################################################### +# When screen is turned off, specify the desired power state of the controller. +# 0: power-off-sleep state; DEFAULT +# 1: full-power state +# 2: screen-off card-emulation (CE4/CE3/CE1 modes are used) +SCREEN_OFF_POWER_STATE=1 + +############################################################################### +# Force tag polling for the following technology(s). +# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h. +# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_B | +# NFA_TECHNOLOGY_MASK_F | NFA_TECHNOLOGY_MASK_ISO15693 | +# NFA_TECHNOLOGY_MASK_B_PRIME | NFA_TECHNOLOGY_MASK_KOVIO | +# NFA_TECHNOLOGY_MASK_ACTIVE +# +# Notable bits: +# NFA_TECHNOLOGY_MASK_A 0x01 /* NFC Technology A */ +# NFA_TECHNOLOGY_MASK_B 0x02 /* NFC Technology B */ +# NFA_TECHNOLOGY_MASK_F 0x04 /* NFC Technology F */ +# NFA_TECHNOLOGY_MASK_ISO15693 0x08 /* Proprietary Technology */ +# NFA_TECHNOLOGY_MASK_KOVIO 0x20 /* Proprietary Technology */ +# NFA_TECHNOLOGY_MASK_ACTIVE 0x40 /* NFC Technology Active */ +POLLING_TECH_MASK=0x2F + +############################################################################### +# Force P2P to only listen for the following technology(s). +# The bits are defined as tNFA_TECHNOLOGY_MASK in nfa_api.h. +# Default is NFA_TECHNOLOGY_MASK_A | NFA_TECHNOLOGY_MASK_F | +# NFA_TECHNOLOGY_MASK_ACTIVE +# +# Notable bits: +# NFA_TECHNOLOGY_MASK_A 0x01 /* NFC Technology A */ +# NFA_TECHNOLOGY_MASK_F 0x04 /* NFC Technology F */ +# NFA_TECHNOLOGY_MASK_ACTIVE 0x40 /* NFC Technology Active */ +P2P_LISTEN_TECH_MASK=0x00 + +PRESERVE_STORAGE=0x01 + +############################################################################### +# Override the stack default for NFA_EE_MAX_EE_SUPPORTED set in nfc_target.h. +# The value is set to 3 by default as it assumes we will discover 0xF2, +# 0xF3, and 0xF4. If a platform will exclude and SE, this value can be reduced +# so that the stack will not wait any longer than necessary. +# Maximum EE supported number +# NXP PN547C2 0x02 +# NXP PN65T 0x03 +# NXP PN548C2 0x02 +# NXP PN66T 0x03 +NFA_MAX_EE_SUPPORTED=0x02 + +############################################################################### +# AID_MATCHING constants +# AID_MATCHING_EXACT_ONLY 0x00 +# AID_MATCHING_EXACT_OR_PREFIX 0x01 +# AID_MATCHING_PREFIX_ONLY 0x02 +# AID_MATCHING_EXACT_OR_SUBSET_OR_PREFIX 0x03 +AID_MATCHING_MODE=0x03 + +############################################################################### +#Set the default Felica T3T System Code : +#This settings will be used when application does not set this parameter +DEFAULT_SYS_CODE={FE:FE} + +############################################################################### +# Value of NIC parameter NFCC_COFNIG_CONTROL +# 0x00 NFCC is not allowed to manage RF configuration +# 0x01 NFCC is allowed to manage RF configuration +NFCC_CONFIG_CONTROL=0x01 + +############################################################################### +#Set if the AID routing should be blocked for the power modes not supported. +NFA_AID_BLOCK_ROUTE=1 + +############################################################################### +#Set the OffHost AID supported power state: +OFFHOST_AID_ROUTE_PWR_STATE=0x3B + +############################################################################### +# Mifare Tag implementation +# 0: General implementation +# 1: Legacy implementation +LEGACY_MIFARE_READER=0 diff --git a/overlay/frameworks/base/core/res/res/values-mcc440-mnc20/config.xml b/overlay/frameworks/base/core/res/res/values-mcc440-mnc20/config.xml new file mode 100644 index 0000000..0fdd49e --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values-mcc440-mnc20/config.xml @@ -0,0 +1,30 @@ + + + + + + + + com.google.android.tetheringentitlement + com.google.android.tetheringentitlement.CarrierEntitlementActivity + + com.google.android.carrierentitlement.SILENT_ENTITLEMENT_CHECK + com.google.android.carrierentitlement.SILENT_ENTITLEMENT_CHECK_RESULT + \ No newline at end of file diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml new file mode 100755 index 0000000..6bbec7c --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,293 @@ + + + + + + + true + + + 2000 + 4000 + + + true + + + true + + + true + + + + 0 + 1 + 3 + + + + 2 + + + true + + + + true + + + true + + + true + + + true + + + true + + + 4 + + + true + + + + "usb\\d" + "rndis\\d" + + + + + "wlan\\d" + + + + + "bt-pan" + + + + true + + true + + + + + + + "wifi,1,1,1,-1,true" + "mobile,0,0,0,-1,true" + "mobile_mms,2,0,2,60000,true" + "mobile_supl,3,0,2,60000,true" + "mobile_dun,4,0,2,60000,true" + "mobile_hipri,5,0,3,60000,true" + "mobile_fota,10,0,2,60000,true" + "mobile_ims,11,0,2,60000,true" + "mobile_cbs,12,0,2,60000,true" + "mobile_ia,14,0,2,-1,true" + "bluetooth,7,7,2,-1,true" + "ethernet,9,9,9,-1,true" + "mobile_emergency,15,0,2,-1,true + + + + + + "1,1" + "0,1" + "7,1" + "9,1" + + + + 0x80000000 + + + 0x80000000 + + + true + + + + true + + + true + + + true + + + + true + + + false + + + true + + + org.codeaurora.ims + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + umts:131072,262144,1452032,4096,16384,399360 + hspa:131072,262144,2441216,4096,16384,399360 + hsupa:131072,262144,2441216,4096,16384,399360 + hsdpa:131072,262144,2441216,4096,16384,399360 + hspap:131072,262144,2441216,4096,16384,399360 + edge:16384,32768,131072,4096,16384,65536 + gprs:4096,8192,24576,4096,8192,24576 + 1xrtt:16384,32768,131070,4096,16384,102400 + evdo:131072,262144,1048576,4096,16384,524288 + lte:524288,1048576,8388608,262144,524288,4194304 + + + + 524288,2097152,8388608,262144,524288,4194304 + + + 1 + + + 100 + + + 250 + + + 3800 + + + 6 + + + false + + + 2 + + + false + + + false + + + + "gsm,11" + "utran,11" + "cdma1x,1" + "hrpd,3" + "ehrpd,12" + "eutran,11" + + + + true + + + true + + + true + + + -77 + -80 + + -80 + -83 + + + true + + true + + diff --git a/overlay/frameworks/base/core/res/res/values/strings.xml b/overlay/frameworks/base/core/res/res/values/strings.xml new file mode 100644 index 0000000..e1daaad --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/strings.xml @@ -0,0 +1,25 @@ + + + + + + + Pixel + diff --git a/overlay/frameworks/base/packages/SystemUI/res/values-mcc440-mnc20/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values-mcc440-mnc20/config.xml new file mode 100644 index 0000000..f9741d7 --- /dev/null +++ b/overlay/frameworks/base/packages/SystemUI/res/values-mcc440-mnc20/config.xml @@ -0,0 +1,26 @@ + + + + + + + false + diff --git a/overlay/packages/apps/Bluetooth/res/values/config.xml b/overlay/packages/apps/Bluetooth/res/values/config.xml new file mode 100644 index 0000000..9b1b241 --- /dev/null +++ b/overlay/packages/apps/Bluetooth/res/values/config.xml @@ -0,0 +1,18 @@ + + + + true + diff --git a/overlay/packages/apps/Settings/res/raw/face_enroll_introduction_animation.mp4 b/overlay/packages/apps/Settings/res/raw/face_enroll_introduction_animation.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..03aea2f94b875384c28a8cad359dc5a76b36432f GIT binary patch literal 967535 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%0Df78{vOCjuUN^n)XE}a-{x5|5*!k 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

@v}86)_*x!jf@Ng23-S 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�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

2y6(lbySuu#@;*DA{o9_w6eg0;emT=ckA zh#P8QXDwJnxs`J}voSU}XRU<=!BQ9yG)I2W`d-&*7WIH$f?mwkempM#%^^c}+|Mz6 z5d#`Ie5Jg+id*O?vY_EK4?SN@)NvvNiYS6-_GlOPKZQRY4!2|j(D5g^+=@G&6(*^t zq!;7Q0p3-Qy^E%^qfWc@*iSWh4C*Ka0X2&%M|Qd#7&q{}uRDP1zCa)$u$swtvtj5# zc`V+@WL!uv8;}+oql=0iI${sVOzub2sgb~+3z&0~NdhKI9N6+X1Q_W^xz&QSlt?%5 zsOmNmo57i;g^|hI*mT*iyoBx&R5E5x#y$Hf5EK*wZwyRQ&!ePqO;pORe3>00MDZ&G zGWW7hS&Ov!3aN~7Fn&(AcPW|$D2DUJzOTQ=Be8cpCC(+Frhg#CPXeM>I+mxqOi63_ zv-RmUN1AOxHL+29; zq+?#o{axncd_M$<96eUU1(B!A66YLC;5I7G`O+NLygjSQj_wnqEK1p22*hzhjCJi2 z_iw3MQF&-b9FzttJzGey6P9Q00M}A@U$o#6rSS8-;jlKM%wHXao#thxid-@B=m1$k z@0KO$^~t=PrS)8t6SaHPy%YOz6sKm@_E*Yj;IoHESA#9(dFkr%R~JQ{MR8IOfktAv zu)+jV3Ja&0I0A?CFum3=Cxv}W7l`p-eHN6gftL^4O>5Ik&{4^}==Ec-3T78D_sqNG zZsC?d+ZZ;F=ylPBdKz!J4e=I))k%cmO2Z>KJw1Nkws(_WozU}j7rAti;Vo5J9$qZc zWuh{JSG@PNygc8zo%ctso4`<#!d5`Y+C(ui2W?;heP?45)&zLCeTFEV0J%Jvih^R}9dZ&e(jRdxkbI_7ydjcrJIpVAW&;P$8QbaTQHt!H|yvp;ebVo4V8 z-u0l(=$gem96#k>fJ-YHXSFHj)$W?wCZ|Jp3iFxGB{el&*t7nSTU&NPNe+j3EOYJN zW5?nED;4I2+3mBaQcn>YOuDpftfACz6l;oak%7jtf}HP&Yo?xDi*;L(8h>>nm6s@(u88*6r$;Zj?8BmzG6`3)#K*VHpPGrBUat87|?x zLQtTo_QmMk?@*v9lUHDqmYE}5x0@4xcdHt}S(r)x(K2B8&ij9+vrfr$(oa?7==F53ybG8Z>?I30z(i9xzskh5rrlt z>5-XL)B_|~htb_E{sFl$@hi#pfiB~4{h@M-Gdt_PROnHiZCiafyR&h6HvG?3MDXRB z95biTDFyuHHf1g#qjYrsF0#JHBG_SfZhGA}tcGSRnoxE}7sD3Q<$0`LJWm{R z|7L89@p=d^_MM^Ed;a<<#;VN7p5M9{Rj+@;llYcaCN@x4SuGD9hz8`=C#1Tu_Q{(a z`}?sGt(+khpuC-Qom7aojTr5#=%ToSFat&?%0&IT!^#B`B3i4@us-UGdz07DlA|*@nf&5@Jd9l$ zVFkuDArw4$r@IPrW6vaB-=E8D#lVjzh;+A{R>LX`!+-CzXvcFJN9-Z5!^3K3SXIGj zqFbo3Ncx^X{Af()nF|%W73Y#nZ}rO3L>(C!aeCu0^pIlY0iG zp8I7Z935w&KFXK&;rX;Oz@S<%`%u09+&KQ%0DnR2Pe4+e3w45A)J9Y$Nyig%aG#}A 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