From c100bcafcb1a4775923cc7586557e8896fa73b91 Mon Sep 17 00:00:00 2001 From: SandPox Date: Mon, 12 Oct 2015 14:23:33 +0000 Subject: [PATCH] First commit --- Android.mk | 3 + AndroidBoard.mk | 8 + BoardConfig.mk | 200 ++ README.md | 9 + bluetooth/bdroid_buildcfg.h | 22 + bluetooth/libbt_vndcfg_s7580.txt | 14 + cm.dependencies | 10 + cm.mk | 16 + .../cyanogenmod/hardware/SerialNumber.java | 42 + configs/audio_policy.conf | 95 + configs/egl.cfg | 2 + configs/media_codecs.xml | 93 + configs/media_profiles.xml | 529 +++++ device_kylepro.mk | 157 ++ health/Android.mk | 22 + health/healthd-hawaii.cpp | 38 + include/hardware/gps.h | 1826 +++++++++++++++++ keylayouts/bcm_headset.kl | 3 + keylayouts/bcm_keypad_v2.kl | 85 + keylayouts/gpio-keys.kl | 9 + keylayouts/samsung-keypad.kl | 91 + .../base/core/res/res/values/arrays.xml | 37 + .../base/core/res/res/values/config.xml | 262 +++ .../base/core/res/res/xml/power_profile.xml | 56 + .../base/core/res/res/xml/storage_list.xml | 46 + .../packages/SystemUI/res/values/config.xml | 30 + .../SamsungServiceMode/res/values/config.xml | 18 + .../apps/Settings/res/values/bools.xml | 20 + .../apps/Settings/res/values/config.xml | 23 + .../services/Telephony/res/values/config.xml | 23 + ramdisk/charger | Bin 0 -> 268108 bytes ramdisk/fstab.hawaii_ss_kylepro | 19 + ramdisk/init.bcm2166x.usb.rc | 152 ++ ramdisk/init.hawaii_ss_kylepro.rc | 890 ++++++++ ramdisk/init.log.rc | 109 + ramdisk/init.rc | 652 ++++++ ramdisk/lpm.rc | 82 + ramdisk/twrp.fstab.hawaii_ss_kylepro | 9 + ramdisk/ueventd.hawaii_ss_kylepro.rc | 72 + .../internal/telephony/SamsungBCMRIL.java | 410 ++++ sepolicy/bkmgrd.te | 9 + sepolicy/bluetooth.te | 2 + sepolicy/device.te | 1 + sepolicy/file_contexts | 51 + sepolicy/geomagneticd.te | 12 + sepolicy/gpsd.te | 5 + sepolicy/immvibed.te | 4 + sepolicy/init.te | 7 + sepolicy/kernel.te | 6 + sepolicy/macloader.te | 9 + sepolicy/property_contexts | 2 + sepolicy/rild.te | 16 + sepolicy/service_contexts | 1 + sepolicy/shell.te | 3 + sepolicy/surfaceflinger.te | 1 + sepolicy/system_server.te | 8 + sepolicy/tvserver.te | 8 + sepolicy/vclmk.te | 14 + sepolicy/zygote.te | 2 + system.prop | 35 + vendorsetup.sh | 3 + 61 files changed, 6383 insertions(+) create mode 100644 Android.mk create mode 100644 AndroidBoard.mk create mode 100644 BoardConfig.mk create mode 100644 README.md create mode 100644 bluetooth/bdroid_buildcfg.h create mode 100644 bluetooth/libbt_vndcfg_s7580.txt create mode 100644 cm.dependencies create mode 100644 cm.mk create mode 100644 cmhw/org/cyanogenmod/hardware/SerialNumber.java create mode 100644 configs/audio_policy.conf create mode 100644 configs/egl.cfg create mode 100644 configs/media_codecs.xml create mode 100644 configs/media_profiles.xml create mode 100644 device_kylepro.mk create mode 100644 health/Android.mk create mode 100644 health/healthd-hawaii.cpp create mode 100644 include/hardware/gps.h create mode 100644 keylayouts/bcm_headset.kl create mode 100644 keylayouts/bcm_keypad_v2.kl create mode 100644 keylayouts/gpio-keys.kl create mode 100644 keylayouts/samsung-keypad.kl create mode 100644 overlay/frameworks/base/core/res/res/values/arrays.xml create mode 100644 overlay/frameworks/base/core/res/res/values/config.xml create mode 100644 overlay/frameworks/base/core/res/res/xml/power_profile.xml create mode 100644 overlay/frameworks/base/core/res/res/xml/storage_list.xml create mode 100644 overlay/frameworks/base/packages/SystemUI/res/values/config.xml create mode 100644 overlay/packages/apps/SamsungServiceMode/res/values/config.xml create mode 100644 overlay/packages/apps/Settings/res/values/bools.xml create mode 100644 overlay/packages/apps/Settings/res/values/config.xml create mode 100644 overlay/packages/services/Telephony/res/values/config.xml create mode 100644 ramdisk/charger create mode 100644 ramdisk/fstab.hawaii_ss_kylepro create mode 100644 ramdisk/init.bcm2166x.usb.rc create mode 100644 ramdisk/init.hawaii_ss_kylepro.rc create mode 100644 ramdisk/init.log.rc create mode 100644 ramdisk/init.rc create mode 100644 ramdisk/lpm.rc create mode 100644 ramdisk/twrp.fstab.hawaii_ss_kylepro create mode 100644 ramdisk/ueventd.hawaii_ss_kylepro.rc create mode 100644 ril/com/android/internal/telephony/SamsungBCMRIL.java create mode 100644 sepolicy/bkmgrd.te create mode 100644 sepolicy/bluetooth.te create mode 100644 sepolicy/device.te create mode 100644 sepolicy/file_contexts create mode 100644 sepolicy/geomagneticd.te create mode 100644 sepolicy/gpsd.te create mode 100644 sepolicy/immvibed.te create mode 100644 sepolicy/init.te create mode 100644 sepolicy/kernel.te create mode 100644 sepolicy/macloader.te create mode 100644 sepolicy/property_contexts create mode 100644 sepolicy/rild.te create mode 100644 sepolicy/service_contexts create mode 100644 sepolicy/shell.te create mode 100644 sepolicy/surfaceflinger.te create mode 100644 sepolicy/system_server.te create mode 100644 sepolicy/tvserver.te create mode 100644 sepolicy/vclmk.te create mode 100644 sepolicy/zygote.te create mode 100644 system.prop create mode 100644 vendorsetup.sh diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..110dd35 --- /dev/null +++ b/Android.mk @@ -0,0 +1,3 @@ +ifeq ($(TARGET_DEVICE),kyleprods) + include $(all-subdir-makefiles) +endif diff --git a/AndroidBoard.mk b/AndroidBoard.mk new file mode 100644 index 0000000..8c10f65 --- /dev/null +++ b/AndroidBoard.mk @@ -0,0 +1,8 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) + +# include the non-open-source counterpart to this file +-include vendor/samsung/kylepro/AndroidBoardVendor.mk diff --git a/BoardConfig.mk b/BoardConfig.mk new file mode 100644 index 0000000..db63c63 --- /dev/null +++ b/BoardConfig.mk @@ -0,0 +1,200 @@ +USE_CAMERA_STUB := true + +# inherit from the proprietary version +-include vendor/samsung/kylepro/BoardConfigVendor.mk + +# Platform +TARGET_ARCH := arm +TARGET_NO_BOOTLOADER := true +TARGET_BOARD_PLATFORM := hawaii +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_CPU_VARIANT := cortex-a9 +TARGET_CPU_SMP := true +ARCH_ARM_HAVE_ARMV7A := true +ARCH_ARM_HAVE_VFP := true +ARCH_ARM_HAVE_TLS_REGISTER := true +ARCH_ARM_HAVE_NEON := true +TARGET_BOOTLOADER_BOARD_NAME := hawaii +TARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp +TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp + +# Assert +TARGET_OTA_ASSERT_DEVICE := kylepro,S7580,GT-S7580,hawaii,kylexx + +# Kernel +BOARD_MKBOOTIMG_ARGS := --ramdisk_offset 0x01000000 --tags_offset 00000100 +BOARD_KERNEL_CMDLINE := +BOARD_KERNEL_BASE := 0x82000000 +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_OFFSET := 0x00008000 +#TARGET_GCC_VERSION_EXP := 4.8 +TARGET_KERNEL_CONFIG := bcm21664_hawaii_ss_kylepro_rev00_cyanogenmod_defconfig +TARGET_KERNEL_SOURCE := kernel/samsung/kyleproxx +TARGET_KERNEL_CUSTOM_TOOLCHAIN := arm-eabi-4.6 + +# PARTITION SIZE +BOARD_BOOTIMAGE_PARTITION_SIZE := 8388608 +BOARD_RECOVERYIMAGE_PARTITION_SIZE := 9191424 #8388608 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1210769408 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 2373976064 +BOARD_CACHEIMAGE_PARTITION_SIZE := 209715200 +BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4 +BOARD_FLASH_BLOCK_SIZE := 262144 # BOARD_KERNEL_PAGESIZE * 64 + +# Bluetooth +BOARD_HAVE_BLUETOOTH := true +BOARD_HAVE_BLUETOOTH_BCM := true +BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/kylepro/bluetooth +BOARD_BLUEDROID_VENDOR_CONF := device/samsung/kylepro/bluetooth/libbt_vndcfg_s7580.txt + +# Connectivity - Wi-Fi +BOARD_HAVE_SAMSUNG_WIFI := true +WPA_BUILD_SUPPLICANT := true +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +WPA_SUPPLICANT_VERSION := VER_0_8_X +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd +BOARD_HOSTAPD_DRIVER := NL80211 +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd +BOARD_WLAN_DEVICE := bcmdhd +BOARD_WLAN_DEVICE_REV := bcm4330_b1 +WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/dhd/parameters/firmware_path" +WIFI_DRIVER_FW_PATH_STA := "/system/etc/wifi/bcmdhd_sta.bin" +WIFI_DRIVER_FW_PATH_AP := "/system/etc/wifi/bcmdhd_apsta.bin" +WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/dhd.ko" +WIFI_DRIVER_MODULE_NAME := "dhd" +WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcmdhd_sta.bin nvram_path=/system/etc/wifi/nvram_net.txt" +WIFI_DRIVER_MODULE_AP_ARG := "firmware_path=/system/etc/wifi/bcmdhd_apsta.bin nvram_path=/system/etc/wifi/nvram_net.txt" +WIFI_BAND := 802_11_ABG + +# Resolution +TARGET_SCREEN_HEIGHT := 800 +TARGET_SCREEN_WIDTH := 480 + +# Hardware rendering +BOARD_EGL_CFG := device/samsung/kylepro/configs/egl.cfg +USE_OPENGL_RENDERER := true +BOARD_USE_MHEAP_SCREENSHOT := true +BOARD_EGL_WORKAROUND_BUG_10194508 := true +TARGET_USES_ION := true +HWUI_COMPILE_FOR_PERF := true +COMMON_GLOBAL_CFLAGS += -DNEEDS_VECTORIMPL_SYMBOLS -DHAWAII_HWC +#TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK := true + +# Camera +#BOARD_USE_METADATABUFFERTYPE := true +#BOARD_USE_STOREMETADATA := true + +# Include an expanded selection of fonts +EXTENDED_FONT_FOOTPRINT := true + +# Opengl +BOARD_USES_HWCOMPOSER := true +BOARD_USE_BGRA_8888 := true + +# Audio +BOARD_USES_ALSA_AUDIO := true + +# Enable dex-preoptimization to speed up the first boot sequence +# of an SDK AVD. Note that this operation only works on Linux for now +#ifeq ($(HOST_OS),linux) +# ifeq ($(WITH_DEXPREOPT),) +# WITH_DEXPREOPT := true +# endif +#endif + +# Bootanimation +TARGET_BOOTANIMATION_PRELOAD := true +TARGET_BOOTANIMATION_TEXTURE_CACHE := true + +# Charger +BOARD_BATTERY_DEVICE_NAME := battery +#BOARD_CHARGER_ENABLE_SUSPEND := true +BOARD_CHARGING_MODE_BOOTING_LPM := /sys/class/power_supply/battery/batt_lp_charging +CHARGING_ENABLED_PATH := "/sys/class/power_supply/battery/batt_lp_charging" +BACKLIGHT_PATH := "/sys/class/backlight/panel/brightness" + +# healthd +BOARD_HAL_STATIC_LIBRARIES := libhealthd-kylepro.hawaii + +# RIL +BOARD_RIL_CLASS := ../../../device/samsung/kylepro/ril/ + +# Recovery +#TARGET_RECOVERY_INITRC := +TARGET_RECOVERY_FSTAB := device/samsung/kylepro/ramdisk/fstab.hawaii_ss_kylepro +TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/class/android_usb/android0/f_mass_storage/lun%d/file" +BOARD_HAS_NO_SELECT_BUTTON := true +BOARD_HAS_LARGE_FILESYSTEM := true +TARGET_USERIMAGES_USE_EXT4 := true +TARGET_RECOVERY_PIXEL_FORMAT := BGRA_8888 +BOARD_HAS_NO_MISC_PARTITION := true +BOARD_RECOVERY_HANDLES_MOUNT := true +BOARD_USES_MMCUTILS := true +BOARD_HAS_DOWNLOAD_MODE := true +BOARD_USE_USB_MASS_STORAGE_SWITCH := true +BOARD_SUPPRESS_EMMC_WIPE := true +TARGET_RECOVERY_DENSITY := hdpi + +# TWRP +#TARGET_RECOVERY_FSTAB := device/samsung/kylepro/ramdisk/twrp.fstab.hawaii_ss_kylepro +DEVICE_RESOLUTION := 480x800 +TW_MAX_BRIGHTNESS := 255 +TW_CUSTOM_BATTERY_PATH := /sys/class/power_supply/battery +TW_BRIGHTNESS_PATH := /sys/class/backlight/panel/brightness +RECOVERY_SDCARD_ON_DATA := true +TW_NO_REBOOT_BOOTLOADER := true +RECOVERY_GRAPHICS_USE_LINELENGTH := true +TW_INTERNAL_STORAGE_PATH := /data/media +TW_INTERNAL_STORAGE_MOUNT_POINT := data +TW_EXTERNAL_STORAGE_PATH := /external_sd +TW_EXTERNAL_STORAGE_MOUNT_POINT := external_sd +TW_DEFAULT_EXTERNAL_STORAGE := true +TW_EXCLUDE_SUPERSU := true +BOARD_HAS_NO_REAL_SDCARD := true +HAVE_SELINUX := true + +# Vold +BOARD_UMS_LUNFILE := /sys/class/android_usb/f_mass_storage/lun0/file +TARGET_USE_CUSTOM_LUN_FILE_PATH := /sys/class/android_usb/android0/f_mass_storage/lun/file +BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true +BOARD_VOLD_MAX_PARTITIONS := 19 + +# MTP +BOARD_MTP_DEVICE := /dev/mtp_usb + +# CMHW +BOARD_HARDWARE_CLASS := hardware/samsung/cmhw/ device/samsung/kylepro/cmhw/ + +# GPS +TARGET_SPECIFIC_HEADER_PATH := device/samsung/kylepro/include + +# Compat +TARGET_USES_LOGD := false + +# jemalloc causes a lot of random crash on free() +MALLOC_IMPL := dlmalloc + +BOARD_SEPOLICY_DIRS += \ + device/samsung/kylepro/sepolicy + +BOARD_SEPOLICY_UNION += \ + file_contexts \ + property_contexts \ + service_contexts \ + bkmgrd.te \ + device.te \ + surfaceflinger.te \ + bluetooth.te \ + geomagneticd.te \ + gpsd.te \ + init.te \ + immvibed.te \ + kernel.te \ + macloader.te \ + rild.te \ + shell.te \ + system_server.te \ + tvserver.te \ + vclmk.te \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f38517 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# This is device tree for GT-S7580 (Kylepro), build based on GT-S7270 device tree by Zim555 + +### Other source: +* Kernel: https://github.com/SandPox/android_kernel_samsung_kyleproxx +* Vendor: https://github.com/SandPox/android_vendor_samsung_kyleproxx + +Thanks to Zim555 for all his helps :) + +# [UNDERDEVELOPMENT] \ No newline at end of file diff --git a/bluetooth/bdroid_buildcfg.h b/bluetooth/bdroid_buildcfg.h new file mode 100644 index 0000000..f5e3ccc --- /dev/null +++ b/bluetooth/bdroid_buildcfg.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2012 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 _BDROID_BUILDCFG_H +#define _BDROID_BUILDCFG_H + +#define BTM_DEF_LOCAL_NAME "GT-S7580" + +#endif diff --git a/bluetooth/libbt_vndcfg_s7580.txt b/bluetooth/libbt_vndcfg_s7580.txt new file mode 100644 index 0000000..cf01eb7 --- /dev/null +++ b/bluetooth/libbt_vndcfg_s7580.txt @@ -0,0 +1,14 @@ +BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyS0" +FW_PATCHFILE_LOCATION = "/system/bin/" +BT_WAKE_VIA_USERIAL_IOCTL = TRUE +LPM_BT_WAKE_POLARITY = 0 +LPM_HOST_WAKE_POLARITY = 0 +LPM_IDLE_TIMEOUT_MULTIPLE = 5 +BTVND_DBG = FALSE +BTHW_DBG = TRUE +VNDUSERIAL_DBG = FALSE +UPIO_DBG = FALSE +FW_PATCH_SETTLEMENT_DELAY_MS = 50 +SCO_PCM_IF_CLOCK_RATE = 0 +PCM_DATA_FMT_FILL_METHOD = 0 +PCM_DATA_FMT_FILL_NUM = 0 diff --git a/cm.dependencies b/cm.dependencies new file mode 100644 index 0000000..920bdb8 --- /dev/null +++ b/cm.dependencies @@ -0,0 +1,10 @@ +[ + { + "repository": "android_packages_apps_SamsungServiceMode", + "target_path": "packages/apps/SamsungServiceMode" + }, + { + "repository": "android_hardware_samsung", + "target_path": "hardware/samsung" + } +] \ No newline at end of file diff --git a/cm.mk b/cm.mk new file mode 100644 index 0000000..a9dc9db --- /dev/null +++ b/cm.mk @@ -0,0 +1,16 @@ +# Release name +PRODUCT_RELEASE_NAME := GT-S7580 + +# Inherit some common CM stuff. +$(call inherit-product, vendor/cm/config/common_full_phone.mk) + +# Inherit device configuration +$(call inherit-product, device/samsung/kylepro/device_kylepro.mk) + +## Device identifier. This must come after all inclusions +PRODUCT_DEVICE := kylepro +PRODUCT_NAME := cm_kylepro +PRODUCT_BRAND := samsung +PRODUCT_MANUFACTURER := samsung +PRODUCT_MODEL := GT-S7580 +PRODUCT_CHARACTERISTICS := phone diff --git a/cmhw/org/cyanogenmod/hardware/SerialNumber.java b/cmhw/org/cyanogenmod/hardware/SerialNumber.java new file mode 100644 index 0000000..9a769ab --- /dev/null +++ b/cmhw/org/cyanogenmod/hardware/SerialNumber.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 The CyanogenMod 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. + */ + +package org.cyanogenmod.hardware; + +import android.os.SystemProperties; + +/** + * Support for displaying a different serial number in Settings -> About Phone + * than ro.serialno, which may be different than the actual serial number + * sticker on the hardware. + */ +public class SerialNumber { + + /** + * Whether device requires an alternative serial number. + * + * @return boolean Supported devices must return always true + */ + public static boolean isSupported() { return true; } + + /** + * Returns the alternative serial number to be displayed. + */ + public static String getSerialNumber() { + return SystemProperties.get("ril.serialnumber"); + } + +} diff --git a/configs/audio_policy.conf b/configs/audio_policy.conf new file mode 100644 index 0000000..7296dd5 --- /dev/null +++ b/configs/audio_policy.conf @@ -0,0 +1,95 @@ +# +# Audio policy configuration for generic device builds (goldfish audio HAL - emulator) +# + +# Global configuration section: lists input and output devices always present on the device +# as well as the output device selected by default. +# Devices are designated by a string that corresponds to the enum in audio.h + +global_configuration { + attached_output_devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER + default_output_device AUDIO_DEVICE_OUT_SPEAKER + attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_VOICE_CALL +} + +# audio hardware module section: contains descriptors for all audio hw modules present on the +# device. Each hw module node is named after the corresponding hw module library base name. +# For instance, "primary" corresponds to audio.primary..so. +# The "primary" module is mandatory and must include at least one output with +# AUDIO_OUTPUT_FLAG_PRIMARY flag. +# Each module descriptor contains one or more output profile descriptors and zero or more +# input profile descriptors. Each profile lists all the parameters supported by a given output +# or input stream category. +# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding +# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n". + +# IMPORTATANT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# If your output device support 16000hz sample rate, please do NOT list 16000 first, because I use +# first_supported_sample_rate==16000 as VoIP out +# I also use input device that support AUDIO_DEVICE_IN_VOICE_CALL as VoIP input indicator, otherwise I +# need to modify AudioPolicyManagerBase to add enum strings or rewrite Audio Policy Configuration +# loading function to add more enum strings. +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +audio_hw_modules { + primary { + outputs { + primary { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET + flags AUDIO_OUTPUT_FLAG_PRIMARY + } + voip { + sampling_rates 16000|48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO + } + } + inputs { + primary { + sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_FM|AUDIO_DEVICE_IN_VOICE_CALL + } + voip { + sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_VOICE_CALL + } + } + } + a2dp { + outputs { + a2dp { + sampling_rates 44100 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_ALL_A2DP + } + } + } + r_submix { + outputs { + submix { + sampling_rates 44100|48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX + } + } + inputs { + submix { + sampling_rates 44100|48000 + channel_masks AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_REMOTE_SUBMIX + } + } + } + } +} diff --git a/configs/egl.cfg b/configs/egl.cfg new file mode 100644 index 0000000..7e9da07 --- /dev/null +++ b/configs/egl.cfg @@ -0,0 +1,2 @@ +0 0 android +0 1 hawaii diff --git a/configs/media_codecs.xml b/configs/media_codecs.xml new file mode 100644 index 0000000..ed39048 --- /dev/null +++ b/configs/media_codecs.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configs/media_profiles.xml b/configs/media_profiles.xml new file mode 100644 index 0000000..5f5c7ac --- /dev/null +++ b/configs/media_profiles.xml @@ -0,0 +1,529 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/device_kylepro.mk b/device_kylepro.mk new file mode 100644 index 0000000..b45438d --- /dev/null +++ b/device_kylepro.mk @@ -0,0 +1,157 @@ +$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk) + +$(call inherit-product-if-exists, vendor/samsung/kylepro/kylepro-common-vendor.mk) + +# Use high-density artwork where available +PRODUCT_LOCALES += hdpi +PRODUCT_AAPT_CONFIG := normal +PRODUCT_AAPT_PREF_CONFIG := hdpi + +DEVICE_PACKAGE_OVERLAYS += device/samsung/kylepro/overlay + +# Init files +PRODUCT_COPY_FILES += \ + device/samsung/kylepro/ramdisk/fstab.hawaii_ss_kylepro:root/fstab.hawaii_ss_kylepro \ + device/samsung/kylepro/ramdisk/init.rc:root/init.rc \ + device/samsung/kylepro/ramdisk/init.hawaii_ss_kylepro.rc:root/init.hawaii_ss_kylepro.rc \ + device/samsung/kylepro/ramdisk/init.bcm2166x.usb.rc:root/init.bcm2166x.usb.rc \ + device/samsung/kylepro/ramdisk/init.log.rc:root/init.log.rc \ + device/samsung/kylepro/ramdisk/charger:root/charger \ + device/samsung/kylepro/ramdisk/ueventd.hawaii_ss_kylepro.rc:root/ueventd.hawaii_ss_kylepro.rc + +PRODUCT_COPY_FILES += \ + device/samsung/kylepro/configs/media_profiles.xml:system/etc/media_profiles.xml \ + device/samsung/kylepro/configs/audio_policy.conf:system/etc/audio_policy.conf \ + frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:system/etc/media_codecs_google_audio.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:system/etc/media_codecs_google_telephony.xml \ + frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:system/etc/media_codecs_google_video.xml \ + device/samsung/kylepro/configs/media_codecs.xml:system/etc/media_codecs.xml + +# Prebuilt kl keymaps +PRODUCT_COPY_FILES += \ + device/samsung/kylepro/keylayouts/bcm_headset.kl:system/usr/keylayout/bcm_headset.kl \ + device/samsung/kylepro/keylayouts/bcm_keypad_v2.kl:system/usr/keylayout/bcm_keypad_v2.kl \ + device/samsung/kylepro/keylayouts/gpio-keys.kl:system/usr/keylayout/gpio-keys.kl \ + device/samsung/kylepro/keylayouts/samsung-keypad.kl:system/usr/keylayout/samsung-keypad.kl + +# Copy Apps +#PRODUCT_COPY_FILES += \ +# device/samsung/kylepro/apk/Effem.apk:system/app/Effem.apk + +# Charger +PRODUCT_PACKAGES += \ + charger_res_images + +# Insecure ADBD +ADDITIONAL_DEFAULT_PROPERTIES += \ + ro.adb.secure=0 \ + persist.service.adb.enable=0 + +# Filesystem management tools +PRODUCT_PACKAGES += \ + make_ext4fs \ + e2fsck \ + setup_fs + +# Usb accessory +PRODUCT_PACKAGES += \ + com.android.future.usb.accessory + +# Misc other modules +PRODUCT_PACKAGES += \ + audio.a2dp.default \ + audio.usb.default \ + audio.r_submix.default \ + audio.primary.default \ + +# Device-specific packages +PRODUCT_PACKAGES += \ + SamsungServiceMode + +# KSM +PRODUCT_PROPERTY_OVERRIDES += \ + ro.ksm.default=1 + +# Wi-Fi +PRODUCT_PACKAGES += \ + dhcpcd.conf \ + hostapd \ + wpa_supplicant \ + wpa_supplicant.conf + +# These are the hardware-specific features +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \ + frameworks/native/data/etc/android.hardware.bluetooth_le.xml:system/etc/permissions/android.hardware.bluetooth_le.xml \ + frameworks/native/data/etc/android.hardware.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \ + frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \ + frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.xml \ + frameworks/native/data/etc/android.hardware.location.xml:system/etc/permissions/android.hardware.location.xml \ + frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \ + frameworks/native/data/etc/android.hardware.ethernet.xml:system/etc/permissions/android.hardware.ethernet.xml \ + frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \ + frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \ + frameworks/native/data/etc/android.hardware.sensor.proximity.xml:system/etc/permissions/android.hardware.sensor.proximity.xml \ + frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ + frameworks/native/data/etc/android.software.sip.voip.xml:system/etc/permissions/android.software.sip.voip.xml \ + frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml \ + frameworks/native/data/etc/android.hardware.usb.host.xml:system/etc/permissions/android.hardware.usb.host.xml + +# These are the hardware-specific settings that are stored in system properties. +# Note that the only such settings should be the ones that are too low-level to +# be reachable from resources or other mechanisms. +PRODUCT_PROPERTY_OVERRIDES += \ + wifi.interface=wlan0 \ + mobiledata.interfaces=rmnet0 \ + ro.telephony.ril_class=SamsungBCMRIL \ + persist.radio.multisim.config=none \ + cm.updater.uri=http://get.ace3.tk \ + ro.telephony.call_ring.multiple=0 \ + camera2.portability.force_api=1 \ + ro.telephony.call_ring=0 + +# enable Google-specific location features, +# like NetworkLocationProvider and LocationCollector +#PRODUCT_PROPERTY_OVERRIDES += \ +# ro.com.google.locationfeatures=1 \ +# ro.com.google.networklocation=1 + +# Extended JNI checks +# The extended JNI checks will cause the system to run more slowly, but they can spot a variety of nasty bugs +# before they have a chance to cause problems. +# Default=true for development builds, set by android buildsystem. +#PRODUCT_PROPERTY_OVERRIDES += \ +# ro.kernel.android.checkjni=0 \ +# dalvik.vm.checkjni=false + +# MTP +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + persist.sys.usb.config=mtp + +# Override phone-hdpi-512-dalvik-heap to match value on stock +# - helps pass CTS com.squareup.okhttp.internal.spdy.Spdy3Test#tooLargeDataFrame) +# (property override must come before included property) +#PRODUCT_PROPERTY_OVERRIDES += \ +# dalvik.vm.heapgrowthlimit=56m + +# Dalvik heap config +include frameworks/native/build/phone-hdpi-512-dalvik-heap.mk + +# we have enough storage space to hold precise GC data +#PRODUCT_TAGS += dalvik.gc.type-precise + +$(call inherit-product, hardware/broadcom/wlan/bcmdhd/config/config-bcm.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) + +ifeq ($(TARGET_BUILD_VARIANT),user) +else +endif + +PRODUCT_BUILD_PROP_OVERRIDES += BUILD_UTC_DATE=0 +PRODUCT_NAME := full_kylepro +PRODUCT_DEVICE := kylepro +PRODUCT_MODEL := GT-S7580 diff --git a/health/Android.mk b/health/Android.mk new file mode 100644 index 0000000..134841f --- /dev/null +++ b/health/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2013 The Android Open Source Project +# Copyright (C) 2013 The CyanogenMod 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 := healthd-hawaii.cpp +LOCAL_MODULE := libhealthd-kylepro.hawaii +LOCAL_C_INCLUDES := system/core/healthd +include $(BUILD_STATIC_LIBRARY) diff --git a/health/healthd-hawaii.cpp b/health/healthd-hawaii.cpp new file mode 100644 index 0000000..c66ec2c --- /dev/null +++ b/health/healthd-hawaii.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2013 The CyanogenMod 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 + +void +healthd_board_init(struct healthd_config *config) +{ + // battery needs to be used instead of bcm59056_charger + config->batteryStatusPath = "/sys/class/power_supply/battery/status"; + config->batteryHealthPath = "/sys/class/power_supply/battery/health"; + config->batteryPresentPath = "/sys/class/power_supply/battery/present"; + config->batteryCapacityPath = "/sys/class/power_supply/battery/capacity"; + config->batteryVoltagePath = "/sys/class/power_supply/battery/voltage_now"; + config->batteryTemperaturePath = "/sys/class/power_supply/battery/temp"; + config->batteryTechnologyPath = "/sys/class/power_supply/battery/technology"; +} + +int +healthd_board_battery_update(struct android::BatteryProperties *props) +{ + // don't log to kernel + return 1; +} \ No newline at end of file diff --git a/include/hardware/gps.h b/include/hardware/gps.h new file mode 100644 index 0000000..edf7c7b --- /dev/null +++ b/include/hardware/gps.h @@ -0,0 +1,1826 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_INCLUDE_HARDWARE_GPS_H +#define ANDROID_INCLUDE_HARDWARE_GPS_H + +#include +#include +#include +#include +#include +#include + +#include + +__BEGIN_DECLS + +/** + * The id of this module + */ +#define GPS_HARDWARE_MODULE_ID "gps" + + +/** Milliseconds since January 1, 1970 */ +typedef int64_t GpsUtcTime; + +/** Maximum number of SVs for gps_sv_status_callback(). */ +#define GPS_MAX_SVS 32 + +/** Maximum number of Measurements in gps_measurement_callback(). */ +#define GPS_MAX_MEASUREMENT 32 + +/** Requested operational mode for GPS operation. */ +typedef uint32_t GpsPositionMode; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Mode for running GPS standalone (no assistance). */ +#define GPS_POSITION_MODE_STANDALONE 0 +/** AGPS MS-Based mode. */ +#define GPS_POSITION_MODE_MS_BASED 1 +/** AGPS MS-Assisted mode. */ +#define GPS_POSITION_MODE_MS_ASSISTED 2 + +/** Requested recurrence mode for GPS operation. */ +typedef uint32_t GpsPositionRecurrence; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** Receive GPS fixes on a recurring basis at a specified period. */ +#define GPS_POSITION_RECURRENCE_PERIODIC 0 +/** Request a single shot GPS fix. */ +#define GPS_POSITION_RECURRENCE_SINGLE 1 + +/** GPS status event values. */ +typedef uint16_t GpsStatusValue; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GPS status unknown. */ +#define GPS_STATUS_NONE 0 +/** GPS has begun navigating. */ +#define GPS_STATUS_SESSION_BEGIN 1 +/** GPS has stopped navigating. */ +#define GPS_STATUS_SESSION_END 2 +/** GPS has powered on but is not navigating. */ +#define GPS_STATUS_ENGINE_ON 3 +/** GPS is powered off. */ +#define GPS_STATUS_ENGINE_OFF 4 + +/** Flags to indicate which values are valid in a GpsLocation. */ +typedef uint16_t GpsLocationFlags; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +/** GpsLocation has valid latitude and longitude. */ +#define GPS_LOCATION_HAS_LAT_LONG 0x0001 +/** GpsLocation has valid altitude. */ +#define GPS_LOCATION_HAS_ALTITUDE 0x0002 +/** GpsLocation has valid speed. */ +#define GPS_LOCATION_HAS_SPEED 0x0004 +/** GpsLocation has valid bearing. */ +#define GPS_LOCATION_HAS_BEARING 0x0008 +/** GpsLocation has valid accuracy. */ +#define GPS_LOCATION_HAS_ACCURACY 0x0010 + +/** Flags for the gps_set_capabilities callback. */ + +/** GPS HAL schedules fixes for GPS_POSITION_RECURRENCE_PERIODIC mode. + If this is not set, then the framework will use 1000ms for min_interval + and will start and call start() and stop() to schedule the GPS. + */ +#define GPS_CAPABILITY_SCHEDULING 0x0000001 +/** GPS supports MS-Based AGPS mode */ +#define GPS_CAPABILITY_MSB 0x0000002 +/** GPS supports MS-Assisted AGPS mode */ +#define GPS_CAPABILITY_MSA 0x0000004 +/** GPS supports single-shot fixes */ +#define GPS_CAPABILITY_SINGLE_SHOT 0x0000008 +/** GPS supports on demand time injection */ +#define GPS_CAPABILITY_ON_DEMAND_TIME 0x0000010 +/** GPS supports Geofencing */ +#define GPS_CAPABILITY_GEOFENCING 0x0000020 +/** GPS supports Measurements */ +#define GPS_CAPABILITY_MEASUREMENTS 0x0000040 +/** GPS supports Navigation Messages */ +#define GPS_CAPABILITY_NAV_MESSAGES 0x0000080 + +/** Flags used to specify which aiding data to delete + when calling delete_aiding_data(). */ +typedef uint16_t GpsAidingData; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +#define GPS_DELETE_EPHEMERIS 0x0001 +#define GPS_DELETE_ALMANAC 0x0002 +#define GPS_DELETE_POSITION 0x0004 +#define GPS_DELETE_TIME 0x0008 +#define GPS_DELETE_IONO 0x0010 +#define GPS_DELETE_UTC 0x0020 +#define GPS_DELETE_HEALTH 0x0040 +#define GPS_DELETE_SVDIR 0x0080 +#define GPS_DELETE_SVSTEER 0x0100 +#define GPS_DELETE_SADATA 0x0200 +#define GPS_DELETE_RTI 0x0400 +#define GPS_DELETE_CELLDB_INFO 0x8000 +#define GPS_DELETE_ALL 0xFFFF + +/** AGPS type */ +typedef uint16_t AGpsType; +#define AGPS_TYPE_SUPL 1 +#define AGPS_TYPE_C2K 2 + +typedef uint16_t AGpsSetIDType; +#define AGPS_SETID_TYPE_NONE 0 +#define AGPS_SETID_TYPE_IMSI 1 +#define AGPS_SETID_TYPE_MSISDN 2 + +typedef uint16_t ApnIpType; +#define APN_IP_INVALID 0 +#define APN_IP_IPV4 1 +#define APN_IP_IPV6 2 +#define APN_IP_IPV4V6 3 + +/** + * String length constants + */ +#define GPS_NI_SHORT_STRING_MAXLEN 256 +#define GPS_NI_LONG_STRING_MAXLEN 2048 + +/** + * GpsNiType constants + */ +typedef uint32_t GpsNiType; +#define GPS_NI_TYPE_VOICE 1 +#define GPS_NI_TYPE_UMTS_SUPL 2 +#define GPS_NI_TYPE_UMTS_CTRL_PLANE 3 + +/** + * GpsNiNotifyFlags constants + */ +typedef uint32_t GpsNiNotifyFlags; +/** NI requires notification */ +#define GPS_NI_NEED_NOTIFY 0x0001 +/** NI requires verification */ +#define GPS_NI_NEED_VERIFY 0x0002 +/** NI requires privacy override, no notification/minimal trace */ +#define GPS_NI_PRIVACY_OVERRIDE 0x0004 + +/** + * GPS NI responses, used to define the response in + * NI structures + */ +typedef int GpsUserResponseType; +#define GPS_NI_RESPONSE_ACCEPT 1 +#define GPS_NI_RESPONSE_DENY 2 +#define GPS_NI_RESPONSE_NORESP 3 + +/** + * NI data encoding scheme + */ +typedef int GpsNiEncodingType; +#define GPS_ENC_NONE 0 +#define GPS_ENC_SUPL_GSM_DEFAULT 1 +#define GPS_ENC_SUPL_UTF8 2 +#define GPS_ENC_SUPL_UCS2 3 +#define GPS_ENC_UNKNOWN -1 + +/** AGPS status event values. */ +typedef uint16_t AGpsStatusValue; +/** GPS requests data connection for AGPS. */ +#define GPS_REQUEST_AGPS_DATA_CONN 1 +/** GPS releases the AGPS data connection. */ +#define GPS_RELEASE_AGPS_DATA_CONN 2 +/** AGPS data connection initiated */ +#define GPS_AGPS_DATA_CONNECTED 3 +/** AGPS data connection completed */ +#define GPS_AGPS_DATA_CONN_DONE 4 +/** AGPS data connection failed */ +#define GPS_AGPS_DATA_CONN_FAILED 5 + +#define AGPS_REF_LOCATION_TYPE_GSM_CELLID 1 +#define AGPS_REF_LOCATION_TYPE_UMTS_CELLID 2 +#define AGPS_REG_LOCATION_TYPE_MAC 3 + +/** Network types for update_network_state "type" parameter */ +#define AGPS_RIL_NETWORK_TYPE_MOBILE 0 +#define AGPS_RIL_NETWORK_TYPE_WIFI 1 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_MMS 2 +#define AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL 3 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN 4 +#define AGPS_RIL_NETWORK_TTYPE_MOBILE_HIPRI 5 +#define AGPS_RIL_NETWORK_TTYPE_WIMAX 6 + +/** + * Flags to indicate what fields in GpsClock are valid. + */ +typedef uint16_t GpsClockFlags; +/** A valid 'leap second' is stored in the data structure. */ +#define GPS_CLOCK_HAS_LEAP_SECOND (1<<0) +/** A valid 'time uncertainty' is stored in the data structure. */ +#define GPS_CLOCK_HAS_TIME_UNCERTAINTY (1<<1) +/** A valid 'full bias' is stored in the data structure. */ +#define GPS_CLOCK_HAS_FULL_BIAS (1<<2) +/** A valid 'bias' is stored in the data structure. */ +#define GPS_CLOCK_HAS_BIAS (1<<3) +/** A valid 'bias uncertainty' is stored in the data structure. */ +#define GPS_CLOCK_HAS_BIAS_UNCERTAINTY (1<<4) +/** A valid 'drift' is stored in the data structure. */ +#define GPS_CLOCK_HAS_DRIFT (1<<5) +/** A valid 'drift uncertainty' is stored in the data structure. */ +#define GPS_CLOCK_HAS_DRIFT_UNCERTAINTY (1<<6) + +/** + * Enumeration of the available values for the GPS Clock type. + */ +typedef uint8_t GpsClockType; +/** The type is not available ot it is unknown. */ +#define GPS_CLOCK_TYPE_UNKNOWN 0 +/** The source of the time value reported by GPS clock is the local hardware clock. */ +#define GPS_CLOCK_TYPE_LOCAL_HW_TIME 1 +/** + * The source of the time value reported by GPS clock is the GPS time derived from satellites + * (epoch = Jan 6, 1980) + */ +#define GPS_CLOCK_TYPE_GPS_TIME 2 + +/** + * Flags to indicate what fields in GpsMeasurement are valid. + */ +typedef uint32_t GpsMeasurementFlags; +/** A valid 'snr' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_SNR (1<<0) +/** A valid 'elevation' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_ELEVATION (1<<1) +/** A valid 'elevation uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY (1<<2) +/** A valid 'azimuth' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_AZIMUTH (1<<3) +/** A valid 'azimuth uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY (1<<4) +/** A valid 'pseudorange' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_PSEUDORANGE (1<<5) +/** A valid 'pseudorange uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY (1<<6) +/** A valid 'code phase' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CODE_PHASE (1<<7) +/** A valid 'code phase uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY (1<<8) +/** A valid 'carrier frequency' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY (1<<9) +/** A valid 'carrier cycles' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CARRIER_CYCLES (1<<10) +/** A valid 'carrier phase' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CARRIER_PHASE (1<<11) +/** A valid 'carrier phase uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY (1<<12) +/** A valid 'bit number' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_BIT_NUMBER (1<<13) +/** A valid 'time from last bit' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT (1<<14) +/** A valid 'doppler shift' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_DOPPLER_SHIFT (1<<15) +/** A valid 'doppler shift uncertainty' is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY (1<<16) +/** A valid 'used in fix' flag is stored in the data structure. */ +#define GPS_MEASUREMENT_HAS_USED_IN_FIX (1<<17) + +/** + * Enumeration of the available values for the GPS Measurement's loss of lock. + */ +typedef uint8_t GpsLossOfLock; +/** The indicator is not available or it is unknown. */ +#define GPS_LOSS_OF_LOCK_UNKNOWN 0 +/** The measurement does not present any indication of loss of lock. */ +#define GPS_LOSS_OF_LOCK_OK 1 +/** Loss of lock between previous and current observation: cycle slip possible. */ +#define GPS_LOSS_OF_LOCK_CYCLE_SLIP 2 + +/** + * Enumeration of available values for the GPS Measurement's multipath indicator. + */ +typedef uint8_t GpsMultipathIndicator; +/** The indicator is not available or unknown. */ +#define GPS_MULTIPATH_INDICATOR_UNKNOWN 0 +/** The measurement has been indicated to use multipath. */ +#define GPS_MULTIPATH_INDICATOR_DETECTED 1 +/** The measurement has been indicated Not to use multipath. */ +#define GPS_MULTIPATH_INDICATOR_NOT_USED 2 + +/** + * Flags indicating the GPS measurement state. + * The expected behavior here is for GPS HAL to set all the flags that applies. For + * example, if the state for a satellite is only C/A code locked and bit synchronized, + * and there is still millisecond ambiguity, the state should be set as: + * GPS_MEASUREMENT_STATE_CODE_LOCK|GPS_MEASUREMENT_STATE_BIT_SYNC|GPS_MEASUREMENT_STATE_MSEC_AMBIGUOUS + * If GPS is still searching for a satellite, the corresponding state should be set to + * GPS_MEASUREMENT_STATE_UNKNOWN(0). + */ +typedef uint16_t GpsMeasurementState; +#define GPS_MEASUREMENT_STATE_UNKNOWN 0 +#define GPS_MEASUREMENT_STATE_CODE_LOCK (1<<0) +#define GPS_MEASUREMENT_STATE_BIT_SYNC (1<<1) +#define GPS_MEASUREMENT_STATE_SUBFRAME_SYNC (1<<2) +#define GPS_MEASUREMENT_STATE_TOW_DECODED (1<<3) +#define GPS_MEASUREMENT_STATE_MSEC_AMBIGUOUS (1<<4) + +/** + * Flags indicating the Accumulated Delta Range's states. + */ +typedef uint16_t GpsAccumulatedDeltaRangeState; +#define GPS_ADR_STATE_UNKNOWN 0 +#define GPS_ADR_STATE_VALID (1<<0) +#define GPS_ADR_STATE_RESET (1<<1) +#define GPS_ADR_STATE_CYCLE_SLIP (1<<2) + +/** + * Enumeration of available values to indicate the available GPS Navigation message types. + */ +typedef uint8_t GpsNavigationMessageType; +/** The message type is unknown. */ +#define GPS_NAVIGATION_MESSAGE_TYPE_UNKNOWN 0 +/** L1 C/A message contained in the structure. */ +#define GPS_NAVIGATION_MESSAGE_TYPE_L1CA 1 +/** L2-CNAV message contained in the structure. */ +#define GPS_NAVIGATION_MESSAGE_TYPE_L2CNAV 2 +/** L5-CNAV message contained in the structure. */ +#define GPS_NAVIGATION_MESSAGE_TYPE_L5CNAV 3 +/** CNAV-2 message contained in the structure. */ +#define GPS_NAVIGATION_MESSAGE_TYPE_CNAV2 4 + +/** + * Status of Navigation Message + * When a message is received properly without any parity error in its navigation words, the + * status should be set to NAV_MESSAGE_STATUS_PARITY_PASSED. But if a message is received + * with words that failed parity check, but GPS is able to correct those words, the status + * should be set to NAV_MESSAGE_STATUS_PARITY_REBUILT. + * No need to send any navigation message that contains words with parity error and cannot be + * corrected. + */ +typedef uint16_t NavigationMessageStatus; +#define NAV_MESSAGE_STATUS_UNKONW 0 +#define NAV_MESSAGE_STATUS_PARITY_PASSED (1<<0) +#define NAV_MESSAGE_STATUS_PARITY_REBUILT (1<<1) + +/** + * Name for the GPS XTRA interface. + */ +#define GPS_XTRA_INTERFACE "gps-xtra" + +/** + * Name for the GPS DEBUG interface. + */ +#define GPS_DEBUG_INTERFACE "gps-debug" + +/** + * Name for the AGPS interface. + */ +#define AGPS_INTERFACE "agps" + +/** + * Name of the Supl Certificate interface. + */ +#define SUPL_CERTIFICATE_INTERFACE "supl-certificate" + +/** + * Name for NI interface + */ +#define GPS_NI_INTERFACE "gps-ni" + +/** + * Name for the AGPS-RIL interface. + */ +#define AGPS_RIL_INTERFACE "agps_ril" + +/** + * Name for the GPS_Geofencing interface. + */ +#define GPS_GEOFENCING_INTERFACE "gps_geofencing" + +/** + * Name of the GPS Measurements interface. + */ +#define GPS_MEASUREMENT_INTERFACE "gps_measurement" + +/** + * Name of the GPS navigation message interface. + */ +#define GPS_NAVIGATION_MESSAGE_INTERFACE "gps_navigation_message" + +/** + * Name of the GNSS/GPS configuration interface. + */ +#define GNSS_CONFIGURATION_INTERFACE "gnss_configuration" + + +/** Represents a location. */ +typedef struct { + /** set to sizeof(GpsLocation) */ + size_t size; + /** Contains GpsLocationFlags bits. */ + uint16_t flags; + /** Represents latitude in degrees. */ + double latitude; + /** Represents longitude in degrees. */ + double longitude; + /** Represents altitude in meters above the WGS 84 reference + * ellipsoid. */ + double altitude; + /** Represents speed in meters per second. */ + float speed; + /** Represents heading in degrees. */ + float bearing; + /** Represents expected accuracy in meters. */ + float accuracy; + /** Timestamp for the location fix. */ + GpsUtcTime timestamp; +} GpsLocation; + +/** Represents the status. */ +typedef struct { + /** set to sizeof(GpsStatus) */ + size_t size; + GpsStatusValue status; +} GpsStatus; + +/** Represents SV information. */ +typedef struct { + /** set to sizeof(GpsSvInfo) */ + size_t size; + /** Pseudo-random number for the SV. */ + int prn; + /** Signal to noise ratio. */ + float snr; + /** Elevation of SV in degrees. */ + float elevation; + /** Azimuth of SV in degrees. */ + float azimuth; + /** Unknown Samsung element. */ + int padding; +} GpsSvInfo; + +/** Represents SV status. */ +typedef struct { + /** set to sizeof(GpsSvStatus) */ + size_t size; + + /** Number of SVs currently visible. */ + int num_svs; + + /** Contains an array of SV information. */ + GpsSvInfo sv_list[GPS_MAX_SVS]; + + /** Represents a bit mask indicating which SVs + * have ephemeris data. + */ + uint32_t ephemeris_mask; + + /** Represents a bit mask indicating which SVs + * have almanac data. + */ + uint32_t almanac_mask; + + /** + * Represents a bit mask indicating which SVs + * were used for computing the most recent position fix. + */ + uint32_t used_in_fix_mask; +} GpsSvStatus; + + +/* 2G and 3G */ +/* In 3G lac is discarded */ +typedef struct { + uint16_t type; + uint16_t mcc; + uint16_t mnc; + uint16_t lac; + uint32_t cid; +} AGpsRefLocationCellID; + +typedef struct { + uint8_t mac[6]; +} AGpsRefLocationMac; + +/** Represents ref locations */ +typedef struct { + uint16_t type; + union { + AGpsRefLocationCellID cellID; + AGpsRefLocationMac mac; + } u; +} AGpsRefLocation; + +/** Callback with location information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_location_callback)(GpsLocation* location); + +/** Callback with status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_status_callback)(GpsStatus* status); + +/** + * Callback with SV status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); + +/** Callback for reporting NMEA sentences. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); + +/** Callback to inform framework of the GPS engine's capabilities. + * Capability parameter is a bit field of GPS_CAPABILITY_* flags. + */ +typedef void (* gps_set_capabilities)(uint32_t capabilities); + +/** Callback utility for acquiring the GPS wakelock. + * This can be used to prevent the CPU from suspending while handling GPS events. + */ +typedef void (* gps_acquire_wakelock)(); + +/** Callback utility for releasing the GPS wakelock. */ +typedef void (* gps_release_wakelock)(); + +/** Callback for requesting NTP time */ +typedef void (* gps_request_utc_time)(); + +/** Callback for creating a thread that can call into the Java framework code. + * This must be used to create any threads that report events up to the framework. + */ +typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); + +/** GPS callback structure. */ +typedef struct { + /** set to sizeof(GpsCallbacks) */ + size_t size; + gps_location_callback location_cb; + gps_status_callback status_cb; + gps_sv_status_callback sv_status_cb; + gps_nmea_callback nmea_cb; + gps_set_capabilities set_capabilities_cb; + gps_acquire_wakelock acquire_wakelock_cb; + gps_release_wakelock release_wakelock_cb; + gps_create_thread create_thread_cb; + gps_request_utc_time request_utc_time_cb; +} GpsCallbacks; + + +/** Represents the standard GPS interface. */ +typedef struct { + /** set to sizeof(GpsInterface) */ + size_t size; + /** + * Opens the interface and provides the callback routines + * to the implementation of this interface. + */ + int (*init)( GpsCallbacks* callbacks ); + + /** Starts navigating. */ + int (*start)( void ); + + /** Stops navigating. */ + int (*stop)( void ); + + /** Closes the interface. */ + void (*cleanup)( void ); + + /** Injects the current time. */ + int (*inject_time)(GpsUtcTime time, int64_t timeReference, + int uncertainty); + + /** Injects current location from another location provider + * (typically cell ID). + * latitude and longitude are measured in degrees + * expected accuracy is measured in meters + */ + int (*inject_location)(double latitude, double longitude, float accuracy); + + /** + * Specifies that the next call to start will not use the + * information defined in the flags. GPS_DELETE_ALL is passed for + * a cold start. + */ + void (*delete_aiding_data)(GpsAidingData flags); + + /** + * min_interval represents the time between fixes in milliseconds. + * preferred_accuracy represents the requested fix accuracy in meters. + * preferred_time represents the requested time to first fix in milliseconds. + */ + int (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence, + uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time); + + /** Get a pointer to extension information. */ + const void* (*get_extension)(const char* name); +} GpsInterface; + +/** Callback to request the client to download XTRA data. + * The client should download XTRA data and inject it by calling inject_xtra_data(). + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_xtra_download_request)(); + +/** Callback structure for the XTRA interface. */ +typedef struct { + gps_xtra_download_request download_request_cb; + gps_create_thread create_thread_cb; +} GpsXtraCallbacks; + +/** Extended interface for XTRA support. */ +typedef struct { + /** set to sizeof(GpsXtraInterface) */ + size_t size; + /** + * Opens the XTRA interface and provides the callback routines + * to the implementation of this interface. + */ + int (*init)( GpsXtraCallbacks* callbacks ); + /** Injects XTRA data into the GPS. */ + int (*inject_xtra_data)( char* data, int length ); +} GpsXtraInterface; + +/** Extended interface for DEBUG support. */ +typedef struct { + /** set to sizeof(GpsDebugInterface) */ + size_t size; + + /** + * This function should return any information that the native + * implementation wishes to include in a bugreport. + */ + size_t (*get_internal_state)(char* buffer, size_t bufferSize); +} GpsDebugInterface; + +/** Represents the status of AGPS. */ +typedef struct { + /** set to sizeof(AGpsStatus_v1) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; +} AGpsStatus_v1; + +/** Represents the status of AGPS augmented with a IPv4 address field. */ +typedef struct { + /** set to sizeof(AGpsStatus_v2) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; + uint32_t ipaddr; +} AGpsStatus_v2; + +/* Represents the status of AGPS augmented to support IPv4 and IPv6. */ +typedef struct { + /** set to sizeof(AGpsStatus_v3) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; + + /** + * Must be set to a valid IPv4 address if the field 'addr' contains an IPv4 + * address, or set to INADDR_NONE otherwise. + */ + uint32_t ipaddr; + + /** + * Must contain the IPv4 (AF_INET) or IPv6 (AF_INET6) address to report. + * Any other value of addr.ss_family will be rejected. + * */ + struct sockaddr_storage addr; +} AGpsStatus_v3; + +typedef AGpsStatus_v3 AGpsStatus; + +/** Callback with AGPS status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* agps_status_callback)(AGpsStatus* status); + +/** Callback structure for the AGPS interface. */ +typedef struct { + agps_status_callback status_cb; + gps_create_thread create_thread_cb; +} AGpsCallbacks; + + +/** Extended interface for AGPS support. */ +typedef struct { + /** set to sizeof(AGpsInterface_v1) */ + size_t size; + + /** + * Opens the AGPS interface and provides the callback routines + * to the implementation of this interface. + */ + void (*init)( AGpsCallbacks* callbacks ); + /** + * Notifies that a data connection is available and sets + * the name of the APN to be used for SUPL. + */ + int (*data_conn_open)( const char* apn ); + /** + * Notifies that the AGPS data connection has been closed. + */ + int (*data_conn_closed)(); + /** + * Notifies that a data connection is not available for AGPS. + */ + int (*data_conn_failed)(); + /** + * Sets the hostname and port for the AGPS server. + */ + int (*set_server)( AGpsType type, const char* hostname, int port ); +} AGpsInterface_v1; + +/** + * Extended interface for AGPS support, it is augmented to enable to pass + * extra APN data. + */ +typedef struct { + /** set to sizeof(AGpsInterface_v2) */ + size_t size; + + /** + * Opens the AGPS interface and provides the callback routines to the + * implementation of this interface. + */ + void (*init)(AGpsCallbacks* callbacks); + /** + * Deprecated. + * If the HAL supports AGpsInterface_v2 this API will not be used, see + * data_conn_open_with_apn_ip_type for more information. + */ + int (*data_conn_open)(const char* apn); + /** + * Notifies that the AGPS data connection has been closed. + */ + int (*data_conn_closed)(); + /** + * Notifies that a data connection is not available for AGPS. + */ + int (*data_conn_failed)(); + /** + * Sets the hostname and port for the AGPS server. + */ + int (*set_server)(AGpsType type, const char* hostname, int port); + + /** + * Notifies that a data connection is available and sets the name of the + * APN, and its IP type, to be used for SUPL connections. + */ + int (*data_conn_open_with_apn_ip_type)( + const char* apn, + ApnIpType apnIpType); +} AGpsInterface_v2; + +typedef AGpsInterface_v2 AGpsInterface; + +/** Error codes associated with certificate operations */ +#define AGPS_CERTIFICATE_OPERATION_SUCCESS 0 +#define AGPS_CERTIFICATE_ERROR_GENERIC -100 +#define AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES -101 + +/** A data structure that represents an X.509 certificate using DER encoding */ +typedef struct { + size_t length; + u_char* data; +} DerEncodedCertificate; + +/** + * A type definition for SHA1 Fingerprints used to identify X.509 Certificates + * The Fingerprint is a digest of the DER Certificate that uniquely identifies it. + */ +typedef struct { + u_char data[20]; +} Sha1CertificateFingerprint; + +/** AGPS Interface to handle SUPL certificate operations */ +typedef struct { + /** set to sizeof(SuplCertificateInterface) */ + size_t size; + + /** + * Installs a set of Certificates used for SUPL connections to the AGPS server. + * If needed the HAL should find out internally any certificates that need to be removed to + * accommodate the certificates to install. + * The certificates installed represent a full set of valid certificates needed to connect to + * AGPS SUPL servers. + * The list of certificates is required, and all must be available at the same time, when trying + * to establish a connection with the AGPS Server. + * + * Parameters: + * certificates - A pointer to an array of DER encoded certificates that are need to be + * installed in the HAL. + * length - The number of certificates to install. + * Returns: + * AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully + * AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES if the HAL cannot store the number of + * certificates attempted to be installed, the state of the certificates stored should + * remain the same as before on this error case. + * + * IMPORTANT: + * If needed the HAL should find out internally the set of certificates that need to be + * removed to accommodate the certificates to install. + */ + int (*install_certificates) ( const DerEncodedCertificate* certificates, size_t length ); + + /** + * Notifies the HAL that a list of certificates used for SUPL connections are revoked. It is + * expected that the given set of certificates is removed from the internal store of the HAL. + * + * Parameters: + * fingerprints - A pointer to an array of SHA1 Fingerprints to identify the set of + * certificates to revoke. + * length - The number of fingerprints provided. + * Returns: + * AGPS_CERTIFICATE_OPERATION_SUCCESS if the operation is completed successfully. + * + * IMPORTANT: + * If any of the certificates provided (through its fingerprint) is not known by the HAL, + * it should be ignored and continue revoking/deleting the rest of them. + */ + int (*revoke_certificates) ( const Sha1CertificateFingerprint* fingerprints, size_t length ); +} SuplCertificateInterface; + +/** Represents an NI request */ +typedef struct { + /** set to sizeof(GpsNiNotification) */ + size_t size; + + /** + * An ID generated by HAL to associate NI notifications and UI + * responses + */ + int notification_id; + + /** + * An NI type used to distinguish different categories of NI + * events, such as GPS_NI_TYPE_VOICE, GPS_NI_TYPE_UMTS_SUPL, ... + */ + GpsNiType ni_type; + + /** + * Notification/verification options, combinations of GpsNiNotifyFlags constants + */ + GpsNiNotifyFlags notify_flags; + + /** + * Timeout period to wait for user response. + * Set to 0 for no time out limit. + */ + int timeout; + + /** + * Default response when time out. + */ + GpsUserResponseType default_response; + + /** + * Requestor ID + */ + char requestor_id[GPS_NI_SHORT_STRING_MAXLEN]; + + /** + * Notification message. It can also be used to store client_id in some cases + */ + char text[GPS_NI_LONG_STRING_MAXLEN]; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType requestor_id_encoding; + + /** + * Client name decoding scheme + */ + GpsNiEncodingType text_encoding; + + /** + * A pointer to extra data. Format: + * key_1 = value_1 + * key_2 = value_2 + */ + char extras[GPS_NI_LONG_STRING_MAXLEN]; + +} GpsNiNotification; + +/** Callback with NI notification. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (*gps_ni_notify_callback)(GpsNiNotification *notification); + +/** GPS NI callback structure. */ +typedef struct +{ + /** + * Sends the notification request from HAL to GPSLocationProvider. + */ + gps_ni_notify_callback notify_cb; + gps_create_thread create_thread_cb; +} GpsNiCallbacks; + +/** + * Extended interface for Network-initiated (NI) support. + */ +typedef struct +{ + /** set to sizeof(GpsNiInterface) */ + size_t size; + + /** Registers the callbacks for HAL to use. */ + void (*init) (GpsNiCallbacks *callbacks); + + /** Sends a response to HAL. */ + void (*respond) (int notif_id, GpsUserResponseType user_response); +} GpsNiInterface; + +struct gps_device_t { + struct hw_device_t common; + + /** + * Set the provided lights to the provided values. + * + * Returns: 0 on succes, error code on failure. + */ + const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev); +}; + +#define AGPS_RIL_REQUEST_SETID_IMSI (1<<0L) +#define AGPS_RIL_REQUEST_SETID_MSISDN (1<<1L) + +#define AGPS_RIL_REQUEST_REFLOC_CELLID (1<<0L) +#define AGPS_RIL_REQUEST_REFLOC_MAC (1<<1L) + +typedef void (*agps_ril_request_set_id)(uint32_t flags); +typedef void (*agps_ril_request_ref_loc)(uint32_t flags); + +typedef struct { + agps_ril_request_set_id request_setid; + agps_ril_request_ref_loc request_refloc; + gps_create_thread create_thread_cb; +} AGpsRilCallbacks; + +/** Extended interface for AGPS_RIL support. */ +typedef struct { + /** set to sizeof(AGpsRilInterface) */ + size_t size; + /** + * Opens the AGPS interface and provides the callback routines + * to the implementation of this interface. + */ + void (*init)( AGpsRilCallbacks* callbacks ); + + /** + * Sets the reference location. + */ + void (*set_ref_location) (const AGpsRefLocation *agps_reflocation, size_t sz_struct); + /** + * Sets the set ID. + */ + void (*set_set_id) (AGpsSetIDType type, const char* setid); + + /** + * Send network initiated message. + */ + void (*ni_message) (uint8_t *msg, size_t len); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_state) (int connected, int type, int roaming, const char* extra_info); + + /** + * Notify GPS of network status changes. + * These parameters match values in the android.net.NetworkInfo class. + */ + void (*update_network_availability) (int avaiable, const char* apn); +} AGpsRilInterface; + +/** + * GPS Geofence. + * There are 3 states associated with a Geofence: Inside, Outside, Unknown. + * There are 3 transitions: ENTERED, EXITED, UNCERTAIN. + * + * An example state diagram with confidence level: 95% and Unknown time limit + * set as 30 secs is shown below. (confidence level and Unknown time limit are + * explained latter) + * ____________________________ + * | Unknown (30 secs) | + * """""""""""""""""""""""""""" + * ^ | | ^ + * UNCERTAIN| |ENTERED EXITED| |UNCERTAIN + * | v v | + * ________ EXITED _________ + * | Inside | -----------> | Outside | + * | | <----------- | | + * """""""" ENTERED """"""""" + * + * Inside state: We are 95% confident that the user is inside the geofence. + * Outside state: We are 95% confident that the user is outside the geofence + * Unknown state: Rest of the time. + * + * The Unknown state is better explained with an example: + * + * __________ + * | c| + * | ___ | _______ + * | |a| | | b | + * | """ | """"""" + * | | + * """""""""" + * In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy + * circle reported by the GPS subsystem. Now with regard to "b", the system is + * confident that the user is outside. But with regard to "a" is not confident + * whether it is inside or outside the geofence. If the accuracy remains the + * same for a sufficient period of time, the UNCERTAIN transition would be + * triggered with the state set to Unknown. If the accuracy improves later, an + * appropriate transition should be triggered. This "sufficient period of time" + * is defined by the parameter in the add_geofence_area API. + * In other words, Unknown state can be interpreted as a state in which the + * GPS subsystem isn't confident enough that the user is either inside or + * outside the Geofence. It moves to Unknown state only after the expiry of the + * timeout. + * + * The geofence callback needs to be triggered for the ENTERED and EXITED + * transitions, when the GPS system is confident that the user has entered + * (Inside state) or exited (Outside state) the Geofence. An implementation + * which uses a value of 95% as the confidence is recommended. The callback + * should be triggered only for the transitions requested by the + * add_geofence_area call. + * + * Even though the diagram and explanation talks about states and transitions, + * the callee is only interested in the transistions. The states are mentioned + * here for illustrative purposes. + * + * Startup Scenario: When the device boots up, if an application adds geofences, + * and then we get an accurate GPS location fix, it needs to trigger the + * appropriate (ENTERED or EXITED) transition for every Geofence it knows about. + * By default, all the Geofences will be in the Unknown state. + * + * When the GPS system is unavailable, gps_geofence_status_callback should be + * called to inform the upper layers of the same. Similarly, when it becomes + * available the callback should be called. This is a global state while the + * UNKNOWN transition described above is per geofence. + * + * An important aspect to note is that users of this API (framework), will use + * other subsystems like wifi, sensors, cell to handle Unknown case and + * hopefully provide a definitive state transition to the third party + * application. GPS Geofence will just be a signal indicating what the GPS + * subsystem knows about the Geofence. + * + */ +#define GPS_GEOFENCE_ENTERED (1<<0L) +#define GPS_GEOFENCE_EXITED (1<<1L) +#define GPS_GEOFENCE_UNCERTAIN (1<<2L) + +#define GPS_GEOFENCE_UNAVAILABLE (1<<0L) +#define GPS_GEOFENCE_AVAILABLE (1<<1L) + +#define GPS_GEOFENCE_OPERATION_SUCCESS 0 +#define GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES -100 +#define GPS_GEOFENCE_ERROR_ID_EXISTS -101 +#define GPS_GEOFENCE_ERROR_ID_UNKNOWN -102 +#define GPS_GEOFENCE_ERROR_INVALID_TRANSITION -103 +#define GPS_GEOFENCE_ERROR_GENERIC -149 + +/** + * The callback associated with the geofence. + * Parameters: + * geofence_id - The id associated with the add_geofence_area. + * location - The current GPS location. + * transition - Can be one of GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED, + * GPS_GEOFENCE_UNCERTAIN. + * timestamp - Timestamp when the transition was detected. + * + * The callback should only be called when the caller is interested in that + * particular transition. For instance, if the caller is interested only in + * ENTERED transition, then the callback should NOT be called with the EXITED + * transition. + * + * IMPORTANT: If a transition is triggered resulting in this callback, the GPS + * subsystem will wake up the application processor, if its in suspend state. + */ +typedef void (*gps_geofence_transition_callback) (int32_t geofence_id, GpsLocation* location, + int32_t transition, GpsUtcTime timestamp); + +/** + * The callback associated with the availability of the GPS system for geofencing + * monitoring. If the GPS system determines that it cannot monitor geofences + * because of lack of reliability or unavailability of the GPS signals, it will + * call this callback with GPS_GEOFENCE_UNAVAILABLE parameter. + * + * Parameters: + * status - GPS_GEOFENCE_UNAVAILABLE or GPS_GEOFENCE_AVAILABLE. + * last_location - Last known location. + */ +typedef void (*gps_geofence_status_callback) (int32_t status, GpsLocation* last_location); + +/** + * The callback associated with the add_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_TOO_MANY_GEOFENCES - geofence limit has been reached. + * GPS_GEOFENCE_ERROR_ID_EXISTS - geofence with id already exists + * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - the monitorTransition contains an + * invalid transition + * GPS_GEOFENCE_ERROR_GENERIC - for other errors. + */ +typedef void (*gps_geofence_add_callback) (int32_t geofence_id, int32_t status); + +/** + * The callback associated with the remove_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_remove_callback) (int32_t geofence_id, int32_t status); + + +/** + * The callback associated with the pause_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_INVALID_TRANSITION - + * when monitor_transitions is invalid + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_pause_callback) (int32_t geofence_id, int32_t status); + +/** + * The callback associated with the resume_geofence call. + * + * Parameter: + * geofence_id - Id of the geofence. + * status - GPS_GEOFENCE_OPERATION_SUCCESS + * GPS_GEOFENCE_ERROR_ID_UNKNOWN - for invalid id + * GPS_GEOFENCE_ERROR_GENERIC for others. + */ +typedef void (*gps_geofence_resume_callback) (int32_t geofence_id, int32_t status); + +typedef struct { + gps_geofence_transition_callback geofence_transition_callback; + gps_geofence_status_callback geofence_status_callback; + gps_geofence_add_callback geofence_add_callback; + gps_geofence_remove_callback geofence_remove_callback; + gps_geofence_pause_callback geofence_pause_callback; + gps_geofence_resume_callback geofence_resume_callback; + gps_create_thread create_thread_cb; +} GpsGeofenceCallbacks; + +/** Extended interface for GPS_Geofencing support */ +typedef struct { + /** set to sizeof(GpsGeofencingInterface) */ + size_t size; + + /** + * Opens the geofence interface and provides the callback routines + * to the implementation of this interface. + */ + void (*init)( GpsGeofenceCallbacks* callbacks ); + + /** + * Add a geofence area. This api currently supports circular geofences. + * Parameters: + * geofence_id - The id for the geofence. If a geofence with this id + * already exists, an error value (GPS_GEOFENCE_ERROR_ID_EXISTS) + * should be returned. + * latitude, longtitude, radius_meters - The lat, long and radius + * (in meters) for the geofence + * last_transition - The current state of the geofence. For example, if + * the system already knows that the user is inside the geofence, + * this will be set to GPS_GEOFENCE_ENTERED. In most cases, it + * will be GPS_GEOFENCE_UNCERTAIN. + * monitor_transition - Which transitions to monitor. Bitwise OR of + * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and + * GPS_GEOFENCE_UNCERTAIN. + * notification_responsiveness_ms - Defines the best-effort description + * of how soon should the callback be called when the transition + * associated with the Geofence is triggered. For instance, if set + * to 1000 millseconds with GPS_GEOFENCE_ENTERED, the callback + * should be called 1000 milliseconds within entering the geofence. + * This parameter is defined in milliseconds. + * NOTE: This is not to be confused with the rate that the GPS is + * polled at. It is acceptable to dynamically vary the rate of + * sampling the GPS for power-saving reasons; thus the rate of + * sampling may be faster or slower than this. + * unknown_timer_ms - The time limit after which the UNCERTAIN transition + * should be triggered. This parameter is defined in milliseconds. + * See above for a detailed explanation. + */ + void (*add_geofence_area) (int32_t geofence_id, double latitude, double longitude, + double radius_meters, int last_transition, int monitor_transitions, + int notification_responsiveness_ms, int unknown_timer_ms); + + /** + * Pause monitoring a particular geofence. + * Parameters: + * geofence_id - The id for the geofence. + */ + void (*pause_geofence) (int32_t geofence_id); + + /** + * Resume monitoring a particular geofence. + * Parameters: + * geofence_id - The id for the geofence. + * monitor_transitions - Which transitions to monitor. Bitwise OR of + * GPS_GEOFENCE_ENTERED, GPS_GEOFENCE_EXITED and + * GPS_GEOFENCE_UNCERTAIN. + * This supersedes the value associated provided in the + * add_geofence_area call. + */ + void (*resume_geofence) (int32_t geofence_id, int monitor_transitions); + + /** + * Remove a geofence area. After the function returns, no notifications + * should be sent. + * Parameter: + * geofence_id - The id for the geofence. + */ + void (*remove_geofence_area) (int32_t geofence_id); +} GpsGeofencingInterface; + + +/** + * Represents an estimate of the GPS clock time. + */ +typedef struct { + /** set to sizeof(GpsClock) */ + size_t size; + + /** A set of flags indicating the validity of the fields in this data structure. */ + GpsClockFlags flags; + + /** + * Leap second data. + * The sign of the value is defined by the following equation: + * utc_time_ns = time_ns + (full_bias_ns + bias_ns) - leap_second * 1,000,000,000 + * + * If the data is available 'flags' must contain GPS_CLOCK_HAS_LEAP_SECOND. + */ + int16_t leap_second; + + /** + * Indicates the type of time reported by the 'time_ns' field. + * This is a Mandatory field. + */ + GpsClockType type; + + /** + * The GPS receiver internal clock value. This can be either the local hardware clock value + * (GPS_CLOCK_TYPE_LOCAL_HW_TIME), or the current GPS time derived inside GPS receiver + * (GPS_CLOCK_TYPE_GPS_TIME). The field 'type' defines the time reported. + * + * For local hardware clock, this value is expected to be monotonically increasing during + * the reporting session. The real GPS time can be derived by compensating the 'full bias' + * (when it is available) from this value. + * + * For GPS time, this value is expected to be the best estimation of current GPS time that GPS + * receiver can achieve. Set the 'time uncertainty' appropriately when GPS time is specified. + * + * Sub-nanosecond accuracy can be provided by means of the 'bias' field. + * The value contains the 'time uncertainty' in it. + * + * This is a Mandatory field. + */ + int64_t time_ns; + + /** + * 1-Sigma uncertainty associated with the clock's time in nanoseconds. + * The uncertainty is represented as an absolute (single sided) value. + * + * This value should be set if GPS_CLOCK_TYPE_GPS_TIME is set. + * If the data is available 'flags' must contain GPS_CLOCK_HAS_TIME_UNCERTAINTY. + */ + double time_uncertainty_ns; + + /** + * The difference between hardware clock ('time' field) inside GPS receiver and the true GPS + * time since 0000Z, January 6, 1980, in nanoseconds. + * This value is used if and only if GPS_CLOCK_TYPE_LOCAL_HW_TIME is set, and GPS receiver + * has solved the clock for GPS time. + * The caller is responsible for using the 'bias uncertainty' field for quality check. + * + * The sign of the value is defined by the following equation: + * true time (GPS time) = time_ns + (full_bias_ns + bias_ns) + * + * This value contains the 'bias uncertainty' in it. + * If the data is available 'flags' must contain GPS_CLOCK_HAS_FULL_BIAS. + + */ + int64_t full_bias_ns; + + /** + * Sub-nanosecond bias. + * The value contains the 'bias uncertainty' in it. + * + * If the data is available 'flags' must contain GPS_CLOCK_HAS_BIAS. + */ + double bias_ns; + + /** + * 1-Sigma uncertainty associated with the clock's bias in nanoseconds. + * The uncertainty is represented as an absolute (single sided) value. + * + * If the data is available 'flags' must contain GPS_CLOCK_HAS_BIAS_UNCERTAINTY. + */ + double bias_uncertainty_ns; + + /** + * The clock's drift in nanoseconds (per second). + * A positive value means that the frequency is higher than the nominal frequency. + * + * The value contains the 'drift uncertainty' in it. + * If the data is available 'flags' must contain GPS_CLOCK_HAS_DRIFT. + */ + double drift_nsps; + + /** + * 1-Sigma uncertainty associated with the clock's drift in nanoseconds (per second). + * The uncertainty is represented as an absolute (single sided) value. + * + * If the data is available 'flags' must contain GPS_CLOCK_HAS_DRIFT_UNCERTAINTY. + */ + double drift_uncertainty_nsps; +} GpsClock; + +/** + * Represents a GPS Measurement, it contains raw and computed information. + */ +typedef struct { + /** set to sizeof(GpsMeasurement) */ + size_t size; + + /** A set of flags indicating the validity of the fields in this data structure. */ + GpsMeasurementFlags flags; + + /** + * Pseudo-random number in the range of [1, 32] + * This is a Mandatory value. + */ + int8_t prn; + + /** + * Time offset at which the measurement was taken in nanoseconds. + * The reference receiver's time is specified by GpsData::clock::time_ns and should be + * interpreted in the same way as indicated by GpsClock::type. + * + * The sign of time_offset_ns is given by the following equation: + * measurement time = GpsClock::time_ns + time_offset_ns + * + * It provides an individual time-stamp for the measurement, and allows sub-nanosecond accuracy. + * This is a Mandatory value. + */ + double time_offset_ns; + + /** + * Per satellite sync state. It represents the current sync state for the associated satellite. + * Based on the sync state, the 'received GPS tow' field should be interpreted accordingly. + * + * This is a Mandatory value. + */ + GpsMeasurementState state; + + /** + * Received GPS Time-of-Week at the measurement time, in nanoseconds. + * The value is relative to the beginning of the current GPS week. + * + * Given the highest sync state that can be achieved, per each satellite, valid range for + * this field can be: + * Searching : [ 0 ] : GPS_MEASUREMENT_STATE_UNKNOWN + * C/A code lock : [ 0 1ms ] : GPS_MEASUREMENT_STATE_CODE_LOCK is set + * Bit sync : [ 0 20ms ] : GPS_MEASUREMENT_STATE_BIT_SYNC is set + * Subframe sync : [ 0 6s ] : GPS_MEASUREMENT_STATE_SUBFRAME_SYNC is set + * TOW decoded : [ 0 1week ] : GPS_MEASUREMENT_STATE_TOW_DECODED is set + * + * However, if there is any ambiguity in integer millisecond, + * GPS_MEASUREMENT_STATE_MSEC_AMBIGUOUS should be set accordingly, in the 'state' field. + */ + int64_t received_gps_tow_ns; + + /** + * 1-Sigma uncertainty of the Received GPS Time-of-Week in nanoseconds. + */ + int64_t received_gps_tow_uncertainty_ns; + + /** + * Carrier-to-noise density in dB-Hz, in the range [0, 63]. + * It contains the measured C/N0 value for the signal at the antenna input. + * + * This is a Mandatory value. + */ + double c_n0_dbhz; + + /** + * Pseudorange rate at the timestamp in m/s. + * The value also includes the effects of the receiver clock frequency and satellite clock + * frequency errors. + * + * The value includes the 'pseudorange rate uncertainty' in it. + * A positive value indicates that the pseudorange is getting larger. + * + * This is a Mandatory value. + */ + double pseudorange_rate_mps; + + /** + * 1-Sigma uncertainty of the pseudurange rate in m/s. + * The uncertainty is represented as an absolute (single sided) value. + * + * This is a Mandatory value. + */ + double pseudorange_rate_uncertainty_mps; + + /** + * Accumulated delta range's state. It indicates whether ADR is reset or there is a cycle slip + * (indicating loss of lock). + * + * This is a Mandatory value. + */ + GpsAccumulatedDeltaRangeState accumulated_delta_range_state; + + /** + * Accumulated delta range since the last channel reset in meters. + * The data is available if 'accumulated delta range state' != GPS_ADR_STATE_UNKNOWN. + */ + double accumulated_delta_range_m; + + /** + * 1-Sigma uncertainty of the accumulated delta range in meters. + * The data is available if 'accumulated delta range state' != GPS_ADR_STATE_UNKNOWN. + */ + double accumulated_delta_range_uncertainty_m; + + /** + * Best derived Pseudorange by the chip-set, in meters. + * The value contains the 'pseudorange uncertainty' in it. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_PSEUDORANGE. + */ + double pseudorange_m; + + /** + * 1-Sigma uncertainty of the pseudorange in meters. + * The value contains the 'pseudorange' and 'clock' uncertainty in it. + * The uncertainty is represented as an absolute (single sided) value. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_PSEUDORANGE_UNCERTAINTY. + */ + double pseudorange_uncertainty_m; + + /** + * A fraction of the current C/A code cycle, in the range [0.0, 1023.0] + * This value contains the time (in Chip units) since the last C/A code cycle (GPS Msec epoch). + * + * The reference frequency is given by the field 'carrier_frequency_hz'. + * The value contains the 'code-phase uncertainty' in it. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CODE_PHASE. + */ + double code_phase_chips; + + /** + * 1-Sigma uncertainty of the code-phase, in a fraction of chips. + * The uncertainty is represented as an absolute (single sided) value. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CODE_PHASE_UNCERTAINTY. + */ + double code_phase_uncertainty_chips; + + /** + * Carrier frequency at which codes and messages are modulated, it can be L1 or L2. + * If the field is not set, the carrier frequency is assumed to be L1. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CARRIER_FREQUENCY. + */ + float carrier_frequency_hz; + + /** + * The number of full carrier cycles between the satellite and the receiver. + * The reference frequency is given by the field 'carrier_frequency_hz'. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CARRIER_CYCLES. + */ + int64_t carrier_cycles; + + /** + * The RF phase detected by the receiver, in the range [0.0, 1.0]. + * This is usually the fractional part of the complete carrier phase measurement. + * + * The reference frequency is given by the field 'carrier_frequency_hz'. + * The value contains the 'carrier-phase uncertainty' in it. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CARRIER_PHASE. + */ + double carrier_phase; + + /** + * 1-Sigma uncertainty of the carrier-phase. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_CARRIER_PHASE_UNCERTAINTY. + */ + double carrier_phase_uncertainty; + + /** + * An enumeration that indicates the 'loss of lock' state of the event. + */ + GpsLossOfLock loss_of_lock; + + /** + * The number of GPS bits transmitted since Sat-Sun midnight (GPS week). + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_BIT_NUMBER. + */ + int32_t bit_number; + + /** + * The elapsed time since the last received bit in milliseconds, in the range [0, 20] + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_TIME_FROM_LAST_BIT. + */ + int16_t time_from_last_bit_ms; + + /** + * Doppler shift in Hz. + * A positive value indicates that the SV is moving toward the receiver. + * + * The reference frequency is given by the field 'carrier_frequency_hz'. + * The value contains the 'doppler shift uncertainty' in it. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_DOPPLER_SHIFT. + */ + double doppler_shift_hz; + + /** + * 1-Sigma uncertainty of the doppler shift in Hz. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_DOPPLER_SHIFT_UNCERTAINTY. + */ + double doppler_shift_uncertainty_hz; + + /** + * An enumeration that indicates the 'multipath' state of the event. + */ + GpsMultipathIndicator multipath_indicator; + + /** + * Signal-to-noise ratio in dB. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_SNR. + */ + double snr_db; + + /** + * Elevation in degrees, the valid range is [-90, 90]. + * The value contains the 'elevation uncertainty' in it. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_ELEVATION. + */ + double elevation_deg; + + /** + * 1-Sigma uncertainty of the elevation in degrees, the valid range is [0, 90]. + * The uncertainty is represented as the absolute (single sided) value. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_ELEVATION_UNCERTAINTY. + */ + double elevation_uncertainty_deg; + + /** + * Azimuth in degrees, in the range [0, 360). + * The value contains the 'azimuth uncertainty' in it. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_AZIMUTH. + * */ + double azimuth_deg; + + /** + * 1-Sigma uncertainty of the azimuth in degrees, the valid range is [0, 180]. + * The uncertainty is represented as an absolute (single sided) value. + * + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_AZIMUTH_UNCERTAINTY. + */ + double azimuth_uncertainty_deg; + + /** + * Whether the GPS represented by the measurement was used for computing the most recent fix. + * If the data is available, 'flags' must contain GPS_MEASUREMENT_HAS_USED_IN_FIX. + */ + bool used_in_fix; +} GpsMeasurement; + +/** Represents a reading of GPS measurements. */ +typedef struct { + /** set to sizeof(GpsData) */ + size_t size; + + /** Number of measurements. */ + size_t measurement_count; + + /** The array of measurements. */ + GpsMeasurement measurements[GPS_MAX_MEASUREMENT]; + + /** The GPS clock time reading. */ + GpsClock clock; +} GpsData; + +/** + * The callback for to report measurements from the HAL. + * + * Parameters: + * data - A data structure containing the measurements. + */ +typedef void (*gps_measurement_callback) (GpsData* data); + +typedef struct { + /** set to sizeof(GpsMeasurementCallbacks) */ + size_t size; + gps_measurement_callback measurement_callback; +} GpsMeasurementCallbacks; + +#define GPS_MEASUREMENT_OPERATION_SUCCESS 0 +#define GPS_MEASUREMENT_ERROR_ALREADY_INIT -100 +#define GPS_MEASUREMENT_ERROR_GENERIC -101 + +/** + * Extended interface for GPS Measurements support. + */ +typedef struct { + /** Set to sizeof(GpsMeasurementInterface) */ + size_t size; + + /** + * Initializes the interface and registers the callback routines with the HAL. + * After a successful call to 'init' the HAL must begin to provide updates at its own phase. + * + * Status: + * GPS_MEASUREMENT_OPERATION_SUCCESS + * GPS_MEASUREMENT_ERROR_ALREADY_INIT - if a callback has already been registered without a + * corresponding call to 'close' + * GPS_MEASUREMENT_ERROR_GENERIC - if any other error occurred, it is expected that the HAL + * will not generate any updates upon returning this error code. + */ + int (*init) (GpsMeasurementCallbacks* callbacks); + + /** + * Stops updates from the HAL, and unregisters the callback routines. + * After a call to stop, the previously registered callbacks must be considered invalid by the + * HAL. + * If stop is invoked without a previous 'init', this function should perform no work. + */ + void (*close) (); + +} GpsMeasurementInterface; + + +/** Represents a GPS navigation message (or a fragment of it). */ +typedef struct { + /** set to sizeof(GpsNavigationMessage) */ + size_t size; + + /** + * Pseudo-random number in the range of [1, 32] + * This is a Mandatory value. + */ + int8_t prn; + + /** + * The type of message contained in the structure. + * This is a Mandatory value. + */ + GpsNavigationMessageType type; + + /** + * The status of the received navigation message. + * No need to send any navigation message that contains words with parity error and cannot be + * corrected. + */ + NavigationMessageStatus status; + + /** + * Message identifier. + * It provides an index so the complete Navigation Message can be assembled. i.e. fo L1 C/A + * subframe 4 and 5, this value corresponds to the 'frame id' of the navigation message. + * Subframe 1, 2, 3 does not contain a 'frame id' and this value can be set to -1. + */ + int16_t message_id; + + /** + * Sub-message identifier. + * If required by the message 'type', this value contains a sub-index within the current + * message (or frame) that is being transmitted. + * i.e. for L1 C/A the submessage id corresponds to the sub-frame id of the navigation message. + */ + int16_t submessage_id; + + /** + * The length of the data (in bytes) contained in the current message. + * If this value is different from zero, 'data' must point to an array of the same size. + * e.g. for L1 C/A the size of the sub-frame will be 40 bytes (10 words, 30 bits/word). + * + * This is a Mandatory value. + */ + size_t data_length; + + /** + * The data of the reported GPS message. + * The bytes (or words) specified using big endian format (MSB first). + * + * For L1 C/A, each subframe contains 10 30-bit GPS words. Each GPS word (30 bits) should be + * fitted into the last 30 bits in a 4-byte word (skip B31 and B32), with MSB first. + */ + uint8_t* data; + +} GpsNavigationMessage; + +/** + * The callback to report an available fragment of a GPS navigation messages from the HAL. + * + * Parameters: + * message - The GPS navigation submessage/subframe representation. + */ +typedef void (*gps_navigation_message_callback) (GpsNavigationMessage* message); + +typedef struct { + /** set to sizeof(GpsNavigationMessageCallbacks) */ + size_t size; + gps_navigation_message_callback navigation_message_callback; +} GpsNavigationMessageCallbacks; + +#define GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS 0 +#define GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT -100 +#define GPS_NAVIGATION_MESSAGE_ERROR_GENERIC -101 + +/** + * Extended interface for GPS navigation message reporting support. + */ +typedef struct { + /** Set to sizeof(GpsNavigationMessageInterface) */ + size_t size; + + /** + * Initializes the interface and registers the callback routines with the HAL. + * After a successful call to 'init' the HAL must begin to provide updates as they become + * available. + * + * Status: + * GPS_NAVIGATION_MESSAGE_OPERATION_SUCCESS + * GPS_NAVIGATION_MESSAGE_ERROR_ALREADY_INIT - if a callback has already been registered + * without a corresponding call to 'close'. + * GPS_NAVIGATION_MESSAGE_ERROR_GENERIC - if any other error occurred, it is expected that + * the HAL will not generate any updates upon returning this error code. + */ + int (*init) (GpsNavigationMessageCallbacks* callbacks); + + /** + * Stops updates from the HAL, and unregisters the callback routines. + * After a call to stop, the previously registered callbacks must be considered invalid by the + * HAL. + * If stop is invoked without a previous 'init', this function should perform no work. + */ + void (*close) (); + +} GpsNavigationMessageInterface; + +/** + * Interface for passing GNSS configuration contents from platform to HAL. + */ +typedef struct { + /** Set to sizeof(GnssConfigurationInterface) */ + size_t size; + + /** + * Deliver GNSS configuration contents to HAL. + * Parameters: + * config_data - a pointer to a char array which holds what usually is expected from + file(/etc/gps.conf), i.e., a sequence of UTF8 strings separated by '\n'. + * length - total number of UTF8 characters in configuraiton data. + * + * IMPORTANT: + * GPS HAL should expect this function can be called multiple times. And it may be + * called even when GpsLocationProvider is already constructed and enabled. GPS HAL + * should maintain the existing requests for various callback regardless the change + * in configuration data. + */ + void (*configuration_update) (const char* config_data, int32_t length); +} GnssConfigurationInterface; + +__END_DECLS + +#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ diff --git a/keylayouts/bcm_headset.kl b/keylayouts/bcm_headset.kl new file mode 100644 index 0000000..e344086 --- /dev/null +++ b/keylayouts/bcm_headset.kl @@ -0,0 +1,3 @@ +key 226 HEADSETHOOK +key 115 VOLUME_UP +key 114 VOLUME_DOWN diff --git a/keylayouts/bcm_keypad_v2.kl b/keylayouts/bcm_keypad_v2.kl new file mode 100644 index 0000000..735077a --- /dev/null +++ b/keylayouts/bcm_keypad_v2.kl @@ -0,0 +1,85 @@ +key 399 GRAVE +key 2 1 +key 3 2 +key 4 3 +key 5 4 +key 6 5 +key 7 6 +key 8 7 +key 9 8 +key 10 9 +key 11 0 +key 158 BACK +key 139 MENU +key 127 SEARCH +key 217 RECENTAPPS +key 228 POUND +key 227 STAR +key 352 DPAD_CENTER +key 108 DPAD_DOWN +key 103 DPAD_UP +key 102 HOME +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 115 VOLUME_UP +key 114 VOLUME_DOWN +key 116 POWER +key 212 CAMERA + +key 16 Q +key 17 W +key 18 E +key 19 R +key 20 T +key 21 Y +key 22 U +key 23 I +key 24 O +key 25 P +key 26 LEFT_BRACKET +key 27 RIGHT_BRACKET +key 43 BACKSLASH + +key 30 A +key 31 S +key 32 D +key 33 F +key 34 G +key 35 H +key 36 J +key 37 K +key 38 L +key 39 SEMICOLON +key 40 APOSTROPHE +key 14 DEL + +key 44 Z +key 45 X +key 46 C +key 47 V +key 48 B +key 49 N +key 50 M +key 51 COMMA +key 52 PERIOD +key 53 SLASH +key 28 ENTER + +key 56 ALT_LEFT +key 100 ALT_RIGHT +key 42 SHIFT_LEFT +key 54 SHIFT_RIGHT +key 15 TAB +key 57 SPACE +key 150 EXPLORER +key 155 CUST2 +key 442 CHATON +key 373 SYM +key 12 MINUS +key 13 EQUALS +key 215 AT +key 207 MUSIC + +# On an AT keyboard: ESC, F10 +key 1 BACK +key 68 MENU diff --git a/keylayouts/gpio-keys.kl b/keylayouts/gpio-keys.kl new file mode 100644 index 0000000..58da020 --- /dev/null +++ b/keylayouts/gpio-keys.kl @@ -0,0 +1,9 @@ +key 115 VOLUME_UP +key 114 VOLUME_DOWN +key 116 POWER +key 102 HOME +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 103 DPAD_UP +key 108 DPAD_DOWN +key 232 DPAD_CENTER diff --git a/keylayouts/samsung-keypad.kl b/keylayouts/samsung-keypad.kl new file mode 100644 index 0000000..8428176 --- /dev/null +++ b/keylayouts/samsung-keypad.kl @@ -0,0 +1,91 @@ +key 399 GRAVE +key 2 1 +key 3 2 +key 4 3 +key 5 4 +key 6 5 +key 7 6 +key 8 7 +key 9 8 +key 10 9 +key 11 0 +key 158 BACK +key 230 SOFT_RIGHT +key 60 SOFT_RIGHT +key 107 ENDCALL +key 62 ENDCALL +key 229 MENU +key 139 MENU +key 59 MENU +key 127 SEARCH +key 217 SEARCH +key 228 POUND +key 227 STAR +key 231 CALL +key 61 CALL +key 232 DPAD_CENTER +key 108 DPAD_DOWN +key 103 DPAD_UP +key 102 HOME +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 115 VOLUME_UP +key 114 VOLUME_DOWN +key 116 POWER +key 212 CAMERA + +key 16 Q +key 17 W +key 18 E +key 19 R +key 20 T +key 21 Y +key 22 U +key 23 I +key 24 O +key 25 P +key 26 LEFT_BRACKET +key 27 RIGHT_BRACKET +key 43 BACKSLASH + +key 30 A +key 31 S +key 32 D +key 33 F +key 34 G +key 35 H +key 36 J +key 37 K +key 38 L +key 39 SEMICOLON +key 40 APOSTROPHE +key 14 DEL + +key 44 Z +key 45 X +key 46 C +key 47 V +key 48 B +key 49 N +key 50 M +key 51 COMMA +key 52 PERIOD +key 53 SLASH +key 28 ENTER + +key 56 ALT_LEFT +key 100 ALT_RIGHT +key 42 SHIFT_LEFT +key 54 SHIFT_RIGHT +key 15 TAB +key 57 SPACE +key 150 EXPLORER +key 155 ENVELOPE + +key 12 MINUS +key 13 EQUALS +key 215 AT + +# On an AT keyboard: ESC, F10 +key 1 BACK +key 68 MENU diff --git a/overlay/frameworks/base/core/res/res/values/arrays.xml b/overlay/frameworks/base/core/res/res/values/arrays.xml new file mode 100644 index 0000000..e13493a --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/arrays.xml @@ -0,0 +1,37 @@ + + + + + + + @string/reboot_reboot + @string/reboot_soft + @string/reboot_recovery + + + + + + soft_reboot + recovery + + + 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 100644 index 0000000..70971a3 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,262 @@ + + + + + + + true + + + true + + + false + + + true + + + 10 + + + + 9 + 30 + 100 + 325 + 1250 + 3500 + 10000 + 20000 + + + + + 18 + 30 + 59 + 74 + 92 + 118 + 155 + 222 + 255 + + + + + 255 + 255 + 255 + 255 + 255 + 255 + 255 + 255 + 255 + + + + + 255 + 255 + 255 + 255 + 255 + 255 + 255 + 255 + 255 + + + 0 + 1 + + + #ffffffff + + + 9000 + + + + + + + + + "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,4,60000,true" + "mobile_hipri,5,0,3,60000,true" + "mobile_bluetooth,7,7,1,-1,true" + + + + + "1,1" + "0,1" + "7,1" + + + + + "rndis0" + + + + + "wlan0" + + + + + "bt-pan" + + + + + + 0 + 1 + 5 + 7 + + + + 10 + + + + 30 + + + + + 1 + + + + true + + + rmnet0 + + + + true + + + false + + false + + + -12 + + + 1500 + + + true + + + 71 + + + 65 + + + true + + + 4 + + + true + + + true + diff --git a/overlay/frameworks/base/core/res/res/xml/power_profile.xml b/overlay/frameworks/base/core/res/res/xml/power_profile.xml new file mode 100644 index 0000000..a153c27 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/power_profile.xml @@ -0,0 +1,56 @@ + + + + + 0 + 49 + 142 + 0.3 + 35690 + 260 + 4 + 120 + 220 + 88 + 88 + 185 + 50 + 1500 + 88 + + 3.4 + 3.4 + + + 100000 + 200000 + 400000 + 800000 + 1000000 + + 1.4 + 44 + + 55.4 + 82.1 + 113.7 + 205.4 + 259.0 + + diff --git a/overlay/frameworks/base/core/res/res/xml/storage_list.xml b/overlay/frameworks/base/core/res/res/xml/storage_list.xml new file mode 100644 index 0000000..880434a --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/storage_list.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml new file mode 100644 index 0000000..cff1f56 --- /dev/null +++ b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml @@ -0,0 +1,30 @@ + + + + + + + true + + + true + + diff --git a/overlay/packages/apps/SamsungServiceMode/res/values/config.xml b/overlay/packages/apps/SamsungServiceMode/res/values/config.xml new file mode 100644 index 0000000..437a0c1 --- /dev/null +++ b/overlay/packages/apps/SamsungServiceMode/res/values/config.xml @@ -0,0 +1,18 @@ + + + + 2 + diff --git a/overlay/packages/apps/Settings/res/values/bools.xml b/overlay/packages/apps/Settings/res/values/bools.xml new file mode 100644 index 0000000..72d6cdf --- /dev/null +++ b/overlay/packages/apps/Settings/res/values/bools.xml @@ -0,0 +1,20 @@ + + + + + + false + diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml new file mode 100644 index 0000000..b9fa984 --- /dev/null +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/overlay/packages/services/Telephony/res/values/config.xml b/overlay/packages/services/Telephony/res/values/config.xml new file mode 100644 index 0000000..e500ff9 --- /dev/null +++ b/overlay/packages/services/Telephony/res/values/config.xml @@ -0,0 +1,23 @@ + + + + + + true + \ No newline at end of file diff --git a/ramdisk/charger b/ramdisk/charger new file mode 100644 index 0000000000000000000000000000000000000000..1d26480172329c2b2e8a40066785030f74d760cb GIT binary patch literal 268108 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

