diff options
author | Daniel Hillenbrand <daniel.hillenbrand@codeworkx.de> | 2012-07-25 04:32:16 +0200 |
---|---|---|
committer | Daniel Hillenbrand <daniel.hillenbrand@codeworkx.de> | 2012-07-25 04:32:16 +0200 |
commit | 51841ab0c58201c6c45ca22ceac30f1229213f7d (patch) | |
tree | a41a43753b458be8976d7684c2741b249d4fc33a | |
download | device_samsung_galaxys2-common-51841ab0c58201c6c45ca22ceac30f1229213f7d.zip device_samsung_galaxys2-common-51841ab0c58201c6c45ca22ceac30f1229213f7d.tar.gz device_samsung_galaxys2-common-51841ab0c58201c6c45ca22ceac30f1229213f7d.tar.bz2 |
initial commit
75 files changed, 7413 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..52fa6a2 --- /dev/null +++ b/Android.mk @@ -0,0 +1,23 @@ +# +# Copyright (C) 2012 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := $(call my-dir) + +ifneq ($(filter i777 i9100 n7000,$(TARGET_DEVICE)),) + +include $(call all-makefiles-under,$(LOCAL_PATH)) + +endif diff --git a/BoardCommonConfig.mk b/BoardCommonConfig.mk new file mode 100644 index 0000000..3577d60 --- /dev/null +++ b/BoardCommonConfig.mk @@ -0,0 +1,149 @@ +# +# Copyright (C) 2012 The Android Open-Source Project +# Copyright (C) 2012 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# This variable is set first, so it can be overridden +# by BoardConfigVendor.mk +USE_CAMERA_STUB := true +BOARD_USES_GENERIC_AUDIO := false +BOARD_USES_LIBSECRIL_STUB := true + +TARGET_CPU_ABI := armeabi-v7a +TARGET_CPU_ABI2 := armeabi +TARGET_CPU_SMP := true +TARGET_ARCH_VARIANT := armv7-a-neon +TARGET_ARCH_VARIANT_CPU := cortex-a9 +ARCH_ARM_HAVE_NEON := true +ARCH_ARM_HAVE_TLS_REGISTER := true +EXYNOS4210_ENHANCEMENTS := true + +ifdef EXYNOS4210_ENHANCEMENTS +COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS +COMMON_GLOBAL_CFLAGS += -DEXYNOS4210_ENHANCEMENTS +COMMON_GLOBAL_CFLAGS += -DSURFACEFLINGER_FORCE_SCREEN_RELEASE +endif + +TARGET_BOARD_PLATFORM := exynos4 +TARGET_SOC := exynos4210 +TARGET_BOOTLOADER_BOARD_NAME := smdk4210 + +TARGET_NO_BOOTLOADER := true +TARGET_NO_RADIOIMAGE := true + +TARGET_PROVIDES_INIT := true +TARGET_PROVIDES_INIT_TARGET_RC := true +TARGET_RECOVERY_INITRC := device/samsung/galaxys2-common/recovery.rc + +BOARD_NAND_PAGE_SIZE := 4096 +BOARD_NAND_SPARE_SIZE := 128 +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_BASE := 0x40000000 +BOARD_KERNEL_CMDLINE := console=ttySAC2,115200 consoleblank=0 + +# Filesystem +TARGET_USERIMAGES_USE_EXT4 := true +BOARD_BOOTIMAGE_PARTITION_SIZE := 8388608 +BOARD_SYSTEMIMAGE_PARTITION_SIZE := 536870912 +BOARD_USERDATAIMAGE_PARTITION_SIZE := 2147483648 +BOARD_FLASH_BLOCK_SIZE := 4096 + +# Releasetools +TARGET_RELEASETOOL_OTA_FROM_TARGET_SCRIPT := ./device/samsung/galaxys2-common/releasetools/galaxys2_ota_from_target_files +TARGET_RELEASETOOL_IMG_FROM_TARGET_SCRIPT := ./device/samsung/galaxys2-common/releasetools/galaxys2_img_from_target_files + +# Graphics +BOARD_EGL_CFG := device/samsung/galaxys2-common/configs/egl.cfg +USE_OPENGL_RENDERER := true + +# Enable WEBGL in WebKit +ENABLE_WEBGL := true + +# HWComposer +BOARD_USES_HWCOMPOSER := true +BOARD_USE_SECTVOUT := true +BOARD_USES_FIMGAPI := true + +# OMX +BOARD_USE_SAMSUNG_COLORFORMAT := true +BOARD_FIX_NATIVE_COLOR_FORMAT := true +BOARD_HAVE_CODEC_SUPPORT := SAMSUNG_CODEC_SUPPORT +COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CODEC_SUPPORT +BOARD_NONBLOCK_MODE_PROCESS := true +BOARD_USE_STOREMETADATA := true +BOARD_USE_METADATABUFFERTYPE := true +BOARD_USES_MFC_FPS := true + +# Audio +BOARD_USE_YAMAHAPLAYER := true +BOARD_USE_SAMSUNG_SEPARATEDSTREAM := true +COMMON_GLOBAL_CFLAGS += -DICS_AUDIO_BLOB + +# RIL +BOARD_MOBILEDATA_INTERFACE_NAME := "pdp0" + +# Camera +BOARD_USES_PROPRIETARY_LIBCAMERA := true +BOARD_USES_PROPRIETARY_LIBFIMC := true +COMMON_GLOBAL_CFLAGS += -DDISABLE_HW_ID_MATCH_CHECK +COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARE + +# Wifi +BOARD_WLAN_DEVICE := bcmdhd +BOARD_WLAN_DEVICE_REV := bcm4330_b1 +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_MODULE_PATH := "/system/lib/modules/dhd.ko" +WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/dhd/parameters/firmware_path" +WIFI_DRIVER_FW_PATH_STA := "/system/etc/wifi/bcm4330_sta.bin" +WIFI_DRIVER_FW_PATH_AP := "/system/etc/wifi/bcm4330_apsta.bin" +WIFI_DRIVER_FW_PATH_P2P := "/system/etc/wifi/bcm4330_p2p.bin" +WIFI_DRIVER_MODULE_NAME := "dhd" +WIFI_DRIVER_MODULE_ARG := "firmware_path=/system/etc/wifi/bcm4330_sta.bin nvram_path=/system/etc/wifi/nvram_net.txt" +WIFI_BAND := 802_11_ABG + +# Bluetooth +BOARD_HAVE_BLUETOOTH := true +BOARD_HAVE_BLUETOOTH_BCM := true + +# Vold +BOARD_VOLD_MAX_PARTITIONS := 12 +BOARD_VOLD_EMMC_SHARES_DEV_MAJOR := true +BOARD_VOLD_DISC_HAS_MULTIPLE_MAJORS := true +TARGET_USE_CUSTOM_LUN_FILE_PATH := "/sys/devices/platform/s3c-usbgadget/gadget/lun%d/file" + +# Recovery +BOARD_CUSTOM_RECOVERY_KEYMAPPING := ../../device/samsung/galaxys2-common/recovery/recovery_keys.c +BOARD_CUSTOM_GRAPHICS := ../../../device/samsung/galaxys2-common/recovery/graphics.c +BOARD_UMS_LUNFILE := "/sys/class/android_usb/android0/f_mass_storage/lun0/file" +BOARD_USES_MMCUTILS := true +BOARD_HAS_NO_MISC_PARTITION := true +BOARD_HAS_NO_SELECT_BUTTON := true +BOARD_SUPPRESS_EMMC_WIPE := true + +TARGET_SPECIFIC_HEADER_PATH := device/samsung/galaxys2-common/overlay/include + +# Charging mode +BOARD_CHARGING_MODE_BOOTING_LPM := /sys/class/power_supply/battery/batt_lp_charging +BOARD_BATTERY_DEVICE_NAME := "battery" +BOARD_CHARGER_RES := device/samsung/galaxys2-common/res/charger + +BOARD_CUSTOM_BOOTIMG_MK := device/samsung/galaxys2-common/shbootimg.mk + +# Use the non-open-source parts, if they're present +-include vendor/samsung/galaxys2-common/BoardConfigVendor.mk diff --git a/camera/Android.mk b/camera/Android.mk new file mode 100644 index 0000000..46cce24 --- /dev/null +++ b/camera/Android.mk @@ -0,0 +1,15 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + CameraWrapper.cpp + +LOCAL_SHARED_LIBRARIES := \ + libhardware liblog libcamera_client libutils + +LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw +LOCAL_MODULE := camera.$(TARGET_BOARD_PLATFORM) +LOCAL_MODULE_TAGS := optional + +include $(BUILD_SHARED_LIBRARY) +#include $(BUILD_HEAPTRACKED_SHARED_LIBRARY) diff --git a/camera/CameraWrapper.cpp b/camera/CameraWrapper.cpp new file mode 100644 index 0000000..f91604a --- /dev/null +++ b/camera/CameraWrapper.cpp @@ -0,0 +1,585 @@ +/* + * Copyright (C) 2012, The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** +* @file CameraWrapper.cpp +* +* This file wraps a vendor camera module. +* +*/ + + +#define LOG_NDEBUG 0 +//#define LOG_PARAMETERS + +#define LOG_TAG "CameraWrapper" +#include <cutils/log.h> + +#include <utils/threads.h> +#include <utils/String8.h> +#include <hardware/hardware.h> +#include <hardware/camera.h> +#include <camera/Camera.h> +#include <camera/CameraParameters.h> + +static android::Mutex gCameraWrapperLock; +static camera_module_t *gVendorModule = 0; + +static int camera_device_open(const hw_module_t* module, const char* name, + hw_device_t** device); +static int camera_device_close(hw_device_t* device); +static int camera_get_number_of_cameras(void); +static int camera_get_camera_info(int camera_id, struct camera_info *info); + +static struct hw_module_methods_t camera_module_methods = { + open: camera_device_open +}; + +camera_module_t HAL_MODULE_INFO_SYM = { + common: { + tag: HARDWARE_MODULE_TAG, + version_major: 1, + version_minor: 0, + id: CAMERA_HARDWARE_MODULE_ID, + name: "Exynos4x12 Camera Wrapper", + author: "Teamhacksung <info@teamhacksung.org>", + methods: &camera_module_methods, + dso: NULL, /* remove compilation warnings */ + reserved: {0}, /* remove compilation warnings */ + }, + get_number_of_cameras: camera_get_number_of_cameras, + get_camera_info: camera_get_camera_info, +}; + +typedef struct wrapper_camera_device { + camera_device_t base; + int id; + camera_device_t *vendor; +} wrapper_camera_device_t; + +#define VENDOR_CALL(device, func, ...) ({ \ + wrapper_camera_device_t *__wrapper_dev = (wrapper_camera_device_t*) device; \ + __wrapper_dev->vendor->ops->func(__wrapper_dev->vendor, ##__VA_ARGS__); \ +}) + +#define CAMERA_ID(device) (((wrapper_camera_device_t *)(device))->id) + +static int check_vendor_module() +{ + int rv = 0; + ALOGV("%s", __FUNCTION__); + + if(gVendorModule) + return 0; + + rv = hw_get_module("vendor-camera", (const hw_module_t **)&gVendorModule); + if (rv) + ALOGE("failed to open vendor camera module"); + return rv; +} + +const static char * iso_values[] = {"auto,ISO100,ISO200,ISO400,ISO800","auto"}; + +static char * camera_fixup_getparams(int id, const char * settings) +{ + android::CameraParameters params; + params.unflatten(android::String8(settings)); + + // fix params here +#warning "Reimplement KEY_SUPPORTED_ISO_MODES" +// params.set(android::CameraParameters::KEY_SUPPORTED_ISO_MODES, iso_values[id]); + + android::String8 strParams = params.flatten(); + char *ret = strdup(strParams.string()); + + ALOGD("%s: get parameters fixed up", __FUNCTION__); + return ret; +} + +char * camera_fixup_setparams(int id, const char * settings) +{ + android::CameraParameters params; + params.unflatten(android::String8(settings)); + +/* + // fix params here + if(params.get("iso")) { + const char* isoMode = params.get(android::CameraParameters::KEY_ISO_MODE); + if(strcmp(isoMode, "ISO100") == 0) + params.set(android::CameraParameters::KEY_ISO_MODE, "100"); + else if(strcmp(isoMode, "ISO200") == 0) + params.set(android::CameraParameters::KEY_ISO_MODE, "200"); + else if(strcmp(isoMode, "ISO400") == 0) + params.set(android::CameraParameters::KEY_ISO_MODE, "400"); + else if(strcmp(isoMode, "ISO800") == 0) + params.set(android::CameraParameters::KEY_ISO_MODE, "800"); + } +*/ + android::String8 strParams = params.flatten(); + char *ret = strdup(strParams.string()); + + ALOGD("%s: set parameters fixed up", __FUNCTION__); + return ret; +} + +/******************************************************************* + * implementation of camera_device_ops functions + *******************************************************************/ + +int camera_set_preview_window(struct camera_device * device, + struct preview_stream_ops *window) +{ + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, set_preview_window, window); +} + +void camera_set_callbacks(struct camera_device * device, + camera_notify_callback notify_cb, + camera_data_callback data_cb, + camera_data_timestamp_callback data_cb_timestamp, + camera_request_memory get_memory, + void *user) +{ + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + ALOGV("%s", __FUNCTION__); + + if(!device) + return; + + VENDOR_CALL(device, set_callbacks, notify_cb, data_cb, data_cb_timestamp, get_memory, user); +} + +void camera_enable_msg_type(struct camera_device * device, int32_t msg_type) +{ + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + ALOGV("%s", __FUNCTION__); + + if(!device) + return; + + VENDOR_CALL(device, enable_msg_type, msg_type); +} + +void camera_disable_msg_type(struct camera_device * device, int32_t msg_type) +{ + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + ALOGV("%s", __FUNCTION__); + + if(!device) + return; + + VENDOR_CALL(device, disable_msg_type, msg_type); +} + +int camera_msg_type_enabled(struct camera_device * device, int32_t msg_type) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return 0; + + return VENDOR_CALL(device, msg_type_enabled, msg_type); +} + +int camera_start_preview(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, start_preview); +} + +void camera_stop_preview(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return; + + VENDOR_CALL(device, stop_preview); +} + +int camera_preview_enabled(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, preview_enabled); +} + +int camera_store_meta_data_in_buffers(struct camera_device * device, int enable) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, store_meta_data_in_buffers, enable); +} + +int camera_start_recording(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return EINVAL; + + return VENDOR_CALL(device, start_recording); +} + +void camera_stop_recording(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return; + + + VENDOR_CALL(device, stop_recording); +} + +int camera_recording_enabled(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, recording_enabled); +} + +void camera_release_recording_frame(struct camera_device * device, + const void *opaque) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return; + + VENDOR_CALL(device, release_recording_frame, opaque); +} + +int camera_auto_focus(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + + return VENDOR_CALL(device, auto_focus); +} + +int camera_cancel_auto_focus(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + // Samsung camera HAL restarts focus (CAF_RESTART) when we cancel auto focus. + // Cancel auto focus is called just before pic is taken in autofocus mode, thus + // the HAL crashes. + return 0; + //return VENDOR_CALL(device, cancel_auto_focus); +} + +int camera_take_picture(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, take_picture); +} + +int camera_cancel_picture(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, take_picture); +} + +int camera_set_parameters(struct camera_device * device, const char *params) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + char *tmp = NULL; + tmp = camera_fixup_setparams(CAMERA_ID(device), params); + +#ifdef LOG_PARAMETERS + __android_log_write(ANDROID_LOG_VERBOSE, LOG_TAG, tmp); +#endif + + int ret = VENDOR_CALL(device, set_parameters, tmp); + return ret; +} + +char* camera_get_parameters(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return NULL; + + char* params = VENDOR_CALL(device, get_parameters); + +#ifdef LOG_PARAMETERS + __android_log_write(ANDROID_LOG_VERBOSE, LOG_TAG, params); +#endif + + char * tmp = camera_fixup_getparams(CAMERA_ID(device), params); + VENDOR_CALL(device, put_parameters, params); + params = tmp; + +#ifdef LOG_PARAMETERS + __android_log_write(ANDROID_LOG_VERBOSE, LOG_TAG, params); +#endif + + return params; +} + +static void camera_put_parameters(struct camera_device *device, char *params) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(params) + free(params); +} + +int camera_send_command(struct camera_device * device, + int32_t cmd, int32_t arg1, int32_t arg2) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return -EINVAL; + + /* send_command causes the camera hal do to unexpected things like lockups. + * don't pass any command to the vendor hal to prevent this */ + return 0; + //return VENDOR_CALL(device, send_command, cmd, arg1, arg2); +} + +void camera_release(struct camera_device * device) +{ + ALOGV("%s", __FUNCTION__); + ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor)); + + if(!device) + return; + + VENDOR_CALL(device, release); +} + +int camera_dump(struct camera_device * device, int fd) +{ + if(!device) + return -EINVAL; + + return VENDOR_CALL(device, dump, fd); +} + +extern "C" void heaptracker_free_leaked_memory(void); + +int camera_device_close(hw_device_t* device) +{ + int ret = 0; + wrapper_camera_device_t *wrapper_dev = NULL; + + ALOGV("%s", __FUNCTION__); + + android::Mutex::Autolock lock(gCameraWrapperLock); + + if (!device) { + ret = -EINVAL; + goto done; + } + + wrapper_dev = (wrapper_camera_device_t*) device; + + wrapper_dev->vendor->common.close((hw_device_t*)wrapper_dev->vendor); + if (wrapper_dev->base.ops) + free(wrapper_dev->base.ops); + free(wrapper_dev); +done: +#ifdef HEAPTRACKER + heaptracker_free_leaked_memory(); +#endif + return ret; +} + +/******************************************************************* + * implementation of camera_module functions + *******************************************************************/ + +/* open device handle to one of the cameras + * + * assume camera service will keep singleton of each camera + * so this function will always only be called once per camera instance + */ + +int camera_device_open(const hw_module_t* module, const char* name, + hw_device_t** device) +{ + int rv = 0; + int num_cameras = 0; + int cameraid; + wrapper_camera_device_t* camera_device = NULL; + camera_device_ops_t* camera_ops = NULL; + + android::Mutex::Autolock lock(gCameraWrapperLock); + + ALOGV("camera_device open"); + + if (name != NULL) { + if (check_vendor_module()) + return -EINVAL; + + cameraid = atoi(name); + num_cameras = gVendorModule->get_number_of_cameras(); + + if(cameraid > num_cameras) + { + ALOGE("camera service provided cameraid out of bounds, " + "cameraid = %d, num supported = %d", + cameraid, num_cameras); + rv = -EINVAL; + goto fail; + } + + camera_device = (wrapper_camera_device_t*)malloc(sizeof(*camera_device)); + if(!camera_device) + { + ALOGE("camera_device allocation fail"); + rv = -ENOMEM; + goto fail; + } + memset(camera_device, 0, sizeof(*camera_device)); + camera_device->id = cameraid; + + if(rv = gVendorModule->common.methods->open((const hw_module_t*)gVendorModule, name, (hw_device_t**)&(camera_device->vendor))) + { + ALOGE("vendor camera open fail"); + goto fail; + } + ALOGV("%s: got vendor camera device 0x%08X", __FUNCTION__, (uintptr_t)(camera_device->vendor)); + + camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops)); + if(!camera_ops) + { + ALOGE("camera_ops allocation fail"); + rv = -ENOMEM; + goto fail; + } + + memset(camera_ops, 0, sizeof(*camera_ops)); + + camera_device->base.common.tag = HARDWARE_DEVICE_TAG; + camera_device->base.common.version = 0; + camera_device->base.common.module = (hw_module_t *)(module); + camera_device->base.common.close = camera_device_close; + camera_device->base.ops = camera_ops; + + camera_ops->set_preview_window = camera_set_preview_window; + camera_ops->set_callbacks = camera_set_callbacks; + camera_ops->enable_msg_type = camera_enable_msg_type; + camera_ops->disable_msg_type = camera_disable_msg_type; + camera_ops->msg_type_enabled = camera_msg_type_enabled; + camera_ops->start_preview = camera_start_preview; + camera_ops->stop_preview = camera_stop_preview; + camera_ops->preview_enabled = camera_preview_enabled; + camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers; + camera_ops->start_recording = camera_start_recording; + camera_ops->stop_recording = camera_stop_recording; + camera_ops->recording_enabled = camera_recording_enabled; + camera_ops->release_recording_frame = camera_release_recording_frame; + camera_ops->auto_focus = camera_auto_focus; + camera_ops->cancel_auto_focus = camera_cancel_auto_focus; + camera_ops->take_picture = camera_take_picture; + camera_ops->cancel_picture = camera_cancel_picture; + camera_ops->set_parameters = camera_set_parameters; + camera_ops->get_parameters = camera_get_parameters; + camera_ops->put_parameters = camera_put_parameters; + camera_ops->send_command = camera_send_command; + camera_ops->release = camera_release; + camera_ops->dump = camera_dump; + + *device = &camera_device->base.common; + } + + return rv; + +fail: + if(camera_device) { + free(camera_device); + camera_device = NULL; + } + if(camera_ops) { + free(camera_ops); + camera_ops = NULL; + } + *device = NULL; + return rv; +} + +int camera_get_number_of_cameras(void) +{ + ALOGV("%s", __FUNCTION__); + if (check_vendor_module()) + return 0; + return gVendorModule->get_number_of_cameras(); +} + +int camera_get_camera_info(int camera_id, struct camera_info *info) +{ + ALOGV("%s", __FUNCTION__); + if (check_vendor_module()) + return 0; + return gVendorModule->get_camera_info(camera_id, info); +} diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..9a5dc6f --- /dev/null +++ b/common.mk @@ -0,0 +1,184 @@ +# +# Copyright (C) 2012 The Android Open-Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +DEVICE_PACKAGE_OVERLAYS := device/samsung/galaxys2-common/overlay + +# This device is hdpi. +PRODUCT_AAPT_CONFIG := normal hdpi +PRODUCT_AAPT_PREF_CONFIG := hdpi +PRODUCT_LOCALES += hdpi + +# Init files +PRODUCT_COPY_FILES := \ + device/samsung/galaxys2-common/lpm.rc:root/lpm.rc \ + device/samsung/galaxys2-common/init.smdk4210.usb.rc:root/init.smdk4210.usb.rc \ + device/samsung/galaxys2-common/init.smdk4210.rc:root/init.smdk4210.rc \ + device/samsung/galaxys2-common/ueventd.smdk4210.rc:root/ueventd.smdk4210.rc + +# Audio +PRODUCT_COPY_FILES += \ + device/samsung/galaxys2-common/configs/asound.conf:system/etc/asound.conf + +# Vold and Storage +PRODUCT_COPY_FILES += \ + device/samsung/galaxys2-common/configs/vold.fstab:system/etc/vold.fstab + +# Bluetooth configuration files +PRODUCT_COPY_FILES += \ + system/bluetooth/data/main.le.conf:system/etc/bluetooth/main.conf + +# Wifi +PRODUCT_COPY_FILES += \ + device/samsung/galaxys2-common/configs/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf \ + device/samsung/galaxys2-common/configs/bcmdhd.cal:system/etc/wifi/bcmdhd.cal + +PRODUCT_PROPERTY_OVERRIDES += \ + wifi.interface=wlan0 \ + wifi.supplicant_scan_interval=15 + +$(call inherit-product-if-exists, hardware/broadcom/wlan/bcmdhd/firmware/bcm4330/device-bcm.mk) + +# Gps +PRODUCT_COPY_FILES += \ + device/samsung/galaxys2-common/configs/gps.conf:system/etc/gps.conf \ + device/samsung/galaxys2-common/configs/sirfgps.conf:system/etc/sirfgps.conf + +# Packages +PRODUCT_PACKAGES := \ + audio.a2dp.default \ + libaudiohw_legacy \ + camera.exynos4 \ + libsurfaceflinger_client \ + com.android.future.usb.accessory \ + SamsungServiceMode \ + Torch \ + TvOut + +# HAL +PRODUCT_PACKAGES += \ + lights.exynos4 \ + libhwconverter \ + libs5pjpeg \ + libfimg + +# Charger +PRODUCT_PACKAGES += \ + charger \ + charger_res_images + +# MFC API +PRODUCT_PACKAGES += \ + libsecmfcapi + +# OMX +PRODUCT_PACKAGES += \ + libstagefrighthw \ + libseccscapi \ + libsecbasecomponent \ + libsecosal \ + libSEC_OMX_Resourcemanager \ + libSEC_OMX_Core \ + libSEC_OMX_Vdec \ + libOMX.SEC.AVC.Decoder \ + libOMX.SEC.M4V.Decoder \ + libOMX.SEC.WMV.Decoder \ + libOMX.SEC.VP8.Decoder \ + libSEC_OMX_Venc \ + libOMX.SEC.AVC.Encoder \ + libOMX.SEC.M4V.Encoder \ + libSEC_OMX_Adec \ + libOMX.SEC.MP3.Decoder + +PRODUCT_COPY_FILES += \ + device/samsung/galaxys2-common/configs/media_codecs.xml:system/etc/media_codecs.xml \ + device/samsung/galaxys2-common/configs/media_profiles.xml:system/etc/media_profiles.xml + +# RIL +PRODUCT_PROPERTY_OVERRIDES += \ + ro.telephony.ril_class=Smdk4210RIL \ + mobiledata.interfaces=pdp0,wlan0,gprs,ppp0 \ + ro.ril.hsxpa=1 \ + ro.ril.gprsclass=10 + +# Filesystem management tools +PRODUCT_PACKAGES += \ + static_busybox \ + make_ext4fs \ + setup_fs + +# Live Wallpapers +PRODUCT_PACKAGES += \ + Galaxy4 \ + HoloSpiralWallpaper \ + LiveWallpapers \ + LiveWallpapersPicker \ + MagicSmokeWallpapers \ + NoiseField \ + PhaseBeam \ + VisualizationWallpapers \ + librs_jni + +# These are the hardware-specific features +PRODUCT_COPY_FILES += \ + frameworks/native/data/etc/android.hardware.audio.low_latency.xml:system/etc/permissions/android.hardware.audio.low_latency.xml \ + frameworks/native/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml \ + frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \ + frameworks/native/data/etc/android.hardware.camera.front.xml:system/etc/permissions/android.hardware.camera.front.xml \ + frameworks/native/data/etc/android.hardware.camera.xml:system/etc/permissions/android.hardware.camera.xml \ + frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \ + frameworks/native/data/etc/android.hardware.location.xml:system/etc/permissions/android.hardware.location.xml \ + frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:system/etc/permissions/android.hardware.sensor.accelerometer.xml \ + frameworks/native/data/etc/android.hardware.sensor.compass.xml:system/etc/permissions/android.hardware.sensor.compass.xml \ + frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \ + frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \ + frameworks/native/data/etc/android.hardware.sensor.proximity.xml:system/etc/permissions/android.hardware.sensor.proximity.xml \ + frameworks/native/data/etc/android.hardware.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.touchscreen.multitouch.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.xml \ + frameworks/native/data/etc/android.hardware.touchscreen.xml:system/etc/permissions/android.hardware.touchscreen.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/android.software.sip.voip.xml:system/etc/permissions/android.software.sip.voip.xml \ + frameworks/native/data/etc/android.software.sip.xml:system/etc/permissions/android.software.sip.xml \ + frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml + +# Feature live wallpaper +PRODUCT_COPY_FILES += \ + packages/wallpapers/LivePicker/android.software.live_wallpaper.xml:system/etc/permissions/android.software.live_wallpaper.xml + +PRODUCT_PROPERTY_OVERRIDES += \ + ro.opengles.version=131072 \ + hwui.render_dirty_regions=false + +PRODUCT_PROPERTY_OVERRIDES += \ + ro.sf.lcd_density=240 + +PRODUCT_TAGS += dalvik.gc.type-precise + +# Set default USB interface +PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ + persist.sys.usb.config=mtp + +$(call inherit-product, frameworks/native/build/phone-hdpi-512-dalvik-heap.mk) + +# Include exynos4 platform specific parts +TARGET_HAL_PATH := hardware/samsung/exynos4/hal +TARGET_OMX_PATH := hardware/samsung/exynos/multimedia/openmax +$(call inherit-product, hardware/samsung/exynos4210.mk) + +# Use the non-open-source parts, if they're present +-include vendor/samsung/galaxys2-common/common-vendor.mk diff --git a/configs/asound.conf b/configs/asound.conf new file mode 100644 index 0000000..6144596 --- /dev/null +++ b/configs/asound.conf @@ -0,0 +1,61 @@ +# +# Copyright(c) 2010 Yamaha Corporation +# + +# ---------------------------------------- +# PCM Interface +# + +pcm.hifi { + type plug + slave.pcm { + type hw + card 0 + device 0 + format S16_LE + channels 2 + rate 44100 + } +} + +pcm.voice { + type plug + slave.pcm { + type hw + card 0 + device 1 + format S16_LE + channels 1 + rate 8000 + } +} + +pcm.bluetooth { + type plug + slave.pcm { + type hw + card 0 + device 2 + format S16_LE + channels 1 + rate 8000 + } +} + +# ---------------------------------------- +# Mixer Interface +# + +ctl.mc1n2 { + type hw + card 0 +} + +# ---------------------------------------- +# Hardware Dependant Interface +# + +hwdep.mc1n2 { + type hw + card 0 +} diff --git a/configs/bcmdhd.cal b/configs/bcmdhd.cal new file mode 100644 index 0000000..a820b83 --- /dev/null +++ b/configs/bcmdhd.cal @@ -0,0 +1,118 @@ +manfid=0x2d0 +prodid=0x0532 +vendid=0x14e4 +devid=0x4360 +boardtype=0x0532 +boardrev=0x20 +boardflags=0x10080201 + +nocrc=1 +xtalfreq=37400 +xtalmode=0x20,0x4,0 +boardnum=22 +macaddr=00:90:4c:c5:12:38 +ag0=252 +ag1=252 +aa2g=1 +aa5g=1 +ccode=GB + +#for BT-coexistence +btc_params80=0 +btc_params6=10 +btc_params8=10000 + +sd_gpout=0 +# sd_oobonly=1 +muxenab=0x10 + +# 2G PA param_B42R 110927 +pa0b0=0x12E4 +pa0b1=0xFE09 +pa0b2=0xFF9A +#pa0itssit=62 +rssismf2g=0xa +rssismc2g=0x3 +rssisav2g=0x7 + +# rssi params for 5GHz B42R_110803 +#rssismf5g=0x4 +rssismf5g=0xa +rssismc5g=0x7 +rssisav5g=0x1 +#PA parameters for lower band +pa1lob0=0x144F +pa1lob1=0xFD6B +pa1lob2=0xFF3B +#PA parameters for midband +pa1b0=0x139C +pa1b1=0xFD87 +pa1b2=0xFF4F +#PA parameters for high band +pa1hib0=0x12CA +pa1hib1=0xFD9A +pa1hib2=0xFF4E + +# 2G PA offset +maxp2ga0=64 +sromrev=3 +cckpo=0 +ofdm2gpo=0x66666666 +mcs2gpo0=0xaaaa +mcs2gpo1=0xaaaa + +# 5G PA offset +maxp5ga0=66 +maxp5gla0=66 +maxp5gha0=66 +ofdm5gpo=0x22222222 +ofdm5glpo=0x11111111 +ofdm5ghpo=0x22222222 +mcs5gpo0=0x6666 +mcs5gpo1=0x6666 +mcs5glpo0=0x5555 +mcs5glpo1=0x5555 +mcs5ghpo0=0x6666 +mcs5ghpo1=0x6666 + +cckPwrOffset=4 +cckdigfilttype=22 +ofdmdigfilttype=2 +extpagain5g=2 +#wl0id=0x431b + +# For 2GHz Tx EVM/SM +rfreg033=0x19 +rfreg033_cck=0x1d +pacalidx2g=65 +dacrate2g=160 +txalpfbyp2g=1 +bphyscale=17 + +# 5GHz LOFT and IQ CAL +txgaintbl5g=1 +txiqlopapu5g=1 +txiqlopag5g=0x10 +iqlocalidx5g=24 + +# 5GHz Noise CAL parameter +noise_cal_po_5g=5 +noise_cal_enable_5g=0 + +# 2GHz RxPER at low rates +noise_cal_ref_2g=56 +noise_cal_po_bias_2g=-4 +noise_cal_enable_2g=1 + +# Max input level on a-band +triso5g=9 + +# Tx power control, especially temp. +tssitime=1 + +#fc+1.7GHz Spur Elimination +loidacmode5g=1 + +swctrlmap_2g=0x84048404, 0x82028202, 0x84048404, 0x010202, 0x1ff +swctrlmap_5g=0xC040C040, 0xB030A020, 0xA020C040, 0x010A02, 0x2F8 + diff --git a/configs/egl.cfg b/configs/egl.cfg new file mode 100644 index 0000000..4515dfd --- /dev/null +++ b/configs/egl.cfg @@ -0,0 +1 @@ +0 1 mali diff --git a/configs/gps.conf b/configs/gps.conf new file mode 100644 index 0000000..b766326 --- /dev/null +++ b/configs/gps.conf @@ -0,0 +1,6 @@ +NTP_SERVER=north-america.pool.ntp.org +XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin +XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin +XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin +SUPL_HOST=supl.google.com +SUPL_PORT=7276 diff --git a/configs/media_codecs.xml b/configs/media_codecs.xml new file mode 100644 index 0000000..c8719db --- /dev/null +++ b/configs/media_codecs.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright (C) 2012 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- +<!DOCTYPE MediaCodecs [ +<!ELEMENT MediaCodecs (Decoders,Encoders)> +<!ELEMENT Decoders (MediaCodec*)> +<!ELEMENT Encoders (MediaCodec*)> +<!ELEMENT MediaCodec (Type*,Quirk*)> +<!ATTLIST MediaCodec name CDATA #REQUIRED> +<!ATTLIST MediaCodec type CDATA> +<!ELEMENT Type EMPTY> +<!ATTLIST Type name CDATA #REQUIRED> +<!ELEMENT Quirk EMPTY> +<!ATTLIST Quirk name CDATA #REQUIRED> +]> + +There's a simple and a complex syntax to declare the availability of a +media codec: + +A codec that properly follows the OpenMax spec and therefore doesn't have any +quirks and that only supports a single content type can be declared like so: + + <MediaCodec name="OMX.foo.bar" type="something/interesting" /> + +If a codec has quirks OR supports multiple content types, the following syntax +can be used: + + <MediaCodec name="OMX.foo.bar" > + <Type name="something/interesting" /> + <Type name="something/else" /> + ... + <Quirk name="requires-allocate-on-input-ports" /> + <Quirk name="requires-allocate-on-output-ports" /> + <Quirk name="output-buffers-are-unreadable" /> + </MediaCodec> + +Only the three quirks included above are recognized at this point: + +"requires-allocate-on-input-ports" + must be advertised if the component does not properly support specification + of input buffers using the OMX_UseBuffer(...) API but instead requires + OMX_AllocateBuffer to be used. + +"requires-allocate-on-output-ports" + must be advertised if the component does not properly support specification + of output buffers using the OMX_UseBuffer(...) API but instead requires + OMX_AllocateBuffer to be used. + +"output-buffers-are-unreadable" + must be advertised if the emitted output buffers of a decoder component + are not readable, i.e. use a custom format even though abusing one of + the official OMX colorspace constants. + Clients of such decoders will not be able to access the decoded data, + naturally making the component much less useful. The only use for + a component with this quirk is to render the output to the screen. + Audio decoders MUST NOT advertise this quirk. + Video decoders that advertise this quirk must be accompanied by a + corresponding color space converter for thumbnail extraction, + matching surfaceflinger support that can render the custom format to + a texture and possibly other code, so just DON'T USE THIS QUIRK. + +--> + +<MediaCodecs> + <Decoders> + <MediaCodec name="OMX.SEC.AVC.Decoder" type="video/avc" /> + <MediaCodec name="OMX.SEC.MPEG4.Decoder" type="video/mp4v-es" /> + <MediaCodec name="OMX.SEC.H263.Decoder" type="video/3gpp" /> + <MediaCodec name="OMX.SEC.AVC.Decoder" type="video/avc" /> + <MediaCodec name="OMX.SEC.VP8.Decoder" type="video/x-vnd.on2.vp8" /> + + <MediaCodec name="OMX.google.mp3.decoder" type="audio/mpeg" /> + <MediaCodec name="OMX.google.amrnb.decoder" type="audio/3gpp" /> + <MediaCodec name="OMX.google.amrwb.decoder" type="audio/amr-wb" /> + <MediaCodec name="OMX.google.aac.decoder" type="audio/mp4a-latm" /> + <MediaCodec name="OMX.google.g711.alaw.decoder" type="audio/g711-alaw" /> + <MediaCodec name="OMX.google.g711.mlaw.decoder" type="audio/g711-mlaw" /> + <MediaCodec name="OMX.google.vorbis.decoder" type="audio/vorbis" /> + <MediaCodec name="OMX.google.mpeg4.decoder" type="video/mp4v-es" /> + <MediaCodec name="OMX.google.h263.decoder" type="video/3gpp" /> + <MediaCodec name="OMX.google.h264.decoder" type="video/avc" /> + <MediaCodec name="OMX.google.vpx.decoder" type="video/x-vnd.on2.vp8" /> + </Decoders> + + <Encoders> + <MediaCodec name="OMX.SEC.MPEG4.Encoder" type="video/mp4v-es" /> + <MediaCodec name="OMX.SEC.H263.Encoder" type="video/3gpp" /> + <MediaCodec name="OMX.SEC.AVC.Encoder" type="video/avc" /> + + <MediaCodec name="OMX.google.amrnb.encoder" type="audio/3gpp" /> + <MediaCodec name="OMX.google.amrwb.encoder" type="audio/amr-wb" /> + <MediaCodec name="OMX.google.aac.encoder" type="audio/mp4a-latm" /> + <MediaCodec name="OMX.google.flac.encoder" type="audio/flac" /> + </Encoders> +</MediaCodecs> diff --git a/configs/media_profiles.xml b/configs/media_profiles.xml new file mode 100644 index 0000000..b8073cf --- /dev/null +++ b/configs/media_profiles.xml @@ -0,0 +1,497 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> +<!DOCTYPE MediaSettings [ + <!ELEMENT MediaSettings (CamcorderProfiles, + EncoderOutputFileFormat+, + VideoEncoderCap+, + AudioEncoderCap+, + VideoDecoderCap, + AudioDecoderCap)> + <!ELEMENT CamcorderProfiles (EncoderProfile+, ImageEncoding+, ImageDecoding, Camera)> + <!ELEMENT EncoderProfile (Video, Audio)> + <!ATTLIST EncoderProfile quality (timelapse1080p|timelapse720p|timelapse480p|timelapsehigh|timelapselow|480p|qcif|high|low) #REQUIRED> + <!ATTLIST EncoderProfile fileFormat (mp4|3gp) #REQUIRED> + <!ATTLIST EncoderProfile duration (30|60) #REQUIRED> + <!ATTLIST EncoderProfile cameraId (0|1) #REQUIRED> + <!ELEMENT Video EMPTY> + <!ATTLIST Video codec (h264|h263|m4v) #REQUIRED> + <!ATTLIST Video bitRate CDATA #REQUIRED> + <!ATTLIST Video width CDATA #REQUIRED> + <!ATTLIST Video height CDATA #REQUIRED> + <!ATTLIST Video frameRate CDATA #REQUIRED> + <!ELEMENT Audio EMPTY> + <!ATTLIST Audio codec (amrnb|amrwb|aac) #REQUIRED> + <!ATTLIST Audio bitRate CDATA #REQUIRED> + <!ATTLIST Audio sampleRate CDATA #REQUIRED> + <!ATTLIST Audio channels (1|2) #REQUIRED> + <!ELEMENT ImageEncoding EMPTY> + <!ATTLIST ImageEncoding quality (90|80|70|60|50|40) #REQUIRED> + <!ELEMENT ImageDecoding EMPTY> + <!ATTLIST ImageDecoding memCap CDATA #REQUIRED> + <!ELEMENT Camera EMPTY> + <!ATTLIST Camera previewFrameRate CDATA #REQUIRED> + <!ELEMENT EncoderOutputFileFormat EMPTY> + <!ATTLIST EncoderOutputFileFormat name (mp4|3gp) #REQUIRED> + <!ELEMENT VideoEncoderCap EMPTY> + <!ATTLIST VideoEncoderCap name (h264|h263|m4v|wmv) #REQUIRED> + <!ATTLIST VideoEncoderCap enabled (true|false) #REQUIRED> + <!ATTLIST VideoEncoderCap minBitRate CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap maxBitRate CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap minFrameWidth CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap maxFrameWidth CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap minFrameHeight CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap maxFrameHeight CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap minFrameRate CDATA #REQUIRED> + <!ATTLIST VideoEncoderCap maxFrameRate CDATA #REQUIRED> + <!ELEMENT AudioEncoderCap EMPTY> + <!ATTLIST AudioEncoderCap name (amrnb|amrwb|aac|wma) #REQUIRED> + <!ATTLIST AudioEncoderCap enabled (true|false) #REQUIRED> + <!ATTLIST AudioEncoderCap minBitRate CDATA #REQUIRED> + <!ATTLIST AudioEncoderCap maxBitRate CDATA #REQUIRED> + <!ATTLIST AudioEncoderCap minSampleRate CDATA #REQUIRED> + <!ATTLIST AudioEncoderCap maxSampleRate CDATA #REQUIRED> + <!ATTLIST AudioEncoderCap minChannels (1|2) #REQUIRED> + <!ATTLIST AudioEncoderCap maxChannels (1|2) #REQUIRED> + <!ELEMENT VideoDecoderCap EMPTY> + <!ATTLIST VideoDecoderCap name (wmv) #REQUIRED> + <!ATTLIST VideoDecoderCap enabled (true|false) #REQUIRED> + <!ELEMENT AudioDecoderCap EMPTY> + <!ATTLIST AudioDecoderCap name (wma) #REQUIRED> + <!ATTLIST AudioDecoderCap enabled (true|false) #REQUIRED> + <!ELEMENT VideoEditorCap EMPTY> + <!ATTLIST VideoEditorCap maxInputFrameWidth CDATA #REQUIRED> + <!ATTLIST VideoEditorCap maxInputFrameHeight CDATA #REQUIRED> + <!ATTLIST VideoEditorCap maxOutputFrameWidth CDATA #REQUIRED> + <!ATTLIST VideoEditorCap maxOutputFrameHeight CDATA #REQUIRED> + <!ATTLIST VideoEditorCap maxPrefetchYUVFrames CDATA #REQUIRED> + <!ELEMENT ExportVideoProfile EMPTY> + <!ATTLIST ExportVideoProfile name (h264|h263|m4v) #REQUIRED> + <!ATTLIST ExportVideoProfile profile CDATA #REQUIRED> + <!ATTLIST ExportVideoProfile level CDATA #REQUIRED> +]> +<!-- + This file is used to declare the multimedia profiles and capabilities + on an android-powered device. +--> +<MediaSettings> + <!-- Each camcorder profile defines a set of predefined configuration parameters --> + <!-- Back Camera --> + <CamcorderProfiles cameraId="0"> + + <EncoderProfile quality="low" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="high" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="17000000" + width="1920" + height="1080" + frameRate="30" /> + + <Audio codec="aac" + bitRate="128000" + sampleRate="48000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="qcif" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="480p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="720p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="16000000" + width="1280" + height="720" + frameRate="30" /> + + <Audio codec="aac" + bitRate="128000" + sampleRate="48000" + channels="2" /> + </EncoderProfile> + + <EncoderProfile quality="1080p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="20000000" + width="1920" + height="1080" + frameRate="30" /> + + <Audio codec="aac" + bitRate="128000" + sampleRate="48000" + channels="2" /> + </EncoderProfile> + + <EncoderProfile quality="timelapselow" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapsehigh" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="17000000" + width="1920" + height="1080" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapseqcif" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapse480p" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapse720p" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="12000000" + width="1280" + height="720" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapse1080p" fileFormat="3gp" duration="30"> + <Video codec="h264" + bitRate="17000000" + width="1920" + height="1080" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <ImageEncoding quality="90" /> + <ImageEncoding quality="80" /> + <ImageEncoding quality="70" /> + <ImageDecoding memCap="20000000" /> + + </CamcorderProfiles> + + <!-- Front Camera --> + <CamcorderProfiles cameraId="1"> + + <EncoderProfile quality="low" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="high" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="qcif" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="480p" fileFormat="mp4" duration="15"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapselow" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapsehigh" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapseqcif" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="384000" + width="176" + height="144" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="amrnb" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <EncoderProfile quality="timelapse480p" fileFormat="3gp" duration="15"> + <Video codec="h264" + bitRate="3078000" + width="640" + height="480" + frameRate="30" /> + + <!-- + The Audio part of the profile will not be used since time lapse mode + does not capture audio + --> + <Audio codec="aac" + bitRate="96000" + sampleRate="16000" + channels="1" /> + </EncoderProfile> + + <ImageEncoding quality="90" /> + <ImageEncoding quality="80" /> + <ImageEncoding quality="70" /> + <ImageDecoding memCap="20000000" /> + + </CamcorderProfiles> + + <EncoderOutputFileFormat name="3gp" /> + <EncoderOutputFileFormat name="mp4" /> + + <!-- + If a codec is not enabled, it is invisible to the applications + In other words, the applications won't be able to use the codec + or query the capabilities of the codec at all if it is disabled + --> + <VideoEncoderCap name="h264" enabled="true" + minBitRate="64000" maxBitRate="20000000" + minFrameWidth="176" maxFrameWidth="1920" + minFrameHeight="144" maxFrameHeight="1080" + minFrameRate="1" maxFrameRate="30" /> + + <VideoEncoderCap name="h263" enabled="true" + minBitRate="64000" maxBitRate="1000000" + minFrameWidth="176" maxFrameWidth="800" + minFrameHeight="144" maxFrameHeight="480" + minFrameRate="1" maxFrameRate="30" /> + + <VideoEncoderCap name="m4v" enabled="true" + minBitRate="64000" maxBitRate="20000000" + minFrameWidth="176" maxFrameWidth="1920" + minFrameHeight="144" maxFrameHeight="1080" + minFrameRate="1" maxFrameRate="30" /> + + <AudioEncoderCap name="aac" enabled="true" + minBitRate="8192" maxBitRate="196000" + minSampleRate="8000" maxSampleRate="48000" + minChannels="1" maxChannels="2" /> + + <AudioEncoderCap name="amrwb" enabled="true" + minBitRate="6600" maxBitRate="23050" + minSampleRate="16000" maxSampleRate="16000" + minChannels="1" maxChannels="1" /> + + <AudioEncoderCap name="amrnb" enabled="true" + minBitRate="5525" maxBitRate="12200" + minSampleRate="8000" maxSampleRate="8000" + minChannels="1" maxChannels="1" /> + + <!-- + FIXME: + We do not check decoder capabilities at present + At present, we only check whether windows media is visible + for TEST applications. For other applications, we do + not perform any checks at all. + --> + <VideoDecoderCap name="wmv" enabled="false"/> + <AudioDecoderCap name="wma" enabled="false"/> + + <!-- + The VideoEditor Capability configuration: + - maxInputFrameWidth: maximum video width of imported video clip. + - maxInputFrameHeight: maximum video height of imported video clip. + - maxOutputFrameWidth: maximum video width of exported video clip. + - maxOutputFrameHeight: maximum video height of exported video clip. + - maxPrefetchYUVFrames: maximum prefetch YUV frames for encoder, + used to limit the amount of memory for prefetched YUV frames. + For this platform, it allows maximum ~1MB(~0.1MB per QVGA frame x 10 + frames) memory. + --> + + <VideoEditorCap maxInputFrameWidth="1280" + maxInputFrameHeight="720" maxOutputFrameWidth="1280" + maxOutputFrameHeight="720" maxPrefetchYUVFrames="5"/> + <!-- + The VideoEditor Export codec profile and level values + correspond to the values in OMX_Video.h. + E.g. for h264, profile value 1 means OMX_VIDEO_AVCProfileBaseline + and level 256 means OMX_VIDEO_AVCLevel3. + Please note that the values are in decimal. + These values are for video encoder. + --> + <!-- + Codec = h.264, Baseline profile, level 3.1 + --> + <ExportVideoProfile name="h264" profile= "1" level="512"/> + <!-- + Codec = h.263, Baseline profile, level 0 + --> + <ExportVideoProfile name="h263" profile= "1" level="1"/> + <!-- + Codec = mpeg4, Simple profile, level 3 + --> + <ExportVideoProfile name="m4v" profile= "1" level="16"/> +</MediaSettings> diff --git a/configs/sirfgps.conf b/configs/sirfgps.conf new file mode 100644 index 0000000..d3d3c5a --- /dev/null +++ b/configs/sirfgps.conf @@ -0,0 +1,38 @@ +#CSR SiRF plc +#PROJECT_NAME : white Space is not allowed +#UART_DRIVER : Uart Driver Path +#RESET_GPIO : Reset GPIO Driver Path +#ONOFF_GPIO : OnOff GPIO Driver Path +#EXTERNAL_LNA : 1 - use External LNA, 0 - use Internal LNA only +#REF_CLOCK_26MHZ: 1 - use 26MHz TCXO, 0 - use 16.369MHz TCXO +#UART_BAUD_RATE : 0 - 115200bps 1 - 230400, 2 - 460800, 3 - 57600 +#FREQUENCY_AIDING : 0 - Disable, 1 - Enable +#SENSOR_AIDING : 0 - Disable, 1 - Enable +#SET_ID_IMSI : 1 - Use IMSI for SET ID, 0 - Use MSISDN for SET ID, especially for Japan Network Operators +#DEBUGGING_FILES : 0 - no log file, 1 - log files enabled +#SSL_ENABLED : 0 - SSL Disabled, 1 - SSL Enabled +#CERTI_VERSION : 0 - TLSv1 , 1 - SSLv3 , 2 - SSLv23 +#CP_RESPONSETIME : 0 - no priority, 1 - resposne priority time, 2 - resposne priority position ,3 - resposne priority use entire response time +#REAIDING=20 +#CONTROL_PLANE : 1 - CP Enabled, 0 - CP Disabled, for MP3 player or PND +#ATT_NETWORK_OPERATOR : 1 - for AT&T, 0 - for other network operator +PROJECT=SAMSUNG_S5PC210 +UART_DRIVER=/dev/ttySAC1 +RESET_GPIO=/sys/devices/virtual/sec/gps/GPS_nRST/value +ONOFF_GPIO=/sys/devices/virtual/sec/gps/GPS_PWR_EN/value +EXTERNAL_LNA=0 +REF_CLOCK_26MHZ=1 +UART_BAUD_RATE=2 +FREQUENCY_AIDING=1 +SENSOR_AIDING=1 +SET_ID_IMSI=1 +DEBUGGING_FILES=0 +SSL_ENABLED=0 +CERTI_VERSION=0 +CP_RESPONSETIME=2 +CONTROL_PLANE=1 +ATT_NETWORK_OPERATOR=0 +ICS_NETWORK_OPERATOR=1 +SGEE=0 +EMC_ENABLE=1 +LOG_PATH=/data diff --git a/configs/spn-conf.xml b/configs/spn-conf.xml new file mode 100644 index 0000000..191bc05 --- /dev/null +++ b/configs/spn-conf.xml @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2006, Google Inc. +** +** 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. +*/ +--> + +<!-- +spnOverride attributes: + numeric: MCC+MNC from IMSI - this attribute is used as the key + imsi_subset: this attribute is used as a imsi filter (imsi format is: [MCC][MNC][imsi_subset][rest of imsi]) - the longest matching imsi_subset is a best match + spn: spn to show instead of EFSPN. locales can be specified here too, if needed + spn_display_rule: SPN_RULE_SHOW_SPN, SPN_RULE_SHOW_PLMN or both + fake_home_on: regard specified PLMN as home + fake_roaming_on: regard specified PLMN as roaming (comma-separated list) + +examples: + <spnOverride + numeric="45001" spn="ko_KR;?œêµ??SPN,en;English SPN,fr;Français SPN,pl;Polski SPN,Default SPN" + spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="45001" fake_home_on="00101,45008"/> + <spnOverride numeric="46001" spn="zh_CN;ä¸?›½?”é€? /> +--> +<spnOverrides> + +<!-- Spain --> + <spnOverride numeric="21404" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="214"/> + <spnOverride numeric="21406" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="214"/> + <spnOverride numeric="21408" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="214"/> + <spnOverride numeric="21416" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="214"/> + <spnOverride numeric="21419" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="214"/> + <spnOverride numeric="214" fake_home_on="21401,21403,21404,21406,21407,21408,21416,21419"/> + +<!-- SENA --> + <spnOverride numeric="24001" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="24005"/> + <spnOverride numeric="24007" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="24005"/> + +<!-- Finland --> + <spnOverride numeric="24421" fake_home_on="24405"/> + +<!-- Japan --> + <spnOverride numeric="44010" spn="NTT DOCOMO"/> + +<!-- Poland --> + <spnOverride numeric="26006" spn_display_rule="SPN_RULE_SHOW_SPN" spn_override_only_on="26001"/> + +<!-- Belgium Telent - Proximus and Mobistar--> + <spnOverride numeric="20605" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="20610"/> + <spnOverride numeric="20601" imsi_subset="889" spn_display_rule="SPN_RULE_SHOW_SPN" fake_roaming_on="20601"/> + +<!-- Netherlands - Telfort and KPN --> + <spnOverride numeric="20412" fake_home_on="20408,20410" /> + +<!-- SpainTelefonica - Tuenti and 21407 --> + <spnOverride numeric="21405" fake_home_on="21407"/> + +<!-- LTN [latin_protocol] --> + <spnOverride numeric="72410" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72410,72411,72406,72423"/> + <spnOverride numeric="72411" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72410,72411,72406,72423"/> + <spnOverride numeric="72406" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72410,72411,72406,72423"/> + <spnOverride numeric="72423" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72410,72411,72406,72423"/> + <spnOverride numeric="72432" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72432,72433,72434"/> + <spnOverride numeric="72433" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72432,72433,72434"/> + <spnOverride numeric="72434" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="72432,72433,72434"/> + <spnOverride numeric="73001" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73001,73010"/> + <spnOverride numeric="73010" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73001,73010"/> + <spnOverride numeric="71201" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="71201,71202"/> + <spnOverride numeric="71202" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="71201,71202"/> + <spnOverride numeric="732103" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="732103,732111"/> + <spnOverride numeric="732111" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="732103,732111"/> + <spnOverride numeric="73401" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73401,73402,73403"/> + <spnOverride numeric="73402" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73401,73402,73403"/> + <spnOverride numeric="73403" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73401,73402,73403"/> + +<spnOverride numeric="338050" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="33805,338050"/> + <spnOverride numeric="33805" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="33805,338050"/> + <spnOverride numeric="73007" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="73002"/> + +<!-- South Africa --> + <spnOverride numeric="65507" imsi_subset="10" spn_display_rule="SPN_RULE_SHOW_SPN" spn="Virgin" spn_override_only_on="655"/> <!-- Virgin is roaming on 'Cell C' network (same mcc-mnc) and this display rule for home country --> + <spnOverride numeric="65507" spn_display_rule="SPN_RULE_SHOW_SPN" spn="Cell C"/> + <spnOverride numeric="65502" spn_display_rule="SPN_RULE_SHOW_SPN" spn="8.ta"/> + +<!-- H3G RM#2022--> + <spnOverride numeric="23420" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23420,23433"/> + +<!-- TDC Sweden --> + <spnOverride numeric="23801" imsi_subset="72" fake_home_on="24005,24007" fake_roaming_on="23801" /> + <spnOverride numeric="24014" imsi_subset="72" fake_home_on="24005,24007" fake_roaming_on="23801" /> + + <spnOverride numeric="24004" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="24008,24024"/> + <spnOverride numeric="24008" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="24004,24024"/> + <spnOverride numeric="24024" spn_display_rule="SPN_RULE_SHOW_SPN" fake_home_on="24004,24008"/> + +<!-- TDC Norway --> + <spnOverride numeric="23801" imsi_subset="71" fake_home_on="24201" fake_roaming_on="23801" /> + <spnOverride numeric="24208" imsi_subset="71" fake_home_on="24201" fake_roaming_on="23801" /> + +<!-- TDC Finland --> + <spnOverride numeric="24412" imsi_subset="2400" fake_home_on="24412" fake_roaming_on="23801" /> + <spnOverride numeric="23801" imsi_subset="7300" fake_home_on="24412" fake_roaming_on="23801" /> + <spnOverride numeric="23211" fake_home_on="23201"/> <!-- bob @ A1 network --> + <spnOverride numeric="23212" fake_home_on="23205"/> <!-- yesss! @ Orange AT --> + <spnOverride numeric="23207" fake_home_on="23203"/> <!-- tele.ring @ T-Mobile A --> + <spnOverride numeric="23207" fake_home_on="23203"/> <!-- tele.ring @ T-Mobile A --> + <spnOverride numeric="23430,23431,23432" fake_home_on="23433,23434"/> <!-- T-Mobile @ Orange Network --> + <spnOverride numeric="23433,23434" fake_home_on="23430,23431,23432"/> <!-- Orange Network @ T-Mobile --> + +<!-- South Africa --> + <spnOverride numeric="65507" spn_display_rule="SPN_RULE_SHOW_SPN" spn="Cell C"/> + <spnOverride numeric="65502" spn_display_rule="SPN_RULE_SHOW_SPN" spn="8.ta"/> + +<!-- Everything Everywhere --> + <spnOverride numeric="23430" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + <spnOverride numeric="23431" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + <spnOverride numeric="23432" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + <spnOverride numeric="23433" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + <spnOverride numeric="23434" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + <spnOverride numeric="23486" spn_display_rule="SPN_RULE_SHOW_PLMN" spn_override_only_on="23430,23431,23432,23433,23434,23486"/> + +</spnOverrides>
\ No newline at end of file diff --git a/configs/vold.fstab b/configs/vold.fstab new file mode 100644 index 0000000..bc12264 --- /dev/null +++ b/configs/vold.fstab @@ -0,0 +1,22 @@ +## Vold 2.0 Generic fstab +## - San Mehat (san@android.com) +## + +####################### +## Regular device mount +## +## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...> +## label - Label for the volume +## mount_point - Where the volume will be mounted +## part - Partition # (1 based), or 'auto' for first usable partition. +## <sysfs_path> - List of sysfs paths to source devices +###################### + +# internal sdcard +dev_mount sdcard0 /storage/sdcard0 11 /devices/platform/dw_mmc/mmc_host/mmc0/mmc0 nonremovable,encryptable + +# external sdcard +dev_mount sdcard1 /storage/sdcard1 auto /devices/platform/s3c-sdhci.2/mmc_host/mmc1 + +# USB storage device +dev_mount usbdisk0 /storage/usbdisk0 auto /devices/platform/s3c_otghcd/usb diff --git a/configs/wpa_supplicant.conf b/configs/wpa_supplicant.conf new file mode 100644 index 0000000..314897f --- /dev/null +++ b/configs/wpa_supplicant.conf @@ -0,0 +1,9 @@ +update_config=1 +ctrl_interface=wlan0 +eapol_version=1 +ap_scan=1 +fast_reauth=1 +p2p_listen_reg_class=81 +p2p_listen_channel=1 +p2p_oper_reg_class=115 +p2p_oper_channel=48 diff --git a/gpswrapper/Android.mk b/gpswrapper/Android.mk new file mode 100755 index 0000000..a9d1ef5 --- /dev/null +++ b/gpswrapper/Android.mk @@ -0,0 +1,21 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_MODULE := gps.$(TARGET_BOARD_PLATFORM) + +LOCAL_SHARED_LIBRARIES:= \ + liblog \ + libdl + +LOCAL_SRC_FILES += \ + gps.c + +LOCAL_CFLAGS += \ + -fno-short-enums + +LOCAL_PRELINK_MODULE := false +LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw + +include $(BUILD_SHARED_LIBRARY) diff --git a/gpswrapper/MODULE_LICENSE_APACHE2 b/gpswrapper/MODULE_LICENSE_APACHE2 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/gpswrapper/MODULE_LICENSE_APACHE2 diff --git a/gpswrapper/gps.c b/gpswrapper/gps.c new file mode 100644 index 0000000..de2546d --- /dev/null +++ b/gpswrapper/gps.c @@ -0,0 +1,203 @@ +/****************************************************************************** + * GPS HAL wrapper + * wrapps around Samsung GPS Libary and replaces a faulty pointer to + * a faulty function from Samsung that will cause the system_server + * to crash. + * + * Copyright 2010 - Kolja Dummann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +#include <hardware/hardware.h> +#include <hardware/gps.h> +#include <errno.h> +#include <dlfcn.h> + +//#define ALOG_NDEBUG 0 + +#include <stdlib.h> +#define ALOG_TAG "gps-wrapper" +#include <utils/Log.h> + +#define ORIGINAL_HAL_PATH "/system/lib/hw/vendor-gps.exynos4.so" + +static const AGpsRilInterface* oldAGPSRIL = NULL; +static AGpsRilInterface newAGPSRIL; + +static const GpsInterface* originalGpsInterface = NULL; +static GpsInterface newGpsInterface; + +/** + * Load the file defined by the variant and if successful + * return the dlopen handle and the hmi. + * @return 0 = success, !0 = failure. + */ +static int load(const char *id, + const char *path, + const struct hw_module_t **pHmi) +{ + int status; + void *handle; + struct hw_module_t *hmi; + + /* + * load the symbols resolving undefined symbols before + * dlopen returns. Since RTLD_GLOBAL is not or'd in with + * RTLD_NOW the external symbols will not be global + */ + handle = dlopen(path, RTLD_NOW); + if (handle == NULL) { + char const *err_str = dlerror(); + ALOGE("load: module=%s\n%s", path, err_str?err_str:"unknown"); + status = -EINVAL; + goto done; + } + + /* Get the address of the struct hal_module_info. */ + const char *sym = HAL_MODULE_INFO_SYM_AS_STR; + hmi = (struct hw_module_t *)dlsym(handle, sym); + if (hmi == NULL) { + ALOGE("load: couldn't find symbol %s", sym); + status = -EINVAL; + goto done; + } + + /* Check that the id matches */ + if (strcmp(id, hmi->id) != 0) { + ALOGE("load: id=%s != hmi->id=%s", id, hmi->id); + status = -EINVAL; + goto done; + } + + hmi->dso = handle; + + /* success */ + status = 0; + + done: + if (status != 0) { + hmi = NULL; + if (handle != NULL) { + dlclose(handle); + handle = NULL; + } + } else { + ALOGV("loaded HAL id=%s path=%s hmi=%p handle=%p", + id, path, *pHmi, handle); + } + + *pHmi = hmi; + + return status; +} + +static void update_network_state_wrapper(int connected, int type, int roaming, const char* extra_info) +{ + ALOGI("%s was called and saved your from a faulty implementation ;-)", __func__); +} + +static const void* wrapper_get_extension(const char* name) +{ + ALOGV("%s was called", __func__); + + if (!strcmp(name, AGPS_RIL_INTERFACE) && (oldAGPSRIL = originalGpsInterface->get_extension(name))) + { + ALOGV("%s AGPS_RIL_INTERFACE extension requested", __func__); + /* use a wrapper to avoid calling samsungs faulty implemetation */ + newAGPSRIL.size = sizeof(AGpsRilInterface); + newAGPSRIL.init = oldAGPSRIL->init; + newAGPSRIL.set_ref_location = oldAGPSRIL->set_ref_location; + newAGPSRIL.set_set_id = oldAGPSRIL->set_set_id; + newAGPSRIL.ni_message = oldAGPSRIL->ni_message; + ALOGV("%s setting update_network_state_wrapper", __func__); + newAGPSRIL.update_network_state = update_network_state_wrapper; + return &newAGPSRIL; + } + return originalGpsInterface->get_extension(name); +} + +/* HAL Methods */ +const GpsInterface* gps_get_gps_interface(struct gps_device_t* dev) +{ + hw_module_t* module; + int err; + + ALOGV("%s was called", __func__); + + err = load(GPS_HARDWARE_MODULE_ID, ORIGINAL_HAL_PATH, (hw_module_t const**)&module); + + if (err == 0) { + ALOGV("%s vendor lib loaded", __func__); + hw_device_t* device; + struct gps_device_t *gps_device; + err = module->methods->open(module, GPS_HARDWARE_MODULE_ID, &device); + if (err == 0) { + ALOGV("%s got gps device", __func__); + gps_device = (struct gps_device_t *)device; + originalGpsInterface = gps_device->get_gps_interface(gps_device); + ALOGV("%s device set", __func__); + } + } + + if(originalGpsInterface) + { + ALOGV("%s exposing callbacks", __func__); + newGpsInterface.size = sizeof(GpsInterface); + newGpsInterface.init = originalGpsInterface->init; + newGpsInterface.start = originalGpsInterface->start; + newGpsInterface.stop = originalGpsInterface->stop; + newGpsInterface.cleanup = originalGpsInterface->cleanup; + newGpsInterface.inject_time = originalGpsInterface->inject_time; + newGpsInterface.inject_location = originalGpsInterface->inject_location; + newGpsInterface.delete_aiding_data = originalGpsInterface->delete_aiding_data; + newGpsInterface.set_position_mode = originalGpsInterface->set_position_mode; + ALOGV("%s setting extension wrapper", __func__); + newGpsInterface.get_extension = wrapper_get_extension; + + } + ALOGV("%s done", __func__); + return &newGpsInterface; +} + +static int open_gps(const struct hw_module_t* module, char const* name, + struct hw_device_t** device) +{ + struct gps_device_t *dev = malloc(sizeof(struct gps_device_t)); + memset(dev, 0, sizeof(*dev)); + + ALOGV("%s was called", __func__); + + dev->common.tag = HARDWARE_DEVICE_TAG; + dev->common.version = 0; + dev->common.module = (struct hw_module_t*)module; + dev->get_gps_interface = gps_get_gps_interface; + + *device = (struct hw_device_t*)dev; + return 0; +} + +static struct hw_module_methods_t gps_module_methods = { + .open = open_gps +}; + +const struct hw_module_t HAL_MODULE_INFO_SYM = { + .tag = HARDWARE_MODULE_TAG, + .version_major = 1, + .version_minor = 0, + .id = GPS_HARDWARE_MODULE_ID, + .name = "GPS HAL Wrapper Module", + .author = "Kolja Dummann", + .methods = &gps_module_methods, +}; diff --git a/init.smdk4210.rc b/init.smdk4210.rc new file mode 100644 index 0000000..e4107cd --- /dev/null +++ b/init.smdk4210.rc @@ -0,0 +1,415 @@ +import init.smdk4210.usb.rc + +on early-init + export EXTERNAL_STORAGE /storage/sdcard0 + export SECONDARY_STORAGE /storage/sdcard1 + mkdir /storage 0775 system system + mkdir /storage/sdcard0 0775 system system + mkdir /storage/sdcard1 0775 system system + mkdir /storage/usbdisk0 0775 system system + mkdir /efs 0771 radio system + mkdir /preload 0771 system system + mkdir /mnt/.lfs 0755 root root + + # for backwards compatibility + symlink /storage/sdcard0 /sdcard + symlink /storage/sdcard0 /mnt/sdcard + symlink /storage/sdcard1 /extSdCard + symlink /storage/sdcard1 /mnt/extSdCard + symlink /storage/usbdisk0 /usbdisk0 + symlink /storage/usbdisk0 /mnt/usbdisk0 + +# Disable CFQ slice idle delay + write /sys/block/mmcblk0/queue/iosched/slice_idle 0 + +# FIXME: permissions for tvout + chmod 0777 /dev/graphics/fb0 + chmod 0777 /dev/graphics/fb10 + chmod 0777 /dev/graphics/fb11 + chown media graphics /sys/class/switch/hdmi + chmod 0777 /sys/class/switch/hdmi + +# FIXME: permission for HDMI audio path + chown media audio /sys/class/hdmi_audio/hdmi_audio/hdmi_audio_set_ext + chmod 0777 /sys/class/hdmi_audio/hdmi_audio/hdmi_audio_set_ext + +on fs +# mount ext4 partitions + mount ext4 /dev/block/mmcblk0p9 /system noatime wait ro + mount ext4 /dev/block/mmcblk0p7 /cache nosuid nodev noatime wait + mount ext4 /dev/block/mmcblk0p10 /data nosuid nodev noatime wait noauto_da_alloc + mount ext4 /dev/block/mmcblk0p12 /preload nosuid nodev noatime wait + + mount ext4 /dev/block/mmcblk0p1 /efs nosuid nodev noatime wait + mkdir /efs/bluetooth + mkdir /efs/wifi + chown radio system /efs/bluetooth + chown radio system /efs/wifi + chmod 0775 /efs/bluetooth + chmod 0775 /efs/wifi + + mkdir /data/misc/vpn/profiles 0770 system system + mkdir /data/misc/radio 0775 radio system + chmod 0770 /data/misc/wifi + +on post-fs-data +# insmod kernel modules + insmod /system/lib/modules/j4fs.ko + insmod /system/lib/modules/Si4709_driver.ko + +# mount param.lfs + mount j4fs /dev/block/mmcblk0p4 /mnt/.lfs + +# MDNS + socket mdns stream 0660 root system + +# GPS + chown root system /dev/ttySAC1 + chmod 0660 /dev/ttySAC1 + chown root system /sys/class/sec/gps/GPS_PWR_EN/value + chmod 0664 /sys/class/sec/gps/GPS_PWR_EN/value + chown root system /sys/class/sec/gps/GPS_nRST/value + chmod 0664 /sys/class/sec/gps/GPS_nRST/value + mkdir /data/gps 771 system system + chown system system /data/gps + + # give system access to wpa_supplicant.conf for backup and restore + mkdir /data/misc/wifi 0770 wifi wifi + chmod 0770 /data/misc/wifi + chmod 0660 /data/misc/wifi/wpa_supplicant.conf + mkdir /data/misc/wifi/sockets 0770 wifi wifi + mkdir /data/misc/dhcp 0770 dhcp dhcp + chown dhcp dhcp /data/misc/dhcp + +#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 + + # DivX DRM + mkdir /efs/.files 0775 + mkdir /efs/.files/.dx1 0775 + mkdir /efs/.files/.dm33 0775 + mkdir /efs/.files/.mp301 0775 + chown media system /efs/.files/.dx1 + chown media system /efs/.files/.dm33 + chown media system /efs/.files/.mp301 + chmod 0775 /efs/.files/.dx1 + chmod 0775 /efs/.files/.dm33 + chmod 0775 /efs/.files/.mp301 + +# MTP Device permission. + chmod 0660 /dev/usb_mtp_gadget + chown system system /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 + +# NFC + setprop ro.nfc.port "I2C" + chmod 0600 /dev/pn544 + chown nfc nfc /dev/pn544 + +# setup for alsa snd device + chmod 0770 /dev/snd/pcmC0D0c + chmod 0770 /dev/snd/pcmC0D0p + chmod 0770 /dev/snd/controlC0 + chmod 0770 /dev/snd/timer + chmod 0770 /dev/snd/hwC0D0 + + # create log system + mkdir /data/log 0775 system log + chown system log /data/log + + chmod 0775 /data/log + chmod 0775 /data/anr + + chmod 0662 /dev/log/radio + chmod 0662 /dev/log/main + chmod 0662 /dev/log/event + +#panorama directory creation + mkdir /data/pxtmpdir 0775 + chown system system /data/pxtmpdir + chmod 0775 /data/pxtmpdir + + # permission for HDMI audio path + chown media audio /sys/class/hdmi_audio/hdmi_audio/hdmi_audio_set_ext + +# Permissions for gpio_keys. + chown system radio /sys/class/sec/sec_key/wakeup_keys + write /sys/class/sec/sec_key/wakeup_keys 102,116 + +# Add permission for ATM. 2010.03.20 + chown system radio /sys/devices/platform/i2c-gpio.9/i2c-9/9-0036/power_supply/fuelgauge/fg_read_soc + chown system radio /sys/devices/platform/i2c-gpio.9/i2c-9/9-0036/power_supply/fuelgauge/fg_reset_soc + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_lpm_state + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/fg_psoc + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/system_rev + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_current_adc + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_test_value + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_temp_adc_spec + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_temp_check + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_full_check + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_type + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/mp3 + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/video + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_lp_charging + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/charging_source + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_temp_adc_avg + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_temp_adc + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_temp + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_vfocv + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_soc + chown system radio /sys/devices/platform/sec-battery/power_supply/battery/batt_vol + + chown system system /sys/class/backlight/panel/brightness + chown system system /sys/class/power_supply/battery/temp + +# Permissions for input devices + chown system radio /sys/devices/virtual/sec/sec_key/sec_key_pressed + + chown system radio /sys/devices/virtual/sec/sec_touchkey/force_disable + chown system radio /sys/devices/virtual/sec/sec_touchkey/recommended_version + chown system radio /sys/devices/virtual/sec/sec_touchkey/touch_sensitivity + chown system radio /sys/devices/virtual/sec/sec_touchkey/brightness + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_brightness + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_back + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_menu + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_firm_version_panel + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_firm_version_phone + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_firm_update_status + chown system radio /sys/devices/virtual/sec/sec_touchkey/touchkey_firm_update + chown system radio /sys/devices/virtual/sec/sec_touchkey/updated_version + chown system radio /sys/devices/virtual/sec/sec_touchkey/led_timeout + + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_firm_version + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_threshould + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_all_delta + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_all_refer + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_delta4 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_refer4 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_delta3 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_refer3 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_delta2 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_refer2 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_delta1 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_refer1 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_delta0 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_refer0 + chown system radio /sys/devices/virtual/sec/tsp_noise_test/disp_all_deltadata + chown system radio /sys/devices/virtual/sec/tsp_noise_test/disp_all_refdata + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_module_off + chown system radio /sys/devices/virtual/sec/tsp_noise_test/set_module_on + + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_firm_version_panel + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_firm_version_phone + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_firm_update_status + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_firm_update + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_threshold + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_config_version + chown system radio /sys/devices/virtual/sec/sec_touchscreen/tsp_touchtype + +# Permissions for bluetooth + setprop ro.bt.bdaddr_path "/efs/bluetooth/bt_addr" + chown bluetooth bluetooth ro.bt.bdaddr_path + chown bluetooth bluetooth /dev/ttySAC0 + chmod 0600 /dev/ttySAC0 + chmod 0660 /sys/class/rfkill/rfkill0/state + chown bluetooth bluetooth /sys/class/rfkill/rfkill0/state + chown bluetooth bluetooth /sys/class/rfkill/rfkill0/type + +# Vibetonz + chmod 0660 /dev/tspdrv + chown root shell /dev/tspdrv + chmod 0660 /sys/vibrator/pwm_val + chown system system /sys/vibrator/pwm_val + +# Permissions for LCD + chown system radio /sys/class/lcd/panel/lcd_power + chown system radio /sys/class/lcd/panel/lcd_type + chown system media_rw /sys/class/lcd/panel/gamma_mode + chown system media_rw /sys/class/lcd/panel/power_reduce + chown system system /sys/class/backlight/panel/auto_brightness + +# Permissions for mDNIe + chown system media_rw /sys/class/mdnie/mdnie/mode + chown system media_rw /sys/class/mdnie/mdnie/outdoor + chown system media_rw /sys/class/mdnie/mdnie/scenario + chown system media_rw /sys/class/mdnie/mdnie/negative + write /sys/class/mdnie/mdnie/scenario 4 + +# Permissions for uart_sel and usb_sel + chown system radio /sys/class/sec/switch/uart_sel/value + chown system radio /sys/class/sec/switch/usb_sel + chown system radio /sys/class/sec/switch/audio_path + chown system radio /sys/class/sec/switch/otg_test + chown system radio /sys/class/sec/switch/adc_debounce_time + chown system radio /sys/class/sec/switch/status + chown system radio /sys/class/sec/switch/adc + chown system radio /mnt/.lfs/sw_sel + +# Permissions for OTG Test + chown system radio /sys/class/host_notify/usb_otg/booster + chmod 0664 /sys/class/host_notify/usb_otg/booster + +# Permission for radio + chown system radio /sys/devices/platform/s5p-ehci/ehci_power + chown system radio /sys/devices/platform/s5p-ehci/ehci_runtime + chown system radio /sys/devices/virtual/misc/multipdp/waketime + +# 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 + +# DVFS - cpufreq ondemand + write /sys/devices/system/cpu/cpufreq/ondemand/down_differential 5 + write /sys/devices/system/cpu/cpufreq/ondemand/up_threshold 85 + +#panorama directory creation + mkdir /data/pxtmpdir 0775 + chown system system /data/pxtmpdir + chmod 0775 /data/pxtmpdir + +# backlight permissions + chown system system /sys/class/backlight/pwm-backlight/brightness + chmod 0660 /sys/class/backlight/pwm-backlight/brightness + chown radio system /sys/devices/virtual/misc/melfas_touchkey/brightness + chmod 0660 /sys/devices/virtual/misc/melfas_touchkey/brightness + +# Permissions for dvfs lock + chown system system /sys/power/cpufreq_max_limit + chown system system /sys/power/cpufreq_min_limit + chmod 0660 /sys/power/cpufreq_max_limit + chmod 0660 /sys/power/cpufreq_min_limit + + chown system system /sys/power/gpu_lock + chmod 0660 /sys/power/gpu_lock + +# Permisions for sensors + chown radio system /sys/devices/virtual/K3G_GYRO-dev/k3g/gyro_selftest + chown radio system /sys/devices/virtual/K3G_GYRO-dev/k3g/gyro_get_temp + chown radio system /sys/devices/virtual/K3G_GYRO-dev/k3g/gyro_power_on + chown radio system /sys/devices/virtual/accelerometer/accelerometer/acc_file + chown radio system /sys/devices/virtual/sec/gsensorcal/calibration + +# for device encryption + setprop vold.post_fs_data_done 1 + +on boot + mount debugfs /sys/kernel/debug /sys/kernel/debug + + setprop ro.build.product GT-I9100 + setprop ro.product.device GT-I9100 + setprop ro.radio.noril yes + +# permissions for NFC + setprop ro.nfc.port "I2C" + chmod 0600 /dev/pn544 + chown nfc nfc /dev/pn544 + +# Device Encryption by B2B Security Lab. + setprop ro.crypto.keyfile.userdata /efs/metadata + +# fake some battery state + setprop status.battery.state Slow + setprop status.battery.level 5 + setprop status.battery.level_raw 50 + setprop status.battery.level_scale 9 + +service mdnsd /system/bin/mdnsd + class main + user mdnsr + group inet net_raw + socket mdnsd stream 0660 mdnsr inet + disabled + oneshot + +service p2p_supplicant /system/bin/wpa_supplicant \ + -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service wpa_supplicant /system/bin/wpa_supplicant \ + -Dnl80211 -iwlan0 -puse_p2p_group_interface=1 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin + # we will start as root and wpa_supplicant will switch to user wifi + # after setting up the capabilities required for WEXT + # user wifi + # group wifi inet keystore + class main + socket wpa_wlan0 dgram 660 wifi wifi + disabled + oneshot + +service dhcpcd_wlan0 /system/bin/dhcpcd -ABKL + class main + disabled + oneshot + +service dhcpcd_p2p /system/bin/dhcpcd -aABKL + class main + disabled + oneshot + +service iprenew_wlan0 /system/bin/dhcpcd -n + class main + disabled + oneshot + +service iprenew_p2p /system/bin/dhcpcd -n + class main + disabled + oneshot + +# for bluetooth +service hciattach /system/bin/brcm_patchram_plus --enable_hci --enable_lpm --no2bytes --tosleep 50000 \ + --baudrate 3000000 --use_baudrate_for_download --patchram /system/bin/bcm4330B1.hcd \ + --scopcm=0,0,0,0,0,0,0,3,3,0 /dev/ttySAC0 + class main + user bluetooth + group bluetooth net_bt_admin + disabled + oneshot + +# bluetooth mac address +service bdaddr /system/bin/bdaddr_read + class main + user root + disabled + oneshot + +# TVout +service TvoutService_C /system/bin/bintvoutservice + class main + user system + group graphics + +# bugreport is triggered by holding down volume down, volume up and power +service bugreport /system/bin/bugmailer.sh -v + class main + disabled + oneshot + keycodes 114 115 116 diff --git a/init.smdk4210.usb.rc b/init.smdk4210.usb.rc new file mode 100644 index 0000000..7545695 --- /dev/null +++ b/init.smdk4210.usb.rc @@ -0,0 +1,89 @@ +on init + write /sys/class/android_usb/android0/iSerial $ro.serialno + write /sys/class/android_usb/android0/f_rndis/manufacturer Samsung + write /sys/class/android_usb/android0/f_rndis/vendorID 04e8 + write /sys/class/android_usb/android0/f_rndis/wceis 1 + +on boot + write /sys/class/android_usb/android0/iManufacturer $ro.manufacturer + write /sys/class/android_usb/android0/iProduct $ro.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=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/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/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=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/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/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=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 diff --git a/libsensors/AkmSensor.cpp b/libsensors/AkmSensor.cpp new file mode 100644 index 0000000..aca232c --- /dev/null +++ b/libsensors/AkmSensor.cpp @@ -0,0 +1,331 @@ +/* + * 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. + */ + +#include <fcntl.h> +#include <errno.h> +#include <math.h> +#include <poll.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/select.h> +#include <dlfcn.h> + +#include "ak8973b.h" + +#include <cutils/log.h> +#include "AkmSensor.h" + +//#define ALOG_NDEBUG 0 + +/*****************************************************************************/ + +int (*akm_is_sensor_enabled)(uint32_t sensor_type); +int (*akm_enable_sensor)(uint32_t sensor_type); +int (*akm_disable_sensor)(uint32_t sensor_type); +int (*akm_set_delay)(uint32_t sensor_type, uint64_t delay); + +int stub_is_sensor_enabled(uint32_t sensor_type) { + return 0; +} + +int stub_enable_disable_sensor(uint32_t sensor_type) { + return -ENODEV; +} + +int stub_set_delay(uint32_t sensor_type, uint64_t delay) { + return -ENODEV; +} + +AkmSensor::AkmSensor() +: SensorBase(NULL, NULL), + mEnabled(0), + mPendingMask(0), + mInputReader(32) +{ + /* Open the library before opening the input device. The library + * creates a uinput device. + */ + if (loadAKMLibrary() == 0) { + data_name = "compass_sensor"; + data_fd = openInput("compass_sensor"); + } + + memset(mPendingEvents, 0, sizeof(mPendingEvents)); + + mPendingEvents[Accelerometer].version = sizeof(sensors_event_t); + mPendingEvents[Accelerometer].sensor = ID_A; + mPendingEvents[Accelerometer].type = SENSOR_TYPE_ACCELEROMETER; + mPendingEvents[Accelerometer].acceleration.status = SENSOR_STATUS_ACCURACY_HIGH; + + mPendingEvents[MagneticField].version = sizeof(sensors_event_t); + mPendingEvents[MagneticField].sensor = ID_M; + mPendingEvents[MagneticField].type = SENSOR_TYPE_MAGNETIC_FIELD; + mPendingEvents[MagneticField].magnetic.status = SENSOR_STATUS_ACCURACY_HIGH; + + mPendingEvents[Orientation ].version = sizeof(sensors_event_t); + mPendingEvents[Orientation ].sensor = ID_O; + mPendingEvents[Orientation ].type = SENSOR_TYPE_ORIENTATION; + mPendingEvents[Orientation ].orientation.status = SENSOR_STATUS_ACCURACY_HIGH; + + // read the actual value of all sensors if they're enabled already + struct input_absinfo absinfo; + short flags = 0; + + if (akm_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) { + mEnabled |= 1<<Accelerometer; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X), &absinfo)) { + mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) { + mPendingEvents[Accelerometer].acceleration.y = absinfo.value * CONVERT_A_Y; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) { + mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z; + } + } + if (akm_is_sensor_enabled(SENSOR_TYPE_MAGNETIC_FIELD)) { + mEnabled |= 1<<MagneticField; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_MAGV_X), &absinfo)) { + mPendingEvents[MagneticField].magnetic.x = absinfo.value * CONVERT_M_X; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_MAGV_Y), &absinfo)) { + mPendingEvents[MagneticField].magnetic.y = absinfo.value * CONVERT_M_Y; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_MAGV_Z), &absinfo)) { + mPendingEvents[MagneticField].magnetic.z = absinfo.value * CONVERT_M_Z; + } + } + if (akm_is_sensor_enabled(SENSOR_TYPE_ORIENTATION)) { + mEnabled |= 1<<Orientation; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_YAW), &absinfo)) { + mPendingEvents[Orientation].orientation.azimuth = absinfo.value; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_PITCH), &absinfo)) { + mPendingEvents[Orientation].orientation.pitch = absinfo.value; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ROLL), &absinfo)) { + mPendingEvents[Orientation].orientation.roll = -absinfo.value; + } + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ORIENT_STATUS), &absinfo)) { + mPendingEvents[Orientation].orientation.status = uint8_t(absinfo.value & SENSOR_STATE_MASK); + } + } + + // disable temperature sensor, since it is not supported + akm_disable_sensor(SENSOR_TYPE_TEMPERATURE); +} + +AkmSensor::~AkmSensor() +{ + if (mLibAKM) { + unsigned ref = ::dlclose(mLibAKM); + } +} + +int AkmSensor::enable(int32_t handle, int en) +{ + int what = -1; + + switch (handle) { + case ID_A: what = Accelerometer; break; + case ID_M: what = MagneticField; break; + case ID_O: what = Orientation; break; + } + + if (uint32_t(what) >= numSensors) + return -EINVAL; + + int newState = en ? 1 : 0; + int err = 0; + + if ((uint32_t(newState)<<what) != (mEnabled & (1<<what))) { + uint32_t sensor_type; + switch (what) { + case Accelerometer: sensor_type = SENSOR_TYPE_ACCELEROMETER; break; + case MagneticField: sensor_type = SENSOR_TYPE_MAGNETIC_FIELD; break; + case Orientation: sensor_type = SENSOR_TYPE_ORIENTATION; break; + } + short flags = newState; + if (en) + err = akm_enable_sensor(sensor_type); + else + err = akm_disable_sensor(sensor_type); + + ALOGE_IF(err, "Could not change sensor state (%s)", strerror(-err)); + if (!err) { + mEnabled &= ~(1<<what); + mEnabled |= (uint32_t(flags)<<what); + } + } + return err; +} + +int AkmSensor::setDelay(int32_t handle, int64_t ns) +{ + int what = -1; + uint32_t sensor_type = 0; + + if (ns < 0) + return -EINVAL; + + switch (handle) { + case ID_A: sensor_type = SENSOR_TYPE_ACCELEROMETER; break; + case ID_M: sensor_type = SENSOR_TYPE_MAGNETIC_FIELD; break; + case ID_O: sensor_type = SENSOR_TYPE_ORIENTATION; break; + } + + if (sensor_type == 0) + return -EINVAL; + + mDelays[what] = ns; + return update_delay(); +} + +int AkmSensor::update_delay() +{ + if (mEnabled) { + uint64_t wanted = -1LLU; + for (int i=0 ; i<numSensors ; i++) { + if (mEnabled & (1<<i)) { + uint64_t ns = mDelays[i]; + wanted = wanted < ns ? wanted : ns; + } + } + short delay = int64_t(wanted) / 1000000; + if (ioctl(dev_fd, ECS_IOCTL_APP_SET_DELAY, &delay)) { + return -errno; + } + } + return 0; +} + + +int AkmSensor::loadAKMLibrary() +{ + mLibAKM = dlopen("libakm.so", RTLD_NOW); + + if (!mLibAKM) { + akm_is_sensor_enabled = stub_is_sensor_enabled; + akm_enable_sensor = stub_enable_disable_sensor; + akm_disable_sensor = stub_enable_disable_sensor; + akm_set_delay = stub_set_delay; + ALOGE("AkmSensor: unable to load AKM Library, %s", dlerror()); + return -ENOENT; + } + + *(void **)&akm_is_sensor_enabled = dlsym(mLibAKM, "akm_is_sensor_enabled"); + *(void **)&akm_enable_sensor = dlsym(mLibAKM, "akm_enable_sensor"); + *(void **)&akm_disable_sensor = dlsym(mLibAKM, "akm_disable_sensor"); + *(void **)&akm_set_delay = dlsym(mLibAKM, "akm_set_delay"); + + return 0; +} + +int AkmSensor::readEvents(sensors_event_t* data, int count) +{ + if (count < 1) + return -EINVAL; + + ssize_t n = mInputReader.fill(data_fd); + if (n < 0) + return n; + + int numEventReceived = 0; + input_event const* event; + + while (count && mInputReader.readEvent(&event)) { + int type = event->type; + if (type == EV_REL) { + processEvent(event->code, event->value); + mInputReader.next(); + } else if (type == EV_SYN) { + int64_t time = timevalToNano(event->time); + for (int j=0 ; count && mPendingMask && j<numSensors ; j++) { + if (mPendingMask & (1<<j)) { + mPendingMask &= ~(1<<j); + mPendingEvents[j].timestamp = time; + if (mEnabled & (1<<j)) { + *data++ = mPendingEvents[j]; + count--; + numEventReceived++; + } + } + } + if (!mPendingMask) { + mInputReader.next(); + } + } else { + ALOGE("AkmSensor: unknown event (type=%d, code=%d)", + type, event->code); + mInputReader.next(); + } + } + return numEventReceived; +} + +void AkmSensor::processEvent(int code, int value) +{ + switch (code) { + case EVENT_TYPE_ACCEL_X: + mPendingMask |= 1<<Accelerometer; + mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X; + break; + case EVENT_TYPE_ACCEL_Y: + mPendingMask |= 1<<Accelerometer; + mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y; + break; + case EVENT_TYPE_ACCEL_Z: + mPendingMask |= 1<<Accelerometer; + mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z; + break; + + case EVENT_TYPE_MAGV_X: + ALOGV("AkmSensor: EVENT_TYPE_MAGV_X value =%d", value); + mPendingMask |= 1<<MagneticField; + mPendingEvents[MagneticField].magnetic.x = value * CONVERT_M_X; + break; + case EVENT_TYPE_MAGV_Y: + ALOGV("AkmSensor: EVENT_TYPE_MAGV_Y value =%d", value); + mPendingMask |= 1<<MagneticField; + mPendingEvents[MagneticField].magnetic.y = value * CONVERT_M_Y; + break; + case EVENT_TYPE_MAGV_Z: + ALOGV("AkmSensor: EVENT_TYPE_MAGV_Z value =%d", value); + mPendingMask |= 1<<MagneticField; + mPendingEvents[MagneticField].magnetic.z = value * CONVERT_M_Z; + break; + + case EVENT_TYPE_YAW: + mPendingMask |= 1<<Orientation; + mPendingEvents[Orientation].orientation.azimuth = value * CONVERT_O_A; + break; + case EVENT_TYPE_PITCH: + mPendingMask |= 1<<Orientation; + mPendingEvents[Orientation].orientation.pitch = value * CONVERT_O_P; + break; + case EVENT_TYPE_ROLL: + mPendingMask |= 1<<Orientation; + mPendingEvents[Orientation].orientation.roll = value * CONVERT_O_R; + break; + case EVENT_TYPE_ORIENT_STATUS: + uint8_t status = uint8_t(value & SENSOR_STATE_MASK); + if (status == 4) + status = 0; + mPendingMask |= 1<<Orientation; + mPendingEvents[Orientation].orientation.status = status; + break; + } +} diff --git a/libsensors/AkmSensor.h b/libsensors/AkmSensor.h new file mode 100644 index 0000000..c155ec2 --- /dev/null +++ b/libsensors/AkmSensor.h @@ -0,0 +1,64 @@ +/* + * 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_AKM_SENSOR_H +#define ANDROID_AKM_SENSOR_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + + +#include "sensors.h" +#include "SensorBase.h" +#include "InputEventReader.h" + +/*****************************************************************************/ + +struct input_event; + +class AkmSensor : public SensorBase { +public: + AkmSensor(); + virtual ~AkmSensor(); + + enum { + Accelerometer = 0, + MagneticField = 1, + Orientation = 2, + numSensors + }; + + virtual int setDelay(int32_t handle, int64_t ns); + virtual int enable(int32_t handle, int enabled); + virtual int readEvents(sensors_event_t* data, int count); + void processEvent(int code, int value); + +private: + int loadAKMLibrary(); + int update_delay(); + void *mLibAKM; + uint32_t mEnabled; + uint32_t mPendingMask; + InputEventCircularReader mInputReader; + sensors_event_t mPendingEvents[numSensors]; + uint64_t mDelays[numSensors]; +}; + +/*****************************************************************************/ + +#endif // ANDROID_AKM_SENSOR_H diff --git a/libsensors/Android.mk b/libsensors/Android.mk new file mode 100644 index 0000000..f42c057 --- /dev/null +++ b/libsensors/Android.mk @@ -0,0 +1,45 @@ +# 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. + + +LOCAL_PATH := $(call my-dir) + +ifneq ($(TARGET_SIMULATOR),true) + +# HAL module implemenation, not prelinked, and stored in +# hw/<SENSORS_HARDWARE_MODULE_ID>.<ro.product.board>.so +include $(CLEAR_VARS) + +LOCAL_MODULE := sensors.$(TARGET_BOARD_PLATFORM) + +LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw + +LOCAL_MODULE_TAGS := optional + +LOCAL_CFLAGS := -DALOG_TAG=\"Sensors\" +LOCAL_SRC_FILES := \ + sensors.cpp \ + SensorBase.cpp \ + LightSensor.cpp \ + ProximitySensor.cpp \ + AkmSensor.cpp \ + GyroSensor.cpp \ + InputEventReader.cpp + +LOCAL_SHARED_LIBRARIES := liblog libcutils libdl +LOCAL_PRELINK_MODULE := false + +include $(BUILD_SHARED_LIBRARY) + +endif # !TARGET_SIMULATOR diff --git a/libsensors/GyroSensor.cpp b/libsensors/GyroSensor.cpp new file mode 100644 index 0000000..0b0a438 --- /dev/null +++ b/libsensors/GyroSensor.cpp @@ -0,0 +1,185 @@ +/* + * 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. + */ + +#include <fcntl.h> +#include <errno.h> +#include <math.h> +#include <poll.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/select.h> +#include <cutils/log.h> + +#include "GyroSensor.h" + +#define FETCH_FULL_EVENT_BEFORE_RETURN 1 +#define IGNORE_EVENT_TIME 350000000 +/*****************************************************************************/ + +GyroSensor::GyroSensor() + : SensorBase(NULL, "gyro_sensor"), + mEnabled(0), + mInputReader(4), + mHasPendingEvent(false), + mEnabledTime(0) +{ + mPendingEvent.version = sizeof(sensors_event_t); + mPendingEvent.sensor = ID_GY; + mPendingEvent.type = SENSOR_TYPE_GYROSCOPE; + memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data)); + + if (data_fd) { + strcpy(input_sysfs_path, "/sys/class/input/"); + strcat(input_sysfs_path, input_name); + strcat(input_sysfs_path, "/device/"); + input_sysfs_path_len = strlen(input_sysfs_path); + enable(0, 1); + } +} + +GyroSensor::~GyroSensor() { + if (mEnabled) { + enable(0, 0); + } +} + +int GyroSensor::setInitialState() { + struct input_absinfo absinfo_x; + struct input_absinfo absinfo_y; + struct input_absinfo absinfo_z; + float value; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_GYRO_X), &absinfo_x) && + !ioctl(data_fd, EVIOCGABS(EVENT_TYPE_GYRO_X), &absinfo_y) && + !ioctl(data_fd, EVIOCGABS(EVENT_TYPE_GYRO_X), &absinfo_z)) { + value = absinfo_x.value; + mPendingEvent.data[0] = value * CONVERT_GYRO_X; + value = absinfo_x.value; + mPendingEvent.data[1] = value * CONVERT_GYRO_Y; + value = absinfo_x.value; + mPendingEvent.data[2] = value * CONVERT_GYRO_Z; + mHasPendingEvent = true; + } + return 0; +} + +int GyroSensor::enable(int32_t, int en) { + int flags = en ? 1 : 0; + if (flags != mEnabled) { + int fd; + strcpy(&input_sysfs_path[input_sysfs_path_len], "enable"); + fd = open(input_sysfs_path, O_RDWR); + if (fd >= 0) { + char buf[2]; + int err; + buf[1] = 0; + if (flags) { + buf[0] = '1'; + mEnabledTime = getTimestamp() + IGNORE_EVENT_TIME; + } else { + buf[0] = '0'; + } + err = write(fd, buf, sizeof(buf)); + close(fd); + mEnabled = flags; + setInitialState(); + return 0; + } + return -1; + } + return 0; +} + +bool GyroSensor::hasPendingEvents() const { + return mHasPendingEvent; +} + +int GyroSensor::setDelay(int32_t handle, int64_t delay_ns) +{ + int fd; + strcpy(&input_sysfs_path[input_sysfs_path_len], "poll_delay"); + fd = open(input_sysfs_path, O_RDWR); + if (fd >= 0) { + char buf[80]; + sprintf(buf, "%lld", delay_ns); + write(fd, buf, strlen(buf)+1); + close(fd); + return 0; + } + return -1; +} + +int GyroSensor::readEvents(sensors_event_t* data, int count) +{ + if (count < 1) + return -EINVAL; + + if (mHasPendingEvent) { + mHasPendingEvent = false; + mPendingEvent.timestamp = getTimestamp(); + *data = mPendingEvent; + return mEnabled ? 1 : 0; + } + + ssize_t n = mInputReader.fill(data_fd); + if (n < 0) + return n; + + int numEventReceived = 0; + input_event const* event; + +#if FETCH_FULL_EVENT_BEFORE_RETURN +again: +#endif + while (count && mInputReader.readEvent(&event)) { + int type = event->type; + if (type == EV_REL) { + float value = event->value; + if (event->code == EVENT_TYPE_GYRO_X) { + mPendingEvent.data[0] = value * CONVERT_GYRO_X; + } else if (event->code == EVENT_TYPE_GYRO_Y) { + mPendingEvent.data[1] = value * CONVERT_GYRO_Y; + } else if (event->code == EVENT_TYPE_GYRO_Z) { + mPendingEvent.data[2] = value * CONVERT_GYRO_Z; + } + } else if (type == EV_SYN) { + mPendingEvent.timestamp = timevalToNano(event->time); + if (mEnabled) { + if (mPendingEvent.timestamp >= mEnabledTime) { + *data++ = mPendingEvent; + numEventReceived++; + } + count--; + } + } else { + ALOGE("GyroSensor: unknown event (type=%d, code=%d)", + type, event->code); + } + mInputReader.next(); + } + +#if FETCH_FULL_EVENT_BEFORE_RETURN + /* if we didn't read a complete event, see if we can fill and + try again instead of returning with nothing and redoing poll. */ + if (numEventReceived == 0 && mEnabled == 1) { + n = mInputReader.fill(data_fd); + if (n) + goto again; + } +#endif + + return numEventReceived; +} + diff --git a/libsensors/GyroSensor.h b/libsensors/GyroSensor.h new file mode 100644 index 0000000..e8997de --- /dev/null +++ b/libsensors/GyroSensor.h @@ -0,0 +1,55 @@ +/* + * 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_GYRO_SENSOR_H +#define ANDROID_GYRO_SENSOR_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +#include "sensors.h" +#include "SensorBase.h" +#include "InputEventReader.h" + +/*****************************************************************************/ + +struct input_event; + +class GyroSensor : public SensorBase { + int mEnabled; + InputEventCircularReader mInputReader; + sensors_event_t mPendingEvent; + bool mHasPendingEvent; + char input_sysfs_path[PATH_MAX]; + int input_sysfs_path_len; + int64_t mEnabledTime; + + int setInitialState(); + +public: + GyroSensor(); + virtual ~GyroSensor(); + virtual int readEvents(sensors_event_t* data, int count); + virtual bool hasPendingEvents() const; + virtual int setDelay(int32_t handle, int64_t ns); + virtual int enable(int32_t handle, int enabled); +}; + +/*****************************************************************************/ + +#endif // ANDROID_GYRO_SENSOR_H diff --git a/libsensors/InputEventReader.cpp b/libsensors/InputEventReader.cpp new file mode 100644 index 0000000..1014f29 --- /dev/null +++ b/libsensors/InputEventReader.cpp @@ -0,0 +1,88 @@ +/* + * 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. + */ + +#include <stdint.h> +#include <errno.h> +#include <unistd.h> +#include <poll.h> + +#include <sys/cdefs.h> +#include <sys/types.h> + +#include <linux/input.h> + +#include <cutils/log.h> + +#include "InputEventReader.h" + +/*****************************************************************************/ + +struct input_event; + +InputEventCircularReader::InputEventCircularReader(size_t numEvents) + : mBuffer(new input_event[numEvents * 2]), + mBufferEnd(mBuffer + numEvents), + mHead(mBuffer), + mCurr(mBuffer), + mFreeSpace(numEvents) +{ +} + +InputEventCircularReader::~InputEventCircularReader() +{ + delete [] mBuffer; +} + +ssize_t InputEventCircularReader::fill(int fd) +{ + size_t numEventsRead = 0; + if (mFreeSpace) { + const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event)); + if (nread<0 || nread % sizeof(input_event)) { + // we got a partial event!! + return nread<0 ? -errno : -EINVAL; + } + + numEventsRead = nread / sizeof(input_event); + if (numEventsRead) { + mHead += numEventsRead; + mFreeSpace -= numEventsRead; + if (mHead > mBufferEnd) { + size_t s = mHead - mBufferEnd; + memcpy(mBuffer, mBufferEnd, s * sizeof(input_event)); + mHead = mBuffer + s; + } + } + } + + return numEventsRead; +} + +ssize_t InputEventCircularReader::readEvent(input_event const** events) +{ + *events = mCurr; + ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace; + return available ? 1 : 0; +} + +void InputEventCircularReader::next() +{ + mCurr++; + mFreeSpace++; + if (mCurr >= mBufferEnd) { + mCurr = mBuffer; + } +} diff --git a/libsensors/InputEventReader.h b/libsensors/InputEventReader.h new file mode 100644 index 0000000..180aade --- /dev/null +++ b/libsensors/InputEventReader.h @@ -0,0 +1,47 @@ +/* + * 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_INPUT_EVENT_READER_H +#define ANDROID_INPUT_EVENT_READER_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +/*****************************************************************************/ + +struct input_event; + +class InputEventCircularReader +{ + struct input_event* const mBuffer; + struct input_event* const mBufferEnd; + struct input_event* mHead; + struct input_event* mCurr; + ssize_t mFreeSpace; + +public: + InputEventCircularReader(size_t numEvents); + ~InputEventCircularReader(); + ssize_t fill(int fd); + ssize_t readEvent(input_event const** events); + void next(); +}; + +/*****************************************************************************/ + +#endif // ANDROID_INPUT_EVENT_READER_H diff --git a/libsensors/LightSensor.cpp b/libsensors/LightSensor.cpp new file mode 100644 index 0000000..2320053 --- /dev/null +++ b/libsensors/LightSensor.cpp @@ -0,0 +1,160 @@ +/* + * 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. + */ + +#include <fcntl.h> +#include <errno.h> +#include <math.h> +#include <poll.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/select.h> + +#include <linux/lightsensor.h> + +#include <cutils/log.h> + +#include "LightSensor.h" + +// #define ALOG_NDEBUG 0 + +/*****************************************************************************/ + +LightSensor::LightSensor() + : SensorBase(NULL, "light_sensor"), + mEnabled(0), + mInputReader(4), + mHasPendingEvent(false) +{ + mPendingEvent.version = sizeof(sensors_event_t); + mPendingEvent.sensor = ID_L; + mPendingEvent.type = SENSOR_TYPE_LIGHT; + memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data)); + + if (data_fd) { + strcpy(input_sysfs_path, "/sys/class/input/"); + strcat(input_sysfs_path, input_name); + strcat(input_sysfs_path, "/device/"); + input_sysfs_path_len = strlen(input_sysfs_path); + enable(0, 1); + } +} + +LightSensor::~LightSensor() { + if (mEnabled) { + enable(0, 0); + } +} + +int LightSensor::setInitialState() { + struct input_absinfo absinfo; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_LIGHT), &absinfo)) { + // make sure to report an event immediately + mHasPendingEvent = true; + mPendingEvent.light = absinfo.value; + } + return 0; +} + +int LightSensor::setDelay(int32_t handle, int64_t ns) +{ + int fd; + strcpy(&input_sysfs_path[input_sysfs_path_len], "poll_delay"); + fd = open(input_sysfs_path, O_RDWR); + if (fd >= 0) { + char buf[80]; + sprintf(buf, "%lld", ns); + write(fd, buf, strlen(buf)+1); + close(fd); + return 0; + } + return -1; +} + +int LightSensor::enable(int32_t handle, int en) +{ + int flags = en ? 1 : 0; + if (flags != mEnabled) { + int fd; + strcpy(&input_sysfs_path[input_sysfs_path_len], "enable"); + fd = open(input_sysfs_path, O_RDWR); + if (fd >= 0) { + char buf[2]; + int err; + buf[1] = 0; + if (flags) { + buf[0] = '1'; + } else { + buf[0] = '0'; + } + err = write(fd, buf, sizeof(buf)); + close(fd); + mEnabled = flags; + return 0; + } + return -1; + } + return 0; +} + +bool LightSensor::hasPendingEvents() const { + return mHasPendingEvent; +} + +int LightSensor::readEvents(sensors_event_t* data, int count) +{ + if (count < 1) + return -EINVAL; + + if (mHasPendingEvent) { + mHasPendingEvent = false; + mPendingEvent.timestamp = getTimestamp(); + *data = mPendingEvent; + return mEnabled ? 1 : 0; + } + + ssize_t n = mInputReader.fill(data_fd); + if (n < 0) + return n; + + int numEventReceived = 0; + input_event const* event; + + while (count && mInputReader.readEvent(&event)) { + int type = event->type; + if (type == EV_ABS) { + if (event->code == EVENT_TYPE_LIGHT) { + if (event->value != -1) { + ALOGV("LightSensor: event (value=%d)", event->value); + // FIXME: not sure why we're getting -1 sometimes + mPendingEvent.light = event->value; + } + } + } else if (type == EV_SYN) { + mPendingEvent.timestamp = timevalToNano(event->time); + if (mEnabled) { + *data++ = mPendingEvent; + count--; + numEventReceived++; + } + } else { + ALOGE("LightSensor: unknown event (type=%d, code=%d)", + type, event->code); + } + mInputReader.next(); + } + + return numEventReceived; +} diff --git a/libsensors/LightSensor.h b/libsensors/LightSensor.h new file mode 100644 index 0000000..85e65d9 --- /dev/null +++ b/libsensors/LightSensor.h @@ -0,0 +1,55 @@ +/* + * 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_LIGHT_SENSOR_H +#define ANDROID_LIGHT_SENSOR_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +#include "sensors.h" +#include "SensorBase.h" +#include "InputEventReader.h" + +/*****************************************************************************/ + +struct input_event; + +class LightSensor : public SensorBase { + int mEnabled; + InputEventCircularReader mInputReader; + sensors_event_t mPendingEvent; + bool mHasPendingEvent; + char input_sysfs_path[PATH_MAX]; + int input_sysfs_path_len; + + float indexToValue(size_t index) const; + int setInitialState(); + +public: + LightSensor(); + virtual ~LightSensor(); + virtual int readEvents(sensors_event_t* data, int count); + virtual bool hasPendingEvents() const; + virtual int setDelay(int32_t handle, int64_t ns); + virtual int enable(int32_t handle, int enabled); +}; + +/*****************************************************************************/ + +#endif // ANDROID_LIGHT_SENSOR_H diff --git a/libsensors/MODULE_LICENSE_APACHE2 b/libsensors/MODULE_LICENSE_APACHE2 new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/libsensors/MODULE_LICENSE_APACHE2 diff --git a/libsensors/ProximitySensor.cpp b/libsensors/ProximitySensor.cpp new file mode 100644 index 0000000..5ebaabc --- /dev/null +++ b/libsensors/ProximitySensor.cpp @@ -0,0 +1,144 @@ +/* + * 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. + */ + +#include <fcntl.h> +#include <errno.h> +#include <math.h> +#include <poll.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/select.h> + +#include <linux/capella_cm3602.h> + +#include <cutils/log.h> + +#include "ProximitySensor.h" + +/*****************************************************************************/ + +ProximitySensor::ProximitySensor() + : SensorBase(NULL, "proximity_sensor"), + mEnabled(0), + mInputReader(4), + mHasPendingEvent(false) +{ + mPendingEvent.version = sizeof(sensors_event_t); + mPendingEvent.sensor = ID_P; + mPendingEvent.type = SENSOR_TYPE_PROXIMITY; + memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data)); + + if (data_fd) { + strcpy(input_sysfs_path, "/sys/class/input/"); + strcat(input_sysfs_path, input_name); + strcat(input_sysfs_path, "/device/"); + input_sysfs_path_len = strlen(input_sysfs_path); + enable(0, 1); + } +} + +ProximitySensor::~ProximitySensor() { + if (mEnabled) { + enable(0, 0); + } +} + +int ProximitySensor::setInitialState() { + struct input_absinfo absinfo; + if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_PROXIMITY), &absinfo)) { + // make sure to report an event immediately + mHasPendingEvent = true; + mPendingEvent.distance = indexToValue(absinfo.value); + } + return 0; +} + +int ProximitySensor::enable(int32_t, int en) { + int flags = en ? 1 : 0; + if (flags != mEnabled) { + int fd; + strcpy(&input_sysfs_path[input_sysfs_path_len], "enable"); + fd = open(input_sysfs_path, O_RDWR); + if (fd >= 0) { + char buf[2]; + buf[1] = 0; + if (flags) { + buf[0] = '1'; + } else { + buf[0] = '0'; + } + write(fd, buf, sizeof(buf)); + close(fd); + mEnabled = flags; + setInitialState(); + return 0; + } + return -1; + } + return 0; +} + +bool ProximitySensor::hasPendingEvents() const { + return mHasPendingEvent; +} + +int ProximitySensor::readEvents(sensors_event_t* data, int count) +{ + if (count < 1) + return -EINVAL; + + if (mHasPendingEvent) { + mHasPendingEvent = false; + mPendingEvent.timestamp = getTimestamp(); + *data = mPendingEvent; + return mEnabled ? 1 : 0; + } + + ssize_t n = mInputReader.fill(data_fd); + if (n < 0) + return n; + + int numEventReceived = 0; + input_event const* event; + + while (count && mInputReader.readEvent(&event)) { + int type = event->type; + if (type == EV_ABS) { + if (event->code == EVENT_TYPE_PROXIMITY) { + mPendingEvent.distance = indexToValue(event->value); + } + } else if (type == EV_SYN) { + mPendingEvent.timestamp = timevalToNano(event->time); + if (mEnabled) { + *data++ = mPendingEvent; + count--; + numEventReceived++; + } + } else { + ALOGE("ProximitySensor: unknown event (type=%d, code=%d)", + type, event->code); + } + mInputReader.next(); + } + + return numEventReceived; +} + +float ProximitySensor::indexToValue(size_t index) const +{ + ALOGV("ProximitySensor: Index = %zu", index); + return index * PROXIMITY_THRESHOLD_CM; +} diff --git a/libsensors/ProximitySensor.h b/libsensors/ProximitySensor.h new file mode 100644 index 0000000..08ea49c --- /dev/null +++ b/libsensors/ProximitySensor.h @@ -0,0 +1,54 @@ +/* + * 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_PROXIMITY_SENSOR_H +#define ANDROID_PROXIMITY_SENSOR_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +#include "sensors.h" +#include "SensorBase.h" +#include "InputEventReader.h" + +/*****************************************************************************/ + +struct input_event; + +class ProximitySensor : public SensorBase { + int mEnabled; + InputEventCircularReader mInputReader; + sensors_event_t mPendingEvent; + bool mHasPendingEvent; + char input_sysfs_path[PATH_MAX]; + int input_sysfs_path_len; + + int setInitialState(); + float indexToValue(size_t index) const; + +public: + ProximitySensor(); + virtual ~ProximitySensor(); + virtual int readEvents(sensors_event_t* data, int count); + virtual bool hasPendingEvents() const; + virtual int enable(int32_t handle, int enabled); +}; + +/*****************************************************************************/ + +#endif // ANDROID_PROXIMITY_SENSOR_H diff --git a/libsensors/SensorBase.cpp b/libsensors/SensorBase.cpp new file mode 100644 index 0000000..79b1ee2 --- /dev/null +++ b/libsensors/SensorBase.cpp @@ -0,0 +1,128 @@ +/* + * 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. + */ + +#include <fcntl.h> +#include <errno.h> +#include <math.h> +#include <poll.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/select.h> + +#include <cutils/log.h> + +#include <linux/input.h> + +#include "SensorBase.h" + +/*****************************************************************************/ + +SensorBase::SensorBase( + const char* dev_name, + const char* data_name) + : dev_name(dev_name), data_name(data_name), + dev_fd(-1), data_fd(-1) +{ + if (data_name) { + data_fd = openInput(data_name); + } +} + +SensorBase::~SensorBase() { + if (data_fd >= 0) { + close(data_fd); + } + if (dev_fd >= 0) { + close(dev_fd); + } +} + +int SensorBase::open_device() { + if (dev_fd<0 && dev_name) { + dev_fd = open(dev_name, O_RDONLY); + ALOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno)); + } + return 0; +} + +int SensorBase::close_device() { + if (dev_fd >= 0) { + close(dev_fd); + dev_fd = -1; + } + return 0; +} + +int SensorBase::getFd() const { + if (!data_name) { + return dev_fd; + } + return data_fd; +} + +int SensorBase::setDelay(int32_t handle, int64_t ns) { + return 0; +} + +bool SensorBase::hasPendingEvents() const { + return false; +} + +int64_t SensorBase::getTimestamp() { + struct timespec t; + t.tv_sec = t.tv_nsec = 0; + clock_gettime(CLOCK_MONOTONIC, &t); + return int64_t(t.tv_sec)*1000000000LL + t.tv_nsec; +} + +int SensorBase::openInput(const char* inputName) { + int fd = -1; + const char *dirname = "/dev/input"; + char devname[PATH_MAX]; + char *filename; + DIR *dir; + struct dirent *de; + dir = opendir(dirname); + if(dir == NULL) + return -1; + strcpy(devname, dirname); + filename = devname + strlen(devname); + *filename++ = '/'; + while((de = readdir(dir))) { + if(de->d_name[0] == '.' && + (de->d_name[1] == '\0' || + (de->d_name[1] == '.' && de->d_name[2] == '\0'))) + continue; + strcpy(filename, de->d_name); + fd = open(devname, O_RDONLY); + if (fd>=0) { + char name[80]; + if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) { + name[0] = '\0'; + } + if (!strcmp(name, inputName)) { + strcpy(input_name, filename); + break; + } else { + close(fd); + fd = -1; + } + } + } + closedir(dir); + ALOGE_IF(fd<0, "couldn't find '%s' input device", inputName); + return fd; +} diff --git a/libsensors/SensorBase.h b/libsensors/SensorBase.h new file mode 100644 index 0000000..bb4d055 --- /dev/null +++ b/libsensors/SensorBase.h @@ -0,0 +1,65 @@ +/* + * 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_SENSOR_BASE_H +#define ANDROID_SENSOR_BASE_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + + +/*****************************************************************************/ + +struct sensors_event_t; + +class SensorBase { +protected: + const char* dev_name; + const char* data_name; + char input_name[PATH_MAX]; + int dev_fd; + int data_fd; + + int openInput(const char* inputName); + static int64_t getTimestamp(); + + + static int64_t timevalToNano(timeval const& t) { + return t.tv_sec*1000000000LL + t.tv_usec*1000; + } + + int open_device(); + int close_device(); + +public: + SensorBase( + const char* dev_name, + const char* data_name); + + virtual ~SensorBase(); + + virtual int readEvents(sensors_event_t* data, int count) = 0; + virtual bool hasPendingEvents() const; + virtual int getFd() const; + virtual int setDelay(int32_t handle, int64_t ns); + virtual int enable(int32_t handle, int enabled) = 0; +}; + +/*****************************************************************************/ + +#endif // ANDROID_SENSOR_BASE_H diff --git a/libsensors/ak8973b.h b/libsensors/ak8973b.h new file mode 100644 index 0000000..9b7ab60 --- /dev/null +++ b/libsensors/ak8973b.h @@ -0,0 +1,51 @@ +/* + * Definitions for akm8973 compass chip. + */ +#ifndef AKM8973_H +#define AKM8973_H + +#include <linux/ioctl.h> + +#define AKM8973_I2C_NAME "ak8973b" + +#define AKMIO 0xA1 + +/* IOCTLs for AKM library */ +#define ECS_IOCTL_WRITE _IOW(AKMIO, 0x01, char*) +#define ECS_IOCTL_READ _IOWR(AKMIO, 0x02, char*) +#define ECS_IOCTL_RESET _IO(AKMIO, 0x03) +#define ECS_IOCTL_SET_MODE _IOW(AKMIO, 0x04, short) +#define ECS_IOCTL_GETDATA _IOR(AKMIO, 0x05, char[SENSOR_DATA_SIZE]) +#define ECS_IOCTL_SET_YPR _IOW(AKMIO, 0x06, short[12]) +#define ECS_IOCTL_GET_OPEN_STATUS _IOR(AKMIO, 0x07, int) +#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(AKMIO, 0x08, int) +#define ECS_IOCTL_GET_DELAY _IOR(AKMIO, 0x30, int64_t) +#define ECS_IOCTL_GET_PROJECT_NAME _IOR(AKMIO, 0x0D, char[64]) +#define ECS_IOCTL_GET_MATRIX _IOR(AKMIO, 0x0E, short [4][3][3]) + +/* IOCTLs for APPs */ +#define ECS_IOCTL_APP_SET_MODE _IOW(AKMIO, 0x10, short) +#define ECS_IOCTL_APP_SET_MFLAG _IOW(AKMIO, 0x11, short) +#define ECS_IOCTL_APP_GET_MFLAG _IOW(AKMIO, 0x12, short) +#define ECS_IOCTL_APP_SET_AFLAG _IOW(AKMIO, 0x13, short) +#define ECS_IOCTL_APP_GET_AFLAG _IOR(AKMIO, 0x14, short) +#define ECS_IOCTL_APP_SET_TFLAG _IOR(AKMIO, 0x15, short) +#define ECS_IOCTL_APP_GET_TFLAG _IOR(AKMIO, 0x16, short) +#define ECS_IOCTL_APP_RESET_PEDOMETER _IO(AKMIO, 0x17) +#define ECS_IOCTL_APP_SET_DELAY _IOW(AKMIO, 0x18, int64_t) +#define ECS_IOCTL_APP_GET_DELAY ECS_IOCTL_GET_DELAY + +/* Set raw magnetic vector flag */ +#define ECS_IOCTL_APP_SET_MVFLAG _IOW(AKMIO, 0x19, short) + +/* Get raw magnetic vector flag */ +#define ECS_IOCTL_APP_GET_MVFLAG _IOR(AKMIO, 0x1A, short) + +struct akm8973_platform_data { + short layouts[4][3][3]; + char project_name[64]; + int gpio_RST; + int gpio_INT; +}; + +#endif diff --git a/libsensors/sensors.cpp b/libsensors/sensors.cpp new file mode 100644 index 0000000..c048a14 --- /dev/null +++ b/libsensors/sensors.cpp @@ -0,0 +1,326 @@ +/* + * 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. + */ + +#define ALOG_TAG "Sensors" + +#include <hardware/sensors.h> +#include <fcntl.h> +#include <errno.h> +#include <dirent.h> +#include <math.h> +#include <poll.h> +#include <pthread.h> +#include <stdlib.h> + +#include <linux/input.h> + +#include <utils/Atomic.h> +#include <utils/Log.h> + +#include "sensors.h" + +#include "LightSensor.h" +#include "ProximitySensor.h" +#include "AkmSensor.h" +#include "GyroSensor.h" + +/*****************************************************************************/ + +#define DELAY_OUT_TIME 0x7FFFFFFF + +#define LIGHT_SENSOR_POLLTIME 2000000000 + + +#define SENSORS_ACCELERATION (1<<ID_A) +#define SENSORS_MAGNETIC_FIELD (1<<ID_M) +#define SENSORS_ORIENTATION (1<<ID_O) +#define SENSORS_LIGHT (1<<ID_L) +#define SENSORS_PROXIMITY (1<<ID_P) +#define SENSORS_GYROSCOPE (1<<ID_GY) + +#define SENSORS_ACCELERATION_HANDLE 0 +#define SENSORS_MAGNETIC_FIELD_HANDLE 1 +#define SENSORS_ORIENTATION_HANDLE 2 +#define SENSORS_LIGHT_HANDLE 3 +#define SENSORS_PROXIMITY_HANDLE 4 +#define SENSORS_GYROSCOPE_HANDLE 5 + +#define AKM_FTRACE 0 +#define AKM_DEBUG 0 +#define AKM_DATA 0 + +/*****************************************************************************/ + +/* The SENSORS Module */ +static const struct sensor_t sSensorList[] = { + { "KR3DM 3-axis Accelerometer", + "STMicroelectronics", + 1, SENSORS_ACCELERATION_HANDLE, + SENSOR_TYPE_ACCELEROMETER, RANGE_A, CONVERT_A, 0.23f, 20000, { } }, + { "AK8975 3-axis Magnetic field sensor", + "Asahi Kasei Microdevices", + 1, SENSORS_MAGNETIC_FIELD_HANDLE, + SENSOR_TYPE_MAGNETIC_FIELD, 2000.0f, CONVERT_M, 6.8f, 16667, { } }, + { "AK8973 Orientation sensor", + "Asahi Kasei Microdevices", + 1, SENSORS_ORIENTATION_HANDLE, + SENSOR_TYPE_ORIENTATION, 360.0f, CONVERT_O, 7.8f, 16667, { } }, + { "CM3663 Light sensor", + "Capella Microsystems", + 1, SENSORS_LIGHT_HANDLE, + SENSOR_TYPE_LIGHT, 10240.0f, 1.0f, 0.75f, 0, { } }, + { "CM3663 Proximity sensor", + "Capella Microsystems", + 1, SENSORS_PROXIMITY_HANDLE, + SENSOR_TYPE_PROXIMITY, 5.0f, 5.0f, 0.75f, 0, { } }, + { "K3G Gyroscope sensor", + "STMicroelectronics", + 1, SENSORS_GYROSCOPE_HANDLE, + SENSOR_TYPE_GYROSCOPE, RANGE_GYRO, CONVERT_GYRO, 6.1f, 1190, { } }, +}; + + +static int open_sensors(const struct hw_module_t* module, const char* id, + struct hw_device_t** device); + + +static int sensors__get_sensors_list(struct sensors_module_t* module, + struct sensor_t const** list) +{ + *list = sSensorList; + return ARRAY_SIZE(sSensorList); +} + +static struct hw_module_methods_t sensors_module_methods = { + open: open_sensors +}; + +struct sensors_module_t HAL_MODULE_INFO_SYM = { + common: { + tag: HARDWARE_MODULE_TAG, + version_major: 1, + version_minor: 0, + id: SENSORS_HARDWARE_MODULE_ID, + name: "Samsung Sensor module", + author: "Samsung Electronic Company", + methods: &sensors_module_methods, + }, + get_sensors_list: sensors__get_sensors_list, +}; + +struct sensors_poll_context_t { + struct sensors_poll_device_t device; // must be first + + sensors_poll_context_t(); + ~sensors_poll_context_t(); + int activate(int handle, int enabled); + int setDelay(int handle, int64_t ns); + int pollEvents(sensors_event_t* data, int count); + +private: + enum { + light = 0, + proximity = 1, + akm = 2, + gyro = 3, + numSensorDrivers, + numFds, + }; + + static const size_t wake = numFds - 1; + static const char WAKE_MESSAGE = 'W'; + struct pollfd mPollFds[numFds]; + int mWritePipeFd; + SensorBase* mSensors[numSensorDrivers]; + + int handleToDriver(int handle) const { + switch (handle) { + case ID_A: + case ID_M: + case ID_O: + return akm; + case ID_P: + return proximity; + case ID_L: + return light; + case ID_GY: + return gyro; + } + return -EINVAL; + } +}; + +/*****************************************************************************/ + +sensors_poll_context_t::sensors_poll_context_t() +{ + mSensors[light] = new LightSensor(); + mPollFds[light].fd = mSensors[light]->getFd(); + mPollFds[light].events = POLLIN; + mPollFds[light].revents = 0; + + mSensors[proximity] = new ProximitySensor(); + mPollFds[proximity].fd = mSensors[proximity]->getFd(); + mPollFds[proximity].events = POLLIN; + mPollFds[proximity].revents = 0; + + mSensors[akm] = new AkmSensor(); + mPollFds[akm].fd = mSensors[akm]->getFd(); + mPollFds[akm].events = POLLIN; + mPollFds[akm].revents = 0; + + mSensors[gyro] = new GyroSensor(); + mPollFds[gyro].fd = mSensors[gyro]->getFd(); + mPollFds[gyro].events = POLLIN; + mPollFds[gyro].revents = 0; + + int wakeFds[2]; + int result = pipe(wakeFds); + ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno)); + fcntl(wakeFds[0], F_SETFL, O_NONBLOCK); + fcntl(wakeFds[1], F_SETFL, O_NONBLOCK); + mWritePipeFd = wakeFds[1]; + + mPollFds[wake].fd = wakeFds[0]; + mPollFds[wake].events = POLLIN; + mPollFds[wake].revents = 0; +} + +sensors_poll_context_t::~sensors_poll_context_t() { + for (int i=0 ; i<numSensorDrivers ; i++) { + delete mSensors[i]; + } + close(mPollFds[wake].fd); + close(mWritePipeFd); +} + +int sensors_poll_context_t::activate(int handle, int enabled) { + int index = handleToDriver(handle); + if (index < 0) return index; + int err = mSensors[index]->enable(handle, enabled); + if (enabled && !err) { + const char wakeMessage(WAKE_MESSAGE); + int result = write(mWritePipeFd, &wakeMessage, 1); + ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno)); + } + return err; +} + +int sensors_poll_context_t::setDelay(int handle, int64_t ns) { + + int index = handleToDriver(handle); + if (index < 0) return index; + return mSensors[index]->setDelay(handle, ns); +} + +int sensors_poll_context_t::pollEvents(sensors_event_t* data, int count) +{ + int nbEvents = 0; + int n = 0; + + do { + // see if we have some leftover from the last poll() + for (int i=0 ; count && i<numSensorDrivers ; i++) { + SensorBase* const sensor(mSensors[i]); + if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) { + int nb = sensor->readEvents(data, count); + if (nb < count) { + // no more data for this sensor + mPollFds[i].revents = 0; + } + count -= nb; + nbEvents += nb; + data += nb; + } + } + + if (count) { + // we still have some room, so try to see if we can get + // some events immediately or just wait if we don't have + // anything to return + n = poll(mPollFds, numFds, nbEvents ? 0 : -1); + if (n<0) { + ALOGE("poll() failed (%s)", strerror(errno)); + return -errno; + } + if (mPollFds[wake].revents & POLLIN) { + char msg; + int result = read(mPollFds[wake].fd, &msg, 1); + ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno)); + ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg)); + mPollFds[wake].revents = 0; + } + } + // if we have events and space, go read them + } while (n && count); + + return nbEvents; +} + +/*****************************************************************************/ + +static int poll__close(struct hw_device_t *dev) +{ + sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; + if (ctx) { + delete ctx; + } + return 0; +} + +static int poll__activate(struct sensors_poll_device_t *dev, + int handle, int enabled) { + sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; + return ctx->activate(handle, enabled); +} + +static int poll__setDelay(struct sensors_poll_device_t *dev, + int handle, int64_t ns) { + sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; + return ctx->setDelay(handle, ns); +} + +static int poll__poll(struct sensors_poll_device_t *dev, + sensors_event_t* data, int count) { + sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; + return ctx->pollEvents(data, count); +} + +/*****************************************************************************/ + +/** Open a new instance of a sensor device using name */ +static int open_sensors(const struct hw_module_t* module, const char* id, + struct hw_device_t** device) +{ + int status = -EINVAL; + sensors_poll_context_t *dev = new sensors_poll_context_t(); + + memset(&dev->device, 0, sizeof(sensors_poll_device_t)); + + dev->device.common.tag = HARDWARE_DEVICE_TAG; + dev->device.common.version = 0; + dev->device.common.module = const_cast<hw_module_t*>(module); + dev->device.common.close = poll__close; + dev->device.activate = poll__activate; + dev->device.setDelay = poll__setDelay; + dev->device.poll = poll__poll; + + *device = &dev->device.common; + status = 0; + + return status; +} + diff --git a/libsensors/sensors.h b/libsensors/sensors.h new file mode 100644 index 0000000..3c846fe --- /dev/null +++ b/libsensors/sensors.h @@ -0,0 +1,144 @@ +/* + * 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_SENSORS_H +#define ANDROID_SENSORS_H + +#include <stdint.h> +#include <errno.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +#include <linux/input.h> + +#include <hardware/hardware.h> +#include <hardware/sensors.h> + +__BEGIN_DECLS + +/*****************************************************************************/ + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) + +#define ID_A (0) +#define ID_M (1) +#define ID_O (2) +#define ID_L (3) +#define ID_P (4) +#define ID_GY (5) + +/*****************************************************************************/ + +/* + * The SENSORS Module + */ + +/* the CM3663 is a binary proximity sensor that triggers around 6 cm on + * this hardware */ +#define PROXIMITY_THRESHOLD_CM 6.0f + +/*****************************************************************************/ + +#define AKM_DEVICE_NAME "/dev/akm8975" +#define CM_DEVICE_NAME "/dev/i2c11" // FIXME Proximity +#define LS_DEVICE_NAME "/dev/i2c11" // FIXME Lig + +/* + E/Sensors ( 2656): AkmSensor: processing event (type=0, code=0) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=8) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=3) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=4) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=5) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=0) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=1) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=2) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=6) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=7) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=9) + E/Sensors ( 2656): AkmSensor: processing event (type=0, code=0) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=8) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=3) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=4) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=5) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=0) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=1) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=2) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=6) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=7) + E/Sensors ( 2656): AkmSensor: processing event (type=2, code=9) +*/ + +// for akm8975 +#define EVENT_TYPE_ACCEL_X ABS_Y //1 +#define EVENT_TYPE_ACCEL_Y ABS_X //0 +#define EVENT_TYPE_ACCEL_Z ABS_Z //2 +//#define EVENT_TYPE_ACCEL_STATUS ABS_WHEEL //8 + +#define EVENT_TYPE_YAW ABS_RX //3 +#define EVENT_TYPE_PITCH ABS_RY //4 +#define EVENT_TYPE_ROLL ABS_RZ //5 +#define EVENT_TYPE_ORIENT_STATUS ABS_WHEEL //8 + +#define EVENT_TYPE_MAGV_X ABS_RUDDER // 6 +#define EVENT_TYPE_MAGV_Y ABS_THROTTLE // 7 +#define EVENT_TYPE_MAGV_Z ABS_GAS // 9 + +#define EVENT_TYPE_TEMPERATURE ABS_THROTTLE +#define EVENT_TYPE_STEP_COUNT ABS_GAS +#define EVENT_TYPE_PROXIMITY ABS_DISTANCE +#define EVENT_TYPE_LIGHT ABS_MISC + +#define EVENT_TYPE_GYRO_X REL_RX +#define EVENT_TYPE_GYRO_Y REL_RY +#define EVENT_TYPE_GYRO_Z REL_RZ + +// 90 LSB = 1G for KR3DM +#define LSB (90.0f) +#define NUMOFACCDATA (8.0f) + +// conversion of acceleration data to SI units (m/s^2) +#define RANGE_A (2*GRAVITY_EARTH) +#define CONVERT_A (GRAVITY_EARTH / LSB / NUMOFACCDATA) +#define CONVERT_A_X (CONVERT_A) +#define CONVERT_A_Y (-CONVERT_A) +#define CONVERT_A_Z (-CONVERT_A) + +// conversion of magnetic data to uT units +#define CONVERT_M (1.0f/16.0f) +#define CONVERT_M_X (CONVERT_M) +#define CONVERT_M_Y (-CONVERT_M) +#define CONVERT_M_Z (CONVERT_M) + +/* conversion of orientation data to degree units */ +#define CONVERT_O (1.0f/1000.0f) +#define CONVERT_O_A (CONVERT_O) +#define CONVERT_O_P (CONVERT_O) +#define CONVERT_O_R (CONVERT_O) + +// conversion of gyro data to SI units (radian/sec) +#define RANGE_GYRO (500.0f*(float)M_PI/180.0f) +#define CONVERT_GYRO ((70.0f / 4000.0f) * ((float)M_PI / 180.0f)) +#define CONVERT_GYRO_X (CONVERT_GYRO) +#define CONVERT_GYRO_Y (CONVERT_GYRO) +#define CONVERT_GYRO_Z (CONVERT_GYRO) + +#define SENSOR_STATE_MASK (0x7FFF) + +/*****************************************************************************/ + +__END_DECLS + +#endif // ANDROID_SENSORS_H @@ -0,0 +1,64 @@ +on early-init + start ueventd + +on init + export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin + export LD_LIBRARY_PATH /vendor/lib:/system/lib + export ANDROID_ROOT /system + export ANDROID_DATA /data + export ANDROID_CACHE /cache + export SECONDARY_STORAGE /mnt/emmc + export EXTERNAL_STORAGE /mnt/sdcard + + symlink /system/etc /etc + mkdir /mnt 0775 root system + + mkdir /system + mkdir /tmp + mkdir /mnt 0775 root root + + +on boot +# CPU Frequency Governor + write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor powersave + + ifup lo + hostname localhost + domainname localdomain + + class_start default + +service ueventd /sbin/ueventd + class core + critical + +service console /system/bin/sh + class core + console + +service adbd /sbin/adbd + disabled + +service charger /charger + class default + user root + +# Always start adbd on userdebug and eng builds +# In recovery, always run adbd as root. +on property:ro.debuggable=1 + 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 adb + write /sys/class/android_usb/android0/enable 1 + 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 + start adbd + setprop service.adb.root 1 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + write /sys/class/android_usb/android0/enable 0 + restart adbd + write /sys/class/android_usb/android0/enable 1 diff --git a/overlay/frameworks/base/core/res/res/values/arrays.xml b/overlay/frameworks/base/core/res/res/values/arrays.xml new file mode 100644 index 0000000..fa33631 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/arrays.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.xml +** +** Copyright 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. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + +<!-- Defines the shutdown options shown in the reboot dialog. --> + <array name="shutdown_reboot_options" translatable="false"> + <item>@string/reboot_reboot</item> + <item>@string/reboot_recovery</item> + <item>@string/reboot_download</item> + </array> + + <!-- Do not translate. Defines the shutdown actions passed to the kernel. + The first item should be empty for regular reboot. --> + <string-array name="shutdown_reboot_actions" translatable="false"> + <item></item> + <item>recovery</item> + <item>bootloader</item> + </string-array> + +</resources> 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..edcae91 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/values/config.xml @@ -0,0 +1,169 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2011, 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. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources> + + <!-- Our amoled doesn't animate well. --> + <bool name="config_animateScreenLights">false</bool> + + <integer name="config_deskDockKeepsScreenOn">0</integer> + <integer name="config_carDockKeepsScreenOn">1</integer> + + <!-- If this is true, the screen will come on when you unplug usb/power/whatever. --> + <bool name="config_unplugTurnsOnScreen">true</bool> + + <!-- Component name of the service providing network location support. --> + <string name="config_networkLocationProviderPackageName">com.google.android.location.NetworkLocationProvider</string> + + <!-- Component name of the service providing geocoder API support. --> + <string name="config_geocodeProviderPackageName">com.google.android.location.GeocodeProvider</string> + + <!-- Whether a software navigation bar should be shown. NOTE: in the future this may be + autodetected from the Configuration. --> + <bool name="config_showNavigationBar">false</bool> + + <!-- XXXXX NOTE THE FOLLOWING RESOURCES USE THE WRONG NAMING CONVENTION. + Please don't copy them, copy anything else. --> + + <!-- An Array of "[Connection name],[ConnectivityManager.TYPE_xxxx], + [associated radio-type],[priority],[restoral-timer(ms)],[dependencyMet] --> + <!-- the 5th element "resore-time" indicates the number of milliseconds to delay + before automatically restore the default connection. Set -1 if the connection + does not require auto-restore. --> + <!-- the 6th element indicates boot-time dependency-met value. --> + <string-array translatable="false" name="networkAttributes"> + <item>"wifi,1,1,1,-1,true"</item> + <item>"mobile,0,0,0,-1,true"</item> + <item>"mobile_mms,2,0,2,60000,true"</item> + <item>"mobile_supl,3,0,2,60000,true"</item> + <item>"mobile_dun,4,0,3,60000,true"</item> + <item>"mobile_hipri,5,0,3,60000,true"</item> + <item>"mobile_bluetooth,7,7,1,-1,true"</item> + <item>"wifi_p2p,13,1,0,-1,true"</item> + </string-array> + + <!-- An Array of "[ConnectivityManager connectionType], + [# simultaneous connection types]" --> + <string-array translatable="false" name="radioAttributes"> + <item>"1,1"</item> + <item>"0,1"</item> + <item>"7,1"</item> + </string-array> + + <!-- List of regexpressions describing the interface (if any) that represent tetherable + USB interfaces. If the device doesn't want to support tething over USB this should + be empty. An example would be "usb.*" --> + <string-array translatable="false" name="config_tether_usb_regexs"> + <item>"rndis0"</item> + </string-array> + + <!-- List of regexpressions describing the interface (if any) that represent tetherable + Wifi interfaces. If the device doesn't want to support tethering over Wifi this + should be empty. An example would be "softap.*" --> + <string-array translatable="false" name="config_tether_wifi_regexs"> + <item>"wlan0"</item> + </string-array> + + <!-- List of regexpressions describing the interface (if any) that represent tetherable + bluetooth interfaces. If the device doesn't want to support tethering over bluetooth this + should be empty. --> + <string-array translatable="false" name="config_tether_bluetooth_regexs"> + <item>"bnep\\d"</item> + </string-array> + + <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering --> + <!-- Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or + <!== [0,1,5,7] for TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI and TYPE_BLUETOOTH --> + <integer-array translatable="false" name="config_tether_upstream_types"> + <item>0</item> + <item>1</item> + <item>5</item> + <item>7</item> + </integer-array> + + <!-- Boolean indicating whether the wifi chipset has dual frequency band support --> + <bool translatable="false" name="config_wifi_dual_band_support">true</bool> + + <!-- Boolean indicating whether the wifi chipset has p2p support --> + <bool translatable="false" name="config_wifi_p2p_support">true</bool> + + <!-- Boolean indicating whether the wifi chipset has background scan support --> + <bool translatable="false" name="config_wifi_background_scan_support">true</bool> + + <bool name="config_ui_enableFadingMarquee">false</bool> + + <!-- Vibrator pattern for feedback about a long screen/key press --> + <integer-array name="config_longPressVibePattern"> + <item>0</item> + <item>1</item> + <item>20</item> + <item>21</item> + </integer-array> + + <!-- Vibrator pattern for feedback about touching a virtual key --> + <integer-array name="config_virtualKeyVibePattern"> + <item>0</item> + <item>1</item> + <item>20</item> + <item>21</item> + </integer-array> + + <!-- Vibrator pattern for a very short but reliable vibration for soft keyboard tap --> + <integer-array name="config_keyboardTapVibePattern"> + <item>20</item> + </integer-array> + + <!-- Vibrator pattern for feedback about booting with safe mode disabled --> + <integer-array name="config_safeModeDisabledVibePattern"> + <item>0</item> + <item>1</item> + <item>20</item> + <item>21</item> + </integer-array> + + <!-- Vibrator pattern for feedback about booting with safe mode disabled --> + <integer-array name="config_safeModeEnabledVibePattern"> + <item>0</item> + <item>1</item> + <item>20</item> + <item>21</item> + <item>500</item> + <item>600</item> + </integer-array> + + <!-- Vibrator pattern for feedback about hitting a scroll barrier --> + <integer-array name="config_scrollBarrierVibePattern"> + <item>0</item> + <item>15</item> + <item>10</item> + <item>10</item> + </integer-array> + + <!-- The default iface on which to monitor data use --> + <string name="config_datause_iface">pdp0</string> + + <!-- Allow the menu hard key to be disabled in LockScreen on some devices --> + <bool name="config_disableMenuKeyInLockScreen">true</bool> + + <!-- Workaround for devices with broken keyboards --> + <bool name="config_forceDisableHardwareKeyboard">true</bool> + +</resources> 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..9bb46a8 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/power_profile.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2011, 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. +*/ +--> + +<device name="Android"> + <!-- All values are in mA except as noted --> + <item name="none">0</item> + <item name="screen.on">200</item> <!-- min brite --> + <item name="bluetooth.active">150</item> + <item name="bluetooth.on">1</item> + <item name="bluetooth.at">1</item> <!-- TBD --> + <item name="screen.full">160</item> <!-- 360 max on calendar --> + <item name="wifi.on">1</item> + <item name="wifi.active">150</item> + <item name="wifi.scan">200</item> + <item name="dsp.audio">150</item> + <item name="dsp.video">200</item> + <item name="radio.active">150</item> + <item name="gps.on">55</item> + <item name="battery.capacity">1750</item> + <item name="radio.scanning">90</item> <!-- TBD --> + <!-- Current consumed by the radio at different signal strengths, when paging --> + <array name="radio.on"> <!-- 1 entry per signal strength bin, TBD --> + <value>3.0</value> + <value>3.0</value> + </array> + <array name="cpu.speeds"> + <value>350000</value> + <value>700000</value> + <value>920000</value> + <value>1200000</value> + </array> + <!-- Power consumption in suspend --> + <item name="cpu.idle">7</item> + <!-- Power consumption due to wake lock held --> + <item name="cpu.awake">20</item> + <!-- Power consumption at different speeds --> + <array name="cpu.active"> + <value>120</value> + <value>228</value> + <value>299</value> + <value>397</value> + </array> +</device> diff --git a/overlay/frameworks/base/core/res/res/xml/storage_list.xml b/overlay/frameworks/base/core/res/res/xml/storage_list.xml new file mode 100644 index 0000000..20b5fe8 --- /dev/null +++ b/overlay/frameworks/base/core/res/res/xml/storage_list.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2011, 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. +*/ +--> + +<!-- The <device> element should contain one or more <storage> elements. + Exactly one of these should have the attribute primary="true". + This storage will be the primary external storage and should have path="/mnt/sdcard". + Each storage should have both a path and description attribute set. + The following boolean attributes are optional: + + primary: this storage is the primary external storage + removable: this is removable storage (for example, a real SD card) + emulated: the storage is emulated via the FUSE sdcard daemon + mtp-reserve: number of megabytes of storage MTP should reserve for free storage + (used for emulated storage that is shared with system's data partition) + + A storage should not have both emulated and removable set to true +--> + +<StorageList xmlns:android="http://schemas.android.com/apk/res/android"> + <storage android:mountPoint="/storage/sdcard0" + android:storageDescription="@string/storage_internal" + android:primary="true" + android:removable="false" /> + + <storage android:mountPoint="/storage/sdcard1" + android:storageDescription="@string/storage_sd_card" + android:primary="false" + android:removable="false" /> + + <storage android:mountPoint="/storage/usbdisk0" + android:storageDescription="@string/storage_usb" + android:primary="false" + android:removable="true" /> + +</StorageList> diff --git a/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml new file mode 100644 index 0000000..1e32354 --- /dev/null +++ b/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright (c) 2011, 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. + */ +--> +<resources> + <!-- Screen timeout default = 30 seconds --> + <integer name="def_screen_off_timeout">30000</integer> +</resources> diff --git a/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml new file mode 100644 index 0000000..88851f7 --- /dev/null +++ b/overlay/frameworks/base/packages/SystemUI/res/values/config.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2011, 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. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources> + <!-- Control whether status bar should distinguish HSPA data icon form UMTS data icon on devices --> + <bool name="config_hspa_data_distinguishable">true</bool> +</resources> + diff --git a/overlay/include/hardware/gps.h b/overlay/include/hardware/gps.h new file mode 100644 index 0000000..05b3b11 --- /dev/null +++ b/overlay/include/hardware/gps.h @@ -0,0 +1,686 @@ +/* + * 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 <stdint.h> +#include <sys/cdefs.h> +#include <sys/types.h> +#include <pthread.h> + +#include <hardware/hardware.h> + +__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 + +/** 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 + +/** Flags used to specify which aiding data to delete + when calling delete_aiding_data(). */ +typedef uint16_t GpsAidingData; +// IMPORTANT: Note that the following values must match +// constants in GpsLocationProvider.java. +#define GPS_DELETE_EPHEMERIS 0x0001 +#define GPS_DELETE_ALMANAC 0x0002 +#define GPS_DELETE_POSITION 0x0004 +#define GPS_DELETE_TIME 0x0008 +#define GPS_DELETE_IONO 0x0010 +#define GPS_DELETE_UTC 0x0020 +#define GPS_DELETE_HEALTH 0x0040 +#define GPS_DELETE_SVDIR 0x0080 +#define GPS_DELETE_SVSTEER 0x0100 +#define GPS_DELETE_SADATA 0x0200 +#define GPS_DELETE_RTI 0x0400 +#define GPS_DELETE_CELLDB_INFO 0x8000 +#define GPS_DELETE_ALL 0xFFFF + +/** AGPS type */ +typedef uint16_t AGpsType; +#define AGPS_TYPE_SUPL 1 +#define AGPS_TYPE_C2K 2 + +typedef uint16_t AGpsSetIDType; +#define AGPS_SETID_TYPE_NONE 0 +#define AGPS_SETID_TYPE_IMSI 1 +#define AGPS_SETID_TYPE_MSISDN 2 + +/** + * 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 + +/** + * 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 for NI interface + */ +#define GPS_NI_INTERFACE "gps-ni" + +/** + * Name for the AGPS-RIL interface. + */ +#define AGPS_RIL_INTERFACE "agps_ril" + +/** Represents a location. */ +typedef struct { + /** set to sizeof(GpsLocation) */ + size_t size; + /** Contains GpsLocationFlags bits. */ + uint16_t flags; + /** Represents latitude in degrees. */ + double latitude; + /** Represents longitude in degrees. */ + double longitude; + /** Represents altitude in meters above the WGS 84 reference + * ellipsoid. */ + double altitude; + /** Represents speed in meters per second. */ + float speed; + /** Represents heading in degrees. */ + float bearing; + /** Represents expected accuracy in meters. */ + float accuracy; + /** Timestamp for the location fix. */ + GpsUtcTime timestamp; +} GpsLocation; + +/** Represents the status. */ +typedef struct { + /** set to sizeof(GpsStatus) */ + size_t size; + GpsStatusValue status; +} GpsStatus; + +/** Represents SV information. */ +typedef struct { + /** set to sizeof(GpsSvInfo) */ + size_t size; + /** Pseudo-random number for the SV. */ + int prn; + /** Signal to noise ratio. */ + float snr; + /** Elevation of SV in degrees. */ + float elevation; + /** Azimuth of SV in degrees. */ + float azimuth; + /** Unknown field in Samsung I9100 libgps + May be an indicator for constellation type + (GPS, GLONASS, Galileo)? + Used on GT-I9100, likely also present on GT-N7000, + SGH-I717, SGH-I727 but this needs confirmation. + */ + int unknown_samsung_field; +} GpsSvInfo; + +/** Represents SV status. */ +typedef struct { + /** set to sizeof(GpsSvStatus) */ + size_t size; + + /** Number of SVs currently visible. */ + int num_svs; + + /** Contains an array of SV information. */ + GpsSvInfo sv_list[GPS_MAX_SVS]; + + /** Represents a bit mask indicating which SVs + * have ephemeris data. + */ + uint32_t ephemeris_mask; + + /** Represents a bit mask indicating which SVs + * have almanac data. + */ + uint32_t almanac_mask; + + /** + * Represents a bit mask indicating which SVs + * were used for computing the most recent position fix. + */ + uint32_t used_in_fix_mask; +} GpsSvStatus; + +/* 2G and 3G */ +/* In 3G lac is discarded */ +typedef struct { + uint16_t type; + uint16_t mcc; + uint16_t mnc; + uint16_t lac; + uint32_t cid; +} AGpsRefLocationCellID; + +typedef struct { + uint8_t mac[6]; +} AGpsRefLocationMac; + +/** Represents ref locations */ +typedef struct { + uint16_t type; + union { + AGpsRefLocationCellID cellID; + AGpsRefLocationMac mac; + } u; +} AGpsRefLocation; + +/** Callback with location information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_location_callback)(GpsLocation* location); + +/** Callback with status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_status_callback)(GpsStatus* status); + +/** Callback with SV status information. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); + +/** Callback for reporting NMEA sentences. + * Can only be called from a thread created by create_thread_cb. + */ +typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length); + +/** Callback to inform framework of the GPS engine's capabilities. + * Capability parameter is a bit field of GPS_CAPABILITY_* flags. + */ +typedef void (* gps_set_capabilities)(uint32_t capabilities); + +/** Callback utility for acquiring the GPS wakelock. + * This can be used to prevent the CPU from suspending while handling GPS events. + */ +typedef void (* gps_acquire_wakelock)(); + +/** Callback utility for releasing the GPS wakelock. */ +typedef void (* gps_release_wakelock)(); + +/** Callback for requesting NTP time */ +typedef void (* gps_request_utc_time)(); + +/** Callback for creating a thread that can call into the Java framework code. + * This must be used to create any threads that report events up to the framework. + */ +typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg); + +/** GPS callback structure. */ +typedef struct { + /** set to sizeof(GpsCallbacks) */ + size_t size; + gps_location_callback location_cb; + gps_status_callback status_cb; + gps_sv_status_callback sv_status_cb; + gps_nmea_callback nmea_cb; + gps_set_capabilities set_capabilities_cb; + gps_acquire_wakelock acquire_wakelock_cb; + gps_release_wakelock release_wakelock_cb; + gps_create_thread create_thread_cb; + gps_request_utc_time request_utc_time_cb; +} GpsCallbacks; + + +/** Represents the standard GPS interface. */ +typedef struct { + /** set to sizeof(GpsInterface) */ + size_t size; + /** + * Opens the interface and provides the callback routines + * to the implemenation 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 implemenation of this interface. + */ + int (*init)( GpsXtraCallbacks* callbacks ); + /** Injects XTRA data into the GPS. */ + int (*inject_xtra_data)( char* data, int length ); +} GpsXtraInterface; + +/** Extended interface for DEBUG support. */ +typedef struct { + /** set to sizeof(GpsDebugInterface) */ + size_t size; + + /** + * This function should return any information that the native + * implementation wishes to include in a bugreport. + */ + size_t (*get_internal_state)(char* buffer, size_t bufferSize); +} GpsDebugInterface; + +/** Represents the status of AGPS. */ +typedef struct { + /** set to sizeof(AGpsStatus) */ + size_t size; + + AGpsType type; + AGpsStatusValue status; + uint32_t ipaddr; +} 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) */ + size_t size; + + /** + * Opens the AGPS interface and provides the callback routines + * to the implemenation 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; + + +/** 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 implemenation 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; + +__END_DECLS + +#endif /* ANDROID_INCLUDE_HARDWARE_GPS_H */ + diff --git a/overlay/include/hardware/gralloc.h b/overlay/include/hardware/gralloc.h new file mode 100644 index 0000000..8c4ac1b --- /dev/null +++ b/overlay/include/hardware/gralloc.h @@ -0,0 +1,273 @@ +/* + * 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 <system/window.h> +#include <hardware/hardware.h> + +#include <stdint.h> +#include <sys/cdefs.h> +#include <sys/types.h> + +#include <cutils/native_handle.h> + +#include <hardware/hardware.h> +#include <hardware/fb.h> + +__BEGIN_DECLS + +#define GRALLOC_API_VERSION 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 never written in software */ + GRALLOC_USAGE_SW_WRITE_RARELY = 0x00000020, + /* buffer is never 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 will be used with the HW video encoder */ + GRALLOC_USAGE_HW_VIDEO_ENCODER = 0x00010000, + /* mask for the software usage bit-mask */ + GRALLOC_USAGE_HW_MASK = 0x00011F00, + + /* 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, + + /* 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, + + /* SAMSUNG */ + GRALLOC_USAGE_HW_FIMC1 = 0x01000000, + GRALLOC_USAGE_HW_ION = 0x02000000, + GRALLOC_USAGE_YUV_ADDR = 0x04000000, + + /* SEC Private usage , for Overlay path at HWC */ + GRALLOC_USAGE_HWC_HWOVERLAY = 0x20000000, +}; + +/*****************************************************************************/ + +/** + * 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. + * + * 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 EXYNOS4210_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, ... ); + + /* reserved for future use */ + void* reserved_proc[7]; +} 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; + + /* + * (*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. + * + * 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/overlay/packages/apps/Camera/res/values/config.xml b/overlay/packages/apps/Camera/res/values/config.xml new file mode 100644 index 0000000..472a0b2 --- /dev/null +++ b/overlay/packages/apps/Camera/res/values/config.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2011, 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. +*/ +--> + +<resources> + <!-- Allows setting video size before recording starts --> + <bool name="needsEarlyVideoSize">true</bool> + <!-- Samsung Camcorder Mode --> + <bool name="needsSamsungCamMode">true</bool> + <!-- Samsung Camera Settings --> + <bool name="hasSamsungCamSettings">true</bool> +</resources> diff --git a/overlay/packages/apps/Phone/res/values/config.xml b/overlay/packages/apps/Phone/res/values/config.xml new file mode 100644 index 0000000..f788afe --- /dev/null +++ b/overlay/packages/apps/Phone/res/values/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2009 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. +--> + +<!-- Phone app resources that may need to be customized + for different hardware or product builds. --> +<resources> + <!-- Determines if device implements a noise suppression device for in call audio--> +<!-- <bool name="has_in_call_noise_suppression">true</bool> --> + + <!-- Audio parameter for setting noise suppression--> +<!-- <string name="in_call_noise_suppression_audioparameter">dualmic_enabled=true=false</string> --> +</resources> diff --git a/overlay/packages/apps/Settings/res/values/config.xml b/overlay/packages/apps/Settings/res/values/config.xml new file mode 100644 index 0000000..ab33e19 --- /dev/null +++ b/overlay/packages/apps/Settings/res/values/config.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2012 The CyanogenMod Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:xliff="urnasis:names:tc:xliff:document:1.2 "> + <!-- LED Flashlight --> +<!-- <bool name="has_led_flash">true</bool> --> + + <!-- Dock Settings --> +<!-- <bool name="has_dock_settings">true</bool> --> +</resources> diff --git a/overlay/packages/apps/Torch/res/values/config.xml b/overlay/packages/apps/Torch/res/values/config.xml new file mode 100644 index 0000000..86b2399 --- /dev/null +++ b/overlay/packages/apps/Torch/res/values/config.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2011, 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. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources> + + <!-- If there is no sysfs-based control mechanism, enable this --> + <bool name="useCameraInterface">true</bool> + +</resources> diff --git a/recovery.rc b/recovery.rc new file mode 100644 index 0000000..efaac10 --- /dev/null +++ b/recovery.rc @@ -0,0 +1,71 @@ +on early-init + start ueventd + +on init + export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin + export ANDROID_ROOT /system + export ANDROID_DATA /data + export ANDROID_CACHE /cache + export SECONDARY_STORAGE /emmc + export EXTERNAL_STORAGE /sdcard + + symlink /system/etc /etc + + mkdir /emmc + mkdir /sdcard + mkdir /usbdisk + mkdir /system + mkdir /data + mkdir /cache + mkdir /preload + mount /tmp /tmp tmpfs + +on boot +# Permissions for mDNIe + chown system media_rw /sys/class/mdnie/mdnie/mode + chown system media_rw /sys/class/mdnie/mdnie/outdoor + chown system media_rw /sys/class/mdnie/mdnie/scenario + write /sys/class/mdnie/mdnie/scenario 4 + + ifup lo + hostname localhost + domainname localdomain + + class_start default + +service ueventd /sbin/ueventd + critical + +service console /sbin/sh + class core + console + disabled + group log + +on property:ro.debuggable=1 + start console + +service recovery /sbin/recovery + +service adbd /sbin/adbd recovery + disabled + +# Always start adbd on userdebug and eng builds +# In recovery, always run adbd as root. +on property:ro.debuggable=1 + 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 adb + write /sys/class/android_usb/android0/enable 1 + 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 + start adbd + setprop service.adb.root 1 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + write /sys/class/android_usb/android0/enable 0 + restart adbd + write /sys/class/android_usb/android0/enable 1 diff --git a/recovery/graphics.c b/recovery/graphics.c new file mode 100644 index 0000000..6d60b27 --- /dev/null +++ b/recovery/graphics.c @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdbool.h> +#include <stdlib.h> +#include <unistd.h> + +#include <fcntl.h> +#include <stdio.h> + +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <sys/types.h> + +#include <linux/fb.h> +#include <linux/kd.h> + +#include <pixelflinger/pixelflinger.h> + +#ifdef BOARD_USE_CUSTOM_RECOVERY_FONT +#include BOARD_USE_CUSTOM_RECOVERY_FONT +#else +#include "font_10x18.h" +#endif + +#include "minui.h" + +#define PIXEL_FORMAT GGL_PIXEL_FORMAT_BGRA_8888 +#define PIXEL_SIZE 4 + +typedef struct { + GGLSurface texture; + unsigned cwidth; + unsigned cheight; + unsigned ascent; +} GRFont; + +static GRFont *gr_font = 0; +static GGLContext *gr_context = 0; +static GGLSurface gr_font_texture; +static GGLSurface gr_framebuffer[2]; +static GGLSurface gr_mem_surface; +static unsigned gr_active_fb = 0; + +static int gr_fb_fd = -1; +static int gr_vt_fd = -1; + +static struct fb_var_screeninfo vi; +static struct fb_fix_screeninfo fi; + +static int get_framebuffer(GGLSurface *fb) +{ + int fd; + void *bits; + + fd = open("/dev/graphics/fb0", O_RDWR); + if (fd < 0) { + perror("cannot open fb0"); + return -1; + } + + if (ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { + perror("failed to get fb0 info"); + close(fd); + return -1; + } + + vi.bits_per_pixel = PIXEL_SIZE * 8; + if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_BGRA_8888) { + vi.red.offset = 8; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 24; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; + } else if (PIXEL_FORMAT == GGL_PIXEL_FORMAT_RGBX_8888) { + vi.red.offset = 24; + vi.red.length = 8; + vi.green.offset = 16; + vi.green.length = 8; + vi.blue.offset = 8; + vi.blue.length = 8; + vi.transp.offset = 0; + vi.transp.length = 8; + } else { /* RGB565*/ + vi.red.offset = 11; + vi.red.length = 5; + vi.green.offset = 5; + vi.green.length = 6; + vi.blue.offset = 0; + vi.blue.length = 5; + vi.transp.offset = 0; + vi.transp.length = 0; + } + if (ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { + perror("failed to put fb0 info"); + close(fd); + return -1; + } + + if (ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { + perror("failed to get fb0 info"); + close(fd); + return -1; + } + + bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (bits == MAP_FAILED) { + perror("failed to mmap framebuffer"); + close(fd); + return -1; + } + + fb->version = sizeof(*fb); + fb->width = vi.xres; + fb->height = vi.yres; + fb->stride = fi.line_length/PIXEL_SIZE; + fb->data = bits; + fb->format = PIXEL_FORMAT; + memset(fb->data, 0, vi.yres * fi.line_length); + + fb++; + + fb->version = sizeof(*fb); + fb->width = vi.xres; + fb->height = vi.yres; + fb->stride = fi.line_length/PIXEL_SIZE; + fb->data = (void*) (((unsigned) bits) + vi.yres * fi.line_length); + fb->format = PIXEL_FORMAT; + memset(fb->data, 0, vi.yres * fi.line_length); + + return fd; +} + +static void get_memory_surface(GGLSurface* ms) { + ms->version = sizeof(*ms); + ms->width = vi.xres; + ms->height = vi.yres; + ms->stride = fi.line_length/PIXEL_SIZE; + ms->data = malloc(fi.line_length * vi.yres); + ms->format = PIXEL_FORMAT; +} + +static void set_active_framebuffer(unsigned n) +{ + if (n > 1) return; + vi.yres_virtual = vi.yres * PIXEL_SIZE; + vi.yoffset = n * vi.yres; + vi.bits_per_pixel = PIXEL_SIZE * 8; + if (ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) { + perror("active fb swap failed"); + } +} + +void gr_flip(void) +{ + GGLContext *gl = gr_context; + + /* swap front and back buffers */ + gr_active_fb = (gr_active_fb + 1) & 1; + + /* copy data from the in-memory surface to the buffer we're about + * to make active. */ + memcpy(gr_framebuffer[gr_active_fb].data, gr_mem_surface.data, + fi.line_length * vi.yres); + + /* inform the display driver */ + set_active_framebuffer(gr_active_fb); +} + +void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + GGLContext *gl = gr_context; + GGLint color[4]; + color[0] = ((r << 8) | r) + 1; + color[1] = ((g << 8) | g) + 1; + color[2] = ((b << 8) | b) + 1; + color[3] = ((a << 8) | a) + 1; + gl->color4xv(gl, color); +} + +int gr_measure(const char *s) +{ + return gr_font->cwidth * strlen(s); +} + +void gr_font_size(int *x, int *y) +{ + *x = gr_font->cwidth; + *y = gr_font->cheight; +} + +int gr_text(int x, int y, const char *s) +{ + GGLContext *gl = gr_context; + GRFont *font = gr_font; + unsigned off; + + y -= font->ascent; + + gl->bindTexture(gl, &font->texture); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + + while((off = *s++)) { + off -= 32; + if (off < 96) { + gl->texCoord2i(gl, (off * font->cwidth) - x, 0 - y); + gl->recti(gl, x, y, x + font->cwidth, y + font->cheight); + } + x += font->cwidth; + } + + return x; +} + +void gr_fill(int x, int y, int w, int h) +{ + GGLContext *gl = gr_context; + gl->disable(gl, GGL_TEXTURE_2D); + gl->recti(gl, x, y, w, h); +} + +void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { + if (gr_context == NULL) { + return; + } + GGLContext *gl = gr_context; + + gl->bindTexture(gl, (GGLSurface*) source); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->enable(gl, GGL_TEXTURE_2D); + gl->texCoord2i(gl, sx - dx, sy - dy); + gl->recti(gl, dx, dy, dx + w, dy + h); +} + +unsigned int gr_get_width(gr_surface surface) { + if (surface == NULL) { + return 0; + } + return ((GGLSurface*) surface)->width; +} + +unsigned int gr_get_height(gr_surface surface) { + if (surface == NULL) { + return 0; + } + return ((GGLSurface*) surface)->height; +} + +static void gr_init_font(void) +{ + GGLSurface *ftex; + unsigned char *bits, *rle; + unsigned char *in, data; + + gr_font = calloc(sizeof(*gr_font), 1); + ftex = &gr_font->texture; + + bits = malloc(font.width * font.height); + + ftex->version = sizeof(*ftex); + ftex->width = font.width; + ftex->height = font.height; + ftex->stride = font.width; + ftex->data = (void*) bits; + ftex->format = GGL_PIXEL_FORMAT_A_8; + + in = font.rundata; + while((data = *in++)) { + memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); + bits += (data & 0x7f); + } + + gr_font->cwidth = font.cwidth; + gr_font->cheight = font.cheight; + gr_font->ascent = font.cheight - 2; +} + +int gr_init(void) +{ + gglInit(&gr_context); + GGLContext *gl = gr_context; + + gr_init_font(); + gr_vt_fd = open("/dev/tty0", O_RDWR | O_SYNC); + if (gr_vt_fd < 0) { + // This is non-fatal; post-Cupcake kernels don't have tty0. + perror("can't open /dev/tty0"); + } else if (ioctl(gr_vt_fd, KDSETMODE, (void*) KD_GRAPHICS)) { + // However, if we do open tty0, we expect the ioctl to work. + perror("failed KDSETMODE to KD_GRAPHICS on tty0"); + gr_exit(); + return -1; + } + + gr_fb_fd = get_framebuffer(gr_framebuffer); + if (gr_fb_fd < 0) { + gr_exit(); + return -1; + } + + get_memory_surface(&gr_mem_surface); + + fprintf(stderr, "framebuffer: fd %d (%d x %d)\n", + gr_fb_fd, gr_framebuffer[0].width, gr_framebuffer[0].height); + + /* start with 0 as front (displayed) and 1 as back (drawing) */ + gr_active_fb = 0; + set_active_framebuffer(0); + gl->colorBuffer(gl, &gr_mem_surface); + + gl->activeTexture(gl, 0); + gl->enable(gl, GGL_BLEND); + gl->blendFunc(gl, GGL_SRC_ALPHA, GGL_ONE_MINUS_SRC_ALPHA); + + gr_fb_blank(true); + gr_fb_blank(false); + + return 0; +} + +void gr_exit(void) +{ + close(gr_fb_fd); + gr_fb_fd = -1; + + free(gr_mem_surface.data); + + ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT); + close(gr_vt_fd); + gr_vt_fd = -1; +} + +int gr_fb_width(void) +{ + return gr_framebuffer[0].width; +} + +int gr_fb_height(void) +{ + return gr_framebuffer[0].height; +} + +gr_pixel *gr_fb_data(void) +{ + return (unsigned short *) gr_mem_surface.data; +} + +void gr_fb_blank(bool blank) +{ + int ret; + + ret = ioctl(gr_fb_fd, FBIOBLANK, blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK); + if (ret < 0) + perror("ioctl(): blank"); +} diff --git a/recovery/recovery_keys.c b/recovery/recovery_keys.c new file mode 100644 index 0000000..528a796 --- /dev/null +++ b/recovery/recovery_keys.c @@ -0,0 +1,62 @@ +#include <linux/input.h> + +#include "recovery_ui.h" +#include "common.h" +#include "extendedcommands.h" + + +int device_toggle_display(volatile char* key_pressed, int key_code) { + int alt = key_pressed[KEY_LEFTALT] || key_pressed[KEY_RIGHTALT]; + if (alt && key_code == KEY_L) + return 1; + // allow toggling of the display if the correct key is pressed, and the display toggle is allowed or the display is currently off + if (ui_get_showing_back_button()) { + return 0; + //return get_allow_toggle_display() && (key_code == KEY_HOME || key_code == KEY_MENU || key_code == KEY_END); + } + return get_allow_toggle_display() && (key_code == KEY_HOMEPAGE || key_code == KEY_MENU || key_code == KEY_POWER || key_code == KEY_END); +} + +int device_handle_key(int key_code, int visible) { + if (visible) { + switch (key_code) { + case KEY_CAPSLOCK: + case KEY_DOWN: + case KEY_VOLUMEDOWN: + return HIGHLIGHT_DOWN; + case KEY_MENU: + return NO_ACTION; + case KEY_LEFTSHIFT: + case KEY_UP: + case KEY_VOLUMEUP: + return HIGHLIGHT_UP; + case KEY_HOMEPAGE: + if (ui_get_showing_back_button()) { + return SELECT_ITEM; + } + if (!get_allow_toggle_display()) + return GO_BACK; + break; + case KEY_POWER: + if (ui_get_showing_back_button()) { + return SELECT_ITEM; + } + if (!get_allow_toggle_display()) + return GO_BACK; + break; + case KEY_LEFTBRACE: + case KEY_ENTER: + case BTN_MOUSE: + case KEY_CAMERA: + case KEY_F21: + case KEY_SEND: + case KEY_END: + case KEY_BACKSPACE: + case KEY_SEARCH: + case KEY_BACK: + return GO_BACK; + } + } + + return NO_ACTION; +} diff --git a/releasetools/galaxys2_common.py b/releasetools/galaxys2_common.py new file mode 100755 index 0000000..93f1b8e --- /dev/null +++ b/releasetools/galaxys2_common.py @@ -0,0 +1,31 @@ +# +# 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. + +import os, sys + +LOCAL_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +RELEASETOOLS_DIR = os.path.abspath(os.path.join(LOCAL_DIR, '../../../build/tools/releasetools')) + +# Add releasetools directory to python path +sys.path.append(RELEASETOOLS_DIR) + +from common import * + +def load_module_from_file(module_name, filename): + import imp + f = open(filename, 'r') + module = imp.load_module(module_name, f, filename, ('', 'U', 1)) + f.close() + return module diff --git a/releasetools/galaxys2_edify_generator.py b/releasetools/galaxys2_edify_generator.py new file mode 100755 index 0000000..95bdf48 --- /dev/null +++ b/releasetools/galaxys2_edify_generator.py @@ -0,0 +1,46 @@ +# +# 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. + +import os, sys + +LOCAL_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +RELEASETOOLS_DIR = os.path.abspath(os.path.join(LOCAL_DIR, '../../../build/tools/releasetools')) + +import edify_generator + +class EdifyGenerator(edify_generator.EdifyGenerator): + def UnpackPackageFile(self, src, dst): + """Unpack a given file from the OTA package into the given + destination file.""" + self.script.append('package_extract_file("%s", "%s");' % (src, dst)) + + def EMMCWriteRawImage(self, partition, image): + """Write the given package file into the given partition.""" + + args = {'partition': partition, 'image': image} + + self.script.append( + ('assert(package_extract_file("%(image)s", "/tmp/%(image)s"),\n' + ' write_raw_image("/tmp/%(image)s", "%(partition)s"),\n' + ' delete("/tmp/%(image)s"));') % args) + + def Unmount(self, mount_point): + """Unmount the partition with the given mount_point.""" + fstab = self.info.get("fstab", None) + if fstab: + p = fstab[mount_point] + self.script.append('unmount("%s");' % + (p.mount_point)) + self.mounts.add(p.mount_point) diff --git a/releasetools/galaxys2_img_from_target_files b/releasetools/galaxys2_img_from_target_files new file mode 100755 index 0000000..240de1b --- /dev/null +++ b/releasetools/galaxys2_img_from_target_files @@ -0,0 +1,185 @@ +#!/usr/bin/env python +# +# 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. + +""" +Given a target-files zipfile, produces an image zipfile suitable for +use with 'fastboot update'. + +Usage: img_from_target_files [flags] input_target_files output_image_zip + + -b (--board_config) <file> + Deprecated. + +""" + +import sys + +if sys.hexversion < 0x02040000: + print >> sys.stderr, "Python 2.4 or newer is required." + sys.exit(1) + +import errno +import os +import re +import shutil +import subprocess +import tempfile +import zipfile + +# missing in Python 2.4 and before +if not hasattr(os, "SEEK_SET"): + os.SEEK_SET = 0 + +import galaxys2_common as common + +OPTIONS = common.OPTIONS + +def AddUserdata(output_zip): + """Create an empty userdata image and store it in output_zip.""" + + print "creating userdata.img..." + + # The name of the directory it is making an image out of matters to + # mkyaffs2image. So we create a temp dir, and within it we create an + # empty dir named "data", and build the image from that. + temp_dir = tempfile.mkdtemp() + user_dir = os.path.join(temp_dir, "data") + os.mkdir(user_dir) + img = tempfile.NamedTemporaryFile() + + build_command = [] + if OPTIONS.info_dict["fstab"]["/data"].fs_type.startswith("ext"): + build_command = ["mkuserimg.sh", + user_dir, img.name, + OPTIONS.info_dict["fstab"]["/data"].fs_type, "data"] + if "userdata_size" in OPTIONS.info_dict: + build_command.append(str(OPTIONS.info_dict["userdata_size"])) + else: + build_command = ["mkyaffs2image", "-f"] + extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None) + if extra: + build_command.extend(extra.split()) + build_command.append(user_dir) + build_command.append(img.name) + + p = common.Run(build_command) + p.communicate() + assert p.returncode == 0, "build userdata.img image failed" + + common.CheckSize(img.name, "userdata.img", OPTIONS.info_dict) + output_zip.write(img.name, "userdata.img") + img.close() + os.rmdir(user_dir) + os.rmdir(temp_dir) + + +def AddSystem(output_zip): + """Turn the contents of SYSTEM into a system image and store it in + output_zip.""" + + print "creating system.img..." + + img = tempfile.NamedTemporaryFile() + + # The name of the directory it is making an image out of matters to + # mkyaffs2image. It wants "system" but we have a directory named + # "SYSTEM", so create a symlink. + try: + os.symlink(os.path.join(OPTIONS.input_tmp, "SYSTEM"), + os.path.join(OPTIONS.input_tmp, "system")) + except OSError, e: + if (e.errno == errno.EEXIST): + pass + + build_command = [] + if OPTIONS.info_dict["fstab"]["/system"].fs_type.startswith("ext"): + build_command = ["mkuserimg.sh", + os.path.join(OPTIONS.input_tmp, "system"), img.name, + OPTIONS.info_dict["fstab"]["/system"].fs_type, "system"] + if "system_size" in OPTIONS.info_dict: + build_command.append(str(OPTIONS.info_dict["system_size"])) + else: + build_command = ["mkyaffs2image", "-f"] + extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None) + if extra: + build_command.extend(extra.split()) + build_command.append(os.path.join(OPTIONS.input_tmp, "system")) + build_command.append(img.name) + + p = common.Run(build_command) + p.communicate() + assert p.returncode == 0, "build system.img image failed" + + img.seek(os.SEEK_SET, 0) + data = img.read() + img.close() + + common.CheckSize(data, "system.img", OPTIONS.info_dict) + common.ZipWriteStr(output_zip, "system.img", data) + + +def CopyInfo(output_zip): + """Copy the android-info.txt file from the input to the output.""" + output_zip.write(os.path.join(OPTIONS.input_tmp, "OTA", "android-info.txt"), + "android-info.txt") + + +def main(argv): + + def option_handler(o, a): + if o in ("-b", "--board_config"): + pass # deprecated + else: + return False + return True + + args = common.ParseOptions(argv, __doc__, + extra_opts="b:", + extra_long_opts=["board_config="], + extra_option_handler=option_handler) + + if len(args) != 2: + common.Usage(__doc__) + sys.exit(1) + + OPTIONS.input_tmp = common.UnzipTemp(args[0]) + + input_zip = zipfile.ZipFile(args[0], "r") + OPTIONS.info_dict = common.LoadInfoDict(input_zip) + + output_zip = zipfile.ZipFile(args[1], "w", compression=zipfile.ZIP_DEFLATED) + + common.AddBoot(output_zip, OPTIONS.info_dict) + common.AddRecovery(output_zip, OPTIONS.info_dict) + AddSystem(output_zip) + AddUserdata(output_zip) + CopyInfo(output_zip) + + print "cleaning up..." + output_zip.close() + shutil.rmtree(OPTIONS.input_tmp) + + print "done." + + +if __name__ == '__main__': + try: + main(sys.argv[1:]) + except common.ExternalError, e: + print + print " ERROR: %s" % (e,) + print + sys.exit(1) diff --git a/releasetools/galaxys2_ota_from_target_files b/releasetools/galaxys2_ota_from_target_files new file mode 100755 index 0000000..7a41ec6 --- /dev/null +++ b/releasetools/galaxys2_ota_from_target_files @@ -0,0 +1,118 @@ +#!/usr/bin/env python +# +# 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. + +import sys +import os +import galaxys2_common as common + +LOCAL_DIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +RELEASETOOLS_DIR = os.path.abspath(os.path.join(LOCAL_DIR, '../../../build/tools/releasetools')) +TARGET_DIR = os.getenv('OUT') + +# Add releasetools directory to python path +sys.path.append(RELEASETOOLS_DIR) + +# Import the existing file so we just have to rewrite the modules we need. +# This is a nasty hack as the filename doesn't end in .py, but it works +filename = os.path.join(RELEASETOOLS_DIR, "ota_from_target_files") +ota_from_target_files = common.load_module_from_file('ota_from_target_files', filename) + +from ota_from_target_files import * +import galaxys2_edify_generator as edify_generator + +__doc__ = ota_from_target_files.__doc__ + +def CopyBootFiles(input_zip, output_zip): + output_zip.write(os.path.join(TARGET_DIR, "boot.img"),"boot.img") + +def WriteFullOTAPackage(input_zip, output_zip): + # TODO: how to determine this? We don't know what version it will + # be installed on top of. For now, we expect the API just won't + # change very often. + script = edify_generator.EdifyGenerator(3, OPTIONS.info_dict) + + metadata = {"post-build": GetBuildProp("ro.build.fingerprint", input_zip), + "pre-device": GetBuildProp("ro.product.device", input_zip), + "post-timestamp": GetBuildProp("ro.build.date.utc", input_zip), + } + + device_specific = common.DeviceSpecificParams( + input_zip=input_zip, + input_version=OPTIONS.info_dict["recovery_api_version"], + output_zip=output_zip, + script=script, + input_tmp=OPTIONS.input_tmp, + metadata=metadata, + info_dict=OPTIONS.info_dict) + + AppendAssertions(script, input_zip) + device_specific.FullOTA_Assertions() + if OPTIONS.backuptool: + script.RunBackup("backup") + + script.ShowProgress(0.5, 0) + + if OPTIONS.wipe_user_data: + script.FormatPartition("/data") + + script.Unmount("/system") + script.FormatPartition("/system") + script.Mount("/system") + script.UnpackPackageDir("recovery", "/system") + script.UnpackPackageDir("system", "/system") + + symlinks = CopySystemFiles(input_zip, output_zip) + script.MakeSymlinks(symlinks) + + CopyBootFiles(input_zip, output_zip) + + Item.GetMetadata(input_zip) + Item.Get("system").SetPermissions(script) + + script.ShowProgress(0.2, 0) + + if OPTIONS.backuptool: + script.ShowProgress(0.2, 10) + script.RunBackup("restore") + + script.ShowProgress(0.2, 10) + script.EMMCWriteRawImage("/dev/block/mmcblk0p5", "boot.img") + + script.ShowProgress(0.1, 0) + device_specific.FullOTA_InstallEnd() + + if OPTIONS.extra_script is not None: + script.AppendExtra(OPTIONS.extra_script) + + script.UnmountAll() + script.AddToZip(input_zip, output_zip) + WriteMetadata(metadata, output_zip) +ota_from_target_files.WriteFullOTAPackage = WriteFullOTAPackage + + +def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): + print "Incremental OTA Packages are not support on the galaxys2 at this time" + sys.exit(1) +ota_from_target_files.WriteIncrementalOTAPackage = WriteIncrementalOTAPackage + +if __name__ == '__main__': + try: + main(sys.argv[1:]) + except common.ExternalError, e: + print + print " ERROR: %s" % (e,) + print + sys.exit(1) diff --git a/res/charger/battery_0.png b/res/charger/battery_0.png Binary files differnew file mode 100644 index 0000000..38b888c --- /dev/null +++ b/res/charger/battery_0.png diff --git a/res/charger/battery_1.png b/res/charger/battery_1.png Binary files differnew file mode 100644 index 0000000..03f4226 --- /dev/null +++ b/res/charger/battery_1.png diff --git a/res/charger/battery_2.png b/res/charger/battery_2.png Binary files differnew file mode 100644 index 0000000..296959e --- /dev/null +++ b/res/charger/battery_2.png diff --git a/res/charger/battery_3.png b/res/charger/battery_3.png Binary files differnew file mode 100644 index 0000000..97a5dfd --- /dev/null +++ b/res/charger/battery_3.png diff --git a/res/charger/battery_4.png b/res/charger/battery_4.png Binary files differnew file mode 100644 index 0000000..63865c2 --- /dev/null +++ b/res/charger/battery_4.png diff --git a/res/charger/battery_5.png b/res/charger/battery_5.png Binary files differnew file mode 100644 index 0000000..eec62b0 --- /dev/null +++ b/res/charger/battery_5.png diff --git a/res/charger/battery_charge.png b/res/charger/battery_charge.png Binary files differnew file mode 100644 index 0000000..c1d2856 --- /dev/null +++ b/res/charger/battery_charge.png diff --git a/res/charger/battery_fail.png b/res/charger/battery_fail.png Binary files differnew file mode 100644 index 0000000..9099d02 --- /dev/null +++ b/res/charger/battery_fail.png diff --git a/shbootimg.mk b/shbootimg.mk new file mode 100644 index 0000000..a83532f --- /dev/null +++ b/shbootimg.mk @@ -0,0 +1,34 @@ +# +# Copyright (C) 2012 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_PATH := $(call my-dir) + +INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img + +uncompressed_ramdisk := $(PRODUCT_OUT)/ramdisk.cpio +$(uncompressed_ramdisk): $(INSTALLED_RAMDISK_TARGET) + zcat $< > $@ + +TARGET_KERNEL_BINARIES: $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL) $(recovery_uncompressed_ramdisk) $(uncompressed_ramdisk) + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE) + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) modules + $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(TARGET_ARCH) $(ARM_CROSS_COMPILE) modules_install + +$(INSTALLED_BOOTIMAGE_TARGET): $(INSTALLED_KERNEL_TARGET) + $(ACP) -fp $< $@ + +$(INSTALLED_RECOVERYIMAGE_TARGET): $(INSTALLED_KERNEL_TARGET) + $(ACP) -fp $< $@ diff --git a/surfaceflinger_client/Android.mk b/surfaceflinger_client/Android.mk new file mode 100644 index 0000000..94cc83f --- /dev/null +++ b/surfaceflinger_client/Android.mk @@ -0,0 +1,11 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := \ + surfaceflinger_client.cpp + +LOCAL_SHARED_LIBRARIES := + +LOCAL_MODULE:= libsurfaceflinger_client + +include $(BUILD_SHARED_LIBRARY) diff --git a/surfaceflinger_client/surfaceflinger_client.cpp b/surfaceflinger_client/surfaceflinger_client.cpp new file mode 100644 index 0000000..e245e6e --- /dev/null +++ b/surfaceflinger_client/surfaceflinger_client.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2012, The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class SkDeviceFactory; +class SkBitmap; +class SkCanvas; +class SkPaint; + +class SkTextBox { +public: + SkTextBox(); + + enum Mode { + kOneLine_Mode, + kLineBreak_Mode, + + kModeCount + }; + + enum SpacingAlign { + kStart_SpacingAlign, + kCenter_SpacingAlign, + kEnd_SpacingAlign, + + kSpacingAlignCount + }; +}; + +typedef float SkScalar; + +extern "C" void _ZN8SkCanvasC1EP15SkDeviceFactory(SkDeviceFactory* factory) { +} + +extern "C" void _ZN8SkCanvas15setBitmapDeviceERK8SkBitmapb(const SkBitmap& bitmap, bool forLayer) { +} + +extern "C" void _ZN9SkTextBoxC1Ev() { +} + +extern "C" void _ZN9SkTextBox7setModeENS_4ModeE(SkTextBox::Mode) { +} + +extern "C" void _ZN9SkTextBox15setSpacingAlignENS_12SpacingAlignE(SkTextBox::SpacingAlign) { +} + +extern "C" void _ZN9SkTextBox6setBoxEffff(SkScalar left, SkScalar top, SkScalar right, SkScalar bottom) { +} + +extern "C" void _ZN9SkTextBox10setSpacingEff(SkScalar left, SkScalar right) { +} + +extern "C" void _ZN9SkTextBox4drawEP8SkCanvasPKcjRK7SkPaint(SkCanvas*, char const* foo1, unsigned int foo2, SkPaint const&) { +} diff --git a/tvout/Android.mk b/tvout/Android.mk new file mode 100644 index 0000000..c73e1cf --- /dev/null +++ b/tvout/Android.mk @@ -0,0 +1,16 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := TvOut +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) + +# Use the folloing include to make our test apk. +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tvout/AndroidManifest.xml b/tvout/AndroidManifest.xml new file mode 100644 index 0000000..79d5745 --- /dev/null +++ b/tvout/AndroidManifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.teamhacksung.tvout" android:versionCode="1" + android:versionName="1.0"> + + <application android:label="TvOut"> + + <service android:exported="false" android:enabled="true" + android:name=".TvOutService"> + </service> + + <receiver android:name=".BootCompletedReceiver"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </receiver> + + </application> + + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission> + <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission> + <uses-permission android:name="android.permission.FACTORY_TEST"></uses-permission> +</manifest> diff --git a/tvout/proguard.flags b/tvout/proguard.flags new file mode 100644 index 0000000..3725966 --- /dev/null +++ b/tvout/proguard.flags @@ -0,0 +1 @@ +-dontshrink diff --git a/tvout/src/android/hardware/Tvout.java b/tvout/src/android/hardware/Tvout.java new file mode 100644 index 0000000..f2fc3a8 --- /dev/null +++ b/tvout/src/android/hardware/Tvout.java @@ -0,0 +1,102 @@ +package android.hardware; + +import android.util.Log; + +public class Tvout { + private static final String TAG = "Tvout_java"; + + static { + System.loadLibrary("tvout_jni"); + } + + public Tvout() { + Log.i(TAG, "Tvout Initializing"); + _native_setup(); + } + + private native boolean _TvoutGetCableStatus(); + + private native boolean _TvoutGetStatus(); + + private native boolean _TvoutGetSubtitleStatus(); + + private native boolean _TvoutGetSuspendStatus(); + + private native boolean _TvoutPostSubtitle(String string, int param); + + private native boolean _TvoutPostSuspend(String string); + + private native boolean _TvoutSetCableStatus(boolean connected); + + private native boolean _TvoutSetOutputMode(int mode); + + private native boolean _TvoutSetResolution(int resolution); + + private native boolean _TvoutSetStatus(boolean enabled); + + private native boolean _TvoutSetSubtitleStatus(boolean enabled); + + private native boolean _TvoutSetSuspendStatus(boolean enabled); + + private native boolean _TvoutSetDefaultString(String string); + + private final native void _native_setup(); + + private final native void _release(); + + public boolean getCableStatus() { + return _TvoutGetCableStatus(); + } + + public boolean getStatus() { + return _TvoutGetStatus(); + } + + public boolean getSubtitleStatus() { + return _TvoutGetSubtitleStatus(); + } + + public boolean getSuspendStatus() { + return _TvoutGetSuspendStatus(); + } + + public boolean postSubtitle(String string, int paramInt) { + return _TvoutPostSubtitle(string, paramInt); + } + + public boolean postSuspend(String string) { + return _TvoutPostSuspend(string); + } + + public boolean setCableStatus(boolean connected) { + return _TvoutSetCableStatus(connected); + } + + public boolean setOutputMode(int mode) { + return _TvoutSetOutputMode(mode); + } + + public boolean setResolution(int resolution) { + return _TvoutSetResolution(resolution); + } + + public boolean setStatus(boolean enabled) { + return _TvoutSetStatus(enabled); + } + + public boolean setSubtitleStatus(boolean enabled) { + return _TvoutSetSubtitleStatus(enabled); + } + + public boolean setSuspendStatus(boolean enabled) { + return _TvoutSetSuspendStatus(enabled); + } + + public boolean setDefaultString(String string) { + return _TvoutSetDefaultString(string); + } + + public void release() { + _release(); + } +} diff --git a/tvout/src/com/teamhacksung/tvout/BootCompletedReceiver.java b/tvout/src/com/teamhacksung/tvout/BootCompletedReceiver.java new file mode 100644 index 0000000..5ed6af6 --- /dev/null +++ b/tvout/src/com/teamhacksung/tvout/BootCompletedReceiver.java @@ -0,0 +1,12 @@ +package com.teamhacksung.tvout; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class BootCompletedReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + context.startService(new Intent(context, TvOutService.class)); + } +} diff --git a/tvout/src/com/teamhacksung/tvout/TvOutService.java b/tvout/src/com/teamhacksung/tvout/TvOutService.java new file mode 100644 index 0000000..b633b3d --- /dev/null +++ b/tvout/src/com/teamhacksung/tvout/TvOutService.java @@ -0,0 +1,116 @@ +package com.teamhacksung.tvout; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.Tvout; +import android.nfc.Tag; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +public class TvOutService extends Service { + + public static final String TAG = "TvOutService_java"; + + private Tvout mTvOut; + private boolean mWasOn = false; // For enabling on screen on + + private BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_HDMI_AUDIO_PLUG.equals(action)) { + getTvoutInstance(); + int state = intent.getIntExtra("state", 0); + if (state == 1 && !mTvOut.getStatus()) { + // Enable when cable is plugged + Log.i(TAG, "HDMI plugged"); + mWasOn = false; + enable(); + } else if (mTvOut.getStatus()) { + // Disable when cable is unplugged + Log.i(TAG, "HDMI unplugged"); + mWasOn = false; + disable(); + releaseTvout(); + } + } else if (Intent.ACTION_SCREEN_ON.equals(action)) { + if (mTvOut != null && mWasOn) { + Log.i(TAG, "Screen On - Resume TvOut stream"); + mWasOn = false; + mTvOut.setSuspendStatus(false); + } + } else if (Intent.ACTION_SCREEN_OFF.equals(action)) { + if (mTvOut != null && mTvOut.getStatus()) { + Log.i(TAG, "Screen Off - Pausing TvOut stream"); + mWasOn = true; + mTvOut.setSuspendStatus(true); + } + } + } + + }; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + IntentFilter filter = new IntentFilter(Intent.ACTION_HDMI_AUDIO_PLUG); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_SCREEN_ON); + registerReceiver(mReceiver, filter); + Log.i(TAG, "Registered Receiver"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return START_STICKY; + } + + private boolean getTvoutInstance() { + if (mTvOut != null) return true; + + try { + mTvOut = new Tvout(); + } catch (Exception e) { + return false; + } + + return true; + } + + private void releaseTvout() { + if (mTvOut != null) { + mTvOut.release(); + mTvOut = null; + } + } + + @Override + public void onDestroy() { + unregisterReceiver(mReceiver); + releaseTvout(); + super.onDestroy(); + } + + private void enable() { + if (mTvOut == null) return; + mTvOut.setStatus(true); + mTvOut.setCableStatus(true); + mTvOut.setSuspendStatus(false); + } + + private void disable() { + if (mTvOut == null) return; + mTvOut.setStatus(false); + mTvOut.setCableStatus(false); + } + +} diff --git a/ueventd.smdk4210.rc b/ueventd.smdk4210.rc new file mode 100644 index 0000000..d151e47 --- /dev/null +++ b/ueventd.smdk4210.rc @@ -0,0 +1,33 @@ +/dev/mali 0666 system system +/dev/ump 0666 system graphics +/dev/exynos-mem 0666 system graphics +/dev/s3c-mem 0666 system system +/dev/s3c-mfc 0666 system graphics +/dev/s5p-mfc 0666 system graphics +/dev/video0 0666 system m2m +/dev/video1 0666 system camera +/dev/video2 0666 system m2m +/dev/video3 0666 system m2m +/dev/video4 0666 system m2m +/dev/s5p-jpeg 0666 system camera +/dev/video14 0666 system system +/dev/video21 0666 system system +/dev/pmem 0660 system graphics +/dev/pmem_gpu1 0660 system graphics +# logger should be world writable (for logging) but not readable +/dev/log/* 0662 root log +/dev/i2c-7 0666 system system +/dev/CEC 0666 system system +/dev/HPD 0666 system system +/dev/fimg2d 0666 system graphics +/dev/fmradio 0660 system audio +/dev/input/* 0660 root input +/dev/srp 0666 system audio +/dev/srp_ctrl 0666 system audio +/dev/umts* 0660 system radio +/dev/link_pm 0660 system radio +/dev/block/mmcblk0p8 0660 system radio +/dev/akm8975 0660 system system +/dev/accelerometer 0660 system system +/dev/graphics/fb0 0777 root graphics +/dev/rfkill 0666 root root |