From 58832cd7dd98ce860445d1f7fe98a5728dee41fc Mon Sep 17 00:00:00 2001 From: messi2050 Date: Wed, 6 Apr 2016 12:46:06 +0200 Subject: [PATCH] Initial Bring Up Signed-off-by: Apavayan --- Android.mk | 21 + BoardConfig.mk | 173 + audio/Android.mk | 36 + audio/audio_hw.c | 1812 ++++++ audio/ril_interface.c | 208 + audio/ril_interface.h | 53 + audio/routing.h | 277 + bluetooth/bdroid_buildcfg.h | 23 + bluetooth/bt_vendor.conf | 2 + bluetooth/libbt_vndcfg.txt | 7 + cm.dependencies | 26 + cm.mk | 30 + configs/audio_policy.conf | 129 + configs/gps.conf | 5 + configs/media_codecs.xml | 255 + configs/media_profiles.xml | 537 ++ configs/mixer_paths.xml | 2967 +++++++++ configs/p2p_supplicant_overlay.conf | 14 + configs/wpa_supplicant_overlay.conf | 3 + device.mk | 151 + dtb.img | Bin 0 -> 303104 bytes extract-files.sh | 18 + idc/Synaptics_HID_TouchPad.idc | 59 + include/camera/CameraParametersExtra.h | 79 + include/hardware/gps.h | 1889 ++++++ include/hardware/gralloc.h | 427 ++ include/telephony/ril.h | 5419 +++++++++++++++++ .../base/core/res/res/values/cm_arrays.xml | 32 + .../base/core/res/res/values/config.xml | 292 + .../base/core/res/res/xml/power_profile.xml | 58 + .../packages/apps/Mms/res/xml/mms_config.xml | 38 + .../services/Telephony/res/values/config.xml | 26 + proprietary-files.txt | 265 + ril/sbin/cbd | Bin 0 -> 369856 bytes .../android/internal/telephony/SlteRIL.java | 399 ++ rootdir/Android.mk | 80 + rootdir/etc/fstab.samsungexynos7580 | 15 + rootdir/etc/init.baseband.rc | 58 + rootdir/etc/init.rilchip.rc | 40 + rootdir/etc/init.rilcommon.rc | 39 + rootdir/etc/init.samsung.rc | 455 ++ rootdir/etc/init.samsungexynos7580.rc | 1155 ++++ rootdir/etc/init.samsungexynos7580.usb.rc | 268 + rootdir/etc/init.sec.boot.sh | 12 + rootdir/etc/init.wifi.rc | 121 + rootdir/etc/ueventd.samsungexynos7580.rc | 152 + sepolicy/bluetooth.te | 5 + sepolicy/cpboot-daemon.te | 38 + sepolicy/device.te | 17 + sepolicy/domain.te | 1 + sepolicy/file.te | 20 + sepolicy/file_contexts | 97 + sepolicy/fsck.te | 2 + sepolicy/gpsd.te | 22 + sepolicy/healthd.te | 3 + sepolicy/init.te | 16 + sepolicy/kernel.te | 10 + sepolicy/macloader.te | 27 + sepolicy/mediaserver.te | 10 + sepolicy/modemloader.te | 8 + sepolicy/netd.te | 1 + sepolicy/recovery.te | 66 + sepolicy/rild.te | 36 + sepolicy/system_server.te | 19 + sepolicy/ueventd.te | 5 + sepolicy/uncrypt.te | 2 + sepolicy/vold.te | 5 + sepolicy/wifiloader.te | 8 + sepolicy/wpa.te | 9 + setup-makefiles.sh | 113 + system.prop | 35 + vendorsetup.sh | 2 + 72 files changed, 18702 insertions(+) create mode 100644 Android.mk create mode 100644 BoardConfig.mk create mode 100644 audio/Android.mk create mode 100644 audio/audio_hw.c create mode 100644 audio/ril_interface.c create mode 100644 audio/ril_interface.h create mode 100644 audio/routing.h create mode 100644 bluetooth/bdroid_buildcfg.h create mode 100644 bluetooth/bt_vendor.conf create mode 100644 bluetooth/libbt_vndcfg.txt create mode 100644 cm.dependencies create mode 100644 cm.mk create mode 100644 configs/audio_policy.conf create mode 100644 configs/gps.conf create mode 100644 configs/media_codecs.xml create mode 100644 configs/media_profiles.xml create mode 100644 configs/mixer_paths.xml create mode 100644 configs/p2p_supplicant_overlay.conf create mode 100644 configs/wpa_supplicant_overlay.conf create mode 100644 device.mk create mode 100644 dtb.img create mode 100644 extract-files.sh create mode 100644 idc/Synaptics_HID_TouchPad.idc create mode 100644 include/camera/CameraParametersExtra.h create mode 100644 include/hardware/gps.h create mode 100644 include/hardware/gralloc.h create mode 100644 include/telephony/ril.h create mode 100644 overlay/frameworks/base/core/res/res/values/cm_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/packages/apps/Mms/res/xml/mms_config.xml create mode 100644 overlay/packages/services/Telephony/res/values/config.xml create mode 100644 proprietary-files.txt create mode 100644 ril/sbin/cbd create mode 100644 ril/telephony/java/com/android/internal/telephony/SlteRIL.java create mode 100644 rootdir/Android.mk create mode 100644 rootdir/etc/fstab.samsungexynos7580 create mode 100644 rootdir/etc/init.baseband.rc create mode 100644 rootdir/etc/init.rilchip.rc create mode 100644 rootdir/etc/init.rilcommon.rc create mode 100644 rootdir/etc/init.samsung.rc create mode 100644 rootdir/etc/init.samsungexynos7580.rc create mode 100644 rootdir/etc/init.samsungexynos7580.usb.rc create mode 100644 rootdir/etc/init.sec.boot.sh create mode 100644 rootdir/etc/init.wifi.rc create mode 100644 rootdir/etc/ueventd.samsungexynos7580.rc create mode 100644 sepolicy/bluetooth.te create mode 100644 sepolicy/cpboot-daemon.te create mode 100644 sepolicy/device.te create mode 100644 sepolicy/domain.te create mode 100644 sepolicy/file.te create mode 100644 sepolicy/file_contexts create mode 100644 sepolicy/fsck.te create mode 100644 sepolicy/gpsd.te create mode 100644 sepolicy/healthd.te create mode 100644 sepolicy/init.te create mode 100644 sepolicy/kernel.te create mode 100644 sepolicy/macloader.te create mode 100644 sepolicy/mediaserver.te create mode 100644 sepolicy/modemloader.te create mode 100644 sepolicy/netd.te create mode 100644 sepolicy/recovery.te create mode 100644 sepolicy/rild.te create mode 100644 sepolicy/system_server.te create mode 100644 sepolicy/ueventd.te create mode 100644 sepolicy/uncrypt.te create mode 100644 sepolicy/vold.te create mode 100644 sepolicy/wifiloader.te create mode 100644 sepolicy/wpa.te create mode 100644 setup-makefiles.sh create mode 100644 system.prop create mode 100644 vendorsetup.sh diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..2a19b7b --- /dev/null +++ b/Android.mk @@ -0,0 +1,21 @@ +# +# Copyright (C) 2016 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) + +ifneq ($(filter j7eltexx,$(TARGET_DEVICE)),) +include $(call all-subdir-makefiles,$(LOCAL_PATH)) +endif diff --git a/BoardConfig.mk b/BoardConfig.mk new file mode 100644 index 0000000..4184c41 --- /dev/null +++ b/BoardConfig.mk @@ -0,0 +1,173 @@ +# +# Copyright (C) 2016 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. +# + +TARGET_OTA_ASSERT_DEVICE := j7e3g,j7e3gxx,j7elte,j7eltexx + +LOCAL_PATH := device/samsung/j7eltexx + +BOARD_VENDOR := samsung + +# Include path +TARGET_SPECIFIC_HEADER_PATH := $(LOCAL_PATH)/include + +# CPU +TARGET_ARCH := arm +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_CPU_VARIANT := cortex-a15 + +# Bluetooth +BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(LOCAL_PATH)/bluetooth +BOARD_BLUEDROID_VENDOR_CONF := $(LOCAL_PATH)/bluetooth/libbt_vndcfg.txt +BOARD_HAVE_BLUETOOTH := true +BOARD_HAVE_BLUETOOTH_BCM := true +BOARD_HAVE_SAMSUNG_BLUETOOTH := true + +# Bootloader +TARGET_BOOTLOADER_BOARD_NAME := universal7580 +TARGET_NO_BOOTLOADER := true + +# Exynos display +BOARD_USES_VIRTUAL_DISPLAY := true + +# FIMG2D +BOARD_USES_SKIA_FIMGAPI := true + +# Include an expanded selection of fonts +EXTENDED_FONT_FOOTPRINT := true + +# Graphics +USE_OPENGL_RENDERER := true +NUM_FRAMEBUFFER_SURFACE_BUFFERS := 5 + +# (G)SCALER +BOARD_USES_SCALER := true +BOARD_USES_DT := true + +# HWCServices +#BOARD_USES_HWC_SERVICES := true + +# HDMI +BOARD_HDMI_INCAPABLE := true +BOARD_USES_GSC_VIDEO := true + +# Samsung LSI OpenMAX +COMMON_GLOBAL_CFLAGS += -DUSE_NATIVE_SEC_NV12TILED + +# Samsung OpenMAX Video +BOARD_USE_STOREMETADATA := true +BOARD_USE_METADATABUFFERTYPE := true +BOARD_USE_DMA_BUF := true +BOARD_USE_ANB_OUTBUF_SHARE := true +BOARD_USE_IMPROVED_BUFFER := true +BOARD_USE_NON_CACHED_GRAPHICBUFFER := true +BOARD_USE_GSC_RGB_ENCODER := true +BOARD_USE_CSC_HW := true +BOARD_USE_QOS_CTRL := false +BOARD_USE_VP8ENC_SUPPORT := true + +# PowerHAL +TARGET_POWERHAL_VARIANT := samsung + +# Samsung Seiren audio +BOARD_USE_ALP_AUDIO := true +BOARD_USE_SEIREN_AUDIO := true + +# Kernel +TARGET_KERNEL_ARCH := arm64 +TARGET_KERNEL_HEADER_ARCH := arm64 +TARGET_KERNEL_CROSS_COMPILE_PREFIX := aarch64-linux-android- +KERNEL_TOOLCHAIN := $(ANDROID_BUILD_TOP)/prebuilts/gcc/$(HOST_OS)-x86/aarch64/aarch64-linux-android-4.9/bin +BOARD_KERNEL_BASE := 0x10000000 +BOARD_KERNEL_IMAGE_NAME := Image +BOARD_KERNEL_PAGESIZE := 2048 +BOARD_MKBOOTIMG_ARGS := --kernel_offset 0x00008000 --ramdisk_offset 0x01000000 --tags_offset 0x00000100 --dt $(LOCAL_PATH)/dtb.img +TARGET_KERNEL_CONFIG := cyanogenmod_j7elte_defconfig +TARGET_KERNEL_SOURCE := kernel/samsung/exynos7580 +TARGET_USES_UNCOMPRESSED_KERNEL := true + +# Partitions +TARGET_USERIMAGES_USE_EXT4 := true +TARGET_USERIMAGES_USE_F2FS := true +BOARD_BOOTIMAGE_PARTITION_SIZE := 29360128 +BOARD_CACHEIMAGE_PARTITION_SIZE := 104857600 +BOARD_RECOVERYIMAGE_PARTITION_SIZE := 35651584 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 1887436800 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 13514047488 +BOARD_FLASH_BLOCK_SIZE := 131072 + +# Recovery +TARGET_RECOVERY_FSTAB := $(LOCAL_PATH)/rootdir/etc/fstab.samsungexynos7580 + +# Platform +TARGET_BOARD_PLATFORM := exynos5 +TARGET_SOC := exynos7580 +TARGET_SLSI_VARIANT := cm + +# Radio +#SIM_COUNT := 2 +BOARD_PROVIDES_LIBRIL := true +BOARD_MODEM_TYPE := tss310 +BOARD_RIL_CLASS := ../../../$(LOCAL_PATH)/ril +TARGET_IGNORE_RO_BOOT_REVISION := true +#TARGET_GLOBAL_CFLAGS += -DANDROID_MULTI_SIM +#TARGET_GLOBAL_CPPFLAGS += -DANDROID_MULTI_SIM + +# Recovery +BOARD_HAS_NO_SELECT_BUTTON := true +BOARD_HAS_LARGE_FILESYSTEM := true +BOARD_HAS_NO_MISC_PARTITION := true +BOARD_USE_CUSTOM_RECOVERY_FONT := \"roboto_23x41.h\" +BOARD_SUPPRESS_SECURE_ERASE := true +BOARD_HAS_DOWNLOAD_MODE := true + +# Charger/Healthd +BOARD_CHARGING_MODE_BOOTING_LPM := /sys/class/power_supply/battery/batt_lp_charging +BOARD_CHARGER_ENABLE_SUSPEND := true +BOARD_CHARGER_DISABLE_INIT_BLANK := true +BOARD_CHARGER_SHOW_PERCENTAGE := true +BACKLIGHT_PATH := "/sys/class/backlight/panel/brightness" +CHARGING_ENABLED_PATH := /sys/class/power_supply/battery/batt_lp_charging + +# SELinux +BOARD_SEPOLICY_DIRS := \ + device/samsung/j7eltexx/sepolicy + +# Renderscript +BOARD_OVERRIDE_RS_CPU_VARIANT_32 := cortex-a53 + +# Sensors +TARGET_NO_SENSOR_PERMISSION_CHECK := true + +# WEBGL +ENABLE_WEBGL := true + +# Wifi +BOARD_HAVE_SAMSUNG_WIFI := true +BOARD_WLAN_DEVICE := bcmdhd +WPA_SUPPLICANT_VERSION := VER_0_8_X +BOARD_WPA_SUPPLICANT_DRIVER := NL80211 +BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_bcmdhd +BOARD_HOSTAPD_DRIVER := NL80211 +BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_bcmdhd +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_BAND := 802_11_ABG + +# inherit from the proprietary version +-include vendor/samsung/j7e3gxx/BoardConfigVendor.mk diff --git a/audio/Android.mk b/audio/Android.mk new file mode 100644 index 0000000..081c130 --- /dev/null +++ b/audio/Android.mk @@ -0,0 +1,36 @@ +# 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) + +# Audio HAL +include $(CLEAR_VARS) + +LOCAL_MODULE := audio.primary.$(TARGET_BOOTLOADER_BOARD_NAME) +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := audio_hw.c ril_interface.c + +LOCAL_C_INCLUDES += \ + external/tinyalsa/include \ + $(call include-path-for, audio-effects) \ + $(call include-path-for, audio-utils) \ + $(call include-path-for, audio-route) \ + hardware/samsung/ril/libsecril-client + +LOCAL_SHARED_LIBRARIES := liblog libcutils libtinyalsa libaudioutils libdl \ + libaudioroute libsecril-client + +include $(BUILD_SHARED_LIBRARY) diff --git a/audio/audio_hw.c b/audio/audio_hw.c new file mode 100644 index 0000000..e1af539 --- /dev/null +++ b/audio/audio_hw.c @@ -0,0 +1,1812 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * Copyright (C) 2012 Wolfson Microelectronics plc + * Copyright (C) 2013 The CyanogenMod Project + * Daniel Hillenbrand + * Guillaume "XpLoDWilD" Lesniak + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "audio_hw_primary" +#define LOG_NDEBUG 0 + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include + +#include + +#include +#include + +#include "routing.h" + +#include "ril_interface.h" + +#define PCM_CARD 0 +#define PCM_CARD_SPDIF 1 +#define PCM_TOTAL 2 + +#define PCM_DEVICE 0 +#define PCM_DEVICE_VOICE 1 +#define PCM_DEVICE_SCO 2 +#define PCM_DEVICE_DEEP 3 +#define PCM_DEVICE_PLAYBACK 6 + +#define MIXER_CARD 0 + +#define CAPTURE_START_RAMP_MS 100 + +#define MAX_SUPPORTED_CHANNEL_MASKS 1 + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a[0]))) + +struct pcm_config pcm_config = { + .channels = 2, + .rate = 48000, + .period_size = 256, + .period_count = 2, + .format = PCM_FORMAT_S16_LE, +}; + +struct pcm_config pcm_config_deep = { + .channels = 2, + .rate = 48000, + .period_size = 1024, + .period_count = 2, + .format = PCM_FORMAT_S16_LE, +}; + +struct pcm_config pcm_config_in = { + .channels = 2, + .rate = 48000, + .period_size = 1024, + .period_count = 2, + .format = PCM_FORMAT_S16_LE, +}; + +struct pcm_config pcm_config_in_low_latency = { + .channels = 2, + .rate = 48000, + .period_size = 256, + .period_count = 2, + .format = PCM_FORMAT_S16_LE, +}; + +struct pcm_config pcm_config_sco = { + .channels = 1, + .rate = 8000, + .period_size = 128, + .period_count = 2, + .format = PCM_FORMAT_S16_LE, +}; + +struct pcm_config pcm_config_voice = { + .channels = 2, + .rate = 16000, + .period_size = 2048, + .period_count = 6, + .format = PCM_FORMAT_S16_LE, +}; + +enum output_type { + OUTPUT_DEEP_BUF, + OUTPUT_LOW_LATENCY, + OUTPUT_TOTAL +}; + +struct audio_device { + struct audio_hw_device hw_device; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + audio_devices_t out_device; + audio_devices_t in_device; + bool mic_mute; + struct audio_route *ar; + audio_source_t input_source; + int cur_route_id; /* current route ID: combination of input source + * and output device IDs */ + audio_mode_t mode; + + audio_channel_mask_t in_channel_mask; + + /* Call audio */ + struct pcm *pcm_voice_rx; + struct pcm *pcm_voice_tx; + + /* SCO audio */ + struct pcm *pcm_sco_rx; + struct pcm *pcm_sco_tx; + + float voice_volume; + bool in_call; + bool tty_mode; + bool bluetooth_nrec; + bool wb_amr; + bool two_mic_control; + + /* RIL */ + struct ril_handle ril; + + struct stream_out *outputs[OUTPUT_TOTAL]; + pthread_mutex_t lock_outputs; /* see note below on mutex acquisition order */ +}; + +struct stream_out { + struct audio_stream_out stream; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + struct pcm *pcm[PCM_TOTAL]; + struct pcm_config config; + unsigned int pcm_device; + bool standby; /* true if all PCMs are inactive */ + audio_devices_t device; + + audio_channel_mask_t channel_mask; + /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */ + audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1]; + uint64_t written; /* total frames written, not cleared when entering standby */ + + struct audio_device *dev; +}; + +struct stream_in { + struct audio_stream_in stream; + + pthread_mutex_t lock; /* see note below on mutex acquisition order */ + struct pcm *pcm; + bool standby; + + unsigned int requested_rate; + struct resampler_itfe *resampler; + struct resampler_buffer_provider buf_provider; + int16_t *buffer; + size_t frames_in; + int read_status; + + audio_source_t input_source; + audio_io_handle_t io_handle; + audio_devices_t device; + + uint16_t ramp_vol; + uint16_t ramp_step; + size_t ramp_frames; + + audio_channel_mask_t channel_mask; + audio_input_flags_t flags; + struct pcm_config *config; + + struct audio_device *dev; +}; + +#define STRING_TO_ENUM(string) { #string, string } + +struct string_to_enum { + const char *name; + uint32_t value; +}; + +const struct string_to_enum out_channels_name_to_enum_table[] = { + STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO), + STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1), + STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1), +}; + +/* Do we need to enforce wideband audio? */ +static void force_wideband(struct audio_device *adev) +{ + adev->wb_amr = 1; +} + +/* Routing functions */ + +static int get_output_device_id(audio_devices_t device) +{ + if (device == AUDIO_DEVICE_NONE) + return OUT_DEVICE_NONE; + + if (popcount(device) == 2) { + if ((device == (AUDIO_DEVICE_OUT_SPEAKER | + AUDIO_DEVICE_OUT_WIRED_HEADSET)) || + (device == (AUDIO_DEVICE_OUT_SPEAKER | + AUDIO_DEVICE_OUT_WIRED_HEADPHONE))) + return OUT_DEVICE_SPEAKER_AND_HEADSET; + else if (device == (AUDIO_DEVICE_OUT_SPEAKER | + AUDIO_DEVICE_OUT_EARPIECE)) + return OUT_DEVICE_SPEAKER_AND_EARPIECE; + else + return OUT_DEVICE_NONE; + } + + if (popcount(device) != 1) + return OUT_DEVICE_NONE; + + switch (device) { + case AUDIO_DEVICE_OUT_SPEAKER: + return OUT_DEVICE_SPEAKER; + case AUDIO_DEVICE_OUT_EARPIECE: + return OUT_DEVICE_EARPIECE; + case AUDIO_DEVICE_OUT_WIRED_HEADSET: + return OUT_DEVICE_HEADSET; + case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: + return OUT_DEVICE_HEADPHONES; + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO: + return OUT_DEVICE_BT_SCO; + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET: + return OUT_DEVICE_BT_SCO_HEADSET_OUT; + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT: + return OUT_DEVICE_BT_SCO_CARKIT; + default: + return OUT_DEVICE_NONE; + } +} + +static int get_input_source_id(audio_source_t source, bool wb_amr) +{ + switch (source) { + case AUDIO_SOURCE_DEFAULT: + return IN_SOURCE_NONE; + case AUDIO_SOURCE_MIC: + return IN_SOURCE_MIC; + case AUDIO_SOURCE_CAMCORDER: + return IN_SOURCE_CAMCORDER; + case AUDIO_SOURCE_VOICE_RECOGNITION: + return IN_SOURCE_VOICE_RECOGNITION; + case AUDIO_SOURCE_VOICE_COMMUNICATION: + return IN_SOURCE_VOICE_COMMUNICATION; + case AUDIO_SOURCE_VOICE_CALL: + return IN_SOURCE_VOICE_CALL; + default: + return IN_SOURCE_NONE; + } +} + +static void adev_set_call_audio_path(struct audio_device *adev); + +/* + * NOTE: when multiple mutexes have to be acquired, always take the + * audio_device mutex first, followed by the stream_in and/or + * stream_out mutexes. + */ + +/* must be called with hw device mutex locked */ +static void select_devices(struct audio_device *adev) +{ + int output_device_id = get_output_device_id(adev->out_device); + int input_source_id = get_input_source_id(adev->input_source, adev->wb_amr); + const char *output_route = NULL; + const char *input_route = NULL; + int new_route_id; + + audio_route_reset(adev->ar); + + new_route_id = (1 << (input_source_id + OUT_DEVICE_CNT)) + (1 << output_device_id); + if (new_route_id == adev->cur_route_id) + return; + adev->cur_route_id = new_route_id; + + if (input_source_id != IN_SOURCE_NONE) { + if (output_device_id != OUT_DEVICE_NONE) { + input_route = + route_configs[input_source_id][output_device_id]->input_route; + output_route = + route_configs[input_source_id][output_device_id]->output_route; + } else { + switch(adev->in_device) { + case AUDIO_DEVICE_IN_WIRED_HEADSET & ~AUDIO_DEVICE_BIT_IN: + output_device_id = OUT_DEVICE_HEADSET; + break; + case AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET & ~AUDIO_DEVICE_BIT_IN: + output_device_id = OUT_DEVICE_BT_SCO_HEADSET_OUT; + break; + default: + output_device_id = OUT_DEVICE_SPEAKER; + break; + } + input_route = + route_configs[input_source_id][output_device_id]->input_route; + } + } else { + if (output_device_id != OUT_DEVICE_NONE) { + output_route = + route_configs[IN_SOURCE_MIC][output_device_id]->output_route; + } + } + ALOGV("select_devices() devices %#x input src %d output route %s input route %s", + adev->out_device, adev->input_source, + output_route ? output_route : "none", + input_route ? input_route : "none"); + + if (output_route) + audio_route_apply_path(adev->ar, output_route); + if (input_route) + audio_route_apply_path(adev->ar, input_route); + + audio_route_update_mixer(adev->ar); + + /* FIXME: Turn on two mic control for earpiece and speaker */ +/* if (input_source_id != IN_SOURCE_NONE) { + switch (output_device_id) { + case OUT_DEVICE_EARPIECE: + case OUT_DEVICE_SPEAKER: + adev->two_mic_control = true; + break; + default: + adev->two_mic_control = false; + break; + } + } + + if (adev->two_mic_control) { + ALOGV("%s: enabling two mic control", __func__); + ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_ON); + } else { + ALOGV("%s: disabling two mic control", __func__); + ril_set_two_mic_control(&adev->ril, AUDIENCE, TWO_MIC_SOLUTION_OFF); + }*/ + + adev->two_mic_control = false; + + adev_set_call_audio_path(adev); +} + +/* BT SCO functions */ + +/* must be called with hw device mutex locked, OK to hold other mutexes */ +static void start_bt_sco(struct audio_device *adev) +{ + if (adev->pcm_sco_rx || adev->pcm_sco_tx) { + ALOGW("%s: SCO PCMs already open!\n", __func__); + return; + } + + ALOGV("%s: Opening SCO PCMs", __func__); + + adev->pcm_sco_rx = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_OUT | PCM_MONOTONIC, + &pcm_config_sco); + if (adev->pcm_sco_rx && !pcm_is_ready(adev->pcm_sco_rx)) { + ALOGE("%s: cannot open PCM SCO RX stream: %s", + __func__, pcm_get_error(adev->pcm_sco_rx)); + goto err_sco_rx; + } + + adev->pcm_sco_tx = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_IN, + &pcm_config_sco); + if (adev->pcm_sco_tx && !pcm_is_ready(adev->pcm_sco_tx)) { + ALOGE("%s: cannot open PCM SCO TX stream: %s", + __func__, pcm_get_error(adev->pcm_sco_tx)); + goto err_sco_tx; + } + + pcm_start(adev->pcm_sco_rx); + pcm_start(adev->pcm_sco_tx); + + return; + +err_sco_tx: + pcm_close(adev->pcm_sco_tx); + adev->pcm_sco_tx = NULL; +err_sco_rx: + pcm_close(adev->pcm_sco_rx); + adev->pcm_sco_rx = NULL; +} + +/* must be called with hw device mutex locked, OK to hold other mutexes */ +static void end_bt_sco(struct audio_device *adev) +{ + ALOGV("%s: Closing SCO PCMs", __func__); + + if (adev->pcm_sco_rx) { + pcm_stop(adev->pcm_sco_rx); + pcm_close(adev->pcm_sco_rx); + adev->pcm_sco_rx = NULL; + } + + if (adev->pcm_sco_tx) { + pcm_stop(adev->pcm_sco_tx); + pcm_close(adev->pcm_sco_tx); + adev->pcm_sco_tx = NULL; + } +} + +/* Samsung RIL functions */ + +/* must be called with hw device mutex locked, OK to hold other mutexes */ +static int start_voice_call(struct audio_device *adev) +{ + struct pcm_config *voice_config; + + if (adev->pcm_voice_rx || adev->pcm_voice_tx) { + ALOGW("%s: Voice PCMs already open!\n", __func__); + return 0; + } + + ALOGV("%s: Opening voice PCMs", __func__); + + voice_config = &pcm_config_voice; + + /* Open modem PCM channels */ + adev->pcm_voice_rx = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_OUT | PCM_MONOTONIC, + voice_config); + if (adev->pcm_voice_rx && !pcm_is_ready(adev->pcm_voice_rx)) { + ALOGE("%s: cannot open PCM voice RX stream: %s", + __func__, pcm_get_error(adev->pcm_voice_rx)); + goto err_voice_rx; + } + + adev->pcm_voice_tx = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_IN, + voice_config); + if (adev->pcm_voice_tx && !pcm_is_ready(adev->pcm_voice_tx)) { + ALOGE("%s: cannot open PCM voice TX stream: %s", + __func__, pcm_get_error(adev->pcm_voice_tx)); + goto err_voice_tx; + } + + pcm_start(adev->pcm_voice_rx); + pcm_start(adev->pcm_voice_tx); + + /* start SCO stream if needed */ + if (adev->out_device & AUDIO_DEVICE_OUT_ALL_SCO) + start_bt_sco(adev); + + return 0; + +err_voice_tx: + pcm_close(adev->pcm_voice_tx); + adev->pcm_voice_tx = NULL; +err_voice_rx: + pcm_close(adev->pcm_voice_rx); + adev->pcm_voice_rx = NULL; + + return -ENOMEM; +} + +/* must be called with hw device mutex locked, OK to hold other mutexes */ +static void stop_voice_call(struct audio_device *adev) +{ + int status = 0; + + ALOGV("%s: Closing active PCMs", __func__); + + if (adev->pcm_voice_rx) { + pcm_stop(adev->pcm_voice_rx); + pcm_close(adev->pcm_voice_rx); + adev->pcm_voice_rx = NULL; + status++; + } + + if (adev->pcm_voice_tx) { + pcm_stop(adev->pcm_voice_tx); + pcm_close(adev->pcm_voice_tx); + adev->pcm_voice_tx = NULL; + status++; + } + + /* end SCO stream if needed */ + if (adev->out_device & AUDIO_DEVICE_OUT_ALL_SCO) + end_bt_sco(adev); + + ALOGV("%s: Successfully closed %d active PCMs", __func__, status); +} + +static void adev_set_wb_amr_callback(void *data, int enable) +{ + struct audio_device *adev = (struct audio_device *)data; + + pthread_mutex_lock(&adev->lock); + if (adev->wb_amr != enable) { + adev->wb_amr = enable; + + /* reopen the modem PCMs at the new rate */ + if (adev->in_call) { + ALOGV("%s: %s Incall Wide Band support", + __func__, + enable ? "Turn on" : "Turn off"); + + stop_voice_call(adev); + select_devices(adev); + start_voice_call(adev); + } + } + pthread_mutex_unlock(&adev->lock); +} + +static void adev_set_call_audio_path(struct audio_device *adev) +{ + enum _AudioPath device_type; + + switch(adev->out_device) { + case AUDIO_DEVICE_OUT_SPEAKER: + device_type = SOUND_AUDIO_PATH_SPEAKER; + break; + case AUDIO_DEVICE_OUT_EARPIECE: + device_type = SOUND_AUDIO_PATH_HANDSET; + break; + case AUDIO_DEVICE_OUT_WIRED_HEADSET: + device_type = SOUND_AUDIO_PATH_HEADSET; + break; + case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: + device_type = SOUND_AUDIO_PATH_HEADPHONE; + break; + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO: + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET: + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT: + if (adev->bluetooth_nrec) { + device_type = SOUND_AUDIO_PATH_BLUETOOTH; + } else { + device_type = SOUND_AUDIO_PATH_BLUETOOTH_NO_NR; + } + break; + default: + /* if output device isn't supported, use handset by default */ + device_type = SOUND_AUDIO_PATH_HANDSET; + break; + } + + ALOGV("%s: ril_set_call_audio_path(%d)", __func__, device_type); + + ril_set_call_audio_path(&adev->ril, device_type); +} + +/* must be called with hw device outputs list, output stream, and hw device mutexes locked */ +static int start_output_stream(struct stream_out *out) +{ + struct audio_device *adev = out->dev; + + ALOGV("%s: starting stream", __func__); + + if (out->device & (AUDIO_DEVICE_OUT_SPEAKER | + AUDIO_DEVICE_OUT_WIRED_HEADSET | + AUDIO_DEVICE_OUT_WIRED_HEADPHONE | + AUDIO_DEVICE_OUT_AUX_DIGITAL | + AUDIO_DEVICE_OUT_ALL_SCO)) { + out->pcm[PCM_CARD] = pcm_open(PCM_CARD, out->pcm_device, + PCM_OUT | PCM_MONOTONIC, &out->config); + + if (out->pcm[PCM_CARD] && !pcm_is_ready(out->pcm[PCM_CARD])) { + ALOGE("pcm_open(PCM_CARD) failed: %s", + pcm_get_error(out->pcm[PCM_CARD])); + pcm_close(out->pcm[PCM_CARD]); + return -ENOMEM; + } + } + + if (out->device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) { + out->pcm[PCM_CARD_SPDIF] = pcm_open(PCM_CARD_SPDIF, out->pcm_device, + PCM_OUT | PCM_MONOTONIC, &out->config); + + if (out->pcm[PCM_CARD_SPDIF] && + !pcm_is_ready(out->pcm[PCM_CARD_SPDIF])) { + ALOGE("pcm_open(PCM_CARD_SPDIF) failed: %s", + pcm_get_error(out->pcm[PCM_CARD_SPDIF])); + pcm_close(out->pcm[PCM_CARD_SPDIF]); + return -ENOMEM; + } + } + + /* in call routing must go through set_parameters */ + if (!adev->in_call) { + adev->out_device |= out->device; + select_devices(adev); + } + + ALOGV("%s: stream out device: %d, actual: %d", + __func__, out->device, adev->out_device); + + return 0; +} + +/* must be called with input stream and hw device mutexes locked */ +static int start_input_stream(struct stream_in *in) +{ + struct audio_device *adev = in->dev; + + in->pcm = pcm_open(PCM_CARD, PCM_DEVICE, PCM_IN, in->config); + + if (in->pcm && !pcm_is_ready(in->pcm)) { + ALOGE("pcm_open() failed: %s", pcm_get_error(in->pcm)); + pcm_close(in->pcm); + return -ENOMEM; + } + + /* if no supported sample rate is available, use the resampler */ + if (in->resampler) + in->resampler->reset(in->resampler); + + in->frames_in = 0; + /* in call routing must go through set_parameters */ + if (!adev->in_call) { + adev->input_source = in->input_source; + adev->in_device = in->device; + adev->in_channel_mask = in->channel_mask; + + select_devices(adev); + } + + /* initialize volume ramp */ + in->ramp_frames = (CAPTURE_START_RAMP_MS * in->requested_rate) / 1000; + in->ramp_step = (uint16_t)(USHRT_MAX / in->ramp_frames); + in->ramp_vol = 0; + + return 0; +} + +static size_t get_input_buffer_size(unsigned int sample_rate, + audio_format_t format, + unsigned int channel_count, + bool is_low_latency) +{ + const struct pcm_config *config = is_low_latency ? + &pcm_config_in_low_latency : &pcm_config_in; + size_t size; + + /* + * take resampling into account and return the closest majoring + * multiple of 16 frames, as audioflinger expects audio buffers to + * be a multiple of 16 frames + */ + size = (config->period_size * sample_rate) / config->rate; + size = ((size + 15) / 16) * 16; + + return size * channel_count * audio_bytes_per_sample(format); +} + +static int get_next_buffer(struct resampler_buffer_provider *buffer_provider, + struct resampler_buffer* buffer) +{ + struct stream_in *in; + size_t i; + + if (buffer_provider == NULL || buffer == NULL) + return -EINVAL; + + in = (struct stream_in *)((char *)buffer_provider - + offsetof(struct stream_in, buf_provider)); + + if (in->pcm == NULL) { + buffer->raw = NULL; + buffer->frame_count = 0; + in->read_status = -ENODEV; + return -ENODEV; + } + + if (in->frames_in == 0) { + in->read_status = pcm_read(in->pcm, + (void*)in->buffer, + pcm_frames_to_bytes(in->pcm, in->config->period_size)); + if (in->read_status != 0) { + ALOGE("get_next_buffer() pcm_read error %d", in->read_status); + buffer->raw = NULL; + buffer->frame_count = 0; + return in->read_status; + } + + in->frames_in = in->config->period_size; + + /* Do stereo to mono conversion in place by discarding right channel */ + if (in->channel_mask == AUDIO_CHANNEL_IN_MONO) + for (i = 1; i < in->frames_in; i++) + in->buffer[i] = in->buffer[i * 2]; + } + + buffer->frame_count = (buffer->frame_count > in->frames_in) ? + in->frames_in : buffer->frame_count; + buffer->i16 = in->buffer + + (in->config->period_size - in->frames_in) * + audio_channel_count_from_in_mask(in->channel_mask); + + return in->read_status; + +} + +static void release_buffer(struct resampler_buffer_provider *buffer_provider, + struct resampler_buffer* buffer) +{ + struct stream_in *in; + + if (buffer_provider == NULL || buffer == NULL) + return; + + in = (struct stream_in *)((char *)buffer_provider - + offsetof(struct stream_in, buf_provider)); + + in->frames_in -= buffer->frame_count; +} + +/* read_frames() reads frames from kernel driver, down samples to capture rate + * if necessary and output the number of frames requested to the buffer specified */ +static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames) +{ + ssize_t frames_wr = 0; + size_t frame_size = audio_stream_in_frame_size(&in->stream); + + while (frames_wr < frames) { + size_t frames_rd = frames - frames_wr; + if (in->resampler != NULL) { + in->resampler->resample_from_provider(in->resampler, + (int16_t *)((char *)buffer + + frames_wr * frame_size), + &frames_rd); + } else { + struct resampler_buffer buf = { + { raw : NULL, }, + frame_count : frames_rd, + }; + get_next_buffer(&in->buf_provider, &buf); + if (buf.raw != NULL) { + memcpy((char *)buffer + + frames_wr * frame_size, + buf.raw, + buf.frame_count * frame_size); + frames_rd = buf.frame_count; + } + release_buffer(&in->buf_provider, &buf); + } + /* in->read_status is updated by getNextBuffer() also called by + * in->resampler->resample_from_provider() */ + if (in->read_status != 0) + return in->read_status; + + frames_wr += frames_rd; + } + return frames_wr; +} + +/* API functions */ + +static uint32_t out_get_sample_rate(const struct audio_stream *stream) +{ + struct stream_out *out = (struct stream_out *)stream; + + return out->config.rate; +} + +static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + return -ENOSYS; +} + +static size_t out_get_buffer_size(const struct audio_stream *stream) +{ + struct stream_out *out = (struct stream_out *)stream; + + return out->config.period_size * + audio_stream_out_frame_size((const struct audio_stream_out *)stream); +} + +static audio_channel_mask_t out_get_channels(const struct audio_stream *stream) +{ + struct stream_out *out = (struct stream_out *)stream; + + return out->channel_mask; +} + +static audio_format_t out_get_format(const struct audio_stream *stream) +{ + return AUDIO_FORMAT_PCM_16_BIT; +} + +static int out_set_format(struct audio_stream *stream, audio_format_t format) +{ + return -ENOSYS; +} + +/* Return the set of output devices associated with active streams + * other than out. Assumes out is non-NULL and out->dev is locked. + */ +static audio_devices_t output_devices(struct stream_out *out) +{ + struct audio_device *dev = out->dev; + enum output_type type; + audio_devices_t devices = AUDIO_DEVICE_NONE; + + for (type = 0; type < OUTPUT_TOTAL; ++type) { + struct stream_out *other = dev->outputs[type]; + if (other && (other != out) && !other->standby) { + // TODO no longer accurate + /* safe to access other stream without a mutex, + * because we hold the dev lock, + * which prevents the other stream from being closed + */ + devices |= other->device; + } + } + + return devices; +} + +/* must be called with hw device outputs list, all out streams, and hw device mutex locked */ +static void do_out_standby(struct stream_out *out) +{ + struct audio_device *adev = out->dev; + int i; + + ALOGV("%s: output standby: %d", __func__, out->standby); + + if (!out->standby) { + for (i = 0; i < PCM_TOTAL; i++) { + if (out->pcm[i]) { + pcm_close(out->pcm[i]); + out->pcm[i] = NULL; + } + } + out->standby = true; + +#if 0 + if (out == adev->outputs[OUTPUT_HDMI]) { + /* force standby on low latency output stream so that it can reuse HDMI driver if + * necessary when restarted */ + force_non_hdmi_out_standby(adev); + } +#endif + + /* re-calculate the set of active devices from other streams */ + adev->out_device = output_devices(out); + + /* Skip resetting the mixer if no output device is active */ + if (adev->out_device) + select_devices(adev); + } +} + +/* lock outputs list, all output streams, and device */ +static void lock_all_outputs(struct audio_device *adev) +{ + enum output_type type; + pthread_mutex_lock(&adev->lock_outputs); + for (type = 0; type < OUTPUT_TOTAL; ++type) { + struct stream_out *out = adev->outputs[type]; + if (out) + pthread_mutex_lock(&out->lock); + } + pthread_mutex_lock(&adev->lock); +} + +/* unlock device, all output streams (except specified stream), and outputs list */ +static void unlock_all_outputs(struct audio_device *adev, struct stream_out *except) +{ + /* unlock order is irrelevant, but for cleanliness we unlock in reverse order */ + pthread_mutex_unlock(&adev->lock); + enum output_type type = OUTPUT_TOTAL; + do { + struct stream_out *out = adev->outputs[--type]; + if (out && out != except) + pthread_mutex_unlock(&out->lock); + } while (type != (enum output_type) 0); + pthread_mutex_unlock(&adev->lock_outputs); +} + +static int out_standby(struct audio_stream *stream) +{ + struct stream_out *out = (struct stream_out *)stream; + struct audio_device *adev = out->dev; + + lock_all_outputs(adev); + + do_out_standby(out); + + unlock_all_outputs(adev, NULL); + + return 0; +} + +static int out_dump(const struct audio_stream *stream, int fd) +{ + return 0; +} + +static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + struct stream_out *out = (struct stream_out *)stream; + struct audio_device *adev = out->dev; + struct str_parms *parms; + char value[32]; + int ret; + unsigned int val; + + ALOGV("%s: key value pairs: %s", __func__, kvpairs); + + parms = str_parms_create_str(kvpairs); + + ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, + value, sizeof(value)); + lock_all_outputs(adev); + if (ret >= 0) { + val = atoi(value); + if ((out->device != val) && (val != 0)) { + /* Force standby if moving to/from SPDIF or if the output + * device changes when in SPDIF mode */ + if (((val & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) ^ + (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) || + (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) { + do_out_standby(out); + } + + /* force output standby to start or stop SCO pcm stream if needed */ + if ((val & AUDIO_DEVICE_OUT_ALL_SCO) ^ + (out->device & AUDIO_DEVICE_OUT_ALL_SCO)) { + do_out_standby(out); + } + + out->device = val; + adev->out_device = output_devices(out) | val; + select_devices(adev); + + } + } + unlock_all_outputs(adev, NULL); + + str_parms_destroy(parms); + return ret; +} + +static char * out_get_parameters(const struct audio_stream *stream, const char *keys) +{ + struct stream_out *out = (struct stream_out *)stream; + struct str_parms *query = str_parms_create_str(keys); + char *str; + char value[256]; + struct str_parms *reply = str_parms_create(); + size_t i, j; + int ret; + bool first = true; + + ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value)); + if (ret >= 0) { + value[0] = '\0'; + i = 0; + /* the last entry in supported_channel_masks[] is always 0 */ + while (out->supported_channel_masks[i] != 0) { + for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) { + if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) { + if (!first) { + strcat(value, "|"); + } + strcat(value, out_channels_name_to_enum_table[j].name); + first = false; + break; + } + } + i++; + } + str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value); + str = str_parms_to_str(reply); + } else { + str = strdup(keys); + } + str_parms_destroy(query); + str_parms_destroy(reply); + return str; +} + +static uint32_t out_get_latency(const struct audio_stream_out *stream) +{ + struct stream_out *out = (struct stream_out *)stream; + + return (out->config.period_size * out->config.period_count * 1000) / + out->config.rate; +} + +static int out_set_volume(struct audio_stream_out *stream, float left, + float right) +{ + return -ENOSYS; +} + +static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, + size_t bytes) +{ + int ret = 0; + struct stream_out *out = (struct stream_out *)stream; + struct audio_device *adev = out->dev; + int i; + + /* FIXME This comment is no longer correct + * acquiring hw device mutex systematically is useful if a low + * priority thread is waiting on the output stream mutex - e.g. + * executing out_set_parameters() while holding the hw device + * mutex + */ + pthread_mutex_lock(&out->lock); + if (out->standby) { + pthread_mutex_unlock(&out->lock); + lock_all_outputs(adev); + if (!out->standby) { + unlock_all_outputs(adev, out); + goto false_alarm; + } + ret = start_output_stream(out); + if (ret < 0) { + unlock_all_outputs(adev, NULL); + goto final_exit; + } + out->standby = false; + unlock_all_outputs(adev, out); + } +false_alarm: + + /* Write to all active PCMs */ + for (i = 0; i < PCM_TOTAL; i++) + if (out->pcm[i]) { + ret = pcm_write(out->pcm[i], (void *)buffer, bytes); + if (ret != 0) + break; + } + if (ret == 0) + out->written += bytes / (out->config.channels * sizeof(short)); + +exit: + pthread_mutex_unlock(&out->lock); +final_exit: + + if (ret != 0) { + usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) / + out_get_sample_rate(&stream->common)); + } + + return bytes; +} + +static int out_get_render_position(const struct audio_stream_out *stream, + uint32_t *dsp_frames) +{ + return -EINVAL; +} + +static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) +{ + return 0; +} + +static int out_get_next_write_timestamp(const struct audio_stream_out *stream, + int64_t *timestamp) +{ + return -EINVAL; +} + +static int out_get_presentation_position(const struct audio_stream_out *stream, + uint64_t *frames, struct timespec *timestamp) +{ + struct stream_out *out = (struct stream_out *)stream; + int ret = -1; + + pthread_mutex_lock(&out->lock); + + int i; + // There is a question how to implement this correctly when there is more than one PCM stream. + // We are just interested in the frames pending for playback in the kernel buffer here, + // not the total played since start. The current behavior should be safe because the + // cases where both cards are active are marginal. + for (i = 0; i < PCM_TOTAL; i++) + if (out->pcm[i]) { + size_t avail; + if (pcm_get_htimestamp(out->pcm[i], &avail, timestamp) == 0) { + size_t kernel_buffer_size = out->config.period_size * out->config.period_count; + // FIXME This calculation is incorrect if there is buffering after app processor + int64_t signed_frames = out->written - kernel_buffer_size + avail; + // It would be unusual for this value to be negative, but check just in case ... + if (signed_frames >= 0) { + *frames = signed_frames; + ret = 0; + } + break; + } + } + + pthread_mutex_unlock(&out->lock); + + return ret; +} + +/** audio_stream_in implementation **/ +static uint32_t in_get_sample_rate(const struct audio_stream *stream) +{ + struct stream_in *in = (struct stream_in *)stream; + + return in->requested_rate; +} + +static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) +{ + return 0; +} + +static audio_channel_mask_t in_get_channels(const struct audio_stream *stream) +{ + struct stream_in *in = (struct stream_in *)stream; + + return in->channel_mask; +} + +static size_t in_get_buffer_size(const struct audio_stream *stream) +{ + struct stream_in *in = (struct stream_in *)stream; + + return get_input_buffer_size(in->requested_rate, + AUDIO_FORMAT_PCM_16_BIT, + audio_channel_count_from_in_mask(in_get_channels(stream)), + (in->flags & AUDIO_INPUT_FLAG_FAST) != 0); +} + +static audio_format_t in_get_format(const struct audio_stream *stream) +{ + return AUDIO_FORMAT_PCM_16_BIT; +} + +static int in_set_format(struct audio_stream *stream, audio_format_t format) +{ + return -ENOSYS; +} + +/* must be called with in stream and hw device mutex locked */ +static void do_in_standby(struct stream_in *in) +{ + struct audio_device *adev = in->dev; + + if (!in->standby) { + pcm_close(in->pcm); + in->pcm = NULL; + + if (adev->mode != AUDIO_MODE_IN_CALL) { + in->dev->input_source = AUDIO_SOURCE_DEFAULT; + in->dev->in_device = AUDIO_DEVICE_NONE; + in->dev->in_channel_mask = 0; + select_devices(adev); + } + in->standby = true; + } +} + +static int in_standby(struct audio_stream *stream) +{ + struct stream_in *in = (struct stream_in *)stream; + + pthread_mutex_lock(&in->lock); + pthread_mutex_lock(&in->dev->lock); + + do_in_standby(in); + + pthread_mutex_unlock(&in->dev->lock); + pthread_mutex_unlock(&in->lock); + + return 0; +} + +static int in_dump(const struct audio_stream *stream, int fd) +{ + return 0; +} + +static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) +{ + struct stream_in *in = (struct stream_in *)stream; + struct audio_device *adev = in->dev; + struct str_parms *parms; + char value[32]; + int ret; + unsigned int val; + bool apply_now = false; + + parms = str_parms_create_str(kvpairs); + + pthread_mutex_lock(&in->lock); + pthread_mutex_lock(&adev->lock); + ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, + value, sizeof(value)); + if (ret >= 0) { + val = atoi(value); + /* no audio source uses val == 0 */ + if ((in->input_source != val) && (val != 0)) { + in->input_source = val; + apply_now = !in->standby; + } + } + + ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, + value, sizeof(value)); + if (ret >= 0) { + /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */ + val = atoi(value) & ~AUDIO_DEVICE_BIT_IN; + /* no audio device uses val == 0 */ + if ((in->device != val) && (val != 0)) { + /* force output standby to start or stop SCO pcm stream if needed */ + if ((val & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) ^ + (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) { + do_in_standby(in); + } + in->device = val; + apply_now = !in->standby; + } + } + + if (apply_now) { + adev->input_source = in->input_source; + adev->in_device = in->device; + select_devices(adev); + } + + pthread_mutex_unlock(&adev->lock); + pthread_mutex_unlock(&in->lock); + + str_parms_destroy(parms); + return ret; +} + +static char * in_get_parameters(const struct audio_stream *stream, + const char *keys) +{ + return strdup(""); +} + +static int in_set_gain(struct audio_stream_in *stream, float gain) +{ + return 0; +} + +static void in_apply_ramp(struct stream_in *in, int16_t *buffer, size_t frames) +{ + size_t i; + uint16_t vol = in->ramp_vol; + uint16_t step = in->ramp_step; + + frames = (frames < in->ramp_frames) ? frames : in->ramp_frames; + + if (in->channel_mask == AUDIO_CHANNEL_IN_MONO) { + for (i = 0; i < frames; i++) { + buffer[i] = (int16_t)((buffer[i] * vol) >> 16); + vol += step; + } + } else { + for (i = 0; i < frames; i++) { + buffer[2*i] = (int16_t)((buffer[2*i] * vol) >> 16); + buffer[2*i + 1] = (int16_t)((buffer[2*i + 1] * vol) >> 16); + vol += step; + } + } + + in->ramp_vol = vol; + in->ramp_frames -= frames; +} + +static ssize_t in_read(struct audio_stream_in *stream, void* buffer, + size_t bytes) +{ + int ret = 0; + struct stream_in *in = (struct stream_in *)stream; + struct audio_device *adev = in->dev; + size_t frames_rq = bytes / audio_stream_in_frame_size(stream); + + /* + * acquiring hw device mutex systematically is useful if a low + * priority thread is waiting on the input stream mutex - e.g. + * executing in_set_parameters() while holding the hw device + * mutex + */ + pthread_mutex_lock(&in->lock); + if (in->standby) { + pthread_mutex_lock(&adev->lock); + ret = start_input_stream(in); + pthread_mutex_unlock(&adev->lock); + if (ret < 0) + goto exit; + in->standby = false; + } + + /*if (in->num_preprocessors != 0) + ret = process_frames(in, buffer, frames_rq); + else */ + ret = read_frames(in, buffer, frames_rq); + + if (ret > 0) + ret = 0; + + if (in->ramp_frames > 0) + in_apply_ramp(in, buffer, frames_rq); + + /* + * Instead of writing zeroes here, we could trust the hardware + * to always provide zeroes when muted. + */ + if (ret == 0 && adev->mic_mute) + memset(buffer, 0, bytes); + +exit: + if (ret < 0) + usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) / + in_get_sample_rate(&stream->common)); + + pthread_mutex_unlock(&in->lock); + return bytes; +} + +static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) +{ + return 0; +} + +static int adev_open_output_stream(struct audio_hw_device *dev, + audio_io_handle_t handle, + audio_devices_t devices, + audio_output_flags_t flags, + struct audio_config *config, + struct audio_stream_out **stream_out, + const char *address __unused) +{ + struct audio_device *adev = (struct audio_device *)dev; + struct stream_out *out; + int ret; + enum output_type type; + + out = (struct stream_out *)calloc(1, sizeof(struct stream_out)); + if (!out) + return -ENOMEM; + + out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO; + out->channel_mask = AUDIO_CHANNEL_OUT_STEREO; + if (devices == AUDIO_DEVICE_NONE) + devices = AUDIO_DEVICE_OUT_SPEAKER; + out->device = devices; + + if (flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) { + out->config = pcm_config_deep; + out->pcm_device = PCM_DEVICE_DEEP; + type = OUTPUT_DEEP_BUF; + } else { + out->config = pcm_config; + out->pcm_device = PCM_DEVICE_PLAYBACK; + type = OUTPUT_LOW_LATENCY; + } + + out->stream.common.get_sample_rate = out_get_sample_rate; + out->stream.common.set_sample_rate = out_set_sample_rate; + out->stream.common.get_buffer_size = out_get_buffer_size; + out->stream.common.get_channels = out_get_channels; + out->stream.common.get_format = out_get_format; + out->stream.common.set_format = out_set_format; + out->stream.common.standby = out_standby; + out->stream.common.dump = out_dump; + out->stream.common.set_parameters = out_set_parameters; + out->stream.common.get_parameters = out_get_parameters; + out->stream.common.add_audio_effect = out_add_audio_effect; + out->stream.common.remove_audio_effect = out_remove_audio_effect; + out->stream.get_latency = out_get_latency; + out->stream.set_volume = out_set_volume; + out->stream.write = out_write; + out->stream.get_render_position = out_get_render_position; + out->stream.get_next_write_timestamp = out_get_next_write_timestamp; + out->stream.get_presentation_position = out_get_presentation_position; + + out->dev = adev; + + config->format = out_get_format(&out->stream.common); + config->channel_mask = out_get_channels(&out->stream.common); + config->sample_rate = out_get_sample_rate(&out->stream.common); + + out->standby = true; + /* out->muted = false; by calloc() */ + /* out->written = 0; by calloc() */ + + pthread_mutex_lock(&adev->lock_outputs); + if (adev->outputs[type]) { + pthread_mutex_unlock(&adev->lock_outputs); + ret = -EBUSY; + goto err_open; + } + adev->outputs[type] = out; + pthread_mutex_unlock(&adev->lock_outputs); + + *stream_out = &out->stream; + + return 0; + +err_open: + free(out); + *stream_out = NULL; + return ret; +} + +static void adev_close_output_stream(struct audio_hw_device *dev, + struct audio_stream_out *stream) +{ + struct audio_device *adev; + enum output_type type; + + out_standby(&stream->common); + adev = (struct audio_device *)dev; + pthread_mutex_lock(&adev->lock_outputs); + for (type = 0; type < OUTPUT_TOTAL; type++) { + if (adev->outputs[type] == (struct stream_out *) stream) { + adev->outputs[type] = NULL; + break; + } + } + pthread_mutex_unlock(&adev->lock_outputs); + free(stream); +} + +static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) +{ + struct audio_device *adev = (struct audio_device *)dev; + struct str_parms *parms; + char *str; + char value[32]; + int ret; + + parms = str_parms_create_str(kvpairs); + + ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value)); + if (ret >= 0) { + if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) + adev->bluetooth_nrec = true; + else + adev->bluetooth_nrec = false; + } + + /* FIXME: This does not work with LL, see workaround in this HAL */ + ret = str_parms_get_str(parms, "noise_suppression", value, sizeof(value)); + if (ret >= 0) { + ALOGV("%s: noise_suppression=%s", __func__, value); + + /* value is either off or auto */ +/* if (strcmp(value, "off") == 0) { + adev->two_mic_control = false; + } else { + adev->two_mic_control = true; + }*/ + } + + str_parms_destroy(parms); + return ret; +} + +static char * adev_get_parameters(const struct audio_hw_device *dev, + const char *keys) +{ + return strdup(""); +} + +static int adev_init_check(const struct audio_hw_device *dev) +{ + return 0; +} + +static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) +{ + struct audio_device *adev = (struct audio_device *)dev; + + adev->voice_volume = volume; + + if (adev->mode == AUDIO_MODE_IN_CALL) { + enum _SoundType sound_type; + + switch (adev->out_device) { + case AUDIO_DEVICE_OUT_SPEAKER: + sound_type = SOUND_TYPE_SPEAKER; + break; + case AUDIO_DEVICE_OUT_WIRED_HEADSET: + case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: + sound_type = SOUND_TYPE_HEADSET; + break; + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO: + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET: + case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT: + case AUDIO_DEVICE_OUT_ALL_SCO: + sound_type = SOUND_TYPE_BTVOICE; + break; + default: + sound_type = SOUND_TYPE_VOICE; + } + + ril_set_call_volume(&adev->ril, sound_type, volume); + } + + return 0; +} + +static int adev_set_master_volume(struct audio_hw_device *dev, float volume) +{ + return -ENOSYS; +} + +static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) +{ + struct audio_device *adev = (struct audio_device *)dev; + + if (adev->mode == mode) + return 0; + + pthread_mutex_lock(&adev->lock); + adev->mode = mode; + + if (adev->mode == AUDIO_MODE_IN_CALL) { + ALOGV("%s: Entering IN_CALL mode", __func__); + if (!adev->in_call) { + if (adev->out_device == AUDIO_DEVICE_NONE || + adev->out_device == AUDIO_DEVICE_OUT_SPEAKER) { + adev->out_device = AUDIO_DEVICE_OUT_EARPIECE; + } + adev->input_source = AUDIO_SOURCE_VOICE_CALL; + select_devices(adev); + start_voice_call(adev); + ril_set_call_clock_sync(&adev->ril, SOUND_CLOCK_START); + adev_set_voice_volume(&adev->hw_device, adev->voice_volume); + adev->in_call = true; + } + } else { + ALOGV("%s: Leaving IN_CALL mode", __func__); + if (adev->in_call) { + adev->in_call = false; + stop_voice_call(adev); + ril_set_call_clock_sync(&adev->ril, SOUND_CLOCK_STOP); + adev->input_source = AUDIO_SOURCE_DEFAULT; + select_devices(adev); + } + } + pthread_mutex_unlock(&adev->lock); + + return 0; +} + +static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) +{ + struct audio_device *adev = (struct audio_device *)dev; + enum _MuteCondition mute_condition = state ? TX_MUTE : TX_UNMUTE; + + ALOGV("%s: set mic mute: %d\n", __func__, state); + + if (adev->in_call) { + ril_set_mute(&adev->ril, mute_condition); + } + + adev->mic_mute = state; + + return 0; +} + +static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) +{ + struct audio_device *adev = (struct audio_device *)dev; + + *state = adev->mic_mute; + + return 0; +} + +static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, + const struct audio_config *config) +{ + return get_input_buffer_size(config->sample_rate, config->format, + audio_channel_count_from_in_mask(config->channel_mask), + false /* is_low_latency: since we don't know, be conservative */); +} + +static int adev_open_input_stream(struct audio_hw_device *dev, + audio_io_handle_t handle, + audio_devices_t devices, + struct audio_config *config, + struct audio_stream_in **stream_in, + audio_input_flags_t flags, + const char *address __unused, + audio_source_t source __unused) +{ + struct audio_device *adev = (struct audio_device *)dev; + struct stream_in *in; + int ret; + + *stream_in = NULL; + + /* Respond with a request for stereo if a different format is given. */ + if (config->channel_mask != AUDIO_CHANNEL_IN_STEREO) { + config->channel_mask = AUDIO_CHANNEL_IN_STEREO; + return -EINVAL; + } + + in = (struct stream_in *)calloc(1, sizeof(struct stream_in)); + if (!in) + return -ENOMEM; + + in->stream.common.get_sample_rate = in_get_sample_rate; + in->stream.common.set_sample_rate = in_set_sample_rate; + in->stream.common.get_buffer_size = in_get_buffer_size; + in->stream.common.get_channels = in_get_channels; + in->stream.common.get_format = in_get_format; + in->stream.common.set_format = in_set_format; + in->stream.common.standby = in_standby; + in->stream.common.dump = in_dump; + in->stream.common.set_parameters = in_set_parameters; + in->stream.common.get_parameters = in_get_parameters; + in->stream.set_gain = in_set_gain; + in->stream.read = in_read; + in->stream.get_input_frames_lost = in_get_input_frames_lost; + + in->dev = adev; + in->standby = true; + in->requested_rate = config->sample_rate; + in->input_source = AUDIO_SOURCE_DEFAULT; + /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */ + in->device = devices & ~AUDIO_DEVICE_BIT_IN; + in->io_handle = handle; + in->channel_mask = config->channel_mask; + in->flags = flags; + struct pcm_config *pcm_config = flags & AUDIO_INPUT_FLAG_FAST ? + &pcm_config_in_low_latency : &pcm_config_in; + in->config = pcm_config; + + in->buffer = malloc(pcm_config->period_size * pcm_config->channels + * audio_stream_in_frame_size(&in->stream)); + + if (!in->buffer) { + ret = -ENOMEM; + goto err_malloc; + } + + if (in->requested_rate != pcm_config->rate) { + in->buf_provider.get_next_buffer = get_next_buffer; + in->buf_provider.release_buffer = release_buffer; + + ret = create_resampler(pcm_config->rate, + in->requested_rate, + audio_channel_count_from_in_mask(in->channel_mask), + RESAMPLER_QUALITY_DEFAULT, + &in->buf_provider, + &in->resampler); + if (ret != 0) { + ret = -EINVAL; + goto err_resampler; + } + + ALOGV("%s: Created resampler converting %d -> %d\n", + __func__, pcm_config_in.rate, in->requested_rate); + } + + ALOGV("%s: Requesting input stream with rate: %d, channels: 0x%x\n", + __func__, config->sample_rate, config->channel_mask); + + *stream_in = &in->stream; + return 0; + +err_resampler: + free(in->buffer); +err_malloc: + free(in); + return ret; +} + +static void adev_close_input_stream(struct audio_hw_device *dev, + struct audio_stream_in *stream) +{ + struct stream_in *in = (struct stream_in *)stream; + + in_standby(&stream->common); + if (in->resampler) { + release_resampler(in->resampler); + in->resampler = NULL; + } + free(in->buffer); + free(stream); +} + +static int adev_dump(const audio_hw_device_t *device, int fd) +{ + return 0; +} + +static int adev_close(hw_device_t *device) +{ + struct audio_device *adev = (struct audio_device *)device; + + audio_route_free(adev->ar); + + /* RIL */ + ril_close(&adev->ril); + + free(device); + return 0; +} + +static int adev_open(const hw_module_t* module, const char* name, + hw_device_t** device) +{ + struct audio_device *adev; + int ret; + + if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) + return -EINVAL; + + adev = calloc(1, sizeof(struct audio_device)); + if (!adev) + return -ENOMEM; + + adev->hw_device.common.tag = HARDWARE_DEVICE_TAG; + adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0; + adev->hw_device.common.module = (struct hw_module_t *) module; + adev->hw_device.common.close = adev_close; + + adev->hw_device.init_check = adev_init_check; + adev->hw_device.set_voice_volume = adev_set_voice_volume; + adev->hw_device.set_master_volume = adev_set_master_volume; + adev->hw_device.set_mode = adev_set_mode; + adev->hw_device.set_mic_mute = adev_set_mic_mute; + adev->hw_device.get_mic_mute = adev_get_mic_mute; + adev->hw_device.set_parameters = adev_set_parameters; + adev->hw_device.get_parameters = adev_get_parameters; + adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size; + adev->hw_device.open_output_stream = adev_open_output_stream; + adev->hw_device.close_output_stream = adev_close_output_stream; + adev->hw_device.open_input_stream = adev_open_input_stream; + adev->hw_device.close_input_stream = adev_close_input_stream; + adev->hw_device.dump = adev_dump; + + adev->ar = audio_route_init(MIXER_CARD, NULL); + adev->input_source = AUDIO_SOURCE_DEFAULT; + /* adev->cur_route_id initial value is 0 and such that first device + * selection is always applied by select_devices() */ + + adev->mode = AUDIO_MODE_NORMAL; + adev->voice_volume = 1.0f; + + /* RIL */ + ril_open(&adev->ril); + + /* register callback for wideband AMR setting */ + if (property_get_bool("audio_hal.force_wideband", false)) + force_wideband(adev); + else + ril_register_set_wb_amr_callback(adev_set_wb_amr_callback, (void *)adev); + + *device = &adev->hw_device.common; + + char value[PROPERTY_VALUE_MAX]; + if (property_get("audio_hal.period_size", value, NULL) > 0) { + pcm_config.period_size = atoi(value); + pcm_config_in.period_size = pcm_config.period_size; + } + if (property_get("audio_hal.in_period_size", value, NULL) > 0) + pcm_config_in.period_size = atoi(value); + + return 0; +} + +static struct hw_module_methods_t hal_module_methods = { + .open = adev_open, +}; + +struct audio_module HAL_MODULE_INFO_SYM = { + .common = { + .tag = HARDWARE_MODULE_TAG, + .module_api_version = AUDIO_MODULE_API_VERSION_0_1, + .hal_api_version = HARDWARE_HAL_API_VERSION, + .id = AUDIO_HARDWARE_MODULE_ID, + .name = "Samsung audio HW HAL", + .author = "The CyanogenMod Project", + .methods = &hal_module_methods, + }, +}; diff --git a/audio/ril_interface.c b/audio/ril_interface.c new file mode 100644 index 0000000..59d00e8 --- /dev/null +++ b/audio/ril_interface.c @@ -0,0 +1,208 @@ +/* + * 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. + */ + +#define LOG_TAG "audio_hw_primary" +/*#define LOG_NDEBUG 0*/ + +#include +#include + +#include +#include + +#include "ril_interface.h" + +#define VOLUME_STEPS_DEFAULT "5" +#define VOLUME_STEPS_PROPERTY "ro.config.vc_call_vol_steps" + +/* Audio WB AMR callback */ +void (*_audio_set_wb_amr_callback)(void *, int); +void *callback_data = NULL; + +void ril_register_set_wb_amr_callback(void *function, void *data) +{ + _audio_set_wb_amr_callback = function; + callback_data = data; +} + +/* This is the callback function that the RIL uses to +set the wideband AMR state */ +static int ril_set_wb_amr_callback(void *ril_client __unused, + const void *data, + size_t datalen) +{ + int enable = ((int *)data)[0]; + + if (callback_data == NULL || _audio_set_wb_amr_callback == NULL) { + return -1; + } + + _audio_set_wb_amr_callback(callback_data, enable); + + return 0; +} + +static int ril_connect_if_required(struct ril_handle *ril) +{ + int ok; + int rc; + + ok = isConnected_RILD(ril->client); + if (ok) { + return 0; + } + + rc = Connect_RILD(ril->client); + if (rc != RIL_CLIENT_ERR_SUCCESS) { + ALOGE("Connect_RILD() failed"); + return -1; + } + + return 0; +} + +int ril_open(struct ril_handle *ril) +{ + char property[PROPERTY_VALUE_MAX]; + + if (ril == NULL) { + return -1; + } + + ril->client = OpenClient_RILD(); + if (ril->client == NULL) { + ALOGE("OpenClient_RILD() failed"); + return -1; + } + + /* register the wideband AMR callback */ + RegisterUnsolicitedHandler(ril->client, + RIL_UNSOL_SNDMGR_WB_AMR_REPORT, + (RilOnUnsolicited)ril_set_wb_amr_callback); + + property_get(VOLUME_STEPS_PROPERTY, property, VOLUME_STEPS_DEFAULT); + ril->volume_steps_max = atoi(property); + + /* + * This catches the case where VOLUME_STEPS_PROPERTY does not contain + * an integer + */ + if (ril->volume_steps_max == 0) { + ril->volume_steps_max = atoi(VOLUME_STEPS_DEFAULT); + } + + return 0; +} + +int ril_close(struct ril_handle *ril) +{ + int rc; + + if (ril == NULL || ril->client == NULL) { + return -1; + } + + rc = Disconnect_RILD(ril->client); + if (rc != RIL_CLIENT_ERR_SUCCESS) { + ALOGE("Disconnect_RILD failed"); + return -1; + } + + rc = CloseClient_RILD(ril->client); + if (rc != RIL_CLIENT_ERR_SUCCESS) { + ALOGE("CloseClient_RILD() failed"); + return -1; + } + + return 0; +} + +int ril_set_call_volume(struct ril_handle *ril, + enum _SoundType sound_type, + float volume) +{ + int rc; + + rc = ril_connect_if_required(ril); + if (rc != 0) { + return 0; + } + + rc = SetCallVolume(ril->client, + sound_type, + (int)(volume * ril->volume_steps_max)); + + return rc; +} + +int ril_set_call_audio_path(struct ril_handle *ril, enum _AudioPath path) +{ + int rc; + + rc = ril_connect_if_required(ril); + if (rc != 0) { + return 0; + } + + rc = SetCallAudioPath(ril->client, path); + + return rc; +} + +int ril_set_call_clock_sync(struct ril_handle *ril, + enum _SoundClockCondition condition) +{ + int rc; + + rc = ril_connect_if_required(ril); + if (rc != 0) { + return 0; + } + + rc = SetCallClockSync(ril->client, condition); + + return rc; +} + +int ril_set_mute(struct ril_handle *ril, enum _MuteCondition condition) +{ + int rc; + + rc = ril_connect_if_required(ril); + if (rc != 0) { + return 0; + } + + rc = SetMute(ril->client, condition); + + return rc; +} + +int ril_set_two_mic_control(struct ril_handle *ril, + enum __TwoMicSolDevice device, + enum __TwoMicSolReport report) +{ + int rc; + + rc = ril_connect_if_required(ril); + if (rc != 0) { + return 0; + } + + rc = SetTwoMicControl(ril->client, device, report); + + return rc; +} diff --git a/audio/ril_interface.h b/audio/ril_interface.h new file mode 100644 index 0000000..5e65cc6 --- /dev/null +++ b/audio/ril_interface.h @@ -0,0 +1,53 @@ +/* + * 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. + */ + +#ifndef RIL_INTERFACE_H +#define RIL_INTERFACE_H + +#include +#include "secril-client.h" + +struct ril_handle +{ + void *client; + int volume_steps_max; +}; + + +/* Function prototypes */ +int ril_open(struct ril_handle *ril); + +int ril_close(struct ril_handle *ril); + +int ril_set_call_volume(struct ril_handle *ril, + enum _SoundType sound_type, + float volume); + +int ril_set_call_audio_path(struct ril_handle *ril, + enum _AudioPath path); + +int ril_set_call_clock_sync(struct ril_handle *ril, + enum _SoundClockCondition condition); + +int ril_set_mute(struct ril_handle *ril, enum _MuteCondition condition); + +int ril_set_two_mic_control(struct ril_handle *ril, + enum __TwoMicSolDevice device, + enum __TwoMicSolReport report); + +void ril_register_set_wb_amr_callback(void *function, void *data); + +#endif diff --git a/audio/routing.h b/audio/routing.h new file mode 100644 index 0000000..356f98a --- /dev/null +++ b/audio/routing.h @@ -0,0 +1,277 @@ +/* + * 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. + */ + +#ifndef _ROUTING_H_ +#define _ROUTING_H_ + +enum { + OUT_DEVICE_SPEAKER, + OUT_DEVICE_EARPIECE, + OUT_DEVICE_HEADSET, + OUT_DEVICE_HEADPHONES, + OUT_DEVICE_BT_SCO, + OUT_DEVICE_BT_SCO_HEADSET_OUT, + OUT_DEVICE_BT_SCO_CARKIT, + OUT_DEVICE_SPEAKER_AND_HEADSET, + OUT_DEVICE_SPEAKER_AND_EARPIECE, + OUT_DEVICE_TAB_SIZE, /* number of rows in route_configs[][] */ + OUT_DEVICE_NONE, + OUT_DEVICE_CNT +}; + +enum { + IN_SOURCE_MIC, + IN_SOURCE_CAMCORDER, + IN_SOURCE_VOICE_RECOGNITION, + IN_SOURCE_VOICE_COMMUNICATION, + IN_SOURCE_VOICE_CALL, + IN_SOURCE_VOICE_CALL_WB, + IN_SOURCE_TAB_SIZE, /* number of lines in route_configs[][] */ + IN_SOURCE_NONE, + IN_SOURCE_CNT +}; + +struct route_config { + const char * const output_route; + const char * const input_route; +}; + +const struct route_config voice_speaker = { + "incall_default-speaker", + "incall_nb-speaker-mic" +}; + +const struct route_config voice_speaker_wb = { + "incall_wb-speaker", + "incall_wb-speaker-mic" +}; + +const struct route_config voice_earpiece = { + "incall_default-handset", + "incall_nb-handset-mic" +}; + +const struct route_config voice_earpiece_wb = { + "incall_wb-handset", + "incall_wb-handset-mic" +}; + +const struct route_config voice_headphones = { + "incall_default-headphone", + "incall_default-headphone-mic" +}; + +const struct route_config voice_headphones_wb = { + "incall_wb-headphone", + "incall_wb-headphone-mic" +}; + +const struct route_config voice_headset = { + "incall_default-headset", + "incall_default-headset-mic" +}; + +const struct route_config voice_headset_wb = { + "incall_wb-headset", + "incall_wb-headset-mic" +}; + +const struct route_config voice_bt_sco = { + "incall_default-bt-sco-headset", + "incall_default-bt-sco-headset-in", +}; + +const struct route_config voice_bt_sco_wb = { + "incall_wb-bt-sco-headset", + "incall_wb-bt-sco-headset-in", +}; + +const struct route_config voice_bt_sco_headset_out = { + "incall_default-bt-sco-headset", + "incall_default-bt-sco-headset-in", +}; + +const struct route_config voice_bt_sco_headset_out_wb = { + "incall_wb-bt-sco-headset", + "incall_wb-bt-sco-headset-in", +}; + +const struct route_config media_speaker = { + "media-speaker", + "media-mic" +}; + +const struct route_config media_earpiece = { + "media-handset", + "media-mic" +}; + +const struct route_config media_headphones = { + "media-headset", + "media-headphone-mic" +}; + +const struct route_config media_headset = { + "media-headset", + "media-headset-mic" +}; + +const struct route_config media_bt_sco = { + "media-bt-sco-headset", + "media-bt-sco-headset-in", +}; + +const struct route_config media_bt_sco_headset_out = { + "media-bt-sco-headset", + "media-bt-sco-headset-in", +}; + +const struct route_config camcorder_speaker = { + "media-speaker", + "camcorder-mic" +}; + +const struct route_config camcorder_headphones = { + "media-headset", + "camcorder-headset-mic" +}; + +const struct route_config camcorder_headset = { + "media-headset", + "camcorder-headset-mic" +}; + +const struct route_config voice_rec_speaker = { + "media-speaker", + "recording-mic" +}; + +const struct route_config voice_rec_headphones = { + "media-headset", + "recording-headphone-mic" +}; + +const struct route_config voice_rec_headset = { + "media-headset", + "recording-headset-mic" +}; + +const struct route_config communication_speaker = { + "communication-speaker", + "communication-speaker-mic" +}; + +const struct route_config communication_earpiece = { + "communication-handset", + "communication-handset-mic" +}; + +const struct route_config communication_headphones = { + "communication-headphone", + "communication-headphone-mic" +}; + +const struct route_config communication_headset = { + "communication-headset", + "communication-headset-mic" +}; + +const struct route_config speaker_and_headphones = { + "media-speaker-headset", + "media-mic" +}; + +const struct route_config bt_sco_carkit = { + "media-bt-sco-headset", + "media-bt-sco-headset-in", +}; + +const struct route_config none = { + "none", + "none" +}; + +const struct route_config * const route_configs[IN_SOURCE_TAB_SIZE] + [OUT_DEVICE_TAB_SIZE] = { + { /* IN_SOURCE_MIC */ + &media_speaker, /* OUT_DEVICE_SPEAKER */ + &media_earpiece, /* OUT_DEVICE_EARPIECE */ + &media_headset, /* OUT_DEVICE_HEADSET */ + &media_headphones, /* OUT_DEVICE_HEADPHONES */ + &media_bt_sco, /* OUT_DEVICE_BT_SCO */ + &media_bt_sco_headset_out, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &speaker_and_headphones, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &media_speaker /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, + { /* IN_SOURCE_CAMCORDER */ + &camcorder_speaker, /* OUT_DEVICE_SPEAKER */ + &none, /* OUT_DEVICE_EARPIECE */ + &camcorder_headset, /* OUT_DEVICE_HEADSET */ + &camcorder_headphones, /* OUT_DEVICE_HEADPHONES */ + &media_bt_sco, /* OUT_DEVICE_BT_SCO */ + &media_bt_sco_headset_out, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &speaker_and_headphones, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &camcorder_speaker /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, + { /* IN_SOURCE_VOICE_RECOGNITION */ + &voice_rec_speaker, /* OUT_DEVICE_SPEAKER */ + &none, /* OUT_DEVICE_EARPIECE */ + &voice_rec_headset, /* OUT_DEVICE_HEADSET */ + &voice_rec_headphones, /* OUT_DEVICE_HEADPHONES */ + &media_bt_sco, /* OUT_DEVICE_BT_SCO */ + &media_bt_sco_headset_out, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &speaker_and_headphones, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &voice_rec_speaker /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, + { /* IN_SOURCE_VOICE_COMMUNICATION */ + &communication_speaker, /* OUT_DEVICE_SPEAKER */ + &communication_earpiece, /* OUT_DEVICE_EARPIECE */ + &communication_headset, /* OUT_DEVICE_HEADSET */ + &communication_headphones, /* OUT_DEVICE_HEADPHONES */ + &media_bt_sco, /* OUT_DEVICE_BT_SCO */ + &media_bt_sco_headset_out, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &speaker_and_headphones, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &communication_earpiece /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, + { /* IN_SOURCE_VOICE_CALL */ + &voice_speaker, /* OUT_DEVICE_SPEAKER */ + &voice_earpiece, /* OUT_DEVICE_EARPIECE */ + &voice_headset, /* OUT_DEVICE_HEADSET */ + &voice_headphones, /* OUT_DEVICE_HEADPHONES */ + &voice_bt_sco, /* OUT_DEVICE_BT_SCO */ + &voice_bt_sco_headset_out, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &voice_headphones, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &voice_earpiece /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, + { /* IN_SOURCE_VOICE_CALL_WB */ + &voice_speaker_wb, /* OUT_DEVICE_SPEAKER */ + &voice_earpiece_wb, /* OUT_DEVICE_EARPIECE */ + &voice_headset_wb, /* OUT_DEVICE_HEADSET */ + &voice_headphones_wb, /* OUT_DEVICE_HEADPHONES */ + &voice_bt_sco_wb, /* OUT_DEVICE_BT_SCO */ + &voice_bt_sco_headset_out_wb, /* OUT_DEVICE_BT_SCO_HEADSET_OUT */ + &bt_sco_carkit, /* OUT_DEVICE_BT_SCO_CARKIT */ + &voice_headphones_wb, /* OUT_DEVICE_SPEAKER_AND_HEADSET */ + &voice_earpiece_wb /* OUT_DEVICE_SPEAKER_AND_EARPIECE */ + }, +}; + +#endif diff --git a/bluetooth/bdroid_buildcfg.h b/bluetooth/bdroid_buildcfg.h new file mode 100644 index 0000000..f47a97b --- /dev/null +++ b/bluetooth/bdroid_buildcfg.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * 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. + */ + +#ifndef _BDROID_BUILDCFG_H +#define _BDROID_BUILDCFG_H + +#define BTM_DEF_LOCAL_NAME "Samsung Galaxy J7" + +#endif diff --git a/bluetooth/bt_vendor.conf b/bluetooth/bt_vendor.conf new file mode 100644 index 0000000..6c3cc3b --- /dev/null +++ b/bluetooth/bt_vendor.conf @@ -0,0 +1,2 @@ +# Firmware patch file name +FwPatchFileName = bcm4358A1_V0051.0080.hcd diff --git a/bluetooth/libbt_vndcfg.txt b/bluetooth/libbt_vndcfg.txt new file mode 100644 index 0000000..13a8bc0 --- /dev/null +++ b/bluetooth/libbt_vndcfg.txt @@ -0,0 +1,7 @@ +BLUETOOTH_UART_DEVICE_PORT = "/dev/ttySAC3" +FW_PATCHFILE_LOCATION = "/vendor/firmware" +FW_PATCH_SETTLEMENT_DELAY_MS = 100 +UART_TARGET_BAUD_RATE = 921600 +LPM_IDLE_TIMEOUT_MULTIPLE = 5 +SCO_USE_I2S_INTERFACE = TRUE +SCO_I2SPCM_IF_ROLE = 0 diff --git a/cm.dependencies b/cm.dependencies new file mode 100644 index 0000000..eb3a1ab --- /dev/null +++ b/cm.dependencies @@ -0,0 +1,26 @@ +[ + { + "repository": "android_external_stlport", + "target_path": "external/stlport" + }, + { + "repository": "android_packages_apps_SamsungServiceMode", + "target_path": "packages/apps/SamsungServiceMode" + }, + { + "repository": "android_hardware_samsung", + "target_path": "hardware/samsung" + }, + { + "repository": "android_hardware_samsung_slsi-cm_exynos", + "target_path": "hardware/samsung_slsi-cm/exynos" + }, + { + "repository": "android_hardware_samsung_slsi-cm_exynos5", + "target_path": "hardware/samsung_slsi-cm/exynos5" + }, + { + "repository": "android_hardware_samsung_slsi-cm_openmax", + "target_path": "hardware/samsung_slsi-cm/openmax" + } +] diff --git a/cm.mk b/cm.mk new file mode 100644 index 0000000..e9b1406 --- /dev/null +++ b/cm.mk @@ -0,0 +1,30 @@ +# +# Copyright (C) 2016 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. +# + +# Inherit common CM phone. +$(call inherit-product, vendor/cm/config/common_full_phone.mk) + +# Inherit from those products. Most specific first. +$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) + +# Inherit from j7eltexx device +$(call inherit-product, device/samsung/j7eltexx/device.mk) + +# Set those variables here to overwrite the inherited values. +PRODUCT_NAME := cm_j7eltexx +PRODUCT_DEVICE := j7eltexx +#PRODUCT_BRAND := samsung +#PRODUCT_MANUFACTURER := samsung diff --git a/configs/audio_policy.conf b/configs/audio_policy.conf new file mode 100644 index 0000000..8ff588d --- /dev/null +++ b/configs/audio_policy.conf @@ -0,0 +1,129 @@ +# 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_THIRD_MIC|AUDIO_DEVICE_IN_VOICE_CALL|AUDIO_DEVICE_IN_REMOTE_SUBMIX|AUDIO_DEVICE_IN_PLAYBACK +} + +# 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". + +audio_hw_modules { + primary { + outputs { + primary { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT|AUDIO_FORMAT_PCM_24_BIT + devices AUDIO_DEVICE_OUT_EARPIECE|AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET + flags AUDIO_OUTPUT_FLAG_DEEP_BUFFER|AUDIO_OUTPUT_FLAG_PRIMARY + } + fast { + 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_ALL_SCO|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET + flags AUDIO_OUTPUT_FLAG_FAST + } + } + inputs { + primary { + sampling_rates 8000|11025|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_VOICE_UPLINK|AUDIO_CHANNEL_IN_VOICE_DNLINK + 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|AUDIO_DEVICE_IN_THIRD_MIC|AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET + } + } + } + a2dp { + outputs { + a2dp { + sampling_rates 44100 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_ALL_A2DP + } + } + } + usb { + outputs { + usb_accessory { + sampling_rates 44100 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_USB_ACCESSORY + } + usb_device { + sampling_rates 44100|48000 + channel_masks dynamic + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET + } + } + inputs { + usb_device { + sampling_rates dynamic + channel_masks AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_USB_DEVICE + } + } + } + tms { + outputs { + tms { + sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_EXTERNAL_TMS + } + } + inputs { + tms { + sampling_rates 8000|11025|12000|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_EXTERNAL_TMS + } + } + } + r_submix { + outputs { + submix { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_OUT_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX + } + } + inputs { + submix { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_REMOTE_SUBMIX + } + } + } + playback_record { + inputs { + playback_record { + sampling_rates 48000 + channel_masks AUDIO_CHANNEL_IN_STEREO + formats AUDIO_FORMAT_PCM_16_BIT + devices AUDIO_DEVICE_IN_PLAYBACK + } + } + } +} diff --git a/configs/gps.conf b/configs/gps.conf new file mode 100644 index 0000000..2ffaf71 --- /dev/null +++ b/configs/gps.conf @@ -0,0 +1,5 @@ +NTP_SERVER=north-america.pool.ntp.org +XTRA_SERVER_1=http://gllto1.glpals.com/4day/v3/latest/lto2.dat +XTRA_SERVER_2=http://gllto2.glpals.com/4day/v3/latest/lto2.dat +SUPL_HOST=supl.google.com +SUPL_PORT=7275 diff --git a/configs/media_codecs.xml b/configs/media_codecs.xml new file mode 100644 index 0000000..581d4dd --- /dev/null +++ b/configs/media_codecs.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/media_profiles.xml b/configs/media_profiles.xml new file mode 100644 index 0000000..df3b06a --- /dev/null +++ b/configs/media_profiles.xml @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/mixer_paths.xml b/configs/mixer_paths.xml new file mode 100644 index 0000000..407bb10 --- /dev/null +++ b/configs/mixer_paths.xml @@ -0,0 +1,2967 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/configs/p2p_supplicant_overlay.conf b/configs/p2p_supplicant_overlay.conf new file mode 100644 index 0000000..6f3f25e --- /dev/null +++ b/configs/p2p_supplicant_overlay.conf @@ -0,0 +1,14 @@ +disable_scan_offload=1 +p2p_listen_reg_class=81 +p2p_listen_channel=1 +p2p_oper_reg_class=124 +p2p_oper_channel=149 +manufacturer=SAMSUNG_ELECTRONICS +model_name=SAMSUNG_MOBILE +model_number=2014 +serial_number=19691101 +update_config=1 +ip_addr_go=192.168.49.1 +ip_addr_mask=255.255.255.0 +ip_addr_start=192.168.49.200 +ip_addr_end=192.168.49.254 diff --git a/configs/wpa_supplicant_overlay.conf b/configs/wpa_supplicant_overlay.conf new file mode 100644 index 0000000..27ded1e --- /dev/null +++ b/configs/wpa_supplicant_overlay.conf @@ -0,0 +1,3 @@ +p2p_disabled=1 +autoscan=samsung_exponential:8:128 +update_config=1 diff --git a/device.mk b/device.mk new file mode 100644 index 0000000..06d593c --- /dev/null +++ b/device.mk @@ -0,0 +1,151 @@ +# +# Copyright (C) 2015 The Dokdo Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := device/samsung/j7eltexx + +$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk) + +# Overlays +DEVICE_PACKAGE_OVERLAYS += device/samsung/j7eltexx/overlay + +# Device uses high-density artwork where available +PRODUCT_AAPT_CONFIG := normal hdpi xhdpi +PRODUCT_AAPT_PREF_CONFIG := xhdpi + +# Boot animation +TARGET_SCREEN_HEIGHT := 1280 +TARGET_SCREEN_WIDTH := 720 + +# Permissions +PRODUCT_COPY_FILES += \ + 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.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \ + frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.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.proximity.xml:system/etc/permissions/android.hardware.sensor.proximity.xml \ + frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.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.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 \ + frameworks/native/data/etc/android.hardware.wifi.direct.xml:system/etc/permissions/android.hardware.wifi.direct.xml \ + frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml \ + frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml + +# Audio +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/audio_policy.conf:system/etc/audio_policy.conf \ + $(LOCAL_PATH)/configs/mixer_paths.xml:system/etc/mixer_paths.xml + +PRODUCT_PACKAGES += \ + audio.primary.universal7580 \ + audio.a2dp.default \ + audio.r_submix.default \ + audio.usb.default \ + tinymix + +# Bluetooth +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/bluetooth/bt_vendor.conf:system/etc/bluetooth/bt_vendor.conf + +# Charger +PRODUCT_PACKAGES += \ + charger_res_images + +# Filesystem management tools +PRODUCT_PACKAGES += \ + make_ext4fs \ + setup_fs + +# Graphics +PRODUCT_PACKAGES += \ + gralloc.exynos5 +# hwcomposer.exynos5 + +# GPS +#PRODUCT_PACKAGES += \ +# libdmitry + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/gps.conf:system/etc/gps.conf + +# Keylayouts +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/idc/Synaptics_HID_TouchPad.idc:system/usr/idc/Synaptics_HID_TouchPad.idc + +# Libstlport +PRODUCT_PACKAGES += \ + libstlport + +# Lights +PRODUCT_PACKAGES += \ + lights.universal7580 + +# Media profile +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/media_codecs.xml:system/etc/media_codecs.xml \ + $(LOCAL_PATH)/configs/media_profiles.xml:system/etc/media_profiles.xml \ + 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 + +# Power +PRODUCT_PACKAGES += \ + power.universal7580 + +# Ramdisk +PRODUCT_PACKAGES += \ + fstab.samsungexynos7580 \ + init.baseband.rc \ + init.samsungexynos7580.rc \ + init.samsungexynos7580.usb.rc \ + init.wifi.rc \ + ueventd.samsungexynos7580.rc + +# Samsung +PRODUCT_PACKAGES += \ + SamsungServiceMode + +# Wifi +PRODUCT_PACKAGES += \ + init.sec.boot.sh + +PRODUCT_PACKAGES += \ + dhcpcd.conf \ + hostapd \ + libnetcmdiface \ + macloader \ + wpa_supplicant \ + wpa_supplicant.conf + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/wpa_supplicant_overlay.conf:system/etc/wifi/wpa_supplicant_overlay.conf \ + $(LOCAL_PATH)/configs/p2p_supplicant_overlay.conf:system/etc/wifi/p2p_supplicant_overlay.conf + +# Ril +# cpboot-daemon for modem +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/ril/sbin/cbd:root/sbin/cbd + +# Set default USB interface +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + persist.sys.usb.config=mtp + +# call Samsung LSI board support package +$(call inherit-product, hardware/samsung_slsi-cm/exynos5/exynos5.mk) +$(call inherit-product, hardware/samsung_slsi-cm/exynos7580/exynos7580.mk) + +# Get non-open-source specific aspects +$(call inherit-product-if-exists, vendor/samsung/j7e3gxx/j7e3gxx-vendor.mk) diff --git a/dtb.img b/dtb.img new file mode 100644 index 0000000000000000000000000000000000000000..388085cdd8f833294e8e472fd87fd3fc5bd7dd69 GIT binary patch literal 303104 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 Ie|H4_3seyb6#xJL literal 0 HcmV?d00001 diff --git a/extract-files.sh b/extract-files.sh new file mode 100644 index 0000000..fd4191c --- /dev/null +++ b/extract-files.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +VENDOR=samsung +DEVICE=j7e3gxx + +BASE=../../../vendor/$VENDOR/$DEVICE/proprietary +rm -rf $BASE/* + +for FILE in `cat proprietary-files.txt | grep -v ^# | grep -v ^$ `; do + DIR=`dirname $FILE` + if [ ! -d $BASE/$DIR ]; then + mkdir -p $BASE/$DIR + fi + #adb pull /system/$FILE $BASE/$FILE + cp /work/Work/G6/511Firm/system/$FILE $BASE/$FILE +done + +./setup-makefiles.sh diff --git a/idc/Synaptics_HID_TouchPad.idc b/idc/Synaptics_HID_TouchPad.idc new file mode 100644 index 0000000..f0fbe15 --- /dev/null +++ b/idc/Synaptics_HID_TouchPad.idc @@ -0,0 +1,59 @@ +# 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. + +# +# Input Device Configuration File for the Atmel Maxtouch touch screen. +# +# These calibration values are derived from empirical measurements +# and may not be appropriate for use with other touch screens. +# Refer to the input device configuration documentation for more details. +# + +device.internal = 0 + +# Basic Parameters +touch.deviceType = pointer +touch.orientationAware = 1 + +touch.gestureMode = pointer + +# Touch Size +touch.touchSize.calibration = pressure + +# Tool Size +# Driver reports tool size as an area measurement. +# +# Based on empirical measurements, we estimate the size of the tool +# using size = sqrt(22 * rawToolArea + 0) * 6 + 0. +touch.toolSize.calibration = area +touch.toolSize.areaScale = 22 +touch.toolSize.areaBias = 0 +touch.toolSize.linearScale = 6 +touch.toolSize.linearBias = 0 +touch.toolSize.isSummed = 0 + +# Pressure +# Driver reports signal strength as pressure. +# +# A normal index finger touch typically registers about 80 signal strength +# units although we don't expect these values to be accurate. +touch.pressure.calibration = amplitude +touch.pressure.source = default +touch.pressure.scale = 0.0125 + +# Size +touch.size.calibration = normalized + +# Orientation +touch.orientation.calibration = vector diff --git a/include/camera/CameraParametersExtra.h b/include/camera/CameraParametersExtra.h new file mode 100644 index 0000000..5272730 --- /dev/null +++ b/include/camera/CameraParametersExtra.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2016 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. + */ + +#define CAMERA_PARAMETERS_EXTRA_C \ + const char CameraParameters::PIXEL_FORMAT_YUV420SP_NV21[] = "nv21"; \ + const char CameraParameters::EFFECT_CARTOONIZE[] = "cartoonize"; \ + const char CameraParameters::EFFECT_POINT_RED_YELLOW[] = "point-red-yellow"; \ + const char CameraParameters::EFFECT_POINT_GREEN[] = "point-green"; \ + const char CameraParameters::EFFECT_POINT_BLUE[] = "point-blue"; \ + const char CameraParameters::EFFECT_VINTAGE_COLD[] = "vintage-cold"; \ + const char CameraParameters::EFFECT_VINTAGE_WARM[] = "vintage-warm"; \ + const char CameraParameters::EFFECT_WASHED[] = "washed"; \ + const char CameraParameters::ISO_AUTO[] = "auto"; \ + const char CameraParameters::ISO_NIGHT[] = "night"; \ + const char CameraParameters::ISO_SPORTS[] = "sports"; \ + const char CameraParameters::ISO_6400[] = "6400"; \ + const char CameraParameters::ISO_3200[] = "3200"; \ + const char CameraParameters::ISO_1600[] = "1600"; \ + const char CameraParameters::ISO_800[] = "800"; \ + const char CameraParameters::ISO_400[] = "400"; \ + const char CameraParameters::ISO_200[] = "200"; \ + const char CameraParameters::ISO_100[] = "100"; \ + const char CameraParameters::ISO_80[] = "80"; \ + const char CameraParameters::ISO_50[] = "50"; \ + const char CameraParameters::KEY_SUPPORTED_METERING_MODE[] = "metering-values"; \ + const char CameraParameters::METERING_CENTER[] = "center"; \ + const char CameraParameters::METERING_MATRIX[] = "matrix"; \ + const char CameraParameters::METERING_SPOT[] = "spot"; \ + const char CameraParameters::METERING_OFF[] = "off"; \ + const char CameraParameters::KEY_DYNAMIC_RANGE_CONTROL[] = "dynamic-range-control"; \ + const char CameraParameters::KEY_SUPPORTED_PHASE_AF[] = "phase-af-values"; \ + const char CameraParameters::KEY_PHASE_AF[] = "phase-af"; \ + const char CameraParameters::KEY_SUPPORTED_RT_HDR[] = "rt-hdr-values"; \ + const char CameraParameters::KEY_RT_HDR[] = "rt-hdr"; + +#define CAMERA_PARAMETERS_EXTRA_H \ + static const char PIXEL_FORMAT_YUV420SP_NV21[]; \ + static const char EFFECT_CARTOONIZE[]; \ + static const char EFFECT_POINT_RED_YELLOW[]; \ + static const char EFFECT_POINT_GREEN[]; \ + static const char EFFECT_POINT_BLUE[]; \ + static const char EFFECT_VINTAGE_COLD[]; \ + static const char EFFECT_VINTAGE_WARM[]; \ + static const char EFFECT_WASHED[]; \ + static const char ISO_AUTO[]; \ + static const char ISO_NIGHT[]; \ + static const char ISO_SPORTS[]; \ + static const char ISO_6400[]; \ + static const char ISO_3200[]; \ + static const char ISO_1600[]; \ + static const char ISO_800[]; \ + static const char ISO_400[]; \ + static const char ISO_200[]; \ + static const char ISO_100[]; \ + static const char ISO_80[]; \ + static const char ISO_50[]; \ + static const char KEY_SUPPORTED_METERING_MODE[]; \ + static const char METERING_CENTER[]; \ + static const char METERING_MATRIX[]; \ + static const char METERING_SPOT[]; \ + static const char METERING_OFF[]; \ + static const char KEY_DYNAMIC_RANGE_CONTROL[]; \ + static const char KEY_SUPPORTED_PHASE_AF[]; \ + static const char KEY_PHASE_AF[]; \ + static const char KEY_SUPPORTED_RT_HDR[]; \ + static const char KEY_RT_HDR[]; diff --git a/include/hardware/gps.h b/include/hardware/gps.h new file mode 100644 index 0000000..dc2d647 --- /dev/null +++ b/include/hardware/gps.h @@ -0,0 +1,1889 @@ +/* + * 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 uint32_t GpsAidingData; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +#define GPS_DELETE_EPHEMERIS 0x00000001 +#define GPS_DELETE_ALMANAC 0x00000002 +#define GPS_DELETE_POSITION 0x00000004 +#define GPS_DELETE_TIME 0x00000008 +#define GPS_DELETE_IONO 0x00000010 +#define GPS_DELETE_UTC 0x00000020 +#define GPS_DELETE_HEALTH 0x00000040 +#define GPS_DELETE_SVDIR 0x00000080 +#define GPS_DELETE_SVSTEER 0x00000100 +#define GPS_DELETE_SADATA 0x00000200 +#define GPS_DELETE_RTI 0x00000400 +#define GPS_DELETE_CELLDB_INFO 0x00000800 +#define GPS_DELETE_ALMANAC_CORR 0x00001000 +#define GPS_DELETE_FREQ_BIAS_EST 0x00002000 +#define GLO_DELETE_EPHEMERIS 0x00004000 +#define GLO_DELETE_ALMANAC 0x00008000 +#define GLO_DELETE_SVDIR 0x00010000 +#define GLO_DELETE_SVSTEER 0x00020000 +#define GLO_DELETE_ALMANAC_CORR 0x00040000 +#define GPS_DELETE_TIME_GPS 0x00080000 +#define GLO_DELETE_TIME 0x00100000 +#define BDS_DELETE_SVDIR 0X00200000 +#define BDS_DELETE_SVSTEER 0X00400000 +#define BDS_DELETE_TIME 0X00800000 +#define BDS_DELETE_ALMANAC_CORR 0X01000000 +#define BDS_DELETE_EPHEMERIS 0X02000000 +#define BDS_DELETE_ALMANAC 0X04000000 + +#define GPS_DELETE_ALL 0xFFFFFFFF + +/** 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) +/** The value of 'pseudorange rate' is uncorrected. */ +#define GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE (1<<18) + +/** + * 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; + + int used; + +} 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; +#ifdef AGPS_USE_PSC + uint16_t psc; +#endif + 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; + +#pragma pack(push,4) +// We need to keep the alignment of this data structure to 4-bytes, to ensure that in 64-bit +// environments the size of this legacy definition does not collide with _v2. Implementations should +// be using _v2 and _v3, so it's OK to pay the 'unaligned' penalty in 64-bit if an old +// implementation is still in use. + +/** Represents the status of AGPS. */ +typedef struct { + /** set to sizeof(AGpsStatus_v1) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; +} AGpsStatus_v1; + +#pragma pack(pop) + +/** 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. + * + * If GpsMeasurement's 'flags' field contains GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE, + * it is encouraged that this field is also provided. + */ + 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. + * + * This value must be populated if 'state' != GPS_MEASUREMENT_STATE_UNKNOWN. + */ + int64_t received_gps_tow_ns; + + /** + * 1-Sigma uncertainty of the Received GPS Time-of-Week in nanoseconds. + * + * This value must be populated if 'state' != GPS_MEASUREMENT_STATE_UNKNOWN. + */ + 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 correction of a given Pseudorange Rate value includes corrections for receiver and + * satellite clock frequency errors. + * + * If GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE is set in 'flags' field, this field must + * be populated with the 'uncorrected' reading. + * If GPS_MEASUREMENT_HAS_UNCORRECTED_PSEUDORANGE_RATE is not set in 'flags' field, this field + * must be populated with the 'corrected' reading. This is the default behavior. + * + * It is encouraged to provide the 'uncorrected' 'pseudorange rate', and provide GpsClock's + * 'drift' field as well. + * + * The value includes the 'pseudorange rate uncertainty' in it. + * A positive 'uncorrected' value indicates that the SV is moving away from the receiver. + * + * The sign of the 'uncorrected' 'pseudorange rate' and its relation to the sign of 'doppler + * shift' is given by the equation: + * pseudorange rate = -k * doppler shift (where k is a constant) + * + * 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. + * A positive value indicates that the SV is moving away from the receiver. + * + * The sign of the 'accumulated delta range' and its relation to the sign of 'carrier phase' + * is given by the equation: + * accumulated delta range = -k * carrier phase (where k is a constant) + * + * This value must be populated if 'accumulated delta range state' != GPS_ADR_STATE_UNKNOWN. + * However, it is expected that the data is only accurate when: + * 'accumulated delta range state' == GPS_ADR_STATE_VALID. + */ + double accumulated_delta_range_m; + + /** + * 1-Sigma uncertainty of the accumulated delta range in meters. + * This value must be populated 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/include/hardware/gralloc.h b/include/hardware/gralloc.h new file mode 100644 index 0000000..5eb1619 --- /dev/null +++ b/include/hardware/gralloc.h @@ -0,0 +1,427 @@ +/* + * Copyright (C) 2008 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_GRALLOC_INTERFACE_H +#define ANDROID_GRALLOC_INTERFACE_H + +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +__BEGIN_DECLS + +/** + * Module versioning information for the Gralloc hardware module, based on + * gralloc_module_t.common.module_api_version. + * + * Version History: + * + * GRALLOC_MODULE_API_VERSION_0_1: + * Initial Gralloc hardware module API. + * + * GRALLOC_MODULE_API_VERSION_0_2: + * Add support for flexible YCbCr format with (*lock_ycbcr)() method. + * + * GRALLOC_MODULE_API_VERSION_0_3: + * Add support for fence passing to/from lock/unlock. + */ + +#define GRALLOC_MODULE_API_VERSION_0_1 HARDWARE_MODULE_API_VERSION(0, 1) +#define GRALLOC_MODULE_API_VERSION_0_2 HARDWARE_MODULE_API_VERSION(0, 2) +#define GRALLOC_MODULE_API_VERSION_0_3 HARDWARE_MODULE_API_VERSION(0, 3) + +#define GRALLOC_DEVICE_API_VERSION_0_1 HARDWARE_DEVICE_API_VERSION(0, 1) + +/** + * The id of this module + */ +#define GRALLOC_HARDWARE_MODULE_ID "gralloc" + +/** + * Name of the graphics device to open + */ + +#define GRALLOC_HARDWARE_GPU0 "gpu0" + +enum { + /* buffer is never read in software */ + GRALLOC_USAGE_SW_READ_NEVER = 0x00000000, + /* buffer is rarely read in software */ + GRALLOC_USAGE_SW_READ_RARELY = 0x00000002, + /* buffer is often read in software */ + GRALLOC_USAGE_SW_READ_OFTEN = 0x00000003, + /* mask for the software read values */ + GRALLOC_USAGE_SW_READ_MASK = 0x0000000F, + + /* buffer is never written in software */ + GRALLOC_USAGE_SW_WRITE_NEVER = 0x00000000, + /* buffer is rarely written in software */ + GRALLOC_USAGE_SW_WRITE_RARELY = 0x00000020, + /* buffer is often written in software */ + GRALLOC_USAGE_SW_WRITE_OFTEN = 0x00000030, + /* mask for the software write values */ + GRALLOC_USAGE_SW_WRITE_MASK = 0x000000F0, + + /* buffer will be used as an OpenGL ES texture */ + GRALLOC_USAGE_HW_TEXTURE = 0x00000100, + /* buffer will be used as an OpenGL ES render target */ + GRALLOC_USAGE_HW_RENDER = 0x00000200, + /* buffer will be used by the 2D hardware blitter */ + GRALLOC_USAGE_HW_2D = 0x00000400, + /* buffer will be used by the HWComposer HAL module */ + GRALLOC_USAGE_HW_COMPOSER = 0x00000800, + /* buffer will be used with the framebuffer device */ + GRALLOC_USAGE_HW_FB = 0x00001000, + + /* buffer should be displayed full-screen on an external display when + * possible */ + GRALLOC_USAGE_EXTERNAL_DISP = 0x00002000, + + /* Must have a hardware-protected path to external display sink for + * this buffer. If a hardware-protected path is not available, then + * either don't composite only this buffer (preferred) to the + * external sink, or (less desirable) do not route the entire + * composition to the external sink. */ + GRALLOC_USAGE_PROTECTED = 0x00004000, + + /* buffer may be used as a cursor */ + GRALLOC_USAGE_CURSOR = 0x00008000, + + /* buffer will be used with the HW video encoder */ + GRALLOC_USAGE_HW_VIDEO_ENCODER = 0x00010000, + /* buffer will be written by the HW camera pipeline */ + GRALLOC_USAGE_HW_CAMERA_WRITE = 0x00020000, + /* buffer will be read by the HW camera pipeline */ + GRALLOC_USAGE_HW_CAMERA_READ = 0x00040000, + /* buffer will be used as part of zero-shutter-lag queue */ + GRALLOC_USAGE_HW_CAMERA_ZSL = 0x00060000, + /* mask for the camera access values */ + GRALLOC_USAGE_HW_CAMERA_MASK = 0x00060000, + /* buffer will be used by the HW IPs when sysmmu is off */ + GRALLOC_USAGE_PHYSICALLY_LINEAR = 0x01000000, + /* mask for the software usage bit-mask */ + GRALLOC_USAGE_HW_MASK = 0x00079F00, + + /* buffer will be used as a RenderScript Allocation */ + GRALLOC_USAGE_RENDERSCRIPT = 0x00100000, + + /* Set by the consumer to indicate to the producer that they may attach a + * buffer that they did not detach from the BufferQueue. Will be filtered + * out by GRALLOC_USAGE_ALLOC_MASK, so gralloc modules will not need to + * handle this flag. */ + GRALLOC_USAGE_FOREIGN_BUFFERS = 0x00200000, + + /* Mask of all flags which could be passed to a gralloc module for buffer + * allocation. Any flags not in this mask do not need to be handled by + * gralloc modules. */ + GRALLOC_USAGE_ALLOC_MASK = ~(GRALLOC_USAGE_FOREIGN_BUFFERS), + + /* implementation-specific private usage flags */ + GRALLOC_USAGE_PRIVATE_0 = 0x10000000, + GRALLOC_USAGE_PRIVATE_1 = 0x20000000, + GRALLOC_USAGE_PRIVATE_2 = 0x40000000, + GRALLOC_USAGE_PRIVATE_3 = 0x80000000, + GRALLOC_USAGE_PRIVATE_MASK = 0xF0000000, + + GRALLOC_USAGE_INTERNAL_ONLY = 0x10000000, + GRALLOC_USAGE_EXTERNAL_FLEXIBLE = 0x20000000, + GRALLOC_USAGE_EXTERNAL_BLOCK = 0x40000000, + GRALLOC_USAGE_EXTERNAL_ONLY = 0x80000000, + GRALLOC_USAGE_EXTERNAL_VIRTUALFB = 0x00400000, + GRALLOC_USAGE_PRIVATE_NONSECURE = 0x02000000, + +#ifdef EXYNOS4_ENHANCEMENTS + /* SAMSUNG */ + GRALLOC_USAGE_PRIVATE_NONECACHE = 0x00800000, + + GRALLOC_USAGE_HW_FIMC1 = 0x01000000, + GRALLOC_USAGE_HW_ION = 0x02000000, + GRALLOC_USAGE_YUV_ADDR = 0x04000000, + GRALLOC_USAGE_CAMERA = 0x08000000, + + /* SEC Private usage , for Overlay path at HWC */ + GRALLOC_USAGE_HWC_HWOVERLAY = 0x20000000, +#endif + + GRALLOC_USAGE_GPU_BUFFER = 0x00800000, +}; + +/*****************************************************************************/ + +/** + * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM + * and the fields of this data structure must begin with hw_module_t + * followed by module specific information. + */ +typedef struct gralloc_module_t { + struct hw_module_t common; + + /* + * (*registerBuffer)() must be called before a buffer_handle_t that has not + * been created with (*alloc_device_t::alloc)() can be used. + * + * This is intended to be used with buffer_handle_t's that have been + * received in this process through IPC. + * + * This function checks that the handle is indeed a valid one and prepares + * it for use with (*lock)() and (*unlock)(). + * + * It is not necessary to call (*registerBuffer)() on a handle created + * with (*alloc_device_t::alloc)(). + * + * returns an error if this buffer_handle_t is not valid. + */ + int (*registerBuffer)(struct gralloc_module_t const* module, + buffer_handle_t handle); + + /* + * (*unregisterBuffer)() is called once this handle is no longer needed in + * this process. After this call, it is an error to call (*lock)(), + * (*unlock)(), or (*registerBuffer)(). + * + * This function doesn't close or free the handle itself; this is done + * by other means, usually through libcutils's native_handle_close() and + * native_handle_free(). + * + * It is an error to call (*unregisterBuffer)() on a buffer that wasn't + * explicitly registered first. + */ + int (*unregisterBuffer)(struct gralloc_module_t const* module, + buffer_handle_t handle); + + /* + * The (*lock)() method is called before a buffer is accessed for the + * specified usage. This call may block, for instance if the h/w needs + * to finish rendering or if CPU caches need to be synchronized. + * + * The caller promises to modify only pixels in the area specified + * by (l,t,w,h). + * + * The content of the buffer outside of the specified area is NOT modified + * by this call. + * + * If usage specifies GRALLOC_USAGE_SW_*, vaddr is filled with the address + * of the buffer in virtual memory. + * + * Note calling (*lock)() on HAL_PIXEL_FORMAT_YCbCr_*_888 buffers will fail + * and return -EINVAL. These buffers must be locked with (*lock_ycbcr)() + * instead. + * + * THREADING CONSIDERATIONS: + * + * It is legal for several different threads to lock a buffer from + * read access, none of the threads are blocked. + * + * However, locking a buffer simultaneously for write or read/write is + * undefined, but: + * - shall not result in termination of the process + * - shall not block the caller + * It is acceptable to return an error or to leave the buffer's content + * into an indeterminate state. + * + * If the buffer was created with a usage mask incompatible with the + * requested usage flags here, -EINVAL is returned. + * + */ + + int (*lock)(struct gralloc_module_t const* module, + buffer_handle_t handle, int usage, + int l, int t, int w, int h, + void** vaddr); + + + /* + * The (*unlock)() method must be called after all changes to the buffer + * are completed. + */ + + int (*unlock)(struct gralloc_module_t const* module, + buffer_handle_t handle); + +#ifdef EXYNOS4_ENHANCEMENTS + int (*getphys) (struct gralloc_module_t const* module, + buffer_handle_t handle, void** paddr); +#endif + + /* reserved for future use */ + int (*perform)(struct gralloc_module_t const* module, + int operation, ... ); + + /* + * The (*lock_ycbcr)() method is like the (*lock)() method, with the + * difference that it fills a struct ycbcr with a description of the buffer + * layout, and zeroes out the reserved fields. + * + * If the buffer format is not compatible with a flexible YUV format (e.g. + * the buffer layout cannot be represented with the ycbcr struct), it + * will return -EINVAL. + * + * This method must work on buffers with HAL_PIXEL_FORMAT_YCbCr_*_888 + * if supported by the device, as well as with any other format that is + * requested by the multimedia codecs when they are configured with a + * flexible-YUV-compatible color-format with android native buffers. + * + * Note that this method may also be called on buffers of other formats, + * including non-YUV formats. + * + * Added in GRALLOC_MODULE_API_VERSION_0_2. + */ + + int (*lock_ycbcr)(struct gralloc_module_t const* module, + buffer_handle_t handle, int usage, + int l, int t, int w, int h, + struct android_ycbcr *ycbcr); + + /* + * The (*lockAsync)() method is like the (*lock)() method except + * that the buffer's sync fence object is passed into the lock + * call instead of requiring the caller to wait for completion. + * + * The gralloc implementation takes ownership of the fenceFd and + * is responsible for closing it when no longer needed. + * + * Added in GRALLOC_MODULE_API_VERSION_0_3. + */ + int (*lockAsync)(struct gralloc_module_t const* module, + buffer_handle_t handle, int usage, + int l, int t, int w, int h, + void** vaddr, int fenceFd); + + /* + * The (*unlockAsync)() method is like the (*unlock)() method + * except that a buffer sync fence object is returned from the + * lock call, representing the completion of any pending work + * performed by the gralloc implementation. + * + * The caller takes ownership of the fenceFd and is responsible + * for closing it when no longer needed. + * + * Added in GRALLOC_MODULE_API_VERSION_0_3. + */ + int (*unlockAsync)(struct gralloc_module_t const* module, + buffer_handle_t handle, int* fenceFd); + + /* + * The (*lockAsync_ycbcr)() method is like the (*lock_ycbcr)() + * method except that the buffer's sync fence object is passed + * into the lock call instead of requiring the caller to wait for + * completion. + * + * The gralloc implementation takes ownership of the fenceFd and + * is responsible for closing it when no longer needed. + * + * Added in GRALLOC_MODULE_API_VERSION_0_3. + */ + int (*lockAsync_ycbcr)(struct gralloc_module_t const* module, + buffer_handle_t handle, int usage, + int l, int t, int w, int h, + struct android_ycbcr *ycbcr, int fenceFd); + + /* reserved for future use */ + void* reserved_proc[3]; +} gralloc_module_t; + +/*****************************************************************************/ + +/** + * Every device data structure must begin with hw_device_t + * followed by module specific public methods and attributes. + */ + +typedef struct alloc_device_t { + struct hw_device_t common; + +#ifdef QCOM_BSP + /* + * (*allocSize)() Allocates a buffer in graphic memory with the requested + * bufferSize parameter and returns a buffer_handle_t and the stride in + * pixels to allow the implementation to satisfy hardware constraints on + * the width of a pixmap (eg: it may have to be multiple of 8 pixels). + * The CALLER TAKES OWNERSHIP of the buffer_handle_t. + * + * Returns 0 on success or -errno on error. + */ + int (*allocSize)(struct alloc_device_t* dev, + int w, int h, int format, int usage, + buffer_handle_t* handle, int* stride, int bufferSize); +#endif + + /* + * (*alloc)() Allocates a buffer in graphic memory with the requested + * parameters and returns a buffer_handle_t and the stride in pixels to + * allow the implementation to satisfy hardware constraints on the width + * of a pixmap (eg: it may have to be multiple of 8 pixels). + * The CALLER TAKES OWNERSHIP of the buffer_handle_t. + * + * If format is HAL_PIXEL_FORMAT_YCbCr_420_888, the returned stride must be + * 0, since the actual strides are available from the android_ycbcr + * structure. + * + * Returns 0 on success or -errno on error. + */ + + int (*alloc)(struct alloc_device_t* dev, + int w, int h, int format, int usage, + buffer_handle_t* handle, int* stride); + + /* + * (*free)() Frees a previously allocated buffer. + * Behavior is undefined if the buffer is still mapped in any process, + * but shall not result in termination of the program or security breaches + * (allowing a process to get access to another process' buffers). + * THIS FUNCTION TAKES OWNERSHIP of the buffer_handle_t which becomes + * invalid after the call. + * + * Returns 0 on success or -errno on error. + */ + int (*free)(struct alloc_device_t* dev, + buffer_handle_t handle); + + /* This hook is OPTIONAL. + * + * If non NULL it will be caused by SurfaceFlinger on dumpsys + */ + void (*dump)(struct alloc_device_t *dev, char *buff, int buff_len); + + void* reserved_proc[7]; +} alloc_device_t; + + +/** convenience API for opening and closing a supported device */ + +static inline int gralloc_open(const struct hw_module_t* module, + struct alloc_device_t** device) { + return module->methods->open(module, + GRALLOC_HARDWARE_GPU0, (struct hw_device_t**)device); +} + +static inline int gralloc_close(struct alloc_device_t* device) { + return device->common.close(&device->common); +} + +__END_DECLS + +#endif // ANDROID_GRALLOC_INTERFACE_H diff --git a/include/telephony/ril.h b/include/telephony/ril.h new file mode 100644 index 0000000..10c5b27 --- /dev/null +++ b/include/telephony/ril.h @@ -0,0 +1,5419 @@ +/* + * Copyright (C) 2006 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_RIL_H +#define ANDROID_RIL_H 1 + +#include +#include +#include +#include +#include + +#ifndef FEATURE_UNIT_TEST +#include +#endif /* !FEATURE_UNIT_TEST */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined(ANDROID_SIM_COUNT_2) +#define SIM_COUNT 2 +#elif defined(ANDROID_SIM_COUNT_3) +#define SIM_COUNT 3 +#elif defined(ANDROID_SIM_COUNT_4) +#define SIM_COUNT 4 +#else +#define SIM_COUNT 1 +#endif + +#ifndef ANDROID_MULTI_SIM +#define SIM_COUNT 1 +#endif + +#define RIL_VERSION 11 /* Current version */ +#define RIL_VERSION_MIN 6 /* Minimum RIL_VERSION supported */ + +#define CDMA_ALPHA_INFO_BUFFER_LENGTH 64 +#define CDMA_NUMBER_INFO_BUFFER_LENGTH 81 + +#define MAX_RILDS 3 +#define MAX_SOCKET_NAME_LENGTH 6 +#define MAX_CLIENT_ID_LENGTH 2 +#define MAX_DEBUG_SOCKET_NAME_LENGTH 12 +#define MAX_QEMU_PIPE_NAME_LENGTH 11 +#define MAX_UUID_LENGTH 64 + +typedef void * RIL_Token; + +typedef enum { + RIL_SOCKET_1, +#if (SIM_COUNT >= 2) + RIL_SOCKET_2, +#if (SIM_COUNT >= 3) + RIL_SOCKET_3, +#endif +#if (SIM_COUNT >= 4) + RIL_SOCKET_4, +#endif +#endif + RIL_SOCKET_NUM +} RIL_SOCKET_ID; + + +typedef enum { + RIL_E_SUCCESS = 0, + RIL_E_RADIO_NOT_AVAILABLE = 1, /* If radio did not start or is resetting */ + RIL_E_GENERIC_FAILURE = 2, + RIL_E_PASSWORD_INCORRECT = 3, /* for PIN/PIN2 methods only! */ + RIL_E_SIM_PIN2 = 4, /* Operation requires SIM PIN2 to be entered */ + RIL_E_SIM_PUK2 = 5, /* Operation requires SIM PIN2 to be entered */ + RIL_E_REQUEST_NOT_SUPPORTED = 6, + RIL_E_CANCELLED = 7, + RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8, /* data ops are not allowed during voice + call on a Class C GPRS device */ + RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9, /* data ops are not allowed before device + registers in network */ + RIL_E_SMS_SEND_FAIL_RETRY = 10, /* fail to send sms and need retry */ + RIL_E_SIM_ABSENT = 11, /* fail to set the location where CDMA subscription + shall be retrieved because of SIM or RUIM + card absent */ + RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12, /* fail to find CDMA subscription from specified + location */ + RIL_E_MODE_NOT_SUPPORTED = 13, /* HW does not support preferred network type */ + RIL_E_FDN_CHECK_FAILURE = 14, /* command failed because recipient is not on FDN list */ + RIL_E_ILLEGAL_SIM_OR_ME = 15, /* network selection failed due to + illegal SIM or ME */ + RIL_E_MISSING_RESOURCE = 16, /* no logical channel available */ + RIL_E_NO_SUCH_ELEMENT = 17, /* application not found on SIM */ + RIL_E_DIAL_MODIFIED_TO_USSD = 18, /* DIAL request modified to USSD */ + RIL_E_DIAL_MODIFIED_TO_SS = 19, /* DIAL request modified to SS */ + RIL_E_DIAL_MODIFIED_TO_DIAL = 20, /* DIAL request modified to DIAL with different + data */ + RIL_E_USSD_MODIFIED_TO_DIAL = 21, /* USSD request modified to DIAL */ + RIL_E_USSD_MODIFIED_TO_SS = 22, /* USSD request modified to SS */ + RIL_E_USSD_MODIFIED_TO_USSD = 23, /* USSD request modified to different USSD + request */ + RIL_E_SS_MODIFIED_TO_DIAL = 24, /* SS request modified to DIAL */ + RIL_E_SS_MODIFIED_TO_USSD = 25, /* SS request modified to USSD */ + RIL_E_SUBSCRIPTION_NOT_SUPPORTED = 26, /* Subscription not supported by RIL */ + RIL_E_SS_MODIFIED_TO_SS = 27, /* SS request modified to different SS request */ + RIL_E_LCE_NOT_SUPPORTED = 36 /* LCE service not supported(36 in RILConstants.java) */ + + +} RIL_Errno; + +typedef enum { + RIL_CALL_ACTIVE = 0, + RIL_CALL_HOLDING = 1, + RIL_CALL_DIALING = 2, /* MO call only */ + RIL_CALL_ALERTING = 3, /* MO call only */ + RIL_CALL_INCOMING = 4, /* MT call only */ + RIL_CALL_WAITING = 5 /* MT call only */ +} RIL_CallState; + +typedef enum { + RADIO_STATE_OFF = 0, /* Radio explictly powered off (eg CFUN=0) */ + RADIO_STATE_UNAVAILABLE = 1, /* Radio unavailable (eg, resetting or not booted) */ + /* States 2-9 below are deprecated. Just leaving them here for backward compatibility. */ + RADIO_STATE_SIM_NOT_READY = 2, /* Radio is on, but the SIM interface is not ready */ + RADIO_STATE_SIM_LOCKED_OR_ABSENT = 3, /* SIM PIN locked, PUK required, network + personalization locked, or SIM absent */ + RADIO_STATE_SIM_READY = 4, /* Radio is on and SIM interface is available */ + RADIO_STATE_RUIM_NOT_READY = 5, /* Radio is on, but the RUIM interface is not ready */ + RADIO_STATE_RUIM_READY = 6, /* Radio is on and the RUIM interface is available */ + RADIO_STATE_RUIM_LOCKED_OR_ABSENT = 7, /* RUIM PIN locked, PUK required, network + personalization locked, or RUIM absent */ + RADIO_STATE_NV_NOT_READY = 8, /* Radio is on, but the NV interface is not available */ + RADIO_STATE_NV_READY = 9, /* Radio is on and the NV interface is available */ + RADIO_STATE_ON = 10 /* Radio is on */ +} RIL_RadioState; + +typedef enum { + RADIO_TECH_UNKNOWN = 0, + RADIO_TECH_GPRS = 1, + RADIO_TECH_EDGE = 2, + RADIO_TECH_UMTS = 3, + RADIO_TECH_IS95A = 4, + RADIO_TECH_IS95B = 5, + RADIO_TECH_1xRTT = 6, + RADIO_TECH_EVDO_0 = 7, + RADIO_TECH_EVDO_A = 8, + RADIO_TECH_HSDPA = 9, + RADIO_TECH_HSUPA = 10, + RADIO_TECH_HSPA = 11, + RADIO_TECH_EVDO_B = 12, + RADIO_TECH_EHRPD = 13, + RADIO_TECH_LTE = 14, + RADIO_TECH_HSPAP = 15, // HSPA+ + RADIO_TECH_GSM = 16, // Only supports voice + RADIO_TECH_TD_SCDMA = 17, + RADIO_TECH_IWLAN = 18 +} RIL_RadioTechnology; + +typedef enum { + RAF_UNKNOWN = (1 << RADIO_TECH_UNKNOWN), + RAF_GPRS = (1 << RADIO_TECH_GPRS), + RAF_EDGE = (1 << RADIO_TECH_EDGE), + RAF_UMTS = (1 << RADIO_TECH_UMTS), + RAF_IS95A = (1 << RADIO_TECH_IS95A), + RAF_IS95B = (1 << RADIO_TECH_IS95B), + RAF_1xRTT = (1 << RADIO_TECH_1xRTT), + RAF_EVDO_0 = (1 << RADIO_TECH_EVDO_0), + RAF_EVDO_A = (1 << RADIO_TECH_EVDO_A), + RAF_HSDPA = (1 << RADIO_TECH_HSDPA), + RAF_HSUPA = (1 << RADIO_TECH_HSUPA), + RAF_HSPA = (1 << RADIO_TECH_HSPA), + RAF_EVDO_B = (1 << RADIO_TECH_EVDO_B), + RAF_EHRPD = (1 << RADIO_TECH_EHRPD), + RAF_LTE = (1 << RADIO_TECH_LTE), + RAF_HSPAP = (1 << RADIO_TECH_HSPAP), + RAF_GSM = (1 << RADIO_TECH_GSM), + RAF_TD_SCDMA = (1 << RADIO_TECH_TD_SCDMA), +} RIL_RadioAccessFamily; + +typedef enum { + RC_PHASE_CONFIGURED = 0, // LM is configured is initial value and value after FINISH completes + RC_PHASE_START = 1, // START is sent before Apply and indicates that an APPLY will be + // forthcoming with these same parameters + RC_PHASE_APPLY = 2, // APPLY is sent after all LM's receive START and returned + // RIL_RadioCapability.status = 0, if any START's fail no + // APPLY will be sent + RC_PHASE_UNSOL_RSP = 3, // UNSOL_RSP is sent with RIL_UNSOL_RADIO_CAPABILITY + RC_PHASE_FINISH = 4 // FINISH is sent after all commands have completed. If an error + // occurs in any previous command the RIL_RadioAccessesFamily and + // logicalModemUuid fields will be the prior configuration thus + // restoring the configuration to the previous value. An error + // returned by this command will generally be ignored or may + // cause that logical modem to be removed from service. +} RadioCapabilityPhase; + +typedef enum { + RC_STATUS_NONE = 0, // This parameter has no meaning with RC_PHASE_START, + // RC_PHASE_APPLY + RC_STATUS_SUCCESS = 1, // Tell modem the action transaction of set radio + // capability was success with RC_PHASE_FINISH + RC_STATUS_FAIL = 2, // Tell modem the action transaction of set radio + // capability is fail with RC_PHASE_FINISH. +} RadioCapabilityStatus; + +#define RIL_RADIO_CAPABILITY_VERSION 1 +typedef struct { + int version; // Version of structure, RIL_RADIO_CAPABILITY_VERSION + int session; // Unique session value defined by framework returned in all "responses/unsol" + int phase; // CONFIGURED, START, APPLY, FINISH + int rat; // RIL_RadioAccessFamily for the radio + char logicalModemUuid[MAX_UUID_LENGTH]; // A UUID typically "com.xxxx.lmX where X is the logical modem. + int status; // Return status and an input parameter for RC_PHASE_FINISH +} RIL_RadioCapability; + +// Do we want to split Data from Voice and the use +// RIL_RadioTechnology for get/setPreferredVoice/Data ? +typedef enum { + PREF_NET_TYPE_GSM_WCDMA = 0, /* GSM/WCDMA (WCDMA preferred) */ + PREF_NET_TYPE_GSM_ONLY = 1, /* GSM only */ + PREF_NET_TYPE_WCDMA = 2, /* WCDMA */ + PREF_NET_TYPE_GSM_WCDMA_AUTO = 3, /* GSM/WCDMA (auto mode, according to PRL) */ + PREF_NET_TYPE_CDMA_EVDO_AUTO = 4, /* CDMA and EvDo (auto mode, according to PRL) */ + PREF_NET_TYPE_CDMA_ONLY = 5, /* CDMA only */ + PREF_NET_TYPE_EVDO_ONLY = 6, /* EvDo only */ + PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO = 7, /* GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL) */ + PREF_NET_TYPE_LTE_CDMA_EVDO = 8, /* LTE, CDMA and EvDo */ + PREF_NET_TYPE_LTE_GSM_WCDMA = 9, /* LTE, GSM/WCDMA */ + PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA = 10, /* LTE, CDMA, EvDo, GSM/WCDMA */ + PREF_NET_TYPE_LTE_ONLY = 11, /* LTE only */ + PREF_NET_TYPE_LTE_WCDMA = 12 /* LTE/WCDMA */ +} RIL_PreferredNetworkType; + +/* Source for cdma subscription */ +typedef enum { + CDMA_SUBSCRIPTION_SOURCE_RUIM_SIM = 0, + CDMA_SUBSCRIPTION_SOURCE_NV = 1 +} RIL_CdmaSubscriptionSource; + +/* User-to-User signaling Info activation types derived from 3GPP 23.087 v8.0 */ +typedef enum { + RIL_UUS_TYPE1_IMPLICIT = 0, + RIL_UUS_TYPE1_REQUIRED = 1, + RIL_UUS_TYPE1_NOT_REQUIRED = 2, + RIL_UUS_TYPE2_REQUIRED = 3, + RIL_UUS_TYPE2_NOT_REQUIRED = 4, + RIL_UUS_TYPE3_REQUIRED = 5, + RIL_UUS_TYPE3_NOT_REQUIRED = 6 +} RIL_UUS_Type; + +/* User-to-User Signaling Information data coding schemes. Possible values for + * Octet 3 (Protocol Discriminator field) in the UUIE. The values have been + * specified in section 10.5.4.25 of 3GPP TS 24.008 */ +typedef enum { + RIL_UUS_DCS_USP = 0, /* User specified protocol */ + RIL_UUS_DCS_OSIHLP = 1, /* OSI higher layer protocol */ + RIL_UUS_DCS_X244 = 2, /* X.244 */ + RIL_UUS_DCS_RMCF = 3, /* Reserved for system mangement + convergence function */ + RIL_UUS_DCS_IA5c = 4 /* IA5 characters */ +} RIL_UUS_DCS; + +/* User-to-User Signaling Information defined in 3GPP 23.087 v8.0 + * This data is passed in RIL_ExtensionRecord and rec contains this + * structure when type is RIL_UUS_INFO_EXT_REC */ +typedef struct { + RIL_UUS_Type uusType; /* UUS Type */ + RIL_UUS_DCS uusDcs; /* UUS Data Coding Scheme */ + int uusLength; /* Length of UUS Data */ + char * uusData; /* UUS Data */ +} RIL_UUS_Info; + +/* CDMA Signal Information Record as defined in C.S0005 section 3.7.5.5 */ +typedef struct { + char isPresent; /* non-zero if signal information record is present */ + char signalType; /* as defined 3.7.5.5-1 */ + char alertPitch; /* as defined 3.7.5.5-2 */ + char signal; /* as defined 3.7.5.5-3, 3.7.5.5-4 or 3.7.5.5-5 */ +} RIL_CDMA_SignalInfoRecord; + +typedef struct { + RIL_CallState state; + int index; /* Connection Index for use with, eg, AT+CHLD */ + int toa; /* type of address, eg 145 = intl */ + char isMpty; /* nonzero if is mpty call */ + char isMT; /* nonzero if call is mobile terminated */ + char als; /* ALS line indicator if available + (0 = line 1) */ + char isVoice; /* nonzero if this is is a voice call */ + char isVideo; /* Samsung xmm7260 */ + + char isVoicePrivacy; /* nonzero if CDMA voice privacy mode is active */ + char * number; /* Remote party number */ + int numberPresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown 3=Payphone */ + char * name; /* Remote party name */ + int namePresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown 3=Payphone */ + RIL_UUS_Info * uusInfo; /* NULL or Pointer to User-User Signaling Information */ +} RIL_Call; + +/* Deprecated, use RIL_Data_Call_Response_v6 */ +typedef struct { + int cid; /* Context ID, uniquely identifies this call */ + int active; /* 0=inactive, 1=active/physical link down, 2=active/physical link up */ + char * type; /* One of the PDP_type values in TS 27.007 section 10.1.1. + For example, "IP", "IPV6", "IPV4V6", or "PPP". */ + char * apn; /* ignored */ + char * address; /* An address, e.g., "192.0.1.3" or "2001:db8::1". */ +} RIL_Data_Call_Response_v4; + +/* + * Returned by RIL_REQUEST_SETUP_DATA_CALL, RIL_REQUEST_DATA_CALL_LIST + * and RIL_UNSOL_DATA_CALL_LIST_CHANGED, on error status != 0. + */ +typedef struct { + int status; /* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error */ +#ifndef HCRADIO + int suggestedRetryTime; /* If status != 0, this fields indicates the suggested retry + back-off timer value RIL wants to override the one + pre-configured in FW. + The unit is miliseconds. + The value < 0 means no value is suggested. + The value 0 means retry should be done ASAP. + The value of INT_MAX(0x7fffffff) means no retry. */ +#endif + int cid; /* Context ID, uniquely identifies this call */ + int active; /* 0=inactive, 1=active/physical link down, 2=active/physical link up */ + char * type; /* One of the PDP_type values in TS 27.007 section 10.1.1. + For example, "IP", "IPV6", "IPV4V6", or "PPP". If status is + PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported + such as "IP" or "IPV6" */ + char * ifname; /* The network interface name */ + char * addresses; /* A space-delimited list of addresses with optional "/" prefix length, + e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64". + May not be empty, typically 1 IPv4 or 1 IPv6 or + one of each. If the prefix length is absent the addresses + are assumed to be point to point with IPv4 having a prefix + length of 32 and IPv6 128. */ + char * dnses; /* A space-delimited list of DNS server addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty. */ + char * gateways; /* A space-delimited list of default gateway addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty in which case the addresses represent point + to point connections. */ +} RIL_Data_Call_Response_v6; + +typedef struct { + int status; /* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error */ + int suggestedRetryTime; /* If status != 0, this fields indicates the suggested retry + back-off timer value RIL wants to override the one + pre-configured in FW. + The unit is miliseconds. + The value < 0 means no value is suggested. + The value 0 means retry should be done ASAP. + The value of INT_MAX(0x7fffffff) means no retry. */ + int cid; /* Context ID, uniquely identifies this call */ + int active; /* 0=inactive, 1=active/physical link down, 2=active/physical link up */ + char * type; /* One of the PDP_type values in TS 27.007 section 10.1.1. + For example, "IP", "IPV6", "IPV4V6", or "PPP". If status is + PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported + such as "IP" or "IPV6" */ + char * ifname; /* The network interface name */ + char * addresses; /* A space-delimited list of addresses with optional "/" prefix length, + e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64". + May not be empty, typically 1 IPv4 or 1 IPv6 or + one of each. If the prefix length is absent the addresses + are assumed to be point to point with IPv4 having a prefix + length of 32 and IPv6 128. */ + char * dnses; /* A space-delimited list of DNS server addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty. */ + char * gateways; /* A space-delimited list of default gateway addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty in which case the addresses represent point + to point connections. */ + char * pcscf; /* the Proxy Call State Control Function address + via PCO(Protocol Configuration Option) for IMS client. */ +} RIL_Data_Call_Response_v9; + +typedef struct { + int status; /* A RIL_DataCallFailCause, 0 which is PDP_FAIL_NONE if no error */ + int suggestedRetryTime; /* If status != 0, this fields indicates the suggested retry + back-off timer value RIL wants to override the one + pre-configured in FW. + The unit is miliseconds. + The value < 0 means no value is suggested. + The value 0 means retry should be done ASAP. + The value of INT_MAX(0x7fffffff) means no retry. */ + int cid; /* Context ID, uniquely identifies this call */ + int active; /* 0=inactive, 1=active/physical link down, 2=active/physical link up */ + char * type; /* One of the PDP_type values in TS 27.007 section 10.1.1. + For example, "IP", "IPV6", "IPV4V6", or "PPP". If status is + PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED this is the type supported + such as "IP" or "IPV6" */ + char * ifname; /* The network interface name */ + char * addresses; /* A space-delimited list of addresses with optional "/" prefix length, + e.g., "192.0.1.3" or "192.0.1.11/16 2001:db8::1/64". + May not be empty, typically 1 IPv4 or 1 IPv6 or + one of each. If the prefix length is absent the addresses + are assumed to be point to point with IPv4 having a prefix + length of 32 and IPv6 128. */ + char * dnses; /* A space-delimited list of DNS server addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty. */ + char * gateways; /* A space-delimited list of default gateway addresses, + e.g., "192.0.1.3" or "192.0.1.11 2001:db8::1". + May be empty in which case the addresses represent point + to point connections. */ + char * pcscf; /* the Proxy Call State Control Function address + via PCO(Protocol Configuration Option) for IMS client. */ + int mtu; /* MTU received from network + Value <= 0 means network has either not sent a value or + sent an invalid value */ +} RIL_Data_Call_Response_v11; + +typedef enum { + RADIO_TECH_3GPP = 1, /* 3GPP Technologies - GSM, WCDMA */ + RADIO_TECH_3GPP2 = 2 /* 3GPP2 Technologies - CDMA */ +} RIL_RadioTechnologyFamily; + +typedef struct { + RIL_RadioTechnologyFamily tech; + unsigned char retry; /* 0 == not retry, nonzero == retry */ + int messageRef; /* Valid field if retry is set to nonzero. + Contains messageRef from RIL_SMS_Response + corresponding to failed MO SMS. + */ + + union { + /* Valid field if tech is RADIO_TECH_3GPP2. See RIL_REQUEST_CDMA_SEND_SMS */ + RIL_CDMA_SMS_Message* cdmaMessage; + + /* Valid field if tech is RADIO_TECH_3GPP. See RIL_REQUEST_SEND_SMS */ + char** gsmMessage; + } message; +} RIL_IMS_SMS_Message; + +typedef struct { + int messageRef; /* TP-Message-Reference for GSM, + and BearerData MessageId for CDMA + (See 3GPP2 C.S0015-B, v2.0, table 4.5-1). */ + char *ackPDU; /* or NULL if n/a */ + int errorCode; /* See 3GPP 27.005, 3.2.5 for GSM/UMTS, + 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, + -1 if unknown or not applicable*/ +} RIL_SMS_Response; + +/** Used by RIL_REQUEST_WRITE_SMS_TO_SIM */ +typedef struct { + int status; /* Status of message. See TS 27.005 3.1, "": */ + /* 0 = "REC UNREAD" */ + /* 1 = "REC READ" */ + /* 2 = "STO UNSENT" */ + /* 3 = "STO SENT" */ + char * pdu; /* PDU of message to write, as an ASCII hex string less the SMSC address, + the TP-layer length is "strlen(pdu)/2". */ + char * smsc; /* SMSC address in GSM BCD format prefixed by a length byte + (as expected by TS 27.005) or NULL for default SMSC */ +} RIL_SMS_WriteArgs; + +/** Used by RIL_REQUEST_DIAL */ +typedef struct { + char * address; + int clir; + /* (same as 'n' paremeter in TS 27.007 7.7 "+CLIR" + * clir == 0 on "use subscription default value" + * clir == 1 on "CLIR invocation" (restrict CLI presentation) + * clir == 2 on "CLIR suppression" (allow CLI presentation) + */ + RIL_UUS_Info * uusInfo; /* NULL or Pointer to User-User Signaling Information */ +} RIL_Dial; + +typedef struct { + int command; /* one of the commands listed for TS 27.007 +CRSM*/ + int fileid; /* EF id */ + char *path; /* "pathid" from TS 27.007 +CRSM command. + Path is in hex asciii format eg "7f205f70" + Path must always be provided. + */ + int p1; + int p2; + int p3; + char *data; /* May be NULL*/ + char *pin2; /* May be NULL*/ +} RIL_SIM_IO_v5; + +typedef struct { + int command; /* one of the commands listed for TS 27.007 +CRSM*/ + int fileid; /* EF id */ + char *path; /* "pathid" from TS 27.007 +CRSM command. + Path is in hex asciii format eg "7f205f70" + Path must always be provided. + */ + int p1; + int p2; + int p3; + char *data; /* May be NULL*/ + char *pin2; /* May be NULL*/ + char *aidPtr; /* AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. */ +} RIL_SIM_IO_v6; + +/* Used by RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL and + * RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC. */ +typedef struct { + int sessionid; /* "sessionid" from TS 27.007 +CGLA command. Should be + ignored for +CSIM command. */ + + /* Following fields are used to derive the APDU ("command" and "length" + values in TS 27.007 +CSIM and +CGLA commands). */ + int cla; + int instruction; + int p1; + int p2; + int p3; /* A negative P3 implies a 4 byte APDU. */ + char *data; /* May be NULL. In hex string format. */ +} RIL_SIM_APDU; + +typedef struct { + int sw1; + int sw2; + char *simResponse; /* In hex string format ([a-fA-F0-9]*), except for SIM_AUTHENTICATION + response for which it is in Base64 format, see 3GPP TS 31.102 7.1.2 */ +} RIL_SIM_IO_Response; + +/* See also com.android.internal.telephony.gsm.CallForwardInfo */ + +typedef struct { + int status; /* + * For RIL_REQUEST_QUERY_CALL_FORWARD_STATUS + * status 1 = active, 0 = not active + * + * For RIL_REQUEST_SET_CALL_FORWARD: + * status is: + * 0 = disable + * 1 = enable + * 2 = interrogate + * 3 = registeration + * 4 = erasure + */ + + int reason; /* from TS 27.007 7.11 "reason" */ + int serviceClass;/* From 27.007 +CCFC/+CLCK "class" + See table for Android mapping from + MMI service code + 0 means user doesn't input class */ + int toa; /* "type" from TS 27.007 7.11 */ + char * number; /* "number" from TS 27.007 7.11. May be NULL */ + int timeSeconds; /* for CF no reply only */ +}RIL_CallForwardInfo; + +typedef struct { + char * cid; /* Combination of LAC and Cell Id in 32 bits in GSM. + * Upper 16 bits is LAC and lower 16 bits + * is CID (as described in TS 27.005) + * Primary Scrambling Code (as described in TS 25.331) + * in 9 bits in UMTS + * Valid values are hexadecimal 0x0000 - 0xffffffff. + */ + int rssi; /* Received RSSI in GSM, + * Level index of CPICH Received Signal Code Power in UMTS + */ +} RIL_NeighboringCell; + +typedef struct { + char lce_status; /* LCE service status: + * -1 = not supported; + * 0 = stopped; + * 1 = active. + */ + unsigned int actual_interval_ms; /* actual LCE reporting interval, + * meaningful only if LCEStatus = 1. + */ +} RIL_LceStatusInfo; + +typedef struct { + unsigned int last_hop_capacity_kbps; /* last-hop cellular capacity: kilobits/second. */ + unsigned char confidence_level; /* capacity estimate confidence: 0-100 */ + unsigned char lce_suspended; /* LCE report going to be suspended? (e.g., radio + * moves to inactive state or network type change) + * 1 = suspended; + * 0 = not suspended. + */ +} RIL_LceDataInfo; + +/* See RIL_REQUEST_LAST_CALL_FAIL_CAUSE */ +typedef enum { + CALL_FAIL_UNOBTAINABLE_NUMBER = 1, + CALL_FAIL_NORMAL = 16, + CALL_FAIL_BUSY = 17, + CALL_FAIL_CONGESTION = 34, + CALL_FAIL_ACM_LIMIT_EXCEEDED = 68, + CALL_FAIL_CALL_BARRED = 240, + CALL_FAIL_FDN_BLOCKED = 241, + CALL_FAIL_IMSI_UNKNOWN_IN_VLR = 242, + CALL_FAIL_IMEI_NOT_ACCEPTED = 243, + CALL_FAIL_DIAL_MODIFIED_TO_USSD = 244, /* STK Call Control */ + CALL_FAIL_DIAL_MODIFIED_TO_SS = 245, + CALL_FAIL_DIAL_MODIFIED_TO_DIAL = 246, + CALL_FAIL_CDMA_LOCKED_UNTIL_POWER_CYCLE = 1000, + CALL_FAIL_CDMA_DROP = 1001, + CALL_FAIL_CDMA_INTERCEPT = 1002, + CALL_FAIL_CDMA_REORDER = 1003, + CALL_FAIL_CDMA_SO_REJECT = 1004, + CALL_FAIL_CDMA_RETRY_ORDER = 1005, + CALL_FAIL_CDMA_ACCESS_FAILURE = 1006, + CALL_FAIL_CDMA_PREEMPTED = 1007, + CALL_FAIL_CDMA_NOT_EMERGENCY = 1008, /* For non-emergency number dialed + during emergency callback mode */ + CALL_FAIL_CDMA_ACCESS_BLOCKED = 1009, /* CDMA network access probes blocked */ + CALL_FAIL_ERROR_UNSPECIFIED = 0xffff +} RIL_LastCallFailCause; + +typedef struct { + RIL_LastCallFailCause cause_code; + char * vendor_cause; +} RIL_LastCallFailCauseInfo; + +/* See RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE */ +typedef enum { + PDP_FAIL_NONE = 0, /* No error, connection ok */ + + /* an integer cause code defined in TS 24.008 + section 6.1.3.1.3 or TS 24.301 Release 8+ Annex B. + If the implementation does not have access to the exact cause codes, + then it should return one of the following values, + as the UI layer needs to distinguish these + cases for error notification and potential retries. */ + PDP_FAIL_OPERATOR_BARRED = 0x08, /* no retry */ + PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A, + PDP_FAIL_MISSING_UKNOWN_APN = 0x1B, /* no retry */ + PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C, /* no retry */ + PDP_FAIL_USER_AUTHENTICATION = 0x1D, /* no retry */ + PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E, /* no retry */ + PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F, + PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20, /* no retry */ + PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21, /* no retry */ + PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22, + PDP_FAIL_NSAPI_IN_USE = 0x23, /* no retry */ + PDP_FAIL_REGULAR_DEACTIVATION = 0x24, /* possibly restart radio, + based on framework config */ + PDP_FAIL_ONLY_IPV4_ALLOWED = 0x32, /* no retry */ + PDP_FAIL_ONLY_IPV6_ALLOWED = 0x33, /* no retry */ + PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED = 0x34, + PDP_FAIL_PROTOCOL_ERRORS = 0x6F, /* no retry */ + + /* Not mentioned in the specification */ + PDP_FAIL_VOICE_REGISTRATION_FAIL = -1, + PDP_FAIL_DATA_REGISTRATION_FAIL = -2, + + /* reasons for data call drop - network/modem disconnect */ + PDP_FAIL_SIGNAL_LOST = -3, + PDP_FAIL_PREF_RADIO_TECH_CHANGED = -4,/* preferred technology has changed, should retry + with parameters appropriate for new technology */ + PDP_FAIL_RADIO_POWER_OFF = -5, /* data call was disconnected because radio was resetting, + powered off - no retry */ + PDP_FAIL_TETHERED_CALL_ACTIVE = -6, /* data call was disconnected by modem because tethered + mode was up on same APN/data profile - no retry until + tethered call is off */ + + PDP_FAIL_ERROR_UNSPECIFIED = 0xffff, /* retry silently */ +} RIL_DataCallFailCause; + +/* See RIL_REQUEST_SETUP_DATA_CALL */ +typedef enum { + RIL_DATA_PROFILE_DEFAULT = 0, + RIL_DATA_PROFILE_TETHERED = 1, + RIL_DATA_PROFILE_IMS = 2, + RIL_DATA_PROFILE_FOTA = 3, + RIL_DATA_PROFILE_CBS = 4, + RIL_DATA_PROFILE_OEM_BASE = 1000, /* Start of OEM-specific profiles */ + RIL_DATA_PROFILE_INVALID = 0xFFFFFFFF +} RIL_DataProfile; + +/* Used by RIL_UNSOL_SUPP_SVC_NOTIFICATION */ +typedef struct { + int notificationType; /* + * 0 = MO intermediate result code + * 1 = MT unsolicited result code + */ + int code; /* See 27.007 7.17 + "code1" for MO + "code2" for MT. */ + int index; /* CUG index. See 27.007 7.17. */ + int type; /* "type" from 27.007 7.17 (MT only). */ + char * number; /* "number" from 27.007 7.17 + (MT only, may be NULL). */ +} RIL_SuppSvcNotification; + +#define RIL_CARD_MAX_APPS 8 + +typedef enum { + RIL_CARDSTATE_ABSENT = 0, + RIL_CARDSTATE_PRESENT = 1, + RIL_CARDSTATE_ERROR = 2 +} RIL_CardState; + +typedef enum { + RIL_PERSOSUBSTATE_UNKNOWN = 0, /* initial state */ + RIL_PERSOSUBSTATE_IN_PROGRESS = 1, /* in between each lock transition */ + RIL_PERSOSUBSTATE_READY = 2, /* when either SIM or RUIM Perso is finished + since each app can only have 1 active perso + involved */ + RIL_PERSOSUBSTATE_SIM_NETWORK = 3, + RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET = 4, + RIL_PERSOSUBSTATE_SIM_CORPORATE = 5, + RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER = 6, + RIL_PERSOSUBSTATE_SIM_SIM = 7, + RIL_PERSOSUBSTATE_SIM_NETWORK_PUK = 8, /* The corresponding perso lock is blocked */ + RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK = 9, + RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK = 10, + RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK = 11, + RIL_PERSOSUBSTATE_SIM_SIM_PUK = 12, + RIL_PERSOSUBSTATE_RUIM_NETWORK1 = 13, + RIL_PERSOSUBSTATE_RUIM_NETWORK2 = 14, + RIL_PERSOSUBSTATE_RUIM_HRPD = 15, + RIL_PERSOSUBSTATE_RUIM_CORPORATE = 16, + RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER = 17, + RIL_PERSOSUBSTATE_RUIM_RUIM = 18, + RIL_PERSOSUBSTATE_RUIM_NETWORK1_PUK = 19, /* The corresponding perso lock is blocked */ + RIL_PERSOSUBSTATE_RUIM_NETWORK2_PUK = 20, + RIL_PERSOSUBSTATE_RUIM_HRPD_PUK = 21, + RIL_PERSOSUBSTATE_RUIM_CORPORATE_PUK = 22, + RIL_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK = 23, + RIL_PERSOSUBSTATE_RUIM_RUIM_PUK = 24 +} RIL_PersoSubstate; + +typedef enum { + RIL_APPSTATE_UNKNOWN = 0, + RIL_APPSTATE_DETECTED = 1, + RIL_APPSTATE_PIN = 2, /* If PIN1 or UPin is required */ + RIL_APPSTATE_PUK = 3, /* If PUK1 or Puk for UPin is required */ + RIL_APPSTATE_SUBSCRIPTION_PERSO = 4, /* perso_substate should be look at + when app_state is assigned to this value */ + RIL_APPSTATE_READY = 5 +} RIL_AppState; + +typedef enum { + RIL_PINSTATE_UNKNOWN = 0, + RIL_PINSTATE_ENABLED_NOT_VERIFIED = 1, + RIL_PINSTATE_ENABLED_VERIFIED = 2, + RIL_PINSTATE_DISABLED = 3, + RIL_PINSTATE_ENABLED_BLOCKED = 4, + RIL_PINSTATE_ENABLED_PERM_BLOCKED = 5 +} RIL_PinState; + +typedef enum { + RIL_APPTYPE_UNKNOWN = 0, + RIL_APPTYPE_SIM = 1, + RIL_APPTYPE_USIM = 2, + RIL_APPTYPE_RUIM = 3, + RIL_APPTYPE_CSIM = 4, + RIL_APPTYPE_ISIM = 5 +} RIL_AppType; + +typedef struct +{ + RIL_AppType app_type; + RIL_AppState app_state; + RIL_PersoSubstate perso_substate; /* applicable only if app_state == + RIL_APPSTATE_SUBSCRIPTION_PERSO */ + char *aid_ptr; /* null terminated string, e.g., from 0xA0, 0x00 -> 0x41, + 0x30, 0x30, 0x30 */ + char *app_label_ptr; /* null terminated string */ + int pin1_replaced; /* applicable to USIM, CSIM & ISIM */ + RIL_PinState pin1; + RIL_PinState pin2; + int foo1; /* Samsung */ + int foo2; /* Samsung */ + int foo3; /* Samsung */ + int foo4; /* Samsung */ + int foo5; /* Samsung */ +} RIL_AppStatus; + +/* Deprecated, use RIL_CardStatus_v6 */ +typedef struct +{ + RIL_CardState card_state; + RIL_PinState universal_pin_state; /* applicable to USIM and CSIM: RIL_PINSTATE_xxx */ + int gsm_umts_subscription_app_index; /* value < RIL_CARD_MAX_APPS, -1 if none */ + int cdma_subscription_app_index; /* value < RIL_CARD_MAX_APPS, -1 if none */ + int num_applications; /* value <= RIL_CARD_MAX_APPS */ + RIL_AppStatus applications[RIL_CARD_MAX_APPS]; +} RIL_CardStatus_v5; + +typedef struct +{ + RIL_CardState card_state; + RIL_PinState universal_pin_state; /* applicable to USIM and CSIM: RIL_PINSTATE_xxx */ + int gsm_umts_subscription_app_index; /* value < RIL_CARD_MAX_APPS, -1 if none */ + int cdma_subscription_app_index; /* value < RIL_CARD_MAX_APPS, -1 if none */ + int ims_subscription_app_index; /* value < RIL_CARD_MAX_APPS, -1 if none */ + int num_applications; /* value <= RIL_CARD_MAX_APPS */ + RIL_AppStatus applications[RIL_CARD_MAX_APPS]; +} RIL_CardStatus_v6; + +/** The result of a SIM refresh, returned in data[0] of RIL_UNSOL_SIM_REFRESH + * or as part of RIL_SimRefreshResponse_v7 + */ +typedef enum { + /* A file on SIM has been updated. data[1] contains the EFID. */ + SIM_FILE_UPDATE = 0, + /* SIM initialized. All files should be re-read. */ + SIM_INIT = 1, + /* SIM reset. SIM power required, SIM may be locked and all files should be re-read. */ + SIM_RESET = 2 +} RIL_SimRefreshResult; + +typedef struct { + RIL_SimRefreshResult result; + int ef_id; /* is the EFID of the updated file if the result is */ + /* SIM_FILE_UPDATE or 0 for any other result. */ + char * aid; /* is AID(application ID) of the card application */ + /* See ETSI 102.221 8.1 and 101.220 4 */ + /* For SIM_FILE_UPDATE result it can be set to AID of */ + /* application in which updated EF resides or it can be */ + /* NULL if EF is outside of an application. */ + /* For SIM_INIT result this field is set to AID of */ + /* application that caused REFRESH */ + /* For SIM_RESET result it is NULL. */ +} RIL_SimRefreshResponse_v7; + +/* Deprecated, use RIL_CDMA_CallWaiting_v6 */ +typedef struct { + char * number; /* Remote party number */ + int numberPresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown */ + char * name; /* Remote party name */ + RIL_CDMA_SignalInfoRecord signalInfoRecord; +} RIL_CDMA_CallWaiting_v5; + +typedef struct { + char * number; /* Remote party number */ + int numberPresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown */ + char * name; /* Remote party name */ + RIL_CDMA_SignalInfoRecord signalInfoRecord; + /* Number type/Number plan required to support International Call Waiting */ + int number_type; /* 0=Unknown, 1=International, 2=National, + 3=Network specific, 4=subscriber */ + int number_plan; /* 0=Unknown, 1=ISDN, 3=Data, 4=Telex, 8=Nat'l, 9=Private */ +} RIL_CDMA_CallWaiting_v6; + +/** + * Which types of Cell Broadcast Message (CBM) are to be received by the ME + * + * uFromServiceID - uToServiceID defines a range of CBM message identifiers + * whose value is 0x0000 - 0xFFFF as defined in TS 23.041 9.4.1.2.2 for GMS + * and 9.4.4.2.2 for UMTS. All other values can be treated as empty + * CBM message ID. + * + * uFromCodeScheme - uToCodeScheme defines a range of CBM data coding schemes + * whose value is 0x00 - 0xFF as defined in TS 23.041 9.4.1.2.3 for GMS + * and 9.4.4.2.3 for UMTS. + * All other values can be treated as empty CBM data coding scheme. + * + * selected 0 means message types specified in + * and are not accepted, while 1 means accepted. + * + * Used by RIL_REQUEST_GSM_GET_BROADCAST_CONFIG and + * RIL_REQUEST_GSM_SET_BROADCAST_CONFIG. + */ +typedef struct { + int fromServiceId; + int toServiceId; + int fromCodeScheme; + int toCodeScheme; + unsigned char selected; +} RIL_GSM_BroadcastSmsConfigInfo; + +/* No restriction at all including voice/SMS/USSD/SS/AV64 and packet data. */ +#define RIL_RESTRICTED_STATE_NONE 0x00 +/* Block emergency call due to restriction. But allow all normal voice/SMS/USSD/SS/AV64. */ +#define RIL_RESTRICTED_STATE_CS_EMERGENCY 0x01 +/* Block all normal voice/SMS/USSD/SS/AV64 due to restriction. Only Emergency call allowed. */ +#define RIL_RESTRICTED_STATE_CS_NORMAL 0x02 +/* Block all voice/SMS/USSD/SS/AV64 including emergency call due to restriction.*/ +#define RIL_RESTRICTED_STATE_CS_ALL 0x04 +/* Block packet data access due to restriction. */ +#define RIL_RESTRICTED_STATE_PS_ALL 0x10 + +/* The status for an OTASP/OTAPA session */ +typedef enum { + CDMA_OTA_PROVISION_STATUS_SPL_UNLOCKED, + CDMA_OTA_PROVISION_STATUS_SPC_RETRIES_EXCEEDED, + CDMA_OTA_PROVISION_STATUS_A_KEY_EXCHANGED, + CDMA_OTA_PROVISION_STATUS_SSD_UPDATED, + CDMA_OTA_PROVISION_STATUS_NAM_DOWNLOADED, + CDMA_OTA_PROVISION_STATUS_MDN_DOWNLOADED, + CDMA_OTA_PROVISION_STATUS_IMSI_DOWNLOADED, + CDMA_OTA_PROVISION_STATUS_PRL_DOWNLOADED, + CDMA_OTA_PROVISION_STATUS_COMMITTED, + CDMA_OTA_PROVISION_STATUS_OTAPA_STARTED, + CDMA_OTA_PROVISION_STATUS_OTAPA_STOPPED, + CDMA_OTA_PROVISION_STATUS_OTAPA_ABORTED +} RIL_CDMA_OTA_ProvisionStatus; + +typedef struct { + int signalStrength; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */ + int bitErrorRate; /* bit error rate (0-7, 99) as defined in TS 27.007 8.5 */ +} RIL_GW_SignalStrength; + +typedef struct { + int signalStrength; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */ + int bitErrorRate; /* bit error rate (0-7, 99) as defined in TS 27.007 8.5 */ +} RIL_SignalStrengthWcdma; + +typedef struct { + int dbm; /* Valid values are positive integers. This value is the actual RSSI value + * multiplied by -1. Example: If the actual RSSI is -75, then this response + * value will be 75. + */ + int ecio; /* Valid values are positive integers. This value is the actual Ec/Io multiplied + * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value + * will be 125. + */ +} RIL_CDMA_SignalStrength; + + +typedef struct { + int dbm; /* Valid values are positive integers. This value is the actual RSSI value + * multiplied by -1. Example: If the actual RSSI is -75, then this response + * value will be 75. + */ + int ecio; /* Valid values are positive integers. This value is the actual Ec/Io multiplied + * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value + * will be 125. + */ + int signalNoiseRatio; /* Valid values are 0-8. 8 is the highest signal to noise ratio. */ +} RIL_EVDO_SignalStrength; + +typedef struct { + int signalStrength; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */ + int rsrp; /* The current Reference Signal Receive Power in dBm multipled by -1. + * Range: 44 to 140 dBm + * INT_MAX: 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.133 9.1.4 */ + int rsrq; /* The current Reference Signal Receive Quality in dB multiplied by -1. + * Range: 20 to 3 dB. + * INT_MAX: 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.133 9.1.7 */ + int rssnr; /* The current reference signal signal-to-noise ratio in 0.1 dB units. + * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB). + * INT_MAX : 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.101 8.1.1 */ + int cqi; /* The current Channel Quality Indicator. + * Range: 0 to 15. + * INT_MAX : 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.101 9.2, 9.3, A.4 */ +} RIL_LTE_SignalStrength; + +typedef struct { + int signalStrength; /* Valid values are (0-31, 99) as defined in TS 27.007 8.5 */ + int rsrp; /* The current Reference Signal Receive Power in dBm multipled by -1. + * Range: 44 to 140 dBm + * INT_MAX: 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.133 9.1.4 */ + int rsrq; /* The current Reference Signal Receive Quality in dB multiplied by -1. + * Range: 20 to 3 dB. + * INT_MAX: 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.133 9.1.7 */ + int rssnr; /* The current reference signal signal-to-noise ratio in 0.1 dB units. + * Range: -200 to +300 (-200 = -20.0 dB, +300 = 30dB). + * INT_MAX : 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.101 8.1.1 */ + int cqi; /* The current Channel Quality Indicator. + * Range: 0 to 15. + * INT_MAX : 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 36.101 9.2, 9.3, A.4 */ + int timingAdvance; /* timing advance in micro seconds for a one way trip from cell to device. + * Approximate distance can be calculated using 300m/us * timingAdvance. + * Range: 0 to 0x7FFFFFFE + * INT_MAX : 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP 36.321 section 6.1.3.5 + * also: http://www.cellular-planningoptimization.com/2010/02/timing-advance-with-calculation.html */ +} RIL_LTE_SignalStrength_v8; + +typedef struct { + int rscp; /* The Received Signal Code Power in dBm multipled by -1. + * Range : 25 to 120 + * INT_MAX: 0x7FFFFFFF denotes invalid value. + * Reference: 3GPP TS 25.123, section 9.1.1.1 */ +} RIL_TD_SCDMA_SignalStrength; + +/* Deprecated, use RIL_SignalStrength_v6 */ +typedef struct { + RIL_GW_SignalStrength GW_SignalStrength; + RIL_CDMA_SignalStrength CDMA_SignalStrength; + RIL_EVDO_SignalStrength EVDO_SignalStrength; +} RIL_SignalStrength_v5; + +typedef struct { + RIL_GW_SignalStrength GW_SignalStrength; + RIL_CDMA_SignalStrength CDMA_SignalStrength; + RIL_EVDO_SignalStrength EVDO_SignalStrength; + RIL_LTE_SignalStrength LTE_SignalStrength; +} RIL_SignalStrength_v6; + +typedef struct { + RIL_GW_SignalStrength GW_SignalStrength; + RIL_CDMA_SignalStrength CDMA_SignalStrength; + RIL_EVDO_SignalStrength EVDO_SignalStrength; + RIL_LTE_SignalStrength_v8 LTE_SignalStrength; +} RIL_SignalStrength_v8; + +typedef struct { + RIL_GW_SignalStrength GW_SignalStrength; + RIL_CDMA_SignalStrength CDMA_SignalStrength; + RIL_EVDO_SignalStrength EVDO_SignalStrength; + RIL_LTE_SignalStrength_v8 LTE_SignalStrength; + RIL_TD_SCDMA_SignalStrength TD_SCDMA_SignalStrength; +} RIL_SignalStrength_v10; + +/** RIL_CellIdentityGsm */ +typedef struct { + int mcc; /* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown */ + int mnc; /* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown */ + int lac; /* 16-bit Location Area Code, 0..65535, INT_MAX if unknown */ + int cid; /* 16-bit GSM Cell Identity described in TS 27.007, 0..65535, INT_MAX if unknown */ +} RIL_CellIdentityGsm; + +/** RIL_CellIdentityWcdma */ +typedef struct { + int mcc; /* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown */ + int mnc; /* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown */ + int lac; /* 16-bit Location Area Code, 0..65535, INT_MAX if unknown */ + int cid; /* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown */ + int psc; /* 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511, INT_MAX if unknown */ +} RIL_CellIdentityWcdma; + +/** RIL_CellIdentityCdma */ +typedef struct { + int networkId; /* Network Id 0..65535, INT_MAX if unknown */ + int systemId; /* CDMA System Id 0..32767, INT_MAX if unknown */ + int basestationId; /* Base Station Id 0..65535, INT_MAX if unknown */ + int longitude; /* Longitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0. + * It is represented in units of 0.25 seconds and ranges from -2592000 + * to 2592000, both values inclusive (corresponding to a range of -180 + * to +180 degrees). INT_MAX if unknown */ + + int latitude; /* Latitude is a decimal number as specified in 3GPP2 C.S0005-A v6.0. + * It is represented in units of 0.25 seconds and ranges from -1296000 + * to 1296000, both values inclusive (corresponding to a range of -90 + * to +90 degrees). INT_MAX if unknown */ +} RIL_CellIdentityCdma; + +/** RIL_CellIdentityLte */ +typedef struct { + int mcc; /* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown */ + int mnc; /* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown */ + int ci; /* 28-bit Cell Identity described in TS ???, INT_MAX if unknown */ + int pci; /* physical cell id 0..503, INT_MAX if unknown */ + int tac; /* 16-bit tracking area code, INT_MAX if unknown */ +} RIL_CellIdentityLte; + +/** RIL_CellIdentityTdscdma */ +typedef struct { + int mcc; /* 3-digit Mobile Country Code, 0..999, INT_MAX if unknown */ + int mnc; /* 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if unknown */ + int lac; /* 16-bit Location Area Code, 0..65535, INT_MAX if unknown */ + int cid; /* 28-bit UMTS Cell Identity described in TS 25.331, 0..268435455, INT_MAX if unknown */ + int cpid; /* 8-bit Cell Parameters ID described in TS 25.331, 0..127, INT_MAX if unknown */ +} RIL_CellIdentityTdscdma; + +/** RIL_CellInfoGsm */ +typedef struct { + RIL_CellIdentityGsm cellIdentityGsm; + RIL_GW_SignalStrength signalStrengthGsm; +} RIL_CellInfoGsm; + +/** RIL_CellInfoWcdma */ +typedef struct { + RIL_CellIdentityWcdma cellIdentityWcdma; + RIL_SignalStrengthWcdma signalStrengthWcdma; +} RIL_CellInfoWcdma; + +/** RIL_CellInfoCdma */ +typedef struct { + RIL_CellIdentityCdma cellIdentityCdma; + RIL_CDMA_SignalStrength signalStrengthCdma; + RIL_EVDO_SignalStrength signalStrengthEvdo; +} RIL_CellInfoCdma; + +/** RIL_CellInfoLte */ +typedef struct { + RIL_CellIdentityLte cellIdentityLte; + RIL_LTE_SignalStrength_v8 signalStrengthLte; +} RIL_CellInfoLte; + +/** RIL_CellInfoTdscdma */ +typedef struct { + RIL_CellIdentityTdscdma cellIdentityTdscdma; + RIL_TD_SCDMA_SignalStrength signalStrengthTdscdma; +} RIL_CellInfoTdscdma; + +// Must be the same as CellInfo.TYPE_XXX +typedef enum { + RIL_CELL_INFO_TYPE_GSM = 1, + RIL_CELL_INFO_TYPE_CDMA = 2, + RIL_CELL_INFO_TYPE_LTE = 3, + RIL_CELL_INFO_TYPE_WCDMA = 4, + RIL_CELL_INFO_TYPE_TD_SCDMA = 5 +} RIL_CellInfoType; + +// Must be the same as CellInfo.TIMESTAMP_TYPE_XXX +typedef enum { + RIL_TIMESTAMP_TYPE_UNKNOWN = 0, + RIL_TIMESTAMP_TYPE_ANTENNA = 1, + RIL_TIMESTAMP_TYPE_MODEM = 2, + RIL_TIMESTAMP_TYPE_OEM_RIL = 3, + RIL_TIMESTAMP_TYPE_JAVA_RIL = 4, +} RIL_TimeStampType; + +typedef struct { + RIL_CellInfoType cellInfoType; /* cell type for selecting from union CellInfo */ + int registered; /* !0 if this cell is registered 0 if not registered */ + RIL_TimeStampType timeStampType; /* type of time stamp represented by timeStamp */ + uint64_t timeStamp; /* Time in nanos as returned by ril_nano_time */ + union { + RIL_CellInfoGsm gsm; + RIL_CellInfoCdma cdma; + RIL_CellInfoLte lte; + RIL_CellInfoWcdma wcdma; + RIL_CellInfoTdscdma tdscdma; + } CellInfo; +} RIL_CellInfo; + +/* Names of the CDMA info records (C.S0005 section 3.7.5) */ +typedef enum { + RIL_CDMA_DISPLAY_INFO_REC, + RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC, + RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC, + RIL_CDMA_CONNECTED_NUMBER_INFO_REC, + RIL_CDMA_SIGNAL_INFO_REC, + RIL_CDMA_REDIRECTING_NUMBER_INFO_REC, + RIL_CDMA_LINE_CONTROL_INFO_REC, + RIL_CDMA_EXTENDED_DISPLAY_INFO_REC, + RIL_CDMA_T53_CLIR_INFO_REC, + RIL_CDMA_T53_RELEASE_INFO_REC, + RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC +} RIL_CDMA_InfoRecName; + +/* Display Info Rec as defined in C.S0005 section 3.7.5.1 + Extended Display Info Rec as defined in C.S0005 section 3.7.5.16 + Note: the Extended Display info rec contains multiple records of the + form: display_tag, display_len, and display_len occurrences of the + chari field if the display_tag is not 10000000 or 10000001. + To save space, the records are stored consecutively in a byte buffer. + The display_tag, display_len and chari fields are all 1 byte. +*/ + +typedef struct { + char alpha_len; + char alpha_buf[CDMA_ALPHA_INFO_BUFFER_LENGTH]; +} RIL_CDMA_DisplayInfoRecord; + +/* Called Party Number Info Rec as defined in C.S0005 section 3.7.5.2 + Calling Party Number Info Rec as defined in C.S0005 section 3.7.5.3 + Connected Number Info Rec as defined in C.S0005 section 3.7.5.4 +*/ + +typedef struct { + char len; + char buf[CDMA_NUMBER_INFO_BUFFER_LENGTH]; + char number_type; + char number_plan; + char pi; + char si; +} RIL_CDMA_NumberInfoRecord; + +/* Redirecting Number Information Record as defined in C.S0005 section 3.7.5.11 */ +typedef enum { + RIL_REDIRECTING_REASON_UNKNOWN = 0, + RIL_REDIRECTING_REASON_CALL_FORWARDING_BUSY = 1, + RIL_REDIRECTING_REASON_CALL_FORWARDING_NO_REPLY = 2, + RIL_REDIRECTING_REASON_CALLED_DTE_OUT_OF_ORDER = 9, + RIL_REDIRECTING_REASON_CALL_FORWARDING_BY_THE_CALLED_DTE = 10, + RIL_REDIRECTING_REASON_CALL_FORWARDING_UNCONDITIONAL = 15, + RIL_REDIRECTING_REASON_RESERVED +} RIL_CDMA_RedirectingReason; + +typedef struct { + RIL_CDMA_NumberInfoRecord redirectingNumber; + /* redirectingReason is set to RIL_REDIRECTING_REASON_UNKNOWN if not included */ + RIL_CDMA_RedirectingReason redirectingReason; +} RIL_CDMA_RedirectingNumberInfoRecord; + +/* Line Control Information Record as defined in C.S0005 section 3.7.5.15 */ +typedef struct { + char lineCtrlPolarityIncluded; + char lineCtrlToggle; + char lineCtrlReverse; + char lineCtrlPowerDenial; +} RIL_CDMA_LineControlInfoRecord; + +/* T53 CLIR Information Record */ +typedef struct { + char cause; +} RIL_CDMA_T53_CLIRInfoRecord; + +/* T53 Audio Control Information Record */ +typedef struct { + char upLink; + char downLink; +} RIL_CDMA_T53_AudioControlInfoRecord; + +typedef struct { + + RIL_CDMA_InfoRecName name; + + union { + /* Display and Extended Display Info Rec */ + RIL_CDMA_DisplayInfoRecord display; + + /* Called Party Number, Calling Party Number, Connected Number Info Rec */ + RIL_CDMA_NumberInfoRecord number; + + /* Signal Info Rec */ + RIL_CDMA_SignalInfoRecord signal; + + /* Redirecting Number Info Rec */ + RIL_CDMA_RedirectingNumberInfoRecord redir; + + /* Line Control Info Rec */ + RIL_CDMA_LineControlInfoRecord lineCtrl; + + /* T53 CLIR Info Rec */ + RIL_CDMA_T53_CLIRInfoRecord clir; + + /* T53 Audio Control Info Rec */ + RIL_CDMA_T53_AudioControlInfoRecord audioCtrl; + } rec; +} RIL_CDMA_InformationRecord; + +#define RIL_CDMA_MAX_NUMBER_OF_INFO_RECS 10 + +typedef struct { + char numberOfInfoRecs; + RIL_CDMA_InformationRecord infoRec[RIL_CDMA_MAX_NUMBER_OF_INFO_RECS]; +} RIL_CDMA_InformationRecords; + +/* See RIL_REQUEST_NV_READ_ITEM */ +typedef struct { + RIL_NV_Item itemID; +} RIL_NV_ReadItem; + +/* See RIL_REQUEST_NV_WRITE_ITEM */ +typedef struct { + RIL_NV_Item itemID; + char * value; +} RIL_NV_WriteItem; + +typedef enum { + HANDOVER_STARTED = 0, + HANDOVER_COMPLETED = 1, + HANDOVER_FAILED = 2, + HANDOVER_CANCELED = 3 +} RIL_SrvccState; + +/* hardware configuration reported to RILJ. */ +typedef enum { + RIL_HARDWARE_CONFIG_MODEM = 0, + RIL_HARDWARE_CONFIG_SIM = 1, +} RIL_HardwareConfig_Type; + +typedef enum { + RIL_HARDWARE_CONFIG_STATE_ENABLED = 0, + RIL_HARDWARE_CONFIG_STATE_STANDBY = 1, + RIL_HARDWARE_CONFIG_STATE_DISABLED = 2, +} RIL_HardwareConfig_State; + +typedef struct { + int rilModel; + uint32_t rat; /* bitset - ref. RIL_RadioTechnology. */ + int maxVoice; + int maxData; + int maxStandby; +} RIL_HardwareConfig_Modem; + +typedef struct { + char modemUuid[MAX_UUID_LENGTH]; +} RIL_HardwareConfig_Sim; + +typedef struct { + RIL_HardwareConfig_Type type; + char uuid[MAX_UUID_LENGTH]; + RIL_HardwareConfig_State state; + union { + RIL_HardwareConfig_Modem modem; + RIL_HardwareConfig_Sim sim; + } cfg; +} RIL_HardwareConfig; + +typedef enum { + SS_CFU, + SS_CF_BUSY, + SS_CF_NO_REPLY, + SS_CF_NOT_REACHABLE, + SS_CF_ALL, + SS_CF_ALL_CONDITIONAL, + SS_CLIP, + SS_CLIR, + SS_COLP, + SS_COLR, + SS_WAIT, + SS_BAOC, + SS_BAOIC, + SS_BAOIC_EXC_HOME, + SS_BAIC, + SS_BAIC_ROAMING, + SS_ALL_BARRING, + SS_OUTGOING_BARRING, + SS_INCOMING_BARRING +} RIL_SsServiceType; + +typedef enum { + SS_ACTIVATION, + SS_DEACTIVATION, + SS_INTERROGATION, + SS_REGISTRATION, + SS_ERASURE +} RIL_SsRequestType; + +typedef enum { + SS_ALL_TELE_AND_BEARER_SERVICES, + SS_ALL_TELESEVICES, + SS_TELEPHONY, + SS_ALL_DATA_TELESERVICES, + SS_SMS_SERVICES, + SS_ALL_TELESERVICES_EXCEPT_SMS +} RIL_SsTeleserviceType; + +#define SS_INFO_MAX 4 +#define NUM_SERVICE_CLASSES 7 + +typedef struct { + int numValidIndexes; /* This gives the number of valid values in cfInfo. + For example if voice is forwarded to one number and data + is forwarded to a different one then numValidIndexes will be + 2 indicating total number of valid values in cfInfo. + Similarly if all the services are forwarded to the same + number then the value of numValidIndexes will be 1. */ + + RIL_CallForwardInfo cfInfo[NUM_SERVICE_CLASSES]; /* This is the response data + for SS request to query call + forward status. see + RIL_REQUEST_QUERY_CALL_FORWARD_STATUS */ +} RIL_CfData; + +typedef struct { + RIL_SsServiceType serviceType; + RIL_SsRequestType requestType; + RIL_SsTeleserviceType teleserviceType; + int serviceClass; + RIL_Errno result; + + union { + int ssInfo[SS_INFO_MAX]; /* This is the response data for most of the SS GET/SET + RIL requests. E.g. RIL_REQUSET_GET_CLIR returns + two ints, so first two values of ssInfo[] will be + used for response if serviceType is SS_CLIR and + requestType is SS_INTERROGATION */ + + RIL_CfData cfData; + }; +} RIL_StkCcUnsolSsResponse; + +/** + * Data connection power state + */ +typedef enum { + RIL_DC_POWER_STATE_LOW = 1, // Low power state + RIL_DC_POWER_STATE_MEDIUM = 2, // Medium power state + RIL_DC_POWER_STATE_HIGH = 3, // High power state + RIL_DC_POWER_STATE_UNKNOWN = INT32_MAX // Unknown state +} RIL_DcPowerStates; + +/** + * Data connection real time info + */ +typedef struct { + uint64_t time; // Time in nanos as returned by ril_nano_time + RIL_DcPowerStates powerState; // Current power state +} RIL_DcRtInfo; + +/** + * Data profile to modem + */ +typedef struct { + /* id of the data profile */ + int profileId; + /* the APN to connect to */ + char* apn; + /** one of the PDP_type values in TS 27.007 section 10.1.1. + * For example, "IP", "IPV6", "IPV4V6", or "PPP". + */ + char* protocol; + /** authentication protocol used for this PDP context + * (None: 0, PAP: 1, CHAP: 2, PAP&CHAP: 3) + */ + int authType; + /* the username for APN, or NULL */ + char* user; + /* the password for APN, or NULL */ + char* password; + /* the profile type, TYPE_COMMON-0, TYPE_3GPP-1, TYPE_3GPP2-2 */ + int type; + /* the period in seconds to limit the maximum connections */ + int maxConnsTime; + /* the maximum connections during maxConnsTime */ + int maxConns; + /** the required wait time in seconds after a successful UE initiated + * disconnect of a given PDN connection before the device can send + * a new PDN connection request for that given PDN + */ + int waitTime; + /* true to enable the profile, 0 to disable, 1 to enable */ + int enabled; +} RIL_DataProfileInfo; + +/* Tx Power Levels */ +#define RIL_NUM_TX_POWER_LEVELS 5 + +typedef struct { + + /* period (in ms) when modem is power collapsed */ + uint32_t sleep_mode_time_ms; + + /* period (in ms) when modem is awake and in idle mode*/ + uint32_t idle_mode_time_ms; + + /* period (in ms) for which Tx is active */ + uint32_t tx_mode_time_ms[RIL_NUM_TX_POWER_LEVELS]; + + /* period (in ms) for which Rx is active */ + uint32_t rx_mode_time_ms; +} RIL_ActivityStatsInfo; + +/** + * RIL_REQUEST_GET_SIM_STATUS + * + * Requests status of the SIM interface and the SIM card + * + * "data" is NULL + * + * "response" is const RIL_CardStatus_v6 * + * + * Valid errors: + * Must never fail + */ +#define RIL_REQUEST_GET_SIM_STATUS 1 + +/** + * RIL_REQUEST_ENTER_SIM_PIN + * + * Supplies SIM PIN. Only called if RIL_CardStatus has RIL_APPSTATE_PIN state + * + * "data" is const char ** + * ((const char **)data)[0] is PIN value + * ((const char **)data)[1] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + */ + +#define RIL_REQUEST_ENTER_SIM_PIN 2 + +/** + * RIL_REQUEST_ENTER_SIM_PUK + * + * Supplies SIM PUK and new PIN. + * + * "data" is const char ** + * ((const char **)data)[0] is PUK value + * ((const char **)data)[1] is new PIN value + * ((const char **)data)[2] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + * (PUK is invalid) + */ + +#define RIL_REQUEST_ENTER_SIM_PUK 3 + +/** + * RIL_REQUEST_ENTER_SIM_PIN2 + * + * Supplies SIM PIN2. Only called following operation where SIM_PIN2 was + * returned as a a failure from a previous operation. + * + * "data" is const char ** + * ((const char **)data)[0] is PIN2 value + * ((const char **)data)[1] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + */ + +#define RIL_REQUEST_ENTER_SIM_PIN2 4 + +/** + * RIL_REQUEST_ENTER_SIM_PUK2 + * + * Supplies SIM PUK2 and new PIN2. + * + * "data" is const char ** + * ((const char **)data)[0] is PUK2 value + * ((const char **)data)[1] is new PIN2 value + * ((const char **)data)[2] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + * (PUK2 is invalid) + */ + +#define RIL_REQUEST_ENTER_SIM_PUK2 5 + +/** + * RIL_REQUEST_CHANGE_SIM_PIN + * + * Supplies old SIM PIN and new PIN. + * + * "data" is const char ** + * ((const char **)data)[0] is old PIN value + * ((const char **)data)[1] is new PIN value + * ((const char **)data)[2] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + * (old PIN is invalid) + * + */ + +#define RIL_REQUEST_CHANGE_SIM_PIN 6 + + +/** + * RIL_REQUEST_CHANGE_SIM_PIN2 + * + * Supplies old SIM PIN2 and new PIN2. + * + * "data" is const char ** + * ((const char **)data)[0] is old PIN2 value + * ((const char **)data)[1] is new PIN2 value + * ((const char **)data)[2] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + * (old PIN2 is invalid) + * + */ + +#define RIL_REQUEST_CHANGE_SIM_PIN2 7 + +/** + * RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION + * + * Requests that network personlization be deactivated + * + * "data" is const char ** + * ((const char **)(data))[0]] is network depersonlization code + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * PASSWORD_INCORRECT + * (code is invalid) + */ + +#define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8 + +/** + * RIL_REQUEST_GET_CURRENT_CALLS + * + * Requests current call list + * + * "data" is NULL + * + * "response" must be a "const RIL_Call **" + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * (request will be made again in a few hundred msec) + */ + +#define RIL_REQUEST_GET_CURRENT_CALLS 9 + + +/** + * RIL_REQUEST_DIAL + * + * Initiate voice call + * + * "data" is const RIL_Dial * + * "response" is NULL + * + * This method is never used for supplementary service codes + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * DIAL_MODIFIED_TO_USSD + * DIAL_MODIFIED_TO_SS + * DIAL_MODIFIED_TO_DIAL + * GENERIC_FAILURE + */ +#define RIL_REQUEST_DIAL 10 + +/** + * RIL_REQUEST_GET_IMSI + * + * Get the SIM IMSI + * + * Only valid when radio state is "RADIO_STATE_ON" + * + * "data" is const char ** + * ((const char **)data)[0] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * "response" is a const char * containing the IMSI + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_GET_IMSI 11 + +/** + * RIL_REQUEST_HANGUP + * + * Hang up a specific line (like AT+CHLD=1x) + * + * After this HANGUP request returns, RIL should show the connection is NOT + * active anymore in next RIL_REQUEST_GET_CURRENT_CALLS query. + * + * "data" is an int * + * (int *)data)[0] contains Connection index (value of 'x' in CHLD above) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_HANGUP 12 + +/** + * RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND + * + * Hang up waiting or held (like AT+CHLD=0) + * + * After this HANGUP request returns, RIL should show the connection is NOT + * active anymore in next RIL_REQUEST_GET_CURRENT_CALLS query. + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13 + +/** + * RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND + * + * Hang up waiting or held (like AT+CHLD=1) + * + * After this HANGUP request returns, RIL should show the connection is NOT + * active anymore in next RIL_REQUEST_GET_CURRENT_CALLS query. + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14 + +/** + * RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE + * + * Switch waiting or holding call and active call (like AT+CHLD=2) + * + * State transitions should be is follows: + * + * If call 1 is waiting and call 2 is active, then if this re + * + * BEFORE AFTER + * Call 1 Call 2 Call 1 Call 2 + * ACTIVE HOLDING HOLDING ACTIVE + * ACTIVE WAITING HOLDING ACTIVE + * HOLDING WAITING HOLDING ACTIVE + * ACTIVE IDLE HOLDING IDLE + * IDLE IDLE IDLE IDLE + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE 15 +#define RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE 15 + +/** + * RIL_REQUEST_CONFERENCE + * + * Conference holding and active (like AT+CHLD=3) + + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ +#define RIL_REQUEST_CONFERENCE 16 + +/** + * RIL_REQUEST_UDUB + * + * Send UDUB (user determined used busy) to ringing or + * waiting call answer)(RIL_BasicRequest r); + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ +#define RIL_REQUEST_UDUB 17 + +/** + * RIL_REQUEST_LAST_CALL_FAIL_CAUSE + * + * Requests the failure cause code for the most recently terminated call + * + * "data" is NULL + * "response" is a "int *" + * ((int *)response)[0] is RIL_LastCallFailCause. GSM failure reasons are + * mapped to cause codes defined in TS 24.008 Annex H where possible. CDMA + * failure reasons are derived from the possible call failure scenarios + * described in the "CDMA IS-2000 Release A (C.S0005-A v6.0)" standard. + * + * The implementation should return CALL_FAIL_ERROR_UNSPECIFIED for blocked + * MO calls by restricted state (See RIL_UNSOL_RESTRICTED_STATE_CHANGED) + * + * If the implementation does not have access to the exact cause codes, + * then it should return one of the values listed in RIL_LastCallFailCause, + * as the UI layer needs to distinguish these cases for tone generation or + * error notification. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE + */ +#define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18 + +/** + * RIL_REQUEST_SIGNAL_STRENGTH + * + * Requests current signal strength and associated information + * + * Must succeed if radio is on. + * + * "data" is NULL + * + * "response" is a const RIL_SignalStrength * + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + */ +#define RIL_REQUEST_SIGNAL_STRENGTH 19 + +/** + * RIL_REQUEST_VOICE_REGISTRATION_STATE + * + * Request current registration state + * + * "data" is NULL + * "response" is a "char **" + * ((const char **)response)[0] is registration state 0-6, + * 0 - Not registered, MT is not currently searching + * a new operator to register + * 1 - Registered, home network + * 2 - Not registered, but MT is currently searching + * a new operator to register + * 3 - Registration denied + * 4 - Unknown + * 5 - Registered, roaming + * 10 - Same as 0, but indicates that emergency calls + * are enabled. + * 12 - Same as 2, but indicates that emergency calls + * are enabled. + * 13 - Same as 3, but indicates that emergency calls + * are enabled. + * 14 - Same as 4, but indicates that emergency calls + * are enabled. + * + * ((const char **)response)[1] is LAC if registered on a GSM/WCDMA system or + * NULL if not.Valid LAC are 0x0000 - 0xffff + * ((const char **)response)[2] is CID if registered on a * GSM/WCDMA or + * NULL if not. + * Valid CID are 0x00000000 - 0xffffffff + * In GSM, CID is Cell ID (see TS 27.007) + * in 16 bits + * In UMTS, CID is UMTS Cell Identity + * (see TS 25.331) in 28 bits + * ((const char **)response)[3] indicates the available voice radio technology, + * valid values as defined by RIL_RadioTechnology. + * ((const char **)response)[4] is Base Station ID if registered on a CDMA + * system or NULL if not. Base Station ID in + * decimal format + * ((const char **)response)[5] is Base Station latitude if registered on a + * CDMA system or NULL if not. Base Station + * latitude is a decimal number as specified in + * 3GPP2 C.S0005-A v6.0. It is represented in + * units of 0.25 seconds and ranges from -1296000 + * to 1296000, both values inclusive (corresponding + * to a range of -90 to +90 degrees). + * ((const char **)response)[6] is Base Station longitude if registered on a + * CDMA system or NULL if not. Base Station + * longitude is a decimal number as specified in + * 3GPP2 C.S0005-A v6.0. It is represented in + * units of 0.25 seconds and ranges from -2592000 + * to 2592000, both values inclusive (corresponding + * to a range of -180 to +180 degrees). + * ((const char **)response)[7] is concurrent services support indicator if + * registered on a CDMA system 0-1. + * 0 - Concurrent services not supported, + * 1 - Concurrent services supported + * ((const char **)response)[8] is System ID if registered on a CDMA system or + * NULL if not. Valid System ID are 0 - 32767 + * ((const char **)response)[9] is Network ID if registered on a CDMA system or + * NULL if not. Valid System ID are 0 - 65535 + * ((const char **)response)[10] is the TSB-58 Roaming Indicator if registered + * on a CDMA or EVDO system or NULL if not. Valid values + * are 0-255. + * ((const char **)response)[11] indicates whether the current system is in the + * PRL if registered on a CDMA or EVDO system or NULL if + * not. 0=not in the PRL, 1=in the PRL + * ((const char **)response)[12] is the default Roaming Indicator from the PRL, + * if registered on a CDMA or EVDO system or NULL if not. + * Valid values are 0-255. + * ((const char **)response)[13] if registration state is 3 (Registration + * denied) this is an enumerated reason why + * registration was denied. See 3GPP TS 24.008, + * 10.5.3.6 and Annex G. + * 0 - General + * 1 - Authentication Failure + * 2 - IMSI unknown in HLR + * 3 - Illegal MS + * 4 - Illegal ME + * 5 - PLMN not allowed + * 6 - Location area not allowed + * 7 - Roaming not allowed + * 8 - No Suitable Cells in this Location Area + * 9 - Network failure + * 10 - Persistent location update reject + * 11 - PLMN not allowed + * 12 - Location area not allowed + * 13 - Roaming not allowed in this Location Area + * 15 - No Suitable Cells in this Location Area + * 17 - Network Failure + * 20 - MAC Failure + * 21 - Sync Failure + * 22 - Congestion + * 23 - GSM Authentication unacceptable + * 25 - Not Authorized for this CSG + * 32 - Service option not supported + * 33 - Requested service option not subscribed + * 34 - Service option temporarily out of order + * 38 - Call cannot be identified + * 48-63 - Retry upon entry into a new cell + * 95 - Semantically incorrect message + * 96 - Invalid mandatory information + * 97 - Message type non-existent or not implemented + * 98 - Message not compatible with protocol state + * 99 - Information element non-existent or not implemented + * 100 - Conditional IE error + * 101 - Message not compatible with protocol state + * 111 - Protocol error, unspecified + * ((const char **)response)[14] is the Primary Scrambling Code of the current + * cell as described in TS 25.331, in hexadecimal + * format, or NULL if unknown or not registered + * to a UMTS network. + * + * Please note that registration state 4 ("unknown") is treated + * as "out of service" in the Android telephony system + * + * Registration state 3 can be returned if Location Update Reject + * (with cause 17 - Network Failure) is received repeatedly from the network, + * to facilitate "managed roaming" + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_VOICE_REGISTRATION_STATE 20 + +/** + * RIL_REQUEST_DATA_REGISTRATION_STATE + * + * Request current DATA registration state + * + * "data" is NULL + * "response" is a "char **" + * ((const char **)response)[0] is registration state 0-5 from TS 27.007 10.1.20 AT+CGREG + * ((const char **)response)[1] is LAC if registered or NULL if not + * ((const char **)response)[2] is CID if registered or NULL if not + * ((const char **)response)[3] indicates the available data radio technology, + * valid values as defined by RIL_RadioTechnology. + * ((const char **)response)[4] if registration state is 3 (Registration + * denied) this is an enumerated reason why + * registration was denied. See 3GPP TS 24.008, + * Annex G.6 "Additonal cause codes for GMM". + * 7 == GPRS services not allowed + * 8 == GPRS services and non-GPRS services not allowed + * 9 == MS identity cannot be derived by the network + * 10 == Implicitly detached + * 14 == GPRS services not allowed in this PLMN + * 16 == MSC temporarily not reachable + * 40 == No PDP context activated + * ((const char **)response)[5] The maximum number of simultaneous Data Calls that can be + * established using RIL_REQUEST_SETUP_DATA_CALL. + * + * The values at offsets 6..10 are optional LTE location information in decimal. + * If a value is unknown that value may be NULL. If all values are NULL, + * none need to be present. + * ((const char **)response)[6] is TAC, a 16-bit Tracking Area Code. + * ((const char **)response)[7] is CID, a 0-503 Physical Cell Identifier. + * ((const char **)response)[8] is ECI, a 28-bit E-UTRAN Cell Identifier. + * ((const char **)response)[9] is CSGID, a 27-bit Closed Subscriber Group Identity. + * ((const char **)response)[10] is TADV, a 6-bit timing advance value. + * + * LAC and CID are in hexadecimal format. + * valid LAC are 0x0000 - 0xffff + * valid CID are 0x00000000 - 0x0fffffff + * + * Please note that registration state 4 ("unknown") is treated + * as "out of service" in the Android telephony system + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_DATA_REGISTRATION_STATE 21 + +/** + * RIL_REQUEST_OPERATOR + * + * Request current operator ONS or EONS + * + * "data" is NULL + * "response" is a "const char **" + * ((const char **)response)[0] is long alpha ONS or EONS + * or NULL if unregistered + * + * ((const char **)response)[1] is short alpha ONS or EONS + * or NULL if unregistered + * ((const char **)response)[2] is 5 or 6 digit numeric code (MCC + MNC) + * or NULL if unregistered + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_OPERATOR 22 + +/** + * RIL_REQUEST_RADIO_POWER + * + * Toggle radio on and off (for "airplane" mode) + * If the radio is is turned off/on the radio modem subsystem + * is expected return to an initialized state. For instance, + * any voice and data calls will be terminated and all associated + * lists emptied. + * + * "data" is int * + * ((int *)data)[0] is > 0 for "Radio On" + * ((int *)data)[0] is == 0 for "Radio Off" + * + * "response" is NULL + * + * Turn radio on if "on" > 0 + * Turn radio off if "on" == 0 + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_RADIO_POWER 23 + +/** + * RIL_REQUEST_DTMF + * + * Send a DTMF tone + * + * If the implementation is currently playing a tone requested via + * RIL_REQUEST_DTMF_START, that tone should be cancelled and the new tone + * should be played instead + * + * "data" is a char * containing a single character with one of 12 values: 0-9,*,# + * "response" is NULL + * + * FIXME should this block/mute microphone? + * How does this interact with local DTMF feedback? + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_DTMF_STOP, RIL_REQUEST_DTMF_START + * + */ +#define RIL_REQUEST_DTMF 24 + +/** + * RIL_REQUEST_SEND_SMS + * + * Send an SMS message + * + * "data" is const char ** + * ((const char **)data)[0] is SMSC address in GSM BCD format prefixed + * by a length byte (as expected by TS 27.005) or NULL for default SMSC + * ((const char **)data)[1] is SMS in PDU format as an ASCII hex string + * less the SMSC address + * TP-Layer-Length is be "strlen(((const char **)data)[1])/2" + * + * "response" is a const RIL_SMS_Response * + * + * Based on the return error, caller decides to resend if sending sms + * fails. SMS_SEND_FAIL_RETRY means retry (i.e. error cause is 332) + * and GENERIC_FAILURE means no retry (i.e. error cause is 500) + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SMS_SEND_FAIL_RETRY + * FDN_CHECK_FAILURE + * GENERIC_FAILURE + * + * FIXME how do we specify TP-Message-Reference if we need to resend? + */ +#define RIL_REQUEST_SEND_SMS 25 + + +/** + * RIL_REQUEST_SEND_SMS_EXPECT_MORE + * + * Send an SMS message. Identical to RIL_REQUEST_SEND_SMS, + * except that more messages are expected to be sent soon. If possible, + * keep SMS relay protocol link open (eg TS 27.005 AT+CMMS command) + * + * "data" is const char ** + * ((const char **)data)[0] is SMSC address in GSM BCD format prefixed + * by a length byte (as expected by TS 27.005) or NULL for default SMSC + * ((const char **)data)[1] is SMS in PDU format as an ASCII hex string + * less the SMSC address + * TP-Layer-Length is be "strlen(((const char **)data)[1])/2" + * + * "response" is a const RIL_SMS_Response * + * + * Based on the return error, caller decides to resend if sending sms + * fails. SMS_SEND_FAIL_RETRY means retry (i.e. error cause is 332) + * and GENERIC_FAILURE means no retry (i.e. error cause is 500) + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SMS_SEND_FAIL_RETRY + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_SEND_SMS_EXPECT_MORE 26 + + +/** + * RIL_REQUEST_SETUP_DATA_CALL + * + * Setup a packet data connection. If RIL_Data_Call_Response_v6.status + * return success it is added to the list of data calls and a + * RIL_UNSOL_DATA_CALL_LIST_CHANGED is sent. The call remains in the + * list until RIL_REQUEST_DEACTIVATE_DATA_CALL is issued or the + * radio is powered off/on. This list is returned by RIL_REQUEST_DATA_CALL_LIST + * and RIL_UNSOL_DATA_CALL_LIST_CHANGED. + * + * The RIL is expected to: + * - Create one data call context. + * - Create and configure a dedicated interface for the context + * - The interface must be point to point. + * - The interface is configured with one or more addresses and + * is capable of sending and receiving packets. The prefix length + * of the addresses must be /32 for IPv4 and /128 for IPv6. + * - Must NOT change the linux routing table. + * - Support up to RIL_REQUEST_DATA_REGISTRATION_STATE response[5] + * number of simultaneous data call contexts. + * + * "data" is a const char ** + * ((const char **)data)[0] Radio technology to use: 0-CDMA, 1-GSM/UMTS, 2... + * for values above 2 this is RIL_RadioTechnology + 2. + * ((const char **)data)[1] is a RIL_DataProfile (support is optional) + * ((const char **)data)[2] is the APN to connect to if radio technology is GSM/UMTS. This APN will + * override the one in the profile. NULL indicates no APN overrride. + * ((const char **)data)[3] is the username for APN, or NULL + * ((const char **)data)[4] is the password for APN, or NULL + * ((const char **)data)[5] is the PAP / CHAP auth type. Values: + * 0 => PAP and CHAP is never performed. + * 1 => PAP may be performed; CHAP is never performed. + * 2 => CHAP may be performed; PAP is never performed. + * 3 => PAP / CHAP may be performed - baseband dependent. + * ((const char **)data)[6] is the connection type to request must be one of the + * PDP_type values in TS 27.007 section 10.1.1. + * For example, "IP", "IPV6", "IPV4V6", or "PPP". + * ((const char **)data)[7] Optional connection property parameters, format to be defined. + * + * "response" is a RIL_Data_Call_Response_v11 + * + * FIXME may need way to configure QoS settings + * + * Valid errors: + * SUCCESS should be returned on both success and failure of setup with + * the RIL_Data_Call_Response_v6.status containing the actual status. + * For all other errors the RIL_Data_Call_Resonse_v6 is ignored. + * + * Other errors could include: + * RADIO_NOT_AVAILABLE, GENERIC_FAILURE, OP_NOT_ALLOWED_BEFORE_REG_TO_NW, + * OP_NOT_ALLOWED_DURING_VOICE_CALL and REQUEST_NOT_SUPPORTED. + * + * See also: RIL_REQUEST_DEACTIVATE_DATA_CALL + */ +#define RIL_REQUEST_SETUP_DATA_CALL 27 + + +/** + * RIL_REQUEST_SIM_IO + * + * Request SIM I/O operation. + * This is similar to the TS 27.007 "restricted SIM" operation + * where it assumes all of the EF selection will be done by the + * callee. + * + * "data" is a const RIL_SIM_IO_v6 * + * Please note that RIL_SIM_IO has a "PIN2" field which may be NULL, + * or may specify a PIN2 for operations that require a PIN2 (eg + * updating FDN records) + * + * "response" is a const RIL_SIM_IO_Response * + * + * Arguments and responses that are unused for certain + * values of "command" should be ignored or set to NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * SIM_PIN2 + * SIM_PUK2 + */ +#define RIL_REQUEST_SIM_IO 28 + +/** + * RIL_REQUEST_SEND_USSD + * + * Send a USSD message + * + * If a USSD session already exists, the message should be sent in the + * context of that session. Otherwise, a new session should be created. + * + * The network reply should be reported via RIL_UNSOL_ON_USSD + * + * Only one USSD session may exist at a time, and the session is assumed + * to exist until: + * a) The android system invokes RIL_REQUEST_CANCEL_USSD + * b) The implementation sends a RIL_UNSOL_ON_USSD with a type code + * of "0" (USSD-Notify/no further action) or "2" (session terminated) + * + * "data" is a const char * containing the USSD request in UTF-8 format + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * FDN_CHECK_FAILURE + * USSD_MODIFIED_TO_DIAL + * USSD_MODIFIED_TO_SS + * USSD_MODIFIED_TO_USSD + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_CANCEL_USSD, RIL_UNSOL_ON_USSD + */ + +#define RIL_REQUEST_SEND_USSD 29 + +/** + * RIL_REQUEST_CANCEL_USSD + * + * Cancel the current USSD session if one exists + * + * "data" is null + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_CANCEL_USSD 30 + +/** + * RIL_REQUEST_GET_CLIR + * + * Gets current CLIR status + * "data" is NULL + * "response" is int * + * ((int *)data)[0] is "n" parameter from TS 27.007 7.7 + * ((int *)data)[1] is "m" parameter from TS 27.007 7.7 + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_GET_CLIR 31 + +/** + * RIL_REQUEST_SET_CLIR + * + * "data" is int * + * ((int *)data)[0] is "n" parameter from TS 27.007 7.7 + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_CLIR 32 + +/** + * RIL_REQUEST_QUERY_CALL_FORWARD_STATUS + * + * "data" is const RIL_CallForwardInfo * + * + * "response" is const RIL_CallForwardInfo ** + * "response" points to an array of RIL_CallForwardInfo *'s, one for + * each distinct registered phone number. + * + * For example, if data is forwarded to +18005551212 and voice is forwarded + * to +18005559999, then two separate RIL_CallForwardInfo's should be returned + * + * If, however, both data and voice are forwarded to +18005551212, then + * a single RIL_CallForwardInfo can be returned with the service class + * set to "data + voice = 3") + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_QUERY_CALL_FORWARD_STATUS 33 + + +/** + * RIL_REQUEST_SET_CALL_FORWARD + * + * Configure call forward rule + * + * "data" is const RIL_CallForwardInfo * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_CALL_FORWARD 34 + + +/** + * RIL_REQUEST_QUERY_CALL_WAITING + * + * Query current call waiting state + * + * "data" is const int * + * ((const int *)data)[0] is the TS 27.007 service class to query. + * "response" is a const int * + * ((const int *)response)[0] is 0 for "disabled" and 1 for "enabled" + * + * If ((const int *)response)[0] is = 1, then ((const int *)response)[1] + * must follow, with the TS 27.007 service class bit vector of services + * for which call waiting is enabled. + * + * For example, if ((const int *)response)[0] is 1 and + * ((const int *)response)[1] is 3, then call waiting is enabled for data + * and voice and disabled for everything else + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_QUERY_CALL_WAITING 35 + + +/** + * RIL_REQUEST_SET_CALL_WAITING + * + * Configure current call waiting state + * + * "data" is const int * + * ((const int *)data)[0] is 0 for "disabled" and 1 for "enabled" + * ((const int *)data)[1] is the TS 27.007 service class bit vector of + * services to modify + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_CALL_WAITING 36 + +/** + * RIL_REQUEST_SMS_ACKNOWLEDGE + * + * Acknowledge successful or failed receipt of SMS previously indicated + * via RIL_UNSOL_RESPONSE_NEW_SMS + * + * "data" is int * + * ((int *)data)[0] is 1 on successful receipt + * (basically, AT+CNMA=1 from TS 27.005 + * is 0 on failed receipt + * (basically, AT+CNMA=2 from TS 27.005) + * ((int *)data)[1] if data[0] is 0, this contains the failure cause as defined + * in TS 23.040, 9.2.3.22. Currently only 0xD3 (memory + * capacity exceeded) and 0xFF (unspecified error) are + * reported. + * + * "response" is NULL + * + * FIXME would like request that specified RP-ACK/RP-ERROR PDU + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SMS_ACKNOWLEDGE 37 + +/** + * RIL_REQUEST_GET_IMEI - DEPRECATED + * + * Get the device IMEI, including check digit + * + * The request is DEPRECATED, use RIL_REQUEST_DEVICE_IDENTITY + * Valid when RadioState is not RADIO_STATE_UNAVAILABLE + * + * "data" is NULL + * "response" is a const char * containing the IMEI + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_GET_IMEI 38 + +/** + * RIL_REQUEST_GET_IMEISV - DEPRECATED + * + * Get the device IMEISV, which should be two decimal digits + * + * The request is DEPRECATED, use RIL_REQUEST_DEVICE_IDENTITY + * Valid when RadioState is not RADIO_STATE_UNAVAILABLE + * + * "data" is NULL + * "response" is a const char * containing the IMEISV + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_GET_IMEISV 39 + + +/** + * RIL_REQUEST_ANSWER + * + * Answer incoming call + * + * Will not be called for WAITING calls. + * RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE will be used in this case + * instead + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_ANSWER 40 + +/** + * RIL_REQUEST_DEACTIVATE_DATA_CALL + * + * Deactivate packet data connection and remove from the + * data call list if SUCCESS is returned. Any other return + * values should also try to remove the call from the list, + * but that may not be possible. In any event a + * RIL_REQUEST_RADIO_POWER off/on must clear the list. An + * RIL_UNSOL_DATA_CALL_LIST_CHANGED is not expected to be + * issued because of an RIL_REQUEST_DEACTIVATE_DATA_CALL. + * + * "data" is const char ** + * ((char**)data)[0] indicating CID + * ((char**)data)[1] indicating Disconnect Reason + * 0 => No specific reason specified + * 1 => Radio shutdown requested + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_SETUP_DATA_CALL + */ +#define RIL_REQUEST_DEACTIVATE_DATA_CALL 41 + +/** + * RIL_REQUEST_QUERY_FACILITY_LOCK + * + * Query the status of a facility lock state + * + * "data" is const char ** + * ((const char **)data)[0] is the facility string code from TS 27.007 7.4 + * (eg "AO" for BAOC, "SC" for SIM lock) + * ((const char **)data)[1] is the password, or "" if not required + * ((const char **)data)[2] is the TS 27.007 service class bit vector of + * services to query + * ((const char **)data)[3] is AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * This is only applicable in the case of Fixed Dialing Numbers + * (FDN) requests. + * + * "response" is an int * + * ((const int *)response) 0 is the TS 27.007 service class bit vector of + * services for which the specified barring facility + * is active. "0" means "disabled for all" + * + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_QUERY_FACILITY_LOCK 42 + +/** + * RIL_REQUEST_SET_FACILITY_LOCK + * + * Enable/disable one facility lock + * + * "data" is const char ** + * + * ((const char **)data)[0] = facility string code from TS 27.007 7.4 + * (eg "AO" for BAOC) + * ((const char **)data)[1] = "0" for "unlock" and "1" for "lock" + * ((const char **)data)[2] = password + * ((const char **)data)[3] = string representation of decimal TS 27.007 + * service class bit vector. Eg, the string + * "1" means "set this facility for voice services" + * ((const char **)data)[4] = AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value. + * This is only applicable in the case of Fixed Dialing Numbers + * (FDN) requests. + * + * "response" is int * + * ((int *)response)[0] is the number of retries remaining, or -1 if unknown + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_SET_FACILITY_LOCK 43 + +/** + * RIL_REQUEST_CHANGE_BARRING_PASSWORD + * + * Change call barring facility password + * + * "data" is const char ** + * + * ((const char **)data)[0] = facility string code from TS 27.007 7.4 + * (eg "AO" for BAOC) + * ((const char **)data)[1] = old password + * ((const char **)data)[2] = new password + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CHANGE_BARRING_PASSWORD 44 + +/** + * RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE + * + * Query current network selectin mode + * + * "data" is NULL + * + * "response" is int * + * ((const int *)response)[0] is + * 0 for automatic selection + * 1 for manual selection + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE 45 + +/** + * RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC + * + * Specify that the network should be selected automatically + * + * "data" is NULL + * "response" is NULL + * + * This request must not respond until the new operator is selected + * and registered + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * ILLEGAL_SIM_OR_ME + * GENERIC_FAILURE + * + * Note: Returns ILLEGAL_SIM_OR_ME when the failure is permanent and + * no retries needed, such as illegal SIM or ME. + * Returns GENERIC_FAILURE for all other causes that might be + * fixed by retries. + * + */ +#define RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC 46 + +/** + * RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL + * + * Manually select a specified network. + * + * "data" is const char * specifying MCCMNC of network to select (eg "310170") + * "response" is NULL + * + * This request must not respond until the new operator is selected + * and registered + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * ILLEGAL_SIM_OR_ME + * GENERIC_FAILURE + * + * Note: Returns ILLEGAL_SIM_OR_ME when the failure is permanent and + * no retries needed, such as illegal SIM or ME. + * Returns GENERIC_FAILURE for all other causes that might be + * fixed by retries. + * + */ +#define RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL 47 + +/** + * RIL_REQUEST_QUERY_AVAILABLE_NETWORKS + * + * Scans for available networks + * + * "data" is NULL + * "response" is const char ** that should be an array of n*4 strings, where + * n is the number of available networks + * For each available network: + * + * ((const char **)response)[n+0] is long alpha ONS or EONS + * ((const char **)response)[n+1] is short alpha ONS or EONS + * ((const char **)response)[n+2] is 5 or 6 digit numeric code (MCC + MNC) + * ((const char **)response)[n+3] is a string value of the status: + * "unknown" + * "available" + * "current" + * "forbidden" + * + * This request must not respond until the new operator is selected + * and registered + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_QUERY_AVAILABLE_NETWORKS 48 + +/** + * RIL_REQUEST_DTMF_START + * + * Start playing a DTMF tone. Continue playing DTMF tone until + * RIL_REQUEST_DTMF_STOP is received + * + * If a RIL_REQUEST_DTMF_START is received while a tone is currently playing, + * it should cancel the previous tone and play the new one. + * + * "data" is a char * + * ((char *)data)[0] is a single character with one of 12 values: 0-9,*,# + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_DTMF, RIL_REQUEST_DTMF_STOP + */ +#define RIL_REQUEST_DTMF_START 49 + +/** + * RIL_REQUEST_DTMF_STOP + * + * Stop playing a currently playing DTMF tone. + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_DTMF, RIL_REQUEST_DTMF_START + */ +#define RIL_REQUEST_DTMF_STOP 50 + +/** + * RIL_REQUEST_BASEBAND_VERSION + * + * Return string value indicating baseband version, eg + * response from AT+CGMR + * + * "data" is NULL + * "response" is const char * containing version string for log reporting + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_BASEBAND_VERSION 51 + +/** + * RIL_REQUEST_SEPARATE_CONNECTION + * + * Separate a party from a multiparty call placing the multiparty call + * (less the specified party) on hold and leaving the specified party + * as the only other member of the current (active) call + * + * Like AT+CHLD=2x + * + * See TS 22.084 1.3.8.2 (iii) + * TS 22.030 6.5.5 "Entering "2X followed by send" + * TS 27.007 "AT+CHLD=2x" + * + * "data" is an int * + * (int *)data)[0] contains Connection index (value of 'x' in CHLD above) "response" is NULL + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SEPARATE_CONNECTION 52 + + +/** + * RIL_REQUEST_SET_MUTE + * + * Turn on or off uplink (microphone) mute. + * + * Will only be sent while voice call is active. + * Will always be reset to "disable mute" when a new voice call is initiated + * + * "data" is an int * + * (int *)data)[0] is 1 for "enable mute" and 0 for "disable mute" + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_SET_MUTE 53 + +/** + * RIL_REQUEST_GET_MUTE + * + * Queries the current state of the uplink mute setting + * + * "data" is NULL + * "response" is an int * + * (int *)response)[0] is 1 for "mute enabled" and 0 for "mute disabled" + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * SS_MODIFIED_TO_DIAL + * SS_MODIFIED_TO_USSD + * SS_MODIFIED_TO_SS + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_GET_MUTE 54 + +/** + * RIL_REQUEST_QUERY_CLIP + * + * Queries the status of the CLIP supplementary service + * + * (for MMI code "*#30#") + * + * "data" is NULL + * "response" is an int * + * (int *)response)[0] is 1 for "CLIP provisioned" + * and 0 for "CLIP not provisioned" + * and 2 for "unknown, e.g. no network etc" + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ + +#define RIL_REQUEST_QUERY_CLIP 55 + +/** + * RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE - Deprecated use the status + * field in RIL_Data_Call_Response_v6. + * + * Requests the failure cause code for the most recently failed PDP + * context or CDMA data connection active + * replaces RIL_REQUEST_LAST_PDP_FAIL_CAUSE + * + * "data" is NULL + * + * "response" is a "int *" + * ((int *)response)[0] is an integer cause code defined in TS 24.008 + * section 6.1.3.1.3 or close approximation + * + * If the implementation does not have access to the exact cause codes, + * then it should return one of the values listed in + * RIL_DataCallFailCause, as the UI layer needs to distinguish these + * cases for error notification + * and potential retries. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_LAST_CALL_FAIL_CAUSE + * + * Deprecated use the status field in RIL_Data_Call_Response_v6. + */ + +#define RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE 56 + +/** + * RIL_REQUEST_DATA_CALL_LIST + * + * Returns the data call list. An entry is added when a + * RIL_REQUEST_SETUP_DATA_CALL is issued and removed on a + * RIL_REQUEST_DEACTIVATE_DATA_CALL. The list is emptied + * when RIL_REQUEST_RADIO_POWER off/on is issued. + * + * "data" is NULL + * "response" is an array of RIL_Data_Call_Response_v6 + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * + * See also: RIL_UNSOL_DATA_CALL_LIST_CHANGED + */ + +#define RIL_REQUEST_DATA_CALL_LIST 57 + +/** + * RIL_REQUEST_RESET_RADIO - DEPRECATED + * + * Request a radio reset. The RIL implementation may postpone + * the reset until after this request is responded to if the baseband + * is presently busy. + * + * The request is DEPRECATED, use RIL_REQUEST_RADIO_POWER + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * REQUEST_NOT_SUPPORTED + */ + +#define RIL_REQUEST_RESET_RADIO 58 + +/** + * RIL_REQUEST_OEM_HOOK_RAW + * + * This request reserved for OEM-specific uses. It passes raw byte arrays + * back and forth. + * + * It can be invoked on the Java side from + * com.android.internal.telephony.Phone.invokeOemRilRequestRaw() + * + * "data" is a char * of bytes copied from the byte[] data argument in java + * "response" is a char * of bytes that will returned via the + * caller's "response" Message here: + * (byte[])(((AsyncResult)response.obj).result) + * + * An error response here will result in + * (((AsyncResult)response.obj).result) == null and + * (((AsyncResult)response.obj).exception) being an instance of + * com.android.internal.telephony.gsm.CommandException + * + * Valid errors: + * All + */ + +#define RIL_REQUEST_OEM_HOOK_RAW 59 + +/** + * RIL_REQUEST_OEM_HOOK_STRINGS + * + * This request reserved for OEM-specific uses. It passes strings + * back and forth. + * + * It can be invoked on the Java side from + * com.android.internal.telephony.Phone.invokeOemRilRequestStrings() + * + * "data" is a const char **, representing an array of null-terminated UTF-8 + * strings copied from the "String[] strings" argument to + * invokeOemRilRequestStrings() + * + * "response" is a const char **, representing an array of null-terminated UTF-8 + * stings that will be returned via the caller's response message here: + * + * (String[])(((AsyncResult)response.obj).result) + * + * An error response here will result in + * (((AsyncResult)response.obj).result) == null and + * (((AsyncResult)response.obj).exception) being an instance of + * com.android.internal.telephony.gsm.CommandException + * + * Valid errors: + * All + */ + +#define RIL_REQUEST_OEM_HOOK_STRINGS 60 + +/** + * RIL_REQUEST_SCREEN_STATE + * + * Indicates the current state of the screen. When the screen is off, the + * RIL should notify the baseband to suppress certain notifications (eg, + * signal strength and changes in LAC/CID or BID/SID/NID/latitude/longitude) + * in an effort to conserve power. These notifications should resume when the + * screen is on. + * + * "data" is int * + * ((int *)data)[0] is == 1 for "Screen On" + * ((int *)data)[0] is == 0 for "Screen Off" + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SCREEN_STATE 61 + + +/** + * RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION + * + * Enables/disables supplementary service related notifications + * from the network. + * + * Notifications are reported via RIL_UNSOL_SUPP_SVC_NOTIFICATION. + * + * "data" is int * + * ((int *)data)[0] is == 1 for notifications enabled + * ((int *)data)[0] is == 0 for notifications disabled + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_UNSOL_SUPP_SVC_NOTIFICATION. + */ +#define RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION 62 + +/** + * RIL_REQUEST_WRITE_SMS_TO_SIM + * + * Stores a SMS message to SIM memory. + * + * "data" is RIL_SMS_WriteArgs * + * + * "response" is int * + * ((const int *)response)[0] is the record index where the message is stored. + * + * Valid errors: + * SUCCESS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_WRITE_SMS_TO_SIM 63 + +/** + * RIL_REQUEST_DELETE_SMS_ON_SIM + * + * Deletes a SMS message from SIM memory. + * + * "data" is int * + * ((int *)data)[0] is the record index of the message to delete. + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_DELETE_SMS_ON_SIM 64 + +/** + * RIL_REQUEST_SET_BAND_MODE + * + * Assign a specified band for RF configuration. + * + * "data" is int * + * ((int *)data)[0] is == 0 for "unspecified" (selected by baseband automatically) + * ((int *)data)[0] is == 1 for "EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000) + * ((int *)data)[0] is == 2 for "US band" (GSM-850 / PCS-1900 / WCDMA-850 / WCDMA-PCS-1900) + * ((int *)data)[0] is == 3 for "JPN band" (WCDMA-800 / WCDMA-IMT-2000) + * ((int *)data)[0] is == 4 for "AUS band" (GSM-900 / DCS-1800 / WCDMA-850 / WCDMA-IMT-2000) + * ((int *)data)[0] is == 5 for "AUS band 2" (GSM-900 / DCS-1800 / WCDMA-850) + * ((int *)data)[0] is == 6 for "Cellular (800-MHz Band)" + * ((int *)data)[0] is == 7 for "PCS (1900-MHz Band)" + * ((int *)data)[0] is == 8 for "Band Class 3 (JTACS Band)" + * ((int *)data)[0] is == 9 for "Band Class 4 (Korean PCS Band)" + * ((int *)data)[0] is == 10 for "Band Class 5 (450-MHz Band)" + * ((int *)data)[0] is == 11 for "Band Class 6 (2-GMHz IMT2000 Band)" + * ((int *)data)[0] is == 12 for "Band Class 7 (Upper 700-MHz Band)" + * ((int *)data)[0] is == 13 for "Band Class 8 (1800-MHz Band)" + * ((int *)data)[0] is == 14 for "Band Class 9 (900-MHz Band)" + * ((int *)data)[0] is == 15 for "Band Class 10 (Secondary 800-MHz Band)" + * ((int *)data)[0] is == 16 for "Band Class 11 (400-MHz European PAMR Band)" + * ((int *)data)[0] is == 17 for "Band Class 15 (AWS Band)" + * ((int *)data)[0] is == 18 for "Band Class 16 (US 2.5-GHz Band)" + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_BAND_MODE 65 + +/** + * RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE + * + * Query the list of band mode supported by RF. + * + * "data" is NULL + * + * "response" is int * + * "response" points to an array of int's, the int[0] is the size of array, reset is one for + * each available band mode. + * + * 0 for "unspecified" (selected by baseband automatically) + * 1 for "EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000) + * 2 for "US band" (GSM-850 / PCS-1900 / WCDMA-850 / WCDMA-PCS-1900) + * 3 for "JPN band" (WCDMA-800 / WCDMA-IMT-2000) + * 4 for "AUS band" (GSM-900 / DCS-1800 / WCDMA-850 / WCDMA-IMT-2000) + * 5 for "AUS band 2" (GSM-900 / DCS-1800 / WCDMA-850) + * 6 for "Cellular (800-MHz Band)" + * 7 for "PCS (1900-MHz Band)" + * 8 for "Band Class 3 (JTACS Band)" + * 9 for "Band Class 4 (Korean PCS Band)" + * 10 for "Band Class 5 (450-MHz Band)" + * 11 for "Band Class 6 (2-GMHz IMT2000 Band)" + * 12 for "Band Class 7 (Upper 700-MHz Band)" + * 13 for "Band Class 8 (1800-MHz Band)" + * 14 for "Band Class 9 (900-MHz Band)" + * 15 for "Band Class 10 (Secondary 800-MHz Band)" + * 16 for "Band Class 11 (400-MHz European PAMR Band)" + * 17 for "Band Class 15 (AWS Band)" + * 18 for "Band Class 16 (US 2.5-GHz Band)" + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_SET_BAND_MODE + */ +#define RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE 66 + +/** + * RIL_REQUEST_STK_GET_PROFILE + * + * Requests the profile of SIM tool kit. + * The profile indicates the SAT/USAT features supported by ME. + * The SAT/USAT features refer to 3GPP TS 11.14 and 3GPP TS 31.111 + * + * "data" is NULL + * + * "response" is a const char * containing SAT/USAT profile + * in hexadecimal format string starting with first byte of terminal profile + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_GET_PROFILE 67 + +/** + * RIL_REQUEST_STK_SET_PROFILE + * + * Download the STK terminal profile as part of SIM initialization + * procedure + * + * "data" is a const char * containing SAT/USAT profile + * in hexadecimal format string starting with first byte of terminal profile + * + * "response" is NULL + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_SET_PROFILE 68 + +/** + * RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND + * + * Requests to send a SAT/USAT envelope command to SIM. + * The SAT/USAT envelope command refers to 3GPP TS 11.14 and 3GPP TS 31.111 + * + * "data" is a const char * containing SAT/USAT command + * in hexadecimal format string starting with command tag + * + * "response" is a const char * containing SAT/USAT response + * in hexadecimal format string starting with first byte of response + * (May be NULL) + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND 69 + +/** + * RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE + * + * Requests to send a terminal response to SIM for a received + * proactive command + * + * "data" is a const char * containing SAT/USAT response + * in hexadecimal format string starting with first byte of response data + * + * "response" is NULL + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE 70 + +/** + * RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM + * + * When STK application gets RIL_UNSOL_STK_CALL_SETUP, the call actually has + * been initialized by ME already. (We could see the call has been in the 'call + * list') So, STK application needs to accept/reject the call according as user + * operations. + * + * "data" is int * + * ((int *)data)[0] is > 0 for "accept" the call setup + * ((int *)data)[0] is == 0 for "reject" the call setup + * + * "response" is NULL + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM 71 + +/** + * RIL_REQUEST_EXPLICIT_CALL_TRANSFER + * + * Connects the two calls and disconnects the subscriber from both calls. + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ +#define RIL_REQUEST_EXPLICIT_CALL_TRANSFER 72 + +/** + * RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE + * + * Requests to set the preferred network type for searching and registering + * (CS/PS domain, RAT, and operation mode) + * + * "data" is int * which is RIL_PreferredNetworkType + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * MODE_NOT_SUPPORTED + */ +#define RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE 73 + +/** + * RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE + * + * Query the preferred network type (CS/PS domain, RAT, and operation mode) + * for searching and registering + * + * "data" is NULL + * + * "response" is int * + * ((int *)reponse)[0] is == RIL_PreferredNetworkType + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE + */ +#define RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE 74 + +/** + * RIL_REQUEST_NEIGHBORING_CELL_IDS + * + * Request neighboring cell id in GSM network + * + * "data" is NULL + * "response" must be a " const RIL_NeighboringCell** " + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_GET_NEIGHBORING_CELL_IDS 75 + +/** + * RIL_REQUEST_SET_LOCATION_UPDATES + * + * Enables/disables network state change notifications due to changes in + * LAC and/or CID (for GSM) or BID/SID/NID/latitude/longitude (for CDMA). + * Basically +CREG=2 vs. +CREG=1 (TS 27.007). + * + * Note: The RIL implementation should default to "updates enabled" + * when the screen is on and "updates disabled" when the screen is off. + * + * "data" is int * + * ((int *)data)[0] is == 1 for updates enabled (+CREG=2) + * ((int *)data)[0] is == 0 for updates disabled (+CREG=1) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_REQUEST_SCREEN_STATE, RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED + */ +#define RIL_REQUEST_SET_LOCATION_UPDATES 76 + +/** + * RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE + * + * Request to set the location where the CDMA subscription shall + * be retrieved + * + * "data" is int * + * ((int *)data)[0] is == RIL_CdmaSubscriptionSource + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * SIM_ABSENT + * SUBSCRIPTION_NOT_AVAILABLE + * + * See also: RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE + */ +#define RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE 77 + +/** + * RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE + * + * Request to set the roaming preferences in CDMA + * + * "data" is int * + * ((int *)data)[0] is == 0 for Home Networks only, as defined in PRL + * ((int *)data)[0] is == 1 for Roaming on Affiliated networks, as defined in PRL + * ((int *)data)[0] is == 2 for Roaming on Any Network, as defined in the PRL + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE 78 + +/** + * RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE + * + * Request the actual setting of the roaming preferences in CDMA in the modem + * + * "data" is NULL + * + * "response" is int * + * ((int *)response)[0] is == 0 for Home Networks only, as defined in PRL + * ((int *)response)[0] is == 1 for Roaming on Affiliated networks, as defined in PRL + * ((int *)response)[0] is == 2 for Roaming on Any Network, as defined in the PRL + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE 79 + +/** + * RIL_REQUEST_SET_TTY_MODE + * + * Request to set the TTY mode + * + * "data" is int * + * ((int *)data)[0] is == 0 for TTY off + * ((int *)data)[0] is == 1 for TTY Full + * ((int *)data)[0] is == 2 for TTY HCO (hearing carryover) + * ((int *)data)[0] is == 3 for TTY VCO (voice carryover) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_TTY_MODE 80 + +/** + * RIL_REQUEST_QUERY_TTY_MODE + * + * Request the setting of TTY mode + * + * "data" is NULL + * + * "response" is int * + * ((int *)response)[0] is == 0 for TTY off + * ((int *)response)[0] is == 1 for TTY Full + * ((int *)response)[0] is == 2 for TTY HCO (hearing carryover) + * ((int *)response)[0] is == 3 for TTY VCO (voice carryover) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_QUERY_TTY_MODE 81 + +/** + * RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE + * + * Request to set the preferred voice privacy mode used in voice + * scrambling + * + * "data" is int * + * ((int *)data)[0] is == 0 for Standard Privacy Mode (Public Long Code Mask) + * ((int *)data)[0] is == 1 for Enhanced Privacy Mode (Private Long Code Mask) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE 82 + +/** + * RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE + * + * Request the setting of preferred voice privacy mode + * + * "data" is NULL + * + * "response" is int * + * ((int *)response)[0] is == 0 for Standard Privacy Mode (Public Long Code Mask) + * ((int *)response)[0] is == 1 for Enhanced Privacy Mode (Private Long Code Mask) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE 83 + +/** + * RIL_REQUEST_CDMA_FLASH + * + * Send FLASH + * + * "data" is const char * + * ((const char *)data)[0] is a FLASH string + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_FLASH 84 + +/** + * RIL_REQUEST_CDMA_BURST_DTMF + * + * Send DTMF string + * + * "data" is const char ** + * ((const char **)data)[0] is a DTMF string + * ((const char **)data)[1] is the DTMF ON length in milliseconds, or 0 to use + * default + * ((const char **)data)[2] is the DTMF OFF length in milliseconds, or 0 to use + * default + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_BURST_DTMF 85 + +/** + * RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY + * + * Takes a 26 digit string (20 digit AKEY + 6 digit checksum). + * If the checksum is valid the 20 digit AKEY is written to NV, + * replacing the existing AKEY no matter what it was before. + * + * "data" is const char * + * ((const char *)data)[0] is a 26 digit string (ASCII digits '0'-'9') + * where the last 6 digits are a checksum of the + * first 20, as specified in TR45.AHAG + * "Common Cryptographic Algorithms, Revision D.1 + * Section 2.2" + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY 86 + +/** + * RIL_REQUEST_CDMA_SEND_SMS + * + * Send a CDMA SMS message + * + * "data" is const RIL_CDMA_SMS_Message * + * + * "response" is a const RIL_SMS_Response * + * + * Based on the return error, caller decides to resend if sending sms + * fails. The CDMA error class is derived as follows, + * SUCCESS is error class 0 (no error) + * SMS_SEND_FAIL_RETRY is error class 2 (temporary failure) + * and GENERIC_FAILURE is error class 3 (permanent and no retry) + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SMS_SEND_FAIL_RETRY + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_SEND_SMS 87 + +/** + * RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE + * + * Acknowledge the success or failure in the receipt of SMS + * previously indicated via RIL_UNSOL_RESPONSE_CDMA_NEW_SMS + * + * "data" is const RIL_CDMA_SMS_Ack * + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE 88 + +/** + * RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG + * + * Request the setting of GSM/WCDMA Cell Broadcast SMS config. + * + * "data" is NULL + * + * "response" is a const RIL_GSM_BroadcastSmsConfigInfo ** + * "responselen" is count * sizeof (RIL_GSM_BroadcastSmsConfigInfo *) + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG 89 + +/** + * RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG + * + * Set GSM/WCDMA Cell Broadcast SMS config + * + * "data" is a const RIL_GSM_BroadcastSmsConfigInfo ** + * "datalen" is count * sizeof(RIL_GSM_BroadcastSmsConfigInfo *) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG 90 + +/** + * RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION + * +* Enable or disable the reception of GSM/WCDMA Cell Broadcast SMS + * + * "data" is const int * + * (const int *)data[0] indicates to activate or turn off the + * reception of GSM/WCDMA Cell Broadcast SMS, 0-1, + * 0 - Activate, 1 - Turn off + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION 91 + +/** + * RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG + * + * Request the setting of CDMA Broadcast SMS config + * + * "data" is NULL + * + * "response" is a const RIL_CDMA_BroadcastSmsConfigInfo ** + * "responselen" is count * sizeof (RIL_CDMA_BroadcastSmsConfigInfo *) + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG 92 + +/** + * RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG + * + * Set CDMA Broadcast SMS config + * + * "data" is an const RIL_CDMA_BroadcastSmsConfigInfo ** + * "datalen" is count * sizeof(const RIL_CDMA_BroadcastSmsConfigInfo *) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG 93 + +/** + * RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION + * + * Enable or disable the reception of CDMA Broadcast SMS + * + * "data" is const int * + * (const int *)data[0] indicates to activate or turn off the + * reception of CDMA Broadcast SMS, 0-1, + * 0 - Activate, 1 - Turn off + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION 94 + +/** + * RIL_REQUEST_CDMA_SUBSCRIPTION + * + * Request the device MDN / H_SID / H_NID. + * + * The request is only allowed when CDMA subscription is available. When CDMA + * subscription is changed, application layer should re-issue the request to + * update the subscription information. + * + * If a NULL value is returned for any of the device id, it means that error + * accessing the device. + * + * "response" is const char ** + * ((const char **)response)[0] is MDN if CDMA subscription is available + * ((const char **)response)[1] is a comma separated list of H_SID (Home SID) if + * CDMA subscription is available, in decimal format + * ((const char **)response)[2] is a comma separated list of H_NID (Home NID) if + * CDMA subscription is available, in decimal format + * ((const char **)response)[3] is MIN (10 digits, MIN2+MIN1) if CDMA subscription is available + * ((const char **)response)[4] is PRL version if CDMA subscription is available + * + * Valid errors: + * SUCCESS + * RIL_E_SUBSCRIPTION_NOT_AVAILABLE + */ + +#define RIL_REQUEST_CDMA_SUBSCRIPTION 95 + +/** + * RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM + * + * Stores a CDMA SMS message to RUIM memory. + * + * "data" is RIL_CDMA_SMS_WriteArgs * + * + * "response" is int * + * ((const int *)response)[0] is the record index where the message is stored. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 96 + +/** + * RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM + * + * Deletes a CDMA SMS message from RUIM memory. + * + * "data" is int * + * ((int *)data)[0] is the record index of the message to delete. + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM 97 + +/** + * RIL_REQUEST_DEVICE_IDENTITY + * + * Request the device ESN / MEID / IMEI / IMEISV. + * + * The request is always allowed and contains GSM and CDMA device identity; + * it substitutes the deprecated requests RIL_REQUEST_GET_IMEI and + * RIL_REQUEST_GET_IMEISV. + * + * If a NULL value is returned for any of the device id, it means that error + * accessing the device. + * + * When CDMA subscription is changed the ESN/MEID may change. The application + * layer should re-issue the request to update the device identity in this case. + * + * "response" is const char ** + * ((const char **)response)[0] is IMEI if GSM subscription is available + * ((const char **)response)[1] is IMEISV if GSM subscription is available + * ((const char **)response)[2] is ESN if CDMA subscription is available + * ((const char **)response)[3] is MEID if CDMA subscription is available + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_DEVICE_IDENTITY 98 + +/** + * RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE + * + * Request the radio's system selection module to exit emergency + * callback mode. RIL will not respond with SUCCESS until the modem has + * completely exited from Emergency Callback Mode. + * + * "data" is NULL + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE 99 + +/** + * RIL_REQUEST_GET_SMSC_ADDRESS + * + * Queries the default Short Message Service Center address on the device. + * + * "data" is NULL + * + * "response" is const char * containing the SMSC address. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_GET_SMSC_ADDRESS 100 + +/** + * RIL_REQUEST_SET_SMSC_ADDRESS + * + * Sets the default Short Message Service Center address on the device. + * + * "data" is const char * containing the SMSC address. + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_SET_SMSC_ADDRESS 101 + +/** + * RIL_REQUEST_REPORT_SMS_MEMORY_STATUS + * + * Indicates whether there is storage available for new SMS messages. + * + * "data" is int * + * ((int *)data)[0] is 1 if memory is available for storing new messages + * is 0 if memory capacity is exceeded + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_REPORT_SMS_MEMORY_STATUS 102 + +/** + * RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING + * + * Indicates that the StkSerivce is running and is + * ready to receive RIL_UNSOL_STK_XXXXX commands. + * + * "data" is NULL + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING 103 + +/** + * RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE + * + * Request to query the location where the CDMA subscription shall + * be retrieved + * + * "data" is NULL + * + * "response" is int * + * ((int *)data)[0] is == RIL_CdmaSubscriptionSource + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * SUBSCRIPTION_NOT_AVAILABLE + * + * See also: RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE + */ +#define RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE 104 + +/** + * RIL_REQUEST_ISIM_AUTHENTICATION + * + * Request the ISIM application on the UICC to perform AKA + * challenge/response algorithm for IMS authentication + * + * "data" is a const char * containing the challenge string in Base64 format + * "response" is a const char * containing the response in Base64 format + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_ISIM_AUTHENTICATION 105 + +/** + * RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU + * + * Acknowledge successful or failed receipt of SMS previously indicated + * via RIL_UNSOL_RESPONSE_NEW_SMS, including acknowledgement TPDU to send + * as the RP-User-Data element of the RP-ACK or RP-ERROR PDU. + * + * "data" is const char ** + * ((const char **)data)[0] is "1" on successful receipt (send RP-ACK) + * is "0" on failed receipt (send RP-ERROR) + * ((const char **)data)[1] is the acknowledgement TPDU in hexadecimal format + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU 106 + +/** + * RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS + * + * Requests to send a SAT/USAT envelope command to SIM. + * The SAT/USAT envelope command refers to 3GPP TS 11.14 and 3GPP TS 31.111. + * + * This request has one difference from RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND: + * the SW1 and SW2 status bytes from the UICC response are returned along with + * the response data, using the same structure as RIL_REQUEST_SIM_IO. + * + * The RIL implementation shall perform the normal processing of a '91XX' + * response in SW1/SW2 to retrieve the pending proactive command and send it + * as an unsolicited response, as RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND does. + * + * "data" is a const char * containing the SAT/USAT command + * in hexadecimal format starting with command tag + * + * "response" is a const RIL_SIM_IO_Response * + * + * Valid errors: + * RIL_E_SUCCESS + * RIL_E_RADIO_NOT_AVAILABLE (radio resetting) + * RIL_E_GENERIC_FAILURE + */ +#define RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS 107 + +/** + * RIL_REQUEST_VOICE_RADIO_TECH + * + * Query the radio technology type (3GPP/3GPP2) used for voice. Query is valid only + * when radio state is RADIO_STATE_ON + * + * "data" is NULL + * "response" is int * + * ((int *) response)[0] is of type const RIL_RadioTechnology + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_VOICE_RADIO_TECH 108 + +/** + * RIL_REQUEST_GET_CELL_INFO_LIST + * + * Request all of the current cell information known to the radio. The radio + * must a list of all current cells, including the neighboring cells. If for a particular + * cell information isn't known then the appropriate unknown value will be returned. + * This does not cause or change the rate of RIL_UNSOL_CELL_INFO_LIST. + * + * "data" is NULL + * + * "response" is an array of RIL_CellInfo. + */ +#define RIL_REQUEST_GET_CELL_INFO_LIST 109 + +/** + * RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE + * + * Sets the minimum time between when RIL_UNSOL_CELL_INFO_LIST should be invoked. + * A value of 0, means invoke RIL_UNSOL_CELL_INFO_LIST when any of the reported + * information changes. Setting the value to INT_MAX(0x7fffffff) means never issue + * a RIL_UNSOL_CELL_INFO_LIST. + * + * "data" is int * + * ((int *)data)[0] is minimum time in milliseconds + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE 110 + +/** + * RIL_REQUEST_SET_INITIAL_ATTACH_APN + * + * Set an apn to initial attach network + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * SUBSCRIPTION_NOT_AVAILABLE + */ +#define RIL_REQUEST_SET_INITIAL_ATTACH_APN 111 + +/** + * RIL_REQUEST_IMS_REGISTRATION_STATE + * + * Request current IMS registration state + * + * "data" is NULL + * + * "response" is int * + * ((int *)response)[0] is registration state: + * 0 - Not registered + * 1 - Registered + * + * If ((int*)response)[0] is = 1, then ((int *) response)[1] + * must follow with IMS SMS format: + * + * ((int *) response)[1] is of type RIL_RadioTechnologyFamily + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_IMS_REGISTRATION_STATE 112 + +/** + * RIL_REQUEST_IMS_SEND_SMS + * + * Send a SMS message over IMS + * + * "data" is const RIL_IMS_SMS_Message * + * + * "response" is a const RIL_SMS_Response * + * + * Based on the return error, caller decides to resend if sending sms + * fails. SMS_SEND_FAIL_RETRY means retry, and other errors means no retry. + * In case of retry, data is encoded based on Voice Technology available. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * SMS_SEND_FAIL_RETRY + * FDN_CHECK_FAILURE + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_IMS_SEND_SMS 113 + +/** + * RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC + * + * Request APDU exchange on the basic channel. This command reflects TS 27.007 + * "generic SIM access" operation (+CSIM). The modem must ensure proper function + * of GSM/CDMA, and filter commands appropriately. It should filter + * channel management and SELECT by DF name commands. + * + * "data" is a const RIL_SIM_APDU * + * "sessionid" field should be ignored. + * + * "response" is a const RIL_SIM_IO_Response * + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SIM_TRANSMIT_APDU_BASIC 114 + +#if 0 +/** + * RIL_REQUEST_SIM_OPEN_CHANNEL + * + * Open a new logical channel and select the given application. This command + * reflects TS 27.007 "open logical channel" operation (+CCHO). + * + * "data" is const char * and set to AID value, See ETSI 102.221 and 101.220. + * + * "response" is int * + * ((int *)data)[0] contains the session id of the logical channel. + * ((int *)data)[1] onwards may optionally contain the select response for the + * open channel command with one byte per integer. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * MISSING_RESOURCE + * NO_SUCH_ELEMENT + */ +#define RIL_REQUEST_SIM_OPEN_CHANNEL 115 + +/** + * RIL_REQUEST_SIM_CLOSE_CHANNEL + * + * Close a previously opened logical channel. This command reflects TS 27.007 + * "close logical channel" operation (+CCHC). + * + * "data" is int * + * ((int *)data)[0] is the session id of logical the channel to close. + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SIM_CLOSE_CHANNEL 116 +#endif + +/** + * RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL + * + * Exchange APDUs with a UICC over a previously opened logical channel. This + * command reflects TS 27.007 "generic logical channel access" operation + * (+CGLA). The modem should filter channel management and SELECT by DF name + * commands. + * + * "data" is a const RIL_SIM_APDU* + * + * "response" is a const RIL_SIM_IO_Response * + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SIM_TRANSMIT_APDU_CHANNEL 117 + +/** + * RIL_REQUEST_NV_READ_ITEM + * + * Read one of the radio NV items defined in RadioNVItems.java / ril_nv_items.h. + * This is used for device configuration by some CDMA operators. + * + * "data" is a const RIL_NV_ReadItem * + * + * "response" is const char * containing the contents of the NV item + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_NV_READ_ITEM 118 + +/** + * RIL_REQUEST_NV_WRITE_ITEM + * + * Write one of the radio NV items defined in RadioNVItems.java / ril_nv_items.h. + * This is used for device configuration by some CDMA operators. + * + * "data" is a const RIL_NV_WriteItem * + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_NV_WRITE_ITEM 119 + +/** + * RIL_REQUEST_NV_WRITE_CDMA_PRL + * + * Update the CDMA Preferred Roaming List (PRL) in the radio NV storage. + * This is used for device configuration by some CDMA operators. + * + * "data" is a const char * containing the PRL as a byte array + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_NV_WRITE_CDMA_PRL 120 + +/** + * RIL_REQUEST_NV_RESET_CONFIG + * + * Reset the radio NV configuration to the factory state. + * This is used for device configuration by some CDMA operators. + * + * "data" is int * + * ((int *)data)[0] is 1 to reload all NV items + * ((int *)data)[0] is 2 for erase NV reset (SCRTN) + * ((int *)data)[0] is 3 for factory reset (RTN) + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_NV_RESET_CONFIG 121 + + /** RIL_REQUEST_SET_UICC_SUBSCRIPTION + * FIXME This API needs to have more documentation. + * + * Selection/de-selection of a subscription from a SIM card + * "data" is const RIL_SelectUiccSub* + * + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * SUBSCRIPTION_NOT_SUPPORTED + * + */ +#define RIL_REQUEST_SET_UICC_SUBSCRIPTION 122 + +/** + * RIL_REQUEST_ALLOW_DATA + * + * Tells the modem whether data calls are allowed or not + * + * "data" is int * + * FIXME slotId and aid will be added. + * ((int *)data)[0] is == 0 to allow data calls + * ((int *)data)[0] is == 1 to disallow data calls + * + * "response" is NULL + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * + */ +#define RIL_REQUEST_ALLOW_DATA 123 + +/** + * RIL_REQUEST_GET_HARDWARE_CONFIG + * + * Request all of the current hardware (modem and sim) associated + * with the RIL. + * + * "data" is NULL + * + * "response" is an array of RIL_HardwareConfig. + */ +#define RIL_REQUEST_GET_HARDWARE_CONFIG 124 + +/** + * RIL_REQUEST_SIM_AUTHENTICATION + * + * Returns the response of SIM Authentication through RIL to a + * challenge request. + * + * "data" Base64 encoded string containing challenge: + * int authContext; P2 value of authentication command, see P2 parameter in + * 3GPP TS 31.102 7.1.2 + * char *authData; the challenge string in Base64 format, see 3GPP + * TS 31.102 7.1.2 + * char *aid; AID value, See ETSI 102.221 8.1 and 101.220 4, + * NULL if no value + * + * "response" Base64 encoded strings containing response: + * int sw1; Status bytes per 3GPP TS 31.102 section 7.3 + * int sw2; + * char *simResponse; Response in Base64 format, see 3GPP TS 31.102 7.1.2 + */ +#define RIL_REQUEST_SIM_AUTHENTICATION 125 + +/** + * RIL_REQUEST_GET_DC_RT_INFO + * + * The request is DEPRECATED, use RIL_REQUEST_GET_ACTIVITY_INFO + * Requests the Data Connection Real Time Info + * + * "data" is NULL + * + * "response" is the most recent RIL_DcRtInfo + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + * + * See also: RIL_UNSOL_DC_RT_INFO_CHANGED + */ +#define RIL_REQUEST_GET_DC_RT_INFO 126 + +/** + * RIL_REQUEST_SET_DC_RT_INFO_RATE + * + * The request is DEPRECATED + * This is the minimum number of milliseconds between successive + * RIL_UNSOL_DC_RT_INFO_CHANGED messages and defines the highest rate + * at which RIL_UNSOL_DC_RT_INFO_CHANGED's will be sent. A value of + * 0 means send as fast as possible. + * + * "data" The number of milliseconds as an int + * + * "response" is null + * + * Valid errors: + * SUCCESS must not fail + */ +#define RIL_REQUEST_SET_DC_RT_INFO_RATE 127 + +/** + * RIL_REQUEST_SET_DATA_PROFILE + * + * Set data profile in modem + * Modem should erase existed profiles from framework, and apply new profiles + * "data" is an const RIL_DataProfileInfo ** + * "datalen" is count * sizeof(const RIL_DataProfileInfo *) + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + * SUBSCRIPTION_NOT_AVAILABLE + */ +#define RIL_REQUEST_SET_DATA_PROFILE 128 + +/** + * RIL_REQUEST_SHUTDOWN + * + * Device is shutting down. All further commands are ignored + * and RADIO_NOT_AVAILABLE must be returned. + * + * "data" is null + * "response" is NULL + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SHUTDOWN 129 + +/** + * RIL_REQUEST_GET_RADIO_CAPABILITY + * + * Used to get phone radio capablility. + * + * "data" is the RIL_RadioCapability structure + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_GET_RADIO_CAPABILITY 130 + +/** + * RIL_REQUEST_SET_RADIO_CAPABILITY + * + * Used to set the phones radio capability. Be VERY careful + * using this request as it may cause some vendor modems to reset. Because + * of the possible modem reset any RIL commands after this one may not be + * processed. + * + * "data" is the RIL_RadioCapability structure + * + * "response" is the RIL_RadioCapability structure, used to feedback return status + * + * Valid errors: + * SUCCESS means a RIL_UNSOL_RADIO_CAPABILITY will be sent within 30 seconds. + * RADIO_NOT_AVAILABLE + * GENERIC_FAILURE + */ +#define RIL_REQUEST_SET_RADIO_CAPABILITY 131 + +/** + * RIL_REQUEST_START_LCE + * + * Start Link Capacity Estimate (LCE) service if supported by the radio. + * + * "data" is const int * + * ((const int*)data)[0] specifies the desired reporting interval (ms). + * ((const int*)data)[1] specifies the LCE service mode. 1: PULL; 0: PUSH. + * + * "response" is the RIL_LceStatusInfo. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * LCE_NOT_SUPPORTED + */ +#define RIL_REQUEST_START_LCE 132 + +/** + * RIL_REQUEST_STOP_LCE + * + * Stop Link Capacity Estimate (LCE) service, the STOP operation should be + * idempotent for the radio modem. + * + * "response" is the RIL_LceStatusInfo. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * LCE_NOT_SUPPORTED + */ +#define RIL_REQUEST_STOP_LCE 133 + +/** + * RIL_REQUEST_PULL_LCEDATA + * + * Pull LCE service for capacity information. + * + * "response" is the RIL_LceDataInfo. + * + * Valid errors: + * SUCCESS + * RADIO_NOT_AVAILABLE + * LCE_NOT_SUPPORTED + */ +#define RIL_REQUEST_PULL_LCEDATA 134 + +/** + * RIL_REQUEST_GET_ACTIVITY_INFO + * + * Get modem activity statisitics info. + * + * There can be multiple RIL_REQUEST_GET_ACTIVITY_INFO calls to modem. + * Once the response for the request is sent modem will clear + * current statistics information. + * + * "data" is null + * "response" is const RIL_ActivityStatsInfo * + * + * Valid errors: + * + * SUCCESS + * RADIO_NOT_AVAILABLE (radio resetting) + * GENERIC_FAILURE + */ +#define RIL_REQUEST_GET_ACTIVITY_INFO 135 + +/********************************************************** + * SAMSUNG REQUESTS + **********************************************************/ + +/* + * You normally find these constants if you decompile RILConstants.class in + * framework2.odex. + */ + +#define RIL_REQUEST_GET_CELL_BROADCAST_CONFIG 10002 + +#define RIL_REQUEST_SEND_ENCODED_USSD 10005 +#define RIL_REQUEST_SET_PDA_MEMORY_STATUS 10006 +#define RIL_REQUEST_GET_PHONEBOOK_STORAGE_INFO 10007 +#define RIL_REQUEST_GET_PHONEBOOK_ENTRY 10008 +#define RIL_REQUEST_ACCESS_PHONEBOOK_ENTRY 10009 +#define RIL_REQUEST_DIAL_VIDEO_CALL 10010 +#define RIL_REQUEST_CALL_DEFLECTION 10011 +#define RIL_REQUEST_READ_SMS_FROM_SIM 10012 +#define RIL_REQUEST_USIM_PB_CAPA 10013 +#define RIL_REQUEST_LOCK_INFO 10014 + +#define RIL_REQUEST_DIAL_EMERGENCY 10016 +#define RIL_REQUEST_GET_STOREAD_MSG_COUNT 10017 +#define RIL_REQUEST_STK_SIM_INIT_EVENT 10018 +#define RIL_REQUEST_GET_LINE_ID 10019 +#define RIL_REQUEST_SET_LINE_ID 10020 +#define RIL_REQUEST_GET_SERIAL_NUMBER 10021 +#define RIL_REQUEST_GET_MANUFACTURE_DATE_NUMBER 10022 +#define RIL_REQUEST_GET_BARCODE_NUMBER 10023 +#define RIL_REQUEST_UICC_GBA_AUTHENTICATE_BOOTSTRAP 10024 +#define RIL_REQUEST_UICC_GBA_AUTHENTICATE_NAF 10025 +#define RIL_REQUEST_SIM_TRANSMIT_BASIC 10026 +#define RIL_REQUEST_SIM_OPEN_CHANNEL 10027 +#define RIL_REQUEST_SIM_CLOSE_CHANNEL 10028 +#define RIL_REQUEST_SIM_TRANSMIT_CHANNEL 10029 +#define RIL_REQUEST_SIM_AUTH 10030 +#define RIL_REQUEST_MODIFY_CALL_INITIATE 10031 +#define RIL_REQUEST_MODIFY_CALL_CONFIRM 10032 +#define RIL_REQUEST_SAFE_MODE 10033 +#define RIL_REQUEST_SET_VOICE_DOMAIN_PREF 10034 +#define RIL_REQUEST_PS_ATTACH 10035 +#define RIL_REQUEST_PS_DETACH 10036 +#define RIL_REQUEST_ACTIVATE_DATA_CALL 10037 +#define RIL_REQUEST_CHANGE_SIM_PERSO 10038 +#define RIL_REQUEST_ENTER_SIM_PERSO 10039 +#define RIL_REQUEST_GET_TIME_INFO 10040 +#define RIL_REQUEST_OMADM_SETUP_SESSION 10042 +#define RIL_REQUEST_OMADM_SERVER_START_SESSION 10043 +#define RIL_REQUEST_OMADM_CLIENT_START_SESSION 10044 +#define RIL_REQUEST_OMADM_SEND_DATA 10045 +#define RIL_REQUEST_CDMA_GET_DATAPROFILE 10046 +#define RIL_REQUEST_CDMA_SET_DATAPROFILE 10047 +#define RIL_REQUEST_CDMA_GET_SYSTEMPROPERTIES 10048 +#define RIL_REQUEST_CDMA_SET_SYSTEMPROPERTIES 10049 +#define RIL_REQUEST_SEND_SMS_COUNT 10050 +#define RIL_REQUEST_SEND_SMS_MSG 10051 +#define RIL_REQUEST_SEND_SMS_MSG_READ_STATUS 10052 +#define RIL_REQUEST_MODEM_HANGUP 10053 +#define RIL_REQUEST_SET_SIM_POWER 10054 +#define RIL_REQUEST_SET_PREFERRED_NETWORK_LIST 10055 +#define RIL_REQUEST_GET_PREFERRED_NETWORK_LIST 10056 +#define RIL_REQUEST_HANGUP_VT 10057 + + +/***********************************************************************/ + + +#define RIL_UNSOL_RESPONSE_BASE 1000 + +/** + * RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED + * + * Indicate when value of RIL_RadioState has changed. + * + * Callee will invoke RIL_RadioStateRequest method on main thread + * + * "data" is NULL + */ + +#define RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED 1000 + + +/** + * RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED + * + * Indicate when call state has changed + * + * Callee will invoke RIL_REQUEST_GET_CURRENT_CALLS on main thread + * + * "data" is NULL + * + * Response should be invoked on, for example, + * "RING", "BUSY", "NO CARRIER", and also call state + * transitions (DIALING->ALERTING ALERTING->ACTIVE) + * + * Redundent or extraneous invocations are tolerated + */ +#define RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED 1001 + + +/** + * RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED + * + * Called when the voice network state changed + * + * Callee will invoke the following requests on main thread: + * + * RIL_REQUEST_VOICE_REGISTRATION_STATE + * RIL_REQUEST_OPERATOR + * + * "data" is NULL + * + * FIXME should this happen when SIM records are loaded? (eg, for + * EONS) + */ +#define RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED 1002 + +/** + * RIL_UNSOL_RESPONSE_NEW_SMS + * + * Called when new SMS is received. + * + * "data" is const char * + * This is a pointer to a string containing the PDU of an SMS-DELIVER + * as an ascii string of hex digits. The PDU starts with the SMSC address + * per TS 27.005 (+CMT:) + * + * Callee will subsequently confirm the receipt of thei SMS with a + * RIL_REQUEST_SMS_ACKNOWLEDGE + * + * No new RIL_UNSOL_RESPONSE_NEW_SMS + * or RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT messages should be sent until a + * RIL_REQUEST_SMS_ACKNOWLEDGE has been received + */ + +#define RIL_UNSOL_RESPONSE_NEW_SMS 1003 + +/** + * RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT + * + * Called when new SMS Status Report is received. + * + * "data" is const char * + * This is a pointer to a string containing the PDU of an SMS-STATUS-REPORT + * as an ascii string of hex digits. The PDU starts with the SMSC address + * per TS 27.005 (+CDS:). + * + * Callee will subsequently confirm the receipt of the SMS with a + * RIL_REQUEST_SMS_ACKNOWLEDGE + * + * No new RIL_UNSOL_RESPONSE_NEW_SMS + * or RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT messages should be sent until a + * RIL_REQUEST_SMS_ACKNOWLEDGE has been received + */ + +#define RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT 1004 + +/** + * RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM + * + * Called when new SMS has been stored on SIM card + * + * "data" is const int * + * ((const int *)data)[0] contains the slot index on the SIM that contains + * the new message + */ + +#define RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM 1005 + +/** + * RIL_UNSOL_ON_USSD + * + * Called when a new USSD message is received. + * + * "data" is const char ** + * ((const char **)data)[0] points to a type code, which is + * one of these string values: + * "0" USSD-Notify -- text in ((const char **)data)[1] + * "1" USSD-Request -- text in ((const char **)data)[1] + * "2" Session terminated by network + * "3" other local client (eg, SIM Toolkit) has responded + * "4" Operation not supported + * "5" Network timeout + * + * The USSD session is assumed to persist if the type code is "1", otherwise + * the current session (if any) is assumed to have terminated. + * + * ((const char **)data)[1] points to a message string if applicable, which + * should always be in UTF-8. + */ +#define RIL_UNSOL_ON_USSD 1006 +/* Previously #define RIL_UNSOL_ON_USSD_NOTIFY 1006 */ + +/** + * RIL_UNSOL_ON_USSD_REQUEST + * + * Obsolete. Send via RIL_UNSOL_ON_USSD + */ +#define RIL_UNSOL_ON_USSD_REQUEST 1007 + +/** + * RIL_UNSOL_NITZ_TIME_RECEIVED + * + * Called when radio has received a NITZ time message + * + * "data" is const char * pointing to NITZ time string + * in the form "yy/mm/dd,hh:mm:ss(+/-)tz,dt" + */ +#define RIL_UNSOL_NITZ_TIME_RECEIVED 1008 + +/** + * RIL_UNSOL_SIGNAL_STRENGTH + * + * Radio may report signal strength rather han have it polled. + * + * "data" is a const RIL_SignalStrength * + */ +#define RIL_UNSOL_SIGNAL_STRENGTH 1009 + + +/** + * RIL_UNSOL_DATA_CALL_LIST_CHANGED + * + * "data" is an array of RIL_Data_Call_Response_v6 identical to that + * returned by RIL_REQUEST_DATA_CALL_LIST. It is the complete list + * of current data contexts including new contexts that have been + * activated. A data call is only removed from this list when the + * framework sends a RIL_REQUEST_DEACTIVATE_DATA_CALL or the radio + * is powered off/on. + * + * See also: RIL_REQUEST_DATA_CALL_LIST + */ + +#define RIL_UNSOL_DATA_CALL_LIST_CHANGED 1010 + +/** + * RIL_UNSOL_SUPP_SVC_NOTIFICATION + * + * Reports supplementary service related notification from the network. + * + * "data" is a const RIL_SuppSvcNotification * + * + */ + +#define RIL_UNSOL_SUPP_SVC_NOTIFICATION 1011 + +/** + * RIL_UNSOL_STK_SESSION_END + * + * Indicate when STK session is terminated by SIM. + * + * "data" is NULL + */ +#define RIL_UNSOL_STK_SESSION_END 1012 + +/** + * RIL_UNSOL_STK_PROACTIVE_COMMAND + * + * Indicate when SIM issue a STK proactive command to applications + * + * "data" is a const char * containing SAT/USAT proactive command + * in hexadecimal format string starting with command tag + * + */ +#define RIL_UNSOL_STK_PROACTIVE_COMMAND 1013 + +/** + * RIL_UNSOL_STK_EVENT_NOTIFY + * + * Indicate when SIM notifies applcations some event happens. + * Generally, application does not need to have any feedback to + * SIM but shall be able to indicate appropriate messages to users. + * + * "data" is a const char * containing SAT/USAT commands or responses + * sent by ME to SIM or commands handled by ME, in hexadecimal format string + * starting with first byte of response data or command tag + * + */ +#define RIL_UNSOL_STK_EVENT_NOTIFY 1014 + +/** + * RIL_UNSOL_STK_CALL_SETUP + * + * Indicate when SIM wants application to setup a voice call. + * + * "data" is const int * + * ((const int *)data)[0] contains timeout value (in milliseconds) + */ +#define RIL_UNSOL_STK_CALL_SETUP 1015 + +/** + * RIL_UNSOL_SIM_SMS_STORAGE_FULL + * + * Indicates that SMS storage on the SIM is full. Sent when the network + * attempts to deliver a new SMS message. Messages cannot be saved on the + * SIM until space is freed. In particular, incoming Class 2 messages + * cannot be stored. + * + * "data" is null + * + */ +#define RIL_UNSOL_SIM_SMS_STORAGE_FULL 1016 + +/** + * RIL_UNSOL_SIM_REFRESH + * + * Indicates that file(s) on the SIM have been updated, or the SIM + * has been reinitialized. + * + * In the case where RIL is version 6 or older: + * "data" is an int * + * ((int *)data)[0] is a RIL_SimRefreshResult. + * ((int *)data)[1] is the EFID of the updated file if the result is + * SIM_FILE_UPDATE or NULL for any other result. + * + * In the case where RIL is version 7: + * "data" is a RIL_SimRefreshResponse_v7 * + * + * Note: If the SIM state changes as a result of the SIM refresh (eg, + * SIM_READY -> SIM_LOCKED_OR_ABSENT), RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED + * should be sent. + */ +#define RIL_UNSOL_SIM_REFRESH 1017 + +/** + * RIL_UNSOL_CALL_RING + * + * Ring indication for an incoming call (eg, RING or CRING event). + * There must be at least one RIL_UNSOL_CALL_RING at the beginning + * of a call and sending multiple is optional. If the system property + * ro.telephony.call_ring.multiple is false then the upper layers + * will generate the multiple events internally. Otherwise the vendor + * ril must generate multiple RIL_UNSOL_CALL_RING if + * ro.telephony.call_ring.multiple is true or if it is absent. + * + * The rate of these events is controlled by ro.telephony.call_ring.delay + * and has a default value of 3000 (3 seconds) if absent. + * + * "data" is null for GSM + * "data" is const RIL_CDMA_SignalInfoRecord * if CDMA + */ +#define RIL_UNSOL_CALL_RING 1018 + +/** + * RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED + * + * Indicates that SIM state changes. + * + * Callee will invoke RIL_REQUEST_GET_SIM_STATUS on main thread + + * "data" is null + */ +#define RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED 1019 + +/** + * RIL_UNSOL_RESPONSE_CDMA_NEW_SMS + * + * Called when new CDMA SMS is received + * + * "data" is const RIL_CDMA_SMS_Message * + * + * Callee will subsequently confirm the receipt of the SMS with + * a RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE + * + * No new RIL_UNSOL_RESPONSE_CDMA_NEW_SMS should be sent until + * RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE has been received + * + */ +#define RIL_UNSOL_RESPONSE_CDMA_NEW_SMS 1020 + +/** + * RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS + * + * Called when new Broadcast SMS is received + * + * "data" can be one of the following: + * If received from GSM network, "data" is const char of 88 bytes + * which indicates each page of a CBS Message sent to the MS by the + * BTS as coded in 3GPP 23.041 Section 9.4.1.2. + * If received from UMTS network, "data" is const char of 90 up to 1252 + * bytes which contain between 1 and 15 CBS Message pages sent as one + * packet to the MS by the BTS as coded in 3GPP 23.041 Section 9.4.2.2. + * + */ +#define RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS 1021 + +/** + * RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL + * + * Indicates that SMS storage on the RUIM is full. Messages + * cannot be saved on the RUIM until space is freed. + * + * "data" is null + * + */ +#define RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL 1022 + +/** + * RIL_UNSOL_RESTRICTED_STATE_CHANGED + * + * Indicates a restricted state change (eg, for Domain Specific Access Control). + * + * Radio need send this msg after radio off/on cycle no matter it is changed or not. + * + * "data" is an int * + * ((int *)data)[0] contains a bitmask of RIL_RESTRICTED_STATE_* values. + */ +#define RIL_UNSOL_RESTRICTED_STATE_CHANGED 1023 + +/** + * RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE + * + * Indicates that the radio system selection module has + * autonomously entered emergency callback mode. + * + * "data" is null + * + */ +#define RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE 1024 + +/** + * RIL_UNSOL_CDMA_CALL_WAITING + * + * Called when CDMA radio receives a call waiting indication. + * + * "data" is const RIL_CDMA_CallWaiting * + * + */ +#define RIL_UNSOL_CDMA_CALL_WAITING 1025 + +/** + * RIL_UNSOL_CDMA_OTA_PROVISION_STATUS + * + * Called when CDMA radio receives an update of the progress of an + * OTASP/OTAPA call. + * + * "data" is const int * + * For CDMA this is an integer OTASP/OTAPA status listed in + * RIL_CDMA_OTA_ProvisionStatus. + * + */ +#define RIL_UNSOL_CDMA_OTA_PROVISION_STATUS 1026 + +/** + * RIL_UNSOL_CDMA_INFO_REC + * + * Called when CDMA radio receives one or more info recs. + * + * "data" is const RIL_CDMA_InformationRecords * + * + */ +#define RIL_UNSOL_CDMA_INFO_REC 1027 + +/** + * RIL_UNSOL_OEM_HOOK_RAW + * + * This is for OEM specific use. + * + * "data" is a byte[] + */ +#define RIL_UNSOL_OEM_HOOK_RAW 1028 + +/** + * RIL_UNSOL_RINGBACK_TONE + * + * Indicates that nework doesn't have in-band information, need to + * play out-band tone. + * + * "data" is an int * + * ((int *)data)[0] == 0 for stop play ringback tone. + * ((int *)data)[0] == 1 for start play ringback tone. + */ +#define RIL_UNSOL_RINGBACK_TONE 1029 + +/** + * RIL_UNSOL_RESEND_INCALL_MUTE + * + * Indicates that framework/application need reset the uplink mute state. + * + * There may be situations where the mute state becomes out of sync + * between the application and device in some GSM infrastructures. + * + * "data" is null + */ +#define RIL_UNSOL_RESEND_INCALL_MUTE 1030 + +/** + * RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED + * + * Called when CDMA subscription source changed. + * + * "data" is int * + * ((int *)data)[0] is == RIL_CdmaSubscriptionSource + */ +#define RIL_UNSOL_CDMA_SUBSCRIPTION_SOURCE_CHANGED 1031 + +/** + * RIL_UNSOL_CDMA_PRL_CHANGED + * + * Called when PRL (preferred roaming list) changes. + * + * "data" is int * + * ((int *)data)[0] is PRL_VERSION as would be returned by RIL_REQUEST_CDMA_SUBSCRIPTION + */ +#define RIL_UNSOL_CDMA_PRL_CHANGED 1032 + +/** + * RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE + * + * Called when Emergency Callback Mode Ends + * + * Indicates that the radio system selection module has + * proactively exited emergency callback mode. + * + * "data" is NULL + * + */ +#define RIL_UNSOL_EXIT_EMERGENCY_CALLBACK_MODE 1033 + +/** + * RIL_UNSOL_RIL_CONNECTED + * + * Called the ril connects and returns the version + * + * "data" is int * + * ((int *)data)[0] is RIL_VERSION + */ +#define RIL_UNSOL_RIL_CONNECTED 1034 + +/** + * RIL_UNSOL_VOICE_RADIO_TECH_CHANGED + * + * Indicates that voice technology has changed. Contains new radio technology + * as a data in the message. + * + * "data" is int * + * ((int *)data)[0] is of type const RIL_RadioTechnology + * + */ +#define RIL_UNSOL_VOICE_RADIO_TECH_CHANGED 1035 + +/** + * RIL_UNSOL_CELL_INFO_LIST + * + * Same information as returned by RIL_REQUEST_GET_CELL_INFO_LIST, but returned + * at the rate no greater than specified by RIL_REQUEST_SET_UNSOL_CELL_INFO_RATE. + * + * "data" is NULL + * + * "response" is an array of RIL_CellInfo. + */ +#define RIL_UNSOL_CELL_INFO_LIST 1036 + +/** + * RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED + * + * Called when IMS registration state has changed + * + * To get IMS registration state and IMS SMS format, callee needs to invoke the + * following request on main thread: + * + * RIL_REQUEST_IMS_REGISTRATION_STATE + * + * "data" is NULL + * + */ +#define RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED 1037 + +/** + * RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED + * + * Indicated when there is a change in subscription status. + * This event will be sent in the following scenarios + * - subscription readiness at modem, which was selected by telephony layer + * - when subscription is deactivated by modem due to UICC card removal + * - When network invalidates the subscription i.e. attach reject due to authentication reject + * + * "data" is const int * + * ((const int *)data)[0] == 0 for Subscription Deactivated + * ((const int *)data)[0] == 1 for Subscription Activated + * + */ +#define RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED 1038 + +/** + * RIL_UNSOL_SRVCC_STATE_NOTIFY + * + * Called when Single Radio Voice Call Continuity(SRVCC) + * progress state has changed + * + * "data" is int * + * ((int *)data)[0] is of type const RIL_SrvccState + * + */ +#define RIL_UNSOL_SRVCC_STATE_NOTIFY 1039 + +/** + * RIL_UNSOL_HARDWARE_CONFIG_CHANGED + * + * Called when the hardware configuration associated with the RILd changes + * + * "data" is an array of RIL_HardwareConfig + * + */ +#define RIL_UNSOL_HARDWARE_CONFIG_CHANGED 1040 + +/** + * RIL_UNSOL_DC_RT_INFO_CHANGED + * + * The message is DEPRECATED, use RIL_REQUEST_GET_ACTIVITY_INFO + * Sent when the DC_RT_STATE changes but the time + * between these messages must not be less than the + * value set by RIL_REQUEST_SET_DC_RT_RATE. + * + * "data" is the most recent RIL_DcRtInfo + * + */ +#define RIL_UNSOL_DC_RT_INFO_CHANGED 1041 + +/** + * RIL_UNSOL_RADIO_CAPABILITY + * + * Sent when RIL_REQUEST_SET_RADIO_CAPABILITY completes. + * Returns the phone radio capability exactly as + * RIL_REQUEST_GET_RADIO_CAPABILITY and should be the + * same set as sent by RIL_REQUEST_SET_RADIO_CAPABILITY. + * + * "data" is the RIL_RadioCapability structure + */ +#define RIL_UNSOL_RADIO_CAPABILITY 1042 + +/* + * RIL_UNSOL_ON_SS + * + * Called when SS response is received when DIAL/USSD/SS is changed to SS by + * call control. + * + * "data" is const RIL_StkCcUnsolSsResponse * + * + */ +#define RIL_UNSOL_ON_SS 1043 + +/** + * RIL_UNSOL_STK_CC_ALPHA_NOTIFY + * + * Called when there is an ALPHA from UICC during Call Control. + * + * "data" is const char * containing ALPHA string from UICC in UTF-8 format. + * + */ +#define RIL_UNSOL_STK_CC_ALPHA_NOTIFY 1044 + +/** + * RIL_UNSOL_LCEDATA_RECV + * + * Called when there is an incoming Link Capacity Estimate (LCE) info report. + * + * "data" is the RIL_LceDataInfo structure. + * + */ +#define RIL_UNSOL_LCEDATA_RECV 1045 + +/***********************************************************************/ + +/********************************************************** + * SAMSUNG RESPONSE + **********************************************************/ + +#define SAMSUNG_UNSOL_RESPONSE_BASE 11000 + +#define RIL_UNSOL_RELEASE_COMPLETE_MESSAGE 11001 +#define RIL_UNSOL_STK_SEND_SMS_RESULT 11002 +#define RIL_UNSOL_STK_CALL_CONTROL_RESULT 11003 +#define RIL_UNSOL_DUN_CALL_STATUS 11004 + +#define RIL_UNSOL_O2_HOME_ZONE_INFO 11007 +#define RIL_UNSOL_DEVICE_READY_NOTI 11008 +#define RIL_UNSOL_GPS_NOTI 11009 +#define RIL_UNSOL_AM 11010 +#define RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL 11011 +#define RIL_UNSOL_DATA_SUSPEND_RESUME 11012 +#define RIL_UNSOL_SAP 11013 + +#define RIL_UNSOL_SIM_SMS_STORAGE_AVAILALE 11015 +#define RIL_UNSOL_HSDPA_STATE_CHANGED 11016 +#define RIL_UNSOL_WB_AMR_STATE 11017 +#define RIL_UNSOL_TWO_MIC_STATE 11018 +#define RIL_UNSOL_DHA_STATE 11019 +#define RIL_UNSOL_UART 11020 +#define RIL_UNSOL_SIM_PB_READY 11021 +#define RIL_UNSOL_RESPONSE_HANDOVER 11038 +#define RIL_UNSOL_IPV6_ADDR 11039 +#define RIL_UNSOL_NWK_INIT_DISC_REQUEST 11040 +#define RIL_UNSOL_RTS_INDICATION 11041 +#define RIL_UNSOL_OMADM_SEND_DATA 11046 +#define RIL_UNSOL_DUN 11047 +#define RIL_UNSOL_SYSTEM_REBOOT 11048 +#define RIL_UNSOL_VOICE_PRIVACY_CHANGED 11049 +#define RIL_UNSOL_UTS_GETSMSCOUNT 11050 +#define RIL_UNSOL_UTS_GETSMSMSG 11051 +#define RIL_UNSOL_UTS_GET_UNREAD_SMS_STATUS 11052 +#define RIL_UNSOL_MIP_CONNECT_STATUS 11053 + +/* SNDMGR */ + +#define RIL_UNSOL_SNDMGR_WB_AMR_REPORT 20017 + +/***********************************************************************/ + +#if defined(ANDROID_MULTI_SIM) +/** + * RIL_Request Function pointer + * + * @param request is one of RIL_REQUEST_* + * @param data is pointer to data defined for that RIL_REQUEST_* + * data is owned by caller, and should not be modified or freed by callee + * @param t should be used in subsequent call to RIL_onResponse + * @param datalen the length of data + * + */ +typedef void (*RIL_RequestFunc) (int request, void *data, + size_t datalen, RIL_Token t, RIL_SOCKET_ID socket_id); + +/** + * This function should return the current radio state synchronously + */ +typedef RIL_RadioState (*RIL_RadioStateRequest)(RIL_SOCKET_ID socket_id); + +#else +/* Backward compatible */ + +/** + * RIL_Request Function pointer + * + * @param request is one of RIL_REQUEST_* + * @param data is pointer to data defined for that RIL_REQUEST_* + * data is owned by caller, and should not be modified or freed by callee + * @param t should be used in subsequent call to RIL_onResponse + * @param datalen the length of data + * + */ +typedef void (*RIL_RequestFunc) (int request, void *data, + size_t datalen, RIL_Token t); + +/** + * This function should return the current radio state synchronously + */ +typedef RIL_RadioState (*RIL_RadioStateRequest)(); + +#endif + + +/** + * This function returns "1" if the specified RIL_REQUEST code is + * supported and 0 if it is not + * + * @param requestCode is one of RIL_REQUEST codes + */ + +typedef int (*RIL_Supports)(int requestCode); + +/** + * This function is called from a separate thread--not the + * thread that calls RIL_RequestFunc--and indicates that a pending + * request should be cancelled. + * + * On cancel, the callee should do its best to abandon the request and + * call RIL_onRequestComplete with RIL_Errno CANCELLED at some later point. + * + * Subsequent calls to RIL_onRequestComplete for this request with + * other results will be tolerated but ignored. (That is, it is valid + * to ignore the cancellation request) + * + * RIL_Cancel calls should return immediately, and not wait for cancellation + * + * Please see ITU v.250 5.6.1 for how one might implement this on a TS 27.007 + * interface + * + * @param t token wants to be canceled + */ + +typedef void (*RIL_Cancel)(RIL_Token t); + +typedef void (*RIL_TimedCallback) (void *param); + +/** + * Return a version string for your RIL implementation + */ +typedef const char * (*RIL_GetVersion) (void); + +typedef struct { + int version; /* set to RIL_VERSION */ + RIL_RequestFunc onRequest; + RIL_RadioStateRequest onStateRequest; + RIL_Supports supports; + RIL_Cancel onCancel; + RIL_GetVersion getVersion; +} RIL_RadioFunctions; + +typedef struct { + char *apn; + char *protocol; + int authtype; + char *username; + char *password; +} RIL_InitialAttachApn; + +typedef struct { + int authContext; /* P2 value of authentication command, see P2 parameter in + 3GPP TS 31.102 7.1.2 */ + char *authData; /* the challenge string in Base64 format, see 3GPP + TS 31.102 7.1.2 */ + char *aid; /* AID value, See ETSI 102.221 8.1 and 101.220 4, + NULL if no value. */ +} RIL_SimAuthentication; + +#ifdef RIL_SHLIB +struct RIL_Env { + /** + * "t" is parameter passed in on previous call to RIL_Notification + * routine. + * + * If "e" != SUCCESS, then response can be null/is ignored + * + * "response" is owned by caller, and should not be modified or + * freed by callee + * + * RIL_onRequestComplete will return as soon as possible + */ + void (*OnRequestComplete)(RIL_Token t, RIL_Errno e, + void *response, size_t responselen); + +#if defined(ANDROID_MULTI_SIM) + /** + * "unsolResponse" is one of RIL_UNSOL_RESPONSE_* + * "data" is pointer to data defined for that RIL_UNSOL_RESPONSE_* + * + * "data" is owned by caller, and should not be modified or freed by callee + */ + void (*OnUnsolicitedResponse)(int unsolResponse, const void *data, size_t datalen, RIL_SOCKET_ID socket_id); +#else + /** + * "unsolResponse" is one of RIL_UNSOL_RESPONSE_* + * "data" is pointer to data defined for that RIL_UNSOL_RESPONSE_* + * + * "data" is owned by caller, and should not be modified or freed by callee + */ + void (*OnUnsolicitedResponse)(int unsolResponse, const void *data, size_t datalen); +#endif + /** + * Call user-specifed "callback" function on on the same thread that + * RIL_RequestFunc is called. If "relativeTime" is specified, then it specifies + * a relative time value at which the callback is invoked. If relativeTime is + * NULL or points to a 0-filled structure, the callback will be invoked as + * soon as possible + */ + + void (*RequestTimedCallback) (RIL_TimedCallback callback, + void *param, const struct timeval *relativeTime); +}; + + +/** + * RIL implementations must defined RIL_Init + * argc and argv will be command line arguments intended for the RIL implementation + * Return NULL on error + * + * @param env is environment point defined as RIL_Env + * @param argc number of arguments + * @param argv list fo arguments + * + */ +const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv); + +#else /* RIL_SHLIB */ + +/** + * Call this once at startup to register notification routine + * + * @param callbacks user-specifed callback function + */ +void RIL_register (const RIL_RadioFunctions *callbacks); + + +/** + * + * RIL_onRequestComplete will return as soon as possible + * + * @param t is parameter passed in on previous call to RIL_Notification + * routine. + * @param e error code + * if "e" != SUCCESS, then response can be null/is ignored + * @param response is owned by caller, and should not be modified or + * freed by callee + * @param responselen the length of response in byte + */ +void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, + void *response, size_t responselen); + +#if defined(ANDROID_MULTI_SIM) +/** + * @param unsolResponse is one of RIL_UNSOL_RESPONSE_* + * @param data is pointer to data defined for that RIL_UNSOL_RESPONSE_* + * "data" is owned by caller, and should not be modified or freed by callee + * @param datalen the length of data in byte + */ + +void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, + size_t datalen, RIL_SOCKET_ID socket_id); +#else +/** + * @param unsolResponse is one of RIL_UNSOL_RESPONSE_* + * @param data is pointer to data defined for that RIL_UNSOL_RESPONSE_* + * "data" is owned by caller, and should not be modified or freed by callee + * @param datalen the length of data in byte + */ + +void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, + size_t datalen); +#endif + +/** + * Call user-specifed "callback" function on on the same thread that + * RIL_RequestFunc is called. If "relativeTime" is specified, then it specifies + * a relative time value at which the callback is invoked. If relativeTime is + * NULL or points to a 0-filled structure, the callback will be invoked as + * soon as possible + * + * @param callback user-specifed callback function + * @param param parameter list + * @param relativeTime a relative time value at which the callback is invoked + */ + +void RIL_requestTimedCallback (RIL_TimedCallback callback, + void *param, const struct timeval *relativeTime); + + +#endif /* RIL_SHLIB */ + +#ifdef __cplusplus +} +#endif + +#endif /*ANDROID_RIL_H*/ diff --git a/overlay/frameworks/base/core/res/res/values/cm_arrays.xml b/overlay/frameworks/base/core/res/res/values/cm_arrays.xml new file mode 100644 index 0000000..30c6798 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/cm_arrays.xml @@ -0,0 +1,32 @@ + + + + + + @string/reboot_reboot + @string/reboot_recovery + @string/reboot_download + + + + + + recovery + download + + 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..2eb7c19 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + "wifi,1,1,1,-1,true" + "mobile,0,0,0,-1,true" + "mobile_mms,2,0,2,60000,true" + "mobile_supl,3,0,2,60000,true" + "mobile_dun,4,0,2,60000,true" + "mobile_hipri,5,0,3,60000,true" + "mobile_fota,10,0,2,60000,true" + "mobile_ims,11,0,2,60000,true" + "mobile_cbs,12,0,2,60000,true" + "mobile_ia,14,0,2,-1,true" + "mobile_bluetooth,7,7,2,-1,true" + "bluetooth,7,7,2,-1,true" + "ethernet,9,9,9,-1,true" + "wifi_p2p,13,1,0,-1,true" + + + + + + "1,1" + "0,1" + "7,1" + "9,1" + + + + + usb\\d + rndis\\d + + + + + "wlan0" + "softap.*" + + + + + "bt-pan" + + + + + + 0 + 1 + 5 + 7 + + + + true + + + true + + + true + + + 1 + + + 1 + + + true + + + true + + + 600 + + + 71 + + + 65 + + + 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 + + + + true + + + rmnet0 + + + + true + + + 4 + + true + + + 7 + + + + umts:131072,262144,1452032,4096,16384,399360 + hspa:131072,262144,2441216,4096,16384,399360 + hsupa:131072,262144,2441216,4096,16384,399360 + hsdpa:131072,262144,2441216,4096,16384,399360 + hspap:131072,262144,2441216,4096,16384,399360 + edge:16384,32768,131072,4096,16384,65536 + gprs:4096,8192,24576,4096,8192,24576 + 1xrtt:16384,32768,131070,4096,16384,102400 + evdo:131072,262144,1048576,4096,16384,524288 + lte:524288,1048576,8388608,262144,524288,4194304 + + + + 524288,2097152,4194304,262144,524288,1048576 + + + true + + + true + + + GSM|WCDMA|LTE + + 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..0a8b0f3 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/power_profile.xml @@ -0,0 +1,58 @@ + + + 0 + 402 + 901 + 25 + 15 + 1 + 211 + 78 + 48 + 54.0 + 50 + 0 + 0 + + 0 + + + 1700000 + 1600000 + 1500000 + 1400000 + 1300000 + 1200000 + 1100000 + 1000000 + 900000 + 800000 + 700000 + 600000 + 500000 + 400000 + 300000 + 200000 + + 4 + 167 + + 1003 + 937 + 825 + 710 + 633 + 584 + 546 + 510 + 431 + 413 + 386 + 333 + 315 + 295 + 284 + 231 + + 9000 /* mAh */ + \ No newline at end of file diff --git a/overlay/packages/apps/Mms/res/xml/mms_config.xml b/overlay/packages/apps/Mms/res/xml/mms_config.xml new file mode 100644 index 0000000..96c2a5c --- /dev/null +++ b/overlay/packages/apps/Mms/res/xml/mms_config.xml @@ -0,0 +1,38 @@ + + + + + + + + + 1045876 + + + 2592 + + + 2592 + + + http://www.google.com/oha/rdf/ua-profile-kila.xml + + 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..e461918 --- /dev/null +++ b/overlay/packages/services/Telephony/res/values/config.xml @@ -0,0 +1,26 @@ + + + + + + + + true + + + true + diff --git a/proprietary-files.txt b/proprietary-files.txt new file mode 100644 index 0000000..4a9c13f --- /dev/null +++ b/proprietary-files.txt @@ -0,0 +1,265 @@ +# Audio +etc/firmware/clearwater-dsp3-tx-nb.bin +etc/firmware/clearwater-dsp3-tx-swb-interview.bin +etc/firmware/clearwater-dsp3-tx-wb.bin +etc/firmware/clearwater-dsp4-rx-anc-nb.bin +etc/firmware/clearwater-dsp4-rx-anc-wb.bin +etc/firmware/clearwater-dsp6-lpsd-control.bin +etc/firmware/clearwatera-dsp2-tx-nb.wmfw +etc/firmware/clearwatera-dsp2-tx-swb.wmfw +etc/firmware/clearwatera-dsp2-tx-wb.wmfw +etc/firmware/clearwatera-dsp3-tx-nb.wmfw +etc/firmware/clearwatera-dsp3-tx-swb.wmfw +etc/firmware/clearwatera-dsp3-tx-wb.wmfw +etc/firmware/clearwatera-dsp4-rx-anc-nb.wmfw +etc/firmware/clearwatera-dsp4-rx-anc-wb.wmfw +etc/firmware/clearwatera-dsp5-dsm.wmfw +etc/firmware/clearwatera-dsp6-ez2-control.wmfw +etc/firmware/clearwaterc-dsp2-tx-nb.wmfw +etc/firmware/clearwaterc-dsp2-tx-swb.wmfw +etc/firmware/clearwaterc-dsp2-tx-wb.wmfw +etc/firmware/clearwaterc-dsp3-tx-nb.wmfw +etc/firmware/clearwaterc-dsp3-tx-swb.wmfw +etc/firmware/clearwaterc-dsp3-tx-wb.wmfw +etc/firmware/clearwaterc-dsp4-rx-anc-nb.wmfw +etc/firmware/clearwaterc-dsp4-rx-anc-wb.wmfw +etc/firmware/clearwaterc-dsp5-dsm.wmfw +etc/firmware/clearwaterc-dsp6-ez2-control.wmfw +etc/firmware/florida-dsp1-edac.bin +etc/firmware/florida-dsp1-edac.wmfw +etc/firmware/florida-dsp2-tx-fb-meeting.bin +etc/firmware/florida-dsp2-tx-fb-meeting.wmfw +etc/firmware/florida-dsp2-tx-nb.wmfw +etc/firmware/florida-dsp2-tx-swb.wmfw +etc/firmware/florida-dsp2-tx-wb.wmfw +etc/firmware/florida-dsp3-ez2-control.wmfw +etc/firmware/florida-dsp3-lpsd-control.bin +etc/firmware/florida-dsp3-tx-nb.bin +etc/firmware/florida-dsp3-tx-nb.wmfw +etc/firmware/florida-dsp3-tx-swb-conversation.bin +etc/firmware/florida-dsp3-tx-swb-interview.bin +etc/firmware/florida-dsp3-tx-swb.wmfw +etc/firmware/florida-dsp3-tx-wb-meeting.bin +etc/firmware/florida-dsp3-tx-wb-meeting.wmfw +etc/firmware/florida-dsp3-tx-wb.bin +etc/firmware/florida-dsp3-tx-wb.wmfw +etc/firmware/florida-dsp4-dsm.wmfw +etc/firmware/florida-dsp4-rx-anc-nb.bin +etc/firmware/florida-dsp4-rx-anc-nb.wmfw +etc/firmware/florida-dsp4-rx-anc-wb.bin +etc/firmware/florida-dsp4-rx-anc-wb.wmfw +vendor/etc/nxp/AzControlParams_SPEAKER.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_ANALOG_DOCK.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/BargeIn/Tx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_ANALOG_DOCK.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/BargeInDriving/Tx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/LVAZFS_Configuration.txt +vendor/etc/nxp/LVVEFS_Rx_Configuration.txt +vendor/etc/nxp/LVVEFS_Tx_Configuration.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_EARPIECE.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_SLD.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_SPEAKER.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_NARROWBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIP/Rx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_EARPIECE.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_SLD.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_SPEAKER.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_NARROWBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIP/Tx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIPFMC/Rx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIPFMC/Tx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIPSec/Rx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_BLUETOOTH_SCO_HEADSET.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_EARPIECE.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_SLD.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_SPEAKER.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_WIRED_HEADPHONE.txt +vendor/etc/nxp/mVoIPSec/Tx_ControlParams_WIDEBAND_WIRED_HEADSET.txt +vendor/firmware/seiren_fw_dram.bin +vendor/firmware/seiren_fw_sram.bin + +# Bluetooth +vendor/firmware/bcm4358A0_V0009.0033.hcd +vendor/firmware/bcm4358A1_V0041.0075.hcd +vendor/firmware/bcm4358A3_V0036.0054.hcd + +# Camera +#lib/hw/camera.exynos5.so +#lib64/hw/camera.exynos5.so +#lib/hw/camera.universal7420.so +#lib64/hw/camera.universal7420.so +lib/libexynoscamera3.so +lib64/libexynoscamera3.so +lib/libexynoscamera.so +lib64/libexynoscamera.so +lib/libexynosv4l2.so +lib64/libexynosv4l2.so +lib/libsensorlistener.so +lib64/libsensorlistener.so +lib/libuniplugin.so +lib64/libuniplugin.so + +# Consumer IR +lib/hw/consumerir.exynos5.so +lib64/hw/consumerir.exynos5.so + +# Graphics +lib/hw/gralloc.exynos5.so +lib64/hw/gralloc.exynos5.so +lib/hw/hwcomposer.exynos5.so +lib64/hw/hwcomposer.exynos5.so +lib/libexynosgscaler.so +lib/libexynosscaler.so +lib/libexynosutils.so +lib64/libexynosgscaler.so +lib64/libexynosscaler.so +lib64/libexynosutils.so +vendor/lib/egl/libGLES_mali.so +vendor/lib64/egl/libGLES_mali.so + +# GPS +#bin/gps.cer +#bin/gpsd +bin/lhd +#lib64/hw/gps.universal7420.so +#lib/libwrappergps.so +#lib64/libwrappergps.so + +# Media +vendor/firmware/fimc_is_fw2_imx240.bin +vendor/firmware/mfc_fw.bin +vendor/firmware/setfile_4e6.bin +vendor/firmware/setfile_imx240.bin + +# Memory +lib/libion.so +lib64/libion.so +lib/libion_exynos.so +lib64/libion_exynos.so + +# Mobicore +app/FFFFFFFF000000000000000000000001.drbin +app/mcRegistry/00060308060501020000000000000000.tlbin +app/mcRegistry/07010000000000000000000000000000.tlbin +app/mcRegistry/07060000000000000000000000000000.tlbin +app/mcRegistry/ffffffff000000000000000000000004.tlbin +app/mcRegistry/ffffffff000000000000000000000005.tlbin +app/mcRegistry/ffffffff00000000000000000000000a.tlbin +app/mcRegistry/ffffffff00000000000000000000000b.tlbin +app/mcRegistry/ffffffff00000000000000000000000c.tlbin +app/mcRegistry/ffffffff00000000000000000000000d.tlbin +app/mcRegistry/ffffffff00000000000000000000000e.tlbin +app/mcRegistry/ffffffff00000000000000000000000f.tlbin +app/mcRegistry/ffffffff000000000000000000000012.tlbin +app/mcRegistry/ffffffff000000000000000000000013.tlbin +app/mcRegistry/ffffffff000000000000000000000014.tlbin +#app/mcRegistry/ffffffff000000000000000000000015.tlbin +app/mcRegistry/ffffffff000000000000000000000016.tlbin +app/mcRegistry/ffffffff000000000000000000000017.tlbin +app/mcRegistry/ffffffff000000000000000000000018.tlbin +app/mcRegistry/ffffffff000000000000000000000019.tlbin +app/mcRegistry/ffffffff00000000000000000000001f.tlbin +app/mcRegistry/ffffffff000000000000000000000021.tlbin +app/mcRegistry/ffffffffd00000000000000000000004.tlbin +app/mcRegistry/ffffffffd0000000000000000000000a.tlbin +app/mcRegistry/ffffffffd0000000000000000000000e.tlbin +app/mcRegistry/ffffffffd00000000000000000000014.tlbin +app/mcRegistry/ffffffffd00000000000000000000016.tlbin +app/mcRegistry/ffffffffd00000000000000000000017.tlbin +app/mcRegistry/fffffffff0000000000000000000001b.tlbin +app/mcRegistry/fffffffff0000000000000000000001e.tlbin +bin/cs +lib/libMcClient.so +lib64/libMcClient.so + +# NFC +etc/sec_s3fwrn5p_rfreg.bin +lib/hw/nfc_nci.universal7420.so +lib64/hw/nfc_nci.universal7420.so +vendor/firmware/sec_s3fwrn5p_firmware.bin + +# Radio +bin/cbd +lib/libsecnativefeature.so +lib64/libsecnativefeature.so +lib/libsec-ril.so +lib64/libsec-ril.so +lib/libsecril-client.so +lib64/libsecril-client.so + +# Sensors +lib/hw/sensors.universal7420.so +lib64/hw/sensors.universal7420.so + +# Widevine +vendor/lib/drm/libdrmwvmplugin.so +vendor/lib/libdrmdecrypt.so +vendor/lib/libwvdrm_L1.so +vendor/lib/libwvm.so +vendor/lib/libWVStreamControlAPI_L1.so +vendor/lib/mediadrm/libwvdrmengine.so + +# Wifi +etc/wifi/bcmdhd_apsta.bin +etc/wifi/bcmdhd_apsta.bin_a1 +etc/wifi/bcmdhd_ibss.bin +etc/wifi/bcmdhd_ibss.bin_a1 +etc/wifi/bcmdhd_mfg.bin +etc/wifi/bcmdhd_mfg.bin_a1 +etc/wifi/bcmdhd_sta.bin +etc/wifi/bcmdhd_sta.bin_a1 +etc/wifi/nvram_mfg.txt +etc/wifi/nvram_mfg.txt_a1 +etc/wifi/nvram_mfg.txt_b85_a1 +etc/wifi/nvram_mfg.txt_murata +etc/wifi/nvram_mfg.txt_murata_a1 +etc/wifi/nvram_mfg.txt_murata_b85_a1 +etc/wifi/nvram_mfg.txt_wisol +etc/wifi/nvram_mfg.txt_wisol_a1 +etc/wifi/nvram_mfg.txt_wisol_b85_a1 +etc/wifi/nvram_net.txt +etc/wifi/nvram_net.txt_a1 +etc/wifi/nvram_net.txt_b85_a1 +etc/wifi/nvram_net.txt_murata +etc/wifi/nvram_net.txt_murata_a1 +etc/wifi/nvram_net.txt_murata_b85_a1 +etc/wifi/nvram_net.txt_wisol +etc/wifi/nvram_net.txt_wisol_a1 +etc/wifi/nvram_net.txt_wisol_b85_a1 diff --git a/ril/sbin/cbd b/ril/sbin/cbd new file mode 100644 index 0000000000000000000000000000000000000000..30cf42cd2263f76ef1b1969f9088d4c6bb6a823f GIT binary patch literal 369856 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%0ACRt%BUL^kN8x&RZ?Tx*-XO7HG(n@d_-^%i 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 " + requestToString(rr.mRequest)); + } + rr.mParcel.writeInt(1); + rr.mParcel.writeInt(index); + + send(rr); + } + + @Override + public void + acceptCall(Message result) { + acceptCall(0, result); + } + + @Override + public void + dial(String address, int clirMode, UUSInfo uusInfo, Message result) { + if (PhoneNumberUtils.isEmergencyNumber(address)) { + dialEmergencyCall(address, clirMode, result); + return; + } + + RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); + + rr.mParcel.writeString(address); + rr.mParcel.writeInt(clirMode); + rr.mParcel.writeInt(0); // CallDetails.call_type + rr.mParcel.writeInt(1); // CallDetails.call_domain + rr.mParcel.writeString(""); // CallDetails.getCsvFromExtras + + 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); + } + + private void + dialEmergencyCall(String address, int clirMode, Message result) { + RILRequest rr; + + rr = RILRequest.obtain(RIL_REQUEST_DIAL_EMERGENCY_CALL, result); + rr.mParcel.writeString(address); + rr.mParcel.writeInt(clirMode); + rr.mParcel.writeInt(0); // CallDetails.call_type + rr.mParcel.writeInt(3); // CallDetails.call_domain + rr.mParcel.writeString(""); // CallDetails.getCsvFromExtra + rr.mParcel.writeInt(0); // Unknown + + if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + send(rr); + } + + @Override + protected Object + responseIccCardStatus(Parcel p) { + IccCardApplicationStatus appStatus; + + IccCardStatus cardStatus = new IccCardStatus(); + cardStatus.setCardState(p.readInt()); + cardStatus.setUniversalPinState(p.readInt()); + cardStatus.mGsmUmtsSubscriptionAppIndex = p.readInt(); + cardStatus.mCdmaSubscriptionAppIndex = p.readInt(); + cardStatus.mImsSubscriptionAppIndex = p.readInt(); + + int numApplications = p.readInt(); + + // limit to maximum allowed applications + if (numApplications > IccCardStatus.CARD_MAX_APPS) { + numApplications = IccCardStatus.CARD_MAX_APPS; + } + cardStatus.mApplications = new IccCardApplicationStatus[numApplications]; + + for (int i = 0 ; i < numApplications ; i++) { + appStatus = new IccCardApplicationStatus(); + appStatus.app_type = appStatus.AppTypeFromRILInt(p.readInt()); + appStatus.app_state = appStatus.AppStateFromRILInt(p.readInt()); + appStatus.perso_substate = appStatus.PersoSubstateFromRILInt(p.readInt()); + appStatus.aid = p.readString(); + appStatus.app_label = p.readString(); + appStatus.pin1_replaced = p.readInt(); + appStatus.pin1 = appStatus.PinStateFromRILInt(p.readInt()); + appStatus.pin2 = appStatus.PinStateFromRILInt(p.readInt()); + p.readInt(); // pin1_num_retries + p.readInt(); // puk1_num_retries + p.readInt(); // pin2_num_retries + p.readInt(); // puk2_num_retries + p.readInt(); // perso_unblock_retries + + cardStatus.mApplications[i] = appStatus; + } + return cardStatus; + } + + @Override + protected Object + responseCallList(Parcel p) { + int num; + ArrayList response; + DriverCall dc; + + num = p.readInt(); + response = new ArrayList(num); + + if (RILJ_LOGV) { + riljLog("responseCallList: num=" + num + + " mEmergencyCallbackModeRegistrant=" + mEmergencyCallbackModeRegistrant + + " mTestingEmergencyCall=" + mTestingEmergencyCall.get()); + } + for (int i = 0 ; i < num ; i++) { + dc = new DriverCall(); + + dc.state = DriverCall.stateFromCLCC(p.readInt()); + dc.index = p.readInt() & 0xff; + dc.TOA = p.readInt(); + dc.isMpty = (0 != p.readInt()); + dc.isMT = (0 != p.readInt()); + dc.als = p.readInt(); + dc.isVoice = (0 != p.readInt()); + + boolean isVideo = (0 != p.readInt()); // Samsung + int call_type = p.readInt(); // Samsung CallDetails + int call_domain = p.readInt(); // Samsung CallDetails + String csv = p.readString(); // Samsung CallDetails + + dc.isVoicePrivacy = (0 != p.readInt()); + dc.number = p.readString(); + if (RILJ_LOGV) { + riljLog("responseCallList dc.number=" + dc.number); + } + dc.numberPresentation = DriverCall.presentationFromCLIP(p.readInt()); + dc.name = p.readString(); + if (RILJ_LOGV) { + riljLog("responseCallList dc.name=" + dc.name); + } + 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); + + if ((num == 0) && mTestingEmergencyCall.getAndSet(false)) { + if (mEmergencyCallbackModeRegistrant != null) { + riljLog("responseCallList: call ended, testing emergency call," + + " notify ECM Registrants"); + mEmergencyCallbackModeRegistrant.notifyRegistrant(); + } + } + + return response; + } + + @Override + protected Object + responseSignalStrength(Parcel p) { + int gsmSignalStrength = p.readInt() & 0xff; + int gsmBitErrorRate = p.readInt(); + int cdmaDbm = p.readInt(); + int cdmaEcio = p.readInt(); + int evdoDbm = p.readInt(); + int evdoEcio = p.readInt(); + int evdoSnr = p.readInt(); + int lteSignalStrength = p.readInt(); + int lteRsrp = p.readInt(); + int lteRsrq = p.readInt(); + int lteRssnr = p.readInt(); + int lteCqi = p.readInt(); + int tdScdmaRscp = p.readInt(); + // constructor sets default true, makeSignalStrengthFromRilParcel does not set it + boolean isGsm = true; + + if ((lteSignalStrength & 0xff) == 255 || lteSignalStrength == 99) { + lteSignalStrength = 99; + lteRsrp = SignalStrength.INVALID; + lteRsrq = SignalStrength.INVALID; + lteRssnr = SignalStrength.INVALID; + lteCqi = SignalStrength.INVALID; + } else { + lteSignalStrength &= 0xff; + } + + if (RILJ_LOGD) + riljLog("gsmSignalStrength:" + gsmSignalStrength + " gsmBitErrorRate:" + gsmBitErrorRate + + " cdmaDbm:" + cdmaDbm + " cdmaEcio:" + cdmaEcio + " evdoDbm:" + evdoDbm + + " evdoEcio: " + evdoEcio + " evdoSnr:" + evdoSnr + + " lteSignalStrength:" + lteSignalStrength + " lteRsrp:" + lteRsrp + + " lteRsrq:" + lteRsrq + " lteRssnr:" + lteRssnr + " lteCqi:" + lteCqi + + " tdScdmaRscp:" + tdScdmaRscp + " isGsm:" + (isGsm ? "true" : "false")); + + return new SignalStrength(gsmSignalStrength, gsmBitErrorRate, cdmaDbm, cdmaEcio, evdoDbm, + evdoEcio, evdoSnr, lteSignalStrength, lteRsrp, lteRsrq, lteRssnr, lteCqi, + tdScdmaRscp, isGsm); + } + + private void constructGsmSendSmsRilRequest(RILRequest rr, String smscPDU, String pdu) { + rr.mParcel.writeInt(2); + rr.mParcel.writeString(smscPDU); + rr.mParcel.writeString(pdu); + } + + // This method is used in the search network functionality. + // See mobile network setting -> network operators + @Override + protected Object + responseOperatorInfos(Parcel p) { + String strings[] = (String[])responseStrings(p); + ArrayList ret; + + if (strings.length % mQANElements != 0) { + throw new RuntimeException("RIL_REQUEST_QUERY_AVAILABLE_NETWORKS: invalid response. Got " + + strings.length + " strings, expected multiple of " + mQANElements); + } + + ret = new ArrayList(strings.length / mQANElements); + for (int i = 0 ; i < strings.length ; i += mQANElements) { + String strOperatorLong = strings[i+0]; + String strOperatorNumeric = strings[i+2]; + String strState = strings[i+3].toLowerCase(); + + Rlog.v(RILJ_LOG_TAG, + "XMM7260: Add OperatorInfo: " + strOperatorLong + + ", " + strOperatorLong + + ", " + strOperatorNumeric + + ", " + strState); + + ret.add(new OperatorInfo(strOperatorLong, // operatorAlphaLong + strOperatorLong, // operatorAlphaShort + strOperatorNumeric, // operatorNumeric + strState)); // stateString + } + + return ret; + } + + @Override + protected void + processUnsolicited(Parcel p) { + Object ret; + + int dataPosition = p.dataPosition(); + int origResponse = p.readInt(); + int newResponse = origResponse; + + /* Remap incorrect respones or ignore them */ + switch (origResponse) { + case 1040: + newResponse = RIL_UNSOL_ON_SS; + break; + case 1041: + newResponse = RIL_UNSOL_STK_CC_ALPHA_NOTIFY; + break; + case 11031: + newResponse = RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED; + break; + case 1038: // RIL_UNSOL_TETHERED_MODE_STATE_CHANGED + case 1039: // RIL_UNSOL_DATA_NETWORK_STATE_CHANGED + case 1042: // RIL_UNSOL_QOS_STATE_CHANGED_IND + case RIL_UNSOL_DEVICE_READY_NOTI: /* Registrant notification */ + case RIL_UNSOL_SIM_PB_READY: /* Registrant notification */ + Rlog.v(RILJ_LOG_TAG, + "XMM7260: ignoring unsolicited response " + + origResponse); + return; + } + + if (newResponse != origResponse) { + riljLog("SlteRIL: remap unsolicited response from " + + origResponse + " to " + newResponse); + p.setDataPosition(dataPosition); + p.writeInt(newResponse); + } + + switch (newResponse) { + case RIL_UNSOL_AM: + ret = responseString(p); + break; + default: + // Rewind the Parcel + p.setDataPosition(dataPosition); + + // Forward responses that we are not overriding to the super class + super.processUnsolicited(p); + return; + } + + switch (newResponse) { + case RIL_UNSOL_AM: + String strAm = (String)ret; + // Add debug to check if this wants to execute any useful am command + Rlog.v(RILJ_LOG_TAG, "XMM7260: am=" + strAm); + break; + } + } +} diff --git a/rootdir/Android.mk b/rootdir/Android.mk new file mode 100644 index 0000000..d014f28 --- /dev/null +++ b/rootdir/Android.mk @@ -0,0 +1,80 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := fstab.samsungexynos7580 +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/fstab.samsungexynos7580 +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.baseband.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.baseband.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.wifi.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.wifi.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.samsungexynos7580.usb.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.samsungexynos7580.usb.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.samsungexynos7580.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.samsungexynos7580.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.samsung.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.samsung.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.rilchip.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.rilchip.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.rilcommon.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.rilcommon.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := ueventd.samsungexynos7580.rc +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/ueventd.samsungexynos7580.rc +LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) +include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := init.sec.boot.sh +LOCAL_MODULE_TAGS := optional eng +LOCAL_MODULE_CLASS := ETC +LOCAL_SRC_FILES := etc/init.sec.boot.sh +include $(BUILD_PREBUILT) diff --git a/rootdir/etc/fstab.samsungexynos7580 b/rootdir/etc/fstab.samsungexynos7580 new file mode 100644 index 0000000..9aed3fe --- /dev/null +++ b/rootdir/etc/fstab.samsungexynos7580 @@ -0,0 +1,15 @@ +# Android fstab file. +# +# The filesystem that contains the filesystem checker binary (typically /system) cannot +# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK +# data partition must be located at the bottom for supporting device encryption + +/dev/block/platform/13540000.dwmmc0/by-name/BOOT /boot emmc defaults defaults +/dev/block/platform/13540000.dwmmc0/by-name/RECOVERY /recovery emmc defaults defaults +/dev/block/platform/13540000.dwmmc0/by-name/SYSTEM /system ext4 ro,errors=panic,noload wait,verify +/dev/block/platform/13540000.dwmmc0/by-name/EFS /efs ext4 nosuid,nodev,noatime,noauto_da_alloc,journal_async_commit,data=ordered,errors=panic wait,check +/dev/block/platform/13540000.dwmmc0/by-name/CACHE /cache ext4 noatime,nosuid,nodev,noauto_da_alloc,journal_async_commit,errors=panic wait,check +/dev/block/platform/13540000.dwmmc0/by-name/USERDATA /data ext4 noatime,nosuid,nodev,noauto_da_alloc,journal_async_commit,errors=panic wait,check,encryptable=footer + +# VOLD +/devices/13560000.dwmmc2/mmc_host/mmc* auto vfat default voldmanaged=extSdCard:auto,encryptable=userdata diff --git a/rootdir/etc/init.baseband.rc b/rootdir/etc/init.baseband.rc new file mode 100644 index 0000000..9530cb0 --- /dev/null +++ b/rootdir/etc/init.baseband.rc @@ -0,0 +1,58 @@ +on init + mkdir /efs 0771 radio system + symlink /dev/block/platform/13540000.dwmmc0/by-name/RADIO /dev/mbin0 + restorecon /dev/mbin0 + write /sys/class/net/rmnet0/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet1/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet2/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet3/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet4/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet5/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet6/queues/rx-0/rps_cpus 6 + write /sys/class/net/rmnet7/queues/rx-0/rps_cpus 6 + +on fs + chown radio system /efs + chmod 0771 /efs + chown radio radio sys/devices/virtual/misc/multipdp/waketime + chmod 0660 /sys/devices/virtual/misc/umts_dm0/dm_state + chown radio system /sys/devices/virtual/misc/umts_dm0/dm_state + + #For cpefs partition + mkdir /cpefs 0771 radio system + wait /dev/block/platform/13540000.dwmmc0/by-name/CPEFS + check_fs /dev/block/platform/13540000.dwmmc0/by-name/CPEFS ext4 + mount ext4 /dev/block/platform/13540000.dwmmc0/by-name/CPEFS /cpefs noatime nosuid nodev barrier=1 + chown radio system /cpefs + chmod 0771 /cpefs + +on property:ril.clatd.v4-rmnet0=up + write /sys/class/net/v4-rmnet0/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet1=up + write /sys/class/net/v4-rmnet1/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet2=up + write /sys/class/net/v4-rmnet2/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet3=up + write /sys/class/net/v4-rmnet3/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet4=up + write /sys/class/net/v4-rmnet4/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet5=up + write /sys/class/net/v4-rmnet5/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet6=up + write /sys/class/net/v4-rmnet6/queues/rx-0/rps_cpus 60 + +on property:ril.clatd.v4-rmnet7=up + write /sys/class/net/v4-rmnet7/queues/rx-0/rps_cpus 60 + +service cpboot-daemon /sbin/cbd -d -tss310 -bm -mm -P platform/13540000.dwmmc0/by-name/RADIO -c platform/13540000.dwmmc0/by-name/CP_DEBUG + class main + user root + group radio cache inet misc audio sdcard_rw log sdcard_r shell +on property:persist.sys.cpboot=disable + stop cpboot-daemon diff --git a/rootdir/etc/init.rilchip.rc b/rootdir/etc/init.rilchip.rc new file mode 100644 index 0000000..d96d6a5 --- /dev/null +++ b/rootdir/etc/init.rilchip.rc @@ -0,0 +1,40 @@ +# 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. +# +on boot +service ril-daemon /system/bin/rild + class main + socket rild stream 660 root radio + socket rild-debug stream 660 radio system + socket rild-cas stream 660 casdrm mmb + user root + group radio cache inet misc audio sdcard_r sdcard_rw log vpn system + onrestart restart cpboot-daemon + +service ril-daemon1 /system/bin/rild -c 2 + class main + socket rild2 stream 660 root radio + socket rild-debug2 stream 660 radio system + user root + group radio cache inet misc audio sdcard_r sdcard_rw log + disabled + onrestart restart cpboot-daemon + +on property:persist.sys.cpboot=disable + stop ril-daemon + stop cpboot-daemon + +service SMD-daemon /system/bin/smdexe + class main + user root + group system radio inet net_raw + +on fs +# DIAG +service DIAG-daemon /system/bin/diagexe + class main + user root + group system radio inet net_raw + diff --git a/rootdir/etc/init.rilcommon.rc b/rootdir/etc/init.rilcommon.rc new file mode 100644 index 0000000..675e95e --- /dev/null +++ b/rootdir/etc/init.rilcommon.rc @@ -0,0 +1,39 @@ +# 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. +# + +# service can not be overwritten except SPRINT +# Thus, rilcarrier is imported before common rc, like init.rilchip.rc +import init.rilcarrier.rc +import init.rilchip.rc +import init.rilepdg.rc + +on boot + +# AT Distributor for factory test +service at_distributor /system/bin/at_distributor + class late_start + user root + group radio misc log + +service DR-daemon /system/bin/ddexe + class main + user root + group system radio inet net_raw + +service BCS-daemon /system/bin/connfwexe + class main + user root + group system radio inet net_raw + +# for ethernet +service dhcpcd_eth0 /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + +# for Wi-Fi only models +on property:ro.radio.noril=yes +stop ril-daemon diff --git a/rootdir/etc/init.samsung.rc b/rootdir/etc/init.samsung.rc new file mode 100644 index 0000000..2fd724a --- /dev/null +++ b/rootdir/etc/init.samsung.rc @@ -0,0 +1,455 @@ +on init + # Process group parameters that differ from AOSP init.rc + write /dev/cpuctl/cpu.rt_runtime_us 800000 + write /dev/cpuctl/cpu.rt_period_us 1000000 + + mkdir /dev/cpuctl/apps/bg_non_interactive + chown system system /dev/cpuctl/apps/bg_non_interactive/tasks + chmod 0666 /dev/cpuctl/apps/bg_non_interactive/tasks + # 5.0 % + write /dev/cpuctl/apps/bg_non_interactive/cpu.shares 52 + write /dev/cpuctl/apps/bg_non_interactive/cpu.rt_runtime_us 700000 + write /dev/cpuctl/apps/bg_non_interactive/cpu.rt_period_us 1000000 + + # reset_reason + chown system system /proc/reset_reason + chmod 0600 /proc/reset_reason + +on post-fs-data + # sec_efs_file + mkdir /efs/sec_efs 0775 radio system + + # Latin SSMS feature + mkdir /efs/SMS 0775 radio system + + # PMK permission + mkdir /efs/mc 0770 radio system + chown radio system /efs/mc + chmod 0770 /efs/mc + chown radio system /efs/mc/mc.dat + chmod 0640 /efs/mc/mc.dat + + # hatp + mkdir /data/misc/radio/hatp 0755 radio system + + # Samsung Pay + mkdir /efs/pfw_data 0760 spay spay + + # NFC + mkdir /data/nfc 0700 nfc nfc + mkdir /data/nfc/param 0700 nfc nfc + mkdir /data/bcmnfc 0700 nfc nfc + mkdir /data/bcmnfc/param 0700 nfc nfc + + # h2k + mkdir /efs/cpk 0771 radio system + chmod 0644 /efs/redata.bin + chmod 0644 /efs/cpk/redata.bin + chown radio radio /efs/h2k.dat + chown radio radio /efs/cpk/h2k.dat + chmod 0644 /efs/h2k.dat + chmod 0644 /efs/cpk/h2k.dat + chown system system /efs/drm/h2k + + # icd + check_icd + chown system system /dev/icd + chmod 0644 /dev/icd + chown system system /dev/icdr + chmod 0644 /dev/icdr + chown system system /dev/tzic + restorecon /dev/icd + restorecon /dev/icdr + + #SideSync + chown system system /dev/android_ssusbcon + chmod 0660 /dev/android_ssusbcon + + # mobicore + mkdir /data/app/mcRegistry 0775 system system + mkdir /efs/TEE 0770 radio system + + # MTP permission + chmod 0660 /dev/usb_mtp_gadget + chown system mtp /dev/usb_mtp_gadget + mkdir /dev/socket/mtp 0770 system mtp + + #create uibc dir + mkdir /dev/socket/uibc 0777 media system + chown media system /dev/socket/uibc + chmod 0775 /dev/socket/uibc + +# [ SEC_MM_DRM + # OMA DB directory creation + mkdir /data/system/databases 0775 + chown system system /data/system/databases + chmod 0775 /data/system/databases + + # DRM directory creation + mkdir /system/etc/security/.drm 0775 + chown root root /system/etc/security/.drm + chmod 0775 /system/etc/security/.drm + + # Added for Playready DRM Support + mkdir /data/data/.drm 0775 + chown drm system /data/data/.drm + chmod 0775 /data/data/.drm + mkdir /data/data/.drm/.playready 0775 + chown drm system /data/data/.drm/.playready + chmod 0775 /data/data/.drm/.playready + + # Added drm folder to copy drm plugins + mkdir /system/lib/drm 0775 + chown root root /system/lib/drm + chmod 0775 /system/lib/drm + + restorecon -R /efs + restorecon -R /carrier + restorecon_recursive /data/misc/keystore + restorecon_recursive /data/property + restorecon_recursive /data/security +# ] + +on boot + # for BT MAC address + mkdir /efs/bluetooth 0775 radio system + # if already exist + chown radio system /efs/bluetooth + chmod 0775 /efs/bluetooth + + 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 + + chown system system /sys/devices/system/cpu/cpufreq/interactive/multi_enter_load + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/multi_enter_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/multi_enter_time + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/multi_enter_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/multi_exit_load + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/multi_exit_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/multi_exit_time + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/multi_exit_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/single_enter_load + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/single_enter_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/single_enter_time + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/single_enter_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/single_exit_load + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/single_exit_load + chown system system /sys/devices/system/cpu/cpufreq/interactive/single_exit_time + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/single_exit_time + chown system system /sys/devices/system/cpu/cpufreq/interactive/mode + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/mode + chown system system /sys/devices/system/cpu/cpufreq/interactive/enforced_mode + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/enforced_mode + chown system system /sys/devices/system/cpu/cpufreq/interactive/param_index + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/param_index + chown system system /sys/devices/system/cpu/cpufreq/interactive/cpu_util + chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/cpu_util + + # Change permission for dvfshelper + chown radio system /sys/power/cpufreq_table + chmod 0664 /sys/power/cpufreq_table + chown radio system /sys/power/cpufreq_min_limit + chmod 0664 /sys/power/cpufreq_min_limit + chown radio system /sys/power/cpufreq_max_limit + chmod 0664 /sys/power/cpufreq_max_limit + + chown radio system /sys/devices/11400000.mali/dvfs_table + chown radio system /sys/devices/11400000.mali/dvfs_min_lock + chown radio system /sys/devices/11400000.mali/dvfs_max_lock + chmod 0664 /sys/devices/11400000.mali/dvfs_table + chmod 0664 /sys/devices/11400000.mali/dvfs_min_lock + chmod 0664 /sys/devices/11400000.mali/dvfs_max_lock + + chown radio system /sys/class/devfreq/bus_mif.7/available_frequencies + chown radio system /sys/class/devfreq/bus_mif.7/min_freq + chown radio system /sys/class/devfreq/bus_mif.7/max_freq + chmod 0664 /sys/class/devfreq/bus_mif.7/available_frequencies + chmod 0664 /sys/class/devfreq/bus_mif.7/min_freq + chmod 0664 /sys/class/devfreq/bus_mif.7/max_freq + + chown radio system /sys/class/devfreq/bus_int.6/available_frequencies + chown radio system /sys/class/devfreq/bus_int.6/min_freq + chown radio system /sys/class/devfreq/bus_int.6/max_freq + chmod 0664 /sys/class/devfreq/bus_int.6/available_frequencies + chmod 0664 /sys/class/devfreq/bus_int.6/min_freq + chmod 0664 /sys/class/devfreq/bus_int.6/max_freq + + # NFC_NXP + setprop ro.nfc.port "I2C" + chmod 0660 /dev/pn547 + chown nfc nfc /dev/pn547 + + # NFC_BROADCOM + chmod 0600 /dev/bcm2079x + chown nfc nfc /dev/bcm2079x + + # NFC_SLSI + chmod 0660 /dev/sec-nfc + chown nfc nfc /dev/sec-nfc + + # KNOX KAP + chown system system /dev/knox_kap + chmod 0660 /dev/knox_kap + + # MST/NFC Switch + chown spay system /dev/mst_ctrl + chmod 0660 /dev/mst_ctrl + + #MST Factory Test + chown system system /sys/class/mstldo/mst_drv/transmit + chmod 0770 /sys/class/mstldo/mst_drv/transmit + + # mobicore + chmod 0660 /dev/s5p-smem + chown system system /dev/s5p-smem + export MC_AUTH_TOKEN_PATH /efs + +#permission for TSP, Touchkey and Wacom + chown system radio /sys/class/sec/tsp/cmd + chmod 0660 /sys/class/sec/tsp/input/enabled + chown system system /sys/class/sec/tsp/input/enabled + + chmod 0660 /sys/class/sec_touchkey/input/enabled + chown system system /sys/class/sec/sec_touchkey/input/enabled + chown system radio /sys/class/sec/sec_touchkey/brightness + + chmod 0660 /sys/class/sec/sec_epen/input/enabled + chown system system /sys/class/sec/sec_epen/input/enabled + +# Define default initial receive window size in segments. + setprop net.tcp.default_init_rwnd 60 +# Assign TCP buffer thresholds to be ceiling value of technology maximums +# Increased technology maximums should be reflected here. + write /proc/sys/net/core/rmem_max 1048576 + write /proc/sys/net/core/wmem_max 2097152 + + # Switch Device + chown system radio /sys/class/sec/switch/usb_sel + chown system radio /sys/class/sec/switch/uart_sel + chown system radio /sys/class/sec/switch/uart_en + chown system radio /sys/class/sec/switch/otg_test + chown system radio /sys/class/sec/switch/apo_factory + + # GPIO DVS + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpioinit_check + chown radio system /sys/class/secgpio_check/secgpio_check_all/gpiosleep_check + chown radio system /sys/class/secgpio_check/secgpio_check_all/checked_sleepGPIO + + # permission for CHARGING + mkdir /efs/Battery 0775 radio system + chown radio system /efs/Battery + chmod 0775 /efs/Battery + chown system radio /efs/Battery/fg_full_voltage + chown system radio /sys/class/power_supply/battery/fg_full_voltage + chmod 0664 /efs/Battery/fg_full_voltage + chmod 0664 /sys/class/power_supply/battery/fg_full_voltage + 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/factory_mode + chown system radio /sys/class/power_supply/battery/siop_level + chown system radio /sys/class/power_supply/battery/siop_event + chown system radio /sys/class/power_supply/battery/wc_enable + chown system radio /sys/class/power_supply/battery/update + chown sdcard_rw sdcard_rw /sys/class/power_supply/battery/store_mode + 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 system 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 + chown system radio /sys/class/power_supply/battery/lcd + chown system radio /sys/class/power_supply/ps/status + chmod 0664 /sys/class/power_supply/ps/status + chmod 0664 /sys/class/power_supply/battery/batt_temp_table + chown system radio /sys/class/power_supply/battery/batt_temp_table + chown system radio /sys/class/power_supply/battery/batt_high_current_usb + chown system radio /sys/class/power_supply/battery/batt_inbat_voltage + chmod 0664 /sys/class/power_supply/battery/batt_high_current_usb + chown system radio /sys/class/power_supply/battery/hmt_ta_connected + chown system radio /sys/class/power_supply/battery/hmt_ta_charge + chown system radio /sys/class/power_supply/battery/battery_cycle + chown system radio /sys/class/power_supply/otg/online + chmod 0664 /sys/class/power_supply/otg/online + chown system radio /sys/class/power_supply/max77833-charger/charge_otg_control + chown system radio /sys/class/power_supply/battery/charge_otg_control + chown system radio /sys/class/power_supply/battery/batt_wireless_firmware_update + chown system radio /sys/class/power_supply/battery/otp_firmware_result + chown system radio /sys/class/power_supply/battery/wc_ic_grade + chown system radio /sys/class/power_supply/battery/otp_firmware_ver_bin + chown system radio /sys/class/power_supply/battery/otp_firmware_ver + chown system radio /sys/class/power_supply/battery/tx_firmware_result + chown system radio /sys/class/power_supply/battery/batt_tx_firmware + chown system radio /sys/class/power_supply/battery/batt_hv_wireless_status + chown system radio /sys/class/power_supply/battery/batt_hv_wireless_pad_ctrl + chmod 0664 /sys/class/power_supply/max77833-charger/charge_otg_control + chmod 0664 /sys/class/power_supply/battery/charge_otg_control + chmod 0664 /sys/class/power_supply/battery/batt_wireless_firmware_update + chmod 0664 /sys/class/power_supply/battery/otp_firmware_result + chmod 0664 /sys/class/power_supply/battery/wc_ic_grade + chmod 0664 /sys/class/power_supply/battery/otp_firmware_ver_bin + chmod 0664 /sys/class/power_supply/battery/otp_firmware_ver + chmod 0664 /sys/class/power_supply/battery/tx_firmware_result + chmod 0664 /sys/class/power_supply/battery/tx_firmware_ver + chmod 0664 /sys/class/power_supply/battery/batt_tx_firmware + chmod 0664 /sys/class/power_supply/battery/batt_hv_wireless_status + chmod 0664 /sys/class/power_supply/battery/batt_hv_wireless_pad_ctrl + chown system radio /sys/class/power_supply/battery/tx_firmware_result + chown system radio /sys/class/power_supply/battery/batt_tune_chg_limit_cur + chown system radio /sys/class/power_supply/battery/batt_tune_chg_temp_high + chown system radio /sys/class/power_supply/battery/batt_tune_chg_temp_rec + chown system radio /sys/class/power_supply/battery/batt_tune_coil_limit_cur + chown system radio /sys/class/power_supply/battery/batt_tune_coil_temp_high + chown system radio /sys/class/power_supply/battery/batt_tune_coil_temp_rec + chown system radio /sys/class/power_supply/battery/batt_tune_fast_charge_current + chown system radio /sys/class/power_supply/battery/batt_tune_float_voltage + chown system radio /sys/class/power_supply/battery/batt_tune_intput_charge_current + chown system radio /sys/class/power_supply/battery/batt_tune_temp_high_event + chown system radio /sys/class/power_supply/battery/batt_tune_temp_high_normal + chown system radio /sys/class/power_supply/battery/batt_tune_temp_high_rec_event + chown system radio /sys/class/power_supply/battery/batt_tune_temp_high_rec_normal + chown system radio /sys/class/power_supply/battery/batt_tune_temp_low_event + chown system radio /sys/class/power_supply/battery/batt_tune_temp_low_normal + chown system radio /sys/class/power_supply/battery/batt_tune_temp_low_rec_event + chown system radio /sys/class/power_supply/battery/batt_tune_temp_low_rec_normal + chown system radio /sys/class/power_supply/battery/batt_tune_ui_term_cur_1st + chown system radio /sys/class/power_supply/battery/batt_tune_ui_term_cur_2nd + chmod 0664 /sys/class/power_supply/battery/batt_tune_chg_limit_cur + chmod 0664 /sys/class/power_supply/battery/batt_tune_chg_temp_high + chmod 0664 /sys/class/power_supply/battery/batt_tune_chg_temp_rec + chmod 0664 /sys/class/power_supply/battery/batt_tune_coil_limit_cur + chmod 0664 /sys/class/power_supply/battery/batt_tune_coil_temp_high + chmod 0664 /sys/class/power_supply/battery/batt_tune_coil_temp_rec + chmod 0664 /sys/class/power_supply/battery/batt_tune_fast_charge_current + chmod 0664 /sys/class/power_supply/battery/batt_tune_float_voltage + chmod 0664 /sys/class/power_supply/battery/batt_tune_intput_charge_current + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_high_event + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_high_normal + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_high_rec_event + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_high_rec_normal + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_low_event + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_low_normal + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_low_rec_event + chmod 0664 /sys/class/power_supply/battery/batt_tune_temp_low_rec_normal + chmod 0664 /sys/class/power_supply/battery/batt_tune_ui_term_cur_1st + chmod 0664 /sys/class/power_supply/battery/batt_tune_ui_term_cur_2nd + +# Sensors permissions +# 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/selftest + chown system radio /sys/class/sensors/accelerometer_sensor/vendor + chown system radio /sys/class/sensors/accelerometer_sensor/name + chown system system /efs/calibration_data + chmod 0666 /efs/calibration_data +# Proximity_sensor + chown system radio /sys/class/sensors/proximity_sensor/state + chown system radio /sys/class/sensors/proximity_sensor/raw_data + 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_thresh + chown system radio /sys/class/sensors/proximity_sensor/thresh_high + chown system radio /sys/class/sensors/proximity_sensor/thresh_low + chown system radio /sys/class/sensors/proximity_sensor/vendor + chown system radio /sys/class/sensors/proximity_sensor/name +# Light_sensor + chown system radio /sys/class/sensors/light_sensor/lux + chown system radio /sys/class/sensors/light_sensor/raw_data + chown system radio /sys/class/sensors/light_sensor/vendor + chown system radio /sys/class/sensors/light_sensor/name +# Gyro_sensor + chown system radio /sys/class/sensors/gyro_sensor/power_on + chown system radio /sys/class/sensors/gyro_sensor/power_off + chown system radio /sys/class/sensors/gyro_sensor/temperature + chown system radio /sys/class/sensors/gyro_sensor/selftest + chown system radio /sys/class/sensors/gyro_sensor/selftest_dps + chown system radio /sys/class/sensors/gyro_sensor/vendor + chown system radio /sys/class/sensors/gyro_sensor/name +# Magnetic_sensor + chown system radio /sys/class/sensors/magnetic_sensor/raw_data + chown system radio /sys/class/sensors/magnetic_sensor/vendor + chown system radio /sys/class/sensors/magnetic_sensor/name +# MPL IIO + chown system system /dev/invensense + chown system system /sys/bus/iio/devices/invensense/buffer/enable + chown system system /sys/bus/iio/devices/invensense/buffer/length + chown system system /sys/bus/iio/devices/invensense/control + chmod 0660 /dev/invensense + chmod 0664 /sys/bus/iio/devices/invensense/buffer/enable + chmod 0664 /sys/bus/iio/devices/invensense/buffer/length + chmod 0664 /sys/bus/iio/devices/invensense/control + +# usb detect + mkdir /dev/bus 0755 root root + mkdir /dev/bus/usb 0755 root root + +# OTG Test + chown system radio /sys/class/host_notify/usb_otg/booster + chmod 0664 /sys/class/host_notify/usb_otg/booster + +# usb disable + chown system usb /sys/class/usb_notify/usb_control/disable + chmod 0664 /sys/class/usb_notify/usb_control/disable + + write /sys/block/mmcblk0/queue/scheduler noop + write /sys/block/sda/queue/scheduler noop + + copy /system/etc/battery_charging_temp.data /sys/class/power_supply/battery/batt_temp_table + +on charger + chmod 0664 /sys/class/power_supply/battery/batt_temp_table + chown system radio /sys/class/power_supply/battery/batt_temp_table + chmod 0664 /sys/class/power_supply/battery/batt_capacity_max + chown system radio /sys/class/power_supply/battery/batt_capacity_max + chown radio system /efs + chmod 0771 /efs + mkdir /efs/Battery 0775 radio system + chown radio system /efs/Battery + chmod 0775 /efs/Battery + +# MobiCore startup +service mobicore /system/bin/mcDriverDaemon -r /system/app/FFFFFFFF000000000000000000000001.drbin -r /system/app/mcRegistry/ffffffffd0000000000000000000000a.tlbin -r /system/app/mcRegistry/ffffffffd00000000000000000000016.tlbin + class core + user system + group system + +# for Bluetooth Tethering +service dhcpcd_bt-pan /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + +service iprenew_bt-pan /system/bin/dhcpcd -n + class late_start + disabled + oneshot +# end of BT diff --git a/rootdir/etc/init.samsungexynos7580.rc b/rootdir/etc/init.samsungexynos7580.rc new file mode 100644 index 0000000..3b28df4 --- /dev/null +++ b/rootdir/etc/init.samsungexynos7580.rc @@ -0,0 +1,1155 @@ +import init.samsungexynos7580.usb.rc +import init.baseband.rc +import init.carrier.rc +import init.wifi.rc +import init.fac.rc +import init.samsung.rc +import init.rilcommon.rc + +on early-init + mount debugfs /sys/kernel/debug /sys/kernel/debug + +on init + mkdir /preload 0771 system system + + # See storage config details at http://source.android.com/tech/storage/ + mkdir /mnt/shell/emulated 0700 shell shell + mkdir /storage/emulated 0555 root root + + # Support legacy paths + symlink /sdcard /mnt/sdcard + symlink /sdcard /storage/sdcard0 + symlink /storage/usbdisk /mnt/usbdisk + + export EXTERNAL_STORAGE /sdcard + + #export SECONDARY_STORAGE /storage/extSdCard + + symlink /data/app /factory + symlink /dev/block/platform/13540000.dwmmc0/by-name/PERSISTENT /dev/block/persistent + +#Private Mode +# mkdir /mnt/shell/privatemode 0700 system system +# mkdir /storage/Private 0000 system system + +on post-fs-data + mkdir /data/media 0770 media_rw media_rw + + setprop vold.post_fs_data_done 1 + +# Permissions for audio + 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 system radio /sys/class/audio/earjack/mic_adc + +# Permissions for dbmd2 + chown system audio /sys/class/voice_trigger/dbd2/vqe_use_case + chmod 0664 /sys/class/voice_trigger/dbd2/vqe_use_case + chown system audio /sys/class/voice_trigger/dbd2/d2paramaddr + chmod 0220 /sys/class/voice_trigger/dbd2/d2paramaddr + chown system audio /sys/class/voice_trigger/dbd2/d2param + chmod 0664 /sys/class/voice_trigger/dbd2/d2param + chown system audio /sys/class/voice_trigger/dbd2/vqe_spkvollvl + chmod 0664 /sys/class/voice_trigger/dbd2/vqe_spkvollvl + chown system audio /sys/class/voice_trigger/dbd2/reboot + chmod 0664 /sys/class/voice_trigger/dbd2/reboot + chown system audio /sys/class/voice_trigger/dbd2/va_load_amodel + chmod 0664 /sys/class/voice_trigger/dbd2/va_load_amodel + mkdir /data/firmware 0770 media system + chmod 0660 /dev/i2c-0 + chown system system /dev/i2c-0 + chown media system /data/firmware + +# permission for CHARGING + chown system radio /sys/class/power_supply/battery/batt_discharging_check + chown system radio /sys/class/power_supply/battery/batt_discharging_check_adc + chown system radio /sys/class/power_supply/battery/batt_discharging_ntc + chown system radio /sys/class/power_supply/battery/batt_discharging_ntc_adc + chown system radio /sys/class/power_supply/battery/batt_self_discharging_control + +# BlowFish service +# mkdir /data/tee 0700 system system +# start tz_service +# setprop sys.blowfish.loaded true + +#Private Mode +# mkdir /data/privatemode 0770 system system +# chown system system /data/privatemode +# restorecon /data/privatemode + +on boot + # override init.rc to keep plenty of large order chunks around + # to improve allocation times + # write /proc/sys/vm/min_free_kbytes 32768 + # write /proc/sys/vm/min_free_order_shift 1 + +# SSWAP + write /proc/sys/vm/swappiness 130 + + #mount debugfs /sys/kernel/debug /sys/kernel/debug +# setprop ro.radio.noril yes + + # Allow to access debugfs + chmod 755 /sys/kernel/debug + + # Set up kernel tracing, but disable it by default + chmod 0222 /sys/kernel/debug/tracing/trace_marker + write /sys/kernel/debug/tracing/tracing_on 0 + + # Change permission for GPU + chown system system /sys/devices/11400000.mali/power_policy + chmod 0664 /sys/devices/11400000.mali/power_policy + + # Permissions for S.LSI ESE + chmod 0660 /dev/p3 + chown system system /dev/p3 + + # Dynamic cluster hotplug + chown system system /sys/devices/system/cpu/clusterhotplug/force_hstate + chmod 0660 /sys/devices/system/cpu/clusterhotplug/force_hstate + chown system system /sys/devices/system/cpu/clusterhotplug/min_lock + chmod 0660 /sys/devices/system/cpu/clusterhotplug/min_lock + chown system system /sys/devices/system/cpu/clusterhotplug/max_lock + chmod 0660 /sys/devices/system/cpu/clusterhotplug/max_lock + + # C-STATE + chown system system /sys/module/cpuidle/parameters/off + chmod 0660 /sys/module/cpuidle/parameters/off + + # Change permission for dvfshelper + chown radio system /sys/class/devfreq/17000020.bus_mif/available_frequencies + chown radio system /sys/class/devfreq/17000020.bus_mif/min_freq + chown radio system /sys/class/devfreq/17000020.bus_mif/max_freq + chmod 0664 /sys/class/devfreq/17000020.bus_mif/available_frequencies + chmod 0664 /sys/class/devfreq/17000020.bus_mif/min_freq + chmod 0664 /sys/class/devfreq/17000020.bus_mif/max_freq + + chown radio system /sys/class/devfreq/17000010.bus_int/available_frequencies + chown radio system /sys/class/devfreq/17000010.bus_int/min_freq + chown radio system /sys/class/devfreq/17000010.bus_int/max_freq + chmod 0664 /sys/class/devfreq/17000010.bus_int/available_frequencies + chmod 0664 /sys/class/devfreq/17000010.bus_int/min_freq + chmod 0664 /sys/class/devfreq/17000010.bus_int/max_freq + + # CPU Idle + chown system system /sys/module/cpuidle_exynos64_smp/parameters/enable_mask + + # Change permission for interactive governor + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_rate + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_slack + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/timer_slack + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/min_sample_time + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/hispeed_freq + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/target_loads + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/go_hispeed_load + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/above_hispeed_delay + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/boost + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/boost + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/boostpulse + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/input_boost + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/input_boost + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/boostpulse_duration + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/boostpulse_duration + chown system system /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + chmod 0660 /sys/devices/system/cpu/cpu0/cpufreq/interactive/io_is_busy + + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_rate + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_slack + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/timer_slack + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/min_sample_time + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/hispeed_freq + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/target_loads + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/go_hispeed_load + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/above_hispeed_delay + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/boost + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/boost + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/boostpulse + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/input_boost + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/input_boost + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/boostpulse_duration + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/boostpulse_duration + chown system system /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + chmod 0660 /sys/devices/system/cpu/cpu4/cpufreq/interactive/io_is_busy + + chown system log /proc/sec_log + + chown bluetooth net_bt_stack /dev/ttySAC3 + chmod 0660 /dev/ttySAC3 +# permissions for bluetooth. + setprop ro.bt.bdaddr_path "/efs/bluetooth/bt_addr" + chown bluetooth net_bt_stack ro.bt.bdaddr_path + chown radio net_bt_stack /efs/bluetooth/bt_addr + chmod 0640 /efs/bluetooth/bt_addr + 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 + + # IR_LED + chown system radio /sys/class/sec/sec_ir/ir_send + chown system radio /sys/class/sec/sec_ir/ir_send_result + + # SVC LED + chown system system /sys/class/sec/led/led_r + chown system system /sys/class/sec/led/led_g + chown system system /sys/class/sec/led/led_b + + chown system system /sys/class/leds/led_r/brightness + chown system system /sys/class/leds/led_g/brightness + chown system system /sys/class/leds/led_b/brightness + chown system system /sys/class/leds/led_r/delay_on + chown system system /sys/class/leds/led_g/delay_on + chown system system /sys/class/leds/led_b/delay_on + chown system system /sys/class/leds/led_r/delay_off + chown system system /sys/class/leds/led_g/delay_off + chown system system /sys/class/leds/led_b/delay_off + chown system system /sys/class/leds/led_r/blink + chown system system /sys/class/leds/led_g/blink + chown system system /sys/class/leds/led_b/blink + + 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 + + # HALL IC IRQ CTRL + chown system system /sys/class/sec/sec_key/hall_irq_ctrl + +# MSP FactoryApp + mkdir /efs/FactoryApp 0775 system system + + # DRK permission + mkdir /efs/prov 0770 radio system + mkdir /efs/prov_data 0770 radio system + chown radio system /efs/prov_data/dev_root + chmod 0770 /efs/prov_data/dev_root + chown radio system /efs/prov_data/knox + chmod 0770 /efs/prov_data/knox + chown radio system /efs/prov_data/dev_root/dev_root.dat + chmod 0640 /efs/prov_data/dev_root/dev_root.dat + chown radio system /efs/prov/libdevkm.lock + chmod 0660 /efs/prov/libdevkm.lock + write /efs/prov/ffffffff00000000000000000000000c.tlbin 0 + chown radio system /efs/prov/ffffffff00000000000000000000000c.tlbin + chmod 0660 /efs/prov/ffffffff00000000000000000000000c.tlbin + + # CS socket + mkdir /dev/socket/cs_socket 0770 system system + + # Switch Device + chown system radio /sys/class/sec/switch/usb_state + chown system radio /sys/class/sec/switch/chg_type + chown system system /sys/class/sec/switch/afc_off + +#for datarouter + chown system system /dev/dun + chown system system /dev/ttyGS0 + chown system system /dev/ttyGS1 + chown system system /dev/ttyGS2 + chown system system /dev/ttyGS3 + +# OTG_TEST + chown system radio /sys/class/sec/switch/otg_test + chown system radio /sys/class/host_notify/usb_otg/booster + chmod 0660 /sys/class/host_notify/usb_otg/booster + +#MST HW Support + setprop ro.mst.support 1 + +#Secure OS migration + chown radio system /sys/devices/system/sec_os_ctrl/migrate_os + chmod 664 /sys/devices/system/sec_os_ctrl/migrate_os + +#Private Mode +# service privatemode /system/bin/sdcard -r /data/privatemode /mnt/shell/privatemode 1000 1000 +# class late_start +# oneshot + +# IPSec for VOLTE + chown root system /dev/socket + chmod 0775 /dev/socket + +on fs + mount_all /fstab.samsungexynos7580 + setprop ro.crypto.fuse_sdcard true + +# Permissions for ION + chmod 0660 /sys/class/ion_cma/ion_video_ext/isolated + chown system system /sys/class/ion_cma/ion_video_ext/isolated + +# Permissions for backlight + chown system system /sys/class/backlight/panel/brightness + chown system system /sys/class/backlight/panel/auto_brightness + chown system system /sys/class/backlight/panel/auto_brightness_level + chown system media_rw /sys/class/backlight/panel/weakness_hbm_comp + +# Permissions for LCD + chown system radio /sys/class/lcd/panel/manufacture_code + chown system radio /sys/class/lcd/panel/lcd_type + chown system system /sys/class/lcd/panel/siop_enable + chown system system /sys/class/lcd/panel/temperature + chown system radio /sys/class/lcd/panel/power_reduce + +# Permissions for LCD HMT + chown system system /sys/class/lcd/panel/hmt_on + chown system system /sys/class/lcd/panel/hmt_bright + chown system system /sys/class/mdnie/mdnie/hmt_color_temperature + +# Permissions for MDNIE + chown system media_rw /sys/class/mdnie/mdnie/mode + chown system media_rw /sys/class/mdnie/mdnie/scenario + chown system system /sys/class/mdnie/mdnie/accessibility + chown system system /sys/class/mdnie/mdnie/auto_brightness + chown system system /sys/class/mdnie/mdnie/sensorRGB + +#For Absolute Persistence Partition + mkdir /persdata 0755 system system + mkdir /persdata/absolute 0750 system system + + wait /dev/block/platform/13540000.dwmmc0/by-name/PERSDATA + check_fs /dev/block/platform/13540000.dwmmc0/by-name/PERSDATA ext4 + mount ext4 /dev/block/platform/13540000.dwmmc0/by-name/PERSDATA /persdata/absolute nosuid nodev barrier=1 + + chown system system /persdata + chmod 0755 /persdata + chown system system /persdata/absolute + chmod 0750 /persdata/absolute + +# Permissions for LSI NFC + chmod 0660 /dev/sec-nfc + chown nfc nfc /dev/sec-nfc + +# Copy DRM Key + copy /system/app/wv.keys /factory/wv.keys + +# Permission for DRM Key + chmod 0644 /factory/wv.keys + +# Permissions for TouchScreen + chown system radio /sys/class/sec/tsp/cmd + chown system system /sys/class/sec/tsp/input/enabled + +# Permissions for Touchkey + chown system radio /sys/class/sec/sec_touchkey/brightness + 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/glove_mode + chown system radio /sys/class/sec/sec_touchkey/flip_mode + chown system radio /sys/class/sec/sec_touchkey/sar_enable + chown system radio /sys/class/sec/sec_touchkey/sw_reset + chown system radio /sys/class/sec/sec_touchkey/touchkey_earjack + chown system system /sys/class/sec/sec_touchkey/input/enabled + +# Permissions for gpio_keys + chown radio system /sys/class/sec/sec_key/wakeup_keys + write /sys/class/sec/sec_key/wakeup_keys 116,172 +# Fingerprint + mkdir /dev/validity 0770 system system + + # create data/gps for GPS daemon + chown root system /dev/ttySAC0 + chmod 0660 /dev/ttySAC0 + chown root system /sys/class/sec/gps/GPS_PWR_EN/value + chmod 0664 /sys/class/sec/gps/GPS_PWR_EN/value + mkdir /data/system 0771 system system + chown system system /data/system + mkdir /data/system/gps 0771 system system + chown system system /data/system/gps + rm /data/gps_started + rm /data/glonass_started + rm /data/smd_started + rm /data/sv_cno.info + +# MTP permission + chmod 0660 /dev/usb_mtp_gadget + chown system mtp /dev/usb_mtp_gadget + +# terminal mode + chmod 0660 /sys/class/android_usb/android0/terminal_version + chown system system /sys/class/android_usb/android0/terminal_version + +# for datarouter + chown system system /dev/dun + chown system system /dev/ttyGS0 + chown system system /dev/ttyGS1 + chown system system /dev/ttyGS2 + chown system system /dev/ttyGS3 + +# Permissions Camera + chown system radio /sys/class/camera/rear/rear_camfw + chown system radio /sys/class/camera/rear/rear_camfw_full + chown system radio /sys/class/camera/rear/rear_checkfw_user + chown system radio /sys/class/camera/rear/rear_checkfw_factory + chown system radio /sys/class/camera/rear/rear_sensor_standby + chown system radio /sys/class/camera/rear/rear_camtype + chown system radio /sys/class/camera/rear/rear_companionfw + chown system radio /sys/class/camera/rear/rear_companionfw_full + chown system radio /sys/class/camera/rear/rear_calcheck + chown system radio /sys/class/camera/rear/rear_caminfo + chown system radio /sys/class/camera/rear/from_write + chown system radio /sys/class/camera/rear/isp_core + chown system radio /sys/class/camera/rear/fw_update + chown system radio /sys/class/camera/flash/rear_flash + chown system radio /sys/class/camera/front/front_camfw + chown system radio /sys/class/camera/front/front_camtype + chown system radio /sys/class/camera/front/front_caminfo + chown system radio /sys/class/camera/ois/selftest + chown system radio /sys/class/camera/ois/ois_power + chown system radio /sys/class/camera/ois/ois_rawdata + chown system radio /sys/class/camera/ois/oisfw + chown system radio /sys/class/camera/ois/ois_diff + chown system radio /sys/class/camera/ois/fw_update + chown system radio /sys/class/camera/ois/ois_exif + +# SENSORS +# Fingerprint_sensor + chown system radio /sys/class/fingerprint/fingerprint/type_check +# 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 + chown system radio /sys/class/sensors/accelerometer_sensor/lowpassfilter + chown system radio /sys/class/sensors/accelerometer_sensor/mcu_rev + chown system radio /sys/class/sensors/accelerometer_sensor/mcu_name + +# Proximity_sensor + chown system radio /sys/class/sensors/proximity_sensor/state + chown system radio /sys/class/sensors/proximity_sensor/raw_data + 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/vendor + chown system radio /sys/class/sensors/proximity_sensor/name + chown system radio /sys/class/sensors/proximity_sensor/thresh_high + chown system radio /sys/class/sensors/proximity_sensor/thresh_low + chown system radio /sys/class/sensors/proximity_sensor/barcode_emul_en + chown system radio /sys/class/sensors/proximity_sensor/prox_offset_pass + chown system radio /sys/class/sensors/proximity_sensor/prox_trim + +# Light_sensor + chown system radio /sys/class/sensors/light_sensor/lux + chown system radio /sys/class/sensors/light_sensor/raw_data + chown system radio /sys/class/sensors/light_sensor/vendor + chown system radio /sys/class/sensors/light_sensor/name + +# Gyro_sensor + chown system radio /sys/class/sensors/gyro_sensor/power_on + chown system radio /sys/class/sensors/gyro_sensor/power_off + chown system radio /sys/class/sensors/gyro_sensor/temperature + chown system radio /sys/class/sensors/gyro_sensor/selftest + chown system radio /sys/class/sensors/gyro_sensor/selftest_dps + chown system radio /sys/class/sensors/gyro_sensor/vendor + chown system radio /sys/class/sensors/gyro_sensor/name + +# Barometer_sensor + chown system radio /sys/class/sensors/barometer_sensor/sea_level_pressure + chown system radio /sys/class/sensors/barometer_sensor/vendor + chown system radio /sys/class/sensors/barometer_sensor/name + chown system radio /sys/class/sensors/barometer_sensor/calibration + +# Magnetic_sensor + chown system radio /sys/class/sensors/magnetic_sensor/raw_data + chown system radio /sys/class/sensors/magnetic_sensor/vendor + chown system radio /sys/class/sensors/magnetic_sensor/name + chown system radio /sys/class/sensors/magnetic_sensor/selftest + chown system radio /sys/class/sensors/magnetic_sensor/raw_data + +# HRM_sensor + chown system radio /sys/class/sensors/hrm_sensor/name + chown system radio /sys/class/sensors/hrm_sensor/vendor + chown system radio /sys/class/sensors/hrm_sensor/led_current + chown system radio /sys/class/sensors/hrm_sensor/led_current1 + chown system radio /sys/class/sensors/hrm_sensor/led_current2 + chown system radio /sys/class/sensors/hrm_sensor/led_current3 + chown system radio /sys/class/sensors/hrm_sensor/led_current4 + chown system radio /sys/class/sensors/hrm_sensor/hr_range + chown system radio /sys/class/sensors/hrm_sensor/hr_range2 + chown system radio /sys/class/sensors/hrm_sensor/look_mode_ir + chown system radio /sys/class/sensors/hrm_sensor/look_mode_red + chown system radio /sys/class/sensors/hrm_sensor/eol_test + chown system radio /sys/class/sensors/hrm_sensor/eol_test_result + chown system radio /sys/class/sensors/hrm_sensor/eol_test_status + chown system radio /sys/class/sensors/hrm_sensor/int_pin_check + chown system radio /sys/class/sensors/hrm_sensor/lib_ver + chown system radio /sys/class/sensors/hrm_sensor/regulator + chown system radio /sys/class/sensors/hrm_sensor/part_type + chown system radio /sys/class/sensors/hrm_sensor/device_id + chown system radio /sys/class/sensors/hrm_sensor/hrm_flush + chown system radio /sys/class/sensors/hrm_sensor/threshold + chown system radio /sys/class/sensors/hrm_sensor/read_reg + chown system radio /sys/class/sensors/hrm_sensor/write_reg + chown system radio /sys/class/sensors/hrm_sensor/ctrl_allreg_file + chown system radio /sys/class/sensors/hrm_sensor/led_current + chown system radio /sys/class/sensors/hrm_sensor/alc_enable + chown system radio /sys/class/sensors/hrm_sensor/selftest + +# HRMLED_sensor + chown system radio /sys/class/sensors/hrmled_sensor/name + chown system radio /sys/class/sensors/hrmled_sensor/vendor + chown system radio /sys/class/sensors/hrmled_sensor/hrmled_flush + + # Meta_sensor + chown system radio /sys/class/sensors/sensor_dev/flush + +# UV_sensor + chown system radio /sys/class/sensors/uv_sensor/name + chown system radio /sys/class/sensors/uv_sensor/vendor + chown system radio /sys/class/sensors/uv_sensor/uv_lib_ver + chown system radio /sys/class/sensors/uv_sensor/uv_sr_interval + chown system radio /sys/class/sensors/uv_sensor/uv_eol_test + chown system radio /sys/class/sensors/uv_sensor/uv_flush + +# Grip_sensor + chown system radio /sys/class/sensors/grip_sensor/name + chown system radio /sys/class/sensors/grip_sensor/vendor + chown system radio /sys/class/sensors/grip_sensor/raw_data + chown system radio /sys/class/sensors/grip_sensor/threshold + chown system radio /sys/class/sensors/grip_sensor/calibration + chown system radio /sys/class/sensors/grip_sensor/onoff + chown system radio /sys/class/sensors/grip_sensor/reset + chown system radio /sys/class/sensors/grip_sensor/mode + chown system radio /sys/class/sensors/grip_sensor/gain + +# SensorHub + chown system radio /sys/class/sensors/ssp_sensor/enable + chown system radio /sys/class/sensors/ssp_sensor/mcu_rev + chown system radio /sys/class/sensors/ssp_sensor/mcu_name + chown system radio /sys/class/sensors/ssp_sensor/mcu_test + chown system radio /sys/class/sensors/ssp_sensor/mcu_reset + chown system radio /sys/class/sensors/ssp_sensor/mcu_update + chown system radio /sys/class/sensors/ssp_sensor/mcu_sleep_test + chown system radio /sys/class/sensors/ssp_sensor/ori_poll_delay + +# Sensorhub IIO + chown system radio /sys/class/sensors/ssp_sensor/accel_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/rot_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/game_rot_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/step_det_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/gyro_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/uncalib_gyro_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/mag_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/uncal_mag_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/light_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/pressure_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/prox_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/sig_motion_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/step_cnt_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/uncal_gyro_poll_delay + chown system radio /sys/class/sensors/ssp_sensor/ssp_flush + chmod 0600 /dev/batch_io + chown system system /dev/batch_io + +# MPL IIO + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_fifo_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_matrix + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_rate + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/batchmode_timeout + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/batchmode_wake_fifo_full_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer/enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer/length + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dev + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_event_int_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_firmware + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_int_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_accel_motion + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_pedometer + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_qshot_finish + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_qshot_start + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_shealth_int + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_smd + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/firmware_loaded + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/flush_batch + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_fifo_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_matrix + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_rate + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_scale + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_self_test_scale + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_scale + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_self_test_scale + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_calibbias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_dmp_bias + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/master_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_freq + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_threshold + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/name + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/ped_q_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/ped_q_rate + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_counter + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_int_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_int_thresh + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_peak_thresh + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_step_thresh + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_step_thresh_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_steps + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/autosuspend_delay_ms + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/control + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_active_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_status + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_suspended_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power_state + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_finish_angle + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_finish_int_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_start_angle + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_start_int_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/reg_dump + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/sampling_frequency + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/sampling_frequency_available + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_en + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_index + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_type + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/secondary_name + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test_samples + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test_threshold + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_cadence + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_cadence_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_flush_cadence + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_freq_threshold + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_instant_cadence + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_int_period + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_timer + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_rate + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_value + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_delay_threshold + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_delay_threshold2 + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_threshold + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/step_detector_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/step_indicator_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/subsystem + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/temperature + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/timestamp + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/three_axes_q_on + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/three_axes_q_rate + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/trigger + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/trigger/current_trigger + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/uevent + + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_matrix + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/accel_rate + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/batchmode_timeout + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/batchmode_wake_fifo_full_on + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer/enable + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/buffer/length + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dev + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_event_int_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_firmware + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_int_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/dmp_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_accel_motion + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_pedometer + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_qshot_finish + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_qshot_start + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_shealth_int + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/event_smd + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/firmware_loaded + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/flush_batch + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_fifo_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_matrix + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/gyro_rate + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_scale + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_self_test_scale + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_x_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_y_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_accel_z_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_scale + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_self_test_scale + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_x_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_y_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_calibbias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_dmp_bias + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/in_anglvel_z_offset + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/master_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_freq + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/motion_lpa_threshold + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/name + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/ped_q_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/ped_q_rate + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_counter + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_int_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_int_thresh + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_peak_thresh + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_step_thresh + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_step_thresh_time + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_steps + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/pedometer_time + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/autosuspend_delay_ms + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/control + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_active_time + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_status + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power/runtime_suspended_time + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/power_state + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_finish_angle + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_finish_int_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_start_angle + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/qshot_start_int_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/reg_dump + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/sampling_frequency + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/sampling_frequency_available + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_en + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_index + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/scan_elements/in_timestamp_type + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/secondary_name + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test_samples + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/self_test_threshold + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_cadence + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_cadence_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_flush_cadence + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_freq_threshold + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_instant_cadence + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_int_period + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/shealth_timer + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_rate + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/six_axes_q_value + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_delay_threshold + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_delay_threshold2 + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/smd_threshold + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/step_detector_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/step_indicator_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/subsystem + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/temperature + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/timestamp + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/three_axes_q_on + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/three_axes_q_rate + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/trigger + chmod 700 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/trigger/current_trigger + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0068/iio:device1/uevent + +# sensor + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer/enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer/length + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/dev + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/hard_offset + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_scale + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_x_raw + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_y_raw + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_z_raw + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/mag_average_sample + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/name + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/ouflow_thresh + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/position + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/autosuspend_delay_ms + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/control + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_active_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_status + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_suspended_time + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/sampling_frequency + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_en + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_index + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_type + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_en + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_index + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_type + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_en + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_index + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_type + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_en + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_index + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_type + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/self_test + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/self_test_noise + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/static_matrix + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/trigger + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/trigger/current_trigger + chown system radio /sys/class/sensors/sensor_dev/flush + + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer/enable + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/buffer/length + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/dev + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/hard_offset + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_scale + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_x_raw + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_y_raw + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/in_magn_z_raw + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/mag_average_sample + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/name + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/ouflow_thresh + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/position + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/ + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/autosuspend_delay_ms + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/control + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_active_time + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_status + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/power/runtime_suspended_time + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/sampling_frequency + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_en + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_index + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_x_type + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_en + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_index + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_y_type + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_en + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_index + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_magn_z_type + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_en + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_index + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/scan_elements/in_timestamp_type + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/self_test + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/self_test_noise + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/static_matrix + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/trigger + chmod 760 /sys/devices/13870000.hsi2c/i2c-0/0-002e/iio:device2/trigger/current_trigger + chmod 760 /sys/class/sensors/sensor_dev/flush + +# BHY + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_enable + chown system radio /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/13870000.hsi2c/i2c-0/0-0028/iio:device0/shealth_flush_cadence + + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_enable + chown system radio /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/13890000.hsi2c/i2c-2/2-0028/iio:device0/shealth_flush_cadence + + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_enable + chown system radio /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/i2c.24/i2c-6/6-0028/iio:device0/shealth_flush_cadence + + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_enable + chown system radio /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/i2c.44/i2c-7/7-0028/iio:device0/shealth_flush_cadence + + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_enable + chown system radio /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/i2c.47/i2c-7/7-0028/iio:device0/shealth_flush_cadence + + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/event_shealth_int + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/pedometer_steps + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_cadence + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_enable + chown system radio /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_flush_cadence + chmod 660 /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/event_shealth_int + chmod 660 /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/pedometer_steps + chmod 660 /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_cadence_enable + chmod 660 /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_enable + chmod 660 /sys/devices/i2c.45/i2c-7/7-0028/iio:device0/shealth_flush_cadence + +# IRLED_sensor + chown system radio /sys/class/sensors/irled_remote/name + chown system radio /sys/class/sensors/irled_remote/vendor + chown system radio /sys/class/sensors/irled_remote/irled_send + chown system radio /sys/class/sensors/irled_remote/irled_send_result + +# ARGOSD network_throughput + chown system system /dev/network_throughput + +# ARGOSD +service argos-daemon /system/bin/argosd + class main + user system + group system radio + +# IPSec for VOLTE +service ipsec-daemon /system/bin/IPSecService + class main + socket ipsec_socket stream 660 system system + user system + group system net_raw inet net_admin + +# sem_daemon permission + chown system system /efs/sec_efs/ssp_data + chmod 0644 /efs/sec_efs/ssp_data + +# GPS +service gpsd /system/bin/gpsd -c /system/etc/gps.xml + class main + user gps + group system inet net_raw + ioprio be 0 + +# SENSOR FRAMEWORK : starts fingerprintService +service vcsFPService /system/bin/vcsFPService + class late_start + user system + group system + +service prepare_param /system/bin/prepare_param.sh /dev/block/platform/13540000.dwmmc0/by-name/PARAM + class core + user root + group root + seclabel u:r:prepare_param:s0 + oneshot + +# sem_daemon +service sem_daemon /system/bin/sem_daemon + class core + user system + group system nfc + disabled + +on property:sys.boot_completed=1 + setprop security.semdaemonfinish 0 + start sem_daemon + +on property:security.semdaemonfinish=1 + stop sem_daemon + +# Blowfish tzdaemon +service tz_service /system/bin/tzdaemon + class core + socket tz stream 0666 system system + user system + group system + disabled + +service taa_service /system/bin/taadaemon + class core + socket taa stream 0666 system system + user system + group system + disabled + +on property:sys.tzdaemon=Ready + start taa_service + +on property:init.svc.tz_service=stopped + setprop sys.tzdaemon NotReady + +# virtual sdcard daemon running as media_rw (1023) +service sdcard /system/bin/sdcard -u 1023 -g 1023 -l -r /data/media /mnt/shell/emulated + class late_start + oneshot + +service fuse_extSdCard /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d -f /mnt/media_rw/extSdCard /storage/extSdCard + class late_start + disabled + oneshot + +service fuse_UsbDriveA /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveA /storage/UsbDriveA + class late_start + disabled + oneshot + +service fuse_UsbDriveB /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveB /storage/UsbDriveB + class late_start + disabled + oneshot + +service fuse_UsbDriveC /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveC /storage/UsbDriveC + class late_start + disabled + oneshot + +service fuse_UsbDriveD /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveD /storage/UsbDriveD + class late_start + disabled + oneshot + +service fuse_UsbDriveE /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveE /storage/UsbDriveE + class late_start + disabled + oneshot + +service fuse_UsbDriveF /system/bin/sdcard -u 1023 -g 1023 -d -f /mnt/media_rw/UsbDriveF /storage/UsbDriveF + class late_start + disabled + oneshot + +# Set watchdog timer to 30 seconds and pet it every 10 seconds to get a 20 second margin +service watchdogd /sbin/watchdogd 10 20 + class core + seclabel u:r:watchdogd:s0 + disabled + +# BIO FRAMEWORK : starts bio auth service +service bauthserver /system/bin/bauthserver + class late_start + user system + group system + +# on userdebug and eng builds, enable kgdb on the serial console +on property:ro.debuggable=1 + write /sys/module/kgdboc/parameters/kgdboc ttyFIQ1 + write /sys/module/fiq_debugger/parameters/kgdb_enable 1 + +on property:sys.boot_completed=1 + write /proc/sys/vm/dirty_bytes 41943040 + write /proc/sys/vm/dirty_background_bytes 20971520 + +on property:sys.boot_completed=1 + write /proc/sys/vm/dirty_bytes 31457280 + write /proc/sys/vm/dirty_background_bytes 15728640 + +# DIAG +service DIAG-daemon /system/bin/diagexe + class main + user root + group system radio inet net_raw + +# Kick watchdogd if debug_level is low +on property:ro.debug_level=0x4f4c + start watchdogd + +# Secure Storage startup +service secure_storage /system/bin/secure_storage_daemon + class core + user system + group system + disabled + +on property:ro.securestorage.support=true + mkdir /dev/.secure_storage + chmod 0711 /dev/.secure_storage + chown system system /dev/.secure_storage + restorecon -R /dev/.secure_storage + start secure_storage + +# LPM +on property:ro.bootmode=charger + mount ext4 /dev/block/platform/13540000.dwmmc0/by-name/SYSTEM /system wait ro + wait /dev/block/platform/13540000.dwmmc0/by-name/EFS + check_fs /dev/block/platform/13540000.dwmmc0/by-name/EFS ext4 + mount ext4 /dev/block/platform/13540000.dwmmc0/by-name/EFS /efs nosuid nodev noatime noauto_da_alloc,discard,journal_async_commit + +on property:ro.bootmode=charger + class_start sec-charger + +on property:sys.tzdaemon=Ready + start taa_service + +# umount service +service umount_service /system/bin/umount /preload + disabled + oneshot + +# Support Preload install apks +on property:persist.sys.storage_preload=1 + mount ext4 /dev/block/platform/13540000.dwmmc0/by-name/HIDDEN /preload nosuid nodev ro barrier=1 + setprop storage.preload.complete 1 + +on property:persist.sys.storage_preload=0 + start umount_service + +# DRK/CS service +service cs_service /system/bin/cs + class main + user system + group system + disabled + +on property:sys.mobicoredaemon.enable=true + start cs_service + +# SSWAP +service swapon /sbin/sswap -s + class core + user root + group root + seclabel u:r:sswap:s0 + oneshot + + # SecEDS +service TvoutService_C /system/bin/bintvoutservice + class main + user system + group graphics +on property:ro.SecEDS.enable=false + stop TvoutService_C + +# mobicore + chmod 0660 /dev/t-base-tui + chown system system /dev/t-base-tui diff --git a/rootdir/etc/init.samsungexynos7580.usb.rc b/rootdir/etc/init.samsungexynos7580.usb.rc new file mode 100644 index 0000000..ba0613b --- /dev/null +++ b/rootdir/etc/init.samsungexynos7580.usb.rc @@ -0,0 +1,268 @@ +on post-fs-data + chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file + chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file + chown system system /sys/class/android_usb/android0/f_rndis/ethaddr + chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr + +# Used to disable USB when switching states +on property:sys.usb.config=none + stop adbd + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/bDeviceClass 0 + setprop sys.usb.state ${sys.usb.config} + +# adb only USB configuration +# This should only be used during device bringup +# and as a fallback if the USB manager fails to set a standard configuration +on init + write /sys/class/android_usb/android0/f_rndis/manufacturer Samsung + write /sys/class/android_usb/android0/f_rndis/vendorID 04e8 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + +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/android_usb/android0/iSerial ${ro.serialno} + write /sys/class/android_usb/f_mass_storage/inquiry_string "Samsung" + +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 6860 + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 224 + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 224 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm + 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 ncm + write /sys/class/android_usb/android0/bDeviceClass 2 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=ncm,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 ncm,adb + write /sys/class/android_usb/android0/bDeviceClass 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,dm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04e8 + write /sys/class/android_usb/android0/idProduct 6862 + 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,acm,dm + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04e8 + write /sys/class/android_usb/android0/idProduct 6862 + 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,acm,dm,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/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=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/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/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mass_storage,acm + 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/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Askon Mode : VZW required + +on property:sys.usb.config=askon + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=askon,adb + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/functions ${sys.usb.config} + setprop sys.usb.state ${sys.usb.config} + +# rndis,acm,diag and diag,acm,adb used for Hidden Menu + +on property:sys.usb.config=rndis,diag + write /sys/class/android_usb/android0/enable 0 + write /sys/class/android_usb/android0/idVendor 04e8 + write /sys/class/android_usb/android0/idProduct 6862 + write /sys/class/android_usb/android0/f_diag/clients diag_mdm + 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=diag,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/f_diag/clients diag_mdm + 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=diag,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/f_diag/clients diag_mdm + 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=dm,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/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=dm,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/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Add for acm,dm,adb config +on property:sys.usb.config=acm,dm,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/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} + +# Add for acm,dm config +on property:sys.usb.config=acm,dm + 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/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=rndis,acm,diag + 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/f_diag/clients diag_mdm + 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=mtp,conn_gadget + 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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=mtp,conn_gadget,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/functions ${sys.usb.config} + write /sys/class/android_usb/android0/bDeviceClass 0 + write /sys/class/android_usb/android0/enable 1 + start adbd + setprop sys.usb.state ${sys.usb.config} diff --git a/rootdir/etc/init.sec.boot.sh b/rootdir/etc/init.sec.boot.sh new file mode 100644 index 0000000..1df8af3 --- /dev/null +++ b/rootdir/etc/init.sec.boot.sh @@ -0,0 +1,12 @@ +#!/system/bin/sh + +echo "init.sec.boot.sh: start" > /dev/kmsg + +# An "initcall" is the initialization function for a module which is statically +# linked into the Linux kernel. Running of initcalls can consume a large amount +# of time during bootup. However, some modules do not need to be initialized so +# early, in order for the embedded device to become usable for its primary +# purpose. These initcalls can be run later, after first boot. +# +# This will trigger the initcall of the bcmdhd wifi module. +cat /proc/deferred_initcalls diff --git a/rootdir/etc/init.wifi.rc b/rootdir/etc/init.wifi.rc new file mode 100644 index 0000000..6034f9f --- /dev/null +++ b/rootdir/etc/init.wifi.rc @@ -0,0 +1,121 @@ +# Wi-Fi init file + + #Create directory for hostapd + mkdir /data/hostapd 0770 system wifi + +on post-fs-data + # give system access to wpa_supplicant.conf for backup and restore + mkdir /data/misc/wifi 0770 wifi system + chmod 0660 /data/misc/wifi/wpa_supplicant.conf + mkdir /data/misc/wifi/sockets 0770 wifi wifi + mkdir /data/misc/dhcp 0775 dhcp dhcp + chown dhcp dhcp /data/misc/dhcp + + # for WIFI TRP/TIS + chown system root /data/.psm.info + chmod 0664 /data/.psm.info + + # for WIFI Antenna Selection + chown system root /data/.ant.info + chmod 0664 /data/.ant.info + + # for WIFI Version + write /data/.wifiver.info 0 + chown system root /data/.wifiver.info + chmod 0666 /data/.wifiver.info + + # for WIFI Cert + chmod 0664 /data/.bustxglom.info + chmod 0664 /data/.roamoff.info + chmod 0664 /data/.frameburst.info + chmod 0664 /data/.txbf.info + # for WIFI MAC address + mkdir /efs/wifi 0775 radio system + chown system wifi /efs/wifi/.mac.info + chmod 0660 /efs/wifi/.mac.info + +on boot + setprop wifi.interface wlan0 + + # Pcie WiFi T-put setting + write /sys/class/net/wlan0/queues/rx-0/rps_cpus 00 + +service p2p_supplicant /system/bin/wpa_supplicant \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \ + -I/system/etc/wifi/p2p_supplicant_overlay.conf \ + -puse_p2p_group_interface=1p2p_device=1 \ + -m/data/misc/wifi/p2p_supplicant.conf \ + -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0 + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service wpa_supplicant /system/bin/wpa_supplicant -g@android:wpa_wlan0 \ + -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + +service dhcpcd_ibss /system/bin/dhcpcd -BKM + class late_start + 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 + +# tiburona +# start 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 0664 /data/.rev +# end of WiFi MFG (TestMode) + +service olsrd /system/bin/olsrd -f /etc/wifi/olsrd.conf + class main + disabled + oneshot + +service hostapd /system/bin/hostapd -dddd /data/hostapd/hostapd.conf + class late_start + user root + group root + oneshot + disabled diff --git a/rootdir/etc/ueventd.samsungexynos7580.rc b/rootdir/etc/ueventd.samsungexynos7580.rc new file mode 100644 index 0000000..193434e --- /dev/null +++ b/rootdir/etc/ueventd.samsungexynos7580.rc @@ -0,0 +1,152 @@ +/dev/mali0 0666 system system +/dev/ion 0666 system system +/dev/ump 0666 system graphics +/dev/exynos-mem 0660 system graphics +/dev/video0 0660 system camera +/dev/video1 0660 system camera +/dev/video2 0660 system camera +/dev/video3 0660 system camera +/dev/video20 0660 system system +# media0 is used for GSC, DECON, etc +/dev/media0 0660 system camera +# media1 is used for DECON Ext WB +/dev/media1 0660 system graphics +# Various devices use the v4l-subdev interface +# We declare all such nodes simultaneously here +/dev/v4l-subdev0 0660 system camera +/dev/v4l-subdev1 0660 system camera +/dev/v4l-subdev2 0660 system camera +/dev/v4l-subdev3 0660 system camera +/dev/v4l-subdev4 0660 system camera +/dev/v4l-subdev5 0660 system camera +/dev/v4l-subdev6 0660 system camera +/dev/v4l-subdev7 0660 system camera +/dev/v4l-subdev8 0660 system camera +/dev/v4l-subdev9 0660 system camera +/dev/v4l-subdev10 0660 system camera +/dev/v4l-subdev11 0660 system camera +/dev/v4l-subdev12 0660 system camera +/dev/v4l-subdev13 0660 system camera +/dev/v4l-subdev14 0660 system camera +/dev/v4l-subdev15 0660 system camera +/dev/v4l-subdev16 0660 system camera +/dev/v4l-subdev17 0660 system camera +/dev/v4l-subdev18 0660 system camera +/dev/v4l-subdev19 0660 system camera +# v4l-subdev20 is used for DECON Ext WB +/dev/v4l-subdev20 0660 system graphics +/dev/v4l-subdev21 0660 system graphics + +# gscalers +/dev/video23 0660 media graphics +/dev/video26 0660 media graphics +/dev/video24 0660 media graphics +/dev/video27 0660 media graphics +/dev/video29 0660 media graphics +/dev/video30 0660 media graphics +# video31 is used for DECON Ext WB +/dev/video31 0660 media graphics + +# mscalers +/dev/video50 0660 media graphics +/dev/video51 0660 media graphics +/dev/m2m1shot_scaler0 0660 media graphics +/dev/m2m1shot_scaler1 0660 media graphics + +/dev/video55 0666 system graphics +/dev/fimg2d 0666 system graphics +/dev/i2c-2 0660 system system +/dev/HPD 0660 system system + +# mfc +/dev/video6 0660 media media +/dev/video7 0660 media media +/dev/video8 0660 media media +/dev/video9 0660 media media + +# camera +/dev/video100 0660 media media +/dev/video101 0660 media media +/dev/video102 0660 media media +/dev/video109 0660 media media +/dev/video110 0660 media media +/dev/video111 0660 media media +/dev/video112 0660 media media +/dev/video120 0660 media media +/dev/video121 0660 media media +/dev/video122 0660 media media +/dev/video130 0660 media media +/dev/video131 0660 media media +/dev/video132 0660 media media +/dev/video140 0660 media media +/dev/video141 0660 media media +/dev/video142 0660 media media +/dev/video150 0660 media media +/dev/video151 0660 media media +/dev/video152 0660 media media +/dev/video160 0660 media media +/dev/media2 0660 media media + +# hevc +/dev/video10 0660 media media +/dev/video11 0660 media media + +# jpeg +/dev/video13 0660 media media +/dev/video14 0660 media media + +# audio +/dev/seiren 0660 system audio + +# Secure MEM driver +/dev/s5p-smem 0660 drm drmrpc + +# Modem Interface +/dev/block/platform/13540000.dwmmc0/by-name/RADIO 0660 system radio +/dev/block/platform/13540000.dwmmc0/by-name/CP_DEBUG 0660 system radio +/dev/umts* 0660 system radio +/dev/smd4 0660 system radio + +# Blowfish +/dev/tzdev 0660 system system +/dev/ionfd2phys 0660 system radio +/dev/tuihw 0660 system system +/dev/tzirs 0660 system system + +# Sensorhub IIO +/dev/ssp_sensorhub 0660 system system +/dev/iio:device* 0660 system system +/sys/devices/13910000.spi/spi_master/spi0/spi0.0/iio:device* buffer/enable 0660 system system +/sys/devices/13910000.spi/spi_master/spi0/spi0.0/iio:device* buffer/length 0660 system system +/sys/bus/iio/devices/iio:device* 0664 system radio + +# Dynamic Cluster Hotplug +/sys/devices/system/cpu/cpu0/cpufreq interactive/target_loads 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/above_hispeed_delay 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/hispeed_freq 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/go_hispeed_load 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/min_sample_time 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/timer_rate 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/timer_slack 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/boost 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/boostpulse 0200 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/boostpulse_duration 0660 system system +/sys/devices/system/cpu/cpu0/cpufreq interactive/io_is_busy 0660 system system + +/sys/devices/system/cpu/cpu4/cpufreq interactive/target_loads 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/above_hispeed_delay 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/hispeed_freq 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/go_hispeed_load 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/min_sample_time 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/timer_rate 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/timer_slack 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/boost 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/boostpulse 0200 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/boostpulse_duration 0660 system system +/sys/devices/system/cpu/cpu4/cpufreq interactive/io_is_busy 0660 system system + +# Audio NXP AMP +/dev/i2c-20 0660 system system + +# Google FRP solution +/dev/block/platform/13540000.dwmmc0/by-name/PERSISTENT 0660 system system diff --git a/sepolicy/bluetooth.te b/sepolicy/bluetooth.te new file mode 100644 index 0000000..6a951c4 --- /dev/null +++ b/sepolicy/bluetooth.te @@ -0,0 +1,5 @@ +# /dev/ttySAC3 +allow bluetooth bluetooth_device:chr_file { rw_file_perms ioctl }; + +# /data/.cid.info +allow bluetooth wifi_data_file:file r_file_perms; diff --git a/sepolicy/cpboot-daemon.te b/sepolicy/cpboot-daemon.te new file mode 100644 index 0000000..50cddfd --- /dev/null +++ b/sepolicy/cpboot-daemon.te @@ -0,0 +1,38 @@ +# modem daemon sec label +type cpboot-daemon, domain; +type cpboot-daemon_exec, exec_type, file_type; + +tmpfs_domain(cpboot-daemon) +wakelock_use(cpboot-daemon) +unix_socket_connect(cpboot-daemon, property, init) + +allow cpboot-daemon self:capability { dac_override setuid setgid }; + +# FIXME neverallow rule +# allow cpboot-daemon self:capability mknod; +allow cpboot-daemon kernel:system syslog_read; +allow cpboot-daemon cgroup:dir create_dir_perms; + +# /dev/log/* +allow cpboot-daemon log_device:dir r_dir_perms; +allow cpboot-daemon log_device:chr_file rw_file_perms; +# /dev/kmsg (write to kernel log) +allow cpboot-daemon kmsg_device:chr_file rw_file_perms; + +# /dev/umts_boot0 +allow cpboot-daemon mif_device:chr_file rw_file_perms; +# /dev/mbin0 +allow cpboot-daemon emmcblk_device:blk_file r_file_perms; +# /dev/block/mmcblk0p13 +allow cpboot-daemon block_device:dir r_dir_perms; + +# /dev/ehci_power +allow cpboot-daemon sysfs_usb_power_writable:file rw_file_perms; +# /dev/mipi-lli/lli_control +allow cpboot-daemon sysfs_mipi_writable:file rw_file_perms; + +# /efs +allow cpboot-daemon efs_file:dir r_dir_perms; + +# /efs/nv_data.bin +allow cpboot-daemon bin_nv_data_efs_file:file rw_file_perms; diff --git a/sepolicy/device.te b/sepolicy/device.te new file mode 100644 index 0000000..5c647cd --- /dev/null +++ b/sepolicy/device.te @@ -0,0 +1,17 @@ +# /dev/ttySAC3 +type bluetooth_device, dev_type; + +# /dev/block/mmcblk0p[0-9] (/dev/mbin0) +type emmcblk_device, file_type; + +# /dev/umts_boot*, /dev/ehci_power +type mif_device, dev_type; + +# /dev/rfkill +type rfkill_device, dev_type; + +# /dev/seiren +type seiren_device, dev_type; + +# /dev/s5p-smem +type secmem_device, dev_type; diff --git a/sepolicy/domain.te b/sepolicy/domain.te new file mode 100644 index 0000000..17cc5f0 --- /dev/null +++ b/sepolicy/domain.te @@ -0,0 +1 @@ +dontaudit domain rootfs:chr_file { read write }; diff --git a/sepolicy/file.te b/sepolicy/file.te new file mode 100644 index 0000000..2a6b152 --- /dev/null +++ b/sepolicy/file.te @@ -0,0 +1,20 @@ +### efs types +type app_efs_file, file_type; +type baro_delta_factoryapp_efs_file, file_type; +type bin_nv_data_efs_file, file_type; +# widewine, drm +type cpk_efs_file, file_type; +type drm_efs_file, file_type; +type factorymode_factoryapp_efs_file, file_type; +type imei_efs_file, file_type; +type prov_efs_file, file_type; +type radio_factoryapp_efs_file, file_type; +type sensor_efs_file, file_type; +type wifi_efs_file, file_type; + +### sysfs types +type sysfs_mipi_writable, fs_type, sysfs_type, mlstrustedobject; +type sysfs_multipdp_writable, fs_type, sysfs_type, mlstrustedobject; +type sysfs_usb_power_writable, fs_type, sysfs_type, mlstrustedobject; + +allow sysfs_type tmpfs:filesystem associate; diff --git a/sepolicy/file_contexts b/sepolicy/file_contexts new file mode 100644 index 0000000..66c4bc3 --- /dev/null +++ b/sepolicy/file_contexts @@ -0,0 +1,97 @@ +########################## +# Devices +# +/dev/mali[0-9]* u:object_r:gpu_device:s0 + +/dev/seiren u:object_r:seiren_device:s0 + +/dev/bcm2079x u:object_r:nfc_device:s0 +/dev/sec-nfc u:object_r:nfc_device:s0 + +/dev/ttySAC3 u:object_r:bluetooth_device:s0 + +/dev/s5p-smem u:object_r:secmem_device:s0 +/dev/mobicore u:object_r:tee_device:s0 +/dev/mobicore-user u:object_r:tee_device:s0 + +/dev/v4l-subdev[0-9]* u:object_r:video_device:s0 +/dev/media[0-3]* u:object_r:camera_device:s0 + +/dev/mtp_usb* u:object_r:mtp_device:s0 + +/dev/__cbd_msg_ u:object_r:mif_device:s0 +/dev/umts.* u:object_r:mif_device:s0 +/dev/ehci_power u:object_r:mif_device:s0 +/dev/mipi-lli/lli_control u:object_r:mif_device:s0 + +/dev/ttySAC[0-9]* u:object_r:gps_device:s0 + +/dev/block/mmcblk0p[0-9]* u:object_r:emmcblk_device:s0 + +/dev/rfkill u:object_r:rfkill_device:s0 + +#################################### +# efs files +/efs/FactoryApp(/.*)? u:object_r:app_efs_file:s0 +/efs/FactoryApp/baro_delta u:object_r:baro_delta_factoryapp_efs_file:s0 +/efs/FactoryApp/factorymode u:object_r:factorymode_factoryapp_efs_file:s0 +/efs/FactoryApp/fdata u:object_r:radio_factoryapp_efs_file:s0 +/efs/FactoryApp/hist_nv u:object_r:radio_factoryapp_efs_file:s0 +/efs/FactoryApp/test_nv u:object_r:radio_factoryapp_efs_file:s0 + +/efs/bluetooth(/.*)? u:object_r:bluetooth_efs_file:s0 +/efs/drm(/.*)? u:object_r:drm_efs_file:s0 +/efs/gyro_cal_data u:object_r:sensor_efs_file:s0 +/efs/h2k.dat u:object_r:cpk_efs_file:s0 +/efs/imei(/.*)? u:object_r:imei_efs_file:s0 +/efs/nv_data.bin(.*) u:object_r:bin_nv_data_efs_file:s0 +/efs/prov(/.*)? u:object_r:prov_efs_file:s0 +/efs/prov_data(/.*)? u:object_r:prov_efs_file:s0 +/efs/wifi(/.*)? u:object_r:wifi_efs_file:s0 +/efs/wv.keys u:object_r:cpk_efs_file:s0 + +#################################### +# data files +/data/nfc(/.*)? u:object_r:nfc_data_file:s0 +/data/.cid.info u:object_r:wifi_data_file:s0 +/data/.wifiver.info u:object_r:wifi_data_file:s0 + +/data/misc/radio(/.*)? u:object_r:radio_data_file:s0 + +# gps +/data/system/gps/\.flp\.interface\.pipe\.to_gpsd u:object_r:gps_data_file:s0 +/data/system/gps/\.gps\.interface\.pipe\.to_gpsd u:object_r:gps_data_file:s0 +/data/system/gps/\.gps\.interface\.pipe\.to_jni u:object_r:gps_data_file:s0 +/data/system/gps/\.gpsd\.lock u:object_r:gps_data_file:s0 +/data/system/gps/gldata\.sto u:object_r:gps_data_file:s0 + +/data/gps/ctrlpipe u:object_r:gps_data_file:s0 +/data/gps/.gpslogd.pipe u:object_r:gps_data_file:s0 +/data/gps/nmeapipe u:object_r:gps_data_file:s0 + +#################################### +# sysfs files +/sys/class/power_supply/battery/music -- u:object_r:sysfs_writable:s0 +/sys/class/devfreq/exynos5-busfreq-mif(/.*)? -- u:object_r:sysfs_writable:s0 +/sys/class/lcd(/.*)? -- u:object_r:sysfs_writable:s0 + +# bluetooth +/sys/devices/bluetooth.[0-9]*/rfkill/rfkill0/state u:object_r:sysfs_bluetooth_writable:s0 +/sys/devices/bluetooth.[0-9]*/rfkill/rfkill0/type u:object_r:sysfs_bluetooth_writable:s0 + +# cbd +/sys/devices/15510000.usb/ehci_power u:object_r:sysfs_usb_power_writable:s0 +/sys/devices/10f24000.mipi-lli/lli_control u:object_r:sysfs_mipi_writable:s0 + +# rild +/sys/devices/virtual/misc/multipdp(/.*) u:object_r:sysfs_multipdp_writable:s0 + +#################################### +# deamons +# +/system/bin/mcDriverDaemon -- u:object_r:tee_exec:s0 +/system/bin/macloader -- u:object_r:macloader_exec:s0 +/system/bin/wifiloader -- u:object_r:wifiloader_exec:s0 + +/system/bin/cbd -- u:object_r:cpboot-daemon_exec:s0 +/system/bin/gpsd -- u:object_r:gpsd_exec:s0 diff --git a/sepolicy/fsck.te b/sepolicy/fsck.te new file mode 100644 index 0000000..fe4fe2e --- /dev/null +++ b/sepolicy/fsck.te @@ -0,0 +1,2 @@ +# /dev/block/mmcblk0p3 +allow fsck emmcblk_device:blk_file rw_file_perms; diff --git a/sepolicy/gpsd.te b/sepolicy/gpsd.te new file mode 100644 index 0000000..c68d310 --- /dev/null +++ b/sepolicy/gpsd.te @@ -0,0 +1,22 @@ +# gpsd uses /data/system/gps/.flp.interface.pipe.to_gpsd, +# /data/system/gps/.gps.interface.pipe.to_jni, +# /data/system/gps/.gpsd.lock and /data/system/gps/gldata.sto +# Automatically label them as gps_data_file +file_type_auto_trans(gpsd, system_data_file, gps_data_file) +unix_socket_connect(gpsd, property, rild) + +allow gpsd system_server:unix_stream_socket { read write setopt }; + +binder_call(gpsd, system_server) +binder_use(gpsd) + +allow gpsd self:netlink_kobject_uevent_socket create_socket_perms; + +allow gpsd gps_device:chr_file { getattr setattr }; +allow gpsd gps_data_file:dir { search write add_name remove_name }; +allow gpsd gps_data_file:file { create rw_file_perms }; +allow gpsd gps_data_file:fifo_file { unlink create setattr getattr rw_file_perms }; + +allow gpsd sysfs_wake_lock:file rw_file_perms; + +allow gpsd sensorservice_service:service_manager { find }; diff --git a/sepolicy/healthd.te b/sepolicy/healthd.te new file mode 100644 index 0000000..f7dc439 --- /dev/null +++ b/sepolicy/healthd.te @@ -0,0 +1,3 @@ +# healthd +allow healthd device:dir r_dir_perms; +allow healthd rtc_device:chr_file rw_file_perms; diff --git a/sepolicy/init.te b/sepolicy/init.te new file mode 100644 index 0000000..b9a2721 --- /dev/null +++ b/sepolicy/init.te @@ -0,0 +1,16 @@ +domain_trans(init, rootfs, cpboot-daemon) +domain_trans(init, cpboot-daemon_exec, cpboot-daemon) +domain_trans(init, gpsd_exec, gpsd) + +# /dev/block/mmcblk0p[0-9] +allow init emmcblk_device:blk_file rw_file_perms; + +allow init block_device:lnk_file { setattr }; +allow init tmpfs:lnk_file create_file_perms; + +# /data +allow init sdcardd_exec:file r_file_perms; + +# LD_SHIM_LIBS +allow init gpsd:process { noatsecure }; +allow init mediaserver:process { noatsecure }; diff --git a/sepolicy/kernel.te b/sepolicy/kernel.te new file mode 100644 index 0000000..f831b69 --- /dev/null +++ b/sepolicy/kernel.te @@ -0,0 +1,10 @@ +allow kernel self:capability { mknod }; +# /dev/mbin0 +allow kernel emmcblk_device:blk_file r_file_perms; +allow kernel device:blk_file { create setattr getattr unlink }; +# /bus/usb/001/001 +allow kernel device:dir { create write remove_name rmdir add_name }; +allow kernel device:chr_file { create setattr getattr unlink }; + +# /sys/devices/system/cpu/cpu[0-9]/cpufreq/* +allow kernel sysfs_devices_system_cpu:file { setattr }; diff --git a/sepolicy/macloader.te b/sepolicy/macloader.te new file mode 100644 index 0000000..1264b26 --- /dev/null +++ b/sepolicy/macloader.te @@ -0,0 +1,27 @@ +#### macloader +# +type macloader, domain; +type macloader_exec, exec_type, file_type; + +init_daemon_domain(macloader) + +allow macloader self:capability { chown dac_override fowner fsetid }; +allow macloader self:process execmem; + +# Write into /data +allow macloader system_data_file:dir { add_name search write }; +allow macloader system_file:file execute_no_trans; + +# /data/.cid.info +allow macloader wifi_data_file:dir create_dir_perms; +allow macloader wifi_data_file:file { create_file_perms getattr setattr }; + +# /sys/module/dhd/parameters/nvram_path +allow macloader sysfs:file rw_file_perms; + +# /efs +allow macloader efs_file:dir r_dir_perms; + +# /efs/wifi/.mac.info +allow macloader wifi_efs_file:dir r_dir_perms; +allow macloader wifi_efs_file:file r_file_perms; diff --git a/sepolicy/mediaserver.te b/sepolicy/mediaserver.te new file mode 100644 index 0000000..772f6ca --- /dev/null +++ b/sepolicy/mediaserver.te @@ -0,0 +1,10 @@ +# /dev/seiren +allow mediaserver seiren_device:chr_file { ioctl rw_file_perms }; +# /dev/s5p-smem +allow mediaserver secmem_device:chr_file { ioctl rw_file_perms }; + +# /efs +allow mediaserver efs_file:dir r_dir_perms; + +# /efs/wv.keys +allow mediaserver efs_file:file r_file_perms; diff --git a/sepolicy/modemloader.te b/sepolicy/modemloader.te new file mode 100644 index 0000000..48d94fd --- /dev/null +++ b/sepolicy/modemloader.te @@ -0,0 +1,8 @@ +#### modemloader +# +type modemloader, domain; +type modemloader_exec, exec_type, file_type; + +init_daemon_domain(modemloader) + +allow modemloader proc:file r_file_perms; diff --git a/sepolicy/netd.te b/sepolicy/netd.te new file mode 100644 index 0000000..a586150 --- /dev/null +++ b/sepolicy/netd.te @@ -0,0 +1 @@ +allow netd self:capability sys_module; diff --git a/sepolicy/recovery.te b/sepolicy/recovery.te new file mode 100644 index 0000000..3b5b17a --- /dev/null +++ b/sepolicy/recovery.te @@ -0,0 +1,66 @@ +recovery_only(` + permissive recovery; + + allow recovery system_radio_prop:property_service set; + allow recovery vold_prop:property_service set; + allow recovery vold_prop:property_service set; + + allow recovery emmcblk_device:dir r_dir_perms; + allow recovery emmcblk_device:blk_file rw_file_perms; + allow recovery dm_device:chr_file rw_file_perms; + allow recovery mtp_device:chr_file rw_file_perms; + allow recovery properties_device:file { rw_file_perms link unlink }; + + allow recovery device:dir create_dir_perms; + allow recovery device:file create_file_perms; + + allow recovery init:dir r_dir_perms; + allow recovery init:file r_file_perms; + allow recovery healthd:dir r_dir_perms; + allow recovery healthd:file r_file_perms; + allow recovery kernel:dir r_dir_perms; + allow recovery kernel:file r_file_perms; + allow recovery su:dir r_dir_perms; + allow recovery su:file r_file_perms; + allow recovery ueventd:dir r_dir_perms; + allow recovery ueventd:file r_file_perms; + + allow recovery tmpfs:chr_file rw_file_perms; + allow recovery rootfs:lnk_file create_file_perms; + allow recovery rootfs:fifo_file create_file_perms; + + ### Allow setenforce Permissive + allow recovery selinuxfs:file rw_file_perms; + + ### /usbstorage + allow recovery vfat:dir create_dir_perms; + allow recovery vfat:file create_file_perms; + + ### /efs + allow recovery efs_file:dir create_dir_perms; + allow recovery efs_file:file create_file_perms; + allow recovery app_efs_file:file create_file_perms; + allow recovery baro_delta_factoryapp_efs_file:file create_file_perms; + allow recovery bin_nv_data_efs_file:file create_file_perms; + allow recovery bluetooth_efs_file:file create_file_perms; + allow recovery factorymode_factoryapp_efs_file:file create_file_perms; + allow recovery imei_efs_file:file create_file_perms; + allow recovery radio_factoryapp_efs_file:file create_file_perms; + allow recovery sensor_efs_file:file create_file_perms; + allow recovery wifi_efs_file:file create_file_perms; + + ### /cache + allow recovery cache_file:file { create_file_perms relabelfrom relabelto }; + allow recovery cache_file:lnk_file create_file_perms; + allow recovery cache_file:dir { create_dir_perms mounton }; + + ### /data + allow recovery system_data_file:file { create_file_perms relabelfrom relabelto }; + allow recovery system_data_file:lnk_file create_file_perms; + allow recovery system_data_file:dir { create_dir_perms mounton }; + + ### /sdcard + allow recovery media_rw_data_file:file { create_file_perms relabelfrom relabelto }; + allow recovery media_rw_data_file:lnk_file create_file_perms; + allow recovery media_rw_data_file:dir { create_dir_perms mounton }; +') diff --git a/sepolicy/rild.te b/sepolicy/rild.te new file mode 100644 index 0000000..49e1af5 --- /dev/null +++ b/sepolicy/rild.te @@ -0,0 +1,36 @@ +# Allow additiional efs access +allow rild bin_nv_data_efs_file:file create_file_perms; +allow rild imei_efs_file:dir r_dir_perms; +allow rild imei_efs_file:file r_file_perms; +allow rild app_efs_file:dir r_dir_perms; +allow rild app_efs_file:file r_file_perms; + +# /dev/mbin0 +allow rild block_device:dir r_dir_perms; +allow rild emmcblk_device:blk_file r_file_perms; + +# /dev/umts_boot0, /dev/umts_ipc0 +allow rild mif_device:chr_file rw_file_perms; + +# /sys/devices/virtual/misc/multipdp/waketime +allow rild sysfs_multipdp_writable:file rw_file_perms; + +# /proc/sys/net/ipv6/conf/*/accept_ra_defrtr +allow rild proc_net:file rw_file_perms; + +allow rild gpsd:dir r_dir_perms; +allow rild gpsd:file r_file_perms; + +# rild reads /proc/pid/cmdline of mediaserver +allow rild mediaserver:dir { open read search getattr }; +allow rild mediaserver:file { open read getattr }; + +# /data/misc/radio/* +allow rild radio_data_file:dir rw_dir_perms; +allow rild radio_data_file:file create_file_perms; + +# sdcard/SDET_PLMN/input/MNCMCC.txt +allow rild storage_file:dir { r_dir_perms }; +allow rild storage_file:lnk_file { r_file_perms }; +allow rild mnt_user_file:dir { r_dir_perms }; +allow rild mnt_user_file:lnk_file { r_file_perms }; diff --git a/sepolicy/system_server.te b/sepolicy/system_server.te new file mode 100644 index 0000000..c2a0006 --- /dev/null +++ b/sepolicy/system_server.te @@ -0,0 +1,19 @@ +# /dev/mbin0 +allow system_server emmcblk_device:dir search; + +# /efs +allow system_server efs_file:dir r_dir_perms; + +# /efs/gyro_cal_data +allow system_server sensor_efs_file:file r_file_perms; + +# /data/system/gps/.gps.interface.pipe.to_gpsd +allow system_server gps_data_file:fifo_file rw_file_perms; + +# /efs/prox_cal +allow system_server efs_file:file r_file_perms; + +# WifiMachine +allow system_server self:capability { sys_module }; +allow system_server wifi_efs_file:dir r_dir_perms; +allow system_server wifi_efs_file:file r_file_perms; diff --git a/sepolicy/ueventd.te b/sepolicy/ueventd.te new file mode 100644 index 0000000..396e170 --- /dev/null +++ b/sepolicy/ueventd.te @@ -0,0 +1,5 @@ +# /dev/block/mmcblk0p[0-9] +allow ueventd emmcblk_device:blk_file create_file_perms; + +# /sys/devices/virtual/misc/multipdp/uevent +allow ueventd sysfs_multipdp_writable:file rw_file_perms; diff --git a/sepolicy/uncrypt.te b/sepolicy/uncrypt.te new file mode 100644 index 0000000..1f5142f --- /dev/null +++ b/sepolicy/uncrypt.te @@ -0,0 +1,2 @@ +allow uncrypt emmcblk_device:blk_file w_file_perms; +allow uncrypt emmcblk_device:dir r_dir_perms; diff --git a/sepolicy/vold.te b/sepolicy/vold.te new file mode 100644 index 0000000..2f504c2 --- /dev/null +++ b/sepolicy/vold.te @@ -0,0 +1,5 @@ +# /efs +allow vold efs_file:dir r_dir_perms; +# /dev/block/mmcblk0p[0-9] +allow vold emmcblk_device:dir create_dir_perms; +allow vold emmcblk_device:blk_file create_file_perms; diff --git a/sepolicy/wifiloader.te b/sepolicy/wifiloader.te new file mode 100644 index 0000000..7058e98 --- /dev/null +++ b/sepolicy/wifiloader.te @@ -0,0 +1,8 @@ +#### wifiloader +# +type wifiloader, domain; +type wifiloader_exec, exec_type, file_type; + +init_daemon_domain(wifiloader) + +allow wifiloader proc:file r_file_perms; diff --git a/sepolicy/wpa.te b/sepolicy/wpa.te new file mode 100644 index 0000000..8ed52f6 --- /dev/null +++ b/sepolicy/wpa.te @@ -0,0 +1,9 @@ +# /dev/rfkill +allow wpa rfkill_device:chr_file r_file_perms; + +# /efs +allow wpa efs_file:dir r_dir_perms; + +# /efs/wifi +allow wpa wifi_efs_file:dir r_dir_perms; +allow wpa wifi_efs_file:file r_file_perms; diff --git a/setup-makefiles.sh b/setup-makefiles.sh new file mode 100644 index 0000000..5efda19 --- /dev/null +++ b/setup-makefiles.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +VENDOR=samsung +DEVICE=j7e3gxx +OUTDIR=vendor/$VENDOR/$DEVICE +MAKEFILE=../../../$OUTDIR/$DEVICE-vendor-blobs.mk + +(cat << EOF) > $MAKEFILE +# Copyright (C) 2016 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. + +# This file is generated by device/$VENDOR/$DEVICE/setup-makefiles.sh + +PRODUCT_COPY_FILES += \\ +EOF + +LINEEND=" \\" +COUNT=`wc -l proprietary-files.txt | awk {'print $1'}` +DISM=`egrep -c '(^#|^$)' proprietary-files.txt` +COUNT=`expr $COUNT - $DISM` +for FILE in `egrep -v '(^#|^$)' proprietary-files.txt`; do + COUNT=`expr $COUNT - 1` + if [ $COUNT = "0" ]; then + LINEEND="" + fi + # Split the file from the destination (format is "file[:destination]") + OLDIFS=$IFS IFS=":" PARSING_ARRAY=($FILE) IFS=$OLDIFS + if [[ ! "$FILE" =~ ^-.* ]]; then + FILE=`echo ${PARSING_ARRAY[0]} | sed -e "s/^-//g"` + DEST=${PARSING_ARRAY[1]} + if [ -n "$DEST" ]; then + FILE=$DEST + fi + echo " $OUTDIR/proprietary/$FILE:system/$FILE$LINEEND" >> $MAKEFILE + fi +done + +(cat << EOF) > ../../../$OUTDIR/$DEVICE-vendor.mk +# Copyright (C) 2016 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. + +# This file is generated by device/$VENDOR/$DEVICE/setup-makefiles.sh + +# Pick up overlay for features that depend on non-open-source files + +\$(call inherit-product, vendor/$VENDOR/$DEVICE/$DEVICE-vendor-blobs.mk) +EOF + +(cat << EOF) > ../../../$OUTDIR/Android.mk +# Copyright (C) 2016 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. + +# This file is generated by device/$VENDOR/$DEVICE/setup-makefiles.sh + +LOCAL_PATH := \$(call my-dir) + +ifeq (\$(TARGET_DEVICE),$DEVICE) + +endif + +EOF + +(cat << EOF) > ../../../$OUTDIR/BoardConfigVendor.mk +# Copyright (C) 2016 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. + +# This file is generated by device/$VENDOR/$DEVICE/setup-makefiles.sh +EOF + diff --git a/system.prop b/system.prop new file mode 100644 index 0000000..45ac3c6 --- /dev/null +++ b/system.prop @@ -0,0 +1,35 @@ +# Audio +af.fast_track_multiplier=1 +audio_hal.force_wideband=true + +# Display +ro.sf.lcd_density=320 +ro.opengles.version=196609 + +# Radio +#telephony.lteOnCdmaDevice=0 +#persist.radio.apm_sim_not_pwdn=1 +#persist.radio.add_power_save=1 +rild.libpath=/system/lib/libsec-ril.so +rild.libpath2=/system/lib/libsec-ril-dsds.so +rild.libargs=-d /dev/ttyS0 +ro.telephony.ril_class=SlteRIL +ro.use_data_netmgrd=false +persist.data.netmgrd.qos.enable=false +ro.ril.hsxpa=1 +ro.ril.gprsclass=10 +#persist.radio.multisim.config=dsds +#ro.multisim.simslotcount=2 + +# Wifi +wifi.interface=wlan0 + +# misc +ro.chipname=exynos7580 +dalvik.vm.heapstartsize=8m +dalvik.vm.heapgrowthlimit=128m +dalvik.vm.heapsize=512m +dalvik.vm.heaptargetutilization=0.75 +dalvik.vm.heapminfree=2m +dalvik.vm.heapmaxfree=8m +ro.arch=exynos7580 diff --git a/vendorsetup.sh b/vendorsetup.sh new file mode 100644 index 0000000..51d4bd8 --- /dev/null +++ b/vendorsetup.sh @@ -0,0 +1,2 @@ +add_lunch_combo cm_j7eltexx-eng +add_lunch_combo cm_j7eltexx-userdebug