j0{2PW#qn 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

fY}(_+aZ>Zurekz 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 RAuPU`V=sE#I +/dev/block/platform/sdhci.1/by-name/system /system ext4 ro,noatime wait +/dev/block/platform/sdhci.1/by-name/efs /efs ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/platform/sdhci.1/by-name/CSC /cache ext4 noatime,nosuid,nodev,journal_async_commit,errors=panic wait,check +/dev/block/platform/sdhci.1/by-name/userdata /data ext4 noatime,nosuid,nodev,discard,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=footer,length=-16384 +/dev/block/platform/sdhci.1/by-name/KERNEL /boot emmc defaults defaults +/dev/block/platform/sdhci.1/by-name/RECOVERY /recovery emmc defaults defaults +/dev/block/platform/sdhci.1/by-name/modem /modem emmc defaults defaults + +# vold-managed volumes ("block device" is actually a sysfs devpath) +/devices/platform/sdhci.0/mmc_host/mmc2* auto auto defaults voldmanaged=sdcard1:auto,noemulatedsd +/devices/platform/sdhci.0/mmc_host/mmc2* auto auto defaults voldmanaged=sdcard2:auto,noemulatedsd + +# ZRam +#/dev/block/zram0 none swap defaults zramsize=52428800 \ No newline at end of file diff --git a/ramdisk/init.bcm2166x.usb.rc b/ramdisk/init.bcm2166x.usb.rc new file mode 100644 index 0000000..79ca6c9 --- /dev/null +++ b/ramdisk/init.bcm2166x.usb.rc @@ -0,0 +1,152 @@ +on init + write /sys/class/android_usb/android0/iSerial $ro.serialno + write /sys/class/android_usb/android0/f_rndis/manufacturer Samsung + write /sys/class/android_usb/android0/f_rndis/vendorID 04E8 + +on boot + write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer + write /sys/class/android_usb/android0/iProduct ${ro.product.model} + write /sys/class/udc/dwc_otg/soft_connect connect + +on property:sys.usb.config=mass_storage + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685B + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_mass_storage/lun0/file /dev/block/mmcblk1p1 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685E + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_mass_storage/lun0/file /dev/block/mmcblk1p1 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=acm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685D + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=acm,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 685D + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6865 + write /sys/class/android_usb/android0/bDeviceClass 0 + write /sys/class/android_usb/android0/bDeviceSubClass 0 + write /sys/class/android_usb/android0/bDeviceProtocol 0 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ptp,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6866 + write /sys/class/android_usb/android0/bDeviceClass 0 + write /sys/class/android_usb/android0/bDeviceSubClass 0 + write /sys/class/android_usb/android0/bDeviceProtocol 0 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/bDeviceClass EF + write /sys/class/android_usb/android0/bDeviceSubClass 02 + write /sys/class/android_usb/android0/bDeviceProtocol 01 + write /sys/class/android_usb/android0/functions mtp,acm + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/bDeviceClass EF + write /sys/class/android_usb/android0/bDeviceSubClass 02 + write /sys/class/android_usb/android0/bDeviceProtocol 01 + write /sys/class/android_usb/android0/functions mtp,acm,adb + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,acm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/bDeviceClass EF + write /sys/class/android_usb/android0/bDeviceSubClass 02 + write /sys/class/android_usb/android0/bDeviceProtocol 01 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,acm,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6860 + write /sys/class/android_usb/android0/bDeviceClass EF + write /sys/class/android_usb/android0/bDeviceSubClass 02 + write /sys/class/android_usb/android0/bDeviceProtocol 01 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/f_acm/instances 2 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6863 + write /sys/class/android_usb/android0/bDeviceClass 02 + write /sys/class/android_usb/android0/bDeviceSubClass 00 + write /sys/class/android_usb/android0/bDeviceProtocol 00 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct 6864 + write /sys/class/android_usb/android0/bDeviceClass 02 + write /sys/class/android_usb/android0/bDeviceSubClass 00 + write /sys/class/android_usb/android0/bDeviceProtocol 00 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04E8 + write /sys/class/android_usb/android0/idProduct e680 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} \ No newline at end of file diff --git a/ramdisk/init.hawaii_ss_kylepro.rc b/ramdisk/init.hawaii_ss_kylepro.rc new file mode 100644 index 0000000..ec06805 --- /dev/null +++ b/ramdisk/init.hawaii_ss_kylepro.rc @@ -0,0 +1,890 @@ +import init.bcm2166x.usb.rc +import init.log.rc + +on early-init + mkdir /efs 0771 radio system + +on init + # See storage config details at http://source.android.com/tech/storage/ + mkdir /mnt/shell/emulated 0700 shell shell + mkdir /storage/emulated 0555 root root + export EXTERNAL_STORAGE /storage/emulated/legacy + export EMULATED_STORAGE_SOURCE /mnt/shell/emulated + export EMULATED_STORAGE_TARGET /storage/emulated + # Support legacy paths + symlink /storage/emulated/legacy /sdcard + symlink /storage/emulated/legacy /mnt/sdcard + symlink /storage/emulated/legacy /storage/sdcard0 + symlink /mnt/shell/emulated/0 /storage/emulated/legacy + + mkdir /storage/sdcard1 0775 system system + export SECONDARY_STORAGE /storage/sdcard1 + mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw + mkdir /storage/sdcard1 0700 root root + + #mkdir /storage/usbdisk 0775 system system + #export SECONDARY_STORAGE /storage/usbdisk0 + #mkdir /mnt/media_rw/usbdisk0 0700 media_rw media_rw + #mkdir /storage/usbdisk0 0700 root root + + # for backwards compatibility + #symlink /storage/sdcard1 /external_sd + #symlink /storage/sdcard1 /mnt/external_sd + #symlink /storage/usbdisk /usbdisk + #symlink /storage/usbdisk /mnt/usbdisk + +# To store widevine keybox + symlink /data/app /factory + + symlink /efs /factory + + symlink /dev/block/mmcblk0p11 /dev/block/param + +on post-fs-data +# we will remap this as /storage/sdcard with the sdcard fuse tool + mkdir /data/media 0770 media_rw media_rw + chown media_rw media_rw /data/media + +# SA, System SW, SAMSUNG create log directory + mkdir /data/log 0775 system log + chown system log /data/log + setprop vold.post_fs_data_done 1 + + chmod 0777 /data/log + chmod 0777 /data/anr + + #for wifi + mkdir /efs/wifi 0775 radio system + mkdir /efs/bluetooth 0775 radio system + mkdir /efs/imei 0775 radio system + mkdir /data/misc/wifi 0775 wifi system + mkdir /data/misc/wifi/sockets 0770 wifi wifi + mkdir /data/misc/dhcp 0775 dhcp dhcp + mkdir /system/etc/wifi 0775 wifi wifi + chown system system /efs/wifi/.mac.info + chmod 0664 /efs/wifi/.mac.info + chown system system /efs/imei/.nvmac.info + chmod 0664 /efs/imei/.nvmac.info + + # permissions for bluetooth. + setprop ro.bt.bdaddr_path "/efs/bluetooth/bt_addr" + chown bluetooth net_bt_stack ro.bt.bdaddr_path + chown bluetooth net_bt_stack /dev/ttyS0 + chmod 0600 /dev/ttyS0 + chmod 0660 /sys/class/rfkill/rfkill0/state + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/state + chown bluetooth net_bt_stack /sys/class/rfkill/rfkill0/type + + # for TRP/TIS + write /data/.psm.info 1 + chown system root /data/.psm.info + chmod 0660 /data/.psm.info + +# for control LCD backlight +# chown system system /sys/class/backlight/hw-backlight/brightness +# chmod 0660 /sys/class/backlight/hw-backlight/brightness +# chown system system /sys/class/backlight/pwm-backlight/brightness +# chmod 0660 /sys/class/backlight/pwm-backlight/brightness + + chown system system /sys/class/backlight/panel/brightness + chmod 0660 /sys/class/backlight/panel/brightness + + chown system system /sys/class/backlight/keypad-led/brightness + chmod 0660 /sys/class/backlight/keypad-led/brightness + + chown system system /sys/class/backlight/touchkey-led/brightness + chmod 0660 /sys/class/backlight/touchkey-led/brightness + +## Permissions for mDNIe + chown system media_rw /sys/class/mdnie/mdnie/mode + chown system media_rw /sys/class/mdnie/mdnie/outdoor + chown system media_rw /sys/class/mdnie/mdnie/scenario + chown system system /sys/class/mdnie/mdnie/negative + chown system system /sys/class/mdnie/mdnie/cabc + +# permissions for sensors (accelerometer & magnetic & proximity) + chown system system /sys/class/input/input0/enable + chown system system /sys/class/input/input0/poll_delay + chmod 0660 /sys/class/input/input0/enable + chmod 0660 /sys/class/input/input0/poll_delay + + chown system system /sys/class/input/input1/raw_data + chown system system /sys/class/input/input1/value + chown system system /sys/class/input/input1/fast_calibration_x + chown system system /sys/class/input/input1/fast_calibration_y + chown system system /sys/class/input/input1/fast_calibration_z + chown system system /sys/class/input/input1/eeprom_writing + chown system system /sys/class/input/input1/mode + chown system system /sys/class/input/input1/enable + chown system system /sys/class/input/input1/offset_filt_x + chown system system /sys/class/input/input1/offset_filt_y + chown system system /sys/class/input/input1/offset_filt_z + chown system system /sys/class/input/input1/selftest + chown system system /sys/class/input/input1/delay + chown system system /sys/class/input/input1/update + chown system system /sys/class/input/input1/range + chown system system /sys/class/input/input1/bandwidth + + chmod 0660 /sys/class/input/input1/raw_data + chmod 0660 /sys/class/input/input1/value + chmod 0660 /sys/class/input/input1/fast_calibration_x + chmod 0660 /sys/class/input/input1/fast_calibration_y + chmod 0660 /sys/class/input/input1/fast_calibration_z + chmod 0660 /sys/class/input/input1/eeprom_writing + chmod 0660 /sys/class/input/input1/mode + chmod 0660 /sys/class/input/input1/enable + chmod 0660 /sys/class/input/input1/offset_filt_x + chmod 0660 /sys/class/input/input1/offset_filt_y + chmod 0660 /sys/class/input/input1/offset_filt_z + chmod 0660 /sys/class/input/input1/selftest + chmod 0660 /sys/class/input/input1/delay + chmod 0660 /sys/class/input/input1/update + chmod 0660 /sys/class/input/input1/range + chmod 0660 /sys/class/input/input1/bandwidth + + chown system system /sys/class/input/input2/chip_id + chown system system /sys/class/input/input2/raw_data + chown system system /sys/class/input/input2/op_mode + chown system system /sys/class/input/input2/selftest + chown system system /sys/class/input/input2/value + chown system system /sys/class/input/input2/enable + chown system system /sys/class/input/input2/delay + chown system system /sys/class/input/input2/rept_xy + chown system system /sys/class/input/input2/rept_z + chown system system /sys/class/input/input2/odr + + chmod 0660 /sys/class/input/input2/chip_id + chmod 0660 /sys/class/input/input2/raw_data + chmod 0660 /sys/class/input/input2/op_mode + chmod 0660 /sys/class/input/input2/selftest + chmod 0660 /sys/class/input/input2/value + chmod 0660 /sys/class/input/input2/enable + chmod 0660 /sys/class/input/input2/delay + chmod 0660 /sys/class/input/input2/rept_xy + chmod 0660 /sys/class/input/input2/rept_z + chmod 0660 /sys/class/input/input2/odr + +# for adb + chmod 0775 /system/etc/usbdev.sh + chmod 0775 /system/etc/startadb.sh + +on boot +# RTCC Interval + write /sys/module/lowmemorykiller/parameters/min_interval 500 + +# SISO-ANDR_PERF :: START Changing scheduler to noop during boot + write /sys/block/mmcblk0/queue/scheduler noop +# SISO-ANDR_PERF :: END + write /sys/fs/selinux/enforce 0 + + setprop ro.build.product hawaii + setprop ro.product.device hawaii + + chown system system /sys/devices/platform/panel/backlight/panel/brightness + mount debugfs /sys/kernel/debug /sys/kernel/debug + + +# WIFI + setprop wifi.interface wlan0 + + symlink /dev/block/mmcblk0p11 /dev/block/param + +# +# Accelerometer_sensor + chown system radio /dev/accelerometer + chown system radio /sys/class/sensors/accelerometer_sensor + chown system radio /sys/class/sensors/accelerometer_sensor/raw_data + chown system radio /sys/class/sensors/accelerometer_sensor/calibration + chown system radio /sys/class/sensors/accelerometer_sensor/reactive_alert + chown system radio /sys/class/sensors/accelerometer_sensor/vendor + chown system radio /sys/class/sensors/accelerometer_sensor/name + chown system radio /sys/class/sensors/accelerometer_sensor/selftest +# Proximity_sensor + chown system radio /sys/class/sensors/proximity_sensor/state + chown system radio /sys/class/sensors/proximity_sensor/prox_avg + chown system radio /sys/class/sensors/proximity_sensor/prox_cal + chown system radio /sys/class/sensors/proximity_sensor/prox_cal_open + chown system radio /sys/class/sensors/proximity_sensor/vendor + chown system radio /sys/class/sensors/proximity_sensor/name + chown system radio /sys/class/sensors/proximity_sensor/prox_thresh +# Magnetic_sensor + chown system radio /dev/akm8975 + chown system radio /sys/class/sensors/magnetic_sensor/raw_data + chown system radio /sys/class/sensors/magnetic_sensor/adc + chown system radio /sys/class/sensors/magnetic_sensor/dac + chown system radio /sys/class/sensors/magnetic_sensor/selftest + chown system radio /sys/class/sensors/magnetic_sensor/power_on + chown system radio /sys/class/sensors/magnetic_sensor/status + chown system radio /sys/class/sensors/magnetic_sensor/op_mode + chown system radio /sys/class/sensors/magnetic_sensor/chip_id + chmod 0660 /sys/class/sensors/magnetic_sensor/selftest + chmod 0660 /sys/class/sensors/magnetic_sensor/op_mode + +## Vibetonz +# chmod 0660 /dev/tspdrv +# chown root shell /dev/tspdrv + +# required so RIL can open kernel RPC drivers + chmod 0660 /dev/bcm_rpc + chmod 0660 /dev/bcm_irpc + chown radio radio /dev/bcm_rpc + chown radio radio /dev/bcm_irpc + + chmod 0660 /dev/bcm_atc + chown shell system /dev/bcm_atc + mkdir /data/atx + chown system system /data/atx + chmod 0771 /data/atx + chown system system /dev/bcm_log + chmod 0660 /dev/bcm_log + chown system system /dev/bcm_audio_log + chmod 0660 /dev/bcm_audio_log + chown system system /dev/ttyGS0 + chown system system /dev/ttyGS2 + chown system system /dev/ttyS2 + chmod 0666 /dev/ttyS2 + chmod 0644 /proc/cmdline + +# GPS UART + chown gps system /dev/ttyS1 + chmod 0770 /dev/ttyS1 + + chown system system /proc/bcm_fuse_net_config + +# Video Telephony + chmod 0666 /dev/bcm_vsp + + +# allow user space (atx) access to kernel pm debug + chown system system /sys/module/pm_dbg/parameters/debug + chmod 0660 /sys/module/pm_dbg/parameters/debug + chown system system /sys/module/bcmpmu59xxx_ponkey/parameters/simulate_ponkey + chmod 0660 /sys/module/bcmpmu59xxx_ponkey/parameters/simulate_ponkey + +# BEGIN BCM QUICK BOOT FEATURE + chown root system /sys/ponkey/ponkey_mode + chmod 0664 /sys/ponkey/ponkey_mode +# END BCM QUICK BOOT FEATURE + + +#security driver + chmod 0660 /dev/bcm_security + chown radio root /dev/bcm_security + mkdir /data/sec 0770 + chown radio root /data/sec + +# BCMPMU drivers + chown -R system system /sys/devices/platform/bcmpmu*/* + +# change owner of mtest system to allow atx/atxd to write this file: + chown system system /sys/kernel/sysrpc/mtest + +# GPIO DVS + chown radio system /sys/class/secgpio_check/secgpio_check_all/check_init_detail + chown radio system /sys/class/secgpio_check/secgpio_check_all/check_sleep_detail + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpio_sleep_debug + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpioinfo_check + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpioinit_check + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpiosleep_check + +# fake some battery state + setprop status.battery.state Slow + setprop status.battery.level 10 + setprop status.battery.level_raw 100 + setprop status.battery.level_scale 10 + + # Set permission for Widevine DRM temporarily + chmod 0777 /dev/s5p-smem + rm /data/app/tlcd_sock + +# phone + setprop ro.telephony.call_ring.multiple 0 + + +# Enable dithering algorithm + setprop fb.force.dithering 1 + +# permissions for gps. + mkdir /data/gps 0770 gps system + chown gps system /data/gps + chmod 0770 /data/gps + chown gps system /system/etc/gps/glconfig.xml + chmod 0660 /system/etc/gps/glconfig.xml + chown gps system /system/etc/gps + + chmod 0770 /system/etc/gps + chown gps system /system/bin/glgps + chmod 0770 /system/bin/glgps + + chown gps system /system/bin/gpslogd + chmod 0777 /system/bin/gpslogd + + write /sys/class/gpio/export 23 + chown gps system /sys/class/gpio/gpio23/value + chown gps system /sys/class/gpio/gpio23/direction + write /sys/class/gpio/gpio23/direction out + write /sys/class/gpio/gpio23/value 0 + + chmod 0660 /dev/bcm_gps + chown radio radio /dev/bcm_gps + +# SEC_PRODUCT_FEATURE_COMMON_USE_MULTISIM + setprop ro.multisim.simslotcount 1 + +# # for multi csc + chown radio radio /proc/LinuStoreIII/efs_info + chmod 0664 /proc/LinuStoreIII/efs_info +# # for protecting key string + chown radio radio /proc/LinuStoreIII/keystr + chmod 0664 /proc/LinuStoreIII/keystr +# # for ril_prop + chown radio radio /proc/LinuStoreIII/ril_prop + chmod 0664 /proc/LinuStoreIII/ril_prop +# # for fsbuild_check + chown radio radio /proc/LinuStoreIII/fsbuild_check + chmod 0664 /proc/LinuStoreIII/fsbuild_check +# # for recovery_opts + chown system radio /proc/LinuStoreIII/recovery_opts + chmod 0664 /proc/LinuStoreIII/recovery_opts + +# Audio (Earjack) + chown system radio /sys/class/audio/earjack/select_jack + chown system radio /sys/class/audio/earjack/key_state + chown system radio /sys/class/audio/earjack/state + chown media system /sys/class/audio/earjack/reselect_jack + +# Battery node + chown system radio /sys/class/power_supply/battery/batt_charging_source + chown system radio /sys/class/power_supply/battery/batt_error_test + chown system radio /sys/class/power_supply/battery/batt_lp_charging + chown system radio /sys/class/power_supply/battery/batt_read_adj_soc + chown system radio /sys/class/power_supply/battery/batt_read_raw_soc + chown system radio /sys/class/power_supply/battery/batt_reset_soc + chown system radio /sys/class/power_supply/battery/batt_slate_mode + chown system radio /sys/class/power_supply/battery/batt_temp_adc + chown system radio /sys/class/power_supply/battery/batt_temp_adc_aver + chown system radio /sys/class/power_supply/battery/batt_temp_adc_cal + chown system radio /sys/class/power_supply/battery/batt_temp_aver + chown system radio /sys/class/power_supply/battery/batt_type + chown system radio /sys/class/power_supply/battery/batt_vf_adc + chown system radio /sys/class/power_supply/battery/batt_vfocv + chown system radio /sys/class/power_supply/battery/batt_vol_adc + chown system radio /sys/class/power_supply/battery/batt_vol_adc_aver + chown system radio /sys/class/power_supply/battery/batt_vol_adc_cal + chown system radio /sys/class/power_supply/battery/batt_vol_aver + chown system radio /sys/class/power_supply/battery/factory_mode + chown system radio /sys/class/power_supply/battery/siop_activated + chown system radio /sys/class/power_supply/battery/siop_level + chown system radio /sys/class/power_supply/battery/update + chown system radio /sys/class/power_supply/battery/wc_status + chown system radio /sys/class/power_supply/battery/wpc_pin_state + chown system radio /sys/class/power_supply/fuelgauge/fg_curr_ua + +# CTIA event + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/call + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/video + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/music + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/browser + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/hotspot + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/camera + chown system radio /sys/class/power_supply/battery/talk_wcdma + chown system radio /sys/class/power_supply/battery/talk_gsm + chown system radio /sys/class/power_supply/battery/call + chown system radio /sys/class/power_supply/battery/data_call + chown gps radio /sys/class/power_supply/battery/gps + chown system radio /sys/class/power_supply/battery/wifi + chown system radio /sys/class/power_supply/battery/lte + +# Thermistor node + chown radio system /sys/devices/platform/sec-thermistor/temp_adc + chown radio system /sys/devices/platform/sec-thermistor/temperature + +# Permissions for touch + chown system radio /sys/class/sec/tsp/cmd + +# Permissions for Touchkey + chown system radio /sys/class/sec/sec_touchkey/enable_disable + chown system radio /sys/class/sec/sec_touchkey/touchkey_brightness + chown system radio /sys/class/sec/sec_touchkey/touchkey_menu + chown system radio /sys/class/sec/sec_touchkey/touchkey_back + chown system radio /sys/class/sec/sec_touchkey/touch_update + chown system radio /sys/class/sec/sec_touchkey/touch_version + chown system radio /sys/class/sec/sec_touchkey/touchkey_firm_version_panel + chown system radio /sys/class/sec/sec_touchkey/touchkey_firm_version_phone + chown system radio /sys/class/sec/sec_touchkey/touchkey_firm_update_status + chown system radio /sys/class/sec/sec_touchkey/touchkey_firm_update + chown system radio /sys/class/sec/sec_touchkey/touch_sensitivity + chown system radio /sys/class/sec/sec_touchkey/touchkey_threshold + chown system system /sys/devices/virtual/sec/sec_touchkey/brightness + +# Permissions for gpio_keys + chown radio system /sys/class/sec/sec_key/wakeup_keys + write /sys/class/sec/sec_key/wakeup_keys 116,172,544 + +# Accy + chown radio system /sys/devices/platform/bcmpmu_accy/jiglock + +# Permissions for Camera + chown system radio /sys/class/camera/rear/rear_camfw + chown system radio /sys/class/camera/rear/rear_camtype + chown system radio /sys/class/camera/rear/rear_flash + chown system radio /sys/class/camera/rear/isp_core + chown system radio /sys/class/camera/front/front_camfw + chown system radio /sys/class/camera/front/front_camtype + chown system radio /sys/class/flash/flash/flash_power + chown radio system /sys/devices/platform/samsung-pd.5/s3c-fimc.2/range_mode + chmod 0660 /sys/devices/platform/samsung-pd.5/s3c-fimc.2/range_mode + chmod 220 /sys/class/camera/rear/rear_camfw + chmod 220 /sys/class/camera/rear/rear_camtype + +# Switch Device + chown system system /sys/class/sec/switch/uart_sel + chown system system /sys/class/sec/switch/usb_sel + chown system system /sys/class/sec/switch/otg_test + chown system radio /sys/class/sec/switch/adc + +# Permissions for SVC LED + chown system system /sys/class/sec/led/led_pattern + chown system system /sys/class/sec/led/led_blink + chown system system /sys/class/sec/led/led_br_lev + chown system system /sys/class/sec/led/led_lowpower + +# Init Compcache taejin5.park + chmod 0664 /sys/class/lmk/lowmemorykiller/lmk_state + chown system system /sys/class/lmk/lowmemorykiller/lmk_state + chmod 0664 /sys/block/zram0/disksize + chown system system /sys/block/zram0/disksize + write /sys/block/zram0/disksize 104857600 + chmod 0664 /sys/block/zram0/initstate + chown system system /sys/block/zram0/initstate + write /sys/block/zram0/initstate 1 + +# serial_no permission change + chmod 0770 /efs/FactoryApp/serial_no + chown system system /efs/FactoryApp/serial_no + +# disable swap page clustering -- recommended in https://source.android.com/devices/low-ram.html + #write /proc/sys/vm/page-cluster 0 + +on charger + #mount ext4 /dev/block/mmcblk0p17 /system ro wait noatime + #exec sfsck /dev/block/mmcblk0p19 ext4 + #mount ext4 /dev/block/mmcblk0p19 /data wait nosuid nodev noatime discard,noauto_da_alloc,journal_async_commit + +# Set cpu governor to powersave while in charging mode + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor powersave + write /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor powersave + +# EHCI runtime enable for LPA + write /sys/devices/platform/s5p-ehci/power/control auto + +on fs + mount_all /fstab.hawaii_ss_kylepro + #swapon_all fstab.hawaii_ss_kylepro + + setprop ro.crypto.fuse_sdcard true + + # don't require sim + setprop keyguard.no_require_sim 1 + + #j4fs module +# insmod /system/lib/modules/j4fs.ko +# mount j4fs /dev/block/mmcblk0p11 /mnt/.lfs + + #SEC_PARAM +# insmod sec_param.ko + + +# For NV Read/Write + chown radio system /dev/block/mmcblk0p1 + chmod 0770 /dev/block/mmcblk0p1 + + chmod 6755 /system/xbin/su + +#for ASE application + mkdir /data/brcm + mkdir /data/brcm/ase + mkdir /data/brcm/ase/extras + mkdir /data/brcm/ase/scripts + chmod 0775 /data/brcm + chmod 0775 /data/brcm/ase + chmod 0775 /data/brcm/ase/extras + chmod 0775 /data/brcm/ase/scripts + copy /system/etc/adb.sh /data/brcm/ase/scripts/adb.sh + copy /system/etc/rndis.sh /data/brcm/ase/scripts/rndis.sh + copy /system/etc/logcfg.sh /data/brcm/ase/scripts/logcfg.sh + copy /system/etc/modem.sh /data/brcm/ase/scripts/modem.sh + copy /system/etc/atmode.sh /data/brcm/ase/scripts/atmode.sh + copy /system/etc/atmode.sh /data/brcm/ase/scripts/usbconfig.sh + chmod 0775 /data/brcm/ase/scripts/adb.sh + chmod 0775 /data/brcm/ase/scripts/rndis.sh + chmod 0775 /data/brcm/ase/scripts/logcfg.sh + chmod 0775 /data/brcm/ase/scripts/modem.sh + chmod 0775 /data/brcm/ase/scripts/atmode.sh + chmod 0775 /data/brcm/ase/scripts/usbconfig.sh +#runSysCmd + mkdir /data/brcm/utils + chmod 0775 /data/brcm/utils + +# Logging required to save file in /data/brcm for configuration + mkdir /data/brcm + chmod 0775 /data/brcm + +# Permissions for System Server and daemons. + chown system system /sys/devices/platform/panel/backlight/panel/brightness + + #for touch fw + chown system system /sys/class/sec/tsp/cmd + chmod 0660 /sys/class/sec/tsp/cmd + chown system system /sys/class/sec/tsp/cmd_status + chmod 0660 /sys/class/sec/tsp/cmd_status + chown system system /sys/class/sec/tsp/cmd_result + chmod 0660 /sys/class/sec/tsp/cmd_result + + chown system system /sys/class/sec/sec_touchscreen/tsp_firm_version_phone + chmod 0660 /sys/class/sec/sec_touchscreen/tsp_firm_version_phone + chown system system /sys/class/sec/sec_touchscreen/tsp_firm_version_panel + chmod 0660 /sys/class/sec/sec_touchscreen/tsp_firm_version_panel + chown system system /sys/class/sec/sec_touchscreen/tsp_firm_update + chmod 0660 /sys/class/sec/sec_touchscreen/tsp_firm_update + chown system system /sys/class/sec/sec_touchscreen/tsp_firm_update_status + chmod 0660 /sys/class/sec/sec_touchscreen/tsp_firm_update_status + chown system system /sys/class/sec/sec_touchscreen/tsp_threshold + chmod 0660 /sys/class/sec/sec_touchscreen/tsp_threshold + chown system system /sys/class/sec/sec_touchscreen/touchkey_menu + chmod 0660 /sys/class/sec/sec_touchscreen/touchkey_menu + chown system system /sys/class/sec/sec_touchscreen/touchkey_home + chmod 0660 /sys/class/sec/sec_touchscreen/touchkey_home + chown system system /sys/class/sec/sec_touchscreen/touchkey_back + chmod 0660 /sys/class/sec/sec_touchscreen/touchkey_back + +# cpu freq + chown media root /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + chmod 0664 /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor + +# make directory for storing sales code + mkdir /efs/imei 0775 radio system + +on post-fs + restorecon_recursive /efs + chown radio system /efs + chmod 0771 /efs + +# create filesystem if necessary +service setup_fs /system/bin/setup_fs \ + /dev/block/mmcblk0p15 \ + /dev/block/mmcblk0p11 + class core + user root + group root + oneshot + +#at_distributor for making file for factory. +service at_distributor /system/bin/at_distributor + class main + user root + group radio misc log + +#bosch sensor deamon +service sensord /system/bin/sensord + class main + user system + group system + +# RILD +service ril-daemon /system/bin/rild + class main + socket rild stream 660 root radio + socket rild1 stream 660 root radio + socket rild-debug stream 660 radio system + user root + group radio cache inet misc audio system sdcard_rw log sdcard_r +# onrestart restart cpboot-daemon + +# create virtual SD card at /mnt/sdcard, based on the /data/media directory +# daemon will drop to user/group system/media_rw after initializing +# underlying files in /data/media will be created with user and group media_rw (1023) +service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated + class late_start + +# fusewrapped external sdcard daemon running as media_rw (1023) + service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1 + class late_start + disabled + +# create filesystem if necessary + service setup_fs /system/bin/setup_fs \ + /dev/block/mmcblk0p15 \ + /dev/block/mmcblk0p11 + class core + user root + group root + oneshot + +#bosch sensor deamon + service sensord /system/bin/sensord + class main + user system + group system + +# RILD + service ril-daemon /system/bin/rild + class main + socket rild stream 660 root radio + socket rild1 stream 660 root radio + socket rild-debug stream 660 radio system + user root + group radio cache inet misc audio system sdcard_rw log sdcard_r + + service wpa_supplicant /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf \ + -e/data/misc/wifi/entropy.bin \ + -O/data/misc/wifi/sockets -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 + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + + service p2p_supplicant /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/wpa_supplicant_overlay.conf -N \ + -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \ + -I/system/etc/wifi/p2p_supplicant_overlay.conf \ + -e/data/misc/wifi/entropy.bin -puse_p2p_group_interface=1 \ + -O/data/misc/wifi/sockets -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 + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + + service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + + service dhcpcd_p2p /system/bin/dhcpcd -aABKL + class main + disabled + oneshot + + service iprenew_wlan0 /system/bin/dhcpcd -n + class main + disabled + oneshot + + service iprenew_p2p /system/bin/dhcpcd -n + class main + disabled + oneshot + +# Bluetooth PAN + service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + + service iprenew_bt-pan /system/bin/dhcpcd -n + class main + disabled + oneshot + +#for WiFi MFG(TestMode) + service mfgloader /system/bin/mfgloader + class main + disabled + oneshot + + service wlandutservice /system/bin/wlandutservice + class main + user system + group wifi net_raw net_admin system inet + disabled + oneshot + + service macloader /system/bin/macloader + class main + oneshot + +on property:init.svc.macloader=stopped + chown system root /data/.cid.info + chmod 0664 /data/.cid.info + chown system root /data/.rev + chmod 0660 /data/.rev +# end of wifi + + service gpsd /system/bin/glgps -c /system/etc/gps/glconfig.xml + class late_start + user gps + group system root inet radio wifi sdcard_rw + +# Kexec enable + service kexec /system/kexec/kexec.sh + oneshot + +# Run bkmgrd automatically on startup + service bkmgrd /system/bin/bkmgrd + class main + oneshot + user root + #group radio system log + group radio system log root + +# Permissions for Camera + chmod 220 /sys/class/camera/rear/rear_camfw + chmod 220 /sys/class/camera/rear/rear_camtype +# When the default SIM for data connections is updated, +# also update the DUN AT channel with the default SIM. +on property:persist.sys.dataprefer.simid=0 + write /data/atx/setsim.txt at*msetsim=1 + chmod 0666 /data/atx/setsim.txt + start set_simid + +# When the default SIM for data connections is updated, +# also update the DUN AT channel with the default SIM. +on property:persist.sys.dataprefer.simid=1 + write /data/atx/setsim.txt at*msetsim=2 + chmod 0666 /data/atx/setsim.txt + start set_simid + +#btld is only used for FM +# Make sure we startup btld before hcid +#service btld /system/bin/logwrapper /system/bin/btld -hb 3000000 -hp /dev/ttyS1 -lpm 0 -nice -7 +#service btld /system/bin/logwrapper /system/bin/btld -lpm 0 ;; low power mode on(1), off(0) +#service btld /system/bin/logwrapper /system/bin/btld -lpm 1 +# user root +# group bluetooth net_bt_admin +# disabled +# oneshot + +#for WiFi MFG(TestMode) +service mfgloader /system/bin/mfgloader + class main + disabled + oneshot + +service wlandutservice /system/bin/wlandutservice + class main + user system + group wifi net_raw net_admin system inet + disabled + oneshot + +service macloader /system/bin/macloader + class main + oneshot + +on property:init.svc.macloader=stopped + chown system root /data/.cid.info + chmod 0664 /data/.cid.info + chown system root /data/.rev + chmod 0660 /data/.rev +# end of wifi + +service gpsd /system/bin/glgps -c /system/etc/gps/glconfig.xml + class late_start + user gps + group system root inet radio wifi sdcard_rw + +# Run ATX over UART +service console /system/bin/atx -l -d + class main + console +# oneshot + user system + group vpn net_admin net_raw radio system sdcard_rw log mount + +# Kexec enable +service kexec /system/kexec/kexec.sh + oneshot + +# Run bkmgrd automatically on startup +service bkmgrd /system/bin/bkmgrd + class main + oneshot + user root + group radio system log + +# Run usb_portd to automatically launch atx when USB configuration changes. +service usb_portd /system/bin/usb_portd + class main +# oneshot + user system + group input vpn net_admin net_raw radio system sdcard_rw log mount + + + +# When the default SIM for data connections is updated, +# also update the DUN AT channel with the default SIM. +service set_simid /system/bin/atx --fordev=ACM --runcmd=/data/atx/setsim.txt + disabled + oneshot + user system + group input vpn net_admin net_raw radio system sdcard_rw log mount + +#Indicate boot complete to PM to complete PM initialization +on property:dev.bootcomplete=1 + write /sys/module/pwr_mgr/parameters/pm_late_init 1 + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor interactive + chown system system /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + chown system system /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + chown system system /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_rate + chown system system /sys/devices/system/cpu/cpufreq/interactive/boostpulse + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/timer_rate + chmod 660 /sys/devices/system/cpu/cpufreq/interactive/boostpulse + write /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq 666666 + write /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load 70 + write /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay 6000 + write /sys/devices/system/cpu/cpufreq/interactive/min_sample_time 15000 + write /sys/devices/system/cpu/cpufreq/interactive/timer_rate 2000 + +# change dirty_bytes and dirty_background_bytes for 4GB TLC memory + write /proc/sys/vm/dirty_bytes 14680064 + write /proc/sys/vm/dirty_background_bytes 2097152 + +# adb +service startadb /system/etc/startadb.sh + oneshot + + service battery_charger /charger + class charger + critical + +# service playlpm /system/bin/playlpm +# user root +# critical +# service immvibed /system/bin/immvibed +# oneshot +# service lpmkey /system/bin/lpmkey +# user root +# critical +#on charger +# start playlpm +# start immvibed +# start lpmkey + +# Runtime Compcache +service rtccd /system/bin/rtccd2 -a 150M + class core + user root + oneshot + +on property:init.svc.rtccd=stopped + write /proc/sys/vm/page-cluster 0 + + +on property:ro.dumpstate.dmesg=1 diff --git a/ramdisk/init.log.rc b/ramdisk/init.log.rc new file mode 100644 index 0000000..d159a69 --- /dev/null +++ b/ramdisk/init.log.rc @@ -0,0 +1,109 @@ + +on boot + # setup permissions for logging + chown system system /sys/class/bcm_log/bcm_log/log + chown system system /sys/class/bcm_log/bcm_log/log_lock + chown system system /sys/class/bcm_log/bcm_log/cp_crash + chown system system /sys/class/bcm_log/bcm_log/cp_crash_lock + chown system system /sys/class/bcm_log/bcm_log/ap_crash + chown system system /sys/class/bcm_log/bcm_log/ap_crash_lock + chown system system /sys/class/bcm_log/bcm_log/file_max + chown system system /sys/class/bcm_log/bcm_log/file_base + + chmod 0664 /sys/class/bcm_log/bcm_log/log + chmod 0664 /sys/class/bcm_log/bcm_log/log_lock + chmod 0664 /sys/class/bcm_log/bcm_log/cp_crash + chmod 0664 /sys/class/bcm_log/bcm_log/cp_crash_lock + chmod 0664 /sys/class/bcm_log/bcm_log/ap_crash + chmod 0664 /sys/class/bcm_log/bcm_log/ap_crash_lock + chmod 0664 /sys/class/bcm_log/bcm_log/file_max + chmod 0664 /sys/class/bcm_log/bcm_log/file_base + +# Setup Logging persistent data +on property:persist.brcm.log=auto + write /sys/class/bcm_log/bcm_log/log_lock 0 +on property:persist.brcm.log=sdcard + write /sys/class/bcm_log/bcm_log/log_lock 0 + write /sys/class/bcm_log/bcm_log/log sdcard + write /sys/class/bcm_log/bcm_log/log_lock 1 +on property:persist.brcm.log=uart + write /sys/class/bcm_log/bcm_log/log_lock 0 + write /sys/class/bcm_log/bcm_log/log uart + write /sys/class/bcm_log/bcm_log/log_lock 1 +on property:persist.brcm.log=stm + write /sys/class/bcm_log/bcm_log/log_lock 0 + write /sys/class/bcm_log/bcm_log/log stm + write /sys/class/bcm_log/bcm_log/log_lock 1 +on property:persist.brcm.log=rndis + write /sys/class/bcm_log/bcm_log/log_lock 0 + write /sys/class/bcm_log/bcm_log/log rndis + write /sys/class/bcm_log/bcm_log/log_lock 1 +on property:persist.brcm.log=acm + write /sys/class/bcm_log/bcm_log/log_lock 0 + write /sys/class/bcm_log/bcm_log/log acm + write /sys/class/bcm_log/bcm_log/log_lock 1 + +on property:persist.brcm.cp_crash=auto + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 +on property:persist.brcm.cp_crash=sdcard + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash sdcard + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 +on property:persist.brcm.cp_crash=uart + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash uart + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 +on property:persist.brcm.cp_crash=stm + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash stm + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 +on property:persist.brcm.cp_crash=rndis + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash rndis + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 +on property:persist.brcm.cp_crash=acm + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash acm + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 +on property:persist.brcm.cp_crash=panic + write /sys/class/bcm_log/bcm_log/cp_crash_lock 0 + write /sys/class/bcm_log/bcm_log/cp_crash panic + write /sys/class/bcm_log/bcm_log/cp_crash_lock 1 + +on property:persist.brcm.ap_crash=auto + write /sys/class/bcm_log/bcm_log/ap_crash_lock 0 +on property:persist.brcm.ap_crash=stm + write /sys/class/bcm_log/bcm_log/ap_crash_lock 0 + write /sys/class/bcm_log/bcm_log/ap_crash stm + write /sys/class/bcm_log/bcm_log/ap_crash_lock 1 +on property:persist.brcm.ap_crash=panic + write /sys/class/bcm_log/bcm_log/ap_crash_lock 0 + write /sys/class/bcm_log/bcm_log/ap_crash panic + write /sys/class/bcm_log/bcm_log/ap_crash_lock 1 +on property:persist.brcm.ap_crash=sdcard + write /sys/class/bcm_log/bcm_log/ap_crash_lock 0 + write /sys/class/bcm_log/bcm_log/ap_crash sdcard + write /sys/class/bcm_log/bcm_log/ap_crash_lock 1 + +#Setup Broadcom brcm.ase.xxx handling for ASE +on property:brcm.ase.log=* + write /sys/class/bcm_log/bcm_log/log $brcm.ase.log + +on property:brcm.ase.cp_crash=* + write /sys/class/bcm_log/bcm_log/cp_crash $brcm.ase.cp_crash + +on property:brcm.ase.ap_crash=* + write /sys/class/bcm_log/bcm_log/ap_crash $brcm.ase.ap_crash + +on property:brcm.ase.log_save=1 + setprop persist.brcm.log $brcm.ase.log + +on property:brcm.ase.file_max=* + write /sys/class/bcm_log/bcm_log/file_max $brcm.ase.file_max + +on property:brcm.ase.file_max_save=1 + setprop persist.brcm.log_file_max $brcm.ase.file_max + +on property:persist.brcm.log_file_max=* + write /sys/class/bcm_log/bcm_log/file_max $persist.brcm.log_file_max + diff --git a/ramdisk/init.rc b/ramdisk/init.rc new file mode 100644 index 0000000..aa68e1f --- /dev/null +++ b/ramdisk/init.rc @@ -0,0 +1,652 @@ +# Copyright (C) 2012 The Android Open Source Project +# +# IMPORTANT: Do not create world writable files or directories. +# This is a common source of Android security bugs. +# + +import /init.environ.rc +import /init.usb.rc +import /init.${ro.hardware}.rc +import /init.${ro.zygote}.rc +import /init.trace.rc +# Include CM's extra init file +import /init.cm.rc + + +on early-init + # Set init and its forked children's oom_adj. + write /proc/1/oom_score_adj -1000 + + # Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls. + write /sys/fs/selinux/checkreqprot 0 + + # Set the security context for the init process. + # This should occur before anything else (e.g. ueventd) is started. + setcon u:r:init:s0 + + # Set the security context of /adb_keys if present. + restorecon /adb_keys + + start ueventd + + # create mountpoints + mkdir /mnt 0775 root system + +on init + sysclktz 0 + + loglevel 3 + + # Backward compatibility + symlink /system/etc /etc + symlink /sys/kernel/debug /d + + # Right now vendor lives on the same filesystem as system, + # but someday that may change. + symlink /system/vendor /vendor + + # Create cgroup mount point for cpu accounting + mkdir /acct + mount cgroup none /acct cpuacct + mkdir /acct/uid + + # Create cgroup mount point for memory + mount tmpfs none /sys/fs/cgroup mode=0750,uid=0,gid=1000 + mkdir /sys/fs/cgroup/memory 0750 root system + mount cgroup none /sys/fs/cgroup/memory memory + write /sys/fs/cgroup/memory/memory.move_charge_at_immigrate 1 + chown root system /sys/fs/cgroup/memory/tasks + chmod 0660 /sys/fs/cgroup/memory/tasks + mkdir /sys/fs/cgroup/memory/sw 0750 root system + write /sys/fs/cgroup/memory/sw/memory.swappiness 100 + write /sys/fs/cgroup/memory/sw/memory.move_charge_at_immigrate 1 + chown root system /sys/fs/cgroup/memory/sw/tasks + chmod 0660 /sys/fs/cgroup/memory/sw/tasks + + mkdir /system + mkdir /data 0771 system system + mkdir /cache 0770 system cache + mkdir /config 0500 root root + + # See storage config details at http://source.android.com/tech/storage/ + mkdir /mnt/shell 0700 shell shell + mkdir /mnt/media_rw 0700 media_rw media_rw + mkdir /storage 0751 root sdcard_r + + # Directory for putting things only root should see. + mkdir /mnt/secure 0700 root root + + # Directory for staging bindmounts + mkdir /mnt/secure/staging 0700 root root + + # Directory-target for where the secure container + # imagefile directory will be bind-mounted + mkdir /mnt/secure/asec 0700 root root + + # Secure container public mount points. + mkdir /mnt/asec 0700 root system + mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000 + + # Filesystem image public mount points. + mkdir /mnt/obb 0700 root system + mount tmpfs tmpfs /mnt/obb mode=0755,gid=1000 + + # memory control cgroup + mkdir /dev/memcg 0700 root system + mount cgroup none /dev/memcg memory + + write /proc/sys/kernel/panic_on_oops 1 + write /proc/sys/kernel/hung_task_timeout_secs 0 + write /proc/cpu/alignment 4 + write /proc/sys/kernel/sched_latency_ns 10000000 + write /proc/sys/kernel/sched_wakeup_granularity_ns 2000000 + write /proc/sys/kernel/sched_compat_yield 1 + write /proc/sys/kernel/sched_child_runs_first 0 + write /proc/sys/kernel/randomize_va_space 2 + write /proc/sys/kernel/kptr_restrict 2 + write /proc/sys/vm/mmap_min_addr 32768 + write /proc/sys/net/ipv4/ping_group_range "0 2147483647" + write /proc/sys/net/unix/max_dgram_qlen 300 + write /proc/sys/kernel/sched_rt_runtime_us 950000 + write /proc/sys/kernel/sched_rt_period_us 1000000 + + # reflect fwmark from incoming packets onto generated replies + write /proc/sys/net/ipv4/fwmark_reflect 1 + write /proc/sys/net/ipv6/fwmark_reflect 1 + + # set fwmark on accepted sockets + write /proc/sys/net/ipv4/tcp_fwmark_accept 1 + + # Create cgroup mount points for process groups + mkdir /dev/cpuctl + mount cgroup none /dev/cpuctl cpu + chown system system /dev/cpuctl + chown system system /dev/cpuctl/tasks + chmod 0666 /dev/cpuctl/tasks + write /dev/cpuctl/cpu.shares 1024 + write /dev/cpuctl/cpu.rt_runtime_us 800000 + write /dev/cpuctl/cpu.rt_period_us 1000000 + + mkdir /dev/cpuctl/bg_non_interactive + chown system system /dev/cpuctl/bg_non_interactive/tasks + chmod 0666 /dev/cpuctl/bg_non_interactive/tasks + # 5.0 % + write /dev/cpuctl/bg_non_interactive/cpu.shares 52 + write /dev/cpuctl/bg_non_interactive/cpu.rt_runtime_us 700000 + write /dev/cpuctl/bg_non_interactive/cpu.rt_period_us 1000000 + + # qtaguid will limit access to specific data based on group memberships. + # net_bw_acct grants impersonation of socket owners. + # net_bw_stats grants access to other apps' detailed tagged-socket stats. + chown root net_bw_acct /proc/net/xt_qtaguid/ctrl + chown root net_bw_stats /proc/net/xt_qtaguid/stats + + # Allow everybody to read the xt_qtaguid resource tracking misc dev. + # This is needed by any process that uses socket tagging. + chmod 0644 /dev/xt_qtaguid + + # Create location for fs_mgr to store abbreviated output from filesystem + # checker programs. + mkdir /dev/fscklogs 0770 root system + + # pstore/ramoops previous console log + mount pstore pstore /sys/fs/pstore + chown system log /sys/fs/pstore/console-ramoops + chmod 0440 /sys/fs/pstore/console-ramoops + +# Healthd can trigger a full boot from charger mode by signaling this +# property when the power button is held. +on property:sys.boot_from_charger_mode=1 + class_stop charger + trigger late-init + +# Load properties from /system/ + /factory after fs mount. +on load_all_props_action + load_all_props + +# Indicate to fw loaders that the relevant mounts are up. +on firmware_mounts_complete + rm /dev/.booting + +# Mount filesystems and start core system services. +on late-init + trigger early-fs + trigger fs + trigger post-fs + trigger post-fs-data + + # Load properties from /system/ + /factory after fs mount. Place + # this in another action so that the load will be scheduled after the prior + # issued fs triggers have completed. + trigger load_all_props_action + + # Remove a file to wake up anything waiting for firmware. + trigger firmware_mounts_complete + + trigger early-boot + trigger boot + + +on post-fs + # once everything is setup, no need to modify / + mount rootfs rootfs / ro remount + # mount shared so changes propagate into child namespaces + mount rootfs rootfs / shared rec + + # We chown/chmod /cache again so because mount is run as root + defaults + chown system cache /cache + chmod 0770 /cache + # We restorecon /cache in case the cache partition has been reset. + restorecon_recursive /cache + + # This may have been created by the recovery system with odd permissions + chown system cache /cache/recovery + chmod 0770 /cache/recovery + + #change permissions on vmallocinfo so we can grab it from bugreports + chown root log /proc/vmallocinfo + chmod 0440 /proc/vmallocinfo + + chown root log /proc/slabinfo + chmod 0440 /proc/slabinfo + + #change permissions on kmsg & sysrq-trigger so bugreports can grab kthread stacks + chown root system /proc/kmsg + chmod 0440 /proc/kmsg + chown root system /proc/sysrq-trigger + chmod 0220 /proc/sysrq-trigger + chown system log /proc/last_kmsg + chmod 0440 /proc/last_kmsg + + # make the selinux kernel policy world-readable + chmod 0444 /sys/fs/selinux/policy + + # create the lost+found directories, so as to enforce our permissions + mkdir /cache/lost+found 0770 root root + +on post-fs-data + # We chown/chmod /data again so because mount is run as root + defaults + chown system system /data + chmod 0771 /data + # We restorecon /data in case the userdata partition has been reset. + restorecon /data + + # Avoid predictable entropy pool. Carry over entropy from previous boot. + copy /data/system/entropy.dat /dev/urandom + + # Create dump dir and collect dumps. + # Do this before we mount cache so eventually we can use cache for + # storing dumps on platforms which do not have a dedicated dump partition. + mkdir /data/dontpanic 0750 root log + + # Collect apanic data, free resources and re-arm trigger + copy /proc/apanic_console /data/dontpanic/apanic_console + chown root log /data/dontpanic/apanic_console + chmod 0640 /data/dontpanic/apanic_console + + copy /proc/apanic_threads /data/dontpanic/apanic_threads + chown root log /data/dontpanic/apanic_threads + chmod 0640 /data/dontpanic/apanic_threads + + write /proc/apanic_console 1 + + # create basic filesystem structure + mkdir /data/misc 01771 system misc + mkdir /data/misc/adb 02750 system shell + mkdir /data/misc/audit 02750 audit system + mkdir /data/misc/bluedroid 0770 bluetooth net_bt_stack + mkdir /data/misc/bluetooth 0770 system system + mkdir /data/misc/keystore 0700 keystore keystore + mkdir /data/misc/keychain 0771 system system + mkdir /data/misc/net 0750 root shell + mkdir /data/misc/radio 0770 system radio + mkdir /data/misc/sms 0770 system radio + mkdir /data/misc/zoneinfo 0775 system system + mkdir /data/misc/vpn 0770 system vpn + mkdir /data/misc/shared_relro 0771 shared_relro shared_relro + mkdir /data/misc/systemkeys 0700 system system + mkdir /data/misc/wifi 0770 wifi wifi + mkdir /data/misc/wifi/sockets 0770 wifi wifi + mkdir /data/misc/wifi/wpa_supplicant 0770 wifi wifi + mkdir /data/misc/ethernet 0770 system system + mkdir /data/misc/dhcp 0770 dhcp dhcp + mkdir /data/misc/user 0771 root root + # give system access to wpa_supplicant.conf for backup and restore + chmod 0660 /data/misc/wifi/wpa_supplicant.conf + mkdir /data/local 0751 root root + mkdir /data/misc/media 0700 media media + + # For security reasons, /data/local/tmp should always be empty. + # Do not place files or directories in /data/local/tmp + mkdir /data/local/tmp 0771 shell shell + mkdir /data/data 0771 system system + mkdir /data/app-private 0771 system system + mkdir /data/app-asec 0700 root root + mkdir /data/app-lib 0771 system system + mkdir /data/app 0771 system system + mkdir /data/property 0700 root root + + # create dalvik-cache, so as to enforce our permissions + mkdir /data/dalvik-cache 0771 root root + mkdir /data/dalvik-cache/profiles 0711 system system + + # create resource-cache and double-check the perms + mkdir /data/resource-cache 0771 system system + chown system system /data/resource-cache + chmod 0771 /data/resource-cache + + # create the lost+found directories, so as to enforce our permissions + mkdir /data/lost+found 0770 root root + + # create directory for DRM plug-ins - give drm the read/write access to + # the following directory. + mkdir /data/drm 0770 drm drm + + # create directory for MediaDrm plug-ins - give drm the read/write access to + # the following directory. + mkdir /data/mediadrm 0770 mediadrm mediadrm + + mkdir /data/adb 0700 root root + + # symlink to bugreport storage location + symlink /data/data/com.android.shell/files/bugreports /data/bugreports + + # Separate location for storing security policy files on data + mkdir /data/security 0711 system system + + # Reload policy from /data/security if present. + setprop selinux.reload_policy 1 + + # Set SELinux security contexts on upgrade or policy update. + restorecon_recursive /data + restorecon /data/data + restorecon /data/user + restorecon /data/user/0 + + # If there is no fs-post-data action in the init..rc file, you + # must uncomment this line, otherwise encrypted filesystems + # won't work. + # Set indication (checked by vold) that we have finished this action + #setprop vold.post_fs_data_done 1 + +on boot + # basic network init + ifup lo + hostname localhost + domainname localdomain + + # set RLIMIT_NICE to allow priorities from 19 to -20 + setrlimit 13 40 40 + + # Memory management. Basic kernel parameters, and allow the high + # level system server to be able to adjust the kernel OOM driver + # parameters to match how it is managing things. + write /proc/sys/vm/overcommit_memory 1 + write /proc/sys/vm/min_free_order_shift 4 + chown root system /sys/module/lowmemorykiller/parameters/adj + chmod 0220 /sys/module/lowmemorykiller/parameters/adj + chown root system /sys/module/lowmemorykiller/parameters/minfree + chmod 0220 /sys/module/lowmemorykiller/parameters/minfree + + # Tweak background writeout + write /proc/sys/vm/dirty_expire_centisecs 200 + write /proc/sys/vm/dirty_background_ratio 5 + + # Permissions for System Server and daemons. + chown radio system /sys/android_power/state + chown radio system /sys/android_power/request_state + chown radio system /sys/android_power/acquire_full_wake_lock + chown radio system /sys/android_power/acquire_partial_wake_lock + chown radio system /sys/android_power/release_wake_lock + chown system system /sys/power/autosleep + chown system system /sys/power/state + chown system system /sys/power/wakeup_count + chown radio system /sys/power/wake_lock + chown radio system /sys/power/wake_unlock + chmod 0660 /sys/power/state + chmod 0660 /sys/power/wake_lock + chmod 0660 /sys/power/wake_unlock + + chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_rate + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_rate + chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_slack + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_slack + chown system system /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/min_sample_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq + chown system system /sys/devices/system/cpu/cpufreq/interactive/target_loads + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/target_loads + chown system system /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay + chown system system /sys/devices/system/cpu/cpufreq/interactive/boost + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/boost + chown system system /sys/devices/system/cpu/cpufreq/interactive/boostpulse + chown system system /sys/devices/system/cpu/cpufreq/interactive/input_boost + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/input_boost + chown system system /sys/devices/system/cpu/cpufreq/interactive/boostpulse_duration + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/boostpulse_duration + chown system system /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/io_is_busy + + # Assume SMP uses shared cpufreq policy for all CPUs + chown system system /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq + + chown system system /sys/class/timed_output/vibrator/enable + chown system system /sys/class/leds/keyboard-backlight/brightness + chown system system /sys/class/leds/lcd-backlight/brightness + chown system system /sys/class/leds/torch-light/brightness + chown system system /sys/class/leds/button-backlight/brightness + chown system system /sys/class/leds/jogball-backlight/brightness + chown system system /sys/class/leds/red/brightness + chown system system /sys/class/leds/green/brightness + chown system system /sys/class/leds/blue/brightness + chown system system /sys/class/leds/red/device/grpfreq + chown system system /sys/class/leds/red/device/grppwm + chown system system /sys/class/leds/red/device/blink + chown system system /sys/class/timed_output/vibrator/enable + chown system system /sys/module/sco/parameters/disable_esco + chown system system /sys/kernel/ipv4/tcp_wmem_min + chown system system /sys/kernel/ipv4/tcp_wmem_def + chown system system /sys/kernel/ipv4/tcp_wmem_max + chown system system /sys/kernel/ipv4/tcp_rmem_min + chown system system /sys/kernel/ipv4/tcp_rmem_def + chown system system /sys/kernel/ipv4/tcp_rmem_max + chown root radio /proc/cmdline + + # Define default initial receive window size in segments. + setprop net.tcp.default_init_rwnd 60 + + class_start core + +on nonencrypted + class_start main + class_start late_start + +on property:vold.decrypt=trigger_default_encryption + start defaultcrypto + +on property:vold.decrypt=trigger_encryption + start surfaceflinger + start encrypt + +on property:sys.init_log_level=* + loglevel ${sys.init_log_level} + +on charger + class_start charger + +on property:vold.decrypt=trigger_reset_main + class_reset main + +on property:vold.decrypt=trigger_load_persist_props + load_persist_props + +on property:vold.decrypt=trigger_post_fs_data + trigger post-fs-data + +on property:vold.decrypt=trigger_restart_min_framework + class_start main + +on property:vold.decrypt=trigger_restart_framework + class_start main + class_start late_start + +on property:vold.decrypt=trigger_shutdown_framework + class_reset late_start + class_reset main + +on property:sys.powerctl=* + powerctl ${sys.powerctl} + +# system server cannot write to /proc/sys files, +# and chown/chmod does not work for /proc/sys/ entries. +# So proxy writes through init. +on property:sys.sysctl.extra_free_kbytes=* + write /proc/sys/vm/extra_free_kbytes ${sys.sysctl.extra_free_kbytes} + +# "tcp_default_init_rwnd" Is too long! +on property:sys.sysctl.tcp_def_init_rwnd=* + write /proc/sys/net/ipv4/tcp_default_init_rwnd ${sys.sysctl.tcp_def_init_rwnd} + + +## Daemon processes to be run by init. +## +service ueventd /sbin/ueventd + class core + critical + seclabel u:r:ueventd:s0 + +service logd /system/bin/logd + class core + socket logd stream 0666 logd logd + socket logdr seqpacket 0666 logd logd + socket logdw dgram 0222 logd logd + seclabel u:r:logd:s0 + +service healthd /sbin/healthd + class core + critical + seclabel u:r:healthd:s0 + +service console /system/bin/sh + class core + console + disabled + user shell + group shell log + seclabel u:r:shell:s0 + +service auditd /system/bin/auditd -k + seclabel u:r:logd:s0 + class main + +on property:ro.debuggable=1 + start console + +# adbd is controlled via property triggers in init..usb.rc +service adbd /sbin/adbd --root_seclabel=u:r:su:s0 + class core + socket adbd stream 660 system system + disabled + seclabel u:r:adbd:s0 + +# adbd on at boot in emulator +on property:ro.kernel.qemu=1 + start adbd + +service lmkd /system/bin/lmkd + class core + critical + socket lmkd seqpacket 0660 system system + +service servicemanager /system/bin/servicemanager + class core + user system + group system + critical + onrestart restart healthd + onrestart restart zygote + onrestart restart media + onrestart restart surfaceflinger + onrestart restart drm + +service vold /system/bin/vold + class core + socket vold stream 0660 root mount + ioprio be 2 + +service netd /system/bin/netd + class main + socket netd stream 0660 root system + socket dnsproxyd stream 0660 root inet + socket mdns stream 0660 root system + socket fwmarkd stream 0660 root inet + +service debuggerd /system/bin/debuggerd + class main + +service debuggerd64 /system/bin/debuggerd64 + class main + +#service ril-daemon /system/bin/rild +# class main +# socket rild stream 660 root radio +# socket rild-debug stream 660 radio system +# user root +# group radio cache inet misc audio sdcard_rw qcom_diag log + +service surfaceflinger /system/bin/surfaceflinger + class core + user system + group graphics drmrpc + onrestart restart zygote + +service drm /system/bin/drmserver + class main + user drm + group drm system inet drmrpc + +service media /system/bin/mediaserver + class main + user media + group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm qcom_diag + ioprio rt 4 + +# One shot invocation to deal with encrypted volume. +service defaultcrypto /system/bin/vdc --wait cryptfs mountdefaultencrypted + disabled + oneshot + # vold will set vold.decrypt to trigger_restart_framework (default + # encryption) or trigger_restart_min_framework (other encryption) + +# One shot invocation to encrypt unencrypted volumes +service encrypt /system/bin/vdc --wait cryptfs enablecrypto inplace default + disabled + oneshot + # vold will set vold.decrypt to trigger_restart_framework (default + # encryption) + +service bootanim /system/bin/bootanimation + class core + user graphics + group graphics audio + disabled + oneshot + +service installd /system/bin/installd + class main + socket installd stream 600 system system + +service flash_recovery /system/bin/install-recovery.sh + class main + seclabel u:r:install_recovery:s0 + oneshot + disabled + +# update recovery if enabled +on property:persist.sys.recovery_update=true + start flash_recovery + +service racoon /system/bin/racoon + class main + socket racoon stream 600 system system + # IKE uses UDP port 500. Racoon will setuid to vpn after binding the port. + group vpn net_admin inet + disabled + oneshot + +service mtpd /system/bin/mtpd + class main + socket mtpd stream 600 system system + user vpn + group vpn net_admin inet net_raw + disabled + oneshot + +service keystore /system/bin/keystore /data/misc/keystore + class main + user keystore + group keystore drmrpc + +service dumpstate /system/bin/dumpstate -s + class main + socket dumpstate stream 0660 shell log + disabled + oneshot + +service mdnsd /system/bin/mdnsd + class main + user mdnsr + group inet net_raw + socket mdnsd stream 0660 mdnsr inet + disabled + oneshot + +service pre-recovery /system/bin/uncrypt + class main + disabled + oneshot \ No newline at end of file diff --git a/ramdisk/lpm.rc b/ramdisk/lpm.rc new file mode 100644 index 0000000..f6418c7 --- /dev/null +++ b/ramdisk/lpm.rc @@ -0,0 +1,82 @@ +on early-init + start ueventd + + export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin + export LD_LIBRARY_PATH /vendor/lib:/system/lib + export ANDROID_ROOT /system + export ANDROID_DATA /data + export EXTERNAL_STORAGE /sdcard + + symlink /system/etc /etc + + mkdir /sdcard + mkdir /preload + mkdir /system + mkdir /data + mkdir /cache + mkdir /efs + mkdir /tmp + mkdir /dbdata + mkdir /mnt 0775 root root + #mount /tmp /tmp tmpfs + + mount ext4 /dev/block/mmcblk0p17 /system ro wait noatime + exec sfsck /dev/block/mmcblk0p19 ext4 + mount ext4 /dev/block/mmcblk0p19 /data wait nosuid nodev noatime discard,noauto_da_alloc,journal_async_commit + + mkdir /data/log 0777 + + chmod 0666 /dev/log/radio + chmod 0666 /dev/log/main + chmod 0666 /dev/log/event + +# write /sys/class/sec/switch/usb_sel PDA + +# CPU Frequency Governor + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor interactive + +# EHCI runtime enable for LPA + write /sys/devices/platform/s5p-ehci/power/control auto + + ifup lo + hostname localhost + domainname localdomain + + class_start charger + class_start default + +service debuggerd /system/bin/debuggerd + + service ueventd /sbin/ueventd + critical + +#service console /bin/sh +service console /system/bin/sh + console + +service playlpm /system/bin/playlpm + user root + +service immvibed /system/bin/immvibed + oneshot + +service lpmkey /system/bin/lpmkey + user root + +service battery_charger /charger + class charger + seclabel u:r:healthd:s0 + +# adbd is controlled by the persist.service.adb.enable system property +service adbd /sbin/adbd + disabled + +# adbd on at boot in emulator +on property:ro.kernel.qemu=1 + start adbd + +on property:persist.service.adb.enable=1 + start adbd + +on property:persist.service.adb.enable=0 + stop adbd \ No newline at end of file diff --git a/ramdisk/twrp.fstab.hawaii_ss_kylepro b/ramdisk/twrp.fstab.hawaii_ss_kylepro new file mode 100644 index 0000000..f370274 --- /dev/null +++ b/ramdisk/twrp.fstab.hawaii_ss_kylepro @@ -0,0 +1,9 @@ +/boot emmc /dev/block/platform/sdhci.1/by-name/KERNEL +/system ext4 /dev/block/platform/sdhci.1/by-name/system +/data ext4 /dev/block/platform/sdhci.1/by-name/userdata length=-16384 +/cache ext4 /dev/block/platform/sdhci.1/by-name/CSC +/recovery emmc /dev/block/platform/sdhci.1/by-name/RECOVERY +/modem emmc /dev/block/platform/sdhci.1/by-name/modem flags=display="Baseband";backup=1 +/efs ext4 /dev/block/platform/sdhci.1/by-name/efs flags=display="EFS";backup=1 +/external_sd vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1 flags=display="Micro SDcard";storage;wipeingui;removable +/preload ext4 /dev/block/platform/sdhci.1/by-name/HIDDEN flags=display="Preload";wipeingui;backup=1 diff --git a/ramdisk/ueventd.hawaii_ss_kylepro.rc b/ramdisk/ueventd.hawaii_ss_kylepro.rc new file mode 100644 index 0000000..a8e27c2 --- /dev/null +++ b/ramdisk/ueventd.hawaii_ss_kylepro.rc @@ -0,0 +1,72 @@ + +/dev/pvrsrvkm 0666 system system +/dev/graphics/fb0 0666 system graphics +/dev/video0 0660 system camera +/dev/video1 0660 system camera +/dev/video2 0660 system camera +/dev/s3c-jpg 0660 system camera +/dev/s3c-mem 0660 system system +/dev/s3c-mfc 0660 system graphics + +/dev/modem_ctl 0660 radio radio +/dev/modem_fmt 0660 radio radio +/dev/modem_rfs 0660 radio radio +/dev/s3c2410_serial3 0660 radio radio +/dev/block/mtdblock5 0660 radio radio +/dev/mtd/mtd5ro 0660 radio radio + +# for GPS +/dev/s3c2410_serial1 0600 gps gps + +# for Camera +/dev/bcm_unicam 0660 system camera +/dev/bcm_isp 0660 system camera +/dev/i2c-0 0660 system camera +/dev/i2c-1 0660 system camera +/dev/i2c-2 0660 system camera + +# for MM memory +/dev/ion 0666 system graphics + +#for V3D +/dev/v3d 0666 system graphics +/dev/pmem 0660 system graphics + +#for VCE +/dev/vce 0660 system graphics + +# sensors +/dev/mpu 0666 system system +/dev/mpuirq 0666 system system +/dev/timerirq 0666 system system +/dev/ami_sensor 0666 system system + +# for Hawaii +/dev/mm_v3d 0666 system graphics +/dev/mm_isp 0660 system camera +/dev/bcm_isp2 0660 system camera +/dev/mm_isp2 0666 system camera +/dev/bcm_jpeg 0660 system camera +/dev/mm_interlock 0666 system graphics +/dev/mm_h264 0660 media media +/dev/h264_ol 0660 media media + +# for h/w codec +/dev/brcm_h264 0660 media media + +#Permission for NV partition +/dev/block/mmcblk0p1 0770 radio system + +# SYSTEM Status +/dev/block/mmcblk0p11 0660 system root + +# for RIL to be able to open Kernel RPC drivers +/dev/bcm_rpc 0660 radio radio +/dev/bcm_irpc 0660 radio radio +/dev/bcm_atc 0660 shell system + +# SEC User Dump +# /dev/sec_user_dump 0660 system shell +/dev/mem 0660 system root +/dev/ttyGS0 0660 system system +/dev/snd/controlC0 0660 system audio \ No newline at end of file diff --git a/ril/com/android/internal/telephony/SamsungBCMRIL.java b/ril/com/android/internal/telephony/SamsungBCMRIL.java new file mode 100644 index 0000000..d91be63 --- /dev/null +++ b/ril/com/android/internal/telephony/SamsungBCMRIL.java @@ -0,0 +1,410 @@ +/* + * Copyright (C) 2012 The CyanogenMod 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. + */ + +package com.android.internal.telephony; + +import static com.android.internal.telephony.RILConstants.*; + +import android.content.Context; +import android.os.AsyncResult; +import android.os.Message; +import android.os.Parcel; +import android.os.SystemProperties; +import android.telephony.Rlog; +import com.android.internal.telephony.RILConstants; +import java.util.Collections; +import android.telephony.PhoneNumberUtils; + +import java.util.ArrayList; + +/** + * Custom RIL to handle unique behavior of BCM RIL + * + * {@hide} + */ +public class SamsungBCMRIL extends RIL implements CommandsInterface { + + private static int sEnabledDataSimId = -1; + + public SamsungBCMRIL(Context context, int networkMode, int cdmaSubscription) { + this(context, networkMode, cdmaSubscription, null); + } + + public SamsungBCMRIL(Context context, int networkMode, + int cdmaSubscription, Integer instanceId) { + super(context, networkMode, cdmaSubscription, instanceId); + mQANElements = 6; + } + + public void + dial(String address, int clirMode, UUSInfo uusInfo, Message result) { + RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); + + rr.mParcel.writeString(address); + rr.mParcel.writeInt(clirMode); + rr.mParcel.writeInt(0); // UUS information is absent: Samsung BCM compat + + if (uusInfo == null) { + rr.mParcel.writeInt(0); // UUS information is absent + } else { + rr.mParcel.writeInt(1); // UUS information is present + rr.mParcel.writeInt(uusInfo.getType()); + rr.mParcel.writeInt(uusInfo.getDcs()); + rr.mParcel.writeByteArray(uusInfo.getUserData()); + } + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + send(rr); + } + + public void setUiccSubscription(int slotId, int appIndex, int subId, + int subStatus, Message result) { + if (RILJ_LOGD) riljLog("setUiccSubscription" + slotId + " " + appIndex + " " + subId + " " + subStatus); + + // Fake response (note: should be sent before mSubscriptionStatusRegistrants or + // SubscriptionManager might not set the readiness correctly) + AsyncResult.forMessage(result, 0, null); + result.sendToTarget(); + + // TODO: Actually turn off/on the radio (and don't fight with the ServiceStateTracker) + if (subStatus == 1 /* ACTIVATE */) { + // Subscription changed: enabled + if (mSubscriptionStatusRegistrants != null) { + mSubscriptionStatusRegistrants.notifyRegistrants( + new AsyncResult (null, new int[] {1}, null)); + } + } else if (subStatus == 0 /* DEACTIVATE */) { + // Subscription changed: disabled + if (mSubscriptionStatusRegistrants != null) { + mSubscriptionStatusRegistrants.notifyRegistrants( + new AsyncResult (null, new int[] {0}, null)); + } + } + } + + @Override + public void setDataAllowed(boolean allowed, Message result) { + int simId = mInstanceId == null ? 0 : mInstanceId; + if (!allowed) { + // Deactivate data call. This happens when switching data SIM + // and the framework will wait for data call to be deactivated. + // Emulate this by switching to the other SIM. + simId = 1 - simId; + } + + if (sEnabledDataSimId != simId) { + if (RILJ_LOGD) riljLog("Setting data subscription to " + simId); + invokeOemRilRequestBrcm((byte) 0, (byte)(0x30 + simId), result); + sEnabledDataSimId = simId; + } else { + if (RILJ_LOGD) riljLog("Data subscription is already set to " + simId); + if (result != null) { + AsyncResult.forMessage(result, 0, null); + result.sendToTarget(); + } + } + } + + @Override + protected void notifyRegistrantsRilConnectionChanged(int rilVer) { + super.notifyRegistrantsRilConnectionChanged(rilVer); + if (rilVer != -1) { + if (mInstanceId != null) { + // Enable simultaneous data/voice on Multi-SIM + invokeOemRilRequestBrcm((byte) 3, (byte) 1, null); + } else { + // Set data subscription to allow data in either SIM slot when using single SIM mode + setDataAllowed(true, null); + } + } + } + + private void invokeOemRilRequestBrcm(byte key, byte value, Message response) { + invokeOemRilRequestRaw(new byte[] { 'B', 'R', 'C', 'M', key, value }, response); + } + + protected RILRequest + processSolicited (Parcel p) { + int serial, error; + + serial = p.readInt(); + error = p.readInt(); + + RILRequest rr; + + rr = findAndRemoveRequestFromList(serial); + + if (rr == null) { + Rlog.w(RILJ_LOG_TAG, "Unexpected solicited response! sn: " + + serial + " error: " + error); + return null; + } + + Object ret = null; + + if (error == 0 || p.dataAvail() > 0) { + // either command succeeds or command fails but with data payload + try {switch (rr.mRequest) { + /* + cat libs/telephony/ril_commands.h \ + | egrep "^ *{RIL_" \ + | sed -re 's/\{([^,]+),[^,]+,([^}]+).+/case \1: ret = \2(p); break;/' + */ + case RIL_REQUEST_GET_SIM_STATUS: ret = responseIccCardStatus(p); break; + case RIL_REQUEST_ENTER_SIM_PIN: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PUK: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PIN2: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_SIM_PUK2: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_SIM_PIN: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_SIM_PIN2: ret = responseInts(p); break; + case RIL_REQUEST_ENTER_DEPERSONALIZATION_CODE: ret = responseInts(p); break; + case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break; + case RIL_REQUEST_DIAL: ret = responseVoid(p); break; + case RIL_REQUEST_GET_IMSI: ret = responseString(p); break; + case RIL_REQUEST_HANGUP: ret = responseVoid(p); break; + case RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND: ret = responseVoid(p); break; + case RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND: { + if (mTestingEmergencyCall.getAndSet(false)) { + if (mEmergencyCallbackModeRegistrant != null) { + riljLog("testing emergency call, notify ECM Registrants"); + mEmergencyCallbackModeRegistrant.notifyRegistrant(); + } + } + ret = responseVoid(p); + break; + } + case RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE: ret = responseVoid(p); break; + case RIL_REQUEST_CONFERENCE: ret = responseVoid(p); break; + case RIL_REQUEST_UDUB: ret = responseVoid(p); break; + case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseInts(p); break; + case RIL_REQUEST_SIGNAL_STRENGTH: ret = responseSignalStrength(p); break; + case RIL_REQUEST_VOICE_REGISTRATION_STATE: ret = responseStrings(p); break; + case RIL_REQUEST_DATA_REGISTRATION_STATE: ret = responseStrings(p); break; + case RIL_REQUEST_OPERATOR: ret = responseStrings(p); break; + case RIL_REQUEST_RADIO_POWER: ret = responseVoid(p); break; + case RIL_REQUEST_DTMF: ret = responseVoid(p); break; + case RIL_REQUEST_SEND_SMS: ret = responseSMS(p); break; + case RIL_REQUEST_SEND_SMS_EXPECT_MORE: ret = responseSMS(p); break; + case RIL_REQUEST_SETUP_DATA_CALL: ret = responseSetupDataCall(p); break; + case RIL_REQUEST_SIM_IO: ret = responseICC_IO(p); break; + case RIL_REQUEST_SEND_USSD: ret = responseVoid(p); break; + case RIL_REQUEST_CANCEL_USSD: ret = responseVoid(p); break; + case RIL_REQUEST_GET_CLIR: ret = responseInts(p); break; + case RIL_REQUEST_SET_CLIR: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_CALL_FORWARD_STATUS: ret = responseCallForward(p); break; + case RIL_REQUEST_SET_CALL_FORWARD: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_CALL_WAITING: ret = responseInts(p); break; + case RIL_REQUEST_SET_CALL_WAITING: ret = responseVoid(p); break; + case RIL_REQUEST_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_IMEI: ret = responseString(p); break; + case RIL_REQUEST_GET_IMEISV: ret = responseString(p); break; + case RIL_REQUEST_ANSWER: ret = responseVoid(p); break; + case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_FACILITY_LOCK: ret = responseInts(p); break; + case RIL_REQUEST_SET_FACILITY_LOCK: ret = responseInts(p); break; + case RIL_REQUEST_CHANGE_BARRING_PASSWORD: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE: ret = responseInts(p); break; + case RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC: ret = responseVoid(p); break; + case RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_AVAILABLE_NETWORKS : ret = responseOperatorInfos(p); break; + case RIL_REQUEST_DTMF_START: ret = responseVoid(p); break; + case RIL_REQUEST_DTMF_STOP: ret = responseVoid(p); break; + case RIL_REQUEST_BASEBAND_VERSION: ret = responseString(p); break; + case RIL_REQUEST_SEPARATE_CONNECTION: ret = responseVoid(p); break; + case RIL_REQUEST_SET_MUTE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_MUTE: ret = responseInts(p); break; + case RIL_REQUEST_QUERY_CLIP: ret = responseInts(p); break; + case RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE: ret = responseInts(p); break; + case RIL_REQUEST_DATA_CALL_LIST: ret = responseDataCallList(p); break; + case RIL_REQUEST_RESET_RADIO: ret = responseVoid(p); break; + case RIL_REQUEST_OEM_HOOK_RAW: ret = responseRaw(p); break; + case RIL_REQUEST_OEM_HOOK_STRINGS: ret = responseStrings(p); break; + case RIL_REQUEST_SCREEN_STATE: ret = responseVoid(p); break; + case RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION: ret = responseVoid(p); break; + case RIL_REQUEST_WRITE_SMS_TO_SIM: ret = responseInts(p); break; + case RIL_REQUEST_DELETE_SMS_ON_SIM: ret = responseVoid(p); break; + case RIL_REQUEST_SET_BAND_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE: ret = responseInts(p); break; + case RIL_REQUEST_STK_GET_PROFILE: ret = responseString(p); break; + case RIL_REQUEST_STK_SET_PROFILE: ret = responseVoid(p); break; + case RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: ret = responseString(p); break; + case RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE: ret = responseVoid(p); break; + case RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM: ret = responseInts(p); break; + case RIL_REQUEST_EXPLICIT_CALL_TRANSFER: ret = responseVoid(p); break; + case RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE: ret = responseVoid(p); break; + case RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE: ret = responseGetPreferredNetworkType(p); break; + case RIL_REQUEST_GET_NEIGHBORING_CELL_IDS: ret = responseCellList(p); break; + case RIL_REQUEST_SET_LOCATION_UPDATES: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE: ret = responseInts(p); break; + case RIL_REQUEST_SET_TTY_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_QUERY_TTY_MODE: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_FLASH: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_BURST_DTMF: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SEND_SMS: ret = responseSMS(p); break; + case RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE: ret = responseVoid(p); break; + case RIL_REQUEST_GSM_GET_BROADCAST_CONFIG: ret = responseGmsBroadcastConfig(p); break; + case RIL_REQUEST_GSM_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; + case RIL_REQUEST_GSM_BROADCAST_ACTIVATION: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_GET_BROADCAST_CONFIG: ret = responseCdmaBroadcastConfig(p); break; + case RIL_REQUEST_CDMA_SET_BROADCAST_CONFIG: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_BROADCAST_ACTIVATION: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_SUBSCRIPTION: ret = responseStrings(p); break; + case RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM: ret = responseInts(p); break; + case RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM: ret = responseVoid(p); break; + case RIL_REQUEST_DEVICE_IDENTITY: ret = responseStrings(p); break; + case RIL_REQUEST_GET_SMSC_ADDRESS: ret = responseString(p); break; + case RIL_REQUEST_SET_SMSC_ADDRESS: ret = responseVoid(p); break; + case RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE: ret = responseVoid(p); break; + case RIL_REQUEST_REPORT_SMS_MEMORY_STATUS: ret = responseVoid(p); break; + case RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING: ret = responseVoid(p); break; + case RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE: ret = responseInts(p); break; + case RIL_REQUEST_ISIM_AUTHENTICATION: ret = responseString(p); break; + case RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU: ret = responseVoid(p); break; + case RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS: ret = responseICC_IO(p); break; + case RIL_REQUEST_VOICE_RADIO_TECH: ret = responseInts(p); break; + default: + throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest); + //break; + }} catch (Throwable tr) { + // Exceptions here usually mean invalid RIL responses + + Rlog.w(RILJ_LOG_TAG, rr.serialString() + "< " + + requestToString(rr.mRequest) + + " exception, possible invalid RIL response", tr); + + if (rr.mResult != null) { + AsyncResult.forMessage(rr.mResult, null, tr); + rr.mResult.sendToTarget(); + } + return rr; + } + } + + // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789. + // This is needed otherwise we don't automatically transition to the main lock + // screen when the pin or puk is entered incorrectly. + // Note for the I9082: we're faking more than the standard RIL + switch (rr.mRequest) { + case RIL_REQUEST_ENTER_SIM_PUK: + case RIL_REQUEST_ENTER_SIM_PUK2: + case RIL_REQUEST_ENTER_SIM_PIN: + case RIL_REQUEST_ENTER_SIM_PIN2: + case RIL_REQUEST_CHANGE_SIM_PIN: + case RIL_REQUEST_CHANGE_SIM_PIN2: + case RIL_REQUEST_SET_FACILITY_LOCK: + if (mIccStatusChangedRegistrants != null) { + if (RILJ_LOGD) { + riljLog("ON enter sim puk fakeSimStatusChanged: reg count=" + + mIccStatusChangedRegistrants.size()); + } + mIccStatusChangedRegistrants.notifyRegistrants(); + } + break; + } + + if (error != 0) { + rr.onError(error, ret); + return rr; + } + + if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) + + " " + retToString(rr.mRequest, ret)); + + if (rr.mResult != null) { + AsyncResult.forMessage(rr.mResult, ret, null); + rr.mResult.sendToTarget(); + } + + return rr; + } + + @Override + protected Object + responseCallList(Parcel p) { + int num; + int voiceSettings; + ArrayList response; + DriverCall dc; + + num = p.readInt(); + response = new ArrayList(num); + + for (int i = 0 ; i < num ; i++) { + dc = new DriverCall(); + + dc.state = DriverCall.stateFromCLCC(p.readInt()); + dc.index = p.readInt(); + dc.TOA = p.readInt(); + dc.isMpty = (0 != p.readInt()); + dc.isMT = (0 != p.readInt()); + dc.als = p.readInt(); + voiceSettings = p.readInt(); + dc.isVoice = (0 == voiceSettings) ? false : true; + //Some Samsung magic data for Videocalls + // hack taken from smdk4210ril class + voiceSettings = p.readInt(); + //printing it to cosole for later investigation + Rlog.d(RILJ_LOG_TAG, "Samsung magic = " + voiceSettings); + dc.isVoicePrivacy = (0 != p.readInt()); + dc.number = p.readString(); + int np = p.readInt(); + dc.numberPresentation = DriverCall.presentationFromCLIP(np); + dc.name = p.readString(); + dc.namePresentation = p.readInt(); + int uusInfoPresent = p.readInt(); + if (uusInfoPresent == 1) { + dc.uusInfo = new UUSInfo(); + dc.uusInfo.setType(p.readInt()); + dc.uusInfo.setDcs(p.readInt()); + byte[] userData = p.createByteArray(); + dc.uusInfo.setUserData(userData); + riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d", + dc.uusInfo.getType(), dc.uusInfo.getDcs(), + dc.uusInfo.getUserData().length)); + riljLogv("Incoming UUS : data (string)=" + + new String(dc.uusInfo.getUserData())); + riljLogv("Incoming UUS : data (hex): " + + IccUtils.bytesToHexString(dc.uusInfo.getUserData())); + } else { + riljLogv("Incoming UUS : NOT present!"); + } + + // Make sure there's a leading + on addresses with a TOA of 145 + dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA); + + response.add(dc); + + if (dc.isVoicePrivacy) { + mVoicePrivacyOnRegistrants.notifyRegistrants(); + riljLog("InCall VoicePrivacy is enabled"); + } else { + mVoicePrivacyOffRegistrants.notifyRegistrants(); + riljLog("InCall VoicePrivacy is disabled"); + } + } + + Collections.sort(response); + + return response; + } + +} diff --git a/sepolicy/bkmgrd.te b/sepolicy/bkmgrd.te new file mode 100644 index 0000000..5bb3658 --- /dev/null +++ b/sepolicy/bkmgrd.te @@ -0,0 +1,9 @@ +type bkmgrd, domain; +type bkmgrd_exec, file_type, exec_type; + +init_daemon_domain(bkmgrd) + +allow bkmgrd radio_device:chr_file rw_file_perms; +allow bkmgrd self:capability setuid; +allow bkmgrd system_data_file:file create_file_perms; +allow bkmgrd system_data_file:dir rw_dir_perms; diff --git a/sepolicy/bluetooth.te b/sepolicy/bluetooth.te new file mode 100644 index 0000000..b83582b --- /dev/null +++ b/sepolicy/bluetooth.te @@ -0,0 +1,2 @@ +allow bluetooth sysfs:file rw_file_perms; +allow bluetooth serial_device:chr_file rw_file_perms; \ No newline at end of file diff --git a/sepolicy/device.te b/sepolicy/device.te new file mode 100644 index 0000000..c185d01 --- /dev/null +++ b/sepolicy/device.te @@ -0,0 +1 @@ +type cam_block_device, dev_type; diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts new file mode 100644 index 0000000..fb4d614 --- /dev/null +++ b/sepolicy/file_contexts @@ -0,0 +1,51 @@ +/dev/bcm_isp u:object_r:camera_device:s0 +/dev/mm_isp u:object_r:camera_device:s0 +/dev/vce u:object_r:gpu_device:s0 +/dev/mm_h264 u:object_r:video_device:s0 +/dev/h264_ol u:object_r:video_device:s0 +/dev/brcm_h264 u:object_r:video_device:s0 +/dev/mm_v3d u:object_r:gpu_device:s0 +/dev/mm_interlock u:object_r:gpu_device:s0 +/dev/bcm_voip_chrdev u:object_r:audio_device:s0 +/dev/bcm_security u:object_r:radio_device:s0 +/dev/v3d u:object_r:gpu_device:s0 +/dev/pmem u:object_r:gpu_device:s0 +/dev/bralloc_mem u:object_r:gpu_device:s0 +/dev/graphics/fb0 u:object_r:gpu_device:s0 +/dev/modem_ctl u:object_r:radio_device:s0 +/dev/modem_fmt u:object_r:radio_device:s0 +/dev/modem_rfs u:object_r:radio_device:s0 +/dev/s3c2410_serial3 u:object_r:radio_device:s0 +/dev/s3c2410_serial1 u:object_r:gps_device:s0 +/dev/bcm_unicam u:object_r:camera_device:s0 +/dev/i2c-[0-9] u:object_r:camera_device:s0 +/dev/bcm_isp2 u:object_r:camera_device:s0 +/dev/mm_isp2 u:object_r:camera_device:s0 +/dev/bcm_jpeg u:object_r:camera_device:s0 +/dev/bcm_rpc u:object_r:radio_device:s0 +/dev/bcm_irpc u:object_r:radio_device:s0 + +/efs/bluetooth/bt_addr u:object_r:bluetooth_efs_file:s0 +/sys/devices/platform/bcmbt-rfkill.1/rfkill/rfkill0/state -- u:object_r:sysfs_bluetooth_writable:s0 +/sys/devices/platform/bcmbt-rfkill.1/rfkill/rfkill0/type -- u:object_r:sysfs_bluetooth_writable:s0 + +/dev/ttyS0 u:object_r:hci_attach_dev:s0 +/dev/ttyS1 u:object_r:gps_device:s0 +#/dev/ttyS2 u:object_r:gps_device:s0 +/dev/bcm_gps u:object_r:gps_device:s0 + +/dev/bcm_log u:object_r:radio_device:s0 +/dev/block/mmcblk0p1 u:object_r:radio_device:s0 + +/dev/socket/rild1 u:object_r:rild_socket:s0 + +/sys/devices/platform/mdnie/mdnie/mdnie/cabc -- u:object_r:sysfs_writable:s0 + +# /system files +/system/bin/geomagneticd u:object_r:geomagneticd_exec:s0 +/system/bin/immvibed u:object_r:immvibed_exec:s0 +/system/bin/macloader u:object_r:macloader_exec:s0 +/system/bin/tvserver u:object_r:tvserver_exec:s0 +/system/bin/bkmgrd u:object_r:bkmgrd_exec:s0 +/system/bin/vclmk u:object_r:vclmk_exec:s0 +/system/bin/glgps u:object_r:gpsd_exec:s0 diff --git a/sepolicy/geomagneticd.te b/sepolicy/geomagneticd.te new file mode 100644 index 0000000..99ea452 --- /dev/null +++ b/sepolicy/geomagneticd.te @@ -0,0 +1,12 @@ +type geomagneticd, domain; +type geomagneticd_exec, file_type, exec_type; + +init_daemon_domain(geomagneticd) + +allow geomagneticd input_device:chr_file r_file_perms; +allow geomagneticd input_device:dir r_dir_perms; +allow geomagneticd sysfs:file rw_file_perms; + +# yas.cfg +allow geomagneticd system_data_file:file create_file_perms; +allow geomagneticd system_data_file:dir rw_dir_perms; diff --git a/sepolicy/gpsd.te b/sepolicy/gpsd.te new file mode 100644 index 0000000..c72a45b --- /dev/null +++ b/sepolicy/gpsd.te @@ -0,0 +1,5 @@ +allow gpsd system_data_file:dir rw_dir_perms; +allow gpsd system_data_file:file create_file_perms; +allow gpsd system_data_file:fifo_file { rw_file_perms create unlink setattr }; + +wakelock_use(gpsd) diff --git a/sepolicy/immvibed.te b/sepolicy/immvibed.te new file mode 100644 index 0000000..12ee332 --- /dev/null +++ b/sepolicy/immvibed.te @@ -0,0 +1,4 @@ +type immvibed, domain; +type immvibed_exec, file_type, exec_type; + +init_daemon_domain(immvibed) diff --git a/sepolicy/init.te b/sepolicy/init.te new file mode 100644 index 0000000..fdd83bc --- /dev/null +++ b/sepolicy/init.te @@ -0,0 +1,7 @@ +# chmod in init.capri_ss_baffin.rc (for bkmgrd) +allow init block_device:blk_file setattr; +allow init radio_device:blk_file setattr; + +# insmod +allow init self:capability sys_module; # TODO: want sys_ptrace too +allow init kernel:security setenforce; \ No newline at end of file diff --git a/sepolicy/kernel.te b/sepolicy/kernel.te new file mode 100644 index 0000000..97173fe --- /dev/null +++ b/sepolicy/kernel.te @@ -0,0 +1,6 @@ +# Create mmcblk1 +allow kernel device:blk_file { create setattr }; +allow kernel self:capability mknod; + +# kcamfwcheck drivers/char/broadcom/vc_cam/vc_cam.c +allow kernel cam_block_device:blk_file rw_file_perms; diff --git a/sepolicy/macloader.te b/sepolicy/macloader.te new file mode 100644 index 0000000..a1bc673 --- /dev/null +++ b/sepolicy/macloader.te @@ -0,0 +1,9 @@ +type macloader, domain; +type macloader_exec, file_type, exec_type; + +init_daemon_domain(macloader) + +# Read EFS +allow macloader efs_file:dir rw_dir_perms; +allow macloader efs_file:file rw_file_perms; +allow macloader self:capability dac_override; diff --git a/sepolicy/property_contexts b/sepolicy/property_contexts new file mode 100644 index 0000000..ac1dc55 --- /dev/null +++ b/sepolicy/property_contexts @@ -0,0 +1,2 @@ +service.brcm.bt.mac u:object_r:radio_prop:s0 +persist.sys.pdpcontext. u:object_r:radio_prop:s0 diff --git a/sepolicy/rild.te b/sepolicy/rild.te new file mode 100644 index 0000000..5fc863a --- /dev/null +++ b/sepolicy/rild.te @@ -0,0 +1,16 @@ +allow rild self:capability dac_override; + +allow rild gps_data_file:fifo_file { write read open setattr }; +allow rild gps_data_file:dir search; + +allow rild system_data_file:sock_file { create setattr unlink }; +allow rild system_data_file:dir rw_dir_perms; + +allow rild self:packet_socket { create ioctl }; + +allow rild block_device:dir search; + +# /proc/bcm_fuse_net_config +allow rild proc:file write; +allow rild gps_device:chr_file rw_file_perms; +allow rild block_device:chr_file rw_file_perms; \ No newline at end of file diff --git a/sepolicy/service_contexts b/sepolicy/service_contexts new file mode 100644 index 0000000..ddb8a10 --- /dev/null +++ b/sepolicy/service_contexts @@ -0,0 +1 @@ +broadcom.tvservice u:object_r:system_server_service:s0 diff --git a/sepolicy/shell.te b/sepolicy/shell.te new file mode 100644 index 0000000..8db3c16 --- /dev/null +++ b/sepolicy/shell.te @@ -0,0 +1,3 @@ +# Not sure why +allow shell serial_device:chr_file rw_file_perms; +allow shell block_device:chr_file rw_file_perms; \ No newline at end of file diff --git a/sepolicy/surfaceflinger.te b/sepolicy/surfaceflinger.te new file mode 100644 index 0000000..274cf1e --- /dev/null +++ b/sepolicy/surfaceflinger.te @@ -0,0 +1 @@ +allow surfaceflinger debug_prop:property_service set; \ No newline at end of file diff --git a/sepolicy/system_server.te b/sepolicy/system_server.te new file mode 100644 index 0000000..fda6c37 --- /dev/null +++ b/sepolicy/system_server.te @@ -0,0 +1,8 @@ +# Access /sys/devices/platform/mdnie/mdnie/mdnie/cabc +allow system_server sysfs_writable:file rw_file_perms; + +# Access /efs/wifi/.mac.info +allow system_server efs_file:file { read open }; + +# Not sure why +allow system_server efs_file:dir search; diff --git a/sepolicy/tvserver.te b/sepolicy/tvserver.te new file mode 100644 index 0000000..81b6c69 --- /dev/null +++ b/sepolicy/tvserver.te @@ -0,0 +1,8 @@ +type tvserver, domain; +type tvserver_exec, file_type, exec_type; + +init_daemon_domain(tvserver) +binder_use(tvserver) + +allow tvserver gpu_device:chr_file rw_file_perms; +allow tvserver system_server_service:service_manager add; diff --git a/sepolicy/vclmk.te b/sepolicy/vclmk.te new file mode 100644 index 0000000..8aa163d --- /dev/null +++ b/sepolicy/vclmk.te @@ -0,0 +1,14 @@ +type vclmk, domain; +type vclmk_exec, file_type, exec_type; + +init_daemon_domain(vclmk) + +allow vclmk gpu_device:chr_file rw_file_perms; +allow vclmk video_device:chr_file rw_file_perms; + +# Access app data in /proc/pid +allow vclmk domain:dir r_dir_perms; +allow vclmk domain:file r_file_perms; + +# Kill apps +allow vclmk appdomain:process { sigkill sigstop signal }; diff --git a/sepolicy/zygote.te b/sepolicy/zygote.te new file mode 100644 index 0000000..e1acfd2 --- /dev/null +++ b/sepolicy/zygote.te @@ -0,0 +1,2 @@ +# Not sure why +binder_use(zygote) diff --git a/system.prop b/system.prop new file mode 100644 index 0000000..2b84f9a --- /dev/null +++ b/system.prop @@ -0,0 +1,35 @@ +# +# KYLEPRO (GT-S7580) +# + +persist.brcm.log=none +persist.brcm.cp_crash=none +persist.brcm.ap_crash=none + +rild.libpath=/system/lib/libbrcm_ril.so +#rild.libargs=-d /dev/ttyS0 +ro.sf.lcd_density=240 +ro.lcd_brightness=160 +ro.lcd_min_brightness=18 + +# MultiTouch support +ro.product.multi_touch_enabled=true +ro.product.max_num_touch=2 + +net.streaming.rtsp.uaprof=http://wap.samsungmobile.com/uaprof/ + +ro.opengles.version=131072 +debug.hwui.render_dirty_regions=false +brcm.graphics.async_errors=false +brcm.hwc.no-hdmi-trans=1 + +#adative video encoding +video.enc.h264.adaptive_quality=1 +video.enc.h264.timing_window_sz=4 +video.enc.h264.timing_thr0=295 +video.enc.h264.timing_thr1=215 +video.enc.h264.timing_thr2=145 + +ro.ril.hsxpa=1 +ro.ril.gprsclass=10 +ro.com.google.gmsversion=4.1_r4 \ No newline at end of file diff --git a/vendorsetup.sh b/vendorsetup.sh new file mode 100644 index 0000000..405318e --- /dev/null +++ b/vendorsetup.sh @@ -0,0 +1,3 @@ +for i in eng userdebug user; do + add_lunch_combo cm_kylepro-${i} +done