3
0

initial commit

This commit is contained in:
Daniel Hillenbrand 2012-07-25 04:32:16 +02:00
commit 51841ab0c5
75 changed files with 7413 additions and 0 deletions

23
Android.mk Normal file
View File

@ -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

149
BoardCommonConfig.mk Normal file
View File

@ -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

15
camera/Android.mk Normal file
View File

@ -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)

585
camera/CameraWrapper.cpp Normal file
View File

@ -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);
}

184
common.mk Normal file
View File

@ -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

61
configs/asound.conf Normal file
View File

@ -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
}

118
configs/bcmdhd.cal Normal file
View File

@ -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

1
configs/egl.cfg Normal file
View File

@ -0,0 +1 @@
0 1 mali

6
configs/gps.conf Normal file
View File

@ -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

109
configs/media_codecs.xml Normal file
View File

@ -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>

497
configs/media_profiles.xml Normal file
View File

@ -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>

38
configs/sirfgps.conf Normal file
View File

@ -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

132
configs/spn-conf.xml Normal file
View File

@ -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>

22
configs/vold.fstab Normal file
View File

@ -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

View File

@ -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

21
gpswrapper/Android.mk Executable file
View File

@ -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)

View File

203
gpswrapper/gps.c Normal file
View File

@ -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,
};

415
init.smdk4210.rc Normal file
View File

@ -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

89
init.smdk4210.usb.rc Normal file
View File

@ -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

331
libsensors/AkmSensor.cpp Normal file
View File

@ -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;
}
}

64
libsensors/AkmSensor.h Normal file
View File

@ -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

45
libsensors/Android.mk Normal file
View File

@ -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

185
libsensors/GyroSensor.cpp Normal file
View File

@ -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;
}

55
libsensors/GyroSensor.h Normal file
View File

@ -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

View File

@ -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;
}
}

View File

@ -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

160
libsensors/LightSensor.cpp Normal file
View File

@ -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;
}

55
libsensors/LightSensor.h Normal file
View File

@ -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

View File

View File

@ -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;
}

View File

@ -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

128
libsensors/SensorBase.cpp Normal file
View File

@ -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;
}

65
libsensors/SensorBase.h Normal file
View File

@ -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

51
libsensors/ak8973b.h Normal file
View File

@ -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

326
libsensors/sensors.cpp Normal file
View File

@ -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;
}

144
libsensors/sensors.h Normal file
View File

@ -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

64
lpm.rc Normal file
View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 */

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

71
recovery.rc Normal file
View File

@ -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

376
recovery/graphics.c Normal file
View File

@ -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");
}

62
recovery/recovery_keys.c Normal file
View File

@ -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;
}

31
releasetools/galaxys2_common.py Executable file
View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

BIN
res/charger/battery_0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
res/charger/battery_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
res/charger/battery_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
res/charger/battery_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
res/charger/battery_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
res/charger/battery_5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

34
shbootimg.mk Normal file
View File

@ -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 $< $@

View File

@ -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)

View File

@ -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&) {
}

16
tvout/Android.mk Normal file
View File

@ -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))

24
tvout/AndroidManifest.xml Normal file
View File

@ -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>

1
tvout/proguard.flags Normal file
View File

@ -0,0 +1 @@
-dontshrink

View File

@ -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();
}
}

View File

@ -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));
}
}

View File

@ -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);
}
}

33
ueventd.smdk4210.rc Normal file
View File

@ -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