summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/drivers/input/sensor
diff options
context:
space:
mode:
Diffstat (limited to 'ANDROID_3.4.5/drivers/input/sensor')
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/Kconfig224
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/Makefile26
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Kconfig50
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Makefile13
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/Makefile6
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.c870
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.h105
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/Makefile6
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.c950
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.h187
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.c180
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.h43
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/Makefile6
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.c1134
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.h103
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/cm3232/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/cm3232/cm3232.c855
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/dmard06.c980
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.c68
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.h18
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.c1019
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.h75
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/Makefile35
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.c1685
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.h183
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.c1702
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.h192
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/isl29023.c1164
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/Makefile35
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.c2427
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.h85
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.c1798
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.h116
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/readme.txt47
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/Makefile5
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d.h108
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d_gyr.c1681
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0.c2580
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.c505
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.h219
-rw-r--r--ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/Makefile34
-rw-r--r--ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/mc3xxx.c2719
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.c1052
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.h106
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.c982
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.h107
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/Makefile4
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.c433
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.h60
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.c505
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.h91
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.c1151
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.h83
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/sensor.c114
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/sensor.h91
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk3310/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c644
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8312.h51
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8313.h52
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk831x.c3590
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/Makefile34
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.c1098
-rwxr-xr-xANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.h255
73 files changed, 0 insertions, 35149 deletions
diff --git a/ANDROID_3.4.5/drivers/input/sensor/Kconfig b/ANDROID_3.4.5/drivers/input/sensor/Kconfig
deleted file mode 100755
index cff1aa40..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/Kconfig
+++ /dev/null
@@ -1,224 +0,0 @@
-#
-# WMT Sensor configuration
-#
-menuconfig INPUT_SENSOR
- bool "WMT Sensor"
- default y
- help
- Say Y here, and a list of supported sensor will be displayed.
- This option doesn't affect the kernel.
-
- If unsure, say Y.
-
-if INPUT_SENSOR
-
-config WMT_SENSOR_KXTE9
- tristate "KXTE9 G-Sensor Support"
- depends on ARCH_WMT
- default n
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gsensor_mc3230.
-config WMT_SENSOR_KIONIX
- tristate "KIONIX G-Sensor Support"
- depends on ARCH_WMT
- default n
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gsensor_kionix.
-config WMT_SENSOR_MC3XXX
- tristate "Mcube G-Sensor Support"
- depends on ARCH_WMT
- default m
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gsensor_mc3xxx.
-
-config WMT_SENSOR_DMARD08
- tristate "DMARD08 G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmard08.
-config WMT_SENSOR_DMARD06
- tristate "DMARD06 G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmard06.
-config WMT_SENSOR_DMARD10
- tristate "DMARD10 G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmard10.
-config WMT_SENSOR_DMARD09
- tristate "DMARD09 G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmard09.
-config WMT_SENSOR_MXC622X
- tristate "MXC622X G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_mxc622x.
-config WMT_SENSOR_MMA7660
- tristate "MMA7660 G-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_mma7660.
-config WMT_SENSOR_MMC328x
- tristate "MMC328x M-Sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with m-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_mmc328x.
-config WMT_SENSOR_ISL29023
- tristate "ISL29023 Light sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with l-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_isl29023.
-config WMT_SENSOR_CM3232
- tristate "CM3232 Light sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with l-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_cm3232.
-config WMT_SENSOR_STK3310
- tristate "STK3310 Light sensor Support"
- depends on ARCH_WMT
- default y
- help
- Say Y here if you have an WMT based board with l-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_stk3310.
-config WMT_GYRO_L3G4200D
- tristate "L3G4200D Gyroscope Support"
- depends on ARCH_WMT
- default m
- help
- Say Y here if you have an WMT based board with ST L3g4200d
- gyroscope attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gyro_l3g4200d.
-
-config WMT_SENSOR_US5182
- tristate "US5182 Light&Promixity sensor Support"
- depends on ARCH_WMT
- default m
- help
- Say Y here if you have an WMT based board with l&p-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_lsensor_us5182.
-
-config WMT_SENSOR_MMA8452Q
- tristate "MMA8452Q G-Sensor Support"
- depends on ARCH_WMT
- default m
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gsensor_mma8542.
-
-config WMT_SENSOR_STK8312
- tristate "STK8312 G-Sensor Support"
- depends on ARCH_WMT
- default m
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called s_wmt_gsensor_STK8312.
-
-endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/Makefile
deleted file mode 100755
index cc06e871..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Makefile for the Sensor driver
-#
-
-# Each configuration option enables a list of files.
-
-#obj-$(CONFIG_INPUT_SENSOR) += gsensor.o
-obj-y += sensor.o
-obj-$(CONFIG_WMT_SENSOR_KXTE9) += kxte9_gsensor/
-obj-$(CONFIG_WMT_SENSOR_MC3XXX) += mc3xxx_gsensor/
-obj-$(CONFIG_WMT_SENSOR_DMARD08) += dmard08_gsensor/
-obj-$(CONFIG_WMT_SENSOR_DMARD06) += dmard06_gsensor/
-obj-$(CONFIG_WMT_SENSOR_MMA7660) += mma7660_gsensor/
-obj-$(CONFIG_WMT_SENSOR_ISL29023) += isl29023_lsensor/
-obj-$(CONFIG_WMT_SENSOR_CM3232) += cm3232/
-obj-$(CONFIG_WMT_SENSOR_CM3232) += stk3310/
-obj-$(CONFIG_WMT_SENSOR_DMARD10) += dmard10_gsensor/
-obj-$(CONFIG_WMT_SENSOR_DMARD09) += dmard09_gsensor/
-obj-$(CONFIG_WMT_SENSOR_MXC622X) += mxc622x_gsensor/
-obj-$(CONFIG_WMT_SENSOR_MMC328x) += mmc328x_msensor/
-#obj-$(CONFIG_WMT_SENSOR_CM3232) += cm3232/cm3232.o
-obj-$(CONFIG_WMT_GYRO_L3G4200D) += l3g4200d_gyro/
-obj-$(CONFIG_WMT_SENSOR_US5182) += us5182_lpsensor/
-obj-$(CONFIG_WMT_SENSOR_MMA8452Q) += mma8452q_gsensor/
-obj-$(CONFIG_WMT_SENSOR_STK8312) += stk8312_gsensor/
-obj-$(CONFIG_WMT_SENSOR_KIONIX) += kionix_gsensor/ \ No newline at end of file
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Kconfig b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Kconfig
deleted file mode 100755
index 9bf96e92..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Kconfig
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# WMT Sensor configuration
-#
-menuconfig INPUT_SENSOR
- bool "WMT Sensor"
- help
- Say Y here, and a list of supported sensor will be displayed.
- This option doesn't affect the kernel.
-
- If unsure, say Y.
-
-if INPUT_SENSOR
-
-
-config WMT_SENSOR_KXTI9
- tristate "KXTI9 G-Sensor Support"
- depends on ARCH_WMT
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_kxti9.
-
-config WMT_SENSOR_DMT08
- tristate "DMT08 G-Sensor Support"
- depends on ARCH_WMT
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmt08.
-
-config WMT_SENSOR_DMT10
- tristate "DMT10 G-Sensor Support"
- depends on ARCH_WMT
- help
- Say Y here if you have an WMT based board with g-sensor
- attached to it.
-
- If unsure, say N.
-
- To compile this driver as a module, choose M here: the
- module will be called sensor_dmt10.
-endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Makefile b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Makefile
deleted file mode 100755
index ee1a0ac5..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Makefile for the Sensor driver
-#
-
-# Each configuration option enables a list of files.
-
-obj-$(CONFIG_INPUT_SENSOR) += gsensor.o
-
-obj-$(CONFIG_WMT_SENSOR_KXTI9) += kxti9_gsensor/
-
-obj-$(CONFIG_WMT_SENSOR_DMT08) += dmt08_gsensor/
-
-obj-$(CONFIG_WMT_SENSOR_DMT10) += dmt10_gsensor/
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/Makefile
deleted file mode 100755
index 6edce54a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for the DMARD06 Sensor driver
-#
-
-sensor_dmt08-objs := dmt08.o
-obj-$(CONFIG_WMT_SENSOR_DMT08) += sensor_dmt08.o
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.c b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.c
deleted file mode 100755
index 2ed5f502..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.c
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * @file drivers/misc/dmt0308.c
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.31
- * @date 2012/3/27
- *
- * @section LICENSE
- *
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- */
-
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/delay.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/cdev.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/serio.h>
-#include <linux/platform_device.h>
-#include <linux/miscdevice.h>
-#include <linux/clk.h>
-#include <linux/mutex.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <mach/hardware.h>
-#include <asm/io.h>
-#include <linux/miscdevice.h>
-#include <mach/gpio.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-#include <linux/syscalls.h>
-#include <linux/wait.h>
-#include <linux/workqueue.h>
-#include "dmt08.h"
-#include "../gsensor.h"
-
-wait_queue_head_t open_wq;
-atomic_t active;
-static unsigned int interval;
-struct mutex DMT_mutex;
-struct delayed_work work;
-struct work_struct irq_work;
-atomic_t delay;
-
-static struct gsensor_conf gs_conf;
-
-void gsensor_write_offset_to_file(void);
-void gsensor_read_offset_from_file(void);
-char OffsetFileName[] = "/data/misc/dmt/offset.txt";
-static int Device_First_Time_Opened_flag=1;
-//*************************************************
-static char const *const ACCELEMETER_CLASS_NAME = "accelemeter";
-#define CHIP_ENABLE 137
-#if (defined(CONFIG_SENSORS_DMARD03) || defined(CONFIG_SENSORS_DMARD03_MODULE))
-static char const *const GSENSOR_DEVICE_NAME = "dmard03";
-#elif (defined(CONFIG_SENSORS_DMARD08) || defined(CONFIG_SENSORS_DMARD08_MODULE) || defined(CONFIG_WMT_SENSOR_DMT08))
-static char const *const GSENSOR_DEVICE_NAME = "dmard08";
-#endif
-
-static int device_init(void);
-static void device_exit(void);
-
-static int device_open(struct inode*, struct file*);
-static ssize_t device_write(struct file*, const char*, size_t, loff_t*);
-static ssize_t device_read(struct file*, char*, size_t, loff_t*);
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
-static int device_close(struct inode*, struct file*);
-
-//static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg);
-//static int device_i2c_resume(struct i2c_client *client);
-static int __devinit device_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int __devexit device_i2c_remove(struct i2c_client *client);
-static inline void device_i2c_correct_accel_sign(s16 *val);
-void device_i2c_read_xyz(struct i2c_client *client, s16 *xyz);
-void device_i2c_merge_register_values(struct i2c_client *client, s16 *val, u8 msb, u8 lsb);
-
-struct input_dev *input;
-
-static int DMT_GetOpenStatus(void)
-{
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
- printk("%s:start active=%d\n",__func__,active.counter);
-#endif
- wait_event_interruptible(open_wq, (atomic_read(&active) != 0));
- return 0;
-}
-
-static int DMT_GetCloseStatus(void)
-{
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
- printk("%s:start active=%d\n",__func__,active.counter);
-#endif
- wait_event_interruptible(open_wq, (atomic_read(&active) <= 0));
- return 0;
-}
-
-static void DMT_sysfs_update_active_status(int en)
-{
- unsigned long dmt_delay;
- if(en)
- {
- dmt_delay = msecs_to_jiffies(atomic_read(&delay));
- if(dmt_delay < 1)
- dmt_delay = 1;
- //printk("schedule_delayed_work start with delay time=%lu\n",dmt_delay);
- schedule_delayed_work(&work,dmt_delay);
- }
- else
- cancel_delayed_work_sync(&work);
-}
-
-static ssize_t DMT_enable_acc_show( struct device *dev, struct device_attribute *attr, char *buf)
-{
- buf="show";
- return 1;
-}
-
-static ssize_t DMT_enable_acc_store( struct device *dev, struct device_attribute *attr, char const *buf, size_t count)
-{
- int en;
-#if DMT_DEBUG_DATA
- printk("%s:buf=%x %x\n",__func__,buf[0],buf[1]);
-#endif
- if(buf[0]!= 0x30 && buf[0]!= 0x31)
- {
- printk("%s:illegle data !!\n",__func__);
- return 0;
- }
- en= (buf[0]-0x30 > 0) ? 1:0;
- DMT_sysfs_update_active_status(en);
- return 1;
-}
-
-static ssize_t DMT_delay_acc_show( struct device *dev, struct device_attribute *attr, char *buf){
- return 1;
-}
-
-static ssize_t DMT_delay_acc_store( struct device *dev, struct device_attribute *attr,char const *buf, size_t count)
-{
- int error;
- unsigned long data;
- error = strict_strtoul(buf, 10, &data);
- if(error) {
- pr_err("%s strict_strtoul error\n", __FUNCTION__);
- return -1;
- }
- mutex_lock(&DMT_mutex);
- interval=(unsigned int)data;
- mutex_unlock(&DMT_mutex);
- atomic_set(&delay, (unsigned int) data);
-#if DMT_DEBUG_DATA
- printk("Driver attribute set delay =%lu\n",data);
-#endif
- return 1;
-}
-
-static struct device_attribute DMT_attributes[] = {
- __ATTR(enable_acc, 0755, DMT_enable_acc_show, DMT_enable_acc_store),
- __ATTR(delay_acc, 0755, DMT_delay_acc_show, DMT_delay_acc_store),
- __ATTR_NULL,
-};
-
-static int create_device_attributes(struct device *dev, struct device_attribute *attrs)
-{
- int i;
- int err = 0;
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i) {
- err = device_create_file(dev, &attrs[i]);
- if (0 != err)
- break;
- }
-
- if (0 != err) {
- for (; i >= 0 ; --i)
- device_remove_file(dev, &attrs[i]);
- }
- return err;
-}
-
-int input_init(void)
-{
- int err=0;
- input=input_allocate_device();
- if (!input)
- return -ENOMEM;
- else
- printk("input device allocate Success !!\n");
- /* Setup input device */
- set_bit(EV_ABS, input->evbit);
- /* Accelerometer [-78.5, 78.5]m/s2 in Q16*/
- input_set_abs_params(input, ABS_X, -1024, 1024, 0, 0);
- input_set_abs_params(input, ABS_Y, -1024, 1024, 0, 0);
- input_set_abs_params(input, ABS_Z, -1024, 1024, 0, 0);
-
- /* Set name */
- input->name = "g-sensor";
-
- /* Register */
- err = input_register_device(input);
- if (err) {
- input_free_device(input);
- return err;
- }
- atomic_set(&active, 0);
-#if DMT_DEBUG_DATA
- printk("in driver ,active=%d\n",active.counter);
-#endif
- init_waitqueue_head(&open_wq);
-
- return err;
-}
-
-typedef union {
- struct {
- s16 x;
- s16 y;
- s16 z;
- } u;
- s16 v[SENSOR_DATA_SIZE];
-} raw_data;
-static raw_data offset;
-
-struct dev_data {
- dev_t devno;
- struct cdev cdev;
- struct class *class;
- struct i2c_client *client;
-};
-static struct dev_data dev;
-
-s16 sensorlayout[3][3] = {
-#if defined(CONFIG_GSEN_LAYOUT_PAT_1)
- { 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_2)
- { 0, 1, 0}, {-1, 0, 0}, { 0, 0, 1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_3)
- {-1, 0, 0}, { 0,-1, 0}, { 0, 0, 1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_4)
- { 0,-1, 0}, { 1, 0, 0}, { 0, 0, 1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_5)
- {-1, 0, 0}, { 0, 1, 0}, { 0, 0,-1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_6)
- { 0,-1, 0}, {-1, 0, 0}, { 0, 0,-1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_7)
- { 1, 0, 0}, { 0,-1, 0}, { 0, 0,-1},
-#elif defined(CONFIG_GSEN_LAYOUT_PAT_8)
- { 0, 1, 0}, { 1, 0, 0}, { 0, 0,-1},
-#endif
-};
-
-void gsensor_read_accel_avg(int num_avg, raw_data *avg_p )
-{
- long xyz_acc[SENSOR_DATA_SIZE];
- s16 xyz[SENSOR_DATA_SIZE];
- int i, j;
-
- //initialize the accumulation buffer
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_acc[i] = 0;
-
- for(i = 0; i < num_avg; i++)
- {
- device_i2c_read_xyz(dev.client, (s16 *)&xyz);
- for(j = 0; j < SENSOR_DATA_SIZE; j++)
- xyz_acc[j] += xyz[j];
- }
-
- // calculate averages
- for(i = 0; i < SENSOR_DATA_SIZE; i++)
- avg_p->v[i] = (s16) (xyz_acc[i] / num_avg);
-}
-/* calc delta offset */
-int gsensor_calculate_offset(int gAxis,raw_data avg)
-{
- switch(gAxis)
- {
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE:
- offset.u.x = avg.u.x ;
- offset.u.y = avg.u.y ;
- offset.u.z = avg.u.z + DEFAULT_SENSITIVITY;
- break;
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE:
- offset.u.x = avg.u.x + DEFAULT_SENSITIVITY;
- offset.u.y = avg.u.y ;
- offset.u.z = avg.u.z ;
- break;
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE:
- offset.u.x = avg.u.x ;
- offset.u.y = avg.u.y ;
- offset.u.z = avg.u.z - DEFAULT_SENSITIVITY;
- break;
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE:
- offset.u.x = avg.u.x - DEFAULT_SENSITIVITY;
- offset.u.y = avg.u.y ;
- offset.u.z = avg.u.z ;
- break;
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE:
- offset.u.x = avg.u.x ;
- offset.u.y = avg.u.y + DEFAULT_SENSITIVITY;
- offset.u.z = avg.u.z ;
- break;
- case CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE:
- offset.u.x = avg.u.x ;
- offset.u.y = avg.u.y - DEFAULT_SENSITIVITY;
- offset.u.z = avg.u.z ;
- break;
- default:
- return -ENOTTY;
- }
- return 0;
-}
-
-void gsensor_calibrate(int side){
- raw_data avg;
- int avg_num = 16;
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- // get acceleration average reading
- gsensor_read_accel_avg(avg_num, &avg);
- // calculate and set the offset
- gsensor_calculate_offset(side, avg);
-}
-
-void ce_on(void){
- //omap_mux_set_gpio(OMAP_PIN_INPUT_PULLUP, CHIP_ENABLE);
-}
-
-void ce_off(void){
- //omap_mux_set_gpio(OMAP_PIN_INPUT_PULLDOWN, CHIP_ENABLE);
-}
-
-void gsensor_reset(void){
- ce_off();
- msleep(300);
- ce_on();
-}
-
-void gsensor_set_offset(int val[3])
-{
- int i;
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- offset.v[i] = (s16) val[i];
-}
-
-static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg)
-{
- return 0;
-}
-
-static int device_i2c_resume(struct i2c_client *client)
-{
- return 0;
-}
-
-static void device_i2c_shutdown(struct i2c_client *client)
-{
- flush_delayed_work_sync(&work);
- cancel_delayed_work_sync(&work);
-}
-
-struct file_operations dmt_g_sensor_fops = {
- .owner = THIS_MODULE,
- .read = device_read,
- .write = device_write,
- .unlocked_ioctl = device_ioctl,
- .open = device_open,
- .release = device_close,
-};
-
-static const struct i2c_device_id device_i2c_ids[] = {
- {DEVICE_I2C_NAME, 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, device_i2c_ids);
-
-static struct i2c_driver device_i2c_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = DEVICE_I2C_NAME,
- },
- .class = I2C_CLASS_HWMON,
- .probe = device_i2c_probe,
- .remove = __devexit_p(device_i2c_remove),
- .suspend = device_i2c_suspend,
- .resume = device_i2c_resume,
- .shutdown = device_i2c_shutdown,
- .id_table = device_i2c_ids,
-};
-
-static int device_open(struct inode *inode, struct file *filp){
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- //Device_First_Time_Opened_flag
- if(Device_First_Time_Opened_flag)
- {
- Device_First_Time_Opened_flag=0;
- //gsensor_read_offset_from_file();
- }
- return 0;
-}
-
-static ssize_t device_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
-{
- return 0;
-}
-
-static ssize_t device_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
-{
- s16 xyz[SENSOR_DATA_SIZE];
- int i;
-
- device_i2c_read_xyz(dev.client, (s16 *)&xyz);
- //offset compensation
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz[i] -= offset.v[i];
-
- if(copy_to_user(buf, &xyz, count))
- return -EFAULT;
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
- PRINT_X_Y_Z(xyz[0], xyz[1], xyz[2]);
-#endif
-
- return count;
-}
-
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
- int err = 0, ret = 0, i;
- int intBuf[SENSOR_DATA_SIZE];
- s16 xyz[SENSOR_DATA_SIZE];
- //check type and number
- if (_IOC_TYPE(cmd) != IOCTL_MAGIC) return -ENOTTY;
- if (_IOC_NR(cmd) > SENSOR_MAXNR) return -ENOTTY;
-
- //check user space pointer is valid
- if (_IOC_DIR(cmd) & _IOC_READ)
- err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
- else if (_IOC_DIR(cmd) & _IOC_WRITE)
- err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
- if (err) return -EFAULT;
-
- switch(cmd)
- {
- case SENSOR_RESET:
- //gsensor_reset();
- printk("RUN RESET");
- return ret;
-
- case SENSOR_CALIBRATION:
- // get orientation info
- if(copy_from_user(&intBuf, (int*)arg, sizeof(int))) return -EFAULT;
- gsensor_calibrate(intBuf[0]);
- // write in to file
- gsensor_write_offset_to_file();
-
- // return the offset
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_GET_OFFSET:
- // get offset from file
- gsensor_read_offset_from_file();
-
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SET_OFFSET:
- ret = copy_from_user(&intBuf, (int *)arg, sizeof(intBuf));
- gsensor_set_offset(intBuf);
- // write in to file
- gsensor_write_offset_to_file();
- return ret;
-
- case SENSOR_READ_ACCEL_XYZ:
- device_i2c_read_xyz(dev.client, (s16 *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = xyz[i] - offset.v[i];
-
- ret = copy_to_user((int*)arg, &intBuf, sizeof(intBuf));
- return ret;
- case SENSOR_SETYPR:
- if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf)))
- {
- printk("%s:copy_from_user(&intBuf, (int*)arg, sizeof(intBuf)) ERROR, -EFAULT\n",__func__);
- return -EFAULT;
- }
- input_report_abs(input, ABS_X, intBuf[0]);
- input_report_abs(input, ABS_Y, intBuf[1]);
- input_report_abs(input, ABS_Z, intBuf[2]);
- input_sync(input);
- //printk("%s:SENSOR_SETYPR OK! x=%d,y=%d,z=%d\n",__func__,intBuf[0],intBuf[1],intBuf[2]);
-
- return 1;
- case SENSOR_GET_OPEN_STATUS:
- //printk("%s:Going into DMT_GetOpenStatus()\n",__func__);
- DMT_GetOpenStatus();
- //printk("%s:DMT_GetOpenStatus() finished\n",__func__);
- return 1;
- break;
- case SENSOR_GET_CLOSE_STATUS:
- //printk("%s:Going into DMT_GetCloseStatus()\n",__func__);
- DMT_GetCloseStatus();
- //printk("%s:DMT_GetCloseStatus() finished\n",__func__);
- return 1;
- break;
- case SENSOR_GET_DELAY:
-
- ret = copy_to_user((int*)arg, &interval, sizeof(interval));
- return 1;
- break;
- default: /* redundant, as cmd was checked against MAXNR */
- return -ENOTTY;
- }
-
- return 0;
-}
-
-static int device_close(struct inode *inode, struct file *filp)
-{
- printk("Close device\n");
- return 0;
-}
-
-static int device_i2c_xyz_read_reg(struct i2c_client *client,u8 *buffer, int length)
-{
- struct i2c_msg msg[] =
- {
- {.addr = client->addr, .flags = 0, .len = 1, .buf = buffer,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = length, .buf = buffer,},
- };
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- return i2c_transfer(client->adapter, msg, 2);
-}
-
-void device_i2c_read_xyz(struct i2c_client *client, s16 *xyz_p)
-{
- u8 buffer[6];
- s16 xyzTmp[SENSOR_DATA_SIZE];
- int i, j;
-
- //get xyz high/low bytes, 0x02~0x07
- buffer[0] = 2;
- device_i2c_xyz_read_reg(client, buffer, 6);
-
- //merge to 11-bits value
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- xyz_p[i] = 0;
- device_i2c_merge_register_values(client, (xyzTmp + i), buffer[2*i], buffer[2*i + 1]);
- //transfer to the default layout
- for(j = 0; j < 3; j++)
- xyz_p[i] += sensorlayout[i][j] * xyzTmp[j];
- }
-}
-
-void device_i2c_merge_register_values(struct i2c_client *client, s16 *val, u8 msb, u8 lsb)
-{
- *val = (((u16)msb) << 3) | (u16)lsb;
- device_i2c_correct_accel_sign(val);
-}
-
-static inline void device_i2c_correct_accel_sign(s16 *val)
-{
- *val<<= (sizeof(s16) * BITS_PER_BYTE - 11);
- *val>>= (sizeof(s16) * BITS_PER_BYTE - 11);
-}
-
-static void DMT_work_func(struct work_struct *fakework)
-{
- int i;
- static int firsttime=0;
- s16 xyz[SENSOR_DATA_SIZE];
- unsigned long t=atomic_read(&delay);
- unsigned long dmt_delay = msecs_to_jiffies(t);
- if(!firsttime)
- {
- //gsensor_read_offset_from_file();
- firsttime=1;
- }
-
- //dmt_delay/=1000;
-
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
- printk("t=%lu ,dmt_delay=%lu\n",t,dmt_delay);
-#endif
-
- device_i2c_read_xyz(dev.client, (s16 *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz[i] -= offset.v[i];
-
-#if DMT_DEBUG_DATA
- printk("x: %d, y: %d, z: %d\n", xyz[0], xyz[1], xyz[2]);
-#endif
- input_report_abs(input, ABS_X, xyz[gs_conf.xyz_axis[ABS_X][0]]*gs_conf.xyz_axis[ABS_X][1]);
- input_report_abs(input, ABS_Y, xyz[gs_conf.xyz_axis[ABS_Y][0]]*gs_conf.xyz_axis[ABS_Y][1]);
- input_report_abs(input, ABS_Z, xyz[gs_conf.xyz_axis[ABS_Z][0]]*gs_conf.xyz_axis[ABS_Z][1]);
- input_sync(input);
-
- if(dmt_delay<1)
- dmt_delay=1;
-
- schedule_delayed_work(&work, dmt_delay);
-}
-
-
-static int __devinit device_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
-{
- u8 buffer[4];
- int i;
-
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- offset.v[i] = 0;
-
- if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
- {
- printk("%s, functionality check failed\n", __func__);
- return -1;
- }
-
- gsensor_reset();
-
- buffer[0] = CONTROL_REGISTERS;
- device_i2c_xyz_read_reg(client, buffer, 4);
- if( buffer[0] == 0x00 && buffer[1] == 0x00 && buffer[2] == 0x88 && buffer[3] == 0x08)
- {
- printk(KERN_INFO "i2c Read 0x08 = %d!\n",buffer[0]);
- printk(KERN_INFO "i2c Read 0x09 = %d!\n",buffer[1]);
- printk(KERN_INFO "i2c Read 0x0a = %d!\n",buffer[2]);
- printk(KERN_INFO "i2c Read 0x0b = %d!\n",buffer[3]);
- printk(KERN_INFO "@@@ %s DMT_DEVICE_NAME registered I2C driver!\n",__FUNCTION__);
- dev.client = client;
- }
- else
- {
- printk(KERN_INFO "err : i2c Read 0x08 = %d!\n",buffer[0]);
- printk(KERN_INFO "err : i2c Read 0x09 = %d!\n",buffer[1]);
- printk(KERN_INFO "err : i2c Read 0x0a = %d!\n",buffer[2]);
- printk(KERN_INFO "err : i2c Read 0x0b = %d!\n",buffer[3]);
- dev.client = NULL;
- return -1;
- }
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
- //check sensorlayout[i][j]
- for(i = 0; i < 3; ++i)
- {
- for(j = 0; j < 3; j++)
- printk("%d",sensorlayout[i][j]);
- printk("\n");
- }
-#endif
- return 0;
-}
-
-static int __devexit device_i2c_remove(struct i2c_client *client)
-{
-#if DMT_DEBUG_DATA
- IN_FUNC_MSG;
-#endif
- return 0;
-}
-
-int dmt08_enable(int en)
-{
- printk(KERN_DEBUG "%s: enable = %d\n", __func__, en);
- DMT_sysfs_update_active_status(en);
- return 0;
-}
-
-int dmt08_setDelay(int mdelay)
-{
- printk(KERN_DEBUG "%s: delay = %d\n", __func__, mdelay);
- atomic_set(&delay, mdelay);
- return 0;
-}
-
-int dmt08_getLSG(int *lsg)
-{
- *lsg = 256;
- return 0;
-}
-
-struct gsensor_data dmt08_gs_data = {
- .i2c_addr = DMT08_I2C_ADDR,
- .enable = dmt08_enable,
- .setDelay = dmt08_setDelay,
- .getLSG = dmt08_getLSG,
-};
-
-static int __init device_init(void)
-{
- int err=-1;
- struct device *device;
- int ret = 0;
- IN_FUNC_MSG;
-
- if (get_gsensor_conf(&gs_conf))
- return -1;
-
- if (gs_conf.op != 1)
- return -1;
-
- printk("G-Sensor dmt08 init\n");
-
- if (gsensor_register(&dmt08_gs_data))
- return -1;
-
- if (gsensor_i2c_register_device() < 0)
- return -1;
-
- atomic_set(&delay, 200);
-
- ret = alloc_chrdev_region(&dev.devno, 0, 1, GSENSOR_DEVICE_NAME);
- if(ret)
- {
- printk("%s, can't allocate chrdev\n", __func__);
- return ret;
- }
- printk("%s, register chrdev(%d, %d)\n", __func__, MAJOR(dev.devno), MINOR(dev.devno));
-
- cdev_init(&dev.cdev, &dmt_g_sensor_fops);
- dev.cdev.owner = THIS_MODULE;
- ret = cdev_add(&dev.cdev, dev.devno, 1);
- if(ret < 0)
- {
- printk("%s, add character device error, ret %d\n", __func__, ret);
- return ret;
- }
- dev.class = class_create(THIS_MODULE, ACCELEMETER_CLASS_NAME);
- if(IS_ERR(dev.class))
- {
- printk("%s, create class, error\n", __func__);
- return ret;
- }
- device=device_create(dev.class, NULL, dev.devno, NULL, GSENSOR_DEVICE_NAME);
-
- mutex_init(&DMT_mutex);
-
- INIT_DELAYED_WORK(&work, DMT_work_func);
- printk("DMT: INIT_DELAYED_WORK\n");
-
- err=input_init();
- if(err)
- {
- printk("%s:input_init fail, error code= %d\n", __func__, err);
- }
-
- err = create_device_attributes(device,DMT_attributes);
-
- return i2c_add_driver(&device_i2c_driver);
-}
-
-
-static void __exit device_exit(void)
-{
- IN_FUNC_MSG;
- input_unregister_device(input);
- input_free_device(input);
- cdev_del(&dev.cdev);
- unregister_chrdev_region(dev.devno, 1);
- device_destroy(dev.class, dev.devno);
- class_destroy(dev.class);
- i2c_del_driver(&device_i2c_driver);
-}
-
-
-void gsensor_write_offset_to_file(void)
-{
- char data[18];
- unsigned int orgfs;
- long lfile=-1;
- spinlock_t lock; //add by yang
- spin_lock_init(&lock); //add by yang
- sprintf(data,"%5d %5d %5d",offset.u.x,offset.u.y,offset.u.z);
-
- orgfs = get_fs();
-// Set segment descriptor associated to kernel space
- set_fs(KERNEL_DS);
-
- lfile=sys_open(OffsetFileName,O_WRONLY|O_CREAT, 0777);
- if (lfile < 0)
- {
- printk("sys_open %s error!!. %ld\n",OffsetFileName,lfile);
- }
- else
- {
- spin_lock(&lock); //add by yang
- sys_write(lfile, data,18);
- sys_close(lfile);
- spin_unlock(&lock); //add by yang
- }
- set_fs(orgfs);
-}
-
-void gsensor_read_offset_from_file(void)
-{
- unsigned int orgfs;
- char data[18];
- long lfile=-1;
- orgfs = get_fs();
-// Set segment descriptor associated to kernel space
- set_fs(KERNEL_DS);
-
- lfile = sys_open(OffsetFileName, O_RDONLY, 0);
- if (lfile < 0)
- {
- printk("sys_open %s error!!. %ld\n",OffsetFileName,lfile);
- strcpy(data,"00000 00000 00000");
-
- }
- else
- {
- sys_read(lfile, data, 18);
- sys_close(lfile);
- }
- sscanf(data,"%hd %hd %hd",&offset.u.x,&offset.u.y,&offset.u.z);
- printk("%5d %5d %5d",offset.u.x,offset.u.y,offset.u.z);
- set_fs(orgfs);
-}
-
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMT Gsensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(device_init);
-module_exit(device_exit);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.h b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.h
deleted file mode 100755
index 5a1ac3b7..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt08_gsensor/dmt08.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * @file include/linux/dmt.h
- * @brief DMARD05 & DMARD06 & DMARD07 g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.31
- * @date 2012/3/27
- *
- * @section LICENSE
- *
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- */
-#ifndef DMT_H
-#define DMT_H
-
-#if (defined(CONFIG_SENSORS_DMARD05) || defined(CONFIG_SENSORS_DMARD05_MODULE))
-#define DEVICE_I2C_NAME "dmard05"
-#define DEFAULT_SENSITIVITY 64
-#define WHO_AM_I_VALUE 0x05
-#define X_OUT 0x41
-#define SW_RESET 0x53
-#define WHO_AM_I 0x0f
-#elif (defined(CONFIG_SENSORS_DMARD06) || defined(CONFIG_SENSORS_DMARD06_MODULE))
-#define DEVICE_I2C_NAME "dmard06"
-#define DEFAULT_SENSITIVITY 32
-#define WHO_AM_I_VALUE 0x06
-#define X_OUT 0x41
-#define SW_RESET 0x53
-#define WHO_AM_I 0x0f
-#elif (defined(CONFIG_SENSORS_DMARD07) || defined(CONFIG_SENSORS_DMARD07_MODULE))
-#define DEVICE_I2C_NAME "dmard07"
-#define DEFAULT_SENSITIVITY 64
-#define WHO_AM_I_VALUE 0x07
-#define X_OUT 0x41
-#define SW_RESET 0x53
-#define WHO_AM_I 0x0f
-#elif (defined(CONFIG_SENSORS_DMARD03) || defined(CONFIG_SENSORS_DMARD03_MODULE))
-#define DEVICE_I2C_NAME "dmard03"
-#define DEFAULT_SENSITIVITY 256
-#define CONTROL_REGISTERS 0x08
-#elif (defined(CONFIG_SENSORS_DMARD08) || defined(CONFIG_SENSORS_DMARD08_MODULE) || defined(CONFIG_WMT_SENSOR_DMT08))
-#define DEVICE_I2C_NAME "g-sensor"
-#define DEFAULT_SENSITIVITY 256
-#define CONTROL_REGISTERS 0x08
-#define DMT08_I2C_ADDR 0x1c
-#endif
-
-//#define DMT_DEBUG_DATA 1
-#define DMT_DEBUG_DATA 0
-
-#if DMT_DEBUG_DATA
-#define IN_FUNC_MSG printk(KERN_INFO "@DMT@ In %s\n", __func__)
-#define PRINT_X_Y_Z(x, y, z) printk(KERN_INFO "@DMT@ X/Y/Z axis: %04d , %04d , %04d\n", (x), (y), (z))
-#define PRINT_OFFSET(x, y, z) printk(KERN_INFO "@offset@ X/Y/Z axis: %04d , %04d , %04d\n",offset.x,offset.y,offset.z);
-#else
-#define IN_FUNC_MSG
-#define PRINT_X_Y_Z(x, y, z)
-#define PRINT_OFFSET(x, y, z)
-#endif
-
-//g-senor layout configuration, choose one of the following configuration
-#define CONFIG_GSEN_LAYOUT_PAT_1
-//#define CONFIG_GSEN_LAYOUT_PAT_2
-//#define CONFIG_GSEN_LAYOUT_PAT_3
-//#define CONFIG_GSEN_LAYOUT_PAT_4
-//#define CONFIG_GSEN_LAYOUT_PAT_5
-//#define CONFIG_GSEN_LAYOUT_PAT_6
-//#define CONFIG_GSEN_LAYOUT_PAT_7
-//#define CONFIG_GSEN_LAYOUT_PAT_8
-
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE 1
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE 2
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE 3
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE 4
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE 5
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE 6
-
-#define AVG_NUM 16
-
-#define IOCTL_MAGIC 0x09
-#define SENSOR_DATA_SIZE 3
-
-#define SENSOR_RESET _IO(IOCTL_MAGIC, 0)
-#define SENSOR_CALIBRATION _IOWR(IOCTL_MAGIC, 1, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OFFSET _IOR(IOCTL_MAGIC, 2, int[SENSOR_DATA_SIZE])
-#define SENSOR_SET_OFFSET _IOWR(IOCTL_MAGIC, 3, int[SENSOR_DATA_SIZE])
-#define SENSOR_READ_ACCEL_XYZ _IOR(IOCTL_MAGIC, 4, int[SENSOR_DATA_SIZE])
-#define SENSOR_SETYPR _IOW(IOCTL_MAGIC, 5, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OPEN_STATUS _IO(IOCTL_MAGIC, 6)
-#define SENSOR_GET_CLOSE_STATUS _IO(IOCTL_MAGIC, 7)
-#define SENSOR_GET_DELAY _IOR(IOCTL_MAGIC, 8, unsigned int*)
-
-#define SENSOR_MAXNR 8
-
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/Makefile
deleted file mode 100755
index de723bf5..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for the DMARD10 Sensor driver
-#
-
-sensor_dmt10-objs := dmt10.o
-obj-$(CONFIG_WMT_SENSOR_DMT10) += sensor_dmt10.o
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.c b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.c
deleted file mode 100755
index e8e7b288..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.c
+++ /dev/null
@@ -1,950 +0,0 @@
-/*
- * @file drivers/misc/dmt10.c
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.03
- *
- * @section LICENSE
- *
- * Copyright 2012 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * V1.00 D10 First Release date 2012/09/21
- * V1.01 static struct dmt_data s_dmt Refresh to device_i2c_probe date 2012/11/23
- * V1.02 0x0D cck : adjustment 204.8KHz core clock date 2012/11/30
- * V1.03 write TCGYZ & TCGX : set value to 0x00 date 2012/12/10
- *
- * @DMT Package version D10_General_driver v1.4
- *
- */
-#include "dmt10.h"
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include <linux/clk.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/string.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-#include "../gsensor.h"
-
-static struct gsensor_conf gs_conf;
-
-static unsigned int interval;
-void gsensor_write_offset_to_file(void);
-void gsensor_read_offset_from_file(void);
-char OffsetFileName[] = "/data/misc/dmt/offset.txt"; /* FILE offset.txt */
-static raw_data offset;
-static struct dmt_data *s_dmt;
-static int device_init(void);
-static void device_exit(void);
-
-static int device_open(struct inode*, struct file*);
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
-static int device_close(struct inode*, struct file*);
-
-static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg);
-static int device_i2c_resume(struct i2c_client *client);
-static int __devinit device_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int __devexit device_i2c_remove(struct i2c_client *client);
-void device_i2c_read_xyz(struct i2c_client *client, s16 *xyz);
-static int device_i2c_rxdata(struct i2c_client *client, unsigned char *rxDat, int length);
-static int device_i2c_txdata(struct i2c_client *client, unsigned char *txData, int length);
-
-static int DMT_GetOpenStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) != 0));
- return 0;
-}
-
-static int DMT_GetCloseStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) <= 0));
- return 0;
-}
-
-static void DMT_sysfs_update_active_status(struct dmt_data *dmt , int en){
- unsigned long dmt_delay;
- if(en){
- dmt_delay = msecs_to_jiffies(atomic_read(&dmt->delay));
- if(dmt_delay < 1)
- dmt_delay = 1;
-
- GSE_LOG("schedule_delayed_work start with delay time=%lu\n",dmt_delay);
- schedule_delayed_work(&dmt->delaywork,dmt_delay);
- }
- else
- cancel_delayed_work_sync(&dmt->delaywork);
-}
-
-static bool get_value_as_int(char const *buf, size_t size, int *value){
- long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtol(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtol(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtol(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > INT_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-static bool get_value_as_int64(char const *buf, size_t size, long long *value)
-{
- long long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtoll(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtoll(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtoll(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > LLONG_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-
-static ssize_t dmt_sysfs_enable_show(
- struct dmt_data *dmt, char *buf, int pos)
-{
- char str[2][16]={"ACC enable OFF","ACC enable ON"};
- int flag;
- flag=atomic_read(&dmt->enable);
- return sprintf(buf, "%s\n", str[flag]);
-}
-
-static ssize_t dmt_sysfs_enable_store(
- struct dmt_data *dmt, char const *buf, size_t count, int pos)
-{
- int en = 0;
- if (NULL == buf)
- return -EINVAL;
- GSE_LOG("buf=%x %x\n", buf[0], buf[1]);
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int(buf, count, &en))
- return -EINVAL;
-
- en = en ? 1 : 0;
-
- atomic_set(&dmt->enable,en);
- DMT_sysfs_update_active_status(dmt , en);
- return count;
-}
-
-/***** Acceleration ***/
-static ssize_t DMT_enable_acc_show(struct device *dev, struct device_attribute *attr, char *buf){
- return dmt_sysfs_enable_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t DMT_enable_acc_store( struct device *dev, struct device_attribute *attr, char const *buf, size_t count){
- return dmt_sysfs_enable_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-
-/***** sysfs delay **************************************************/
-static ssize_t dmt_sysfs_delay_show( struct dmt_data *dmt, char *buf, int pos){
- return sprintf(buf, "%d\n", atomic_read(&dmt->delay));
-}
-
-static ssize_t dmt_sysfs_delay_store( struct dmt_data *dmt, char const *buf, size_t count, int pos){
- long long val = 0;
-
- if (NULL == buf)
- return -EINVAL;
-
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int64(buf, count, &val))
- return -EINVAL;
-
- atomic_set(&dmt->delay, (unsigned int) val);
- GSE_LOG("Driver attribute set delay =%lld\n", val);
-
- return count;
-}
-
-/***** Accelerometer ***/
-static ssize_t DMT_delay_acc_show( struct device *dev, struct device_attribute *attr, char *buf){
- return dmt_sysfs_delay_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t DMT_delay_acc_store( struct device *dev, struct device_attribute *attr,char const *buf, size_t count){
- return dmt_sysfs_delay_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-
-static struct device_attribute DMT_attributes[] = {
- __ATTR(enable_acc, 0755, DMT_enable_acc_show, DMT_enable_acc_store),
- __ATTR(delay_acc, 0755, DMT_delay_acc_show, DMT_delay_acc_store),
- __ATTR_NULL,
-};
-
-static char const *const ACCELEMETER_CLASS_NAME = "accelemeter";
-static char const *const GSENSOR_DEVICE_NAME = "dmard10";
-static char const *const device_link_name = "i2c";
-static dev_t const dmt_device_dev_t = MKDEV(MISC_MAJOR, 240);
-
-/***** dmt sysfs functions ******************************************/
-static int create_device_attributes(struct device *dev, struct device_attribute *attrs){
- int i;
- int err = 0;
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i) {
- err = device_create_file(dev, &attrs[i]);
- if (0 != err)
- break;
- }
-
- if (0 != err) {
- for (; i >= 0 ; --i)
- device_remove_file(dev, &attrs[i]);
- }
- return err;
-}
-
-static void remove_device_attributes(
- struct device *dev,
- struct device_attribute *attrs)
-{
- int i;
-
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i)
- device_remove_file(dev, &attrs[i]);
-}
-
-static int create_sysfs_interfaces(struct dmt_data *dmt)
-{
- int err;
-
- if (NULL == dmt)
- return -EINVAL;
-
- err = 0;
- dmt->class = class_create(THIS_MODULE, ACCELEMETER_CLASS_NAME);
- if (IS_ERR(dmt->class)) {
- err = PTR_ERR(dmt->class);
- goto exit_class_create_failed;
- }
-
- dmt->class_dev = device_create(
- dmt->class,
- NULL,
- dmt_device_dev_t,
- dmt,
- GSENSOR_DEVICE_NAME);
- if (IS_ERR(dmt->class_dev)) {
- err = PTR_ERR(dmt->class_dev);
- goto exit_class_device_create_failed;
- }
-
- err = sysfs_create_link(
- &dmt->class_dev->kobj,
- &dmt->client->dev.kobj,
- device_link_name);
- if (0 > err)
- goto exit_sysfs_create_link_failed;
-
- err = create_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- if (0 > err)
- goto exit_device_attributes_create_failed;
-#if 0
- err = create_device_binary_attributes(
- &dmt->class_dev->kobj,
- dmt_bin_attributes);
- if (0 > err)
- goto exit_device_binary_attributes_create_failed;
-#endif
-
- return err;
-
-#if 0
-exit_device_binary_attributes_create_failed:
- remove_device_attributes(dmt->class_dev, dmt_attributes);
-#endif
-exit_device_attributes_create_failed:
- sysfs_remove_link(&dmt->class_dev->kobj, device_link_name);
-exit_sysfs_create_link_failed:
- device_destroy(dmt->class, dmt_device_dev_t);
-exit_class_device_create_failed:
- dmt->class_dev = NULL;
- class_destroy(dmt->class);
-exit_class_create_failed:
- dmt->class = NULL;
- return err;
-}
-
-static void remove_sysfs_interfaces(struct dmt_data *dmt)
-{
- if (NULL == dmt)
- return;
-
- if (NULL != dmt->class_dev) {
-
- remove_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- sysfs_remove_link(
- &dmt->class_dev->kobj,
- device_link_name);
- dmt->class_dev = NULL;
- }
- if (NULL != dmt->class) {
- device_destroy(
- dmt->class,
- dmt_device_dev_t);
- class_destroy(dmt->class);
- dmt->class = NULL;
- }
-}
-
-int input_init(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- int err=0;
- dmt->input=input_allocate_device();
- if (!dmt->input){
- GSE_ERR("input device allocate ERROR !!\n");
- return -ENOMEM;
- }
- else
- GSE_LOG("input device allocate Success !!\n");
- /* Setup input device */
- set_bit(EV_ABS, dmt->input->evbit);
- /* Accelerometer [-78.5, 78.5]m/s2 in Q16 */
- input_set_abs_params(dmt->input, ABS_X, -1024, 1024, 0, 0);
- input_set_abs_params(dmt->input, ABS_Y, -1024, 1024, 0, 0);
- input_set_abs_params(dmt->input, ABS_Z, -1024, 1024, 0, 0);
- /* Set InputDevice Name */
- dmt->input->name = INPUT_NAME_ACC;
- /* Register */
- err = input_register_device(dmt->input);
- if (err) {
- GSE_ERR("input_register_device ERROR !!\n");
- input_free_device(dmt->input);
- return err;
- }
- GSE_LOG("input_register_device SUCCESS %d !! \n",err);
-
- return err;
-}
-
-int gsensor_calibrate(void)
-{
- //struct dmt_data *dmt = i2c_get_clientdata(client);
- raw_data avg;
- int i, j;
- long xyz_acc[SENSOR_DATA_SIZE];
- s16 xyz[SENSOR_DATA_SIZE];
-
- offset.u.x=0;
- offset.u.y=0;
- offset.u.z=0;
- /* initialize the accumulation buffer */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_acc[i] = 0;
-
- for(i = 0; i < AVG_NUM; i++) {
- device_i2c_read_xyz(s_dmt->client, (s16 *)&xyz);
- for(j = 0; j < SENSOR_DATA_SIZE; ++j)
- xyz_acc[j] += xyz[j];
- }
- /* calculate averages */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- avg.v[i] = (s16) (xyz_acc[i] / AVG_NUM);
-
- if(avg.v[2] < 0){
- offset.u.x = avg.v[0] ;
- offset.u.y = avg.v[1] ;
- offset.u.z = avg.v[2] + DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE;
- }
- else{
- offset.u.x = avg.v[0] ;
- offset.u.y = avg.v[1] ;
- offset.u.z = avg.v[2] - DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE;
- }
- return 0;
-}
-
-int gsensor_reset(struct i2c_client *client){
- unsigned char buffer[7], buffer2[2];
- /* 1. check D10 , VALUE_STADR = 0x55 , VALUE_STAINT = 0xAA */
- buffer[0] = REG_STADR;
- buffer2[0] = REG_STAINT;
-
- device_i2c_rxdata(client, buffer, 2);
- device_i2c_rxdata(client, buffer2, 2);
-
- if( buffer[0] == VALUE_STADR || buffer2[0] == VALUE_STAINT){
- GSE_LOG(" REG_STADR_VALUE = %d , REG_STAINT_VALUE = %d\n", buffer[0], buffer2[0]);
- }
- else{
- GSE_LOG(" REG_STADR_VALUE = %d , REG_STAINT_VALUE = %d \n", buffer[0], buffer2[0]);
- return -1;
- }
- /* 2. Powerdown reset */
- buffer[0] = REG_PD;
- buffer[1] = VALUE_PD_RST;
- device_i2c_txdata(client, buffer, 2);
- /* 3. ACTR => Standby mode => Download OTP to parameter reg => Standby mode => Reset data path => Standby mode */
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Standby;
- buffer[2] = MODE_ReadOTP;
- buffer[3] = MODE_Standby;
- buffer[4] = MODE_ResetDataPath;
- buffer[5] = MODE_Standby;
- device_i2c_txdata(client, buffer, 6);
- /* 4. OSCA_EN = 1 ,TSTO = b'000(INT1 = normal, TEST0 = normal) */
- buffer[0] = REG_MISC2;
- buffer[1] = VALUE_MISC2_OSCA_EN;
- device_i2c_txdata(client, buffer, 2);
- /* 5. AFEN = 1(AFE will powerdown after ADC) */
- buffer[0] = REG_AFEM;
- buffer[1] = VALUE_AFEM_AFEN_Normal;
- buffer[2] = VALUE_CKSEL_ODR_100_204;
- buffer[3] = VALUE_INTC;
- buffer[4] = VALUE_TAPNS_Ave_2;
- buffer[5] = 0x00; // DLYC, no delay timing
- buffer[6] = 0x07; // INTD=1 (push-pull), INTA=1 (active high), AUTOT=1 (enable T)
- device_i2c_txdata(client, buffer, 7);
- /* 6. write TCGYZ & TCGX */
- buffer[0] = REG_WDAL; // REG:0x01
- buffer[1] = 0x00; // set TC of Y,Z gain value
- buffer[2] = 0x00; // set TC of X gain value
- buffer[3] = 0x03; // Temperature coefficient of X,Y,Z gain
- device_i2c_txdata(client, buffer, 4);
-
- buffer[0] = REG_ACTR; // REG:0x00
- buffer[1] = MODE_Standby; // Standby
- buffer[2] = MODE_WriteOTPBuf; // WriteOTPBuf
- buffer[3] = MODE_Standby; // Standby
- device_i2c_txdata(client, buffer, 4);
- //buffer[0] = REG_TCGYZ;
- //device_i2c_rxdata(client, buffer, 2);
- //GSE_LOG(" TCGYZ = %d, TCGX = %d \n", buffer[0], buffer[1]);
-
- /* 7. Activation mode */
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Active;
- device_i2c_txdata(client, buffer, 2);
- return 0;
-}
-
-void gsensor_set_offset(int val[3]){
- int i;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- offset.v[i] = (s16) val[i];
-}
-
-struct file_operations dmt_g_sensor_fops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = device_ioctl,
- .open = device_open,
- .release = device_close,
-};
-
-static struct miscdevice dmt_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = DEVICE_I2C_NAME,
- .fops = &dmt_g_sensor_fops,
-};
-
-static int sensor_close_dev(struct i2c_client *client){
- char buffer[3];
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Standby;
- buffer[2] = MODE_Off;
- GSE_FUN();
- return device_i2c_txdata(client,buffer, 3);
-}
-
-static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg){
- GSE_FUN();
- return sensor_close_dev(client);
-}
-
-static int device_i2c_resume(struct i2c_client *client){
- GSE_FUN();
- return gsensor_reset(client);
-}
-
-static void device_i2c_shutdown(struct i2c_client *client)
-{
- struct dmt_data *dmt = i2c_get_clientdata(client);
- flush_delayed_work_sync(&dmt->delaywork);
- cancel_delayed_work_sync(&dmt->delaywork);
-}
-
-static int __devexit device_i2c_remove(struct i2c_client *client){
- return 0;
-}
-
-static const struct i2c_device_id device_i2c_ids[] = {
- {DEVICE_I2C_NAME, 0},
- {}
-};
-
-//MODULE_DEVICE_TABLE(i2c, device_i2c_ids);
-
-static struct i2c_driver device_i2c_driver =
-{
- .driver = {
- .owner = THIS_MODULE,
- .name = DEVICE_I2C_NAME,
- },
- .class = I2C_CLASS_HWMON,
- .id_table = device_i2c_ids,
- .probe = device_i2c_probe,
- .remove = __devexit_p(device_i2c_remove),
- .shutdown = device_i2c_shutdown,
-#ifndef CONFIG_ANDROID_POWER
- .suspend = device_i2c_suspend,
- .resume = device_i2c_resume,
-#endif
-
-};
-
-static int device_open(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
- //struct i2c_client *client = (struct i2c_client*)filp->private_data;
- //struct dmt_data *dmt = (struct dmt_data*)i2c_get_clientdata(client);
-
- int err = 0, ret = 0, i;
- int intBuf[SENSOR_DATA_SIZE];
- s16 xyz[SENSOR_DATA_SIZE];
- /* check type */
- if (_IOC_TYPE(cmd) != IOCTL_MAGIC) return -ENOTTY;
-
- /* check user space pointer is valid */
- if (_IOC_DIR(cmd) & _IOC_READ)
- err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
- else if (_IOC_DIR(cmd) & _IOC_WRITE)
- err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
- if (err) return -EFAULT;
-
- switch(cmd)
- {
- case SENSOR_RESET:
- gsensor_reset(s_dmt->client);
- return ret;
-
- case SENSOR_CALIBRATION:
- /* get orientation info */
- //if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) return -EFAULT;
- gsensor_calibrate();
- GSE_LOG("Sensor_calibration:%d %d %d\n",offset.u.x,offset.u.y,offset.u.z);
- /* save file */
- gsensor_write_offset_to_file();
-
- /* return the offset */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_GET_OFFSET:
- /* get data from file */
- gsensor_read_offset_from_file();
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SET_OFFSET:
- ret = copy_from_user(&intBuf, (int *)arg, sizeof(intBuf));
- gsensor_set_offset(intBuf);
- /* write in to file */
- gsensor_write_offset_to_file();
- return ret;
-
- case SENSOR_READ_ACCEL_XYZ:
- device_i2c_read_xyz(s_dmt->client, (s16 *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = xyz[i] - offset.v[i];
-
- ret = copy_to_user((int*)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SETYPR:
- if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) {
- GSE_LOG("%s:copy_from_user(&intBuf, (int*)arg, sizeof(intBuf)) ERROR, -EFAULT\n",__func__);
- return -EFAULT;
- }
- input_report_abs(s_dmt->input, ABS_X, intBuf[0]);
- input_report_abs(s_dmt->input, ABS_Y, -intBuf[1]);
- input_report_abs(s_dmt->input, ABS_Z, -intBuf[2]);
- input_sync(s_dmt->input);
- GSE_LOG(KERN_INFO "%s:SENSOR_SETYPR OK! x=%d,y=%d,z=%d\n",__func__,intBuf[0],intBuf[1],intBuf[2]);
- return 1;
-
- case SENSOR_GET_OPEN_STATUS:
- GSE_LOG(KERN_INFO "%s:Going into DMT_GetOpenStatus()\n",__func__);
- DMT_GetOpenStatus(s_dmt->client);
- GSE_LOG(KERN_INFO "%s:DMT_GetOpenStatus() finished\n",__func__);
- return 1;
- break;
-
- case SENSOR_GET_CLOSE_STATUS:
- GSE_LOG(KERN_INFO "%s:Going into DMT_GetCloseStatus()\n",__func__);
- DMT_GetCloseStatus(s_dmt->client);
- GSE_LOG(KERN_INFO "%s:DMT_GetCloseStatus() finished\n",__func__);
- return 1;
- break;
-
- case SENSOR_GET_DELAY:
- ret = copy_to_user((int*)arg, &interval, sizeof(interval));
- return 1;
- break;
-
- default: /* redundant, as cmd was checked against MAXNR */
- return -ENOTTY;
- }
-
- return 0;
-}
-
-static int device_close(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-/***** I2C I/O function ***********************************************/
-static int device_i2c_rxdata( struct i2c_client *client, unsigned char *rxData, int length)
-{
- struct i2c_msg msgs[] =
- {
- {.addr = client->addr, .flags = 0, .len = 1, .buf = rxData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = length, .buf = rxData,},
- };
- //unsigned char addr = rxData[0];
- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "RxData: len=%02x, addr=%02x, data=%02x\n",
- //length, addr, rxData[0]);
-
- return 0;
-}
-
-static int device_i2c_txdata( struct i2c_client *client, unsigned char *txData, int length)
-{
- struct i2c_msg msg[] =
- {
- {.addr = client->addr, .flags = 0, .len = length, .buf = txData,},
- };
-
- if (i2c_transfer(client->adapter, msg, 1) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "TxData: len=%02x, addr=%02x data=%02x\n",
- //length, txData[0], txData[1]);
- return 0;
-}
-/* 1g = 128 becomes 1g = 1024 */
-static inline void device_i2c_correct_accel_sign(s16 *val){
- *val<<= 3;
-}
-
-void device_i2c_merge_register_values(struct i2c_client *client, s16 *val, u8 msb, u8 lsb){
- *val = (((u16)msb) << 8) | (u16)lsb;
- device_i2c_correct_accel_sign(val);
-}
-
-void device_i2c_read_xyz(struct i2c_client *client, s16 *xyz_p){
- u8 buffer[11];
- s16 xyzTmp[SENSOR_DATA_SIZE];
- int i, j;
- /* get xyz high/low bytes, 0x12 */
- buffer[0] = REG_STADR;
- device_i2c_rxdata(client, buffer, 10);
-
- /* merge to 10-bits value */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- xyz_p[i] = 0;
- device_i2c_merge_register_values(client, (xyzTmp + i), buffer[2*(i+1)+1], buffer[2*(i+1)]);
- /* transfer to the default layout */
- for(j = 0; j < 3; j++)
- xyz_p[i] += sensorlayout[i][j] * xyzTmp[j];
- }
- GSE_LOG("xyz_p: %04d , %04d , %04d\n", xyz_p[0], xyz_p[1], xyz_p[2]);
-}
-
-static void DMT_work_func(struct work_struct *delaywork)
-{
- struct dmt_data *dmt = container_of(delaywork, struct dmt_data, delaywork.work);
- int i;
- static int firsttime=0;
- s16 xyz[SENSOR_DATA_SIZE];
-
- unsigned long t=atomic_read(&dmt->delay);
- unsigned long dmt_delay = msecs_to_jiffies(t);
- if(!firsttime){
- //gsensor_read_offset_from_file();
- firsttime=1;
- }
-
- GSE_LOG("t=%lu , dmt_delay=%lu\n", t, dmt_delay);
- device_i2c_read_xyz(dmt->client, (s16 *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz[i] -= offset.v[i];
-
- GSE_LOG("@DMTRaw@ X/Y/Z axis: %04d , %04d , %04d\n", xyz[0], xyz[1], xyz[2]);
- GSE_LOG("@Offset@ X/Y/Z axis: %04d , %04d , %04d\n", offset.u.x, offset.u.y, offset.u.z);
- input_report_abs(dmt->input, ABS_X, xyz[gs_conf.xyz_axis[ABS_X][0]]*gs_conf.xyz_axis[ABS_X][1]);
- input_report_abs(dmt->input, ABS_Y, xyz[gs_conf.xyz_axis[ABS_Y][0]]*gs_conf.xyz_axis[ABS_Y][1]);
- input_report_abs(dmt->input, ABS_Z, xyz[gs_conf.xyz_axis[ABS_Z][0]]*gs_conf.xyz_axis[ABS_Z][1]);
- input_sync(dmt->input);
-
- if(dmt_delay < 1)
- dmt_delay = 1;
- schedule_delayed_work(&dmt->delaywork, dmt_delay);
-}
-
-static int __devinit device_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id){
- int i, ret = 0;
- //struct dmt_data *s_dmt;
-
- GSE_FUN();
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- offset.v[i] = 0;
-
- if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){
- GSE_ERR("check_functionality failed.\n");
- ret = -ENODEV;
- goto exit0;
- }
-
- /* Allocate memory for driver data */
- s_dmt = kzalloc(sizeof(struct dmt_data), GFP_KERNEL);
- memset(s_dmt, 0, sizeof(struct dmt_data));
- if (s_dmt == NULL) {
- GSE_ERR("alloc data failed.\n");
- ret = -ENOMEM;
- goto exit1;
- }
-
- /***** I2C initialization *****/
- s_dmt->client = client;
- /* set client data */
- i2c_set_clientdata(client, s_dmt);
- ret = gsensor_reset(client);
- if (ret < 0)
- goto exit2;
-
- /***** input *****/
- ret = input_init(client);
- if (ret){
- GSE_ERR("input_init fail, error code= %d\n",ret);
- goto exit3;
- }
-
- /**** initialize variables in dmt_data *****/
- init_waitqueue_head(&s_dmt->open_wq);
- atomic_set(&s_dmt->active, 0);
- atomic_set(&s_dmt->enable, 0);
- atomic_set(&s_dmt->delay, 0);
- mutex_init(&s_dmt->sensor_mutex);
- /***** misc *****/
- /* we have been register miscdevice in device_init, and
- * marked by Eason 2013/2/4*/
- /*ret = misc_register(&dmt_device);
- if (ret){
- GSE_ERR("dmt_dev register failed");
- goto exit5;
- }*/
-
- /***** sysfs *****/
- ret = create_sysfs_interfaces(s_dmt);
- if (ret < 0){
- GSE_ERR("create sysfs failed.");
- goto exit6;
- }
-
- INIT_DELAYED_WORK(&s_dmt->delaywork, DMT_work_func);
- GSE_LOG("DMT: INIT_DELAYED_WORK\n");
- return 0;
-
-exit6:
- //misc_deregister(&dmt_device);
-exit5:
- input_unregister_device(s_dmt->input);
-exit3:
- kfree(s_dmt);
-exit2:
-exit1:
-exit0:
- return ret;
-}
-
-int dmt10_enable(int en)
-{
- printk(KERN_DEBUG "%s: enable = %d\n", __func__, en);
- DMT_sysfs_update_active_status(s_dmt,en);
- return 0;
-}
-
-int dmt10_setDelay(int mdelay)
-{
- printk(KERN_DEBUG "%s: delay = %d\n", __func__, mdelay);
- atomic_set(&s_dmt->delay, mdelay);
- return 0;
-}
-
-int dmt10_getLSG(int *lsg)
-{
- *lsg = 1024;
- return 0;
-}
-
-struct gsensor_data dmt10_gs_data = {
- .i2c_addr = DMT10_I2C_ADDR,
- .enable = dmt10_enable,
- .setDelay = dmt10_setDelay,
- .getLSG = dmt10_getLSG,
-};
-
-static int __init device_init(void){
- int ret = 0;
-
- if (get_gsensor_conf(&gs_conf))
- return -1;
-
- if (gs_conf.op != 3)
- return -1;
- printk("G-Sensor dmt10 init\n");
-
- if (gsensor_register(&dmt10_gs_data))
- return -1;
-
- if (gsensor_i2c_register_device() < 0)
- return -1;
-
- return i2c_add_driver(&device_i2c_driver);
-}
-
-static void __exit device_exit(void){
- i2c_del_driver(&device_i2c_driver);
-}
-
-void gsensor_write_offset_to_file(void){
- char data[18];
- unsigned int orgfs;
- struct file *fp;
-
- sprintf(data,"%5d %5d %5d",offset.u.x,offset.u.y,offset.u.z);
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
- fp = filp_open(OffsetFileName, O_RDWR | O_CREAT, 0777);
- if(IS_ERR(fp)){
- GSE_ERR("filp_open %s error!!.\n",OffsetFileName);
- }
- else{
- GSE_LOG("filp_open %s SUCCESS!!.\n",OffsetFileName);
- fp->f_op->write(fp,data,18, &fp->f_pos);
- filp_close(fp,NULL);
- }
- set_fs(orgfs);
-}
-
-void gsensor_read_offset_from_file(void){
- unsigned int orgfs;
- char data[18];
- struct file *fp;
- int ux,uy,uz;
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
-
- fp = filp_open(OffsetFileName, O_RDWR , 0);
- GSE_FUN();
- if(IS_ERR(fp)){
- GSE_ERR("Sorry,file open ERROR !\n");
- offset.u.x=0;offset.u.y=0;offset.u.z=0;
-#if AUTO_CALIBRATION
- /* get acceleration average reading */
- gsensor_calibrate();
- gsensor_write_offset_to_file();
-#endif
- }
- else{
- GSE_LOG("filp_open %s SUCCESS!!.\n",OffsetFileName);
- fp->f_op->read(fp,data,18, &fp->f_pos);
- GSE_LOG("filp_read result %s\n",data);
- sscanf(data,"%d %d %d",&ux,&uy,&uz);
- offset.u.x=ux;
- offset.u.y=uy;
- offset.u.z=uz;
- filp_close(fp,NULL);
- }
- set_fs(orgfs);
-}
-//*********************************************************************************************************
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMT Gsensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(device_init);
-module_exit(device_exit);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.h b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.h
deleted file mode 100755
index 61343657..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/dmt10_gsensor/dmt10.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * @file include/linux/dmt10.h
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.02
- * @date 2012/12/10
- *
- * @section LICENSE
- *
- * Copyright 2012 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * @DMT Package version D10_General_driver v1.4
- *
- *
- */
-#ifndef DMT10_H
-#define DMT10_H
-#include <linux/types.h>
-#include <linux/ioctl.h>
-#include <linux/cdev.h>
-#include <linux/mutex.h>
-#include <linux/syscalls.h>
-#include <linux/wait.h>
-#include <linux/workqueue.h>
-#include <linux/delay.h>
-
-#define AUTO_CALIBRATION 0
-
-#define DMT_DEBUG_DATA 0
-#define GSE_TAG "[DMT_Gsensor]"
-#if DMT_DEBUG_DATA
-#define GSE_ERR(fmt, args...) printk(KERN_ERR GSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
-#define GSE_LOG(fmt, args...) printk(KERN_INFO GSE_TAG fmt, ##args)
-#define GSE_FUN(f) printk(KERN_INFO GSE_TAG" %s: %s: %i\n", __FILE__, __func__, __LINE__)
-#define DMT_DATA(dev, ...) dev_dbg((dev), ##__VA_ARGS__)
-#else
-#define GSE_ERR(fmt, args...)
-#define GSE_LOG(fmt, args...)
-#define GSE_FUN(f)
-#define DMT_DATA(dev, format, ...)
-#endif
-
-#define DMT10_I2C_ADDR 0x18
-
-
-#define INPUT_NAME_ACC "g-sensor" /* Input Device Name */
-#define DEVICE_I2C_NAME "g-sensor" /* Device name for DMARD10 misc. device */
-#define REG_ACTR 0x00
-#define REG_WDAL 0x01
-#define REG_TAPNS 0x0f
-#define REG_MISC2 0x1f
-#define REG_AFEM 0x0c
-#define REG_CKSEL 0x0d
-#define REG_INTC 0x0e
-#define REG_STADR 0x12
-#define REG_STAINT 0x1C
-#define REG_PD 0x21
-#define REG_TCGYZ 0x26
-#define REG_X_OUT 0x41
-
-#define MODE_Off 0x00
-#define MODE_ResetAtOff 0x01
-#define MODE_Standby 0x02
-#define MODE_ResetAtStandby 0x03
-#define MODE_Active 0x06
-#define MODE_Trigger 0x0a
-#define MODE_ReadOTP 0x12
-#define MODE_WriteOTP 0x22
-#define MODE_WriteOTPBuf 0x42
-#define MODE_ResetDataPath 0x82
-
-#define VALUE_STADR 0x55
-#define VALUE_STAINT 0xAA
-#define VALUE_AFEM_AFEN_Normal 0x8f// AFEN set 1 , ATM[2:0]=b'000(normal),EN_Z/Y/X/T=1
-#define VALUE_AFEM_Normal 0x0f// AFEN set 0 , ATM[2:0]=b'000(normal),EN_Z/Y/X/T=1
-#define VALUE_INTC 0x00// INTC[6:5]=b'00
-#define VALUE_INTC_Interrupt_En 0x20// INTC[6:5]=b'01 (Data ready interrupt enable, active high at INT0)
-#define VALUE_CKSEL_ODR_0_204 0x04// ODR[3:0]=b'0000 (0.78125Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_1_204 0x14// ODR[3:0]=b'0001 (1.5625Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_3_204 0x24// ODR[3:0]=b'0010 (3.125Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_6_204 0x34// ODR[3:0]=b'0011 (6.25Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_12_204 0x44// ODR[3:0]=b'0100 (12.5Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_25_204 0x54// ODR[3:0]=b'0101 (25Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_50_204 0x64// ODR[3:0]=b'0110 (50Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_100_204 0x74// ODR[3:0]=b'0111 (100Hz), CCK[3:0]=b'0100 (204.8kHZ)
-
-#define VALUE_TAPNS_NoFilter 0x00 // TAP1/TAP2 NO FILTER
-#define VALUE_TAPNS_Ave_2 0x11 // TAP1/TAP2 Average 2
-#define VALUE_TAPNS_Ave_4 0x22 // TAP1/TAP2 Average 4
-#define VALUE_TAPNS_Ave_8 0x33 // TAP1/TAP2 Average 8
-#define VALUE_TAPNS_Ave_16 0x44 // TAP1/TAP2 Average 16
-#define VALUE_TAPNS_Ave_32 0x55 // TAP1/TAP2 Average 32
-#define VALUE_MISC2_OSCA_EN 0x08
-#define VALUE_PD_RST 0x52
-
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE 1
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE 2
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE 3
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE 4
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE 5
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE 6
-
-#define AVG_NUM 16
-#define SENSOR_DATA_SIZE 3
-#define DEFAULT_SENSITIVITY 1024
-
-#define IOCTL_MAGIC 0x09
-#define SENSOR_RESET _IO(IOCTL_MAGIC, 0)
-#define SENSOR_CALIBRATION _IOWR(IOCTL_MAGIC, 1, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OFFSET _IOR(IOCTL_MAGIC, 2, int[SENSOR_DATA_SIZE])
-#define SENSOR_SET_OFFSET _IOWR(IOCTL_MAGIC, 3, int[SENSOR_DATA_SIZE])
-#define SENSOR_READ_ACCEL_XYZ _IOR(IOCTL_MAGIC, 4, int[SENSOR_DATA_SIZE])
-#define SENSOR_SETYPR _IOW(IOCTL_MAGIC, 5, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OPEN_STATUS _IO(IOCTL_MAGIC, 6)
-#define SENSOR_GET_CLOSE_STATUS _IO(IOCTL_MAGIC, 7)
-#define SENSOR_GET_DELAY _IOR(IOCTL_MAGIC, 8, unsigned int*)
-#define SENSOR_MAXNR 8
-
-/* g-senor layout configuration, choose one of the following configuration */
-#define CONFIG_GSEN_LAYOUT_PAT_1 1
-#define CONFIG_GSEN_LAYOUT_PAT_2 0
-#define CONFIG_GSEN_LAYOUT_PAT_3 0
-#define CONFIG_GSEN_LAYOUT_PAT_4 0
-#define CONFIG_GSEN_LAYOUT_PAT_5 0
-#define CONFIG_GSEN_LAYOUT_PAT_6 0
-#define CONFIG_GSEN_LAYOUT_PAT_7 0
-#define CONFIG_GSEN_LAYOUT_PAT_8 0
-
-s16 sensorlayout[3][3] = {
-#if CONFIG_GSEN_LAYOUT_PAT_1
- { 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1},
-#elif CONFIG_GSEN_LAYOUT_PAT_2
- { 0, 1, 0}, {-1, 0, 0}, { 0, 0, 1},
-#elif CONFIG_GSEN_LAYOUT_PAT_3
- {-1, 0, 0}, { 0,-1, 0}, { 0, 0, 1},
-#elif CONFIG_GSEN_LAYOUT_PAT_4
- { 0,-1, 0}, { 1, 0, 0}, { 0, 0, 1},
-#elif CONFIG_GSEN_LAYOUT_PAT_5
- {-1, 0, 0}, { 0, 1, 0}, { 0, 0,-1},
-#elif CONFIG_GSEN_LAYOUT_PAT_6
- { 0,-1, 0}, {-1, 0, 0}, { 0, 0,-1},
-#elif CONFIG_GSEN_LAYOUT_PAT_7
- { 1, 0, 0}, { 0,-1, 0}, { 0, 0,-1},
-#elif CONFIG_GSEN_LAYOUT_PAT_8
- { 0, 1, 0}, { 1, 0, 0}, { 0, 0,-1},
-#endif
-};
-
-typedef union {
- struct {
- s16 x;
- s16 y;
- s16 z;
- } u;
- s16 v[SENSOR_DATA_SIZE];
-} raw_data;
-
-struct dmt_data {
- dev_t devno;
- struct cdev cdev;
- struct device *class_dev;
- struct class *class;
- struct input_dev *input;
- struct i2c_client *client;
- struct delayed_work delaywork;
- struct work_struct work;
- struct mutex sensor_mutex;
- wait_queue_head_t open_wq;
- atomic_t active;
- atomic_t delay;
- atomic_t enable;
-};
-
-#define ACC_DATA_FLAG 0
-#define MAG_DATA_FLAG 1
-#define ORI_DATA_FLAG 2
-#define DMT_NUM_SENSORS 3
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.c b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.c
deleted file mode 100755
index bd0b16af..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/*++
-Copyright (c) 2012 WonderMedia Technologies, Inc. All Rights Reserved.
-This PROPRIETARY SOFTWARE is the property of WonderMedia Technologies, Inc.
-and may contain trade secrets and/or other confidential information of
-WonderMedia Technologies, Inc. This file shall not be disclosed to any
-third party, in whole or in part, without prior written consent of
-WonderMedia.
-
-THIS PROPRIETARY SOFTWARE AND ANY RELATED DOCUMENTATION ARE PROVIDED
-AS IS, WITH ALL FAULTS, AND WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS
-OR IMPLIED, AND WonderMedia TECHNOLOGIES, INC. DISCLAIMS ALL EXPRESS
-OR IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
-QUIET ENJOYMENT OR NON-INFRINGEMENT.
---*/
-
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <asm/uaccess.h>
-#include <linux/miscdevice.h>
-#include <linux/module.h>
-#include "gsensor.h"
-
-#define GSENSOR_I2C_NAME "g-sensor"
-
-#ifdef CONFIG_WMT_SENSOR_DMT08
-#define GSENSOR_I2C_ADDR 0x1c
-#elif defined CONFIG_WMT_SENSOR_KXTI9
-#define GSENSOR_I2C_ADDR 0x0f
-#endif
-
-struct gsensor_data *gs_data;
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-
-struct i2c_board_info gsensor_i2c_board_info = {
- .type = GSENSOR_I2C_NAME,
- .flags = 0x00,
- .platform_data = NULL,
- .archdata = NULL,
- .irq = -1,
-};
-
-int gsensor_i2c_register_device (void)
-{
- struct i2c_board_info *gsensor_i2c_bi;
- struct i2c_adapter *adapter = NULL;
- struct i2c_client *client = NULL;
- gsensor_i2c_bi = &gsensor_i2c_board_info;
- adapter = i2c_get_adapter(0);/*in bus 0*/
-
- if (NULL == adapter) {
- printk("can not get i2c adapter, client address error\n");
- return -1;
- }
- gsensor_i2c_bi->addr = gs_data->i2c_addr;
- client = i2c_new_device(adapter, gsensor_i2c_bi);
- if (client == NULL) {
- printk("allocate i2c client failed\n");
- return -1;
- }
- i2c_put_adapter(adapter);
- return 0;
-}
-
-/*
- * Get the configure of sensor from u-boot.
- * Return: 0--success, other--error.
- */
-int get_gsensor_conf(struct gsensor_conf *gs_conf)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.gsensor", varbuf, &varlen)) {
- printk("wmt.io.gsensor not defined!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d",
- &gs_conf->op,
- &gs_conf->samp,
- &(gs_conf->xyz_axis[0][0]),
- &(gs_conf->xyz_axis[0][1]),
- &(gs_conf->xyz_axis[1][0]),
- &(gs_conf->xyz_axis[1][1]),
- &(gs_conf->xyz_axis[2][0]),
- &(gs_conf->xyz_axis[2][1]));
- printk(KERN_INFO "wmt.io.gsensor = %d:%d:%d:%d:%d:%d:%d:%d\n",
- gs_conf->op,
- gs_conf->samp,
- gs_conf->xyz_axis[0][0],
- gs_conf->xyz_axis[0][1],
- gs_conf->xyz_axis[1][0],
- gs_conf->xyz_axis[1][1],
- gs_conf->xyz_axis[2][0],
- gs_conf->xyz_axis[2][1]);
- if (n != 8) {
- printk("wmt.io.gsensor format is incorrect!\n");
- return -1;
- }
-
- if (gs_conf->op <= 0) {
- printk(KERN_INFO "wmt.io.gsensor is disabled\n");
- return -1;
- }
- }
- return 0;
-}
-
-static long gsensor_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- int flag;
-
- if (!gs_data)
- return -1;
-
- switch (cmd) {
- case WMT_IOCTL_APP_SET_AFLAG:
- if (copy_from_user(&flag, argp, sizeof(flag)))
- return -EFAULT;
- else {
- if (flag < 0 || flag > 1)
- return -EINVAL;
- gs_data->enable(flag);
- }
- break;
- case WMT_IOCTL_APP_GET_AFLAG:
- if (copy_to_user(argp, &flag, sizeof(flag)))
- return -EFAULT;
- break;
- case WMT_IOCTL_APP_SET_DELAY:
- if (copy_from_user(&flag, argp, sizeof(flag)))
- return -EFAULT;
- else
- gs_data->setDelay(flag);
-
- break;
- case WMT_IOCTL_APP_GET_DELAY:
- if (copy_to_user(argp, &flag, sizeof(flag)))
- return -EFAULT;
- break;
- case WMT_IOCTL_APP_GET_LSG:
- gs_data->getLSG(&flag);
- if (copy_to_user(argp, &flag, sizeof(flag)))
- return -EFAULT;
- break;
- default:
- return -ENOTTY;
- }
- return 0;
-}
-
-struct file_operations gsensor_fops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = gsensor_ioctl,
-};
-
-struct miscdevice gsensor_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "g-sensor",
- .fops = &gsensor_fops,
-};
-
-int gsensor_register(struct gsensor_data *data)
-{
- int err=-1;
-
- gs_data = data;
- err = misc_register(&gsensor_device);
- if (err)
- printk(KERN_ERR "%s: gsensor misc register failed\n", __func__);
- return err;
-}
-
-EXPORT_SYMBOL_GPL(gsensor_i2c_register_device);
-EXPORT_SYMBOL_GPL(get_gsensor_conf);
-EXPORT_SYMBOL_GPL(gsensor_register);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.h b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.h
deleted file mode 100755
index db644d77..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/gsensor.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*++
-Copyright (c) 2012 WonderMedia Technologies, Inc. All Rights Reserved.
-This PROPRIETARY SOFTWARE is the property of WonderMedia Technologies, Inc.
-and may contain trade secrets and/or other confidential information of
-WonderMedia Technologies, Inc. This file shall not be disclosed to any
-third party, in whole or in part, without prior written consent of
-WonderMedia.
-
-THIS PROPRIETARY SOFTWARE AND ANY RELATED DOCUMENTATION ARE PROVIDED
-AS IS, WITH ALL FAULTS, AND WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS
-OR IMPLIED, AND WonderMedia TECHNOLOGIES, INC. DISCLAIMS ALL EXPRESS
-OR IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
-QUIET ENJOYMENT OR NON-INFRINGEMENT.
---*/
-
-#ifndef __GSENSOR_H__
-#define __GSENSOR_H__
-
-#define IOCTL_WMT 0x01
-#define WMT_IOCTL_APP_SET_AFLAG _IOW(IOCTL_WMT, 0x01, int)
-#define WMT_IOCTL_APP_SET_DELAY _IOW(IOCTL_WMT, 0x02, int)
-#define WMT_IOCTL_APP_GET_AFLAG _IOW(IOCTL_WMT, 0x03, int)
-#define WMT_IOCTL_APP_GET_DELAY _IOW(IOCTL_WMT, 0x04, int)
-#define WMT_IOCTL_APP_GET_LSG _IOW(IOCTL_WMT, 0x05, int)
-
-struct gsensor_conf {
- int op;
- int samp;
- int xyz_axis[3][2];
-};
-
-struct gsensor_data {
- int i2c_addr;
- int (*enable) (int en);
- int (*setDelay) (int mdelay);
- int (*getLSG) (int *lsg);
-};
-
-extern int gsensor_i2c_register_device (void);
-extern int get_gsensor_conf(struct gsensor_conf *gs_conf);
-extern int gsensor_register(struct gsensor_data *gs_data);
-
-#endif \ No newline at end of file
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/Makefile
deleted file mode 100755
index 3df5b74c..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for the KXTI9 Sensor driver
-#
-
-sensor_kxti9-objs := kxti9.o
-obj-$(CONFIG_WMT_SENSOR_KXTI9) += sensor_kxti9.o
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.c b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.c
deleted file mode 100755
index c385842e..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.c
+++ /dev/null
@@ -1,1134 +0,0 @@
-/*
- * Copyright (C) 2009 Kionix, Inc.
- * Written by Chris Hudson <chudson@kionix.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- * 02111-1307, USA
- */
-
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-#include <linux/fs.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-#ifdef KXTI9_INT_MODE
-#include <linux/irq.h>
-#include <linux/gpio.h>
-#include <linux/interrupt.h>
-#endif
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include "kxti9.h"
-#include "../gsensor.h"
-
-#define NAME "g-sensor"
-#define G_MAX 2048 //8000
-/* OUTPUT REGISTERS */
-#define XOUT_L 0x06
-#define INT_SRC_REG1 0x15
-#define INT_STATUS_REG 0x16
-#define TILT_POS_CUR 0x10
-#define INT_REL 0x1A
-#define WHO_AM_I 0x0F
-/* CONTROL REGISTERS */
-#define DATA_CTRL 0x21
-#define CTRL_REG1 0x1B
-#define INT_CTRL1 0x1E
-#define CTRL_REG3 0x1D
-#define TILT_TIMER 0x28
-#define WUF_TIMER 0x29
-#define WUF_THRESH 0x5A
-#define TDT_TIMER 0x2B
-/* CONTROL REGISTER 1 BITS */
-#define PC1_OFF 0x00
-#define PC1_ON 0x80
-/* INTERRUPT SOURCE 2 BITS */
-#define TPS 0x01
-#define TDTS0 0x04
-#define TDTS1 0x08
-/* INPUT_ABS CONSTANTS */
-#define FUZZ 0 //32
-#define FLAT 0 //32
-/* RESUME STATE INDICES */
-#define RES_DATA_CTRL 0
-#define RES_CTRL_REG1 1
-#define RES_INT_CTRL1 2
-#define RES_TILT_TIMER 3
-#define RES_CTRL_REG3 4
-#define RES_WUF_TIMER 5
-#define RES_WUF_THRESH 6
-#define RES_TDT_TIMER 7
-#define RES_TDT_H_THRESH 8
-#define RES_TDT_L_THRESH 9
-#define RES_TAP_TIMER 10
-#define RES_TOTAL_TIMER 11
-#define RES_LAT_TIMER 12
-#define RES_WIN_TIMER 13
-#define RESUME_ENTRIES 14
-
-static struct gsensor_conf gs_conf;
-static struct kxti9_data *gs_ti9;
-
-extern int gsensor_i2c_register_device (void);
-
-struct kxti9_platform_data kxti9_pdata = {
- .min_interval = 1,
- .poll_interval = 200,//1000,
-
- .g_range = KXTI9_G_2G,
- .shift_adj = SHIFT_ADJ_2G,
-
- .axis_map_x = 0,
- .axis_map_y = 1,
- .axis_map_z = 2,
-
- .negate_x = 0,
- .negate_y = 0,
- .negate_z = 0,
-
- .data_odr_init = ODR12_5F,
-#ifdef KXTI9_INT_MODE
- .ctrl_reg1_init = KXTI9_G_8G | RES_12BIT | TDTE | WUFE | TPE,
- .int_ctrl_init = KXTI9_IEN | KXTI9_IEA | KXTI9_IEL,
-#else
- .ctrl_reg1_init = KXTI9_G_2G | RES_12BIT,
- .int_ctrl_init = 0,
-#endif
- .tilt_timer_init = 0x03,
- .engine_odr_init = OTP12_5 | OWUF50 | OTDT400,
- .wuf_timer_init = 0x16,
- .wuf_thresh_init = 0x28,
- .tdt_timer_init = 0x78,
- .tdt_h_thresh_init = 0xFF,
- .tdt_l_thresh_init = 0x14,
- .tdt_tap_timer_init = 0x53,
- .tdt_total_timer_init = 0x24,
- .tdt_latency_timer_init = 0x10,
- .tdt_window_timer_init = 0xA0,
-};
-
-/*
- * The following table lists the maximum appropriate poll interval for each
- * available output data rate.
- */
-struct {
- unsigned int cutoff;
- u8 mask;
-} kxti9_odr_table[] = {
- {
- 3, ODR800F}, {
- 5, ODR400F}, {
- 10, ODR200F}, {
- 20, ODR100F}, {
- 40, ODR50F}, {
- 80, ODR25F}, {
- 0, ODR12_5F},
-};
-
-struct kxti9_data {
- struct i2c_client *client;
- struct kxti9_platform_data *pdata;
- struct mutex lock;
- struct delayed_work input_work;
- struct input_dev *input_dev;
-#ifdef KXTI9_INT_MODE
- struct work_struct irq_work;
-#endif
-
- int hw_initialized;
- atomic_t enabled;
- u8 resume[RESUME_ENTRIES];
- int res_interval;
-#ifdef KXTI9_INT_MODE
- int irq;
-#endif
-};
-
-static int kxti9_i2c_read(struct kxti9_data *ti9, u8 addr, u8 *data, int len)
-{
- int err;
-
- struct i2c_msg msgs[] = {
- {
- .addr = ti9->client->addr,
- .flags = ti9->client->flags & I2C_M_TEN,
- .len = 1,
- .buf = &addr,
- },
- {
- .addr = ti9->client->addr,
- .flags = (ti9->client->flags & I2C_M_TEN) | I2C_M_RD,
- .len = len,
- .buf = data,
- },
- };
- err = i2c_transfer(ti9->client->adapter, msgs, 2);
-
- if (err != 2)
- dev_err(&ti9->client->dev, "read transfer error\n");
- else
- err = 0;
-
- return err;
-}
-
-static int kxti9_i2c_write(struct kxti9_data *ti9, u8 addr, u8 *data, int len)
-{
- int err;
- int i;
- u8 buf[len + 1];
-
- struct i2c_msg msgs[] = {
- {
- .addr = ti9->client->addr,
- .flags = ti9->client->flags & I2C_M_TEN,
- .len = len + 1,
- .buf = buf,
- },
- };
-
- buf[0] = addr;
- for (i = 0; i < len; i++) {
- buf[i + 1] = data[i];
- }
-
- err = i2c_transfer(ti9->client->adapter, msgs, 1);
-
- if (err != 1)
- dev_err(&ti9->client->dev, "write transfer error\n");
- else
- err = 0;
-
- return err;
-}
-
-static int kxti9_verify(struct kxti9_data *ti9)
-{
- int err;
- u8 buf;
-
- err = kxti9_i2c_read(ti9, WHO_AM_I, &buf, 1);
- /*** DEBUG OUTPUT - REMOVE ***/
- dev_info(&ti9->client->dev, "WHO_AM_I = 0x%02x\n", buf);
- /*** <end> DEBUG OUTPUT - REMOVE ***/
- if (err < 0)
- dev_err(&ti9->client->dev, "read err int source\n");
- if (buf != 0x04 && buf != 0x08) // jakie add 0x8 for kxtj9
- err = -1;
- return err;
-}
-
-int kxti9_update_g_range(struct kxti9_data *ti9, u8 new_g_range)
-{
- int err;
- u8 shift;
- u8 buf;
-
- switch (new_g_range) {
- case KXTI9_G_2G:
- shift = SHIFT_ADJ_2G;
- break;
- case KXTI9_G_4G:
- shift = SHIFT_ADJ_4G;
- break;
- case KXTI9_G_8G:
- shift = SHIFT_ADJ_8G;
- break;
- default:
- dev_err(&ti9->client->dev, "invalid g range request\n");
- return -EINVAL;
- }
- if (shift != ti9->pdata->shift_adj) {
- if (ti9->pdata->shift_adj > shift)
- ti9->resume[RES_WUF_THRESH] >>=
- (ti9->pdata->shift_adj - shift);
- if (ti9->pdata->shift_adj < shift)
- ti9->resume[RES_WUF_THRESH] <<=
- (shift - ti9->pdata->shift_adj);
-
- if (atomic_read(&ti9->enabled)) {
- buf = PC1_OFF;
- err = kxti9_i2c_write(ti9, CTRL_REG1, &buf, 1);
- if (err < 0)
- return err;
- buf = ti9->resume[RES_WUF_THRESH];
- err = kxti9_i2c_write(ti9, WUF_THRESH, &buf, 1);
- if (err < 0)
- return err;
- buf = (ti9->resume[RES_CTRL_REG1] & 0xE7) | new_g_range;
- err = kxti9_i2c_write(ti9, CTRL_REG1, &buf, 1);
- if (err < 0)
- return err;
- ti9->resume[RES_CTRL_REG1] = buf;
- ti9->pdata->shift_adj = shift;
- }
- }
- return 0;
-}
-
-int kxti9_update_odr(struct kxti9_data *ti9, int poll_interval)
-{
- int err = -1;
- int i;
- u8 config;
-
- /* Convert the poll interval into an output data rate configuration
- * that is as low as possible. The ordering of these checks must be
- * maintained due to the cascading cut off values - poll intervals are
- * checked from shortest to longest. At each check, if the next slower
- * ODR cannot support the current poll interval, we stop searching */
- for (i = 0; i < ARRAY_SIZE(kxti9_odr_table); i++) {
- config = kxti9_odr_table[i].mask;
- if (poll_interval < kxti9_odr_table[i].cutoff)
- break;
- }
-
- if (atomic_read(&ti9->enabled)) {
- err = kxti9_i2c_write(ti9, DATA_CTRL, &config, 1);
- if (err < 0)
- return err;
- /*
- * Latch on input_dev - indicates that kxti9_input_init passed
- * and this workqueue is available
- */
- if (ti9->input_dev) {
- cancel_delayed_work_sync(&ti9->input_work);
- schedule_delayed_work(&ti9->input_work,
- msecs_to_jiffies(poll_interval));
- }
- }
- ti9->resume[RES_DATA_CTRL] = config;
-
- return 0;
-}
-
-static int kxti9_hw_init(struct kxti9_data *ti9)
-{
- int err = -1;
- u8 buf[7];
-
- buf[0] = PC1_OFF;
- err = kxti9_i2c_write(ti9, CTRL_REG1, buf, 1);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, DATA_CTRL, &ti9->resume[RES_DATA_CTRL], 1);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, CTRL_REG3, &ti9->resume[RES_CTRL_REG3], 1);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, TILT_TIMER, &ti9->resume[RES_TILT_TIMER], 1);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, WUF_TIMER, &ti9->resume[RES_WUF_TIMER], 1);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, WUF_THRESH, &ti9->resume[RES_WUF_THRESH], 1);
- if (err < 0)
- return err;
- buf[0] = ti9->resume[RES_TDT_TIMER];
- buf[1] = ti9->resume[RES_TDT_H_THRESH];
- buf[2] = ti9->resume[RES_TDT_L_THRESH];
- buf[3] = ti9->resume[RES_TAP_TIMER];
- buf[4] = ti9->resume[RES_TOTAL_TIMER];
- buf[5] = ti9->resume[RES_LAT_TIMER];
- buf[6] = ti9->resume[RES_WIN_TIMER];
- err = kxti9_i2c_write(ti9, TDT_TIMER, buf, 7);
- if (err < 0)
- return err;
- err = kxti9_i2c_write(ti9, INT_CTRL1, &ti9->resume[RES_INT_CTRL1], 1);
- if (err < 0)
- return err;
- buf[0] = (ti9->resume[RES_CTRL_REG1] | PC1_ON);
- err = kxti9_i2c_write(ti9, CTRL_REG1, buf, 1);
- if (err < 0)
- return err;
- ti9->resume[RES_CTRL_REG1] = buf[0];
- ti9->hw_initialized = 1;
-
- return 0;
-}
-
-static void kxti9_device_power_off(struct kxti9_data *ti9)
-{
- int err;
- u8 buf = PC1_OFF;
-
- err = kxti9_i2c_write(ti9, CTRL_REG1, &buf, 1);
- if (err < 0)
- dev_err(&ti9->client->dev, "soft power off failed\n");
-#ifdef KXTI9_INT_MODE
- disable_irq(ti9->irq);
-#endif
- if (ti9->pdata->power_off)
- ti9->pdata->power_off();
- ti9->hw_initialized = 0;
-}
-
-static int kxti9_device_power_on(struct kxti9_data *ti9)
-{
- int err;
-
- if (ti9->pdata->power_on) {
- err = ti9->pdata->power_on();
- if (err < 0)
- return err;
- }
-#ifdef KXTI9_INT_MODE
- enable_irq(ti9->irq);
-#endif
- if (!ti9->hw_initialized) {
- msleep(100);
- err = kxti9_hw_init(ti9);
- if (err < 0) {
- kxti9_device_power_off(ti9);
- return err;
- }
- }
-
- return 0;
-}
-
-#ifdef KXTI9_INT_MODE
-static irqreturn_t kxti9_isr(int irq, void *dev)
-{
- struct kxti9_data *ti9 = dev;
-
- disable_irq_nosync(irq);
- schedule_work(&ti9->irq_work);
-
- return IRQ_HANDLED;
-}
-#endif
-
-static u8 kxti9_resolve_dir(struct kxti9_data *ti9, u8 dir)
-{
- switch (dir) {
- case 0x20: /* -X */
- if (ti9->pdata->negate_x)
- dir = 0x10;
- if (ti9->pdata->axis_map_y == 0)
- dir >>= 2;
- if (ti9->pdata->axis_map_z == 0)
- dir >>= 4;
- break;
- case 0x10: /* +X */
- if (ti9->pdata->negate_x)
- dir = 0x20;
- if (ti9->pdata->axis_map_y == 0)
- dir >>= 2;
- if (ti9->pdata->axis_map_z == 0)
- dir >>= 4;
- break;
- case 0x08: /* -Y */
- if (ti9->pdata->negate_y)
- dir = 0x04;
- if (ti9->pdata->axis_map_x == 1)
- dir <<= 2;
- if (ti9->pdata->axis_map_z == 1)
- dir >>= 2;
- break;
- case 0x04: /* +Y */
- if (ti9->pdata->negate_y)
- dir = 0x08;
- if (ti9->pdata->axis_map_x == 1)
- dir <<= 2;
- if (ti9->pdata->axis_map_z == 1)
- dir >>= 2;
- break;
- case 0x02: /* -Z */
- if (ti9->pdata->negate_z)
- dir = 0x01;
- if (ti9->pdata->axis_map_x == 2)
- dir <<= 4;
- if (ti9->pdata->axis_map_y == 2)
- dir <<= 2;
- break;
- case 0x01: /* +Z */
- if (ti9->pdata->negate_z)
- dir = 0x02;
- if (ti9->pdata->axis_map_x == 2)
- dir <<= 4;
- if (ti9->pdata->axis_map_y == 2)
- dir <<= 2;
- break;
- default:
- return -EINVAL;
- }
-
- return dir;
-}
-
-static int kxti9_get_acceleration_data(struct kxti9_data *ti9, int *xyz)
-{
- int err;
- /* Data bytes from hardware xL, xH, yL, yH, zL, zH */
- u8 acc_data[6];
- /* x,y,z hardware values */
- int hw_d[3];
-
- err = kxti9_i2c_read(ti9, XOUT_L, acc_data, 6);
- if (err < 0)
- return err;
-
- hw_d[0] = (int) (((acc_data[1]) << 8) | acc_data[0]);
- hw_d[1] = (int) (((acc_data[3]) << 8) | acc_data[2]);
- hw_d[2] = (int) (((acc_data[5]) << 8) | acc_data[4]);
-
- hw_d[0] = (hw_d[0] & 0x8000) ? ((hw_d[0] | 0xFFFF0000) + 1) : (hw_d[0]);
- hw_d[1] = (hw_d[1] & 0x8000) ? ((hw_d[1] | 0xFFFF0000) + 1) : (hw_d[1]);
- hw_d[2] = (hw_d[2] & 0x8000) ? ((hw_d[2] | 0xFFFF0000) + 1) : (hw_d[2]);
-
- hw_d[0] >>= 4;
- hw_d[1] >>= 4;
- hw_d[2] >>= 4;
-
- xyz[0] = ((ti9->pdata->negate_x) ? (-hw_d[ti9->pdata->axis_map_x])
- : (hw_d[ti9->pdata->axis_map_x]));
- xyz[1] = ((ti9->pdata->negate_y) ? (-hw_d[ti9->pdata->axis_map_y])
- : (hw_d[ti9->pdata->axis_map_y]));
- xyz[2] = ((ti9->pdata->negate_z) ? (-hw_d[ti9->pdata->axis_map_z])
- : (hw_d[ti9->pdata->axis_map_z]));
-
- /*** DEBUG OUTPUT - REMOVE ***/
- //dev_info(&ti9->client->dev, "x:%d y:%d z:%d\n", xyz[0], xyz[1], xyz[2]);
- /*** <end> DEBUG OUTPUT - REMOVE ***/
-
- return err;
-}
-
-static void kxti9_report_values(struct kxti9_data *ti9, int *xyz)
-{
- input_report_abs(ti9->input_dev, ABS_X, xyz[gs_conf.xyz_axis[ABS_X][0]]*gs_conf.xyz_axis[ABS_X][1]);
- input_report_abs(ti9->input_dev, ABS_Y, xyz[gs_conf.xyz_axis[ABS_Y][0]]*gs_conf.xyz_axis[ABS_Y][1]);
- input_report_abs(ti9->input_dev, ABS_Z, xyz[gs_conf.xyz_axis[ABS_Z][0]]*gs_conf.xyz_axis[ABS_Z][1]);
- input_sync(ti9->input_dev);
-}
-
-#ifdef KXTI9_INT_MODE
-static void kxti9_irq_work_func(struct work_struct *work)
-{
-/*
- * int_status output:
- * [INT_SRC_REG2][INT_SRC_REG1][TILT_POS_PRE][TILT_POS_CUR]
- * INT_SRC_REG1, TILT_POS_PRE, and TILT_POS_CUR directions are translated
- * based on platform data variables.
- */
-
- int err;
- int int_status = 0;
- u8 status;
- u8 buf[2];
-
- struct kxti9_data *ti9
- = container_of(work, struct kxti9_data, irq_work);
-
- err = kxti9_i2c_read(ti9, INT_STATUS_REG, &status, 1);
- if (err < 0)
- dev_err(&ti9->client->dev, "read err int source\n");
- int_status = status << 24;
- if ((status & TPS) > 0) {
- err = kxti9_i2c_read(ti9, TILT_POS_CUR, buf, 2);
- if (err < 0)
- dev_err(&ti9->client->dev, "read err tilt dir\n");
- int_status |= kxti9_resolve_dir(ti9, buf[0]);
- int_status |= kxti9_resolve_dir(ti9, buf[1]) << 8;
- /*** DEBUG OUTPUT - REMOVE ***/
- dev_info(&ti9->client->dev, "IRQ TILT [%x]\n",
- kxti9_resolve_dir(ti9, buf[0]));
- /*** <end> DEBUG OUTPUT - REMOVE ***/
- }
- if (((status & TDTS0) | (status & TDTS1)) > 0) {
- err = kxti9_i2c_read(ti9, INT_SRC_REG1, buf, 1);
- if (err < 0)
- dev_err(&ti9->client->dev, "read err tap dir\n");
- int_status |= (kxti9_resolve_dir(ti9, buf[0])) << 16;
- /*** DEBUG OUTPUT - REMOVE ***/
- dev_info(&ti9->client->dev, "IRQ TAP%d [%x]\n",
- ((status & TDTS1) ? (2) : (1)), kxti9_resolve_dir(ti9, buf[0]));
- /*** <end> DEBUG OUTPUT - REMOVE ***/
- }
- /*** DEBUG OUTPUT - REMOVE ***/
- if ((status & 0x02) > 0) {
- if (((status & TDTS0) | (status & TDTS1)) > 0)
- dev_info(&ti9->client->dev, "IRQ WUF + TAP\n");
- else
- dev_info(&ti9->client->dev, "IRQ WUF\n");
- }
- /*** <end> DEBUG OUTPUT - REMOVE ***/
- if (int_status & 0x2FFF) {
- input_report_abs(ti9->input_dev, ABS_MISC, int_status);
- input_sync(ti9->input_dev);
- }
- err = kxti9_i2c_read(ti9, INT_REL, buf, 1);
- if (err < 0)
- dev_err(&ti9->client->dev,
- "error clearing interrupt status: %d\n", err);
-
- enable_irq(ti9->irq);
-}
-#endif
-
-static int kxti9_enable(struct kxti9_data *ti9)
-{
- int err;
- int int_status = 0;
- u8 buf;
-
- if (!atomic_cmpxchg(&ti9->enabled, 0, 1)) {
- err = kxti9_device_power_on(ti9);
- err = kxti9_i2c_read(ti9, INT_REL, &buf, 1);
- if (err < 0) {
- dev_err(&ti9->client->dev,
- "error clearing interrupt: %d\n", err);
- atomic_set(&ti9->enabled, 0);
- return err;
- }
- if ((ti9->resume[RES_CTRL_REG1] & TPE) > 0) {
- err = kxti9_i2c_read(ti9, TILT_POS_CUR, &buf, 1);
- if (err < 0) {
- dev_err(&ti9->client->dev,
- "read err current tilt\n");
- int_status |= kxti9_resolve_dir(ti9, buf);
- input_report_abs(ti9->input_dev, ABS_MISC, int_status);
- input_sync(ti9->input_dev);
- }
- }
- schedule_delayed_work(&ti9->input_work,
- msecs_to_jiffies(ti9->res_interval));
- }
-
- return 0;
-}
-
-static int kxti9_disable(struct kxti9_data *ti9)
-{
- if (atomic_cmpxchg(&ti9->enabled, 1, 0)) {
- cancel_delayed_work_sync(&ti9->input_work);
- kxti9_device_power_off(ti9);
- }
-
- return 0;
-}
-
-static void kxti9_input_work_func(struct work_struct *work)
-{
- struct kxti9_data *ti9 = container_of((struct delayed_work *)work,
- struct kxti9_data, input_work);
- int xyz[3] = { 0 };
-
- mutex_lock(&ti9->lock);
-
- if (kxti9_get_acceleration_data(ti9, xyz) == 0)
- kxti9_report_values(ti9, xyz);
-
- schedule_delayed_work(&ti9->input_work,
- msecs_to_jiffies(ti9->res_interval));
-
- mutex_unlock(&ti9->lock);
-}
-
-int kxti9_input_open(struct input_dev *input)
-{
- struct kxti9_data *ti9 = input_get_drvdata(input);
-
- return kxti9_enable(ti9);
-}
-
-void kxti9_input_close(struct input_dev *dev)
-{
- struct kxti9_data *ti9 = input_get_drvdata(dev);
-
- kxti9_disable(ti9);
-}
-
-static int kxti9_input_init(struct kxti9_data *ti9)
-{
- int err;
-
- INIT_DELAYED_WORK(&ti9->input_work, kxti9_input_work_func);
- ti9->input_dev = input_allocate_device();
- if (!ti9->input_dev) {
- err = -ENOMEM;
- dev_err(&ti9->client->dev, "input device allocate failed\n");
- goto err0;
- }
- //ti9->input_dev->open = kxti9_input_open;
- //ti9->input_dev->close = kxti9_input_close;
-
- input_set_drvdata(ti9->input_dev, ti9);
-
- set_bit(EV_ABS, ti9->input_dev->evbit);
- set_bit(ABS_MISC, ti9->input_dev->absbit);
-
- input_set_abs_params(ti9->input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(ti9->input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(ti9->input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT);
-
- ti9->input_dev->name = "g-sensor";
-
- err = input_register_device(ti9->input_dev);
- if (err) {
- dev_err(&ti9->client->dev,
- "unable to register input polled device %s: %d\n",
- ti9->input_dev->name, err);
- goto err1;
- }
-
- return 0;
-err1:
- input_free_device(ti9->input_dev);
-err0:
- return err;
-}
-
-static void kxti9_input_cleanup(struct kxti9_data *ti9)
-{
- input_unregister_device(ti9->input_dev);
-}
-
-/* sysfs */
-static ssize_t kxti9_delay_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- return sprintf(buf, "%d\n", ti9->res_interval);
-}
-
-static ssize_t kxti9_delay_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
-
- ti9->res_interval = max(val, ti9->pdata->min_interval);
- kxti9_update_odr(ti9, ti9->res_interval);
-
- return count;
-}
-
-static ssize_t kxti9_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- return sprintf(buf, "%d\n", atomic_read(&ti9->enabled));
-}
-
-static ssize_t kxti9_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
- if (val)
- kxti9_enable(ti9);
- else
- kxti9_disable(ti9);
- return count;
-}
-
-static ssize_t kxti9_tilt_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- u8 tilt;
-
- if (ti9->resume[RES_CTRL_REG1] & TPE) {
- kxti9_i2c_read(ti9, TILT_POS_CUR, &tilt, 1);
- return sprintf(buf, "%d\n", kxti9_resolve_dir(ti9, tilt));
- } else {
- return sprintf(buf, "%d\n", 0);
- }
-}
-
-static ssize_t kxti9_tilt_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
- if (val)
- ti9->resume[RES_CTRL_REG1] |= TPE;
- else
- ti9->resume[RES_CTRL_REG1] &= (~TPE);
- kxti9_i2c_write(ti9, CTRL_REG1, &ti9->resume[RES_CTRL_REG1], 1);
- return count;
-}
-
-static ssize_t kxti9_wake_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- u8 val = ti9->resume[RES_CTRL_REG1] & WUFE;
- if (val)
- return sprintf(buf, "%d\n", 1);
- else
- return sprintf(buf, "%d\n", 0);
-}
-
-static ssize_t kxti9_wake_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
- if (val)
- ti9->resume[RES_CTRL_REG1] |= WUFE;
- else
- ti9->resume[RES_CTRL_REG1] &= (~WUFE);
- kxti9_i2c_write(ti9, CTRL_REG1, &ti9->resume[RES_CTRL_REG1], 1);
- return count;
-}
-
-static ssize_t kxti9_tap_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- u8 val = ti9->resume[RES_CTRL_REG1] & TDTE;
- if (val)
- return sprintf(buf, "%d\n", 1);
- else
- return sprintf(buf, "%d\n", 0);
-}
-
-static ssize_t kxti9_tap_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
- if (val)
- ti9->resume[RES_CTRL_REG1] |= TDTE;
- else
- ti9->resume[RES_CTRL_REG1] &= (~TDTE);
- kxti9_i2c_write(ti9, CTRL_REG1, &ti9->resume[RES_CTRL_REG1], 1);
- return count;
-}
-
-static ssize_t kxti9_selftest_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- int val = simple_strtoul(buf, NULL, 10);
- u8 ctrl = 0x00;
- if (val)
- ctrl = 0xCA;
- kxti9_i2c_write(ti9, 0x3A, &ctrl, 1);
- return count;
-}
-
-static DEVICE_ATTR(delay, S_IRUGO|S_IWUSR, kxti9_delay_show, kxti9_delay_store);
-static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR, kxti9_enable_show,
- kxti9_enable_store);
-static DEVICE_ATTR(tilt, S_IRUGO|S_IWUSR, kxti9_tilt_show, kxti9_tilt_store);
-static DEVICE_ATTR(wake, S_IRUGO|S_IWUSR, kxti9_wake_show, kxti9_wake_store);
-static DEVICE_ATTR(tap, S_IRUGO|S_IWUSR, kxti9_tap_show, kxti9_tap_store);
-static DEVICE_ATTR(selftest, S_IWUSR, NULL, kxti9_selftest_store);
-
-static struct attribute *kxti9_attributes[] = {
- &dev_attr_delay.attr,
- &dev_attr_enable.attr,
- &dev_attr_tilt.attr,
- &dev_attr_wake.attr,
- &dev_attr_tap.attr,
- &dev_attr_selftest.attr,
- NULL
-};
-
-static struct attribute_group kxti9_attribute_group = {
- .attrs = kxti9_attributes
-};
-/* /sysfs */
-static int __devinit kxti9_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
-{
- int err = -1;
- struct kxti9_data *ti9 = kzalloc(sizeof(*ti9), GFP_KERNEL);
- gs_ti9 = ti9;
- if (ti9 == NULL) {
- dev_err(&client->dev,
- "failed to allocate memory for module data\n");
- err = -ENOMEM;
- goto err0;
- }
- /*
- if (client->dev.platform_data == NULL) {
- dev_err(&client->dev, "platform data is NULL; exiting\n");
- err = -ENODEV;
- goto err0;
- }
- */
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
- dev_err(&client->dev, "client not i2c capable\n");
- err = -ENODEV;
- goto err0;
- }
- mutex_init(&ti9->lock);
- mutex_lock(&ti9->lock);
- ti9->client = client;
- i2c_set_clientdata(client, ti9);
-
-#ifdef KXTI9_INT_MODE
- INIT_WORK(&ti9->irq_work, kxti9_irq_work_func);
-#endif
- ti9->pdata = kmalloc(sizeof(*ti9->pdata), GFP_KERNEL);
- if (ti9->pdata == NULL)
- goto err1;
-
- err = sysfs_create_group(&client->dev.kobj, &kxti9_attribute_group);
- if (err)
- goto err1;
-
- //memcpy(ti9->pdata, client->dev.platform_data, sizeof(*ti9->pdata));
- memcpy(ti9->pdata, &kxti9_pdata, sizeof(*ti9->pdata));
-
- if (ti9->pdata->init) {
- err = ti9->pdata->init();
- if (err < 0)
- goto err2;
- }
-
-#ifdef KXTI9_INT_MODE
- ti9->irq = gpio_to_irq(ti9->pdata->gpio);
-#endif
-
- memset(ti9->resume, 0, ARRAY_SIZE(ti9->resume));
- ti9->resume[RES_DATA_CTRL] = ti9->pdata->data_odr_init;
- ti9->resume[RES_CTRL_REG1] = ti9->pdata->ctrl_reg1_init;
- ti9->resume[RES_INT_CTRL1] = ti9->pdata->int_ctrl_init;
- ti9->resume[RES_TILT_TIMER] = ti9->pdata->tilt_timer_init;
- ti9->resume[RES_CTRL_REG3] = ti9->pdata->engine_odr_init;
- ti9->resume[RES_WUF_TIMER] = ti9->pdata->wuf_timer_init;
- ti9->resume[RES_WUF_THRESH] = ti9->pdata->wuf_thresh_init;
- ti9->resume[RES_TDT_TIMER] = ti9->pdata->tdt_timer_init;
- ti9->resume[RES_TDT_H_THRESH] = ti9->pdata->tdt_h_thresh_init;
- ti9->resume[RES_TDT_L_THRESH] = ti9->pdata->tdt_l_thresh_init;
- ti9->resume[RES_TAP_TIMER] = ti9->pdata->tdt_tap_timer_init;
- ti9->resume[RES_TOTAL_TIMER] = ti9->pdata->tdt_total_timer_init;
- ti9->resume[RES_LAT_TIMER] = ti9->pdata->tdt_latency_timer_init;
- ti9->resume[RES_WIN_TIMER] = ti9->pdata->tdt_window_timer_init;
- ti9->res_interval = ti9->pdata->poll_interval;
-
- err = kxti9_device_power_on(ti9);
- if (err < 0)
- goto err3;
- atomic_set(&ti9->enabled, 1);
-
- err = kxti9_verify(ti9);
- if (err < 0) {
- dev_err(&client->dev, "unresolved i2c client\n");
- goto err4;
- }
-
- err = kxti9_update_g_range(ti9, ti9->pdata->g_range);
- if (err < 0)
- goto err4;
-
- err = kxti9_update_odr(ti9, ti9->res_interval);
- if (err < 0)
- goto err4;
-
- err = kxti9_input_init(ti9);
- if (err < 0)
- goto err4;
-
- kxti9_device_power_off(ti9);
- atomic_set(&ti9->enabled, 0);
-
-#ifdef KXTI9_INT_MODE
- err = request_irq(ti9->irq, kxti9_isr,
- IRQF_TRIGGER_RISING | IRQF_DISABLED, "kxti9-irq", ti9);
- if (err < 0) {
- pr_err("%s: request irq failed: %d\n", __func__, err);
- goto err5;
- }
- disable_irq_nosync(ti9->irq);
-#endif
-
- mutex_unlock(&ti9->lock);
-
- return 0;
-
-#ifdef KXTI9_INT_MODE
-err5:
-#endif
- kxti9_input_cleanup(ti9);
-err4:
- kxti9_device_power_off(ti9);
-err3:
- if (ti9->pdata->exit)
- ti9->pdata->exit();
-err2:
- kfree(ti9->pdata);
- sysfs_remove_group(&client->dev.kobj, &kxti9_attribute_group);
-err1:
- mutex_unlock(&ti9->lock);
- kfree(ti9);
-err0:
- return err;
-}
-
-static int __devexit kxti9_remove(struct i2c_client *client)
-{
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
-
-#ifdef KXTI9_INT_MODE
- free_irq(ti9->irq, ti9);
- gpio_free(ti9->pdata->gpio);
-#endif
- kxti9_input_cleanup(ti9);
- kxti9_device_power_off(ti9);
- if (ti9->pdata->exit)
- ti9->pdata->exit();
- kfree(ti9->pdata);
- sysfs_remove_group(&client->dev.kobj, &kxti9_attribute_group);
- kfree(ti9);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-static int kxti9_resume(struct i2c_client *client)
-{
- //struct kxti9_data *ti9 = i2c_get_clientdata(client);
- //return kxti9_enable(ti9);
- return 0;
-}
-
-static int kxti9_suspend(struct i2c_client *client, pm_message_t mesg)
-{
- //struct kxti9_data *ti9 = i2c_get_clientdata(client);
- //return kxti9_disable(ti9);
- return 0;
-}
-
-static void kxti9_shutdown(struct i2c_client *client)
-{
- struct kxti9_data *ti9 = i2c_get_clientdata(client);
- if (atomic_read(&ti9->enabled)) {
- flush_delayed_work_sync(&ti9->input_work);
- cancel_delayed_work_sync(&ti9->input_work);
- }
-}
-#endif
-
-static const struct i2c_device_id kxti9_id[] = {
- {NAME, 0},
- {},
-};
-
-MODULE_DEVICE_TABLE(i2c, kxti9_id);
-
-static struct i2c_driver kxti9_driver = {
- .driver = {
- .name = NAME,
- },
- .probe = kxti9_probe,
- .remove = __devexit_p(kxti9_remove),
- .resume = kxti9_resume,
- .suspend = kxti9_suspend,
- .shutdown = kxti9_shutdown,
- .id_table = kxti9_id,
-};
-
-int kxti9_enable_accel(int en)
-{
- printk(KERN_DEBUG "%s: enable = %d\n", __func__, en);
- if (en)
- kxti9_enable(gs_ti9);
- else
- kxti9_disable(gs_ti9);
- return 0;
-}
-
-int kxti9_setDelay(int mdelay)
-{
- printk(KERN_DEBUG "%s: delay = %d\n", __func__, mdelay);
- gs_ti9->res_interval = mdelay;
- return kxti9_update_odr(gs_ti9, gs_ti9->res_interval);
-}
-
-int kxti9_getLSG(int *lsg)
-{
- int max_count;
- if (gs_ti9->resume[RES_CTRL_REG1] & RES_12BIT)
- max_count = 2048;
- else
- max_count = 128;
-
- if ((gs_ti9->resume[RES_CTRL_REG1] & 0x18) == KXTI9_G_2G)
- *lsg = max_count >> 1;
- else if ((gs_ti9->resume[RES_CTRL_REG1] & 0x18) == KXTI9_G_4G)
- *lsg = max_count >> 2;
- else if ((gs_ti9->resume[RES_CTRL_REG1] & 0x18) == KXTI9_G_8G)
- *lsg = max_count >> 3;
-
- printk(KERN_DEBUG "%s: LSG = %d\n", __func__, *lsg);
- return 0;
-}
-
-struct gsensor_data kxti9_gs_data = {
- .i2c_addr = KXTI9_I2C_ADDR,
- .enable = kxti9_enable_accel,
- .setDelay = kxti9_setDelay,
- .getLSG = kxti9_getLSG,
-};
-
-static int __init kxti9_init(void)
-{
- if (get_gsensor_conf(&gs_conf))
- return -1;
-
- if (gs_conf.op != 2)
- return -1;
-
- printk("G-Sensor kxti9 init\n");
-
- if (gsensor_register(&kxti9_gs_data))
- return -1;
-
- if (gsensor_i2c_register_device() < 0)
- return -1;
-
- return i2c_add_driver(&kxti9_driver);
-}
-
-static void __exit kxti9_exit(void)
-{
- i2c_del_driver(&kxti9_driver);
-}
-
-module_init(kxti9_init);
-module_exit(kxti9_exit);
-
-MODULE_DESCRIPTION("KXTI9 accelerometer driver");
-MODULE_AUTHOR("Chris Hudson <chudson@kionix.com>");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.h b/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.h
deleted file mode 100755
index c66c740a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/TP_DRIVER_NOT_USE/kxti9_gsensor/kxti9.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2009, Kionix, Inc. All Rights Reserved.
- * Written by Chris Hudson <chudson@kionix.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __KXTI9_H__
-#define __KXTI9_H__
-
-#define KXTI9_I2C_ADDR 0x0F
-/* CONTROL REGISTER 1 BITS */
-#define RES_12BIT 0x40
-#define KXTI9_G_2G 0x00
-#define KXTI9_G_4G 0x08
-#define KXTI9_G_8G 0x10
-#define SHIFT_ADJ_2G 4
-#define SHIFT_ADJ_4G 3
-#define SHIFT_ADJ_8G 2
-#define TPE 0x01 /* tilt position function enable bit */
-#define WUFE 0x02 /* wake-up function enable bit */
-#define TDTE 0x04 /* tap/double-tap function enable bit */
-/* CONTROL REGISTER 3 BITS */
-#define OTP1_6 0x00 /* tilt ODR masks */
-#define OTP6_3 0x20
-#define OTP12_5 0x40
-#define OTP50 0x60
-#define OWUF25 0x00 /* wuf ODR masks */
-#define OWUF50 0x01
-#define OWUF100 0x02
-#define OWUF200 0x03
-#define OTDT50 0x00 /* tdt ODR masks */
-#define OTDT100 0x04
-#define OTDT200 0x08
-#define OTDT400 0x0C
-/* INTERRUPT CONTROL REGISTER 1 BITS */
-#define KXTI9_IEN 0x20 /* interrupt enable */
-#define KXTI9_IEA 0x10 /* interrupt polarity */
-#define KXTI9_IEL 0x08 /* interrupt response */
-#define IEU 0x04 /* alternate unlatched response */
-/* DATA CONTROL REGISTER BITS */
-#define ODR800F 0x06 /* lpf output ODR masks */
-#define ODR400F 0x05
-#define ODR200F 0x04
-#define ODR100F 0x03
-#define ODR50F 0x02
-#define ODR25F 0x01
-#define ODR12_5F 0x00
-
-#ifdef __KERNEL__
-struct kxti9_platform_data {
- int poll_interval;
- int min_interval;
-
- u8 g_range;
- u8 shift_adj;
-
- u8 axis_map_x;
- u8 axis_map_y;
- u8 axis_map_z;
-
- u8 negate_x;
- u8 negate_y;
- u8 negate_z;
-
- u8 data_odr_init;
- u8 ctrl_reg1_init;
- u8 int_ctrl_init;
- u8 tilt_timer_init;
- u8 engine_odr_init;
- u8 wuf_timer_init;
- u8 wuf_thresh_init;
- u8 tdt_timer_init;
- u8 tdt_h_thresh_init;
- u8 tdt_l_thresh_init;
- u8 tdt_tap_timer_init;
- u8 tdt_total_timer_init;
- u8 tdt_latency_timer_init;
- u8 tdt_window_timer_init;
-
- int (*init)(void);
- void (*exit)(void);
- int (*power_on)(void);
- int (*power_off)(void);
-
- int gpio;
-};
-#endif /* __KERNEL__ */
-
-#endif /* __KXTI9_H__ */
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/cm3232/Makefile b/ANDROID_3.4.5/drivers/input/sensor/cm3232/Makefile
deleted file mode 100755
index 06c28edd..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/cm3232/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_lsensor_cm3232
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := cm3232.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/cm3232/cm3232.c b/ANDROID_3.4.5/drivers/input/sensor/cm3232/cm3232.c
deleted file mode 100755
index 207ddd3a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/cm3232/cm3232.c
+++ /dev/null
@@ -1,855 +0,0 @@
-/*
- * cm3232.c - Intersil cm3232 ALS & Proximity Driver
- *
- * By Intersil Corp
- * Michael DiGioia
- *
- * Based on isl29011.c
- * by Mike DiGioia <mdigioia@intersil.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/hwmon.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/sysfs.h>
-#include <linux/pm_runtime.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-
-#include <linux/device.h>
-#include <linux/platform_device.h>
-//#include <linux/earlysuspend.h>
-
-#include "../sensor.h"
-
-/* Insmod parameters */
-//I2C_CLIENT_INSMOD_1(cm3232);
-#define SENSOR_I2C_NAME "cm3232"
-#define SENSOR_I2C_ADDR 0x10
-#define MODULE_NAME "cm3232"
-
-#define REG_CMD_1 0x00
-#define REG_CMD_2 0x01
-#define REG_DATA_LSB 0x02
-#define REG_DATA_MSB 0x03
-#define ISL_MOD_MASK 0xE0
-#define ISL_MOD_POWERDOWN 0
-#define ISL_MOD_ALS_ONCE 1
-#define ISL_MOD_IR_ONCE 2
-#define ISL_MOD_RESERVED 4
-#define ISL_MOD_ALS_CONT 5
-#define ISL_MOD_IR_CONT 6
-#define IR_CURRENT_MASK 0xC0
-#define IR_FREQ_MASK 0x30
-#define SENSOR_RANGE_MASK 0x03
-#define ISL_RES_MASK 0x0C
-
-
-#undef dbg
-#define dbg(fmt, args...) //printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__ , ## args)
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int no_adc_map = 1;
-static int last_mod;
-
-static struct i2c_client *this_client = NULL;
-
-struct isl_device {
- struct input_polled_dev* input_poll_dev;
- struct i2c_client* client;
- int resolution;
- int range;
- int isdbg;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-
-static struct isl_device* l_sensorconfig = NULL;
-static struct kobject *android_lsensor_kobj = NULL;
-static int l_enable = 0; // 0:don't report data, 1
-
-static DEFINE_MUTEX(mutex);
-
-#if 0
-static int isl_set_mod(struct i2c_client *client, int mod)
-{
- int ret, val, freq;
-
- switch (mod) {
- case ISL_MOD_POWERDOWN:
- case ISL_MOD_RESERVED:
- goto setmod;
- case ISL_MOD_ALS_ONCE:
- case ISL_MOD_ALS_CONT:
- freq = 0;
- break;
- case ISL_MOD_IR_ONCE:
- case ISL_MOD_IR_CONT:
- freq = 1;
- break;
- default:
- return -EINVAL;
- }
- /* set IR frequency */
- val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- if (val < 0)
- return -EINVAL;
- val &= ~IR_FREQ_MASK;
- if (freq)
- val |= IR_FREQ_MASK;
- ret = i2c_smbus_write_byte_data(client, REG_CMD_2, val);
- if (ret < 0)
- return -EINVAL;
-
-setmod:
- /* set operation mod */
- val = i2c_smbus_read_byte_data(client, REG_CMD_1);
- if (val < 0)
- return -EINVAL;
- val &= ~ISL_MOD_MASK;
- val |= (mod << 5);
- ret = i2c_smbus_write_byte_data(client, REG_CMD_1, val);
- if (ret < 0)
- return -EINVAL;
-
- if (mod != ISL_MOD_POWERDOWN)
- last_mod = mod;
-
- return mod;
-}
-
-static int isl_get_res(struct i2c_client *client)
-{
- int val;
-
- printk(KERN_INFO MODULE_NAME ": %s cm3232 get_res call, \n", __func__);
- val = i2c_smbus_read_word_data(client, 0)>>8 & 0xff;
-
- if (val < 0)
- return -EINVAL;
-
- val &= ISL_RES_MASK;
- val >>= 2;
-
- switch (val) {
- case 0:
- return 65536;
- case 1:
- return 4096;
- case 2:
- return 256;
- case 3:
- return 16;
- default:
- return -EINVAL;
- }
-}
-
-static int isl_get_range(struct i2c_client* client)
-{
- switch (i2c_smbus_read_word_data(client, 0)>>8 & 0xff & 0x3) {
- case 0: return 1000;
- case 1: return 4000;
- case 2: return 16000;
- case 3: return 64000;
- default: return -EINVAL;
- }
-}
-#endif
-//Fixme plan to transfer the adc value to the config.xml lux 2013-5-10
-static __u16 uadc[8] = {2, 8, 100, 400, 900, 1000, 1500, 1900};//customize
-static __u16 ulux[9] = {128, 200, 1300, 2000, 3000, 4000, 5000, 6000, 7000};
-static __u16 adc_to_lux(__u16 adc)
-{
- static long long var = 0;
- int i = 0; //length of array is 8,9
- for (i=0; i<8; i++) {
- if ( adc < uadc[i]){
- break;
- }
- }
- if ( i<9)
- {
- var++;
- if (var%2)
- return ulux[i]+0;
- else
- return ulux[i]+1;
- }
- return ulux[4];
-}
-
-
-
-static int isl_get_lux_data(struct i2c_client* client)
-{
- //struct isl_device* idev = i2c_get_clientdata(client);
-
- //__u16 resH = 0, resL = 0;
- __s16 resH = 0, resL = 0;
- //int range;
- resL = i2c_smbus_read_word_data(client, 0x50);
- //resH = i2c_smbus_read_word_data(client, 0x51)&0xff00;
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
-
- return 3000;//???
- //return -1;
- }
- //Fixme plan to transfer the adc value to the config.xml lux 2013-5-10
- if (!no_adc_map)
- resL = adc_to_lux(resL);
- //printk("<<<< lux %d\n", resL);
- return resL ;//* idev->range / idev->resolution;
- return (resH | resL) ;//* idev->range / idev->resolution;
-}
-
-
-static int isl_set_default_config(struct i2c_client *client)
-{
- //struct isl_device* idev = i2c_get_clientdata(client);
-
- int ret=0;
- //ret = _cm3232_I2C_Write_Byte(CM3232_SLAVE_addr, CM3232_ALS_RESET);
- ret = i2c_smbus_write_byte_data(client, 0, (1 << 6));
- if (ret < 0)
- return -EINVAL;
- //if(ret<0)
- //return ret;
- msleep(10);
-
- //ret = _cm3232_I2C_Write_Byte(CM3232_SLAVE_addr, CM3232_ALS_IT_200ms | CM3232_ALS_HS_HIGH );
- ret = i2c_smbus_write_byte_data(client, 0, (1 << 2)|(1 << 1));
- if (ret < 0)
- return -EINVAL;
- msleep(10);
- return 0;
-/* We don't know what it does ... */
-// ret = i2c_smbus_write_byte_data(client, REG_CMD_1, 0xE0);
-// ret = i2c_smbus_write_byte_data(client, REG_CMD_2, 0xC3);
-/* Set default to ALS continuous */
- ret = i2c_smbus_write_byte_data(client, REG_CMD_1, 0xA0);
- if (ret < 0)
- return -EINVAL;
-/* Range: 0~16000, number of clock cycles: 65536 */
- ret = i2c_smbus_write_byte_data(client, REG_CMD_2, 0x02); // vivienne
- if (ret < 0)
- return -EINVAL;
- //idev->resolution = isl_get_res(client);
- //idev->range = isl_get_range(client);;
- dbg("cm3232 set_default_config call, \n");
-
- return 0;
-}
-
-/* Return 0 if detection is successful, -ENODEV otherwise */
-static int cm3232_detect(struct i2c_client *client/*, int kind,
- struct i2c_board_info *info*/)
-{
-
-
- return 0;
-}
-
-int isl_input_open(struct input_dev* input)
-{
- return 0;
-}
-
-void isl_input_close(struct input_dev* input)
-{
-}
-
-static void isl_input_lux_poll(struct input_polled_dev *dev)
-{
- struct isl_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_dev->input;
- struct i2c_client* client = idev->client;
- static unsigned int val=0;
-
- //printk("%s\n", __FUNCTION__);
- if (l_enable != 0)
- {
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- #if 0
- if(val>0x2000)
- val=0;
- val+=100;
- #endif
- //printk(KERN_ALERT "by flashchen val is %x",val);
- input_report_abs(input, ABS_MISC, isl_get_lux_data(client));
- //input_report_abs(input, ABS_MISC, val);//isl_get_lux_data(client));
- input_sync(input);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- }
-}
-
-static struct i2c_device_id cm3232_id[] = {
- {"cm3232", 0},
- {}
-};
-
-#if 0
-static int cm3232_runtime_suspend(struct device *dev)
-{
-
- dev_dbg(dev, "suspend\n");
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- //isl_set_mod(client, ISL_MOD_POWERDOWN);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- printk(KERN_INFO MODULE_NAME ": %s cm3232 suspend call, \n", __func__);
- return 0;
-}
-
-static int cm3232_runtime_resume(struct device *dev)
-{
-
- dev_dbg(dev, "resume\n");
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- //isl_set_mod(client, last_mod);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- printk(KERN_INFO MODULE_NAME ": %s cm3232 resume call, \n", __func__);
- return 0;
-}
-#endif
-MODULE_DEVICE_TABLE(i2c, cm3232_id);
-
-/*static const struct dev_pm_ops cm3232_pm_ops = {
- .runtime_suspend = cm3232_runtime_suspend,
- .runtime_resume = cm3232_runtime_resume,
-};
-
-static struct i2c_board_info isl_info = {
- I2C_BOARD_INFO("cm3232", 0x44),
-};
-
-static struct i2c_driver cm3232_driver = {
- .driver = {
- .name = "cm3232",
- .pm = &cm3232_pm_ops,
- },
- .probe = cm3232_probe,
- .remove = cm3232_remove,
- .id_table = cm3232_id,
- .detect = cm3232_detect,
- //.address_data = &addr_data,
-};*/
-
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the l-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the l-sensor node...\n");
- return 0;
-}
-
-static ssize_t mmad_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_data(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- //return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-static long
-mmad_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- l_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define CM3232_DRVID 0
- uval = CM3232_DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("cm3232_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static struct file_operations mmad_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmad_read,
- .unlocked_ioctl = mmad_ioctl,
-};
-
-
-static struct miscdevice mmad_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "lsensor_ctrl",
- .fops = &mmad_fops,
-};
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void cm3232_early_suspend(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, ISL_MOD_POWERDOWN);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-static void cm3232_late_resume(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, last_mod);
- isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-#endif
-static ssize_t adc_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
-
- int i;
- int size = sizeof(uadc)/sizeof(uadc[0]);
- printk("<<<%s\n", __FUNCTION__);
- for (i=0; i<size; i++)
- {
- printk(" %5d ", uadc[i]);
- //sprintf(buf, "%d " &uadc[i]);
- }
- printk("\n");
-
- return sizeof(uadc);
- //printk(" %s \n", buf);
-}
-
-static ssize_t adc_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
- __u32 tmp;
- int index;
- int n;
- int size = sizeof(uadc)/sizeof(uadc[0]);
-
- printk("<<<%s\n", __FUNCTION__);
- printk("<< %s >>>\n", buf);
- n = sscanf(buf, "%d:%d", &index, &tmp);
- printk("<<<<int n %d %d:%d \n", n, index, tmp);
- if ( n==2 && index>=0 && index<size){
-
- uadc[index] = tmp;
- no_adc_map = 0;
- }
- else {
- printk("<<<param error!\n");
- no_adc_map = 1;
- }
- return count;
-}
-static struct device_attribute cm3232_attr[] =
-{
- __ATTR(adc, 0644, adc_show, adc_store),
- __ATTR_NULL,
-};
-
-static struct device *sdevice;
-static struct class *sclass;
-static dev_t sdev_no;
-static int device_create_attribute(struct device *dev, struct device_attribute *attr)
-{
- int err, i;
- for (i=0; NULL != attr[i].attr.name; i++)
- {
- err = device_create_file(dev, &attr[i]); //&attr[i].attr
- if (err)
- break;
- }
- if (err)
- {
- for (; i>=0; i--)
- device_remove_file(dev, &attr[i]);//&attr[i].attr
- }
- return err;
-}
-
-static void device_remove_attribute(struct device *dev, struct device_attribute *attr)
-{
- int i;
- for (i=0; attr[i].attr.name != NULL; i++)
- device_remove_file(dev, &attr[i]); //&attr[i].attr
-}
-
-
-static int get_adc_val(void)
-{
- int i, varlen, n;
- __u32 buf[8];
- char varbuf[50];
- char *name = "wmt.io.lsensor";
-
- varlen = sizeof(varbuf);
- if (wmt_getsyspara(name, varbuf, &varlen))
- {
- printk("<<<<fail to wmt_syspara %s\n", "wmt.io.lsensor");
- no_adc_map = 1;
- return -1;
- }
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d", &buf[0], &buf[1], &buf[2], &buf[3], &buf[4], &buf[5], \
- &buf[6], &buf[7]);
- //printk("<<< n %d \n", n);
- if (n != 8)
- {
- printk("<<<<<%s uboot env wmt.io.lsensor param error!\n", __FUNCTION__);
- return -1;
- }
- for (i=0; i<8; i++)
- {
- //printk("<<<< %5d ", buf[i]);
- uadc[i] = buf[i];
- }
- no_adc_map = 0;
- //printk("\n");
- return 0;
-}
-
-static int
-cm3232_probe(struct i2c_client *client/*, const struct i2c_device_id *id*/)
-{
- int res=0;
- int sret = 0;
- struct isl_device* idev = kzalloc(sizeof(struct isl_device), GFP_KERNEL);
- if(!idev)
- return -ENOMEM;
-
- l_sensorconfig = idev;
- //android_lsensor_kobj = kobject_create_and_add("android_lsensor", NULL);
- /*
- if (android_lsensor_kobj == NULL) {
- errlog(
- "lsensor_sysfs_init:"\
- "subsystem_register failed\n");
- res = -ENOMEM;
- goto err_kobjetc_create;
- }
- //res = sysfs_create_group(android_lsensor_kobj, &m_isl_gr);
- if (res) {
- //pr_warn("cm3232: device create file failed!!\n");
- printk(KERN_INFO MODULE_NAME ": %s cm3232 device create file failed\n", __func__);
- res = -EINVAL;
- goto err_sysfs_create;
- }
- */
-
-/* last mod is ALS continuous */
- last_mod = 5;
- //pm_runtime_enable(&client->dev);
- idev->input_poll_dev = input_allocate_polled_device();
- if(!idev->input_poll_dev)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->client = client;
- idev->input_poll_dev->private = idev;
- idev->input_poll_dev->poll = isl_input_lux_poll;
- idev->input_poll_dev->poll_interval = 100;//50;
- idev->input_poll_dev->input->open = isl_input_open;
- idev->input_poll_dev->input->close = isl_input_close;
- idev->input_poll_dev->input->name = "lsensor_lux";
- idev->input_poll_dev->input->id.bustype = BUS_I2C;
- idev->input_poll_dev->input->dev.parent = &client->dev;
- input_set_drvdata(idev->input_poll_dev->input, idev);
- input_set_capability(idev->input_poll_dev->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_dev->input, ABS_MISC, 0, 16000, 0, 0);
- i2c_set_clientdata(client, idev);
- /* set default config after set_clientdata */
- res = isl_set_default_config(client);
- res = misc_register(&mmad_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_register;
- }
- res = input_register_polled_device(idev->input_poll_dev);
- if(res < 0)
- goto err_input_register_device;
- // suspend/resume register
-#ifdef CONFIG_HAS_EARLYSUSPEND
- idev->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- idev->earlysuspend.suspend = cm3232_early_suspend;
- idev->earlysuspend.resume = cm3232_late_resume;
- register_early_suspend(&(idev->earlysuspend));
-#endif
-
- dbg("cm3232 probe succeed!\n");
- //create class device sysdevice 2013-5-10
- //get_adc_val();
- sclass = class_create(THIS_MODULE, "cm3232");
- if (IS_ERR(sclass))
- {
- printk("<<<%s fail to create class!\n", __FUNCTION__);
- return 0;
- }
-
-
- sret = alloc_chrdev_region(&sdev_no, 0, 1, "cm3232_devno");
- if (sret)
- {
- printk("<<<<%s alloc_chrdev_region fail!\n", __FUNCTION__);
- class_destroy(sclass);
- return 0;
- }
- sdevice = device_create(sclass, NULL, sdev_no, NULL, "cm3232_dev");
- if (IS_ERR(sdevice))
- {
- printk("<<<%s device_create fail!\n", __FUNCTION__);
- class_destroy(sclass);
- return 0;
- }
- device_create_attribute(sdevice, cm3232_attr);
-
- return 0;
-err_input_register_device:
- misc_deregister(&mmad_device);
- input_free_polled_device(idev->input_poll_dev);
-err_misc_register:
-err_input_allocate_device:
- //__pm_runtime_disable(&client->dev, false);
-
- kobject_del(android_lsensor_kobj);
-
- kfree(idev);
- return res;
-}
-
-static int cm3232_remove(struct i2c_client *client)
-{
- struct isl_device* idev = i2c_get_clientdata(client);
- if (!IS_ERR(sdevice))
- {
- device_remove_attribute(sdevice, cm3232_attr);
- device_destroy(sclass, sdev_no);
- class_destroy(sclass);
-
- }
- //unregister_early_suspend(&(idev->earlysuspend));
- misc_deregister(&mmad_device);
- input_unregister_polled_device(idev->input_poll_dev);
- input_free_polled_device(idev->input_poll_dev);
- //sysfs_remove_group(android_lsensor_kobj, &m_isl_gr);
- kobject_del(android_lsensor_kobj);
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- printk(KERN_INFO MODULE_NAME ": %s cm3232 remove call, \n", __func__);
- return 0;
-}
-//****************add platform_device & platform_driver for suspend &resume 2013-7-2
-static int ls_probe(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_remove(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_suspend(struct platform_device *pdev, pm_message_t state){
- printk("<<<%s\n", __FUNCTION__);
-
- return 0;
-}
-
-static int ls_resume(struct platform_device *pdev){
- //return 0;
- int ret = 0;
- int count = 0;
- printk("<<<%s\n", __FUNCTION__);
-RETRY:
- ret = isl_set_default_config(this_client);
- if (ret < 0){
- printk("%s isl_set_default_config fail!\n", __FUNCTION__);
- count++;
- if (count < 5){
- mdelay(2);
- goto RETRY;
- }
- else
- return ret;
- }
- return 0;
-
-}
-static void lsdev_release(struct device *dev)
-{
- return;
-}
-static struct platform_device lsdev = {
- .name = "lsdevice",
- .id = -1,
- .dev = {
- .release = lsdev_release,
- },
-};
-static struct platform_driver lsdrv = {
- .probe = ls_probe,
- .remove = ls_remove,
- .suspend = ls_suspend,
- .resume = ls_resume,
- .driver = {
- .name = "lsdevice",
- },
-};
-//********************************************************************
-
-static int __init sensor_cm3232_init(void)
-{
- int ret = 0;
- printk(KERN_INFO MODULE_NAME ": %s cm3232 init call, \n", __func__);
- /*
- * Force device to initialize: i2c-15 0x44
- * If i2c_new_device is not called, even cm3232_detect will not run
- * TODO: rework to automatically initialize the device
- */
- //i2c_new_device(i2c_get_adapter(15), &isl_info);
- //return i2c_add_driver(&cm3232_driver);
- if (!(this_client = sensor_i2c_register_device(2, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if (cm3232_detect(this_client))
- {
- errlog("Can't find light sensor cm3232!\n");
- goto detect_fail;
- }
- get_adc_val();
- if(cm3232_probe(this_client))
- {
- errlog("Erro for probe!\n");
- goto detect_fail;
- }
-
- ret = platform_device_register(&lsdev);
- if (ret){
- printk("<<<platform_device_register fail!\n");
- return ret;
- }
- ret = platform_driver_register(&lsdrv);
- if (ret){
- printk("<<<platform_driver_register fail!\n");
- platform_device_unregister(&lsdev);
- return ret;
- }
- return 0;
-
-detect_fail:
- sensor_i2c_unregister_device(this_client);
- return -1;
-}
-
-static void __exit sensor_cm3232_exit(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s cm3232 exit call \n", __func__);
- cm3232_remove(this_client);
- sensor_i2c_unregister_device(this_client);
- platform_driver_unregister(&lsdrv);
- platform_device_unregister(&lsdev);
- //i2c_del_driver(&cm3232_driver);
-}
-
-module_init(sensor_cm3232_init);
-module_exit(sensor_cm3232_exit);
-
-MODULE_AUTHOR("flash");
-MODULE_ALIAS("cm3232 ALS");
-MODULE_DESCRIPTION("Intersil cm3232 ALS Driver");
-MODULE_LICENSE("GPL v2");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/Makefile
deleted file mode 100755
index a5dfa3cb..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_dmard06
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := dmard06.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/dmard06.c b/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/dmard06.c
deleted file mode 100755
index bcb6e5ad..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard06_gsensor/dmard06.c
+++ /dev/null
@@ -1,980 +0,0 @@
-/*
- * @file drivers/i2c/chips/dmard06.c
- * @brief DMARD06 g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.0
- * @date 2011/8/5
- *
- * @section LICENSE
- *
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- */
-
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/delay.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/cdev.h>
-//#include <linux/earlysuspend.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/platform_device.h>
-#include <linux/proc_fs.h>
-#include <mach/hardware.h>
-#include <linux/miscdevice.h>
-
-//////////////////////////////////////////////////////////
-#define AKMIO 0xA1
-
-/* IOCTLs for AKM library */
-#define ECS_IOCTL_INIT _IO(AKMIO, 0x01)
-#define ECS_IOCTL_WRITE _IOW(AKMIO, 0x02, char[5])
-#define ECS_IOCTL_READ _IOWR(AKMIO, 0x03, char[5])
-#define ECS_IOCTL_RESET _IO(AKMIO, 0x04)
-#define ECS_IOCTL_INT_STATUS _IO(AKMIO, 0x05)
-#define ECS_IOCTL_FFD_STATUS _IO(AKMIO, 0x06)
-#define ECS_IOCTL_SET_MODE _IOW(AKMIO, 0x07, short)
-#define ECS_IOCTL_GETDATA _IOR(AKMIO, 0x08, char[RBUFF_SIZE+1])
-#define ECS_IOCTL_GET_NUMFRQ _IOR(AKMIO, 0x09, char[2])
-#define ECS_IOCTL_SET_PERST _IO(AKMIO, 0x0A)
-#define ECS_IOCTL_SET_G0RST _IO(AKMIO, 0x0B)
-#define ECS_IOCTL_SET_YPR _IOW(AKMIO, 0x0C, short[12])
-#define ECS_IOCTL_GET_OPEN_STATUS _IOR(AKMIO, 0x0D, int)
-#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(AKMIO, 0x0E, int)
-#define ECS_IOCTL_GET_CALI_DATA _IOR(AKMIO, 0x0F, char[MAX_CALI_SIZE])
-#define ECS_IOCTL_GET_DELAY _IOR(AKMIO, 0x30, short)
-
-/* 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, short)
-#define ECS_IOCTL_APP_GET_DELAY ECS_IOCTL_GET_DELAY
-#define ECS_IOCTL_APP_SET_MVFLAG _IOW(AKMIO, 0x19, short) /* Set raw magnetic vector flag */
-#define ECS_IOCTL_APP_GET_MVFLAG _IOR(AKMIO, 0x1A, short) /* Get raw magnetic vector flag */
-
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define WMT_IOCTL_SENSOR_CAL_OFFSET _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x01, int) //offset calibration
-#define ECS_IOCTL_APP_SET_AFLAG _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x02, short)
-#define ECS_IOCTL_APP_SET_DELAY _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x03, short)
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
-
-
-/* IOCTLs for pedometer */
-#define ECS_IOCTL_SET_STEP_CNT _IOW(AKMIO, 0x20, short)
-//////////////////////////////////////////////////////////////////
-#define SENSOR_DELAY_FASTEST 0
-#define SENSOR_DELAY_GAME 20
-#define SENSOR_DELAY_UI 60
-#define SENSOR_DELAY_NORMAL 200
-
-#define DMARD06_DRVID 3
-
-/////////////////////////////////////////////////////////////////
-
-#undef dbg
-#define dbg(fmt, args...) if (l_sensorconfig.isdbg) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-#define DMARD06_I2C_NAME "dmard06"
-#define DMARD06_I2C_ADDR 0x1c
-
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define GSENSOR_MAJOR 161
-#define GSENSOR_NAME "dmard06"
-#define GSENSOR_DRIVER_NAME "dmard06_drv"
-
-#define GSENDMARD06_UBOOT_NAME "wmt.io.d06sensor"
-
-#define MAX_WR_DMARD06_LEN (1+1)
-
-#define LSG 32
-
-static char const *const ACCELEMETER_CLASS_NAME = "accelemeter";
-static char const *const DMARD06_DEVICE_NAME = "dmard06";
-////////////////////////////////////////////////////////////
-#define ID_REG_ADDR 0x0F
-#define SWRESET_REG_ADDR 0x53
-#define T_REG_ADDR 0x40
-#define XYZ_REG_ADDR 0x41
-#define CTR1_REG_ADDR 0x44
-#define CTR2_REG_ADDR 0x45
-#define CTR3_REG_ADDR 0x46
-#define CTR4_REG_ADDR 0x47
-#define CTR5_REG_ADDR 0x48
-#define STAT_REG_ADDR 0x49
-
-
-
-static int dmard06_init(void);
-static void dmard06_exit(void);
-
-static int dmard06_file_open(struct inode*, struct file*);
-static ssize_t dmard06_file_write(struct file*, const char*, size_t, loff_t*);
-static ssize_t dmard06_file_read(struct file*, char*, size_t, loff_t*);
-static int dmard06_file_close(struct inode*, struct file*);
-
-static int dmard06_i2c_suspend(struct platform_device *pdev, pm_message_t state);
-static int dmard06_i2c_resume(struct platform_device *pdev);
-static int dmard06_i2c_probe(void);
-static int dmard06_i2c_remove(void);
-static void dmard06_i2c_read_xyz(s8 *x, s8 *y, s8 *z);
-static void dmard06_i2c_accel_value(s8 *val);
-static int dmard06_probe(
- struct platform_device *pdev);
-static int dmard06_remove(struct platform_device *pdev);
-static int dmard06_i2c_xyz_read_reg(u8* index ,u8 *buffer, int length);
-
-
-
-//extern int wmt_i2c_xfer_continue_if_4(struct i2c_msg *msg, unsigned int num, int bus_id);
-extern int i2c_api_do_send(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-extern int i2c_api_do_recv(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-
-extern int wmt_setsyspara(char *varname, unsigned char *varval);
-
-/////////////////////////////////////////////////////////////////
-struct work_struct poll_work;
-static struct mutex sense_data_mutex;
-
-
-struct dmard06_config
-{
- int op;
- int int_gpio; //0-3
- int samp;
- int xyz_axis[3][3]; // (axis,direction)
- int irq;
- struct proc_dir_entry* sensor_proc;
- //int sensorlevel;
- //int shake_enable; // 1--enable shake, 0--disable shake
- //int manual_rotation; // 0--landance, 90--vertical
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg; // 0-- no debug log, 1--show debug log
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- spinlock_t spinlock;
- int pollcnt; // the counts of polling
- int offset[3]; // for calibration
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-};
-
-static struct dmard06_config l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 16,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .irq = 6,
- .int_gpio = 3,
- .sensor_proc = NULL,
- //.sensorlevel = SENSOR_GRAVITYGAME_MODE,
- //.shake_enable = 0, // default enable shake
- .isdbg = 0,
- .sensor_samp = 1, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .pollcnt = 0, // Don't report the x,y,z when the driver is loaded until 2~3 seconds
- .offset = {0, 0, 0},
-};
-
-static struct class* l_dev_class = NULL;
-static struct device *l_clsdevice = NULL;
-
-
-struct raw_data
-{
- short x;
- short y;
- short z;
-};
-
-struct dev_data
-{
- dev_t devno;
- struct cdev cdev;
- struct class *class;
- struct i2c_client *client;
-};
-
-static struct dev_data dev;
-
-struct file_operations dmard06_fops =
-{
- .owner = THIS_MODULE,
- .read = dmard06_file_read,
- .write = dmard06_file_write,
- .open = dmard06_file_open,
- .release = dmard06_file_close,
-};
-
-static int dmard06_file_open(struct inode *inode, struct file *filp)
-{
- dbg("open...\n");
-
- return 0;
-}
-
-static ssize_t dmard06_file_write(struct file *filp, const char *buf, size_t count, loff_t *f_pos)
-{
- dbg("write...\n");
-
- return 0;
-}
-
-unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-static int dmard06_packet_rptValue(int x, int y, int z)
-{
- return ((0xFF&z) | ((0xFF&y)<<8) | ((0xFF&x)<<16));
-}
-
-
-static void dmard06_work_func(struct work_struct *work)
-{
- u8 buffer[3];
- //buffer[0] = 0x41;
- u8 index = 0x41;
- s8 x,y,z;
- int xyz,tx,ty,tz;
-
- mutex_lock(&sense_data_mutex);
- //read data
- dmard06_i2c_xyz_read_reg(&index, buffer, 3);
- mutex_unlock(&sense_data_mutex);
- // check whether it's valid
- // report the data
- x = (s8)buffer[0];
- y = (s8)buffer[1];
- z = (s8)buffer[2];
- dmard06_i2c_accel_value(&x);
- dmard06_i2c_accel_value(&y);
- dmard06_i2c_accel_value(&z);
- tx = x*l_sensorconfig.xyz_axis[0][1]+l_sensorconfig.offset[0];
- ty = y*l_sensorconfig.xyz_axis[1][1]+l_sensorconfig.offset[1];
- tz = z*l_sensorconfig.xyz_axis[2][1]+l_sensorconfig.offset[2];
- xyz = dmard06_packet_rptValue(tx, ty, tz);
- input_report_abs(l_sensorconfig.input_dev, ABS_X, xyz);
-
- //input_report_abs(l_sensorconfig.input_dev, l_sensorconfig.xyz_axis[0][0],
- // x*l_sensorconfig.xyz_axis[0][1]+l_sensorconfig.offset[0]);
- //input_report_abs(l_sensorconfig.input_dev, l_sensorconfig.xyz_axis[1][0],
- // y*l_sensorconfig.xyz_axis[1][1]+l_sensorconfig.offset[1]);
- //input_report_abs(l_sensorconfig.input_dev, l_sensorconfig.xyz_axis[2][0],
- //z*l_sensorconfig.xyz_axis[2][1]+l_sensorconfig.offset[2]);
- input_sync(l_sensorconfig.input_dev);
- dbg("x=%2x(tx=%2x),y=%2x(ty=%2x),z=%2x(tz=%2x),xyz=%x",
- (char)x, (char)tx, (char)y, (char)ty, (char)z, (char)tz, xyz);
-
- // for next polling
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- //klog("%d=%d,%d=%d,%d=%d\n", l_sensorconfig.xyz_axis[0][0], x*l_sensorconfig.xyz_axis[0][1],
- // l_sensorconfig.xyz_axis[1][0], y*l_sensorconfig.xyz_axis[1][1],
- // l_sensorconfig.xyz_axis[2][0], z*l_sensorconfig.xyz_axis[2][1]);
- //klog("the polling period:%d\n", msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-
-}
-
-
-static ssize_t dmard06_file_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
-{
- int ret;
- s8 x, y, z;
- struct raw_data rdata;
-
- dbg("read...\n");
- mutex_lock(&sense_data_mutex);
- dmard06_i2c_read_xyz(&x, &y, &z);
- rdata.x = x;
- rdata.y = y;
- rdata.z = z;
-
- ret = copy_to_user(buf, &rdata, count);
- mutex_unlock(&sense_data_mutex);
-
- return count;
-}
-
-static int dmard06_file_close(struct inode *inode, struct file *filp)
-{
- dbg("close...\n");
-
- return 0;
-}
-
-static void dmard06_platform_release(struct device *device)
-{
- return;
-}
-
-
-static struct platform_device dmard06_device = {
- .name = GSENSOR_NAME,
- .id = 0,
- .dev = {
- .release = dmard06_platform_release,
- },
-};
-
-static struct platform_driver dmard06_driver = {
- .probe = dmard06_probe,
- .remove = dmard06_remove,
- .suspend = dmard06_i2c_suspend,
- .resume = dmard06_i2c_resume,
- .driver = {
- .name = GSENSOR_NAME,
- },
-};
-
-static int dmard06_i2c_xyz_write_reg(u8* index ,u8 *buffer, int length)
-{
- /*int ret = 0;
- u8 buf[MAX_WR_DMARD06_LEN];
- struct i2c_msg msg[1];
-
- buf[0] = *index;
- memcpy(buf+1, buffer, length);
- msg[0].addr = DMARD06_I2C_ADDR;
- msg[0].flags = 0 ;
- msg[0].flags &= ~(I2C_M_RD);
- msg[0].len = length+1;
- msg[0].buf = buf;
- if ((ret = wmt_i2c_xfer_continue_if_4(msg,1,0)) <= 0)
- {
- errlog("write error!\n");
- }
- return ret;*/
- return i2c_api_do_send(0, DMARD06_I2C_ADDR, index, buffer, length);
-}
-
-static int dmard06_i2c_xyz_read_reg(u8* index ,u8 *buffer, int length)
-{
- /*int ret = 0;
-
- struct i2c_msg msg[] =
- {
- {.addr = DMARD06_I2C_ADDR, .flags = 0, .len = 1, .buf = index,},
- {.addr = DMARD06_I2C_ADDR, .flags = I2C_M_RD, .len = length, .buf = buffer,},
- };
- ret = wmt_i2c_xfer_continue_if_4(msg, 2,0);
- if (ret <= 0)
- {
- errlog("read error!\n");
- }
- return ret;*/
- return i2c_api_do_recv(0, DMARD06_I2C_ADDR, index, buffer, length);
-}
-
-static void dmard06_i2c_read_xyz(s8 *x, s8 *y, s8 *z)
-{
-
- u8 buffer[3];
- //buffer[0] = 0x41;
- u8 index = 0x41;
-
- dmard06_i2c_xyz_read_reg(&index, buffer, 3);
- *x = (s8)buffer[0];
- *y = (s8)buffer[1];
- *z = (s8)buffer[2];
- dmard06_i2c_accel_value(x);
- dmard06_i2c_accel_value(y);
- dmard06_i2c_accel_value(z);
- if (ABS_X == l_sensorconfig.xyz_axis[0][0])
- {
- *x = l_sensorconfig.xyz_axis[0][1]*(*x);
- *y = l_sensorconfig.xyz_axis[1][1]*(*y);
- } else {
- *x = l_sensorconfig.xyz_axis[0][1]*(*y);
- *y = l_sensorconfig.xyz_axis[1][1]*(*x);
- }
- *z = l_sensorconfig.xyz_axis[2][1]*(*z);
-
- dbg("dmrd06:x=%x,y=%x,z=%x\n", *x, *y, *z);
-}
-
-static void dmard06_i2c_accel_value(s8 *val)
-{
- *val >>= 1;
-}
-
-static int dmard06_CalOffset(int side)
-{
- u8 buffer[3];
- //buffer[0] = 0x41;
- u8 index = 0x41;
- s8 x,y,z;
-
- //mutex_lock(&sense_data_mutex);
- //read data
- dmard06_i2c_xyz_read_reg(&index, buffer, 3);
- //mutex_unlock(&sense_data_mutex);
- // check whether it's valid
- // report the data
- x = (s8)buffer[0];
- y = (s8)buffer[1];
- z = (s8)buffer[2];
- dmard06_i2c_accel_value(&x);
- dmard06_i2c_accel_value(&y);
- dmard06_i2c_accel_value(&z);
- l_sensorconfig.offset[0] = 0 - x*l_sensorconfig.xyz_axis[0][1];
- l_sensorconfig.offset[1] = 0 - y*l_sensorconfig.xyz_axis[1][1];
- l_sensorconfig.offset[2] = LSG - z*l_sensorconfig.xyz_axis[2][1];
- return 0;
-
-}
-
-static int dmard06_i2c_suspend(struct platform_device *pdev, pm_message_t state)
-{
- dbg("...\n");
- cancel_delayed_work_sync(&l_sensorconfig.work);
-
- return 0;
-}
-
-static int is_dmard06(void)
-{
- int err = 0;
- u8 cAddress = 0, cData = 0;
- char buf[4];
-
- cAddress = 0x53;
- //i2c_master_send( client, (char*)&cAddress, 1);
- //i2c_master_recv( client, (char*)&cData, 1);
- if (dmard06_i2c_xyz_read_reg(&cAddress, &cData,1) <= 0)
- {
- errlog("Error to read SW_RESET register!\n");
- }
- dbg("i2c Read 0x53 = %x \n", cData);
-
- cAddress = 0x0f;
- //i2c_master_send( client, (char*)&cAddress, 1);
- //i2c_master_recv( client, (char*)&cData, 1);
- if (dmard06_i2c_xyz_read_reg(&cAddress, &cData,1) <= 0)
- {
- errlog("Can't find dmard06!\n");
- return -1;
- }
- dbg("i2c Read 0x0f = %d \n", cData);
-
- if(( cData&0x00FF) == 0x0006)
- {
- klog("Find DMARD06!\n");
- }
- else
- {
- errlog("ID isn't 0x06.(0x%x) !\n",cData);
- return -1;
- }
-
- return 0;
-}
-
-static int dmard06_i2c_remove(void)
-{
-
- return 0;
-}
-
-static int dmard06_i2c_resume(struct platform_device *pdev)
-{
- dbg("...\n");
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-
-
- return 0;
-}
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&sense_data_mutex);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- printk(KERN_ALERT "Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- printk(KERN_ERR "The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void* param)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.d06sensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &l_sensorconfig.offset[0],
- &l_sensorconfig.offset[1],
- &l_sensorconfig.offset[2]);
- if (n != 12) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1]
- );
- }
- return 0;
-}
-
-// To contol the g-sensor for UI
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the g-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the g-sensor node...\n");
- return 0;
-}
-
-
-static int
-mmad_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- char rwbuf[5];
- short delay, enable, amsr = -1;
- unsigned int sample;
- int ret = 0;
- int side;
- char varbuff[80];
- unsigned int uval = 0;
-
- dbg("g-sensor ioctr...\n");
- memset(rwbuf, 0, sizeof(rwbuf));
- mutex_lock(&sense_data_mutex);
- switch (cmd) {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- ret = -EFAULT;
- goto errioctl;
- }
- klog("set delay=%d \n", delay);
- //klog("before change sensor sample:%d...\n", l_sensorconfig.sensor_samp);
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- if (delay > 0)
- {
- l_sensorconfig.sensor_samp = 1000/delay;
- } else {
- errlog("error delay argument(delay=%d)!!!\n",delay);
- ret = -EFAULT;
- goto errioctl;
- }
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- ret = -EFAULT;
- goto errioctl;
- }
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- /*if (enable != 0)
- {
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- } else {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- }*/
- l_sensorconfig.sensor_enable = enable;
-
- }
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- ret = -EFAULT;
- goto errioctl;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = DMARD06_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- ret = -EFAULT;
- goto errioctl;
- }
- dbg("dmard06_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENSOR_CAL_OFFSET:
- klog("-->WMT_IOCTL_SENSOR_CAL_OFFSET\n");
- if(copy_from_user(&side, (int*)argp, sizeof(int)))
- {
- ret = -EFAULT;
- goto errioctl;
- }
- dbg("side=%d\n",side);
- if (dmard06_CalOffset(side) != 0)
- {
- ret = -EFAULT;
- goto errioctl;
- }
- // save the param
- sprintf(varbuff, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- 10,//l_sensorconfig.samp,
- (l_sensorconfig.xyz_axis[0][0]),
- (l_sensorconfig.xyz_axis[0][1]),
- (l_sensorconfig.xyz_axis[1][0]),
- (l_sensorconfig.xyz_axis[1][1]),
- (l_sensorconfig.xyz_axis[2][0]),
- (l_sensorconfig.xyz_axis[2][1]),
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- wmt_setsyspara(GSENDMARD06_UBOOT_NAME, varbuff);
- ret = 0;
- break;
- default:
- break;
- }
-
-
- /*switch (cmd) {
- case ECS_IOCTL_READ:
- if (copy_to_user(argp, &rwbuf, sizeof(rwbuf)))
- return -EFAULT;
- break;
- default:
- break;
- }*/
-errioctl:
- mutex_unlock(&sense_data_mutex);
- return ret;
-}
-
-
-static struct file_operations mmad_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .unlocked_ioctl = mmad_ioctl,
-};
-
-
-static struct miscdevice mmad_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &mmad_fops,
-};
-
-static int dmard06_probe(
- struct platform_device *pdev)
-{
- int err = 0;
-
- //register ctrl dev
- err = misc_register(&mmad_device);
- if (err != 0)
- {
- errlog("Can't register mma_device!\n");
- return -1;
- }
- // register rd/wr proc
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
- // init work queue
- l_sensorconfig.queue = create_singlethread_workqueue("sensor-data-report");
- //INIT_WORK(&l_sensorconfig.work, mma_work_func);
- INIT_DELAYED_WORK(&l_sensorconfig.work, dmard06_work_func);
- mutex_init(&sense_data_mutex);
- l_sensorconfig.input_dev = input_allocate_device();
- if (!l_sensorconfig.input_dev) {
- err = -ENOMEM;
- errlog("Failed to allocate input device\n");
- goto exit_input_dev_alloc_failed;
- }
- //set_bit(EV_KEY, l_sensorconfig.input_dev->evbit);
- //set_bit(EV_ABS, l_sensorconfig.input_dev->evbit);
- l_sensorconfig.input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY);
- //set_bit(KEY_NEXTSONG, l_sensorconfig.input_dev->keybit);
-
- /* yaw */
- //input_set_abs_params(l_sensorconfig.input_dev, ABS_RX, 0, 360*100, 0, 0);
- /* pitch */
- //input_set_abs_params(l_sensorconfig.input_dev, ABS_RY, -180*100, 180*100, 0, 0);
- /* roll */
- //input_set_abs_params(l_sensorconfig.input_dev, ABS_RZ, -90*100, 90*100, 0, 0);
- /* x-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_X, -128, 128, 0, 0);
- /* y-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Y, -128, 128, 0, 0);
- /* z-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Z, -128, 128, 0, 0);
-
- l_sensorconfig.input_dev->name = "g-sensor";
-
- err = input_register_device(l_sensorconfig.input_dev);
-
- if (err) {
- errlog("Unable to register input device: %s\n",
- l_sensorconfig.input_dev->name);
- goto exit_input_register_device_failed;
- }
-
- return 0;
-exit_input_register_device_failed:
- input_free_device(l_sensorconfig.input_dev);
-exit_input_dev_alloc_failed:
- // release proc
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- // unregister the ctrl dev
- misc_deregister(&mmad_device);
- return err;
-}
-
-static int dmard06_remove(struct platform_device *pdev)
-{
- if (NULL != l_sensorconfig.queue)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- destroy_workqueue(l_sensorconfig.queue);
- l_sensorconfig.queue = NULL;
- }
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- misc_deregister(&mmad_device);
- return 0;
-}
-#if 0
-static void dmard06_early_suspend(struct early_suspend *h)
-{
- dbg("start\n");
- cancel_delayed_work_sync(&l_sensorconfig.work);
- dbg("exit\n");
-}
-
-static void dmard06_late_resume(struct early_suspend *h)
-{
- dbg("start\n");
- // init
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- dbg("exit\n");
-}
-#endif
-
-static int __init dmard06_init(void)
-{
- int ret = 0;
-
- // detech the device
- if (is_dmard06() != 0)
- {
- return -1;
- }
- // parse g-sensor u-boot arg
- ret = get_axisset(NULL);
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- /*if ((ret != 0) || !l_sensorconfig.op)
- return -EINVAL;
- */
-
- // Create device node
- if (register_chrdev (GSENSOR_MAJOR, GSENSOR_NAME, &dmard06_fops)) {
- printk (KERN_ERR "unable to get major %d\n", GSENSOR_MAJOR);
- return -EIO;
- }
-
- l_dev_class = class_create(THIS_MODULE, GSENSOR_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- l_clsdevice = device_create(l_dev_class, NULL, MKDEV(GSENSOR_MAJOR, 0), NULL, GSENSOR_NAME);
- if (IS_ERR(l_clsdevice)){
- ret = PTR_ERR(l_clsdevice);
- printk(KERN_ERR "Failed to create device %s !!!",GSENSOR_NAME);
- return ret;
- }
- INIT_WORK(&poll_work, dmard06_work_func);
-
-
- if((ret = platform_device_register(&dmard06_device)))
- {
- printk(KERN_ERR "%s Can't register mma7660 platform devcie!!!\n", __FUNCTION__);
- return ret;
- }
- if ((ret = platform_driver_register(&dmard06_driver)) != 0)
- {
- printk(KERN_ERR "%s Can't register mma7660 platform driver!!!\n", __FUNCTION__);
- return ret;
- }
-#ifdef CONFIG_HAS_EARLYSUSPEND
- l_sensorconfig.earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- l_sensorconfig.earlysuspend.suspend = dmard06_early_suspend;
- l_sensorconfig.earlysuspend.resume = dmard06_late_resume;
- register_early_suspend(&l_sensorconfig.earlysuspend);
-#endif
-
- klog("dmard06 g-sensor driver load!\n");
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-
- return 0;
-}
-
-static void __exit dmard06_exit(void)
-{
- //unregister_early_suspend(&l_sensorconfig.earlysuspend);
- platform_driver_unregister(&dmard06_driver);
- platform_device_unregister(&dmard06_device);
- device_destroy(l_dev_class, MKDEV(GSENSOR_MAJOR, 0));
- unregister_chrdev(GSENSOR_MAJOR, GSENSOR_NAME);
- class_destroy(l_dev_class);
-
-}
-
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMARD06 g-sensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(dmard06_init);
-module_exit(dmard06_exit);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/Makefile
deleted file mode 100755
index 82f27563..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_dmard08
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := dmard08.o cyclequeue.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.c b/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.c
deleted file mode 100755
index 4d6b97cd..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.c
+++ /dev/null
@@ -1,68 +0,0 @@
-#include <linux/mutex.h>
-
-
-#include "cyclequeue.h"
-
-static struct que_data que[QUEUE_LEN];
-static unsigned int head = -1; // point to the first valaid queue data
-static unsigned int tail = 0; // point to the next to the last valaid queue data
-static DEFINE_MUTEX(que_mutex);
-
-// Whether queue is full
-// return 1--full,0 -- no full
-int clque_is_full(void)
-{
- int ret = 0;
-
- mutex_lock(&que_mutex);
- ret = ((tail+1)%QUEUE_LEN) == head ? 1 : 0;
- mutex_unlock(&que_mutex);
- return ret;
-}
-
-// Whether queue is empty
-// return 1--empty,0--no empty
-int clque_is_empty(void)
-{
- int ret = 0;
-
- mutex_lock(&que_mutex);
- ret = (tail == head) ? 1: 0;
- mutex_unlock(&que_mutex);
- return ret;
-}
-
-// add to queue
-// return:0--successful,-1--queue is full
-int clque_in(struct que_data* data)
-{
- /*if (clque_is_full())
- {
- return -1;
- }*/
- mutex_lock(&que_mutex);
- que[tail].data[0] = data->data[0];
- que[tail].data[1] = data->data[1];
- que[tail].data[2] = data->data[2];
- tail = (tail+1)%QUEUE_LEN;
- mutex_unlock(&que_mutex);
- return 0;
-}
-
-// out to queue
-// return:0--successful,-1--queue is empty
-int clque_out(struct que_data* data)
-{
- /*if (clque_is_empty())
- {
- return -1;
- }*/
- mutex_lock(&que_mutex);
- data->data[0]= que[head].data[0];
- data->data[1]= que[head].data[1];
- data->data[2]= que[head].data[2];
- head = (head+1)%QUEUE_LEN;
- mutex_unlock(&que_mutex);
- return 0;
-}
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.h b/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.h
deleted file mode 100755
index 52b9996f..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/cyclequeue.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef __CYCLEQUEUE_163704111637_H
-#define __CYCLEQUEUE_163704111637_H
-
-#define DATA_TYPE short
-#define QUEUE_LEN 16
-
-struct que_data {
- DATA_TYPE data[3];
-};
-
-extern int clque_in(struct que_data* data);
-extern int clque_out(struct que_data* data);
-extern int clque_is_full(void);
-extern int clque_is_empty(void);
-#endif
-
-
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.c b/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.c
deleted file mode 100755
index 3cbe2ac7..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.c
+++ /dev/null
@@ -1,1019 +0,0 @@
-/*
- * @file drivers/i2c/dmard08.c
- * @brief DMARD08 g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.22
- * @date 2011/12/01
- *
- * @section LICENSE
- *
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- */
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/delay.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/cdev.h>
-//#include <linux/earlysuspend.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/serio.h>
-#include <linux/platform_device.h>
-#include <linux/miscdevice.h>
-#include <linux/clk.h>
-#include <linux/mutex.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <mach/hardware.h>
-#include <asm/io.h>
-#include <linux/miscdevice.h>
-#include <mach/gpio.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-// ****Add by Steve Huang*********2011-11-18********
-#include <linux/syscalls.h>
-#include "../sensor.h"
-//#include "cyclequeue.h"
-// ************************************************
-
-#define GSENSOR_I2C_NAME "dmard08"
-#define GSENSOR_I2C_ADDR 0x1c
-
-#define SENSOR_DATA_SIZE 3
-
-static struct i2c_client *this_client = NULL;
-static struct mutex sense_data_mutex;
-static struct class* l_dev_class = NULL;
-
-static struct wmt_gsensor_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 5,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .isdbg = 0,
- .sensor_samp = 10, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .offset={0,0,0},
-};
-
-
-// ****Add by Steve Huang*********2011-11-18********
-/*void gsensor_write_offset_to_file(void);
-void gsensor_read_offset_from_file(void);
-char OffsetFileName[] = "/data/misc/dmt/offset.txt";*/
-//**************************************************
-
-
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-
-/*static int dmard08_i2c_suspend(struct i2c_client *client, pm_message_t mesg);
-static int dmard08_i2c_resume(struct i2c_client *client);*/
-//static int __devinit dmard08_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-//static int __devexit dmard08_i2c_remove(struct i2c_client *client);
-void dmard08_i2c_read_xyz(struct i2c_client *client, s16 *xyz);
-static inline void dmard08_i2c_correct_accel_sign(s16 *val); //check output is correct
-void dmard08_i2c_merge_register_values(struct i2c_client *client, s16 *val, u8 msb, u8 lsb); //merge the register values
-
-struct raw_data {
- short x;
- short y;
- short z;
-};
-
-struct raw_data rdata;
-//static struct raw_data offset;
-
-struct dev_data
-{
- dev_t devno;
- struct cdev cdev;
- struct class *class;
- struct i2c_client *client;
-};
-//static struct dev_data dev;
-
-
-unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-
-/*void gsensor_read_accel_avg(int num_avg, raw_data *avg_p) // marked by eason check again!!
-{
- long xyz_acc[SENSOR_DATA_SIZE];
- s16 xyz[SENSOR_DATA_SIZE];
- int i, j;
-
- //initialize the accumulation buffer
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_acc[i] = 0;
-
- for(i = 0; i < num_avg; i++)
- {
- device_i2c_read_xyz(l_sensorconfig.client, (s16 *)&xyz);
- for(j = 0; j < SENSOR_DATA_SIZE; j++)
- xyz_acc[j] += xyz[j];
- }
-
- // calculate averages
- for(i = 0; i < SENSOR_DATA_SIZE; i++)
- avg_p->v[i] = (s16) (xyz_acc[i] / num_avg);
-}*/
-
-/*void gsensor_calibrate(int side) //marked by eason check again
-{
- raw_data avg;
- int avg_num = 16;
-
- //IN_FUNC_MSG;
- // get acceleration average reading
- gsensor_read_accel_avg(avg_num, &avg);
- // calculate and set the offset
- gsensor_calculate_offset(side, avg);
-}*/
-
-/*void ce_on(void) //marked by eason check again
-{
- int gppdat;
- gppdat = __raw_readl(S3C64XX_GPPDAT);
- gppdat |= (1 << 0);
-
- __raw_writel(gppdat,S3C64XX_GPPDAT);
-}
-
-void ce_off(void)
-{
- int gppdat;
- gppdat = __raw_readl(S3C64XX_GPPDAT);
- gppdat &= ~(1 << 0);
-
- __raw_writel(gppdat,S3C64XX_GPPDAT);
-}
-
-void config_ce_pin(void)
-{
- unsigned int value;
- //D08's CE (pin#12) is connected to S3C64XX AP processor's port P0
- //Below codes set port P0 as digital output
- value = readl(S3C64XX_GPPCON);
- value &= ~ (0x3);
- value |= 1 ; //Output =01 , Input = 00 , Ext. Interrupt = 10
- writel(value, S3C64XX_GPPCON); //save S3C64XX_GPPCON change
-}
-
-void gsensor_reset(void)
-{
- ce_off();
- msleep(300);
- ce_on();
-}*/
-
-/*void gsensor_set_offset(int val[3]) //marked by eason check again
-{
- int i;
- IN_FUNC_MSG;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- offset.v[i] = (s16) val[i];
-}*/
-
-/*
-static const struct i2c_device_id dmard08_i2c_ids[] =
-{
- {GSENSOR_I2C_NAME, 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, dmard08_i2c_ids);
-
-
-static struct i2c_driver dmard08_i2c_driver =
-{
- .driver = {
- .owner = THIS_MODULE,
- .name = GSENSOR_I2C_NAME,
- },
- .class = I2C_CLASS_HWMON,
- .probe = dmard08_i2c_probe,
- .remove = __devexit_p(dmard08_i2c_remove),
- //.suspend = dmard08_i2c_suspend,
- //.resume = dmard08_i2c_resume,
- .id_table = dmard08_i2c_ids,
-};
-*/
-
-static int dmard08_i2c_xyz_read_reg(struct i2c_client *client,u8 *buffer, int length) //OK
-{
-
- struct i2c_msg msg[] =
- {
- {.addr = client->addr, .flags = 0, .len = 1, .buf = buffer,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = length, .buf = buffer,},
- };
- return i2c_transfer(client->adapter, msg, 2);
-}
-
-static int dmard08_i2c_xyz_write_reg(struct i2c_client *client,u8 *buffer, int length) //write reg OK
-{
- struct i2c_msg msg[] =
- {
- {.addr = client->addr, .flags = 0, .len = length, .buf = buffer,},
- };
- return i2c_transfer(client->adapter, msg, 1);
-}
-
-//static void dmard08_i2c_read_xyz(struct i2c_client, s16 *x, s16 *y, s16 *z) //add by eason
-void dmard08_i2c_read_xyz(struct i2c_client *client, s16 *xyz_p)
-{
-// s16 xTmp,yTmp,zTmp; //added by eason
- s16 xyzTmp[SENSOR_DATA_SIZE];
- int i;
-/*get xyz high/low bytes, 0x02~0x07*/
- u8 buffer[6];
- buffer[0] = 0x2;
- mutex_lock(&sense_data_mutex);
- dmard08_i2c_xyz_read_reg(client, buffer, 6);
- mutex_unlock(&sense_data_mutex);
-
- //merge to 11-bits value
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmard08_i2c_merge_register_values(client, (xyzTmp + i), buffer[2*i], buffer[2*i + 1]);
- }
- //transfer to the default layout
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- {
- xyz_p[i] = xyzTmp[i]; // add by eason
-/* xyz_p[i] = 0;
- for(j = 0; j < 3; j++)
- xyz_p[i] += sensorlayout[i][j] * xyzTmp[j]; */
- }
- dbg("%x,%x,%x,",xyz_p[0], xyz_p[1], xyz_p[2]);
- //printk("@DMT@ dmard08_i2c_read_xyz: X-axis: %d ,Y-axis: %d ,Z-axis: %d\n", xyz_p[0], xyz_p[1], xyz_p[2]);
-}
-
-void dmard08_i2c_merge_register_values(struct i2c_client *client, s16 *val, u8 msb, u8 lsb)
-{
-
- *val = (((u16)msb) << 3) | (u16)lsb;
- dmard08_i2c_correct_accel_sign(val);
-}
-
-static inline void dmard08_i2c_correct_accel_sign(s16 *val)
-{
-
- *val<<= (sizeof(s16) * BITS_PER_BYTE - 11);
- *val>>= (sizeof(s16) * BITS_PER_BYTE - 11);
-}
-
-/*
-static int dmard08_i2c_suspend(struct i2c_client *client, pm_message_t mesg)
-{
- dbg("...\n");
- return 0;
-}
-*/
-
-//static int __devinit dmard08_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
-static int __devinit dmard08_hw_init(struct i2c_client *client/*,const struct i2c_device_id *id*/)
-{
- char cAddress = 0 , cData = 0;
- u8 buffer[2];
-
- //for(i = 0; i < SENSOR_DATA_SIZE; ++i) //marked by eason check again
- // offset.v[i] = 0;
-
-
- if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
- {
- dbg("I2C_FUNC_I2C not support\n");
- return -1;
- }
- //config_ce_pin(); //how used?
- //gsensor_reset(); //how used?
- /* check SW RESET */
- cAddress = 0x08;
- i2c_master_send( client, (char*)&cAddress, 1);
- i2c_master_recv( client, (char*)&cData, 1);
- dbg( "i2c Read 0x08 = %d \n", cData);
- if( cData == 0x00)
- {
- cAddress = 0x09;
- i2c_master_send( client, (char*)&cAddress, 1);
- i2c_master_recv( client, (char*)&cData, 1);
- dbg( "i2c Read 0x09 = %d \n", cData);
- if( cData == 0x00)
- {
- cAddress = 0x0a;
- i2c_master_send( client, (char*)&cAddress, 1);
- i2c_master_recv( client, (char*)&cData, 1);
- dbg( "i2c Read 0x0a = %d \n", cData);
- if( cData == 0x88)
- {
- cAddress = 0x0b;
- i2c_master_send( client, (char*)&cAddress, 1);
- i2c_master_recv( client, (char*)&cData, 1);
- dbg( "i2c Read 0x0b = %d \n", cData);
- if( cData == 0x08)
- {
- dbg( "DMT_DEVICE_NAME registered I2C driver!\n");
- l_sensorconfig.client = client;
- }
- else
- {
- dbg( "err : i2c Read 0x0B = %d!\n",cData);
- l_sensorconfig.client = NULL;
- return -1;
- }
- }
- else
- {
- dbg( "err : i2c Read 0x0A = %d!\n",cData);
- l_sensorconfig.client = NULL;
- return -1;
- }
- }
- else
- {
- dbg( "err : i2c Read 0x09 = %d!\n",cData);
- l_sensorconfig.client = NULL;
- return -1;
- }
- }
- else
- {
- dbg( "err : i2c Read 0x08 = %d!\n",cData);
- l_sensorconfig.client = NULL;
-
- return -1;
- }
-
- /* set sampling period if samp = 1, set the sampling frequency = 684
- otherwise set the sample frequency = 342 (default) added by eason 2012/3/7*/
- if (l_sensorconfig.samp == 1) {
- buffer[0] = 0x08;
- buffer[1] = 0x04;
- dmard08_i2c_xyz_write_reg(client, buffer, 2);
- }
-
- /*check sensorlayout[i][j] //eason
- for(i = 0; i < 3; ++i)
- {
- for(j = 0; j < 3; j++)
- printk("%d",sensorlayout[i][j]);
- printk("\n");
- } */
-
- return 0;
-}
-
-static int __devexit dmard08_i2c_remove(struct i2c_client *client) //OK
-{
- dbg("...\n");
-
- return 0;
-}
-
-/*
-static int dmard08_i2c_resume(struct i2c_client *client) //OK
-{
- dbg("...\n");
-
- return 0;
-}
-*/
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.dm08sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2])
- );
- if (n != 12) {
- errlog("gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static void dmard08_platform_release(struct device *device)
-{
- dbg("...\n");
- return;
-}
-
-
-static struct platform_device dmard08_device = {
- .name = GSENSOR_I2C_NAME,
- .id = 0,
- .dev = {
- .release = dmard08_platform_release,
- },
-};
-
-static int dmard08_suspend(struct platform_device *pdev, pm_message_t state)
-{
- dbg("...\n");
- cancel_delayed_work_sync(&l_sensorconfig.work);
-
- return 0;
-}
-
-
-static int dmard08_open(struct inode *node, struct file *fle)
-{
- dbg("open...\n");
- return 0;
-}
-
-/* release command for dmard08 device file */
-static int dmard08_close(struct inode *node, struct file *fle)
-{
- dbg("close...\n");
- return 0;
-}
-
-/* ioctl command for dmard08 device file */
-static long dmard08_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd, unsigned long arg)
-{
- int err = 0;
- //unsigned char data[6];
- short delay = 0;
- short enable = 0;
- unsigned int uval = 0;
-
- if (WMT_IOCTL_SENSOR_CAL_OFFSET == cmd)
- {
- return 0;// now do nothing
- }
-
- /* cmd mapping */
- mutex_lock(&sense_data_mutex);
- switch(cmd)
- {
-
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- dbg("ECS_IOCTL_APP_SET_DELAY\n");
- if (copy_from_user(&delay,(short*)arg, sizeof(short)))
- {
- errlog("Can't get set delay!!!\n");
- err = -EFAULT;
- goto errioctl;
- }
- klog("set delay=%d \n", delay);
- //klog("before change sensor sample:%d...\n", l_sensorconfig.sensor_samp);
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- if (delay > 0)
- {
- l_sensorconfig.sensor_samp = 1000/delay;
- } else {
- errlog("error delay argument(delay=%d)!!!\n",delay);
- err = -EFAULT;
- goto errioctl;
- }
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- dbg("ECS_IOCTL_APP_SET_AFLAG\n");
- // enable/disable sensor
- if (copy_from_user(&enable, (short*)arg, sizeof(short)))
- {
- errlog("Can't get enable flag!!!\n");
- err = -EFAULT;
- goto errioctl;
- }
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- if (enable != l_sensorconfig.sensor_enable)
- {
- // do sth ???
- //mma_enable_disable(enable);
- /*if (enable != 0)
- {
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- } else {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- }*/
- l_sensorconfig.sensor_enable = enable;
-
- }
- } else {
- errlog("Wrong enable argument!!!\n");
- err = -EFAULT;
- goto errioctl;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = DMARD08_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("dmard08_driver_id:%d\n",uval);
- break;
- default:
- break;
- }
-errioctl:
- mutex_unlock(&sense_data_mutex);
- return err;
-}
-
-/*
-static ssize_t dmard08_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
-{
- struct que_data data;
- short xyz_temp[3];
-
- // read data from cycle queue
- while (clque_is_empty()) msleep(10);
- clque_out(&data);
- xyz_temp[0] = data.data[0];
- xyz_temp[1] = data.data[1];
- xyz_temp[2] = data.data[2];
-
-
- if(copy_to_user(buf, &xyz_temp, sizeof(xyz_temp)))
- return -EFAULT;
- dbg("x=%x,y=%x,z=%x\n",xyz_temp[0], xyz_temp[1], xyz_temp[2]);
- return sizeof(xyz_temp);
-}
-*/
-/*
-static ssize_t dmard08_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
-{
- dbg("write...\n");
- return 0;
-}
-*/
-
-static const struct file_operations d08_fops = {
- .owner = THIS_MODULE,
- .open = dmard08_open,
- .release = dmard08_close,
- //.read = dmard08_read,
- //.wirte = dmard08_write,
- .unlocked_ioctl = dmard08_ioctl,
-};
-
-static struct miscdevice d08_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = GSENSOR_DEV_NODE,
- .fops = &d08_fops,
-};
-
-
-static int dmard08_resume(struct platform_device *pdev)
-{
- char buffer[2];
- dbg("...\n");
-
- if (l_sensorconfig.samp == 1) {
- buffer[0] = 0x08;
- buffer[1] = 0x04;
- dmard08_i2c_xyz_write_reg(l_sensorconfig.client, buffer, 2);
- }
-
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return 0;
-}
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- //int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- //unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&sense_data_mutex);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- // should do sth
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- klog("Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- klog("The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-static void read_work_func(struct work_struct *work)
-{
- s16 xyz[SENSOR_DATA_SIZE];
- s16 txyz[SENSOR_DATA_SIZE];
-
- if (! l_sensorconfig.sensor_enable)
- {
- // no report data
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return;
- }
- // read data to one cycle que
- //dbg("read...\n");
- dmard08_i2c_read_xyz(l_sensorconfig.client, (s16 *)xyz);
-
- // x
- txyz[0] = xyz[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1]+l_sensorconfig.offset[0];
- // y
- txyz[1] = xyz[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1]+l_sensorconfig.offset[1];
- // z
- txyz[2] = xyz[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1]+l_sensorconfig.offset[2];
-
- input_report_abs(l_sensorconfig.input_dev, ABS_X, txyz[0]);
- input_report_abs(l_sensorconfig.input_dev, ABS_Y, txyz[1]);
- input_report_abs(l_sensorconfig.input_dev, ABS_Z, txyz[2]);
- input_sync(l_sensorconfig.input_dev);
- l_sensorconfig.test_pass = 1; // for testing
- // read next
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-}
-
-
-static int dmard08_probe(struct platform_device *pdev)
-{
- int err = 0;
-
- //register ctrl dev
- err = misc_register(&d08_device);
- if (err !=0) {
- errlog("Can't register d08_device!\n");
- return -1;
- }
- // register rd/wr proc
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
- // init work queue
- l_sensorconfig.queue = create_singlethread_workqueue("sensor-report");
- INIT_DELAYED_WORK(&l_sensorconfig.work, read_work_func);
- mutex_init(&sense_data_mutex);
- // init input device
- l_sensorconfig.input_dev = input_allocate_device();
- if (!l_sensorconfig.input_dev) {
- err = -ENOMEM;
- errlog("Failed to allocate input device\n");
- goto exit_input_dev_alloc_failed;
- }
- l_sensorconfig.input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY);
- /* x-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_X, -1024, 1024, 0, 0);
- /* y-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Y, -1024, 1024, 0, 0);
- /* z-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Z, -1024, 1024, 0, 0);
-
- l_sensorconfig.input_dev->name = GSENSOR_INPUT_NAME;
-
- err = input_register_device(l_sensorconfig.input_dev);
-
- if (err) {
- errlog("Unable to register input device: %s\n",
- l_sensorconfig.input_dev->name);
- goto exit_input_register_device_failed;
- }
-
- return 0;
-exit_input_register_device_failed:
- // free inut
- input_free_device(l_sensorconfig.input_dev);
-exit_input_dev_alloc_failed:
- // free queue
- destroy_workqueue(l_sensorconfig.queue);
- l_sensorconfig.queue = NULL;
- // free proc
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- // free work
- // unregister ctrl dev
- misc_deregister(&d08_device);
- return err;
-}
-
-static int dmard08_remove(struct platform_device *pdev)
-{
- if (NULL != l_sensorconfig.queue)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- destroy_workqueue(l_sensorconfig.queue);
- l_sensorconfig.queue = NULL;
- }
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- misc_deregister(&d08_device);
- input_unregister_device(l_sensorconfig.input_dev);
- return 0;
-}
-
-
-static struct platform_driver dmard08_driver = {
- .probe = dmard08_probe,
- .remove = dmard08_remove,
- .suspend = dmard08_suspend,
- .resume = dmard08_resume,
- .driver = {
- .name = GSENSOR_I2C_NAME,
- },
-};
-
-#if 0
-static void dmard08_early_suspend(struct early_suspend *h)
-{
- dbg("start\n");
- cancel_delayed_work_sync(&l_sensorconfig.work);
- dbg("exit\n");
-}
-
-static void dmard08_late_resume(struct early_suspend *h)
-{
- dbg("start\n");
- // init
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- dbg("exit\n");
-}
-#endif
-
-static int __init dmard08_init(void) //OK
-{
- int ret = 0;
-
- // parse g-sensor u-boot arg
- ret = get_axisset();
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- /*if ((ret != 0) || !l_sensorconfig.op)
- {
- dbg("Can't load gsensor dmar08 driver for error u-boot arg!\n");
- return -EINVAL;
- }*/
- if (!(this_client = sensor_i2c_register_device(0, GSENSOR_I2C_ADDR, GSENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- // find the device
- /*if(i2c_add_driver(&dmard08_i2c_driver) != 0)
- {
- ret = -1;
- dbg("Can't find gsensor dmard08!\n");
- goto err_i2c_add_driver;
- }*/
- if(dmard08_hw_init(this_client))
- {
- ret = -1;
- dbg("Can't find gsensor dmard08!\n");
- goto err_i2c_add_driver;
- }
-
-
- // create the platform device
- l_dev_class = class_create(THIS_MODULE, GSENSOR_I2C_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&dmard08_device)))
- {
- klog("Can't register mc3230 platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&dmard08_driver)) != 0)
- {
- errlog("Can't register mc3230 platform driver!!!\n");
- return ret;
- }
-#ifdef CONFIG_HAS_EARLYSUSPEND
- l_sensorconfig.earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- l_sensorconfig.earlysuspend.suspend = dmard08_early_suspend;
- l_sensorconfig.earlysuspend.resume = dmard08_late_resume;
- register_early_suspend(&l_sensorconfig.earlysuspend);
-#endif
-
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-
- return 0;
-
-err_i2c_add_driver:
- sensor_i2c_unregister_device(this_client);
- return ret;
-}
-
-static void __exit dmard08_exit(void) //OK
-{
- platform_driver_unregister(&dmard08_driver);
- platform_device_unregister(&dmard08_device);
- class_destroy(l_dev_class);
- sensor_i2c_unregister_device(this_client);
-}
-
-//*********************************************************************************************************
-// 2011-11-30
-// Add by Steve Huang
-// function definition
-/*
-void gsensor_write_offset_to_file(void)
-{
- char data[18];
- unsigned int orgfs;
- long lfile=-1;
-
- //sprintf(data,"%5d %5d %5d",offset.u.x,offset.u.y,offset.u.z); //marked by eason check again
-
- orgfs = get_fs();
-// Set segment descriptor associated to kernel space
- set_fs(KERNEL_DS);
-
- lfile=sys_open(OffsetFileName,O_WRONLY|O_CREAT, 0777);
- if (lfile < 0)
- {
- printk("sys_open %s error!!. %ld\n",OffsetFileName,lfile);
- }
- else
- {
- sys_write(lfile, data,18);
- sys_close(lfile);
- }
- set_fs(orgfs);
-
- return;
-}
-
-void gsensor_read_offset_from_file(void)
-{
- unsigned int orgfs;
- char data[18];
- long lfile=-1;
- orgfs = get_fs();
-// Set segment descriptor associated to kernel space
- set_fs(KERNEL_DS);
-
- lfile=sys_open(OffsetFileName, O_RDONLY, 0);
- if (lfile < 0)
- {
- printk("sys_open %s error!!. %ld\n",OffsetFileName,lfile);
- if(lfile==-2)
- {
- lfile=sys_open(OffsetFileName,O_WRONLY|O_CREAT, 0777);
- if(lfile >=0)
- {
- strcpy(data,"00000 00000 00000");
- printk("sys_open %s OK!!. %ld\n",OffsetFileName,lfile);
- sys_write(lfile,data,18);
- sys_read(lfile, data, 18);
- sys_close(lfile);
- }
- else
- printk("sys_open %s error!!. %ld\n",OffsetFileName,lfile);
- }
-
- }
- else
- {
- sys_read(lfile, data, 18);
- sys_close(lfile);
- }
- //sscanf(data,"%hd %hd %hd",&offset.u.x,&offset.u.y,&offset.u.z); //marked by eason check again
- set_fs(orgfs);
-
-}
-*/
-//*********************************************************************************************************
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMARD08 g-sensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(dmard08_init);
-module_exit(dmard08_exit);
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.h b/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.h
deleted file mode 100755
index e6a6c935..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard08_gsensor/dmard08.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * @file include/linux/dmard08.h
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.2
- * @date 2011/11/14
- *
- * @section LICENSE
- *
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- */
-#ifndef DMARD08_H
-#define DMARD08_H
-
-#define GSENSOR_I2C_NAME "dmard08"
-#define GSENSOR_I2C_ADDR 0x1c
-/*
-#define DEVICE_I2C_NAME "dmard08"
-
-//#define DMT_DEBUG_DATA 1
-#define DMT_DEBUG_DATA 0
-
-#if DMT_DEBUG_DATA
-#define IN_FUNC_MSG printk(KERN_INFO "@DMT@ In %s\n", __func__)
-#define PRINT_X_Y_Z(x, y, z) printk(KERN_INFO "@DMT@ X/Y/Z axis: %04d , %04d , %04d\n", (x), (y), (z))
-#define PRINT_OFFSET(x, y, z) printk(KERN_INFO "@offset@ X/Y/Z axis: %04d , %04d , %04d\n",offset.x,offset.y,offset.z);
-#else
-#define IN_FUNC_MSG
-#define PRINT_X_Y_Z(x, y, z)
-#define PRINT_OFFSET(x, y, z)
-#endif
-*/
-
-//g-senor layout configuration, choose one of the following configuration
-#define CONFIG_GSEN_LAYOUT_PAT_1
-//#define CONFIG_GSEN_LAYOUT_PAT_2
-//#define CONFIG_GSEN_LAYOUT_PAT_3
-//#define CONFIG_GSEN_LAYOUT_PAT_4
-//#define CONFIG_GSEN_LAYOUT_PAT_5
-//#define CONFIG_GSEN_LAYOUT_PAT_6
-//#define CONFIG_GSEN_LAYOUT_PAT_7
-//#define CONFIG_GSEN_LAYOUT_PAT_8
-
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE 1
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE 2
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE 3
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE 4
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE 5
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE 6
-
-#define DEFAULT_SENSITIVITY 256
-#define IOCTL_MAGIC 0x09
-#define SENSOR_DATA_SIZE 3
-
-#define SENSOR_RESET _IO(IOCTL_MAGIC, 0)
-#define SENSOR_CALIBRATION _IOWR(IOCTL_MAGIC, 1, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OFFSET _IOR(IOCTL_MAGIC, 2, int[SENSOR_DATA_SIZE])
-#define SENSOR_SET_OFFSET _IOWR(IOCTL_MAGIC, 3, int[SENSOR_DATA_SIZE])
-#define SENSOR_READ_ACCEL_XYZ _IOR(IOCTL_MAGIC, 4, int[SENSOR_DATA_SIZE])
-
-#define SENSOR_MAXNR 4
-
-#endif
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/Makefile
deleted file mode 100755
index d9242020..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_dmard09
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := dmt09.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.c b/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.c
deleted file mode 100755
index 90b03aa3..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.c
+++ /dev/null
@@ -1,1685 +0,0 @@
-/*
- * @file drivers/misc/dmt09.c
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.06
- * @date 2013/08/14
- * @section LICENSE
- *
- * Copyright 2012 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- */
-#include "dmt09.h"
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include <linux/clk.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/string.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-
-#include "../sensor.h"
-
-//////////////////////////////////////////////////////////
-static struct wmt_gsensor_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 5,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .isdbg = 0,
- .sensor_samp = 10, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .offset={0,0,0},
-};
-
-static struct class* l_dev_class = NULL;
-static void update_var(void);
-
-////////////////////////////////////////////////////////////
-
-
-static unsigned int interval;
-static int D09_write_offset_to_file(struct i2c_client *client);
-void D09_read_offset_from_file(struct i2c_client *client);
-#define DMT_BROADCAST_APK_ENABLE
-char D09_OffsetFileName[] = "/data/misc/gsensor_offset.txt";//"/system/vendor/dmt/gsensor_offset.txt";// /* FILE offset.txt */
-char DmtXXFileName[] = "/data/misc/dmt_sensor.txt";//"/system/vendor/dmt/dmt_sensor.txt";//
-static int create_devidfile(void);
-static struct dmt_data *s_dmt;
-static int device_init(void);
-static void device_exit(void);
-
-static int device_open(struct inode*, struct file*);
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
-static int device_close(struct inode*, struct file*);
-
-static int dmard09_suspend(struct platform_device *pdev, pm_message_t state);
-static int dmard09_resume(struct platform_device *pdev);
-
-/*static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg);
-static int device_i2c_resume(struct i2c_client *client);
-static int __devinit device_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int __devexit device_i2c_remove(struct i2c_client *client);*/
-static int D09_i2c_read_xyz(struct i2c_client *client, int *xyz);
-static int device_i2c_rxdata(struct i2c_client *client, unsigned char *rxDat, int length);
-static int device_i2c_txdata(struct i2c_client *client, unsigned char *txData, int length);
-
-static int dmt_get_filter(struct i2c_client *client);
-static int dmt_set_filter(struct i2c_client *client,int);
-static int dmt_get_position(struct i2c_client *client);
-static int dmt_set_position(struct i2c_client *client,int);
-static int DMT_GetOpenStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) != 0));
- return 0;
-}
-
-static int DMT_GetCloseStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) <= 0));
- return 0;
-}
-
-static void DMT_sysfs_update_active_status(struct dmt_data *dmt , int en){
- unsigned long dmt_delay;
- if(en){
- dmt_delay=msecs_to_jiffies(atomic_read(&dmt->delay));
- if(dmt_delay<1)
- dmt_delay=1;
-
- GSE_LOG("schedule_delayed_work start with delay time=%lu\n",dmt_delay);
- schedule_delayed_work(&dmt->delaywork,dmt_delay);
- }
- else
- cancel_delayed_work_sync(&dmt->delaywork);
-}
-
-static bool get_value_as_int(char const *buf, size_t size, int *value){
- long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtol(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtol(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtol(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > INT_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-static bool get_value_as_int64(char const *buf, size_t size, long long *value)
-{
- long long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtoll(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtoll(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtoll(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > LLONG_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-/* sysfs enable show & store */
-static ssize_t dmt_sysfs_enable_show(
- struct dmt_data *dmt, char *buf, int pos)
-{
- char str[2][16]={"ACC enable OFF","ACC enable ON"};
- int flag;
- flag=atomic_read(&dmt->enable);
- return sprintf(buf, "%s\n", str[flag]);
-}
-
-static ssize_t dmt_sysfs_enable_store(
- struct dmt_data *dmt, char const *buf, size_t count, int pos)
-{
- int en = 0;
- if (NULL == buf)
- return -EINVAL;
- //GSE_LOG("buf=%x %x\n", buf[0], buf[1]);
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int(buf, count, &en))
- return -EINVAL;
-
- en = en ? 1 : 0;
-
- atomic_set(&dmt->enable,en);
- DMT_sysfs_update_active_status(dmt , en);
- return count;
-}
-
-static ssize_t dmt_enable_show(struct device *dev, struct device_attribute *attr, char *buf){
- return dmt_sysfs_enable_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t dmt_enable_store( struct device *dev, struct device_attribute *attr, char const *buf, size_t count){
- return dmt_sysfs_enable_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-
-/* sysfs delay show & store*/
-static ssize_t dmt_sysfs_delay_show( struct dmt_data *dmt, char *buf, int pos){
- return sprintf(buf, "%d\n", atomic_read(&dmt->delay));
-}
-
-static ssize_t dmt_sysfs_delay_store( struct dmt_data *dmt, char const *buf, size_t count, int pos){
- long long val = 0;
-
- if (NULL == buf)
- return -EINVAL;
-
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int64(buf, count, &val))
- return -EINVAL;
-
- atomic_set(&dmt->delay, (unsigned int) val);
- GSE_LOG("Driver attribute set delay =%lld\n", val);
-
- return count;
-}
-
-static ssize_t dmt_delay_show( struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- return dmt_sysfs_delay_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t dmt_delay_store( struct device *dev,
- struct device_attribute *attr,
- char const *buf,
- size_t count)
-{
- return dmt_sysfs_delay_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-/* sysfs position show & store */
-static ssize_t dmt_position_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
-
- return sprintf(buf, "%d\n", dmt_get_position(dmt->client));
-}
-
-static ssize_t dmt_position_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long position;
- int ret;
-
- ret = strict_strtoul(buf, 10, &position);
- if (ret < 0)
- return count;
-
- dmt_set_position(dmt->client, position);
- return count;
-}
-/* sysfs offset show & store */
-static ssize_t dmt_offset_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- return sprintf(buf, "( %d %d %d )\n", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
-}
-
-static ssize_t dmt_offset_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- sscanf(buf, "%d %d %d", (int *)&dmt->offset.v[0], (int *)&dmt->offset.v[1], (int *)&dmt->offset.v[2]);
- D09_write_offset_to_file(dmt->client);
- update_var();
- return count;
-}
-/* sysfs filter show & store */
-static ssize_t dmt_filter_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
-
- return sprintf(buf, "%d\n", dmt_get_filter(dmt->client));
-}
-
-static ssize_t dmt_filter_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long filter;
- int ret;
-
- ret = strict_strtoul(buf, 10, &filter);
- if (ret < 0)
- return count;
-
- dmt_set_filter(dmt->client, filter);
- return count;
-}
-
-/* sysfs data show */
-static ssize_t dmt_acc_private_data_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- raw_data accel;
-
- mutex_lock(&dmt->data_mutex);
- accel = dmt->last;
- mutex_unlock(&dmt->data_mutex);
-
- return sprintf(buf, "( %d %d %d )\n", dmt->last.v[0], dmt->last.v[1], dmt->last.v[2]);
-}
-/* sysfs id show */
-static ssize_t dmt_id_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- char str[8]={GSENSOR_ID};
- return sprintf(buf, "%s\n", str);
-}
-/* sysfs debug_suspend show & store */
-#ifdef DMT_DEBUG_DATA
-static ssize_t dmt_debug_suspend_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- int suspend = dmt->suspend;
-
- mutex_lock(&dmt->suspend_mutex);
- suspend = sprintf(buf, "%d\n", dmt->suspend);
- mutex_unlock(&dmt->suspend_mutex);
- return suspend;
-}
-
-static ssize_t dmt_debug_suspend_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long suspend;
- pm_message_t msg;
- int ret;
-
- ret = strict_strtoul(buf, 10, &suspend);
- if (ret < 0)
- return count;
-
- memset(&msg, 0, sizeof(pm_message_t));
-
- mutex_lock(&dmt->suspend_mutex);
-
- if (suspend) {
- dmard09_suspend(dmt->pdevice, msg);
- dmt->suspend = 1;
- } else {
- dmard09_resume(dmt->pdevice);
- dmt->suspend = 0;
- }
-
- mutex_unlock(&dmt->suspend_mutex);
-
- return count;
-}
-/* sysfs reg_read show & store */
-static ssize_t dmt_reg_read_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct dmt_data *dmt = dev_get_drvdata(dev);
- int err;
- unsigned char i2c[1];
-
- i2c[0] = (unsigned char)atomic_read(&dmt->addr);
- err = device_i2c_rxdata(dmt->client, i2c, 1);
- if (err < 0)
- return err;
-
- return sprintf(buf, "0x%02X\n", i2c[0]);
-}
-
-static ssize_t dmt_reg_read_store(struct device *dev,
- struct device_attribute *attr,
- char const *buf,
- size_t count)
-{
- struct dmt_data *dmt = dev_get_drvdata(dev);
- int addr = 0;
-
- if (NULL == buf)
- return -EINVAL;
-
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int(buf, count, &addr))
- return -EINVAL;
-
- if (addr < 0 || 128 < addr)
- return -EINVAL;
-
- atomic_set(&dmt->addr, addr);
-
- return 1;
-}
-#endif /* DEBUG */
-/*********************************************************************
- *
- * SysFS attribute functions
- *
- * directory : /sys/class/accelemeter/dmardXX/
- * files :
- * - enable_acc [rw] [t] : enable flag for accelerometer
- * - delay_acc [rw] [t] : delay in nanosecond for accelerometer
- * - position [rw] [t] : chip mounting position
- * - offset [rw] [t] : offset
- * - data [r] [t] : raw data
- * - id [r] [t] : chip id
- *
- * debug :
- * - debug_suspend [w] [t] : suspend test
- * - reg_read [rw] [t] : Read register
- * - reg_write [rw] [t] : Weite register
- *
- * [rw]= read/write
- * [r] = read only
- * [w] = write only
- * [b] = binary format
- * [t] = text format
- */
-
-static struct device_attribute DMT_attributes[] = {
- __ATTR(enable_acc, 0660, dmt_enable_show, dmt_enable_store),
- __ATTR(delay_acc, 0660, dmt_delay_show, dmt_delay_store),
- __ATTR(position, 0660, dmt_position_show, dmt_position_store),
- __ATTR(offset, 0660, dmt_offset_show, dmt_offset_store),
- __ATTR(filter, 0660, dmt_filter_show, dmt_filter_store),
- __ATTR(data, 0660, dmt_acc_private_data_show, NULL),
- __ATTR(id, 0660, dmt_id_show, NULL),
-#ifdef DMT_DEBUG_DATA
- __ATTR(debug_suspend, 0660, dmt_debug_suspend_show,dmt_debug_suspend_store),
- __ATTR(reg_read, 0660, dmt_reg_read_show, dmt_reg_read_store),
- __ATTR(reg_write, 0660, NULL, NULL),
-#endif // DEBUG
- __ATTR_NULL,
-};
-
-static char const *const ACCELEMETER_CLASS_NAME = "accelemeter";
-static char const *const GSENSOR_DEVICE_NAME = SENSOR_I2C_NAME;
-static char const *const device_link_name = "i2c";
-static dev_t const dmt_device_dev_t = MKDEV(MISC_MAJOR, MISC_DYNAMIC_MINOR);
-
-// dmt sysfs functions
-static int create_device_attributes(struct device *dev, struct device_attribute *attrs){
- int i;
- int err = 0;
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i) {
- err = device_create_file(dev, &attrs[i]);
- if (0 != err)
- break;
- }
-
- if (0 != err) {
- for (; i >= 0 ; --i)
- device_remove_file(dev, &attrs[i]);
- }
- return err;
-}
-
-static void remove_device_attributes(
- struct device *dev,
- struct device_attribute *attrs)
-{
- int i;
-
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i)
- device_remove_file(dev, &attrs[i]);
-}
-
-static int create_sysfs_interfaces(struct dmt_data *dmt)
-{
- int err;
-
- if (NULL == dmt)
- return -EINVAL;
-
- err = 0;
- dmt->class = class_create(THIS_MODULE, ACCELEMETER_CLASS_NAME);
- if (IS_ERR(dmt->class)) {
- err = PTR_ERR(dmt->class);
- goto exit_class_create_failed;
- }
-
- dmt->class_dev = device_create(
- dmt->class,
- NULL,
- dmt_device_dev_t,
- dmt,
- GSENSOR_DEVICE_NAME);
- if (IS_ERR(dmt->class_dev)) {
- err = PTR_ERR(dmt->class_dev);
- goto exit_class_device_create_failed;
- }
-
- err = sysfs_create_link(
- &dmt->class_dev->kobj,
- &dmt->client->dev.kobj,
- device_link_name);
- if (0 > err)
- goto exit_sysfs_create_link_failed;
-
- err = create_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- if (0 > err)
- goto exit_device_attributes_create_failed;
-#if 0
- err = create_device_binary_attributes(
- &dmt->class_dev->kobj,
- dmt_bin_attributes);
- if (0 > err)
- goto exit_device_binary_attributes_create_failed;
-#endif
-
- return err;
-
-#if 0
-exit_device_binary_attributes_create_failed:
- remove_device_attributes(dmt->class_dev, dmt_attributes);
-#endif
-exit_device_attributes_create_failed:
- sysfs_remove_link(&dmt->class_dev->kobj, device_link_name);
-exit_sysfs_create_link_failed:
- device_destroy(dmt->class, dmt_device_dev_t);
-exit_class_device_create_failed:
- dmt->class_dev = NULL;
- class_destroy(dmt->class);
-exit_class_create_failed:
- dmt->class = NULL;
- return err;
-}
-
-static void remove_sysfs_interfaces(struct dmt_data *dmt){
- if (NULL == dmt)
- return;
-
- if (NULL != dmt->class_dev) {
-
- remove_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- sysfs_remove_link(
- &dmt->class_dev->kobj,
- device_link_name);
- dmt->class_dev = NULL;
- }
- if (NULL != dmt->class) {
- device_destroy(
- dmt->class,
- dmt_device_dev_t);
- class_destroy(dmt->class);
- dmt->class = NULL;
- }
-}
-
-int D09_input_init(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- int err = 0;
- dmt->input = input_allocate_device();
- if (!dmt->input){
- GSE_ERR("input device allocate ERROR !!\n");
- return -ENOMEM;
- }
- else
- GSE_LOG("input device allocate Success !!\n");
- /* Setup input device */
- //dmt->input->name = SENSOR_I2C_NAME;
- set_bit(EV_ABS, dmt->input->evbit);
- /* Accelerometer [-78.5, 78.5]m/s2 in Q16 */
- input_set_abs_params(dmt->input, ABS_X, ABSMIN, ABSMAX, 0, 0);
- input_set_abs_params(dmt->input, ABS_Y, ABSMIN, ABSMAX, 0, 0);
- input_set_abs_params(dmt->input, ABS_Z, ABSMIN, ABSMAX, 0, 0);
- /* Set InputDevice Name */
- dmt->input->name = INPUT_NAME_ACC;
- /* Register */
- err = input_register_device(dmt->input);
- if (err) {
- GSE_ERR("input_register_device ERROR !!\n");
- input_free_device(dmt->input);
- return err;
- }
- GSE_LOG("input_register_device SUCCESS %d !! \n",err);
-
- return err;
-}
-
-int D09_calibrate(struct i2c_client *client)
-{
- struct dmt_data *dmt = i2c_get_clientdata(client);
- raw_data avg;
- int i, j;
- long xyz_acc[SENSOR_DATA_SIZE];
- int xyz[SENSOR_DATA_SIZE];
- /* initialize the offset value */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->offset.v[i] = 0;
- /* initialize the accumulation buffer */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_acc[i] = 0;
-
- for(i = 0; i < AVG_NUM; i++) {
- D09_i2c_read_xyz(client, (int *)&xyz);
- for(j = 0; j < SENSOR_DATA_SIZE; ++j)
- xyz_acc[j] += xyz[j];
- }
- /* calculate averages */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- avg.v[i] = xyz_acc[i] / AVG_NUM;
-
- if(avg.v[2] < 0){
- dmt->offset.u.x = avg.v[0] ;
- dmt->offset.u.y = avg.v[1] ;
- dmt->offset.u.z = avg.v[2] + DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE;
- }
- else{
- dmt->offset.u.x = avg.v[0] ;
- dmt->offset.u.y = avg.v[1] ;
- dmt->offset.u.z = avg.v[2] - DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE;
- }
- return 0;
-}
-
-int dmard09_init(struct i2c_client *client){
-
- //struct dmt_data *dmt = i2c_get_clientdata(client);
- unsigned char buffer[7];
- /* 1. Active Mode */
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_ACTIVE;
- device_i2c_txdata(client, buffer, 2);
- /* 2. check D09 who am I */
- buffer[0] = REG_DC;
- device_i2c_rxdata(client, buffer, 1);
- if (buffer[0] == VALUE_WHO_AM_I)
- {
- printk(KERN_INFO GSE_TAG"D09 WHO_AM_I_VALUE = %d \n", buffer[0]);
- GSE_LOG("D09 registered I2C driver!\n");
- }
- else
- {
- GSE_ERR("gsensor I2C err = %d!\n", buffer[0]);
- return -1;
- }
- /* 3. Set Data conversion rate*/
- buffer[0] = REG_CNT_L1;
- buffer[1] = VALUE_ODR_100;
- buffer[2] = VALUE_CNT_L2;
- device_i2c_txdata(client, buffer, 3);
- /* 4. open hardware filter */
- buffer[0] = REG_ODF;
- buffer[1] = ODF_Ave_4;
- buffer[2] = 0x00;
- device_i2c_txdata(client, buffer, 3);
- /* 5. check hardware filter again */
- buffer[0] = REG_ODF; //0x07 smooth filter 1/8 Bandwidth */
- device_i2c_rxdata(client, buffer, 2);
- printk(KERN_INFO GSE_TAG" REG_ODF = %x , %x\n", buffer[0] , buffer[1]);
-
- return 0;
-}
-
-void D09_set_offset(struct i2c_client *client, int val[3]){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- int i;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->offset.v[i] = val[i];
-}
-
-struct file_operations sensor_fops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = device_ioctl,
- .open = device_open,
- .release = device_close,
-};
-
-static struct miscdevice dmt_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = SENSOR_I2C_NAME,
- .fops = &sensor_fops,
-};
-
-static int sensor_close_dev(struct i2c_client *client){
- char buffer[3];
- buffer[0] = REG_ACTR;
- device_i2c_rxdata(client, buffer, 2);
- buffer[1] = buffer[0] & 0xFE; //Mask off last bit (POWER DOWN MODE)
- //buffer[1] = MODE_POWERDOWN;
- device_i2c_txdata(client,buffer, 2);
- return 0;
-}
-
-static void dmard09_shutdown(struct platform_device *pdev)
-{
- flush_delayed_work_sync(&s_dmt->delaywork);
- DMT_sysfs_update_active_status(s_dmt , 0);
-}
-
-
-//static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg){
-static int dmard09_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct dmt_data *dmt = i2c_get_clientdata(s_dmt->client);
- flush_delayed_work_sync(&dmt->delaywork);
- DMT_sysfs_update_active_status(dmt , 0);
- return sensor_close_dev(dmt->client);
-}
-
-//static int device_i2c_resume(struct i2c_client *client){
-static int dmard09_resume(struct platform_device *pdev)
-{
- struct dmt_data *dmt = i2c_get_clientdata(s_dmt->client);
- int en = 1;
- GSE_FUN();
- printk("dmt->enable=%d",dmt->enable);
- dmard09_init(dmt->client);
- atomic_set(&dmt->enable,en);
- DMT_sysfs_update_active_status(dmt , en);
- return 0;
-}
-/*
-static int __devexit device_i2c_remove(struct i2c_client *client){
- return 0;
-}
-
-static const struct i2c_device_id device_i2c_ids[] = {
- { SENSOR_I2C_NAME, 0},
- { }
-};
-
-static struct i2c_driver device_i2c_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = SENSOR_I2C_NAME,
- },
- .class = I2C_CLASS_HWMON,
- .id_table = device_i2c_ids,
- .probe = device_i2c_probe,
- .remove = __devexit_p(device_i2c_remove),
-#ifdef CONFIG_HAS_EARLYSUSPEND
- .suspend = device_i2c_suspend,
- .resume = device_i2c_resume,
-#endif
-};
-*/
-static int device_open(struct inode *inode, struct file *filp){
- return 0;
-}
-
-static long device_ioctl(struct file *file, unsigned int cmd, unsigned long arg){
- //struct i2c_client *client = (struct i2c_client *)file->private_data;
- //struct dmt_data *dmt = (struct dmt_data*)i2c_get_clientdata(client);
-
- int err = 0, ret = 0, i;
- int intBuf[SENSOR_DATA_SIZE], xyz[SENSOR_DATA_SIZE];
- /* check type */
- if (_IOC_TYPE(cmd) != IOCTL_MAGIC) return -ENOTTY;
-
- /* check user space pointer is valid */
- if (_IOC_DIR(cmd) & _IOC_READ)
- err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
- else if (_IOC_DIR(cmd) & _IOC_WRITE)
- err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
- if (err) return -EFAULT;
-
- switch(cmd) {
- case SENSOR_RESET:
- ret = dmard09_init(s_dmt->client);
- return ret;
-
- case SENSOR_CALIBRATION:
- /* get orientation info */
- //if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) return -EFAULT;
- D09_calibrate(s_dmt->client);
- GSE_LOG("Sensor_calibration:%d %d %d\n", s_dmt->offset.u.x, s_dmt->offset.u.y, s_dmt->offset.u.z);
- /* save file */
- D09_write_offset_to_file(s_dmt->client);
- update_var();
-
- /* return the offset */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = s_dmt->offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_GET_OFFSET:
- /* get data from file */
- D09_read_offset_from_file(s_dmt->client);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = s_dmt->offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SET_OFFSET:
- ret = copy_from_user(&intBuf, (int *)arg, sizeof(intBuf));
- D09_set_offset(s_dmt->client , intBuf);
- /* write into file */
- D09_write_offset_to_file(s_dmt->client);
- update_var();
- return ret;
-
- case SENSOR_READ_ACCEL_XYZ:
- D09_i2c_read_xyz(s_dmt->client, (int *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = xyz[i] - s_dmt->offset.v[i];
-
- ret = copy_to_user((int*)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SETYPR:
- if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) {
- GSE_LOG("%s: -EFAULT\n",__func__);
- return -EFAULT;
- }
- input_report_abs(s_dmt->input, ABS_X, intBuf[0]);
- input_report_abs(s_dmt->input, ABS_Y, intBuf[1]);
- input_report_abs(s_dmt->input, ABS_Z, intBuf[2]);
- input_sync(s_dmt->input);
- GSE_LOG("SENSOR_SETYPR OK! x=%d,y=%d,z=%d\n",intBuf[0],intBuf[1],intBuf[2]);
- return ret;
-
- case SENSOR_GET_OPEN_STATUS:
- GSE_LOG("Going into DMT_GetOpenStatus()\n");
- ret = DMT_GetOpenStatus(s_dmt->client);
- return ret;
-
- case SENSOR_GET_CLOSE_STATUS:
- GSE_LOG("Going into DMT_GetCloseStatus()\n");
- ret = DMT_GetCloseStatus(s_dmt->client);
- return ret;
-
- case SENSOR_GET_DELAY:
- ret = copy_to_user((int*)arg, &interval, sizeof(interval));
- return ret;
-
- default: /* redundant, as cmd was checked against MAXNR */
- return -ENOTTY;
- }
-
- return 0;
-}
-
-static int device_close(struct inode *inode, struct file *filp){
- return 0;
-}
-
-/***** I2C I/O function ***********************************************/
-static int device_i2c_rxdata( struct i2c_client *client, unsigned char *rxData, int length){
- struct i2c_msg msgs[] = {
- {.addr = client->addr, .flags = 0, .len = 1, .buf = rxData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = length, .buf = rxData,},
- };
- //unsigned char addr = rxData[0];
- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "RxData: len=%02x, addr=%02x, data=%02x\n",
- //length, addr, rxData[0]);
-
- return 0;
-}
-
-static int device_i2c_txdata( struct i2c_client *client, unsigned char *txData, int length){
- struct i2c_msg msg[] = {
- {.addr = client->addr, .flags = 0, .len = length, .buf = txData,},
- };
-
- if (i2c_transfer(client->adapter, msg, 1) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "TxData: len=%02x, addr=%02x data=%02x\n",
- //length, txData[0], txData[1]);
- return 0;
-}
-
-static int D09_i2c_read_xyz(struct i2c_client *client, int *xyz_p){
-
- struct dmt_data *dmt = i2c_get_clientdata(client);
- u8 buffer[11];
- s16 xyzTmp[SENSOR_DATA_SIZE];
- int pos = dmt->position;
- int i, j , k;
- /* get xyz high/low bytes, 0x0A */
- buffer[0] = REG_STAT;
- /* Read acceleration data */
- if (device_i2c_rxdata(client, buffer, 8)!= 0)
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- {
- xyz_p[i] = 0;
- xyzTmp[i] = 0;
- }
- else
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- xyz_p[i] = 0;
- xyzTmp[i] = 0;
- /* merge xyz high/low bytes & 1g = 128 becomes 1g = 1024 */
- mutex_lock(&dmt->data_mutex);
- xyzTmp[i] =(((int16_t)((buffer[2*(i+1)+1] << 8)) | buffer[2*(i+1)] ) >> 3) << 5;
- mutex_unlock(&dmt->data_mutex);
- }
-#ifdef SW_FILTER
- if( dmt->aveflag >= dmt->filter){
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->sum[i] = dmt->sum[i] - dmt->bufferave[i][dmt->pointer] + xyzTmp[i];
- }
- /* transfer to the default layout */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(j = 0; j < SENSOR_DATA_SIZE; j++)
- xyz_p[i] += (int)(dmt->sum[j]/dmt->filter * dmt_position_map[pos][i][j]);
- }
- }
- else{
- /* init dmt->sum */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->sum[i] = xyzTmp[i];
-#endif
- /* transfer to the default layout */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(j = 0; j < SENSOR_DATA_SIZE; j++){
- xyz_p[i] += (int)(xyzTmp[j] * dmt_position_map[pos][i][j]);
- //GSE_LOG("%04d, %04d,%d \n", xyz_p[i], xyzTmp[j], dmt_position_map[pos][i][j]);
- }
- }
- //GSE_LOG("xyz_p: %04d , %04d , %04d\n", xyz_p[0], xyz_p[1], xyz_p[2]);
-#ifdef SW_FILTER
- dmt->aveflag++;
- }
- /* init dmt->sum */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->sum[i] = 0;
- }
- dmt->pointer++;
- dmt->pointer %= dmt->filter;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->bufferave[i][dmt->pointer] = xyzTmp[i];
- }
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(k = 0; k < dmt->filter; ++k){
- dmt->sum[i] += dmt->bufferave[i][k];
- }
- }
-#endif
- return 0;
-}
-
-static void DMT_work_func(struct work_struct *delaywork){
- struct dmt_data *dmt = container_of(delaywork, struct dmt_data, delaywork.work);
- int i;
- //static bool firsttime=true;
- raw_data xyz;
- unsigned long dmt_delay = msecs_to_jiffies(atomic_read(&dmt->delay));
-
-
- D09_i2c_read_xyz(dmt->client, (int *)&xyz.v);
- /* dmt->last = RawData - Offset */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->last.v[i] = xyz.v[i] - dmt->offset.v[i];
- //GSE_LOG("@DMTRaw @ X/Y/Z axis: %04d , %04d , %04d\n", xyz.v[0], xyz.v[1], xyz.v[2]);
- //GSE_LOG("@Offset @ X/Y/Z axis: %04d , %04d , %04d\n", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
- //GSE_LOG("@Raw-Offset@ X/Y/Z axis: %04d , %04d , %04d ,dmt_delay=%d\n", dmt->last.u.x, dmt->last.u.y, dmt->last.u.z, atomic_read(&dmt->delay));
-
-#ifdef STABLE_VALUE_FUNCTION
- if(abs(dmt->last.v[0])< RANGE_XYZ){ dmt->last.v[0] = 0;}
- if(abs(dmt->last.v[1])< RANGE_XYZ){ dmt->last.v[1] = 0;}
- if(abs(dmt->last.v[2])< RANGE_XYZ){ dmt->last.v[2] = 0;}
-#endif
-
-
- input_report_abs(dmt->input, ABS_X, -dmt->last.v[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1]);//dmt->last.v[0]);
- input_report_abs(dmt->input, ABS_Y, -dmt->last.v[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1]);//dmt->last.v[1]);
- input_report_abs(dmt->input, ABS_Z, -dmt->last.v[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1]);//dmt->last.v[2]);
- input_sync(dmt->input);
-
- if(dmt_delay < 1)
- dmt_delay = 1;
- schedule_delayed_work(&dmt->delaywork, dmt_delay);
-}
-
-static int mma09_open(struct inode *node, struct file *fle)
-{
- GSE_LOG("open...\n");
- return 0;
-}
-
-static int mma09_close(struct inode *node, struct file *fle)
-{
- GSE_LOG("close...\n");
- return 0;
-}
-
-static long mma09_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- int err = 0;
- //unsigned char data[6];
- void __user *argp = (void __user *)arg;
- short delay, enable;
- unsigned int uval = 0;
-
-
- /* cmd mapping */
- switch(cmd)
- {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- return -EFAULT;
- }
- klog("Get delay=%d\n", delay);
-
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- l_sensorconfig.sensor_samp = 1000/delay;
- atomic_set(&s_dmt->delay, 1000/delay);
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- klog("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- //KMSGINF("driver: disable/enable(%d) gsensor.\n", enable);
-
- l_sensorconfig.sensor_enable = enable;
- atomic_set(&s_dmt->enable,enable);
- DMT_sysfs_update_active_status(s_dmt , enable);
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = DMARD09_DRVID;//;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- GSE_LOG("dmard09_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
- uval = (10<<8) | 1;
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- default:
- err = -1;
- break;
- }
-
- return err;
-}
-
-static const struct file_operations d09_fops = {
- .owner = THIS_MODULE,
- .open = mma09_open,
- .release = mma09_close,
- .unlocked_ioctl = mma09_ioctl,
-};
-
-
-static struct miscdevice d09_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = GSENSOR_DEV_NODE,
- .fops = &d09_fops,
-};
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- //int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- //unsigned int amsr = 0;
- int test = 0;
-
- //mutex_lock(&sense_data_mutex);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- // should do sth
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- klog("Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- klog("The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- atomic_set(&s_dmt->enable,1);
- DMT_sysfs_update_active_status(s_dmt , 1);
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- atomic_set(&s_dmt->enable,0);
- DMT_sysfs_update_active_status(s_dmt , 0);
- }
- //mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-//static int __devinit device_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id){
-static int __devinit dmard09_probe(struct platform_device *pdev)
-{
- int i, k, ret = 0;
- //struct dmt_data *s_dmt = i2c_get_clientdata(client);
- //struct dmt_data *s_dmt;
- GSE_FUN();
-/*
- if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){
- GSE_ERR("check_functionality failed.\n");
- ret = -ENODEV;
- goto exit0;
- }
-
- // Allocate memory for driver data
- s_dmt = kzalloc(sizeof(struct dmt_data), GFP_KERNEL);
- memset(s_dmt, 0, sizeof(struct dmt_data));
- if (s_dmt == NULL) {
- GSE_ERR("alloc data failed.\n");
- ret = -ENOMEM;
- goto exit1;
- }
-*/
- /*for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- s_dmt->offset.v[i] = 0;*/
-#ifdef SW_FILTER
- s_dmt->pointer = 0;
- s_dmt->aveflag = 0;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- s_dmt->sum[i] = 0;
- for(k = 0; k < SENSOR_DATA_AVG; ++k){
- s_dmt->bufferave[i][k] = 0;
- }
- }
- s_dmt->filter = SENSOR_DATA_AVG;
- GSE_LOG("D09_DEFAULT_FILTER: %d\n", s_dmt->filter);
-#endif
- /* I2C initialization */
- //s_dmt->client = client;
-
- /* set client data */
- i2c_set_clientdata(s_dmt->client, s_dmt);
- /*ret = dmard09_init(client);
- if (ret < 0)
- goto exit2;
- */
- /* input */
- ret = D09_input_init(s_dmt->client);
- if (ret){
- GSE_ERR("D09_input_init fail, error code= %d\n",ret);
- goto exit3;
- }
-
- /* initialize variables in dmt_data */
- mutex_init(&s_dmt->data_mutex);
- mutex_init(&s_dmt->enable_mutex);
-#ifdef DMT_DEBUG_DATA
- mutex_init(&s_dmt->suspend_mutex);
-#endif
- init_waitqueue_head(&s_dmt->open_wq);
- atomic_set(&s_dmt->active, 0);
- atomic_set(&s_dmt->enable, 0);
- atomic_set(&s_dmt->delay, 0);
- atomic_set(&s_dmt->addr, 0);
- /* DMT Acceleration Sensor Mounting Position on Board */
- s_dmt->position = D09_DEFAULT_POSITION;
- GSE_LOG("D09_DEFAULT_POSITION: %d\n", s_dmt->position);
- //s_dmt->position = (CONFIG_INPUT_DMT_ACCELEROMETER_POSITION);
- //GSE_LOG("CONFIG_INPUT_DMT_ACCELEROMETER_POSITION: %d\n", s_dmt->position);
- /* Misc device */
- if (misc_register(&dmt_device) < 0){
- GSE_ERR("dmt_dev register failed");
- goto exit4;
- }
-
- /* Setup sysfs */
- if (create_sysfs_interfaces(s_dmt) < 0){
- GSE_ERR("create sysfs failed.");
- goto exit5;
- }
-#ifdef CONFIG_HAS_EARLYSUSPEND
- s_dmt->early_suspend.suspend = device_i2c_suspend;
- s_dmt->early_suspend.resume = device_i2c_resume;
- register_early_suspend(&s_dmt->early_suspend);
-#endif
- /* Setup driver interface */
- INIT_DELAYED_WORK(&s_dmt->delaywork, DMT_work_func);
- GSE_LOG("DMT: INIT_DELAYED_WORK\n");
-
- //register ctrl dev
- ret = misc_register(&d09_device);
- if (ret !=0) {
- errlog("Can't register d09_device!\n");
- return -1;
- }
- // register rd/wr proc
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
-
- //create offset file after factory reset
- D09_read_offset_from_file(s_dmt->client);
-
- return 0;
-
-exit5:
- misc_deregister(&dmt_device);
-exit4:
- input_unregister_device(s_dmt->input);
-exit3:
- kfree(s_dmt);
-/*exit2:
-exit1:
-exit0:*/
- return ret;
-}
-/*
-static struct i2c_board_info dmard09_board_info={
- .type = SENSOR_I2C_NAME,
- .addr = SENSOR_I2C_ADDR,
-};
-*/
-//static struct i2c_client *client;
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.dm09sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2])
- );
- if (n != 12) {
- errlog("gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static void dmard09_platform_release(struct device *device)
-{
- GSE_LOG("...\n");
- return;
-}
-
-static int __devexit dmard09_remove(struct platform_device *pdev)
-{
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- //misc_deregister(&d09_device);
- return 0;
-}
-
-
-static struct platform_device dmard09_device = {
- .name = SENSOR_I2C_NAME,
- .id = 0,
- .dev = {
- .release = dmard09_platform_release,
- },
-};
-
-static struct platform_driver dmard09_driver = {
- .probe = dmard09_probe,
- .remove = dmard09_remove,
- .shutdown = dmard09_shutdown,
- .suspend = dmard09_suspend,
- .resume = dmard09_resume,
- .driver = {
- .name = SENSOR_I2C_NAME,
- },
-};
-
-
-static int __init device_init(void){
- //struct device *device;
- struct i2c_client *this_client;
- int ret = 0;
-
- // parse g-sensor u-boot arg
- ret = get_axisset();
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- GSE_LOG("D09 gsensor driver: initialize.\n");
-
- if (!(this_client = sensor_i2c_register_device(0, DEVICE_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_ERR"Can't register gsensor i2c device!\n");
- return -1;
- }
-
- if (dmard09_init(this_client))
- {
- GSE_ERR("Failed to init dmard09!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
- /* Allocate memory for driver data */
- s_dmt = kzalloc(sizeof(struct dmt_data), GFP_KERNEL);
- //memset(s_dmt, 0, sizeof(struct dmt_data));
- if (s_dmt == NULL) {
- GSE_ERR("alloc data failed.\n");
- return -ENOMEM;
- }
-
- s_dmt->client = this_client;
- s_dmt->pdevice = &dmard09_device;
- s_dmt->offset.u.x = l_sensorconfig.offset[0];
- s_dmt->offset.u.y = l_sensorconfig.offset[1];
- s_dmt->offset.u.z = l_sensorconfig.offset[2];
-
-
- // create the platform device
- l_dev_class = class_create(THIS_MODULE, SENSOR_I2C_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&dmard09_device)))
- {
- GSE_ERR("Can't register dmard09 platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&dmard09_driver)) != 0)
- {
- GSE_ERR("Can't register dmard09 platform driver!!!\n");
- return ret;
- }
-
- return 0;
-}
-
-static void __exit device_exit(void){
- //i2c_unregister_device(client);
- //i2c_del_driver(&device_i2c_driver);
- GSE_LOG("D09 gsensor driver: release.\n");
-
- flush_delayed_work_sync(&s_dmt->delaywork);
- cancel_delayed_work_sync(&s_dmt->delaywork);
-
- input_unregister_device(s_dmt->input);
- input_free_device(s_dmt->input);
- misc_deregister(&dmt_device);
- misc_deregister(&d09_device);
- platform_driver_unregister(&dmard09_driver);
- platform_device_unregister(&dmard09_device);
- sensor_i2c_unregister_device(s_dmt->client);
- class_destroy(l_dev_class);
-
- remove_sysfs_interfaces(s_dmt);
- kfree(s_dmt);
-}
-
-static int dmt_get_filter(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- return dmt->filter;
-}
-
-static int dmt_set_filter(struct i2c_client *client, int filter){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- if (!((filter >= 1) && (filter <= 32)))
- return -1;
- dmt->filter = filter;
- return 0;
-}
-
-static int dmt_get_position(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- return dmt->position;
-}
-
-static int dmt_set_position(struct i2c_client *client, int position){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- if (!((position >= 0) && (position <= 7)))
- return -1;
- dmt->position = position;
- return 0;
-}
-
-extern int wmt_setsyspara(char *varname, char *varval);
-static void update_var(void)
-{
- char varbuf[64];
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- sprintf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- s_dmt->offset.u.x,
- s_dmt->offset.u.y,
- s_dmt->offset.u.z
- );
-
- wmt_setsyspara("wmt.io.dm09sensor",varbuf);
-}
-
-static int D09_write_offset_to_file(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- char r_buf[18] = {0};
- char w_buf[18] = {0};
- //unsigned int orgfs;
- struct file *fp;
- mm_segment_t fs;
- ssize_t ret;
- //int8_t i;
-
- sprintf(w_buf,"%5d %5d %5d", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
- /* Set segment descriptor associated to kernel space */
- fp = filp_open(D09_OffsetFileName, O_RDWR | O_CREAT, 0777);
- if(IS_ERR(fp)){
- GSE_ERR("filp_open %s error!!.:%d\n",D09_OffsetFileName,fp);
- return -1;
- }
- else{
- fs = get_fs();
- //set_fs(KERNEL_DS);
- set_fs(get_ds());
- GSE_LOG("filp_open %s SUCCESS!!.\n",D09_OffsetFileName);
- //fp->f_op->write(fp,data,18, &fp->f_pos);
- //filp_close(fp,NULL);
- ret = fp->f_op->write(fp,w_buf,18,&fp->f_pos);
- if(ret != 18)
- {
- printk(KERN_ERR "%s: write error!\n", __func__);
- filp_close(fp,NULL);
- return -EIO;
- }
- //fp->f_pos=0x00;
- ret = fp->f_op->read(fp,r_buf, 18,&fp->f_pos);
- if(ret < 0)
- {
- printk(KERN_ERR "%s: read error!\n", __func__);
- filp_close(fp,NULL);
- return -EIO;
- }
- set_fs(fs);
-
- //
- //printk(KERN_INFO "%s: read ret=%d!", __func__, ret);
- /* for(i=0; i<18 ;i++)
- {
- if(r_buf[i] != w_buf[i])
- {
- printk(KERN_ERR "%s: read back error, r_buf[%x](0x%x) != w_buf[%x](0x%x)\n",
- __func__, i, r_buf[i], i, w_buf[i]);
- filp_close(fp,NULL);
- return -EIO;
- }
- }
- */
-
- }
- filp_close(fp,NULL);
- return 0;
-}
-
-void D09_read_offset_from_file(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- unsigned int orgfs;
- char data[18];
- struct file *fp;
- int ux,uy,uz;
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
-
- fp = filp_open(D09_OffsetFileName, O_RDWR , 0);
- GSE_FUN();
- if(IS_ERR(fp)){
- GSE_ERR("Sorry,file open ERROR !\n");
- if(l_sensorconfig.op){ //first time
- l_sensorconfig.op=0;
-#if AUTO_CALIBRATION
- /* get acceleration average reading */
- D09_calibrate(client);
- update_var();
- D09_write_offset_to_file(client);
-#endif
-#ifdef DMT_BROADCAST_APK_ENABLE
- create_devidfile();
- return;
-#endif
- }
- D09_write_offset_to_file(client);
- }
- else{
- GSE_LOG("filp_open %s SUCCESS!!.\n",D09_OffsetFileName);
- fp->f_op->read(fp,data,18, &fp->f_pos);
- GSE_LOG("filp_read result %s\n",data);
- sscanf(data,"%d %d %d",&ux,&uy,&uz);
- dmt->offset.u.x=ux;
- dmt->offset.u.y=uy;
- dmt->offset.u.z=uz;
- }
- set_fs(orgfs);
-}
-static int create_devidfile(void)
-{
- char data[18];
- unsigned int orgfs;
- struct file *fp;
-
- sprintf(data,"%5d %5d %5d",0,0,0);
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
- GSE_FUN();
- fp = filp_open(DmtXXFileName, O_RDWR | O_CREAT, 0777);
- if(IS_ERR(fp)){
- GSE_ERR("Sorry,file open ERROR !\n");
- return -1;
- }
- fp->f_op->write(fp,data,18, &fp->f_pos);
- set_fs(orgfs);
- filp_close(fp,NULL);
- return 0;
-}
-//*********************************************************************************************************
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMT Gsensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(device_init);
-module_exit(device_exit);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.h b/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.h
deleted file mode 100755
index d30e606a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard09_gsensor/dmt09.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/* @version 1.03
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- */
-
-#ifndef DMT09_H
-#define DMT09_H
-#include <linux/types.h>
-#include <linux/ioctl.h>
-#include <linux/cdev.h>
-#include <linux/mutex.h>
-#include <linux/syscalls.h>
-#include <linux/wait.h>
-#include <linux/workqueue.h>
-#include <linux/delay.h>
-//#include <linux/earlysuspend.h>
-#define AUTO_CALIBRATION 0
-#define SW_FILTER /* Enable or Disable Software filter */
-#define SENSOR_DATA_AVG 4//8 /* AVG sensor data */
-
-#define STABLE_VALUE_FUNCTION
-#define RANGE_XYZ 40
-
-//#define DMT_DEBUG_DATA
-#define GSE_TAG "[DMT_Gsensor]"
-#ifdef DMT_DEBUG_DATA
-#define GSE_ERR(fmt, args...) printk(KERN_ERR GSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
-#define GSE_LOG(fmt, args...) printk(KERN_INFO GSE_TAG fmt, ##args)
-#define GSE_FUN(f) printk(KERN_INFO GSE_TAG" %s: %s: %i\n", __FILE__, __func__, __LINE__)
-#define DMT_DATA(dev, ...) dev_dbg((dev), ##__VA_ARGS__)
-#else
-#define GSE_ERR(fmt, args...)
-#define GSE_LOG(fmt, args...)
-#define GSE_FUN(f)
-#define DMT_DATA(dev, format, ...)
-#endif
-
-#define GSENSOR_ID "DMARD09"
-#define INPUT_NAME_ACC "g-sensor"//"DMT_accel"//"g-sensor"// /* Input Device Name */
-#define SENSOR_I2C_NAME "dmard09"//"dmt"// /* Device name for DMARD09 misc. device */
-#define DEVICE_I2C_ADDR 0x1d
-#define REG_ACTR 0x00
-#define REG_STAT 0x0A
-#define REG_DX 0x0C
-#define REG_DY 0x0E
-#define REG_DZ 0x10
-#define REG_DT 0x12
-#define REG_INL 0x16
-#define REG_DC 0x18
-#define REG_CNT_L1 0x1B
-#define REG_CNT_L2 0x1C
-#define REG_CNT_L3 0x1D
-#define REG_INC 0x1E
-#define REG_ODF 0x20
-#define REG_THR1 0x62
-#define REG_THR2 0x64
-
-#define MODE_ACTIVE 0x61 /* active */
-#define MODE_POWERDOWN 0x60 /* powerdown */
-
-#define VALUE_WHO_AM_I 0x95 /* D09 WMI */
-#define VALUE_ODR_200 0x9C /* conversion rate 200Hz */
-#define VALUE_ODR_100 0x98 /* conversion rate 100Hz */
-#define VALUE_ODR_50 0x94 /* conversion rate 50Hz */
-#define VALUE_ODR_20 0x90 /* conversion rate 20Hz */
-#define VALUE_ODR_10 0x8C /* conversion rate 10Hz */
-#define VALUE_ODR_5 0x88 /* conversion rate 5Hz */
-#define VALUE_ODR_1 0x84 /* conversion rate 1Hz */
-#define VALUE_ODR_0_5 0x80 /* conversion rate 0.5Hz */
-#define VALUE_CNT_L2 0xE4 /* Disable IEN */
-/* Optional Digital Filter [Low Byte and High Byte Order] */
-#define ODF_NoFilter 0x00 /* No filter */
-#define ODF_Ave_4 0x03 /* smooth filter 1/4 Bandwidth */
-#define ODF_Ave_8 0x07 /* smooth filter 1/8 Bandwidth */
-#define ODF_Ave_16 0x0f /* smooth filter 1/16 Bandwidth */
-
-
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE 1
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE 2
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE 3
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE 4
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE 5
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE 6
-
-#define AVG_NUM 16
-#define SENSOR_DATA_SIZE 3
-#define DEFAULT_SENSITIVITY 1024
-
-#define IOCTL_MAGIC 0x09
-#define SENSOR_RESET _IO(IOCTL_MAGIC, 0)
-#define SENSOR_CALIBRATION _IOWR(IOCTL_MAGIC, 1, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OFFSET _IOR(IOCTL_MAGIC, 2, int[SENSOR_DATA_SIZE])
-#define SENSOR_SET_OFFSET _IOWR(IOCTL_MAGIC, 3, int[SENSOR_DATA_SIZE])
-#define SENSOR_READ_ACCEL_XYZ _IOR(IOCTL_MAGIC, 4, int[SENSOR_DATA_SIZE])
-#define SENSOR_SETYPR _IOW(IOCTL_MAGIC, 5, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OPEN_STATUS _IO(IOCTL_MAGIC, 6)
-#define SENSOR_GET_CLOSE_STATUS _IO(IOCTL_MAGIC, 7)
-#define SENSOR_GET_DELAY _IOR(IOCTL_MAGIC, 8, unsigned int*)
-#define SENSOR_MAXNR 8
-/* Default sensorlayout parameters */
-#define D09_DEFAULT_POSITION 6
-
-/* Transformation matrix for chip mounting position */
-static const int dmt_position_map[][3][3] = {
- { { 1, 0, 0}, { 0,-1, 0}, { 0, 0,-1}, }, /* top/upper-left */
- { { 0, 1, 0}, { 1, 0, 0}, { 0, 0,-1}, }, /* top/lower-left */
- { {-1, 0, 0}, { 0, 1, 0}, { 0, 0,-1}, }, /* top/lower-right */
- { { 0,-1, 0}, {-1, 0, 0}, { 0, 0,-1}, }, /* top/upper-right */
- { {-1, 0, 0}, { 0,-1, 0}, { 0, 0, 1}, }, /* bottom/upper-right*/
- { { 0,-1, 0}, {-1, 0, 0}, { 0, 0, 1}, }, /* bottom/upper-left */
- { { 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}, }, /* bottom/lower-right*/
- { { 0, 1,0}, { 1, 0, 0}, { 0, 0, 1}, }, /* bottom/lower-left */
-};
-
-typedef union {
- struct {
- int x;
- int y;
- int z;
- } u;
- int v[SENSOR_DATA_SIZE];
-} raw_data;
-
-struct dmt_data {
- struct platform_device *pdevice;
- struct device *class_dev;
- struct class *class;
- struct input_dev *input;
- struct i2c_client *client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif
- struct delayed_work delaywork;
- struct work_struct work;
- struct mutex data_mutex;
- struct mutex enable_mutex; /* for suspend */
- raw_data last; /* RawData */
- raw_data offset; /* Offset */
-#ifdef SW_FILTER
- int sum[SENSOR_DATA_SIZE]; /* SW_FILTER sum */
- int bufferave[3][32];
- s8 aveflag; /* FULL bufferave[][] */
- s8 pointer; /* last update data */
-#endif
- wait_queue_head_t open_wq;
- atomic_t active;
- atomic_t delay;
- atomic_t enable;
- int filter;
- int position; /* must int type ,for Kconfig setup */
- atomic_t addr;
-#ifdef DMT_DEBUG_DATA
- struct mutex suspend_mutex;
- int suspend;
-#endif
-};
-
-#define ACC_DATA_FLAG 0
-#define MAG_DATA_FLAG 1
-#define ORI_DATA_FLAG 2
-#define DMT_NUM_SENSORS 3
-
-/* ABS axes parameter range [um/s^2] (for input event) */
-#define GRAVITY_EARTH 9806550
-#define ABSMAX (GRAVITY_EARTH * 2)
-#define ABSMIN (-GRAVITY_EARTH * 2)
-
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/Makefile
deleted file mode 100755
index 3241f881..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_dmard10
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := dmt10.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.c b/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.c
deleted file mode 100755
index 9810ea3a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.c
+++ /dev/null
@@ -1,1702 +0,0 @@
-/*
- * @file drivers/misc/dmt10.c
- * @brief DMT g-sensor Linux device driver
- * @author Domintech Technology Co., Ltd (http://www.domintech.com.tw)
- * @version 1.06
- * @date 2013/08/14
- * @section LICENSE
- *
- * Copyright 2012 Domintech Technology Co., Ltd
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- */
-#include "dmt10.h"
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/kthread.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/wakelock.h>
-#include <asm/uaccess.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include <linux/clk.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/fs.h>
-#include <linux/poll.h>
-#include <linux/string.h>
-#include <linux/gpio.h>
-#include <linux/platform_device.h>
-
-#include "../sensor.h"
-
-//////////////////////////////////////////////////////////
-static struct wmt_gsensor_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 5,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .isdbg = 0,
- .sensor_samp = 10, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .offset={0,0,0},
-};
-
-static struct class* l_dev_class = NULL;
-static void update_var(void);
-
-////////////////////////////////////////////////////////////
-
-
-static unsigned int interval;
-static int D10_write_offset_to_file(struct i2c_client *client);
-void D10_read_offset_from_file(struct i2c_client *client);
-#define DMT_BROADCAST_APK_ENABLE
-char D10_OffsetFileName[] = "/data/misc/gsensor_offset.txt"; /* FILE offset.txt */
-char DmtXXFileName[] = "/data/misc/dmt_sensor.txt";
-static int create_devidfile(void);
-static struct dmt_data *s_dmt;
-static int device_init(void);
-static void device_exit(void);
-
-static int device_open(struct inode*, struct file*);
-static long device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
-static int device_close(struct inode*, struct file*);
-
-static int dmard10_suspend(struct platform_device *pdev, pm_message_t state);
-static int dmard10_resume(struct platform_device *pdev);
-
-/*static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg);
-static int device_i2c_resume(struct i2c_client *client);
-static int __devinit device_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id);
-static int __devexit device_i2c_remove(struct i2c_client *client);*/
-static int D10_i2c_read_xyz(struct i2c_client *client, int *xyz);
-static int device_i2c_rxdata(struct i2c_client *client, unsigned char *rxDat, int length);
-static int device_i2c_txdata(struct i2c_client *client, unsigned char *txData, int length);
-
-static int dmt_get_filter(struct i2c_client *client);
-static int dmt_set_filter(struct i2c_client *client,int);
-static int dmt_get_position(struct i2c_client *client);
-static int dmt_set_position(struct i2c_client *client,int);
-static int DMT_GetOpenStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) != 0));
- return 0;
-}
-
-static int DMT_GetCloseStatus(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- GSE_LOG("start active=%d\n",dmt->active.counter);
- wait_event_interruptible(dmt->open_wq, (atomic_read(&dmt->active) <= 0));
- return 0;
-}
-
-static void DMT_sysfs_update_active_status(struct dmt_data *dmt , int en){
- unsigned long dmt_delay;
- if(en){
- dmt_delay=msecs_to_jiffies(atomic_read(&dmt->delay));
- if(dmt_delay<1)
- dmt_delay=1;
-
- GSE_LOG("schedule_delayed_work start with delay time=%lu\n",dmt_delay);
- schedule_delayed_work(&dmt->delaywork,dmt_delay);
- }
- else
- cancel_delayed_work_sync(&dmt->delaywork);
-}
-
-static bool get_value_as_int(char const *buf, size_t size, int *value){
- long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtol(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtol(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtol(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > INT_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-static bool get_value_as_int64(char const *buf, size_t size, long long *value)
-{
- long long tmp;
- if (size == 0)
- return false;
- /* maybe text format value */
- if ((buf[0] == '0') && (size > 1)) {
- if ((buf[1] == 'x') || (buf[1] == 'X')) {
- /* hexadecimal format */
- if (0 != strict_strtoll(buf, 16, &tmp))
- return false;
- } else {
- /* octal format */
- if (0 != strict_strtoll(buf, 8, &tmp))
- return false;
- }
- } else {
- /* decimal format */
- if (0 != strict_strtoll(buf, 10, &tmp))
- return false;
- }
-
- if (tmp > LLONG_MAX)
- return false;
-
- *value = tmp;
- return true;
-}
-/* sysfs enable show & store */
-static ssize_t dmt_sysfs_enable_show(
- struct dmt_data *dmt, char *buf, int pos)
-{
- char str[2][16]={"ACC enable OFF","ACC enable ON"};
- int flag;
- flag=atomic_read(&dmt->enable);
- return sprintf(buf, "%s\n", str[flag]);
-}
-
-static ssize_t dmt_sysfs_enable_store(
- struct dmt_data *dmt, char const *buf, size_t count, int pos)
-{
- int en = 0;
- if (NULL == buf)
- return -EINVAL;
- //GSE_LOG("buf=%x %x\n", buf[0], buf[1]);
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int(buf, count, &en))
- return -EINVAL;
-
- en = en ? 1 : 0;
-
- atomic_set(&dmt->enable,en);
- DMT_sysfs_update_active_status(dmt , en);
- return count;
-}
-
-static ssize_t dmt_enable_show(struct device *dev, struct device_attribute *attr, char *buf){
- return dmt_sysfs_enable_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t dmt_enable_store( struct device *dev, struct device_attribute *attr, char const *buf, size_t count){
- return dmt_sysfs_enable_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-
-/* sysfs delay show & store*/
-static ssize_t dmt_sysfs_delay_show( struct dmt_data *dmt, char *buf, int pos){
- return sprintf(buf, "%d\n", atomic_read(&dmt->delay));
-}
-
-static ssize_t dmt_sysfs_delay_store( struct dmt_data *dmt, char const *buf, size_t count, int pos){
- long long val = 0;
-
- if (NULL == buf)
- return -EINVAL;
-
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int64(buf, count, &val))
- return -EINVAL;
-
- atomic_set(&dmt->delay, (unsigned int) val);
- GSE_LOG("Driver attribute set delay =%lld\n", val);
-
- return count;
-}
-
-static ssize_t dmt_delay_show( struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- return dmt_sysfs_delay_show( dev_get_drvdata(dev), buf, ACC_DATA_FLAG);
-}
-
-static ssize_t dmt_delay_store( struct device *dev,
- struct device_attribute *attr,
- char const *buf,
- size_t count)
-{
- return dmt_sysfs_delay_store( dev_get_drvdata(dev), buf, count, ACC_DATA_FLAG);
-}
-/* sysfs position show & store */
-static ssize_t dmt_position_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
-
- return sprintf(buf, "%d\n", dmt_get_position(dmt->client));
-}
-
-static ssize_t dmt_position_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long position;
- int ret;
-
- ret = strict_strtoul(buf, 10, &position);
- if (ret < 0)
- return count;
-
- dmt_set_position(dmt->client, position);
- return count;
-}
-/* sysfs offset show & store */
-static ssize_t dmt_offset_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- return sprintf(buf, "( %d %d %d )\n", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
-}
-
-static ssize_t dmt_offset_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- sscanf(buf, "%d %d %d", (int *)&dmt->offset.v[0], (int *)&dmt->offset.v[1], (int *)&dmt->offset.v[2]);
- D10_write_offset_to_file(dmt->client);
- update_var();
- return count;
-}
-/* sysfs filter show & store */
-static ssize_t dmt_filter_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
-
- return sprintf(buf, "%d\n", dmt_get_filter(dmt->client));
-}
-
-static ssize_t dmt_filter_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long filter;
- int ret;
-
- ret = strict_strtoul(buf, 10, &filter);
- if (ret < 0)
- return count;
-
- dmt_set_filter(dmt->client, filter);
- return count;
-}
-
-/* sysfs data show */
-static ssize_t dmt_acc_private_data_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- raw_data accel;
-
- mutex_lock(&dmt->data_mutex);
- accel = dmt->last;
- mutex_unlock(&dmt->data_mutex);
-
- return sprintf(buf, "( %d %d %d )\n", dmt->last.v[0], dmt->last.v[1], dmt->last.v[2]);
-}
-/* sysfs id show */
-static ssize_t dmt_id_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- char str[8]={GSENSOR_ID};
- return sprintf(buf, "%s\n", str);
-}
-/* sysfs debug_suspend show & store */
-#ifdef DMT_DEBUG_DATA
-static ssize_t dmt_debug_suspend_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- int suspend = dmt->suspend;
-
- mutex_lock(&dmt->suspend_mutex);
- suspend = sprintf(buf, "%d\n", dmt->suspend);
- mutex_unlock(&dmt->suspend_mutex);
- return suspend;
-}
-
-static ssize_t dmt_debug_suspend_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct input_dev *input = to_input_dev(dev);
- struct dmt_data *dmt = input_get_drvdata(input);
- unsigned long suspend;
- pm_message_t msg;
- int ret;
-
- ret = strict_strtoul(buf, 10, &suspend);
- if (ret < 0)
- return count;
-
- memset(&msg, 0, sizeof(pm_message_t));
-
- mutex_lock(&dmt->suspend_mutex);
-
- if (suspend) {
- dmard10_suspend(dmt->pdevice, msg);
- dmt->suspend = 1;
- } else {
- dmard10_resume(dmt->pdevice);
- dmt->suspend = 0;
- }
-
- mutex_unlock(&dmt->suspend_mutex);
-
- return count;
-}
-/* sysfs reg_read show & store */
-static ssize_t dmt_reg_read_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct dmt_data *dmt = dev_get_drvdata(dev);
- int err;
- unsigned char i2c[1];
-
- i2c[0] = (unsigned char)atomic_read(&dmt->addr);
- err = device_i2c_rxdata(dmt->client, i2c, 1);
- if (err < 0)
- return err;
-
- return sprintf(buf, "0x%02X\n", i2c[0]);
-}
-
-static ssize_t dmt_reg_read_store(struct device *dev,
- struct device_attribute *attr,
- char const *buf,
- size_t count)
-{
- struct dmt_data *dmt = dev_get_drvdata(dev);
- int addr = 0;
-
- if (NULL == buf)
- return -EINVAL;
-
- if (0 == count)
- return 0;
-
- if (false == get_value_as_int(buf, count, &addr))
- return -EINVAL;
-
- if (addr < 0 || 128 < addr)
- return -EINVAL;
-
- atomic_set(&dmt->addr, addr);
-
- return 1;
-}
-#endif /* DEBUG */
-/*********************************************************************
- *
- * SysFS attribute functions
- *
- * directory : /sys/class/accelemeter/dmardXX/
- * files :
- * - enable_acc [rw] [t] : enable flag for accelerometer
- * - delay_acc [rw] [t] : delay in nanosecond for accelerometer
- * - position [rw] [t] : chip mounting position
- * - offset [rw] [t] : offset
- * - data [r] [t] : raw data
- * - id [r] [t] : chip id
- *
- * debug :
- * - debug_suspend [w] [t] : suspend test
- * - reg_read [rw] [t] : Read register
- * - reg_write [rw] [t] : Weite register
- *
- * [rw]= read/write
- * [r] = read only
- * [w] = write only
- * [b] = binary format
- * [t] = text format
- */
-
-static struct device_attribute DMT_attributes[] = {
- __ATTR(enable_acc, 0660, dmt_enable_show, dmt_enable_store),
- __ATTR(delay_acc, 0660, dmt_delay_show, dmt_delay_store),
- __ATTR(position, 0660, dmt_position_show, dmt_position_store),
- __ATTR(offset, 0660, dmt_offset_show, dmt_offset_store),
- __ATTR(filter, 0660, dmt_filter_show, dmt_filter_store),
- __ATTR(data, 0660, dmt_acc_private_data_show, NULL),
- __ATTR(id, 0660, dmt_id_show, NULL),
-#ifdef DMT_DEBUG_DATA
- __ATTR(debug_suspend, 0660, dmt_debug_suspend_show,dmt_debug_suspend_store),
- __ATTR(reg_read, 0660, dmt_reg_read_show, dmt_reg_read_store),
- __ATTR(reg_write, 0660, NULL, NULL),
-#endif // DEBUG
- __ATTR_NULL,
-};
-
-static char const *const ACCELEMETER_CLASS_NAME = "accelemeter";
-static char const *const GSENSOR_DEVICE_NAME = SENSOR_I2C_NAME;
-static char const *const device_link_name = "i2c";
-static dev_t const dmt_device_dev_t = MKDEV(MISC_MAJOR, MISC_DYNAMIC_MINOR);
-
-// dmt sysfs functions
-static int create_device_attributes(struct device *dev, struct device_attribute *attrs){
- int i;
- int err = 0;
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i) {
- err = device_create_file(dev, &attrs[i]);
- if (0 != err)
- break;
- }
-
- if (0 != err) {
- for (; i >= 0 ; --i)
- device_remove_file(dev, &attrs[i]);
- }
- return err;
-}
-
-static void remove_device_attributes(
- struct device *dev,
- struct device_attribute *attrs)
-{
- int i;
-
- for (i = 0 ; NULL != attrs[i].attr.name ; ++i)
- device_remove_file(dev, &attrs[i]);
-}
-
-static int create_sysfs_interfaces(struct dmt_data *dmt)
-{
- int err;
-
- if (NULL == dmt)
- return -EINVAL;
-
- err = 0;
- dmt->class = class_create(THIS_MODULE, ACCELEMETER_CLASS_NAME);
- if (IS_ERR(dmt->class)) {
- err = PTR_ERR(dmt->class);
- goto exit_class_create_failed;
- }
-
- dmt->class_dev = device_create(
- dmt->class,
- NULL,
- dmt_device_dev_t,
- dmt,
- GSENSOR_DEVICE_NAME);
- if (IS_ERR(dmt->class_dev)) {
- err = PTR_ERR(dmt->class_dev);
- goto exit_class_device_create_failed;
- }
-
- err = sysfs_create_link(
- &dmt->class_dev->kobj,
- &dmt->client->dev.kobj,
- device_link_name);
- if (0 > err)
- goto exit_sysfs_create_link_failed;
-
- err = create_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- if (0 > err)
- goto exit_device_attributes_create_failed;
-#if 0
- err = create_device_binary_attributes(
- &dmt->class_dev->kobj,
- dmt_bin_attributes);
- if (0 > err)
- goto exit_device_binary_attributes_create_failed;
-#endif
-
- return err;
-
-#if 0
-exit_device_binary_attributes_create_failed:
- remove_device_attributes(dmt->class_dev, dmt_attributes);
-#endif
-exit_device_attributes_create_failed:
- sysfs_remove_link(&dmt->class_dev->kobj, device_link_name);
-exit_sysfs_create_link_failed:
- device_destroy(dmt->class, dmt_device_dev_t);
-exit_class_device_create_failed:
- dmt->class_dev = NULL;
- class_destroy(dmt->class);
-exit_class_create_failed:
- dmt->class = NULL;
- return err;
-}
-
-static void remove_sysfs_interfaces(struct dmt_data *dmt){
- if (NULL == dmt)
- return;
-
- if (NULL != dmt->class_dev) {
-
- remove_device_attributes(
- dmt->class_dev,
- DMT_attributes);
- sysfs_remove_link(
- &dmt->class_dev->kobj,
- device_link_name);
- dmt->class_dev = NULL;
- }
- if (NULL != dmt->class) {
- device_destroy(
- dmt->class,
- dmt_device_dev_t);
- class_destroy(dmt->class);
- dmt->class = NULL;
- }
-}
-
-int D10_input_init(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- int err = 0;
- dmt->input = input_allocate_device();
- if (!dmt->input){
- GSE_ERR("input device allocate ERROR !!\n");
- return -ENOMEM;
- }
- else
- GSE_LOG("input device allocate Success !!\n");
- /* Setup input device */
- //dmt->input->name = SENSOR_I2C_NAME;
- set_bit(EV_ABS, dmt->input->evbit);
- /* Accelerometer [-78.5, 78.5]m/s2 in Q16 */
- input_set_abs_params(dmt->input, ABS_X, ABSMIN, ABSMAX, 0, 0);
- input_set_abs_params(dmt->input, ABS_Y, ABSMIN, ABSMAX, 0, 0);
- input_set_abs_params(dmt->input, ABS_Z, ABSMIN, ABSMAX, 0, 0);
- /* Set InputDevice Name */
- dmt->input->name = INPUT_NAME_ACC;
- /* Register */
- err = input_register_device(dmt->input);
- if (err) {
- GSE_ERR("input_register_device ERROR !!\n");
- input_free_device(dmt->input);
- return err;
- }
- GSE_LOG("input_register_device SUCCESS %d !! \n",err);
-
- return err;
-}
-
-int D10_calibrate(struct i2c_client *client)
-{
- struct dmt_data *dmt = i2c_get_clientdata(client);
- raw_data avg;
- int i, j;
- long xyz_acc[SENSOR_DATA_SIZE];
- int xyz[SENSOR_DATA_SIZE];
- /* initialize the offset value */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->offset.v[i] = 0;
- /* initialize the accumulation buffer */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_acc[i] = 0;
-
- for(i = 0; i < AVG_NUM; i++) {
- D10_i2c_read_xyz(client, (int *)&xyz);
- for(j = 0; j < SENSOR_DATA_SIZE; ++j)
- xyz_acc[j] += xyz[j];
- }
- /* calculate averages */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- avg.v[i] = xyz_acc[i] / AVG_NUM;
-
- if(avg.v[2] < 0){
- dmt->offset.u.x = avg.v[0] ;
- dmt->offset.u.y = avg.v[1] ;
- dmt->offset.u.z = avg.v[2] + DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE;
- }
- else{
- dmt->offset.u.x = avg.v[0] ;
- dmt->offset.u.y = avg.v[1] ;
- dmt->offset.u.z = avg.v[2] - DEFAULT_SENSITIVITY;
- return CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE;
- }
- return 0;
-}
-
-int dmard10_init(struct i2c_client *client){
- unsigned char buffer[7], buffer2[2];
- /* 1. check D10 , VALUE_STADR = 0x55 , VALUE_STAINT = 0xAA */
- buffer[0] = REG_STADR;
- buffer2[0] = REG_STAINT;
-
- device_i2c_rxdata(client, buffer, 2);
- device_i2c_rxdata(client, buffer2, 2);
-
- if( buffer[0] == VALUE_STADR || buffer2[0] == VALUE_STAINT){
- GSE_LOG(" REG_STADR_VALUE = %d , REG_STAINT_VALUE = %d\n", buffer[0], buffer2[0]);
- }
- else{
- GSE_LOG(" REG_STADR_VALUE = %d , REG_STAINT_VALUE = %d \n", buffer[0], buffer2[0]);
- return -1;
- }
- /* 2. Powerdown reset */
- buffer[0] = REG_PD;
- buffer[1] = VALUE_PD_RST;
- device_i2c_txdata(client, buffer, 2);
- /* 3. ACTR => Standby mode => Download OTP to parameter reg => Standby mode => Reset data path => Standby mode */
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Standby;
- buffer[2] = MODE_ReadOTP;
- buffer[3] = MODE_Standby;
- buffer[4] = MODE_ResetDataPath;
- buffer[5] = MODE_Standby;
- device_i2c_txdata(client, buffer, 6);
- /* 4. OSCA_EN = 1 ,TSTO = b'000(INT1 = normal, TEST0 = normal) */
- buffer[0] = REG_MISC2;
- buffer[1] = VALUE_MISC2_OSCA_EN;
- device_i2c_txdata(client, buffer, 2);
- /* 5. AFEN = 1(AFE will powerdown after ADC) */
- buffer[0] = REG_AFEM;
- buffer[1] = VALUE_AFEM_AFEN_Normal;
- buffer[2] = VALUE_CKSEL_ODR_100_204;
- buffer[3] = VALUE_INTC;
- buffer[4] = VALUE_TAPNS_Ave_4;
- buffer[5] = 0x00; // DLYC, no delay timing
- buffer[6] = 0x07; // INTD=1 (push-pull), INTA=1 (active high), AUTOT=1 (enable T)
- device_i2c_txdata(client, buffer, 7);
- /* 6. write TCGYZ & TCGX */
- buffer[0] = REG_WDAL; // REG:0x01
- buffer[1] = 0x00; // set TC of Y,Z gain value
- buffer[2] = 0x00; // set TC of X gain value
- buffer[3] = 0x03; // Temperature coefficient of X,Y,Z gain
- device_i2c_txdata(client, buffer, 4);
-
- buffer[0] = REG_ACTR; // REG:0x00
- buffer[1] = MODE_Standby; // Standby
- buffer[2] = MODE_WriteOTPBuf; // WriteOTPBuf
- buffer[3] = MODE_Standby; // Standby
- device_i2c_txdata(client, buffer, 4);
- //buffer[0] = REG_TCGYZ;
- //device_i2c_rxdata(client, buffer, 2);
- //GSE_LOG(" TCGYZ = %d, TCGX = %d \n", buffer[0], buffer[1]);
-
- /* 7. Activation mode */
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Active;
- device_i2c_txdata(client, buffer, 2);
- return 0;
-}
-
-void D10_set_offset(struct i2c_client *client, int val[3]){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- int i;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->offset.v[i] = val[i];
-}
-
-struct file_operations sensor_fops = {
- .owner = THIS_MODULE,
- .unlocked_ioctl = device_ioctl,
- .open = device_open,
- .release = device_close,
-};
-
-static struct miscdevice dmt_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = SENSOR_I2C_NAME,
- .fops = &sensor_fops,
-};
-
-static int sensor_close_dev(struct i2c_client *client){
- char buffer[3];
- GSE_FUN();
- buffer[0] = REG_AFEM;
- buffer[1] = 0x0f;
- device_i2c_txdata(client,buffer, 2);
- buffer[0] = REG_ACTR;
- buffer[1] = MODE_Standby;
- buffer[2] = MODE_Off;
- device_i2c_txdata(client,buffer, 3);
- return 0;
-}
-
-static void dmard10_shutdown(struct platform_device *pdev)
-{
- flush_delayed_work_sync(&s_dmt->delaywork);
- DMT_sysfs_update_active_status(s_dmt , 0);
-}
-
-
-//static int device_i2c_suspend(struct i2c_client *client, pm_message_t mesg){
-static int dmard10_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct dmt_data *dmt = i2c_get_clientdata(s_dmt->client);
- flush_delayed_work_sync(&dmt->delaywork);
- DMT_sysfs_update_active_status(dmt , 0);
- return sensor_close_dev(dmt->client);
-}
-
-//static int device_i2c_resume(struct i2c_client *client){
-static int dmard10_resume(struct platform_device *pdev)
-{
- struct dmt_data *dmt = i2c_get_clientdata(s_dmt->client);
- int en = 1;
- GSE_FUN();
- printk("dmt->enable=%d",dmt->enable);
- dmard10_init(dmt->client);
- atomic_set(&dmt->enable,en);
- DMT_sysfs_update_active_status(dmt , en);
- return 0;
-}
-/*
-static int __devexit device_i2c_remove(struct i2c_client *client){
- return 0;
-}
-
-static const struct i2c_device_id device_i2c_ids[] = {
- { SENSOR_I2C_NAME, 0},
- { }
-};
-
-static struct i2c_driver device_i2c_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = SENSOR_I2C_NAME,
- },
- .class = I2C_CLASS_HWMON,
- .id_table = device_i2c_ids,
- .probe = device_i2c_probe,
- .remove = __devexit_p(device_i2c_remove),
-#ifdef CONFIG_HAS_EARLYSUSPEND
- .suspend = device_i2c_suspend,
- .resume = device_i2c_resume,
-#endif
-};
-*/
-static int device_open(struct inode *inode, struct file *filp){
- return 0;
-}
-
-static long device_ioctl(struct file *file, unsigned int cmd, unsigned long arg){
- //struct i2c_client *client = (struct i2c_client *)file->private_data;
- //struct dmt_data *dmt = (struct dmt_data*)i2c_get_clientdata(client);
-
- int err = 0, ret = 0, i;
- int intBuf[SENSOR_DATA_SIZE], xyz[SENSOR_DATA_SIZE];
- /* check type */
- if (_IOC_TYPE(cmd) != IOCTL_MAGIC) return -ENOTTY;
-
- /* check user space pointer is valid */
- if (_IOC_DIR(cmd) & _IOC_READ)
- err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
- else if (_IOC_DIR(cmd) & _IOC_WRITE)
- err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
- if (err) return -EFAULT;
-
- switch(cmd) {
- case SENSOR_RESET:
- ret = dmard10_init(s_dmt->client);
- return ret;
-
- case SENSOR_CALIBRATION:
- /* get orientation info */
- //if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) return -EFAULT;
- D10_calibrate(s_dmt->client);
- GSE_LOG("Sensor_calibration:%d %d %d\n", s_dmt->offset.u.x, s_dmt->offset.u.y, s_dmt->offset.u.z);
- /* save file */
- D10_write_offset_to_file(s_dmt->client);
- update_var();
-
- /* return the offset */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = s_dmt->offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_GET_OFFSET:
- /* get data from file */
- D10_read_offset_from_file(s_dmt->client);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = s_dmt->offset.v[i];
-
- ret = copy_to_user((int *)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SET_OFFSET:
- ret = copy_from_user(&intBuf, (int *)arg, sizeof(intBuf));
- D10_set_offset(s_dmt->client , intBuf);
- /* write into file */
- D10_write_offset_to_file(s_dmt->client);
- update_var();
- return ret;
-
- case SENSOR_READ_ACCEL_XYZ:
- D10_i2c_read_xyz(s_dmt->client, (int *)&xyz);
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- intBuf[i] = xyz[i] - s_dmt->offset.v[i];
-
- ret = copy_to_user((int*)arg, &intBuf, sizeof(intBuf));
- return ret;
-
- case SENSOR_SETYPR:
- if(copy_from_user(&intBuf, (int*)arg, sizeof(intBuf))) {
- GSE_LOG("%s: -EFAULT\n",__func__);
- return -EFAULT;
- }
- input_report_abs(s_dmt->input, ABS_X, intBuf[0]);
- input_report_abs(s_dmt->input, ABS_Y, intBuf[1]);
- input_report_abs(s_dmt->input, ABS_Z, intBuf[2]);
- input_sync(s_dmt->input);
- GSE_LOG("SENSOR_SETYPR OK! x=%d,y=%d,z=%d\n",intBuf[0],intBuf[1],intBuf[2]);
- return ret;
-
- case SENSOR_GET_OPEN_STATUS:
- GSE_LOG("Going into DMT_GetOpenStatus()\n");
- ret = DMT_GetOpenStatus(s_dmt->client);
- return ret;
-
- case SENSOR_GET_CLOSE_STATUS:
- GSE_LOG("Going into DMT_GetCloseStatus()\n");
- ret = DMT_GetCloseStatus(s_dmt->client);
- return ret;
-
- case SENSOR_GET_DELAY:
- ret = copy_to_user((int*)arg, &interval, sizeof(interval));
- return ret;
-
- default: /* redundant, as cmd was checked against MAXNR */
- return -ENOTTY;
- }
-
- return 0;
-}
-
-static int device_close(struct inode *inode, struct file *filp){
- return 0;
-}
-
-/***** I2C I/O function ***********************************************/
-static int device_i2c_rxdata( struct i2c_client *client, unsigned char *rxData, int length){
- struct i2c_msg msgs[] = {
- {.addr = client->addr, .flags = 0, .len = 1, .buf = rxData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = length, .buf = rxData,},
- };
- //unsigned char addr = rxData[0];
- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "RxData: len=%02x, addr=%02x, data=%02x\n",
- //length, addr, rxData[0]);
-
- return 0;
-}
-
-static int device_i2c_txdata( struct i2c_client *client, unsigned char *txData, int length){
- struct i2c_msg msg[] = {
- {.addr = client->addr, .flags = 0, .len = length, .buf = txData,},
- };
-
- if (i2c_transfer(client->adapter, msg, 1) < 0) {
- dev_err(&client->dev, "%s: transfer failed.", __func__);
- return -EIO;
- }
- //DMT_DATA(&client->dev, "TxData: len=%02x, addr=%02x data=%02x\n",
- //length, txData[0], txData[1]);
- return 0;
-}
-
-static int D10_i2c_read_xyz(struct i2c_client *client, int *xyz_p){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- u8 buffer[11];
- s16 xyzTmp[SENSOR_DATA_SIZE];
- int pos = dmt->position;
- int i, j , k;
- /* get xyz high/low bytes, 0x12 */
- buffer[0] = REG_STADR;
- /* Read acceleration data */
- if (device_i2c_rxdata(client, buffer, 10)!= 0)
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- xyz_p[i] = 0;
- else
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- xyz_p[i] = 0;
- /* merge xyz high/low bytes & 1g = 128 becomes 1g = 1024 */
- mutex_lock(&dmt->data_mutex);
- xyzTmp[i] = ((int16_t)((buffer[2*(i+1)+1] << 8)) | buffer[2*(i+1)] ) << 3;
- mutex_unlock(&dmt->data_mutex);
- }
-#ifdef SW_FILTER
- if( dmt->aveflag >= dmt->filter){
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->sum[i] = dmt->sum[i] - dmt->bufferave[i][dmt->pointer] + xyzTmp[i];
- }
- /* transfer to the default layout */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(j = 0; j < SENSOR_DATA_SIZE; j++)
- xyz_p[i] += (int)(dmt->sum[j]/dmt->filter * dmt_position_map[pos][i][j]);
- }
- }
- else{
- /* init dmt->sum */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->sum[i] = xyzTmp[i];
-#endif
- /* transfer to the default layout */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(j = 0; j < SENSOR_DATA_SIZE; j++){
- xyz_p[i] += (int)(xyzTmp[j] * dmt_position_map[pos][i][j]);
- //GSE_LOG("%04d, %04d,%d \n", xyz_p[i], xyzTmp[j], dmt_position_map[pos][i][j]);
- }
- }
- //GSE_LOG("xyz_p: %04d , %04d , %04d\n", xyz_p[0], xyz_p[1], xyz_p[2]);
-#ifdef SW_FILTER
- dmt->aveflag++;
- }
- /* init dmt->sum */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->sum[i] = 0;
- }
- dmt->pointer++;
- dmt->pointer %= dmt->filter;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- dmt->bufferave[i][dmt->pointer] = xyzTmp[i];
- }
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- for(k = 0; k < dmt->filter; ++k){
- dmt->sum[i] += dmt->bufferave[i][k];
- }
- }
-#endif
- return 0;
-}
-
-static void DMT_work_func(struct work_struct *delaywork){
- struct dmt_data *dmt = container_of(delaywork, struct dmt_data, delaywork.work);
- int i;
- //static bool firsttime=true;
- raw_data xyz;
- unsigned long dmt_delay = msecs_to_jiffies(atomic_read(&dmt->delay));
-
-
- D10_i2c_read_xyz(dmt->client, (int *)&xyz.v);
- /* dmt->last = RawData - Offset */
- for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- dmt->last.v[i] = xyz.v[i] - dmt->offset.v[i];
- //GSE_LOG("@DMTRaw @ X/Y/Z axis: %04d , %04d , %04d\n", xyz.v[0], xyz.v[1], xyz.v[2]);
- //GSE_LOG("@Offset @ X/Y/Z axis: %04d , %04d , %04d\n", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
- //GSE_LOG("@Raw-Offset@ X/Y/Z axis: %04d , %04d , %04d ,dmt_delay=%d\n", dmt->last.u.x, dmt->last.u.y, dmt->last.u.z, atomic_read(&dmt->delay));
-
-
- input_report_abs(dmt->input, ABS_X, dmt->last.v[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1]);//dmt->last.v[0]);
- input_report_abs(dmt->input, ABS_Y, dmt->last.v[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1]);//dmt->last.v[1]);
- input_report_abs(dmt->input, ABS_Z, dmt->last.v[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1]);//dmt->last.v[2]);
- input_sync(dmt->input);
-
- if(dmt_delay < 1)
- dmt_delay = 1;
- schedule_delayed_work(&dmt->delaywork, dmt_delay);
-}
-
-static int mma10_open(struct inode *node, struct file *fle)
-{
- GSE_LOG("open...\n");
- return 0;
-}
-
-static int mma10_close(struct inode *node, struct file *fle)
-{
- GSE_LOG("close...\n");
- return 0;
-}
-
-static long mma10_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- int err = 0;
- //unsigned char data[6];
- void __user *argp = (void __user *)arg;
- short delay, enable;
- unsigned int uval = 0;
-
-
- /* cmd mapping */
- switch(cmd)
- {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- return -EFAULT;
- }
- klog("Get delay=%d\n", delay);
-
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- l_sensorconfig.sensor_samp = 1000/delay;
- atomic_set(&s_dmt->delay, 1000/delay);
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- klog("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- //KMSGINF("driver: disable/enable(%d) gsensor.\n", enable);
-
- l_sensorconfig.sensor_enable = enable;
- atomic_set(&s_dmt->enable,enable);
- DMT_sysfs_update_active_status(s_dmt , enable);
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = DMARD10_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- GSE_LOG("dmard10_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
- uval = (10<<8) | 1;
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- default:
- err = -1;
- break;
- }
-
- return err;
-}
-
-static const struct file_operations d10_fops = {
- .owner = THIS_MODULE,
- .open = mma10_open,
- .release = mma10_close,
- .unlocked_ioctl = mma10_ioctl,
-};
-
-
-static struct miscdevice d10_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = GSENSOR_DEV_NODE,
- .fops = &d10_fops,
-};
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- //int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- //unsigned int amsr = 0;
- int test = 0;
-
- //mutex_lock(&sense_data_mutex);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- // should do sth
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- klog("Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- klog("The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- atomic_set(&s_dmt->enable,1);
- DMT_sysfs_update_active_status(s_dmt , 1);
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- atomic_set(&s_dmt->enable,0);
- DMT_sysfs_update_active_status(s_dmt , 0);
- }
- //mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-//static int __devinit device_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id){
-static int __devinit dmard10_probe(struct platform_device *pdev)
-{
- int i, k, ret = 0;
- //struct dmt_data *s_dmt = i2c_get_clientdata(client);
- //struct dmt_data *s_dmt;
- GSE_FUN();
-/*
- if(!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)){
- GSE_ERR("check_functionality failed.\n");
- ret = -ENODEV;
- goto exit0;
- }
-
- // Allocate memory for driver data
- s_dmt = kzalloc(sizeof(struct dmt_data), GFP_KERNEL);
- memset(s_dmt, 0, sizeof(struct dmt_data));
- if (s_dmt == NULL) {
- GSE_ERR("alloc data failed.\n");
- ret = -ENOMEM;
- goto exit1;
- }
-*/
- /*for(i = 0; i < SENSOR_DATA_SIZE; ++i)
- s_dmt->offset.v[i] = 0;*/
-#ifdef SW_FILTER
- s_dmt->pointer = 0;
- s_dmt->aveflag = 0;
- for(i = 0; i < SENSOR_DATA_SIZE; ++i){
- s_dmt->sum[i] = 0;
- for(k = 0; k < SENSOR_DATA_AVG; ++k){
- s_dmt->bufferave[i][k] = 0;
- }
- }
- s_dmt->filter = SENSOR_DATA_AVG;
- GSE_LOG("D10_DEFAULT_FILTER: %d\n", s_dmt->filter);
-#endif
- /* I2C initialization */
- //s_dmt->client = client;
-
- /* set client data */
- i2c_set_clientdata(s_dmt->client, s_dmt);
- /*ret = dmard10_init(client);
- if (ret < 0)
- goto exit2;
- */
- /* input */
- ret = D10_input_init(s_dmt->client);
- if (ret){
- GSE_ERR("D10_input_init fail, error code= %d\n",ret);
- goto exit3;
- }
-
- /* initialize variables in dmt_data */
- mutex_init(&s_dmt->data_mutex);
- mutex_init(&s_dmt->enable_mutex);
-#ifdef DMT_DEBUG_DATA
- mutex_init(&s_dmt->suspend_mutex);
-#endif
- init_waitqueue_head(&s_dmt->open_wq);
- atomic_set(&s_dmt->active, 0);
- atomic_set(&s_dmt->enable, 0);
- atomic_set(&s_dmt->delay, 0);
- atomic_set(&s_dmt->addr, 0);
- /* DMT Acceleration Sensor Mounting Position on Board */
- s_dmt->position = D10_DEFAULT_POSITION;
- GSE_LOG("D10_DEFAULT_POSITION: %d\n", s_dmt->position);
- //s_dmt->position = (CONFIG_INPUT_DMT_ACCELEROMETER_POSITION);
- //GSE_LOG("CONFIG_INPUT_DMT_ACCELEROMETER_POSITION: %d\n", s_dmt->position);
- /* Misc device */
- if (misc_register(&dmt_device) < 0){
- GSE_ERR("dmt_dev register failed");
- goto exit4;
- }
-
- /* Setup sysfs */
- if (create_sysfs_interfaces(s_dmt) < 0){
- GSE_ERR("create sysfs failed.");
- goto exit5;
- }
-#ifdef CONFIG_HAS_EARLYSUSPEND
- s_dmt->early_suspend.suspend = device_i2c_suspend;
- s_dmt->early_suspend.resume = device_i2c_resume;
- register_early_suspend(&s_dmt->early_suspend);
-#endif
- /* Setup driver interface */
- INIT_DELAYED_WORK(&s_dmt->delaywork, DMT_work_func);
- GSE_LOG("DMT: INIT_DELAYED_WORK\n");
-
- //register ctrl dev
- ret = misc_register(&d10_device);
- if (ret !=0) {
- errlog("Can't register d10_device!\n");
- return -1;
- }
- // register rd/wr proc
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
-
- //create offset file after factory reset
- D10_read_offset_from_file(s_dmt->client);
-
- return 0;
-
-exit5:
- misc_deregister(&dmt_device);
-exit4:
- input_unregister_device(s_dmt->input);
-exit3:
- kfree(s_dmt);
-/*exit2:
-exit1:
-exit0:*/
- return ret;
-}
-/*
-static struct i2c_board_info dmard10_board_info={
- .type = SENSOR_I2C_NAME,
- .addr = SENSOR_I2C_ADDR,
-};
-*/
-//static struct i2c_client *client;
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.dm10sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1; //open it for no env just,not insmod such module 2014-6-30
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2])
- );
- if (n != 12) {
- errlog("gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static void dmard10_platform_release(struct device *device)
-{
- GSE_LOG("...\n");
- return;
-}
-
-static int __devexit dmard10_remove(struct platform_device *pdev)
-{
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- //misc_deregister(&d10_device);
- return 0;
-}
-
-
-static struct platform_device dmard10_device = {
- .name = SENSOR_I2C_NAME,
- .id = 0,
- .dev = {
- .release = dmard10_platform_release,
- },
-};
-
-static struct platform_driver dmard10_driver = {
- .probe = dmard10_probe,
- .remove = dmard10_remove,
- .shutdown = dmard10_shutdown,
- .suspend = dmard10_suspend,
- .resume = dmard10_resume,
- .driver = {
- .name = SENSOR_I2C_NAME,
- },
-};
-
-
-static int __init device_init(void){
- //struct device *device;
- struct i2c_client *this_client;
- int ret = 0;
-
- // parse g-sensor u-boot arg
- ret = get_axisset();
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- GSE_LOG("D10 gsensor driver: initialize.\n");
-
- if (!(this_client = sensor_i2c_register_device(0, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_ERR"Can't register gsensor i2c device!\n");
- return -1;
- }
-
- if (dmard10_init(this_client))
- {
- GSE_ERR("Failed to init dmard10!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
- /* Allocate memory for driver data */
- s_dmt = kzalloc(sizeof(struct dmt_data), GFP_KERNEL);
- //memset(s_dmt, 0, sizeof(struct dmt_data));
- if (s_dmt == NULL) {
- GSE_ERR("alloc data failed.\n");
- return -ENOMEM;
- }
-
- s_dmt->client = this_client;
- s_dmt->pdevice = &dmard10_device;
- s_dmt->offset.u.x = l_sensorconfig.offset[0];
- s_dmt->offset.u.y = l_sensorconfig.offset[1];
- s_dmt->offset.u.z = l_sensorconfig.offset[2];
-
-
- // create the platform device
- l_dev_class = class_create(THIS_MODULE, SENSOR_I2C_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&dmard10_device)))
- {
- GSE_ERR("Can't register dmard10 platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&dmard10_driver)) != 0)
- {
- GSE_ERR("Can't register dmard10 platform driver!!!\n");
- return ret;
- }
-
- return 0;
-}
-
-static void __exit device_exit(void){
- //i2c_unregister_device(client);
- //i2c_del_driver(&device_i2c_driver);
- GSE_LOG("D10 gsensor driver: release.\n");
-
- flush_delayed_work_sync(&s_dmt->delaywork);
- cancel_delayed_work_sync(&s_dmt->delaywork);
-
- input_unregister_device(s_dmt->input);
- input_free_device(s_dmt->input);
- misc_deregister(&dmt_device);
- misc_deregister(&d10_device);
- platform_driver_unregister(&dmard10_driver);
- platform_device_unregister(&dmard10_device);
- sensor_i2c_unregister_device(s_dmt->client);
- class_destroy(l_dev_class);
-
- remove_sysfs_interfaces(s_dmt);
- kfree(s_dmt);
-}
-
-static int dmt_get_filter(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- return dmt->filter;
-}
-
-static int dmt_set_filter(struct i2c_client *client, int filter){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- if (!((filter >= 1) && (filter <= 32)))
- return -1;
- dmt->filter = filter;
- return 0;
-}
-
-static int dmt_get_position(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- return dmt->position;
-}
-
-static int dmt_set_position(struct i2c_client *client, int position){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- if (!((position >= 0) && (position <= 7)))
- return -1;
- dmt->position = position;
- return 0;
-}
-
-extern int wmt_setsyspara(char *varname, char *varval);
-static void update_var(void)
-{
- char varbuf[64];
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- sprintf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- s_dmt->offset.u.x,
- s_dmt->offset.u.y,
- s_dmt->offset.u.z
- );
-
- wmt_setsyspara("wmt.io.dm10sensor",varbuf);
-}
-
-static int D10_write_offset_to_file(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- char r_buf[18] = {0};
- char w_buf[18] = {0};
- //unsigned int orgfs;
- struct file *fp;
- mm_segment_t fs;
- ssize_t ret;
- //int8_t i;
-
- sprintf(w_buf,"%5d %5d %5d", dmt->offset.u.x, dmt->offset.u.y, dmt->offset.u.z);
- /* Set segment descriptor associated to kernel space */
- fp = filp_open(D10_OffsetFileName, O_RDWR | O_CREAT, 0777);
- if(IS_ERR(fp)){
- GSE_ERR("filp_open %s error!!.\n",D10_OffsetFileName);
- return -1;
- }
- else{
- fs = get_fs();
- //set_fs(KERNEL_DS);
- set_fs(get_ds());
- GSE_LOG("filp_open %s SUCCESS!!.\n",D10_OffsetFileName);
- //fp->f_op->write(fp,data,18, &fp->f_pos);
- //filp_close(fp,NULL);
- ret = fp->f_op->write(fp,w_buf,18,&fp->f_pos);
- if(ret != 18)
- {
- printk(KERN_ERR "%s: write error!\n", __func__);
- filp_close(fp,NULL);
- return -EIO;
- }
- //fp->f_pos=0x00;
- ret = fp->f_op->read(fp,r_buf, 18,&fp->f_pos);
- if(ret < 0)
- {
- printk(KERN_ERR "%s: read error!\n", __func__);
- filp_close(fp,NULL);
- return -EIO;
- }
- set_fs(fs);
-
- //
- //printk(KERN_INFO "%s: read ret=%d!", __func__, ret);
- /* for(i=0; i<18 ;i++)
- {
- if(r_buf[i] != w_buf[i])
- {
- printk(KERN_ERR "%s: read back error, r_buf[%x](0x%x) != w_buf[%x](0x%x)\n",
- __func__, i, r_buf[i], i, w_buf[i]);
- filp_close(fp,NULL);
- return -EIO;
- }
- }
- */
-
- }
- filp_close(fp,NULL);
- return 0;
-}
-
-void D10_read_offset_from_file(struct i2c_client *client){
- struct dmt_data *dmt = i2c_get_clientdata(client);
- unsigned int orgfs;
- char data[18];
- struct file *fp;
- int ux,uy,uz;
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
-
- fp = filp_open(D10_OffsetFileName, O_RDWR , 0);
- GSE_FUN();
- if(IS_ERR(fp)){
- GSE_ERR("Sorry,file open ERROR !\n");
- if(l_sensorconfig.op){ //first time
- l_sensorconfig.op=0;
-#if AUTO_CALIBRATION
- /* get acceleration average reading */
- D10_calibrate(client);
- update_var();
- D10_write_offset_to_file(client);
-#endif
-#ifdef DMT_BROADCAST_APK_ENABLE
- create_devidfile();
- return;
-#endif
- }
- D10_write_offset_to_file(client);
- }
- else{
- GSE_LOG("filp_open %s SUCCESS!!.\n",D10_OffsetFileName);
- fp->f_op->read(fp,data,18, &fp->f_pos);
- GSE_LOG("filp_read result %s\n",data);
- sscanf(data,"%d %d %d",&ux,&uy,&uz);
- dmt->offset.u.x=ux;
- dmt->offset.u.y=uy;
- dmt->offset.u.z=uz;
- }
- set_fs(orgfs);
-}
-static int create_devidfile(void)
-{
- char data[18];
- unsigned int orgfs;
- struct file *fp;
-
- sprintf(data,"%5d %5d %5d",0,0,0);
- orgfs = get_fs();
- /* Set segment descriptor associated to kernel space */
- set_fs(KERNEL_DS);
- GSE_FUN();
- fp = filp_open(DmtXXFileName, O_RDWR | O_CREAT, 0777);
- if(IS_ERR(fp)){
- GSE_ERR("Sorry,file open ERROR !\n");
- return -1;
- }
- fp->f_op->write(fp,data,18, &fp->f_pos);
- set_fs(orgfs);
- filp_close(fp,NULL);
- return 0;
-}
-//*********************************************************************************************************
-MODULE_AUTHOR("DMT_RD");
-MODULE_DESCRIPTION("DMT Gsensor Driver");
-MODULE_LICENSE("GPL");
-
-module_init(device_init);
-module_exit(device_exit);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.h b/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.h
deleted file mode 100755
index f77b07e3..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/dmard10_gsensor/dmt10.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/* @version 1.03
- * Copyright 2011 Domintech Technology Co., Ltd
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- */
-
-#ifndef DMT10_H
-#define DMT10_H
-#include <linux/types.h>
-#include <linux/ioctl.h>
-#include <linux/cdev.h>
-#include <linux/mutex.h>
-#include <linux/syscalls.h>
-#include <linux/wait.h>
-#include <linux/workqueue.h>
-#include <linux/delay.h>
-//#include <linux/earlysuspend.h>
-#define AUTO_CALIBRATION 0
-#define SW_FILTER /* Enable or Disable Software filter */
-#define SENSOR_DATA_AVG 8 /* AVG sensor data */
-
-//#define DMT_DEBUG_DATA
-#define GSE_TAG "[DMT_Gsensor]"
-#ifdef DMT_DEBUG_DATA
-#define GSE_ERR(fmt, args...) printk(KERN_ERR GSE_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args)
-#define GSE_LOG(fmt, args...) printk(KERN_INFO GSE_TAG fmt, ##args)
-#define GSE_FUN(f) printk(KERN_INFO GSE_TAG" %s: %s: %i\n", __FILE__, __func__, __LINE__)
-#define DMT_DATA(dev, ...) dev_dbg((dev), ##__VA_ARGS__)
-#else
-#define GSE_ERR(fmt, args...)
-#define GSE_LOG(fmt, args...)
-#define GSE_FUN(f)
-#define DMT_DATA(dev, format, ...)
-#endif
-
-#define GSENSOR_ID "DMARD10"
-#define INPUT_NAME_ACC "g-sensor"//"DMT_accel"//"g-sensor"// /* Input Device Name */
-#define SENSOR_I2C_NAME "dmard10"//"dmt"// /* Device name for DMARD10 misc. device */
-#define SENSOR_I2C_ADDR 0x18
-#define REG_ACTR 0x00
-#define REG_WDAL 0x01
-#define REG_TAPNS 0x0f
-#define REG_MISC2 0x1f
-#define REG_AFEM 0x0c
-#define REG_CKSEL 0x0d
-#define REG_INTC 0x0e
-#define REG_STADR 0x12
-#define REG_STAINT 0x1C
-#define REG_PD 0x21
-#define REG_TCGYZ 0x26
-#define REG_X_OUT 0x41
-
-#define MODE_Off 0x00
-#define MODE_ResetAtOff 0x01
-#define MODE_Standby 0x02
-#define MODE_ResetAtStandby 0x03
-#define MODE_Active 0x06
-#define MODE_Trigger 0x0a
-#define MODE_ReadOTP 0x12
-#define MODE_WriteOTP 0x22
-#define MODE_WriteOTPBuf 0x42
-#define MODE_ResetDataPath 0x82
-
-#define VALUE_STADR 0x55
-#define VALUE_STAINT 0xAA
-#define VALUE_AFEM_AFEN_Normal 0x8f// AFEN set 1 , ATM[2:0]=b'000(normal),EN_Z/Y/X/T=1
-#define VALUE_AFEM_Normal 0x0f// AFEN set 0 , ATM[2:0]=b'000(normal),EN_Z/Y/X/T=1
-#define VALUE_INTC 0x00// INTC[6:5]=b'00
-#define VALUE_INTC_Interrupt_En 0x20// INTC[6:5]=b'01 (Data ready interrupt enable, active high at INT0)
-#define VALUE_CKSEL_ODR_0_204 0x04// ODR[3:0]=b'0000 (0.78125Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_1_204 0x14// ODR[3:0]=b'0001 (1.5625Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_3_204 0x24// ODR[3:0]=b'0010 (3.125Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_6_204 0x34// ODR[3:0]=b'0011 (6.25Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_12_204 0x44// ODR[3:0]=b'0100 (12.5Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_25_204 0x54// ODR[3:0]=b'0101 (25Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_50_204 0x64// ODR[3:0]=b'0110 (50Hz), CCK[3:0]=b'0100 (204.8kHZ)
-#define VALUE_CKSEL_ODR_100_204 0x74// ODR[3:0]=b'0111 (100Hz), CCK[3:0]=b'0100 (204.8kHZ)
-
-#define VALUE_TAPNS_NoFilter 0x00 // TAP1/TAP2 NO FILTER
-#define VALUE_TAPNS_Ave_2 0x11 // TAP1/TAP2 Average 2
-#define VALUE_TAPNS_Ave_4 0x22 // TAP1/TAP2 Average 4
-#define VALUE_TAPNS_Ave_8 0x33 // TAP1/TAP2 Average 8
-#define VALUE_TAPNS_Ave_16 0x44 // TAP1/TAP2 Average 16
-#define VALUE_TAPNS_Ave_32 0x55 // TAP1/TAP2 Average 32
-#define VALUE_MISC2_OSCA_EN 0x08
-#define VALUE_PD_RST 0x52
-
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_NEGATIVE 1
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Z_POSITIVE 2
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_NEGATIVE 3
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_Y_POSITIVE 4
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_NEGATIVE 5
-#define CONFIG_GSEN_CALIBRATION_GRAVITY_ON_X_POSITIVE 6
-
-#define AVG_NUM 16
-#define SENSOR_DATA_SIZE 3
-#define DEFAULT_SENSITIVITY 1024
-
-#define IOCTL_MAGIC 0x09
-#define SENSOR_RESET _IO(IOCTL_MAGIC, 0)
-#define SENSOR_CALIBRATION _IOWR(IOCTL_MAGIC, 1, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OFFSET _IOR(IOCTL_MAGIC, 2, int[SENSOR_DATA_SIZE])
-#define SENSOR_SET_OFFSET _IOWR(IOCTL_MAGIC, 3, int[SENSOR_DATA_SIZE])
-#define SENSOR_READ_ACCEL_XYZ _IOR(IOCTL_MAGIC, 4, int[SENSOR_DATA_SIZE])
-#define SENSOR_SETYPR _IOW(IOCTL_MAGIC, 5, int[SENSOR_DATA_SIZE])
-#define SENSOR_GET_OPEN_STATUS _IO(IOCTL_MAGIC, 6)
-#define SENSOR_GET_CLOSE_STATUS _IO(IOCTL_MAGIC, 7)
-#define SENSOR_GET_DELAY _IOR(IOCTL_MAGIC, 8, unsigned int*)
-#define SENSOR_MAXNR 8
-/* Default sensorlayout parameters */
-#define D10_DEFAULT_POSITION 6
-
-/* Transformation matrix for chip mounting position */
-static const int dmt_position_map[][3][3] = {
- { { 1, 0, 0}, { 0,-1, 0}, { 0, 0,-1}, }, /* top/upper-left */
- { { 0, 1, 0}, { 1, 0, 0}, { 0, 0,-1}, }, /* top/lower-left */
- { {-1, 0, 0}, { 0, 1, 0}, { 0, 0,-1}, }, /* top/lower-right */
- { { 0,-1, 0}, {-1, 0, 0}, { 0, 0,-1}, }, /* top/upper-right */
- { {-1, 0, 0}, { 0,-1, 0}, { 0, 0, 1}, }, /* bottom/upper-right*/
- { { 0,-1, 0}, {-1, 0, 0}, { 0, 0, 1}, }, /* bottom/upper-left */
- { { 1, 0, 0}, { 0, 1, 0}, { 0, 0, 1}, }, /* bottom/lower-right*/
- { { 0, 1,0}, { 1, 0, 0}, { 0, 0, 1}, }, /* bottom/lower-left */
-};
-
-typedef union {
- struct {
- int x;
- int y;
- int z;
- } u;
- int v[SENSOR_DATA_SIZE];
-} raw_data;
-
-struct dmt_data {
- struct platform_device *pdevice;
- struct device *class_dev;
- struct class *class;
- struct input_dev *input;
- struct i2c_client *client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif
- struct delayed_work delaywork;
- struct work_struct work;
- struct mutex data_mutex;
- struct mutex enable_mutex; /* for suspend */
- raw_data last; /* RawData */
- raw_data offset; /* Offset */
-#ifdef SW_FILTER
- int sum[SENSOR_DATA_SIZE]; /* SW_FILTER sum */
- int bufferave[3][32];
- s8 aveflag; /* FULL bufferave[][] */
- s8 pointer; /* last update data */
-#endif
- wait_queue_head_t open_wq;
- atomic_t active;
- atomic_t delay;
- atomic_t enable;
- int filter;
- int position; /* must int type ,for Kconfig setup */
- atomic_t addr;
-#ifdef DMT_DEBUG_DATA
- struct mutex suspend_mutex;
- int suspend;
-#endif
-};
-
-#define ACC_DATA_FLAG 0
-#define MAG_DATA_FLAG 1
-#define ORI_DATA_FLAG 2
-#define DMT_NUM_SENSORS 3
-
-/* ABS axes parameter range [um/s^2] (for input event) */
-#define GRAVITY_EARTH 9806550
-#define ABSMAX (GRAVITY_EARTH * 2)
-#define ABSMIN (-GRAVITY_EARTH * 2)
-
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/Makefile
deleted file mode 100755
index ac959091..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_lsensor_isl29023
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := isl29023.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/isl29023.c b/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/isl29023.c
deleted file mode 100755
index 3366e92a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/isl29023_lsensor/isl29023.c
+++ /dev/null
@@ -1,1164 +0,0 @@
-/*
- * isl29023.c - Intersil ISL29023 ALS & Proximity Driver
- *
- * By Intersil Corp
- * Michael DiGioia
- *
- * Based on isl29011.c
- * by Mike DiGioia <mdigioia@intersil.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/hwmon.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/sysfs.h>
-#include <linux/pm_runtime.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-//#include <linux/earlysuspend.h>
-#include <linux/platform_device.h>
-#include "../sensor.h"
-
-/* Insmod parameters */
-//I2C_CLIENT_INSMOD_1(isl29023);
-
-#define MODULE_NAME "isl29023"
-
-#define SENSOR_I2C_NAME "isl29023"
-#define SENSOR_I2C_ADDR 0x44
-
-#undef dbg
-#define dbg(fmt, args...)
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-/* ICS932S401 registers */
-#define ISL29023_REG_VENDOR_REV 0x06
-#define ISL29023_VENDOR 1
-#define ISL29023_VENDOR_MASK 0x0F
-#define ISL29023_REV 4
-#define ISL29023_REV_SHIFT 4
-#define ISL29023_REG_DEVICE 0x44
-#define ISL29023_DEVICE 44
-
-
-#define REG_CMD_1 0x00
-#define REG_CMD_2 0x01
-#define REG_DATA_LSB 0x02
-#define REG_DATA_MSB 0x03
-#define ISL_MOD_MASK 0xE0
-#define ISL_MOD_POWERDOWN 0
-#define ISL_MOD_ALS_ONCE 1
-#define ISL_MOD_IR_ONCE 2
-#define ISL_MOD_RESERVED 4
-#define ISL_MOD_ALS_CONT 5
-#define ISL_MOD_IR_CONT 6
-#define IR_CURRENT_MASK 0xC0
-#define IR_FREQ_MASK 0x30
-#define SENSOR_RANGE_MASK 0x03
-#define ISL_RES_MASK 0x0C
-
-static int last_mod;
-
-static struct i2c_client *this_client = NULL;
-struct isl_device {
- struct input_polled_dev* input_poll_dev;
- struct i2c_client* client;
- int resolution;
- int range;
- int isdbg;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-
-static struct isl_device* l_sensorconfig = NULL;
-static struct kobject *android_lsensor_kobj = NULL;
-static int l_enable = 1; // 0:don't report data
-
-static DEFINE_MUTEX(mutex);
-
-static int isl_set_range(struct i2c_client *client, int range)
-{
- int ret_val;
-
- ret_val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- if (ret_val < 0)
- return -EINVAL;
- ret_val &= ~SENSOR_RANGE_MASK; /*reset the bit */
- ret_val |= range;
- ret_val = i2c_smbus_write_byte_data(client, REG_CMD_2, ret_val);
-
- printk(KERN_INFO MODULE_NAME ": %s isl29023 set_range call, \n", __func__);
- if (ret_val < 0)
- return ret_val;
- return range;
-}
-
-static int isl_set_mod(struct i2c_client *client, int mod)
-{
- int ret, val, freq;
-
- switch (mod) {
- case ISL_MOD_POWERDOWN:
- case ISL_MOD_RESERVED:
- goto setmod;
- case ISL_MOD_ALS_ONCE:
- case ISL_MOD_ALS_CONT:
- freq = 0;
- break;
- case ISL_MOD_IR_ONCE:
- case ISL_MOD_IR_CONT:
- freq = 1;
- break;
- default:
- return -EINVAL;
- }
- /* set IR frequency */
- val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- if (val < 0)
- return -EINVAL;
- val &= ~IR_FREQ_MASK;
- if (freq)
- val |= IR_FREQ_MASK;
- ret = i2c_smbus_write_byte_data(client, REG_CMD_2, val);
- if (ret < 0)
- return -EINVAL;
-
-setmod:
- /* set operation mod */
- val = i2c_smbus_read_byte_data(client, REG_CMD_1);
- if (val < 0)
- return -EINVAL;
- val &= ~ISL_MOD_MASK;
- val |= (mod << 5);
- ret = i2c_smbus_write_byte_data(client, REG_CMD_1, val);
- if (ret < 0)
- return -EINVAL;
-
- if (mod != ISL_MOD_POWERDOWN)
- last_mod = mod;
-
- return mod;
-}
-
-static int isl_get_res(struct i2c_client *client)
-{
- int val;
-
- printk(KERN_INFO MODULE_NAME ": %s isl29023 get_res call, \n", __func__);
- val = i2c_smbus_read_word_data(client, 0)>>8 & 0xff;
-
- if (val < 0)
- return -EINVAL;
-
- val &= ISL_RES_MASK;
- val >>= 2;
-
- switch (val) {
- case 0:
- return 65536;
- case 1:
- return 4096;
- case 2:
- return 256;
- case 3:
- return 16;
- default:
- return -EINVAL;
- }
-}
-
-static int isl_get_mod(struct i2c_client *client)
-{
- int val;
-
- val = i2c_smbus_read_byte_data(client, REG_CMD_1);
- if (val < 0)
- return -EINVAL;
- return val >> 5;
-}
-
-static int isl_get_range(struct i2c_client* client)
-{
- switch (i2c_smbus_read_word_data(client, 0)>>8 & 0xff & 0x3) {
- case 0: return 1000;
- case 1: return 4000;
- case 2: return 16000;
- case 3: return 64000;
- default: return -EINVAL;
- }
-}
-
-static ssize_t
-isl_sensing_range_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- int val;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- dev_dbg(dev, "%s: range: 0x%.2x\n", __func__, val);
-
- if (val < 0)
- return val;
- return sprintf(buf, "%d000\n", 1 << (2 * (val & 3)));
-}
-
-static ssize_t
-ir_current_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- int val;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- dev_dbg(dev, "%s: IR current: 0x%.2x\n", __func__, val);
-
- if (val < 0)
- return -EINVAL;
- val >>= 6;
-
- switch (val) {
- case 0:
- val = 100;
- break;
- case 1:
- val = 50;
- break;
- case 2:
- val = 25;
- break;
- case 3:
- val = 0;
- break;
- default:
- return -EINVAL;
- }
-
- if (val)
- val = sprintf(buf, "%d\n", val);
- else
- val = sprintf(buf, "%s\n", "12.5");
- return val;
-}
-
-static ssize_t
-isl_sensing_mod_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
-// struct i2c_client *client = to_i2c_client(dev);
-
- dev_dbg(dev, "%s: mod: 0x%.2x\n", __func__, last_mod);
-
- switch (last_mod) {
- case ISL_MOD_POWERDOWN:
- return sprintf(buf, "%s\n", "0-Power-down");
- case ISL_MOD_ALS_ONCE:
- return sprintf(buf, "%s\n", "1-ALS once");
- case ISL_MOD_IR_ONCE:
- return sprintf(buf, "%s\n", "2-IR once");
- case ISL_MOD_RESERVED:
- return sprintf(buf, "%s\n", "4-Reserved");
- case ISL_MOD_ALS_CONT:
- return sprintf(buf, "%s\n", "5-ALS continuous");
- case ISL_MOD_IR_CONT:
- return sprintf(buf, "%s\n", "6-IR continuous");
- default:
- return -EINVAL;
- }
-}
-
-static ssize_t
-isl_output_data_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- int ret_val, mod;
- unsigned long int output = 0;
- int temp;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
-
- temp = i2c_smbus_read_byte_data(client, REG_DATA_MSB);
- if (temp < 0)
- goto err_exit;
- ret_val = i2c_smbus_read_byte_data(client, REG_DATA_LSB);
- if (ret_val < 0)
- goto err_exit;
- ret_val |= temp << 8;
-
- dev_dbg(dev, "%s: Data: %04x\n", __func__, ret_val);
-
- mod = isl_get_mod(client);
- switch (last_mod) {
- case ISL_MOD_ALS_CONT:
- case ISL_MOD_ALS_ONCE:
- case ISL_MOD_IR_ONCE:
- case ISL_MOD_IR_CONT:
- output = ret_val;
- break;
- default:
- goto err_exit;
- }
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- return sprintf(buf, "%ld\n", output);
-
-err_exit:
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- return -EINVAL;
-}
-
-static int isl_get_lux_data(struct i2c_client* client)
-{
- struct isl_device* idev = i2c_get_clientdata(client);
-
- __u16 resH, resL;
- //int range;
- resL = i2c_smbus_read_word_data(client, 1)>>8;
- resH = i2c_smbus_read_word_data(client, 2)&0xff00;
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
- return -1;
- }
- return (resH | resL) * idev->range / idev->resolution;
-}
-static ssize_t
-isl_lux_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- __u16 resH, resL;// L1, L2, H1, H2, thresL, thresH;
- char cmd2;
- int res, data, tmp, range, resolution;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
-
-// cmd2 = i2c_smbus_read_word_data(client, 0)>>8 & 0xff; // 01h
- resL = i2c_smbus_read_word_data(client, 1)>>8; // 02h
- resH = i2c_smbus_read_word_data(client, 2)&0xff00; // 03h
-// L1 = i2c_smbus_read_word_data(client, 3)>>8; // 04h
-// L2 = i2c_smbus_read_word_data(client, 4)&0xff00; // 05h
-// H1 = i2c_smbus_read_word_data(client, 5)>>8; // 06h
-// H2 = i2c_smbus_read_word_data(client, 6)&0xff00; // 07h
-
- res = resH | resL;
-// thresL = L2 | L1;
-// thresH = H2 | H1;
-
- cmd2 = i2c_smbus_read_word_data(client, 0)>>8 & 0xff;
- resolution = isl_get_res(client); //resolution
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- tmp = cmd2 & 0x3; //range
- switch (tmp) {
- case 0:
- range = 1000;
- break;
- case 1:
- range = 4000;
- break;
- case 2:
- range = 16000;
- break;
- case 3:
- range = 64000;
- break;
- default:
- return -EINVAL;
- }
- data = res * range / resolution;
-
-// printk("Data = 0x%04x [%d]\n", data, data);
-// printk("CMD2 = 0x%x\n", cmd2);
-// printk("Threshold Low = 0x%04x\n", thresL);
-// printk("Threshold High = 0x%04x\n", thresH);
-
- return sprintf(buf, "%u\n", data);
-}
-
-static ssize_t
-isl_cmd2_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- unsigned long cmd2;
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- cmd2 = i2c_smbus_read_word_data(client, 0)>>8 & 0xff;
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg(" cmd2: 0x%02x\n", cmd2);
- switch (cmd2) {
- case 0:
- return sprintf(buf, "%s\n", "[cmd2 = 0] n = 16, range = 1000");
- case 1:
- return sprintf(buf, "%s\n", "[cmd2 = 1] n = 16, range = 4000");
- case 2:
- return sprintf(buf, "%s\n", "[cmd2 = 2] n = 16, range = 16000");
- case 3:
- return sprintf(buf, "%s\n", "[cmd2 = 3] n = 16, range = 64000");
-
- case 4:
- return sprintf(buf, "%s\n", "[cmd2 = 4] n = 12, range = 1000");
- case 5:
- return sprintf(buf, "%s\n", "[cmd2 = 5] n = 12, range = 4000");
- case 6:
- return sprintf(buf, "%s\n", "[cmd2 = 6] n = 12, range = 16000");
- case 7:
- return sprintf(buf, "%s\n", "[cmd2 = 7] n = 12, range = 64000");
-
- case 8:
- return sprintf(buf, "%s\n", "[cmd2 = 8] n = 8, range = 1000");
- case 9:
- return sprintf(buf, "%s\n", "[cmd2 = 9] n = 8, range = 4000");
- case 10:
- return sprintf(buf, "%s\n", "[cmd2 = 10] n = 8, range = 16000");
- case 11:
- return sprintf(buf, "%s\n", "[cmd2 = 11] n = 8, range = 64000");
-
- case 12:
- return sprintf(buf, "%s\n", "[cmd2 = 12] n = 4, range = 1000");
- case 13:
- return sprintf(buf, "%s\n", "[cmd2 = 13] n = 4, range = 4000");
- case 14:
- return sprintf(buf, "%s\n", "[cmd2 = 14] n = 4, range = 16000");
- case 15:
- return sprintf(buf, "%s\n", "[cmd2 = 15] n = 4, range = 64000");
-
- default:
- return -EINVAL;
- }
-}
-
-
-static ssize_t
-isl_sensing_range_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- unsigned int ret_val;
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
-
- switch (val) {
- case 1000:
- val = 0;
- break;
- case 4000:
- val = 1;
- break;
- case 16000:
- val = 2;
- break;
- case 64000:
- val = 3;
- break;
- default:
- return -EINVAL;
- }
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- ret_val = isl_set_range(client, val);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- if (ret_val < 0)
- return ret_val;
- return count;
-}
-
-static ssize_t
-ir_current_store(struct device *dev,
- struct device_attribute *attr, const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- unsigned int ret_val;
- unsigned long val;
-
- if (!strncmp(buf, "12.5", 4))
- val = 3;
- else {
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
- switch (val) {
- case 100:
- val = 0;
- break;
- case 50:
- val = 1;
- break;
- case 25:
- val = 2;
- break;
- default:
- return -EINVAL;
- }
- }
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
-
- ret_val = i2c_smbus_read_byte_data(client, REG_CMD_2);
- if (ret_val < 0)
- goto err_exit;
-
- ret_val &= ~IR_CURRENT_MASK; /*reset the bit before setting them */
- ret_val |= (val << 6);
-
- ret_val = i2c_smbus_write_byte_data(client, REG_CMD_2, ret_val);
- if (ret_val < 0)
- goto err_exit;
-
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- return count;
-
-err_exit:
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- return -EINVAL;
-}
-
-static ssize_t
-isl_sensing_mod_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- int ret_val;
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
- if (val > 7)
- return -EINVAL;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- ret_val = isl_set_mod(client, val);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- if (ret_val < 0)
- return ret_val;
- return count;
-}
-
-static ssize_t
-isl_cmd2_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct isl_device* idev = i2c_get_clientdata(client);
- int res;
- unsigned long val;
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
- if (val > 15 || val < 0)
- return -EINVAL;
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- res = i2c_smbus_write_byte_data(client, REG_CMD_2, val);
- if (res < 0)
- printk("Warning - write failed\n");
-
- idev->resolution = isl_get_res(client);
- idev->range = isl_get_range(client);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- return count;
-}
-
-static DEVICE_ATTR(range, S_IRUGO | S_IWUSR,
- isl_sensing_range_show, isl_sensing_range_store);
-static DEVICE_ATTR(mod, S_IRUGO | S_IWUSR,
- isl_sensing_mod_show, isl_sensing_mod_store);
-static DEVICE_ATTR(ir_current, S_IRUGO | S_IWUSR,
- ir_current_show, ir_current_store);
-static DEVICE_ATTR(output, S_IRUGO, isl_output_data_show, NULL);
-static DEVICE_ATTR(cmd2, S_IRUGO | S_IWUSR,
- isl_cmd2_show, isl_cmd2_store);
-static DEVICE_ATTR(lux, S_IRUGO,
- isl_lux_show, NULL);
-
-static struct attribute *mid_att_isl[] = {
- &dev_attr_range.attr,
- &dev_attr_mod.attr,
- &dev_attr_ir_current.attr,
- &dev_attr_output.attr,
- &dev_attr_lux.attr,
- &dev_attr_cmd2.attr,
- NULL
-};
-
-static struct attribute_group m_isl_gr = {
- .name = "isl29023",
- .attrs = mid_att_isl
-};
-
-static int isl_set_default_config(struct i2c_client *client)
-{
- struct isl_device* idev = i2c_get_clientdata(client);
-
- int ret=0;
-/* We don't know what it does ... */
-// ret = i2c_smbus_write_byte_data(client, REG_CMD_1, 0xE0);
-// ret = i2c_smbus_write_byte_data(client, REG_CMD_2, 0xC3);
-/* Set default to ALS continuous */
- ret = i2c_smbus_write_byte_data(client, REG_CMD_1, 0xA0);
- if (ret < 0)
- return -EINVAL;
-/* Range: 0~16000, number of clock cycles: 65536 */
- ret = i2c_smbus_write_byte_data(client, REG_CMD_2, 0x02); // vivienne
- if (ret < 0)
- return -EINVAL;
- idev->resolution = isl_get_res(client);
- idev->range = isl_get_range(client);;
- dbg("isl29023 set_default_config call, \n");
-
- return 0;
-}
-
-/* Return 0 if detection is successful, -ENODEV otherwise */
-static int isl29023_detect(struct i2c_client *client/*, int kind,
- struct i2c_board_info *info*/)
-{
- struct i2c_adapter *adapter = client->adapter;
- int vendor, device, revision;
-
- if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
- return -ENODEV;
- //printk(KERN_INFO MODULE_NAME ": %s isl29023 detact call, kind:%d type:%s addr:%x \n", __func__, kind, info->type, info->addr);
-
- /* if (kind <= 0)*/ {
-
-
- vendor = i2c_smbus_read_word_data(client,
- ISL29023_REG_VENDOR_REV);
- dbg("read vendor=%d(0x%x)\n", vendor,vendor);
- if (0x0FFFF == vendor)
- {
- dbg("find isl29023!\n");
- return 0;
- } else {
- return -ENODEV;
- }
- vendor >>= 8;
- revision = vendor >> ISL29023_REV_SHIFT;
- vendor &= ISL29023_VENDOR_MASK;
- if (vendor != ISL29023_VENDOR)
- {
- dbg("real_vendor=0x%x,tvendor=0x%x\n",vendor,ISL29023_VENDOR);
- return -ENODEV;
- }
-
- device = i2c_smbus_read_word_data(client,
- ISL29023_REG_DEVICE);
- dbg("device=%x\n", device);
- device >>= 8;
- if (device != ISL29023_DEVICE)
- {
- dbg("real_device=0x%x, tdevice=0x%x\n", device, ISL29023_DEVICE);
- return -ENODEV;
- }
-
- if (revision != ISL29023_REV)
- {
- dbg("Unknown revision %d\n",
- revision);
- }
- } /*else
- dev_dbg(&adapter->dev, "detection forced\n");*/
-
- // strlcpy(info->type, "isl29023", I2C_NAME_SIZE);
-
- return 0;
-}
-
-int isl_input_open(struct input_dev* input)
-{
- return 0;
-}
-
-void isl_input_close(struct input_dev* input)
-{
-}
-
-static void isl_input_lux_poll(struct input_polled_dev *dev)
-{
- struct isl_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_dev->input;
- struct i2c_client* client = idev->client;
-
- if (l_enable != 0)
- {
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- input_report_abs(input, ABS_MISC, isl_get_lux_data(client));
- input_sync(input);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- }
-}
-
-static struct i2c_device_id isl29023_id[] = {
- {"isl29023", 0},
- {}
-};
-
-static int isl29023_runtime_suspend(struct device *dev)
-{
- struct i2c_client *client = to_i2c_client(dev);
- dev_dbg(dev, "suspend\n");
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- isl_set_mod(client, ISL_MOD_POWERDOWN);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- printk(KERN_INFO MODULE_NAME ": %s isl29023 suspend call, \n", __func__);
- return 0;
-}
-
-static int isl29023_runtime_resume(struct device *dev)
-{
- struct i2c_client *client = to_i2c_client(dev);
- dev_dbg(dev, "resume\n");
-
- mutex_lock(&mutex);
- pm_runtime_get_sync(dev);
- isl_set_mod(client, last_mod);
- pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
-
- printk(KERN_INFO MODULE_NAME ": %s isl29023 resume call, \n", __func__);
- return 0;
-}
-
-MODULE_DEVICE_TABLE(i2c, isl29023_id);
-
-/*static const struct dev_pm_ops isl29023_pm_ops = {
- .runtime_suspend = isl29023_runtime_suspend,
- .runtime_resume = isl29023_runtime_resume,
-};
-
-static struct i2c_board_info isl_info = {
- I2C_BOARD_INFO("isl29023", 0x44),
-};
-
-static struct i2c_driver isl29023_driver = {
- .driver = {
- .name = "isl29023",
- .pm = &isl29023_pm_ops,
- },
- .probe = isl29023_probe,
- .remove = isl29023_remove,
- .id_table = isl29023_id,
- .detect = isl29023_detect,
- //.address_data = &addr_data,
-};*/
-
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the l-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the l-sensor node...\n");
- return 0;
-}
-
-static ssize_t mmad_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_data(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-static long
-mmad_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- l_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = ISL29023_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("Isl29023_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static struct file_operations mmad_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmad_read,
- .unlocked_ioctl = mmad_ioctl,
-};
-
-
-static struct miscdevice mmad_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "lsensor_ctrl",
- .fops = &mmad_fops,
-};
-
-static void isl29023_early_suspend(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- isl_set_mod(client, ISL_MOD_POWERDOWN);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-static void isl29023_late_resume(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- isl_set_mod(client, last_mod);
- isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-
-static int
-isl29023_probe(struct i2c_client *client/*, const struct i2c_device_id *id*/)
-{
- int res=0;
-
- struct isl_device* idev = kzalloc(sizeof(struct isl_device), GFP_KERNEL);
- if(!idev)
- return -ENOMEM;
-
- l_sensorconfig = idev;
- android_lsensor_kobj = kobject_create_and_add("android_lsensor", NULL);
- if (android_lsensor_kobj == NULL) {
- errlog(
- "lsensor_sysfs_init:"\
- "subsystem_register failed\n");
- res = -ENOMEM;
- goto err_kobjetc_create;
- }
- res = sysfs_create_group(android_lsensor_kobj, &m_isl_gr);
- if (res) {
- //pr_warn("isl29023: device create file failed!!\n");
- printk(KERN_INFO MODULE_NAME ": %s isl29023 device create file failed\n", __func__);
- res = -EINVAL;
- goto err_sysfs_create;
- }
-
-/* last mod is ALS continuous */
- last_mod = 5;
- //pm_runtime_enable(&client->dev);
- idev->input_poll_dev = input_allocate_polled_device();
- if(!idev->input_poll_dev)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->client = client;
- idev->input_poll_dev->private = idev;
- idev->input_poll_dev->poll = isl_input_lux_poll;
- idev->input_poll_dev->poll_interval = 100;//50;
- idev->input_poll_dev->input->open = isl_input_open;
- idev->input_poll_dev->input->close = isl_input_close;
- idev->input_poll_dev->input->name = "lsensor_lux";
- idev->input_poll_dev->input->id.bustype = BUS_I2C;
- idev->input_poll_dev->input->dev.parent = &client->dev;
- input_set_drvdata(idev->input_poll_dev->input, idev);
- input_set_capability(idev->input_poll_dev->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_dev->input, ABS_MISC, 0, 16000, 0, 0);
- i2c_set_clientdata(client, idev);
- /* set default config after set_clientdata */
- res = isl_set_default_config(client);
- res = misc_register(&mmad_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_register;
- }
- res = input_register_polled_device(idev->input_poll_dev);
- if(res < 0)
- goto err_input_register_device;
- // suspend/resume register
-#ifdef CONFIG_HAS_EARLYSUSPEND
- idev->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- idev->earlysuspend.suspend = isl29023_early_suspend;
- idev->earlysuspend.resume = isl29023_late_resume;
- register_early_suspend(&(idev->earlysuspend));
-#endif
-
- dbg("isl29023 probe succeed!\n");
- return 0;
-err_input_register_device:
- misc_deregister(&mmad_device);
- input_free_polled_device(idev->input_poll_dev);
-err_misc_register:
-err_input_allocate_device:
- //__pm_runtime_disable(&client->dev, false);
-err_sysfs_create:
- kobject_del(android_lsensor_kobj);
-err_kobjetc_create:
- kfree(idev);
- return res;
-}
-
-static int isl29023_remove(struct i2c_client *client)
-{
- struct isl_device* idev = i2c_get_clientdata(client);
-
- //unregister_early_suspend(&(idev->earlysuspend));
- misc_deregister(&mmad_device);
- input_unregister_polled_device(idev->input_poll_dev);
- input_free_polled_device(idev->input_poll_dev);
- sysfs_remove_group(android_lsensor_kobj, &m_isl_gr);
- kobject_del(android_lsensor_kobj);
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- printk(KERN_INFO MODULE_NAME ": %s isl29023 remove call, \n", __func__);
- return 0;
-}
-
-//****************add platform_device & platform_driver for suspend &resume 2013-7-2
-static int ls_probe(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_remove(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_suspend(struct platform_device *pdev, pm_message_t state){
- printk("<<<%s\n", __FUNCTION__);
- struct i2c_client *client = l_sensorconfig->client;
-
- mutex_lock(&mutex);
-
- isl_set_mod(client, ISL_MOD_POWERDOWN);
-
- mutex_unlock(&mutex);
-
-
- return 0;
-}
-
-static int ls_resume(struct platform_device *pdev){
- //return 0;
- int ret = 0;
- int count = 0;
- printk("<<<%s\n", __FUNCTION__);
- struct i2c_client *client = l_sensorconfig->client;
-
-
-
-
-RETRY:
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- isl_set_mod(client, last_mod);
- ret = isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- if (ret < 0){
- printk("%s isl_set_default_config fail!\n", __FUNCTION__);
- count++;
- if (count < 5){
- mdelay(2);
- goto RETRY;
- }
- else
- return ret;
- }
- return 0;
-
-}
-static void lsdev_release(struct device *dev)
-{
- return;
-}
-static struct platform_device lsdev = {
- .name = "lsdevice",
- .id = -1,
- .dev = {
- .release = lsdev_release,
- },
-};
-static struct platform_driver lsdrv = {
- .probe = ls_probe,
- .remove = ls_remove,
- .suspend = ls_suspend,
- .resume = ls_resume,
- .driver = {
- .name = "lsdevice",
- },
-};
-//********************************************************************
-
-static int __init sensor_isl29023_init(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s isl29023 init call, \n", __func__);
- /*
- * Force device to initialize: i2c-15 0x44
- * If i2c_new_device is not called, even isl29023_detect will not run
- * TODO: rework to automatically initialize the device
- */
- //i2c_new_device(i2c_get_adapter(15), &isl_info);
- //return i2c_add_driver(&isl29023_driver);
- if (!(this_client = sensor_i2c_register_device(2, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if (isl29023_detect(this_client))
- {
- errlog("Can't find light sensor isl29023!\n");
- goto detect_fail;
- }
- if(isl29023_probe(this_client))
- {
- errlog("Erro for probe!\n");
- goto detect_fail;
- }
- int ret = 0;
- ret = platform_device_register(&lsdev);
- if (ret){
- printk("<<<platform_device_register fail!\n");
- return ret;
- }
- ret = platform_driver_register(&lsdrv);
- if (ret){
- printk("<<<platform_driver_register fail!\n");
- platform_device_unregister(&lsdev);
- return ret;
- }
-
- return 0;
-
-detect_fail:
- sensor_i2c_unregister_device(this_client);
- return -1;
-}
-
-static void __exit sensor_isl29023_exit(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s isl29023 exit call \n", __func__);
- isl29023_remove(this_client);
- sensor_i2c_unregister_device(this_client);
- platform_driver_unregister(&lsdrv);
- platform_device_unregister(&lsdev);
- //i2c_del_driver(&isl29023_driver);
-}
-
-module_init(sensor_isl29023_init);
-module_exit(sensor_isl29023_exit);
-
-MODULE_AUTHOR("mdigioia");
-MODULE_ALIAS("isl29023 ALS");
-MODULE_DESCRIPTION("Intersil isl29023 ALS Driver");
-MODULE_LICENSE("GPL v2");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/Makefile
deleted file mode 100755
index 774b6c9c..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_kionix_accel
-
-$(MY_MODULE_NAME)-objs := kionix_accel.o
-obj-m := $(MY_MODULE_NAME).o
-
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.c b/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.c
deleted file mode 100755
index ddb5bbcb..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.c
+++ /dev/null
@@ -1,2427 +0,0 @@
-/* drivers/input/misc/kionix_accel.c - Kionix accelerometer driver
- *
- * Copyright (C) 2012 Kionix, Inc.
- * Written by Kuching Tan <kuchingtan@kionix.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/delay.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/interrupt.h>
-#include <linux/workqueue.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-//#include <linux/input/kionix_accel.h>
-#include <linux/version.h>
-#include <linux/proc_fs.h>
-#ifdef CONFIG_HAS_EARLYSUSPEND
-#include <linux/earlysuspend.h>
-#endif /* CONFIG_HAS_EARLYSUSPEND */
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-#include <linux/platform_device.h>
-#include "kionix_accel.h"
-#include "../sensor.h"
-
-
-
-/* Debug Message Flags */
-#define KIONIX_KMSG_ERR 1 /* Print kernel debug message for error */
-#define KIONIX_KMSG_INF 1 /* Print kernel debug message for info */
-
-#if KIONIX_KMSG_ERR
-#define KMSGERR(format, ...) \
- dev_err(format, ## __VA_ARGS__)
- //printk(format, ## __VA_ARGS__)
-#else
-#define KMSGERR(format, ...)
-#endif
-
-#if KIONIX_KMSG_INF
-#define KMSGINF(format, ...) \
- dev_info(format, ## __VA_ARGS__)
- //printk(format, ## __VA_ARGS__)
-#else
-#define KMSGINF(format, ...)
-#endif
-
-
-/******************************************************************************
- * Accelerometer WHO_AM_I return value
- *****************************************************************************/
-#define KIONIX_ACCEL_WHO_AM_I_KXTE9 0x00
-#define KIONIX_ACCEL_WHO_AM_I_KXTF9 0x01
-#define KIONIX_ACCEL_WHO_AM_I_KXTI9_1001 0x04
-#define KIONIX_ACCEL_WHO_AM_I_KXTIK_1004 0x05
-#define KIONIX_ACCEL_WHO_AM_I_KXTJ9_1005 0x07
-#define KIONIX_ACCEL_WHO_AM_I_KXTJ9_1007 0x08
-#define KIONIX_ACCEL_WHO_AM_I_KXCJ9_1008 0x0A
-#define KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009 0x09
-#define KIONIX_ACCEL_WHO_AM_I_KXCJK_1013 0x11
-
-/******************************************************************************
- * Accelerometer Grouping
- *****************************************************************************/
-#define KIONIX_ACCEL_GRP1 1 /* KXTE9 */
-#define KIONIX_ACCEL_GRP2 2 /* KXTF9/I9-1001/J9-1005 */
-#define KIONIX_ACCEL_GRP3 3 /* KXTIK-1004 */
-#define KIONIX_ACCEL_GRP4 4 /* KXTJ9-1007/KXCJ9-1008 */
-#define KIONIX_ACCEL_GRP5 5 /* KXTJ2-1009 */
-#define KIONIX_ACCEL_GRP6 6 /* KXCJK-1013 */
-
-/******************************************************************************
- * Registers for Accelerometer Group 1 & 2 & 3
- *****************************************************************************/
-#define ACCEL_WHO_AM_I 0x0F
-
-/*****************************************************************************/
-/* Registers for Accelerometer Group 1 */
-/*****************************************************************************/
-/* Output Registers */
-#define ACCEL_GRP1_XOUT 0x12
-/* Control Registers */
-#define ACCEL_GRP1_CTRL_REG1 0x1B
-/* CTRL_REG1 */
-#define ACCEL_GRP1_PC1_OFF 0x7F
-#define ACCEL_GRP1_PC1_ON (1 << 7)
-#define ACCEL_GRP1_ODR40 (3 << 3)
-#define ACCEL_GRP1_ODR10 (2 << 3)
-#define ACCEL_GRP1_ODR3 (1 << 3)
-#define ACCEL_GRP1_ODR1 (0 << 3)
-#define ACCEL_GRP1_ODR_MASK (3 << 3)
-
-/*****************************************************************************/
-/* Registers for Accelerometer Group 2 & 3 */
-/*****************************************************************************/
-/* Output Registers */
-#define ACCEL_GRP2_XOUT_L 0x06
-/* Control Registers */
-#define ACCEL_GRP2_INT_REL 0x1A
-#define ACCEL_GRP2_CTRL_REG1 0x1B
-#define ACCEL_GRP2_INT_CTRL1 0x1E
-#define ACCEL_GRP2_DATA_CTRL 0x21
-/* CTRL_REG1 */
-#define ACCEL_GRP2_PC1_OFF 0x7F
-#define ACCEL_GRP2_PC1_ON (1 << 7)
-#define ACCEL_GRP2_DRDYE (1 << 5)
-#define ACCEL_GRP2_G_8G (2 << 3)
-#define ACCEL_GRP2_G_4G (1 << 3)
-#define ACCEL_GRP2_G_2G (0 << 3)
-#define ACCEL_GRP2_G_MASK (3 << 3)
-#define ACCEL_GRP2_RES_8BIT (0 << 6)
-#define ACCEL_GRP2_RES_12BIT (1 << 6)
-#define ACCEL_GRP2_RES_MASK (1 << 6)
-/* INT_CTRL1 */
-#define ACCEL_GRP2_IEA (1 << 4)
-#define ACCEL_GRP2_IEN (1 << 5)
-/* DATA_CTRL_REG */
-#define ACCEL_GRP2_ODR12_5 0x00
-#define ACCEL_GRP2_ODR25 0x01
-#define ACCEL_GRP2_ODR50 0x02
-#define ACCEL_GRP2_ODR100 0x03
-#define ACCEL_GRP2_ODR200 0x04
-#define ACCEL_GRP2_ODR400 0x05
-#define ACCEL_GRP2_ODR800 0x06
-/*****************************************************************************/
-
-
-/*****************************************************************************/
-/* Registers for Accelerometer Group 4 & 5 & 6 */
-/*****************************************************************************/
-/* Output Registers */
-#define ACCEL_GRP4_XOUT_L 0x06
-/* Control Registers */
-#define ACCEL_GRP4_INT_REL 0x1A
-#define ACCEL_GRP4_CTRL_REG1 0x1B
-#define ACCEL_GRP4_INT_CTRL1 0x1E
-#define ACCEL_GRP4_DATA_CTRL 0x21
-/* CTRL_REG1 */
-#define ACCEL_GRP4_PC1_OFF 0x7F
-#define ACCEL_GRP4_PC1_ON (1 << 7)
-#define ACCEL_GRP4_DRDYE (1 << 5)
-#define ACCEL_GRP4_G_8G (2 << 3)
-#define ACCEL_GRP4_G_4G (1 << 3)
-#define ACCEL_GRP4_G_2G (0 << 3)
-#define ACCEL_GRP4_G_MASK (3 << 3)
-#define ACCEL_GRP4_RES_8BIT (0 << 6)
-#define ACCEL_GRP4_RES_12BIT (1 << 6)
-#define ACCEL_GRP4_RES_MASK (1 << 6)
-/* INT_CTRL1 */
-#define ACCEL_GRP4_IEA (1 << 4)
-#define ACCEL_GRP4_IEN (1 << 5)
-/* DATA_CTRL_REG */
-#define ACCEL_GRP4_ODR0_781 0x08
-#define ACCEL_GRP4_ODR1_563 0x09
-#define ACCEL_GRP4_ODR3_125 0x0A
-#define ACCEL_GRP4_ODR6_25 0x0B
-#define ACCEL_GRP4_ODR12_5 0x00
-#define ACCEL_GRP4_ODR25 0x01
-#define ACCEL_GRP4_ODR50 0x02
-#define ACCEL_GRP4_ODR100 0x03
-#define ACCEL_GRP4_ODR200 0x04
-#define ACCEL_GRP4_ODR400 0x05
-#define ACCEL_GRP4_ODR800 0x06
-#define ACCEL_GRP4_ODR1600 0x07
-/*****************************************************************************/
-
-/* Input Event Constants */
-#define ACCEL_G_MAX 8096
-#define ACCEL_FUZZ 3
-#define ACCEL_FLAT 3
-/* I2C Retry Constants */
-#define KIONIX_I2C_RETRY_COUNT 10 /* Number of times to retry i2c */
-#define KIONIX_I2C_RETRY_TIMEOUT 1 /* Timeout between retry (miliseconds) */
-
-/* Earlysuspend Contants */
-#define KIONIX_ACCEL_EARLYSUSPEND_TIMEOUT 5000 /* Timeout (miliseconds) */
-
-/*
- * The following table lists the maximum appropriate poll interval for each
- * available output data rate (ODR).
- */
-static const struct {
- unsigned int cutoff;
- u8 mask;
-} kionix_accel_grp1_odr_table[] = {
- { 100, ACCEL_GRP1_ODR40 },
- { 334, ACCEL_GRP1_ODR10 },
- { 1000, ACCEL_GRP1_ODR3 },
- { 0, ACCEL_GRP1_ODR1 },
-};
-
-static const struct {
- unsigned int cutoff;
- u8 mask;
-} kionix_accel_grp2_odr_table[] = {
- { 3, ACCEL_GRP2_ODR800 },
- { 5, ACCEL_GRP2_ODR400 },
- { 10, ACCEL_GRP2_ODR200 },
- { 20, ACCEL_GRP2_ODR100 },
- { 40, ACCEL_GRP2_ODR50 },
- { 80, ACCEL_GRP2_ODR25 },
- { 0, ACCEL_GRP2_ODR12_5},
-};
-
-static const struct {
- unsigned int cutoff;
- u8 mask;
-} kionix_accel_grp4_odr_table[] = {
- { 2, ACCEL_GRP4_ODR1600 },
- { 3, ACCEL_GRP4_ODR800 },
- { 5, ACCEL_GRP4_ODR400 },
- { 10, ACCEL_GRP4_ODR200 },
- { 20, ACCEL_GRP4_ODR100 },
- { 40, ACCEL_GRP4_ODR50 },
- { 80, ACCEL_GRP4_ODR25 },
- { 160, ACCEL_GRP4_ODR12_5},
- { 320, ACCEL_GRP4_ODR6_25},
- { 640, ACCEL_GRP4_ODR3_125},
- { 1280, ACCEL_GRP4_ODR1_563},
- { 0, ACCEL_GRP4_ODR0_781},
-};
-
-enum {
- accel_grp1_ctrl_reg1 = 0,
- accel_grp1_regs_count,
-};
-
-enum {
- accel_grp2_ctrl_reg1 = 0,
- accel_grp2_data_ctrl,
- accel_grp2_int_ctrl,
- accel_grp2_regs_count,
-};
-
-enum {
- accel_grp4_ctrl_reg1 = 0,
- accel_grp4_data_ctrl,
- accel_grp4_int_ctrl,
- accel_grp4_regs_count,
-};
-
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define GSENSOR_MAJOR 161
-static struct i2c_client *this_client = NULL;
-static struct platform_device *this_pdev;
-static struct kionix_accel_platform_data kionix_accel_pdata = {
- .min_interval = 5,
- .poll_interval = 200,
- .accel_direction = 7,
- .accel_irq_use_drdy = 0,
- .accel_res = KIONIX_ACCEL_RES_12BIT,
- .accel_g_range = KIONIX_ACCEL_G_4G,
-};
-/*
-struct kionix_config
-{
- int op;
- int int_gpio; //0-3
- int xyz_axis[3][2]; // (axis,direction)
- int rxyz_axis[3][2];
- int irq;
- struct proc_dir_entry* sensor_proc;
- int sensorlevel;
- int shake_enable; // 1--enable shake, 0--disable shake
- int manual_rotation; // 0--landance, 90--vertical
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg; // 0-- no debug log, 1--show debug log
- int sensor_samp; // 1,2,4,8,16,32,64,120
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- spinlock_t spinlock;
- int pollcnt; // the counts of polling
- int offset[3];
-};
-
-static struct kionix_config l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .irq = 6,
- .int_gpio = 3,
- .sensor_proc = NULL,
- //.sensorlevel = SENSOR_GRAVITYGAME_MODE,
- .shake_enable = 0, // default enable shake
- .isdbg = 0,
- .sensor_samp = 10, // 4sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .pollcnt = 0, // Don't report the x,y,z when the driver is loaded until 2~3 seconds
- .offset = {0,0,0},
-};
-*/
-
-struct kionix_accel_driver {
- struct i2c_client *client;
- struct kionix_accel_platform_data accel_pdata;
- struct input_dev *input_dev;
- struct delayed_work accel_work;
- struct workqueue_struct *accel_workqueue;
- wait_queue_head_t wqh_suspend;
-
- int accel_data[3];
- int accel_cali[3];
- u8 axis_map_x;
- u8 axis_map_y;
- u8 axis_map_z;
- bool negate_x;
- bool negate_y;
- bool negate_z;
- u8 shift;
-
- unsigned int poll_interval;
- unsigned int poll_delay;
- unsigned int accel_group;
- u8 *accel_registers;
-
- atomic_t accel_suspended;
- atomic_t accel_suspend_continue;
- atomic_t accel_enabled;
- atomic_t accel_input_event;
- atomic_t accel_enable_resume;
- struct mutex mutex_earlysuspend;
- struct mutex mutex_resume;
- struct mutex mutex_subinput;
- rwlock_t rwlock_accel_data;
-
- bool accel_drdy;
-
- /* Function callback */
- void (*kionix_accel_report_accel_data)(struct kionix_accel_driver *acceld);
- int (*kionix_accel_update_odr)(struct kionix_accel_driver *acceld, unsigned int poll_interval);
- int (*kionix_accel_power_on_init)(struct kionix_accel_driver *acceld);
- int (*kionix_accel_operate)(struct kionix_accel_driver *acceld);
- int (*kionix_accel_standby)(struct kionix_accel_driver *acceld);
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif /* CONFIG_HAS_EARLYSUSPEND */
-};
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static void kionix_accel_update_direction(struct kionix_accel_driver *acceld);
-static int get_axisset(struct kionix_accel_driver *acceld)
-{
- char varbuf[64];
- int n;
- int ubootvar[3][3];
- int varlen;
- int err;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.kionixgsensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "Can't get gsensor config in u-boot!!!!\n");
- return -1;
- kionix_accel_update_direction(acceld);//return -1;
- } else {
- sscanf(varbuf, "%d:%d:%d:%d:%d:%d",
- &ubootvar[0][0],
- &ubootvar[0][1],
- &ubootvar[1][0],
- &ubootvar[1][1],
- &ubootvar[2][0],
- &ubootvar[2][1]);
-
- acceld->axis_map_x = ubootvar[0][0];
- acceld->negate_x = ubootvar[0][1]<0?1:0;
- acceld->axis_map_y = ubootvar[1][0];
- acceld->negate_y = ubootvar[1][1]<0?1:0;
- acceld->axis_map_z = ubootvar[2][0];
- acceld->negate_z = ubootvar[2][1]<0?1:0;
- /*kionix_accel_pdata.accel_direction = direction;
- printk(KERN_ERR"accel_direction is %d,g_range is %d,res is %d\n",kionix_accel_pdata.accel_direction,kionix_accel_pdata.accel_g_range,kionix_accel_pdata.accel_res);*/
-
- }
- return 0;
-}
-
-static int kionix_i2c_read(struct i2c_client *client, u8 addr, u8 *data, int len)
-{
- struct i2c_msg msgs[] = {
- {
- .addr = client->addr,
- .flags = client->flags,
- .len = 1,
- .buf = &addr,
- },
- {
- .addr = client->addr,
- .flags = client->flags | I2C_M_RD,
- .len = len,
- .buf = data,
- },
- };
-
- return i2c_transfer(client->adapter, msgs, 2);
-}
-
-static int kionix_i2c_write(struct i2c_client *client, u8 addr, u8 *data, int len)
-{
- char wrData[12] = {0};
- /*
- struct i2c_msg msgs =
- {.addr = client->addr, .flags = 0, .len = len+1, .buf = wrData,};
-*/
- struct i2c_msg msgs[] = {
- {
- .addr = client->addr,
- .flags = client->flags,
- .len = len+1,
- .buf = wrData,
- },
- };
-
- if (!client || (!data))
- {
- printk("%s NULL client!\n", __FUNCTION__);
- return -EIO;
- }
-
- wrData[0] = addr;
- strncpy(&wrData[1], data, len);
-
- if (i2c_transfer(client->adapter, &msgs, 1) < 0) {
- printk( "%s: transfer failed.", __func__);
- return -EIO;
- }
-
- return 0;
-}
-
-static int kionix_i2c_writebyte(struct i2c_client *client, u8 addr, u8 data)
-{
- char wrData[2] = {0};
- /*
- struct i2c_msg msgs =
- {.addr = client->addr, .flags = 0, .len = len+1, .buf = wrData,};
-*/
- struct i2c_msg msgs[] = {
- {
- .addr = client->addr,
- .flags = client->flags,
- .len = 2,
- .buf = &wrData[0],
- },
- };
-
- if (!client)
- {
- printk("%s NULL client!\n", __FUNCTION__);
- return -EIO;
- }
-
- wrData[0] = addr;
- //strncpy(&wrData[1], data, len);
- wrData[1] = data;
-
- if (i2c_transfer(client->adapter, &msgs, 1) < 0) {
- printk( "%s: transfer failed.", __func__);
- return -EIO;
- }
-
- return 0;
-}
-
-static int kionix_strtok(const char *buf, size_t count, char **token, const int token_nr)
-{
- char *buf2 = (char *)kzalloc((count + 1) * sizeof(char), GFP_KERNEL);
- char **token2 = token;
- unsigned int num_ptr = 0, num_nr = 0, num_neg = 0;
- int i = 0, start = 0, end = (int)count;
-
- strcpy(buf2, buf);
-
- /* We need to breakup the string into separate chunks in order for kstrtoint
- * or strict_strtol to parse them without returning an error. Stop when the end of
- * the string is reached or when enough value is read from the string */
- while((start < end) && (i < token_nr)) {
- /* We found a negative sign */
- if(*(buf2 + start) == '-') {
- /* Previous char(s) are numeric, so we store their value first before proceed */
- if(num_nr > 0) {
- /* If there is a pending negative sign, we adjust the variables to account for it */
- if(num_neg) {
- num_ptr--;
- num_nr++;
- }
- *token2 = (char *)kzalloc((num_nr + 2) * sizeof(char), GFP_KERNEL);
- strncpy(*token2, (const char *)(buf2 + num_ptr), (size_t) num_nr);
- *(*token2+num_nr) = '\n';
- i++;
- token2++;
- /* Reset */
- num_ptr = num_nr = 0;
- }
- /* This indicates that there is a pending negative sign in the string */
- num_neg = 1;
- }
- /* We found a numeric */
- else if((*(buf2 + start) >= '0') && (*(buf2 + start) <= '9')) {
- /* If the previous char(s) are not numeric, set num_ptr to current char */
- if(num_nr < 1)
- num_ptr = start;
- num_nr++;
- }
- /* We found an unwanted character */
- else {
- /* Previous char(s) are numeric, so we store their value first before proceed */
- if(num_nr > 0) {
- if(num_neg) {
- num_ptr--;
- num_nr++;
- }
- *token2 = (char *)kzalloc((num_nr + 2) * sizeof(char), GFP_KERNEL);
- strncpy(*token2, (const char *)(buf2 + num_ptr), (size_t) num_nr);
- *(*token2+num_nr) = '\n';
- i++;
- token2++;
- }
- /* Reset all the variables to start afresh */
- num_ptr = num_nr = num_neg = 0;
- }
- start++;
- }
-
- kfree(buf2);
-
- return (i == token_nr) ? token_nr : -1;
-}
-
-static int kionix_accel_grp1_power_on_init(struct kionix_accel_driver *acceld)
-{
- int err;
-
- if(atomic_read(&acceld->accel_enabled) > 0) {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP1_CTRL_REG1, acceld->accel_registers[accel_grp1_ctrl_reg1] | ACCEL_GRP1_PC1_ON);
- if (err < 0)
- return err;
- }
- else {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP1_CTRL_REG1, acceld->accel_registers[accel_grp1_ctrl_reg1]);
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-static int kionix_accel_grp1_operate(struct kionix_accel_driver *acceld)
-{
- int err;
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP1_CTRL_REG1, \
- acceld->accel_registers[accel_grp2_ctrl_reg1] | ACCEL_GRP1_PC1_ON);
- if (err < 0)
- return err;
-
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, 0);
-
- return 0;
-}
-
-static int kionix_accel_grp1_standby(struct kionix_accel_driver *acceld)
-{
- int err;
-
- cancel_delayed_work_sync(&acceld->accel_work);
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP1_CTRL_REG1, 0);
- if (err < 0)
- return err;
-
- return 0;
-}
-
-static void kionix_accel_grp1_report_accel_data(struct kionix_accel_driver *acceld)
-{
- u8 accel_data[3];
- s16 x, y, z;
- int err;
- struct input_dev *input_dev = acceld->input_dev;
- int loop = KIONIX_I2C_RETRY_COUNT;
-
- if(atomic_read(&acceld->accel_enabled) > 0) {
- if(atomic_read(&acceld->accel_enable_resume) > 0)
- {
- while(loop) {
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- err = kionix_i2c_read(acceld->client, ACCEL_GRP1_XOUT, accel_data, 6);
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
- if(err < 0){
- loop--;
- mdelay(KIONIX_I2C_RETRY_TIMEOUT);
- }
- else
- loop = 0;
- }
- if (err < 0) {
- KMSGERR(&acceld->client->dev, "%s: read data output error = %d\n", __func__, err);
- }
- else {
- write_lock(&acceld->rwlock_accel_data);
-
- x = ((s16) le16_to_cpu(((s16)(accel_data[acceld->axis_map_x] >> 2)) - 32)) << 6;
- y = ((s16) le16_to_cpu(((s16)(accel_data[acceld->axis_map_y] >> 2)) - 32)) << 6;
- z = ((s16) le16_to_cpu(((s16)(accel_data[acceld->axis_map_z] >> 2)) - 32)) << 6;
-
- acceld->accel_data[acceld->axis_map_x] = (acceld->negate_x ? -x : x) + acceld->accel_cali[acceld->axis_map_x];
- acceld->accel_data[acceld->axis_map_y] = (acceld->negate_y ? -y : y) + acceld->accel_cali[acceld->axis_map_y];
- acceld->accel_data[acceld->axis_map_z] = (acceld->negate_z ? -z : z) + acceld->accel_cali[acceld->axis_map_z];
-
- if(atomic_read(&acceld->accel_input_event) > 0) {
- input_report_abs(acceld->input_dev, ABS_X, acceld->accel_data[acceld->axis_map_x]);
- input_report_abs(acceld->input_dev, ABS_Y, acceld->accel_data[acceld->axis_map_y]);
- input_report_abs(acceld->input_dev, ABS_Z, acceld->accel_data[acceld->axis_map_z]);
- input_sync(acceld->input_dev);
- }
-
- write_unlock(&acceld->rwlock_accel_data);
- }
- }
- else
- {
- atomic_inc(&acceld->accel_enable_resume);
- }
- }
-}
-
-static int kionix_accel_grp1_update_odr(struct kionix_accel_driver *acceld, unsigned int poll_interval)
-{
- int err;
- int i;
- u8 odr;
-
- /* Use the lowest ODR that can support the requested poll interval */
- for (i = 0; i < ARRAY_SIZE(kionix_accel_grp1_odr_table); i++) {
- odr = kionix_accel_grp1_odr_table[i].mask;
- if (poll_interval < kionix_accel_grp1_odr_table[i].cutoff)
- break;
- }
-
- /* Do not need to update CTRL_REG1 register if the ODR is not changed */
- if((acceld->accel_registers[accel_grp1_ctrl_reg1] & ACCEL_GRP1_ODR_MASK) == odr)
- return 0;
- else {
- acceld->accel_registers[accel_grp1_ctrl_reg1] &= ~ACCEL_GRP1_ODR_MASK;
- acceld->accel_registers[accel_grp1_ctrl_reg1] |= odr;
- }
-
- /* Do not need to update CTRL_REG1 register if the sensor is not currently turn on */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP1_CTRL_REG1, \
- acceld->accel_registers[accel_grp1_ctrl_reg1] | ACCEL_GRP1_PC1_ON);
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-static int kionix_accel_grp2_power_on_init(struct kionix_accel_driver *acceld)
-{
- int err;
-
- /* ensure that PC1 is cleared before updating control registers */
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP2_CTRL_REG1, 0);
- if (err < 0)
- return err;
-
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP2_DATA_CTRL, acceld->accel_registers[accel_grp2_data_ctrl]);
- if (err < 0)
- return err;
-
- /* only write INT_CTRL_REG1 if in irq mode */
- if (acceld->client->irq) {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP2_INT_CTRL1, acceld->accel_registers[accel_grp2_int_ctrl]);
- if (err < 0)
- return err;
- }
-
- if(atomic_read(&acceld->accel_enabled) > 0) {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP2_CTRL_REG1, acceld->accel_registers[accel_grp2_ctrl_reg1] | ACCEL_GRP2_PC1_ON);
- if (err < 0)
- return err;
- }
- else {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP2_CTRL_REG1, acceld->accel_registers[accel_grp2_ctrl_reg1]);
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-static int kionix_accel_grp2_operate(struct kionix_accel_driver *acceld)
-{
- int err;
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP2_CTRL_REG1, \
- acceld->accel_registers[accel_grp2_ctrl_reg1] | ACCEL_GRP2_PC1_ON);
- if (err < 0)
- return err;
-
- if(acceld->accel_drdy == 0)
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, 0);
-
- return 0;
-}
-
-static int kionix_accel_grp2_standby(struct kionix_accel_driver *acceld)
-{
- int err;
-
- if(acceld->accel_drdy == 0)
- cancel_delayed_work_sync(&acceld->accel_work);
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP2_CTRL_REG1, 0);
- if (err < 0)
- return err;
-
- return 0;
-}
-
-static void kionix_accel_grp2_report_accel_data(struct kionix_accel_driver *acceld)
-{
- struct { union {
- s16 accel_data_s16[3];
- s8 accel_data_s8[6];
- }; } accel_data;
- s16 x, y, z;
- int err;
- struct input_dev *input_dev = acceld->input_dev;
- int loop;
-
- /* Only read the output registers if enabled */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- if(atomic_read(&acceld->accel_enable_resume) > 0)
- {
- loop = KIONIX_I2C_RETRY_COUNT;
- while(loop) {
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- err = kionix_i2c_read(acceld->client, ACCEL_GRP2_XOUT_L, (u8 *)accel_data.accel_data_s16, 6);
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
- if(err < 0){
- loop--;
- mdelay(KIONIX_I2C_RETRY_TIMEOUT);
- }
- else
- loop = 0;
- }
- if (err < 0) {
- KMSGERR(&acceld->client->dev, "%s: read data output error = %d\n", __func__, err);
- }
- else {
- write_lock(&acceld->rwlock_accel_data);
-
- x = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_x])) >> acceld->shift;
- y = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_y])) >> acceld->shift;
- z = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_z])) >> acceld->shift;
-
- acceld->accel_data[acceld->axis_map_x] = (acceld->negate_x ? -x : x) + acceld->accel_cali[acceld->axis_map_x];
- acceld->accel_data[acceld->axis_map_y] = (acceld->negate_y ? -y : y) + acceld->accel_cali[acceld->axis_map_y];
- acceld->accel_data[acceld->axis_map_z] = (acceld->negate_z ? -z : z) + acceld->accel_cali[acceld->axis_map_z];
-
- if(atomic_read(&acceld->accel_input_event) > 0) {
- input_report_abs(acceld->input_dev, ABS_X, acceld->accel_data[acceld->axis_map_x]);
- input_report_abs(acceld->input_dev, ABS_Y, acceld->accel_data[acceld->axis_map_y]);
- input_report_abs(acceld->input_dev, ABS_Z, acceld->accel_data[acceld->axis_map_z]);
- input_sync(acceld->input_dev);
- }
-
- write_unlock(&acceld->rwlock_accel_data);
- }
- }
- else
- {
- atomic_inc(&acceld->accel_enable_resume);
- }
- }
-
- /* Clear the interrupt if using drdy */
- if(acceld->accel_drdy == 1) {
- loop = KIONIX_I2C_RETRY_COUNT;
- while(loop) {
- err = i2c_smbus_read_byte_data(acceld->client, ACCEL_GRP2_INT_REL);
- if(err < 0){
- loop--;
- mdelay(KIONIX_I2C_RETRY_TIMEOUT);
- }
- else
- loop = 0;
- }
- if (err < 0)
- KMSGERR(&acceld->client->dev, "%s: clear interrupt error = %d\n", __func__, err);
- }
-}
-
-static void kionix_accel_grp2_update_g_range(struct kionix_accel_driver *acceld)
-{
- acceld->accel_registers[accel_grp2_ctrl_reg1] &= ~ACCEL_GRP2_G_MASK;
-
- switch (acceld->accel_pdata.accel_g_range) {
- case KIONIX_ACCEL_G_8G:
- case KIONIX_ACCEL_G_6G:
- acceld->shift = 2;
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_G_8G;
- break;
- case KIONIX_ACCEL_G_4G:
- acceld->shift = 3;
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_G_4G;
- break;
- case KIONIX_ACCEL_G_2G:
- default:
- acceld->shift = 4;
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_G_2G;
- break;
- }
-
- return;
-}
-
-static int kionix_accel_grp2_update_odr(struct kionix_accel_driver *acceld, unsigned int poll_interval)
-{
- int err;
- int i;
- u8 odr;
-
- /* Use the lowest ODR that can support the requested poll interval */
- for (i = 0; i < ARRAY_SIZE(kionix_accel_grp2_odr_table); i++) {
- odr = kionix_accel_grp2_odr_table[i].mask;
- if (poll_interval < kionix_accel_grp2_odr_table[i].cutoff)
- break;
- }
-
- /* Do not need to update DATA_CTRL_REG register if the ODR is not changed */
- if(acceld->accel_registers[accel_grp2_data_ctrl] == odr)
- return 0;
- else
- acceld->accel_registers[accel_grp2_data_ctrl] = odr;
-
- /* Do not need to update DATA_CTRL_REG register if the sensor is not currently turn on */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP2_CTRL_REG1, 0);
- if (err < 0)
- return err;
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP2_DATA_CTRL, acceld->accel_registers[accel_grp2_data_ctrl]);
- if (err < 0)
- return err;
-
- err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP2_CTRL_REG1, acceld->accel_registers[accel_grp2_ctrl_reg1] | ACCEL_GRP2_PC1_ON);
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-static int kionix_accel_grp4_power_on_init(struct kionix_accel_driver *acceld)
-{
- int err;
- char rxData[2] = {0};
- /* ensure that PC1 is cleared before updating control registers */
- /*err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP4_CTRL_REG1, 0);*/
-
- err = kionix_i2c_writebyte(acceld->client,
- ACCEL_GRP4_CTRL_REG1, 0);
- /*kionix_i2c_read(acceld->client,ACCEL_GRP4_CTRL_REG1,rxData,1);
- printk(KERN_ERR"%d ,%s: ACCEL_GRP4_CTRL_REG1 is %d",__LINE__,__FUNCTION__,rxData[0]);*/
-
- if (err < 0)
- return err;
-
- /*err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP4_DATA_CTRL, acceld->accel_registers[accel_grp4_data_ctrl]);*/
-
- err = kionix_i2c_writebyte(acceld->client,
- ACCEL_GRP4_DATA_CTRL, acceld->accel_registers[accel_grp4_data_ctrl]);
- /*kionix_i2c_read(acceld->client,ACCEL_GRP4_CTRL_REG1,rxData,1);
- printk(KERN_ERR"%d,%s: ACCEL_GRP4_CTRL_REG1 now is %d,wanted value is %d",__LINE__,__FUNCTION__,rxData[0],rxData[1]);*/
-
- if (err < 0)
- return err;
-
- /* only write INT_CTRL_REG1 if in irq mode */
- if (acceld->client->irq) {
- err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP4_INT_CTRL1, acceld->accel_registers[accel_grp4_int_ctrl]);
- if (err < 0)
- return err;
- }
-
- if(atomic_read(&acceld->accel_enabled) > 0) {
- /*err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);*/
-
- err = kionix_i2c_writebyte(acceld->client,
- ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);
- /*kionix_i2c_read(acceld->client,ACCEL_GRP4_CTRL_REG1,rxData,1);
- printk(KERN_ERR"%d,%s: ACCEL_GRP4_CTRL_REG1 now is %d,wanted value is %d",rxData[0],rxData[1]);*/
-
- if (err < 0)
- return err;
- }
- else {
- /*err = i2c_smbus_write_byte_data(acceld->client,
- ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1]);*/
-
- err = kionix_i2c_writebyte(acceld->client,
- ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1]);
- /*kionix_i2c_read(acceld->client,ACCEL_GRP4_CTRL_REG1,rxData,1);
- printk(KERN_ERR"%d,%s: ACCEL_GRP4_CTRL_REG1 now is %d,wanted value is %d",__LINE__,__FUNCTION__,rxData[0],acceld->accel_registers[accel_grp4_ctrl_reg1]);*/
-
- if (err < 0)
- return err;
- }
-
- return 0;
-}
-
-static int kionix_accel_grp4_operate(struct kionix_accel_driver *acceld)
-{
- int err;
-
- /*err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP4_CTRL_REG1, \
- acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);*/
-
- err = kionix_i2c_writebyte(acceld->client, ACCEL_GRP4_CTRL_REG1, \
- acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);
- if (err < 0)
- return err;
-
- if(acceld->accel_drdy == 0)
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, 0);
-
- return 0;
-}
-
-static int kionix_accel_grp4_standby(struct kionix_accel_driver *acceld)
-{
- int err;
-
- if(acceld->accel_drdy == 0)
- cancel_delayed_work_sync(&acceld->accel_work);
-
- //err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP4_CTRL_REG1, 0);
- err = kionix_i2c_writebyte(acceld->client, ACCEL_GRP4_CTRL_REG1, 0);
- if (err < 0)
- return err;
-
- return 0;
-}
-
-static void kionix_accel_grp4_report_accel_data(struct kionix_accel_driver *acceld)
-{
- struct { union {
- s16 accel_data_s16[3];
- s8 accel_data_s8[6];
- }; } accel_data;
- s16 x, y, z;
- int err;
- struct input_dev *input_dev = acceld->input_dev;
- int loop;
-
- /* Only read the output registers if enabled */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- if(atomic_read(&acceld->accel_enable_resume) > 0)
- {
- loop = KIONIX_I2C_RETRY_COUNT;
- while(loop) {
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- err = kionix_i2c_read(acceld->client, ACCEL_GRP4_XOUT_L, (u8 *)accel_data.accel_data_s16, 6);
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
- if(err < 0){
- loop--;
- mdelay(KIONIX_I2C_RETRY_TIMEOUT);
- }
- else
- loop = 0;
- }
- if (err < 0) {
- KMSGERR(&acceld->client->dev, "%s: read data output error = %d\n", __func__, err);
- }
- else {
- write_lock(&acceld->rwlock_accel_data);
-
- x = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_x])) >> acceld->shift;
- y = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_y])) >> acceld->shift;
- z = ((s16) le16_to_cpu(accel_data.accel_data_s16[acceld->axis_map_z])) >> acceld->shift;
-
- acceld->accel_data[acceld->axis_map_x] = (acceld->negate_x ? -x : x) + acceld->accel_cali[acceld->axis_map_x];
- acceld->accel_data[acceld->axis_map_y] = (acceld->negate_y ? -y : y) + acceld->accel_cali[acceld->axis_map_y];
- acceld->accel_data[acceld->axis_map_z] = (acceld->negate_z ? -z : z) + acceld->accel_cali[acceld->axis_map_z];
-
- //printk(KERN_ERR"x:%d,y:%d,z:%d",x,y,z);
-
- if(atomic_read(&acceld->accel_input_event) > 0) {
- input_report_abs(acceld->input_dev, ABS_X, acceld->accel_data[acceld->axis_map_x]);
- input_report_abs(acceld->input_dev, ABS_Y, acceld->accel_data[acceld->axis_map_y]);
- input_report_abs(acceld->input_dev, ABS_Z, acceld->accel_data[acceld->axis_map_z]);
- input_sync(acceld->input_dev);
- }
-
- write_unlock(&acceld->rwlock_accel_data);
- }
- }
- else
- {
- atomic_inc(&acceld->accel_enable_resume);
- }
- }
-
- /* Clear the interrupt if using drdy */
- if(acceld->accel_drdy == 1) {
- loop = KIONIX_I2C_RETRY_COUNT;
- while(loop) {
- err = i2c_smbus_read_byte_data(acceld->client, ACCEL_GRP4_INT_REL);
- if(err < 0){
- loop--;
- mdelay(KIONIX_I2C_RETRY_TIMEOUT);
- }
- else
- loop = 0;
- }
- if (err < 0)
- KMSGERR(&acceld->client->dev, "%s: clear interrupt error = %d\n", __func__, err);
- }
-}
-
-static void kionix_accel_grp4_update_g_range(struct kionix_accel_driver *acceld)
-{
- acceld->accel_registers[accel_grp4_ctrl_reg1] &= ~ACCEL_GRP4_G_MASK;
- //printk(KERN_ERR"kionix_accel_grp4_update_g_range is %d",acceld->accel_pdata.accel_g_range);
- switch (acceld->accel_pdata.accel_g_range) {
- case KIONIX_ACCEL_G_8G:
- case KIONIX_ACCEL_G_6G:
- //acceld->shift = 2;
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_G_8G;
- break;
- case KIONIX_ACCEL_G_4G:
- //acceld->shift = 4;//3;
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_G_4G;
- break;
- case KIONIX_ACCEL_G_2G:
- default:
- //acceld->shift = 4;
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_G_2G;
- break;
- }
-
- return;
-}
-
-static int kionix_accel_grp4_update_odr(struct kionix_accel_driver *acceld, unsigned int poll_interval)
-{
- int err;
- int i;
- u8 odr;
-
- /* Use the lowest ODR that can support the requested poll interval */
- for (i = 0; i < ARRAY_SIZE(kionix_accel_grp4_odr_table); i++) {
- odr = kionix_accel_grp4_odr_table[i].mask;
- if (poll_interval < kionix_accel_grp4_odr_table[i].cutoff)
- break;
- }
-
- /* Do not need to update DATA_CTRL_REG register if the ODR is not changed */
- if(acceld->accel_registers[accel_grp4_data_ctrl] == odr)
- return 0;
- else
- acceld->accel_registers[accel_grp4_data_ctrl] = odr;
-
- /* Do not need to update DATA_CTRL_REG register if the sensor is not currently turn on */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- //err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP4_CTRL_REG1, 0);
- err = kionix_i2c_writebyte(acceld->client, ACCEL_GRP4_CTRL_REG1, 0);
-
-
- if (err < 0)
- return err;
-
- //err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP4_DATA_CTRL, acceld->accel_registers[accel_grp4_data_ctrl]);
- err = kionix_i2c_writebyte(acceld->client, ACCEL_GRP4_DATA_CTRL, acceld->accel_registers[accel_grp4_data_ctrl]);
- if (err < 0)
- return err;
-
- //err = i2c_smbus_write_byte_data(acceld->client, ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);
- err = kionix_i2c_writebyte(acceld->client, ACCEL_GRP4_CTRL_REG1, acceld->accel_registers[accel_grp4_ctrl_reg1] | ACCEL_GRP4_PC1_ON);
- if (err < 0)
- return err;
- //#############
- err = i2c_smbus_read_byte_data(acceld->client, ACCEL_GRP4_DATA_CTRL);
- if (err < 0)
- return err;
- switch(err) {
- case ACCEL_GRP4_ODR0_781:
- dev_info(&acceld->client->dev, "ODR = 0.781 Hz\n");
- break;
- case ACCEL_GRP4_ODR1_563:
- dev_info(&acceld->client->dev, "ODR = 1.563 Hz\n");
- break;
- case ACCEL_GRP4_ODR3_125:
- dev_info(&acceld->client->dev, "ODR = 3.125 Hz\n");
- break;
- case ACCEL_GRP4_ODR6_25:
- dev_info(&acceld->client->dev, "ODR = 6.25 Hz\n");
- break;
- case ACCEL_GRP4_ODR12_5:
- dev_info(&acceld->client->dev, "ODR = 12.5 Hz\n");
- break;
- case ACCEL_GRP4_ODR25:
- dev_info(&acceld->client->dev, "ODR = 25 Hz\n");
- break;
- case ACCEL_GRP4_ODR50:
- dev_info(&acceld->client->dev, "ODR = 50 Hz\n");
- break;
- case ACCEL_GRP4_ODR100:
- dev_info(&acceld->client->dev, "ODR = 100 Hz\n");
- break;
- case ACCEL_GRP4_ODR200:
- dev_info(&acceld->client->dev, "ODR = 200 Hz\n");
- break;
- case ACCEL_GRP4_ODR400:
- dev_info(&acceld->client->dev, "ODR = 400 Hz\n");
- break;
- case ACCEL_GRP4_ODR800:
- dev_info(&acceld->client->dev, "ODR = 800 Hz\n");
- break;
- case ACCEL_GRP4_ODR1600:
- dev_info(&acceld->client->dev, "ODR = 1600 Hz\n");
- break;
- default:
- dev_info(&acceld->client->dev, "Unknown ODR\n");
- break;
- }
- //#############
- }
-
- return 0;
-}
-
-static int kionix_accel_power_on(struct kionix_accel_driver *acceld)
-{
- if (acceld->accel_pdata.power_on)
- return acceld->accel_pdata.power_on();
-
- return 0;
-}
-
-static void kionix_accel_power_off(struct kionix_accel_driver *acceld)
-{
- if (acceld->accel_pdata.power_off)
- acceld->accel_pdata.power_off();
-}
-
-static irqreturn_t kionix_accel_isr(int irq, void *dev)
-{
- struct kionix_accel_driver *acceld = dev;
-
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, 0);
-
- return IRQ_HANDLED;
-}
-
-static void kionix_accel_work(struct work_struct *work)
-{
- struct kionix_accel_driver *acceld = container_of((struct delayed_work *)work, struct kionix_accel_driver, accel_work);
-
- if(acceld->accel_drdy == 0)
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, acceld->poll_delay);
-
- acceld->kionix_accel_report_accel_data(acceld);
-}
-
-static void kionix_accel_update_direction(struct kionix_accel_driver *acceld)
-{
- unsigned int direction = acceld->accel_pdata.accel_direction;
- unsigned int accel_group = acceld->accel_group;
-
- write_lock(&acceld->rwlock_accel_data);
- acceld->axis_map_x = ((direction-1)%2);
- acceld->axis_map_y = (direction%2);
- acceld->axis_map_z = 2;
- acceld->negate_z = ((direction-1)/4);
- switch(accel_group) {
- case KIONIX_ACCEL_GRP3:
- case KIONIX_ACCEL_GRP6:
- acceld->negate_x = (((direction+2)/2)%2);
- acceld->negate_y = (((direction+5)/4)%2);
- break;
- case KIONIX_ACCEL_GRP5:
- acceld->axis_map_x = (direction%2);
- acceld->axis_map_y = ((direction-1)%2);
- acceld->negate_x = (((direction+1)/2)%2);
- acceld->negate_y = (((direction/2)+((direction-1)/4))%2);
- break;
- default:
- acceld->negate_x = ((direction/2)%2);
- acceld->negate_y = (((direction+1)/4)%2);
- break;
- }
- write_unlock(&acceld->rwlock_accel_data);
- return;
-}
-
-static int kionix_accel_enable(struct kionix_accel_driver *acceld)
-{
- int err = 0;
- long remaining;
-
- mutex_lock(&acceld->mutex_earlysuspend);
-
- atomic_set(&acceld->accel_suspend_continue, 0);
-
- /* Make sure that the sensor had successfully resumed before enabling it */
- if(atomic_read(&acceld->accel_suspended) == 1) {
- KMSGINF(&acceld->client->dev, "%s: waiting for resume\n", __func__);
- remaining = wait_event_interruptible_timeout(acceld->wqh_suspend, \
- atomic_read(&acceld->accel_suspended) == 0, \
- msecs_to_jiffies(KIONIX_ACCEL_EARLYSUSPEND_TIMEOUT));
-
- if(atomic_read(&acceld->accel_suspended) == 1) {
- KMSGERR(&acceld->client->dev, "%s: timeout waiting for resume\n", __func__);
- err = -ETIME;
- goto exit;
- }
- }
-
- err = acceld->kionix_accel_operate(acceld);
-
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kionix_accel_operate returned err = %d\n", __func__, err);
- goto exit;
- }
-
- atomic_inc(&acceld->accel_enabled);
-
-exit:
- mutex_unlock(&acceld->mutex_earlysuspend);
-
- return err;
-}
-
-static int kionix_accel_disable(struct kionix_accel_driver *acceld)
-{
- int err = 0;
-
- mutex_lock(&acceld->mutex_resume);
-
- atomic_set(&acceld->accel_suspend_continue, 1);
-
- if(atomic_read(&acceld->accel_enabled) > 0){
- if(atomic_dec_and_test(&acceld->accel_enabled)) {
- if(atomic_read(&acceld->accel_enable_resume) > 0)
- atomic_set(&acceld->accel_enable_resume, 0);
- err = acceld->kionix_accel_standby(acceld);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kionix_accel_standby returned err = %d\n", __func__, err);
- goto exit;
- }
- wake_up_interruptible(&acceld->wqh_suspend);
- }
- }
-
-exit:
- mutex_unlock(&acceld->mutex_resume);
-
- return err;
-}
-
-static int kionix_accel_input_open(struct input_dev *input)
-{
- struct kionix_accel_driver *acceld = input_get_drvdata(input);
-
- atomic_inc(&acceld->accel_input_event);
-
- return 0;
-}
-
-static void kionix_accel_input_close(struct input_dev *dev)
-{
- struct kionix_accel_driver *acceld = input_get_drvdata(dev);
-
- atomic_dec(&acceld->accel_input_event);
-}
-
-static void __devinit kionix_accel_init_input_device(struct kionix_accel_driver *acceld,
- struct input_dev *input_dev)
-{
- __set_bit(EV_ABS, input_dev->evbit);
- input_set_abs_params(input_dev, ABS_X, -ACCEL_G_MAX, ACCEL_G_MAX, ACCEL_FUZZ, ACCEL_FLAT);
- input_set_abs_params(input_dev, ABS_Y, -ACCEL_G_MAX, ACCEL_G_MAX, ACCEL_FUZZ, ACCEL_FLAT);
- input_set_abs_params(input_dev, ABS_Z, -ACCEL_G_MAX, ACCEL_G_MAX, ACCEL_FUZZ, ACCEL_FLAT);
-
- input_dev->name = "g-sensor";//KIONIX_ACCEL_NAME;
- input_dev->id.bustype = BUS_I2C;
- input_dev->dev.parent = &acceld->client->dev;
-}
-
-static int __devinit kionix_accel_setup_input_device(struct kionix_accel_driver *acceld)
-{
- struct input_dev *input_dev;
- int err;
-
- input_dev = input_allocate_device();
- if (!input_dev) {
- KMSGERR(&acceld->client->dev, "input_allocate_device failed\n");
- printk("kionix_accel_probe: Failed to allocate input device\n");
- return -ENOMEM;
- }
-
- acceld->input_dev = input_dev;
-
- input_dev->open = kionix_accel_input_open;
- input_dev->close = kionix_accel_input_close;
- input_set_drvdata(input_dev, acceld);
-
- kionix_accel_init_input_device(acceld, input_dev);
-
- err = input_register_device(acceld->input_dev);
- if (err) {
- KMSGERR(&acceld->client->dev, \
- "%s: input_register_device returned err = %d\n", __func__, err);
- printk("kionix_accel_probe: Failed to register input device\n");
- input_free_device(acceld->input_dev);
- return err;
- }
-
- return 0;
-}
-
-/* Returns the enable state of device */
-static ssize_t kionix_accel_get_enable(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
-
- return sprintf(buf, "%d\n", atomic_read(&acceld->accel_enabled) > 0 ? 1 : 0);
-}
-
-/* Allow users to enable/disable the device */
-static ssize_t kionix_accel_set_enable(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- struct input_dev *input_dev = acceld->input_dev;
- char *buf2;
- const int enable_count = 1;
- unsigned long enable;
- int err = 0;
-
- /* Lock the device to prevent races with open/close (and itself) */
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- if(kionix_strtok(buf, count, &buf2, enable_count) < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: No enable data being read. " \
- "No enable data will be updated.\n", __func__);
- }
-
- else {
- /* Removes any leading negative sign */
- while(*buf2 == '-')
- buf2++;
- #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
- err = kstrtouint((const char *)buf2, 10, (unsigned int *)&enable);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kstrtouint returned err = %d\n", __func__, err);
- goto exit;
- }
- #else
- err = strict_strtoul((const char *)buf2, 10, &enable);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: strict_strtoul returned err = %d\n", __func__, err);
- goto exit;
- }
- #endif
-
- if(enable)
- err = kionix_accel_enable(acceld);
- else
- err = kionix_accel_disable(acceld);
- }
-
-exit:
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
- return (err < 0) ? err : count;
-}
-
-/* Returns currently selected poll interval (in ms) */
-static ssize_t kionix_accel_get_delay(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
-
- return sprintf(buf, "%d\n", acceld->poll_interval);
-}
-
-/* Allow users to select a new poll interval (in ms) */
-static ssize_t kionix_accel_set_delay(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- struct input_dev *input_dev = acceld->input_dev;
- char *buf2;
- const int delay_count = 1;
- unsigned long interval;
- int err = 0;
-
- /* Lock the device to prevent races with open/close (and itself) */
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- if(kionix_strtok(buf, count, &buf2, delay_count) < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: No delay data being read. " \
- "No delay data will be updated.\n", __func__);
- }
-
- else {
- /* Removes any leading negative sign */
- while(*buf2 == '-')
- buf2++;
- #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
- err = kstrtouint((const char *)buf2, 10, (unsigned int *)&interval);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kstrtouint returned err = %d\n", __func__, err);
- goto exit;
- }
- #else
- err = strict_strtoul((const char *)buf2, 10, &interval);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: strict_strtoul returned err = %d\n", __func__, err);
- goto exit;
- }
- #endif
-
- if(acceld->accel_drdy == 1)
- disable_irq(client->irq);
-
- /*
- * Set current interval to the greater of the minimum interval or
- * the requested interval
- */
- acceld->poll_interval = max((unsigned int)interval, acceld->accel_pdata.min_interval);
- acceld->poll_delay = msecs_to_jiffies(acceld->poll_interval);
-
- err = acceld->kionix_accel_update_odr(acceld, acceld->poll_interval);
-
- if(acceld->accel_drdy == 1)
- enable_irq(client->irq);
- }
-
-exit:
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
-
- return (err < 0) ? err : count;
-}
-
-/* Returns the direction of device */
-static ssize_t kionix_accel_get_direct(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
-
- return sprintf(buf, "%d\n", acceld->accel_pdata.accel_direction);
-}
-
-/* Allow users to change the direction the device */
-static ssize_t kionix_accel_set_direct(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- struct input_dev *input_dev = acceld->input_dev;
- char *buf2;
- const int direct_count = 1;
- unsigned long direction;
- int err = 0;
-
- /* Lock the device to prevent races with open/close (and itself) */
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- if(kionix_strtok(buf, count, &buf2, direct_count) < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: No direction data being read. " \
- "No direction data will be updated.\n", __func__);
- }
-
- else {
- /* Removes any leading negative sign */
- while(*buf2 == '-')
- buf2++;
- #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
- err = kstrtouint((const char *)buf2, 10, (unsigned int *)&direction);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kstrtouint returned err = %d\n", __func__, err);
- goto exit;
- }
- #else
- err = strict_strtoul((const char *)buf2, 10, &direction);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: strict_strtoul returned err = %d\n", __func__, err);
- goto exit;
- }
- #endif
-
- if(direction < 1 || direction > 8)
- KMSGERR(&acceld->client->dev, "%s: invalid direction = %d\n", __func__, (unsigned int) direction);
-
- else {
- acceld->accel_pdata.accel_direction = (u8) direction;
- kionix_accel_update_direction(acceld);
- }
- }
-
-exit:
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
- return (err < 0) ? err : count;
-}
-
-/* Returns the data output of device */
-static ssize_t kionix_accel_get_data(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- int x, y, z;
-
- read_lock(&acceld->rwlock_accel_data);
-
- x = acceld->accel_data[acceld->axis_map_x];
- y = acceld->accel_data[acceld->axis_map_y];
- z = acceld->accel_data[acceld->axis_map_z];
-
- read_unlock(&acceld->rwlock_accel_data);
-
- return sprintf(buf, "%d %d %d\n", x, y, z);
-}
-
-/* Returns the calibration value of the device */
-static ssize_t kionix_accel_get_cali(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- int calibration[3];
-
- read_lock(&acceld->rwlock_accel_data);
-
- calibration[0] = acceld->accel_cali[acceld->axis_map_x];
- calibration[1] = acceld->accel_cali[acceld->axis_map_y];
- calibration[2] = acceld->accel_cali[acceld->axis_map_z];
-
- read_unlock(&acceld->rwlock_accel_data);
-
- return sprintf(buf, "%d %d %d\n", calibration[0], calibration[1], calibration[2]);
-}
-
-/* Allow users to change the calibration value of the device */
-static ssize_t kionix_accel_set_cali(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct kionix_accel_driver *acceld = i2c_get_clientdata(client);
- struct input_dev *input_dev = acceld->input_dev;
- const int cali_count = 3; /* How many calibration that we expect to get from the string */
- char **buf2;
- long calibration[cali_count];
- int err = 0, i = 0;
-
- /* Lock the device to prevent races with open/close (and itself) */
- //mutex_lock(&input_dev->mutex);
- mutex_lock(&acceld->mutex_subinput);
- buf2 = (char **)kzalloc(cali_count * sizeof(char *), GFP_KERNEL);
-
- if(kionix_strtok(buf, count, buf2, cali_count) < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: Not enough calibration data being read. " \
- "No calibration data will be updated.\n", __func__);
- }
- else {
- /* Convert string to integers */
- for(i = 0 ; i < cali_count ; i++) {
- #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,35))
- err = kstrtoint((const char *)*(buf2+i), 10, (int *)&calibration[i]);
- if(err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: kstrtoint returned err = %d." \
- "No calibration data will be updated.\n", __func__ , err);
- goto exit;
- }
- #else
- err = strict_strtol((const char *)*(buf2+i), 10, &calibration[i]);
- if(err < 0) {
- KMSGERR(&acceld->client->dev, \
- "%s: strict_strtol returned err = %d." \
- "No calibration data will be updated.\n", __func__ , err);
- goto exit;
- }
- #endif
- }
-
- write_lock(&acceld->rwlock_accel_data);
-
- acceld->accel_cali[acceld->axis_map_x] = (int)calibration[0];
- acceld->accel_cali[acceld->axis_map_y] = (int)calibration[1];
- acceld->accel_cali[acceld->axis_map_z] = (int)calibration[2];
-
- write_unlock(&acceld->rwlock_accel_data);
- }
-
-exit:
- for(i = 0 ; i < cali_count ; i++)
- kfree(*(buf2+i));
-
- kfree(buf2);
-
- //mutex_unlock(&input_dev->mutex);
- mutex_unlock(&acceld->mutex_subinput);
-
- return (err < 0) ? err : count;
-}
-
-static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR, kionix_accel_get_enable, kionix_accel_set_enable);
-static DEVICE_ATTR(delay, S_IRUGO|S_IWUSR, kionix_accel_get_delay, kionix_accel_set_delay);
-static DEVICE_ATTR(direct, S_IRUGO|S_IWUSR, kionix_accel_get_direct, kionix_accel_set_direct);
-static DEVICE_ATTR(data, S_IRUGO, kionix_accel_get_data, NULL);
-static DEVICE_ATTR(cali, S_IRUGO|S_IWUSR, kionix_accel_get_cali, kionix_accel_set_cali);
-
-static struct attribute *kionix_accel_attributes[] = {
- &dev_attr_enable.attr,
- &dev_attr_delay.attr,
- &dev_attr_direct.attr,
- &dev_attr_data.attr,
- &dev_attr_cali.attr,
- NULL
-};
-
-static struct attribute_group kionix_accel_attribute_group = {
- .attrs = kionix_accel_attributes
-};
-
-static int kionix_chip_id[] ={
- KIONIX_ACCEL_WHO_AM_I_KXTE9,
- KIONIX_ACCEL_WHO_AM_I_KXTF9,
- KIONIX_ACCEL_WHO_AM_I_KXTI9_1001,
- KIONIX_ACCEL_WHO_AM_I_KXTIK_1004,
- KIONIX_ACCEL_WHO_AM_I_KXTJ9_1005,
- KIONIX_ACCEL_WHO_AM_I_KXTJ9_1007,
- KIONIX_ACCEL_WHO_AM_I_KXCJ9_1008,
- KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009,
- KIONIX_ACCEL_WHO_AM_I_KXCJK_1013
-};
-
-static int iskionix()
-{
- char rxData[2] = {0};
- int ret = 0;
- int i = 0;
-
- ret = kionix_i2c_read(this_client,ACCEL_WHO_AM_I,rxData,1); //maybe should 2 success // -5 ioerror!!
- printk(KERN_ERR"<<<<%s ret:%d val 0x%x\n", __FUNCTION__, ret, rxData[0]);
- if (ret <= 0) // 2 ?
- {
- return -1;
- }
- for(i = 0 ; i < sizeof(kionix_chip_id)/sizeof(kionix_chip_id[0]);i++)
- if(rxData[0] == kionix_chip_id[i])
- return 0;
-
- return -1;
-}
-
-static int __devinit kionix_verify(struct kionix_accel_driver *acceld)
-{
- int retval = i2c_smbus_read_byte_data(acceld->client, ACCEL_WHO_AM_I);
-
-#if KIONIX_KMSG_INF
- switch (retval) {
- case KIONIX_ACCEL_WHO_AM_I_KXTE9:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTE9.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTF9:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTF9.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTI9_1001:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTI9-1001.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTIK_1004:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTIK-1004.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1005:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTJ9-1005.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1007:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTJ9-1007.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXCJ9_1008:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXCJ9-1008.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXTJ2-1009.\n");
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXCJK_1013:
- KMSGINF(&acceld->client->dev, "this accelerometer is a KXCJK-1013.\n");
- break;
- default:
- break;
- }
-#endif
-
- return retval;
-}
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-void kionix_accel_earlysuspend_suspend(struct early_suspend *h)
-{
- struct kionix_accel_driver *acceld = container_of(h, struct kionix_accel_driver, early_suspend);
- long remaining;
-
- mutex_lock(&acceld->mutex_earlysuspend);
-
- /* Only continue to suspend if enable did not intervene */
- if(atomic_read(&acceld->accel_suspend_continue) > 0) {
- /* Make sure that the sensor had successfully disabled before suspending it */
- if(atomic_read(&acceld->accel_enabled) > 0) {
- KMSGINF(&acceld->client->dev, "%s: waiting for disable\n", __func__);
- remaining = wait_event_interruptible_timeout(acceld->wqh_suspend, \
- atomic_read(&acceld->accel_enabled) < 1, \
- msecs_to_jiffies(KIONIX_ACCEL_EARLYSUSPEND_TIMEOUT));
-
- if(atomic_read(&acceld->accel_enabled) > 0) {
- KMSGERR(&acceld->client->dev, "%s: timeout waiting for disable\n", __func__);
- }
- }
-
- kionix_accel_power_off(acceld);
-
- atomic_set(&acceld->accel_suspended, 1);
- }
-
- mutex_unlock(&acceld->mutex_earlysuspend);
-
- return;
-}
-
-void kionix_accel_earlysuspend_resume(struct early_suspend *h)
-{
- struct kionix_accel_driver *acceld = container_of(h, struct kionix_accel_driver, early_suspend);
- int err;
-
- mutex_lock(&acceld->mutex_resume);
-
- if(atomic_read(&acceld->accel_suspended) == 1) {
- err = kionix_accel_power_on(acceld);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, "%s: kionix_accel_power_on returned err = %d\n", __func__, err);
- goto exit;
- }
-
- /* Only needs to reinitialized the registers if Vdd is pulled low during suspend */
- if(err > 0) {
- err = acceld->kionix_accel_power_on_init(acceld);
- if (err) {
- KMSGERR(&acceld->client->dev, "%s: kionix_accel_power_on_init returned err = %d\n", __func__, err);
- goto exit;
- }
- }
-
- atomic_set(&acceld->accel_suspended, 0);
- }
-
- wake_up_interruptible(&acceld->wqh_suspend);
-
-exit:
- mutex_unlock(&acceld->mutex_resume);
-
- return;
-}
-#endif /* CONFIG_HAS_EARLYSUSPEND */
-
-static int kionix_open(struct inode *inode, struct file *file)
-{
- struct kionix_accel_driver *acceld = i2c_get_clientdata(this_client);
- //KMSGINF("Open the g-sensor node...\n");
- kionix_accel_input_open(acceld->input_dev);
- return 0;
-}
-
-static int kionix_release(struct inode *inode, struct file *file)
-{
- struct kionix_accel_driver *acceld = i2c_get_clientdata(this_client);
- //KMSGINF("Close the g-sensor node...\n");
- kionix_accel_input_close(acceld->input_dev);
- return 0;
-}
-
-static long
-kionix_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- char rwbuf[5];
- short delay, enable; //amsr = -1;
- unsigned int uval = 0;
-
- struct kionix_accel_driver *acceld = i2c_get_clientdata(this_client);
-
- //KMSGINF("g-sensor ioctr...\n");
- memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- return -EFAULT;
- }
- klog("Get delay=%d\n", delay);
-
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- //l_sensorconfig.sensor_samp = 1000/delay;
- acceld->poll_interval = 1000/delay;
- acceld->poll_delay = msecs_to_jiffies(acceld->poll_interval);
- acceld->kionix_accel_update_odr(acceld, acceld->poll_interval);
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- klog("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- //KMSGINF("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- if(enable)
- kionix_accel_enable(acceld);
- else
- kionix_accel_disable(acceld);
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = KIONIX_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- //KMSGINF("kionix_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
-
- uval = (12<<8) | 8; // 8bit:4g 0xxx xx //mma8452Q
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- default:
- break;
- }
-
-
-
- return 0;
-}
-
-static struct file_operations kionix_fops = {
- .owner = THIS_MODULE,
- .open = kionix_open,
- .release = kionix_release,
- .unlocked_ioctl = kionix_ioctl,
-};
-
-
-static struct miscdevice kionix_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &kionix_fops,
-};
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
- return 0;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- return 0;
-}
-
-
-
-
-/*static int __devinit kionix_accel_probe(struct i2c_client *client,
- const struct i2c_device_id *id)*/
-static int kionix_accel_probe(struct platform_device *pdev)
-{
- const struct kionix_accel_platform_data *accel_pdata = this_client->dev.platform_data;
- struct kionix_accel_driver *acceld;
- int err;
- struct proc_dir_entry *proc_dir, *proc_entry;
-/*
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE_DATA)) {
- KMSGERR(&client->dev, "client is not i2c capable. Abort.\n");
- return -ENXIO;
- }
-*/
- if (!accel_pdata) {
- KMSGERR(&this_client->dev, "platform data is NULL. Abort.\n");
- return -EINVAL;
- }
-
- acceld = kzalloc(sizeof(*acceld), GFP_KERNEL);
- if (acceld == NULL) {
- KMSGERR(&this_client->dev, \
- "failed to allocate memory for module data. Abort.\n");
- return -ENOMEM;
- }
-
- acceld->client = this_client;
- acceld->accel_pdata = *accel_pdata;
-
- i2c_set_clientdata(this_client, acceld);
-
- err = kionix_accel_power_on(acceld);
- if (err < 0)
- goto err_free_mem;
-
- if (accel_pdata->init) {
- err = accel_pdata->init();
- if (err < 0)
- goto err_accel_pdata_power_off;
- }
-
- err = kionix_verify(acceld);
- if (err < 0) {
- KMSGERR(&acceld->client->dev, "%s: kionix_verify returned err = %d. Abort.\n", __func__, err);
- goto err_accel_pdata_exit;
- }
-
- /* Setup group specific configuration and function callback */
- switch (err) {
- case KIONIX_ACCEL_WHO_AM_I_KXTE9:
- acceld->accel_group = KIONIX_ACCEL_GRP1;
- acceld->accel_registers = kzalloc(sizeof(u8)*accel_grp1_regs_count, GFP_KERNEL);
- if (acceld->accel_registers == NULL) {
- KMSGERR(&this_client->dev, \
- "failed to allocate memory for accel_registers. Abort.\n");
- goto err_accel_pdata_exit;
- }
- acceld->accel_drdy = 0;
- acceld->kionix_accel_report_accel_data = kionix_accel_grp1_report_accel_data;
- acceld->kionix_accel_update_odr = kionix_accel_grp1_update_odr;
- acceld->kionix_accel_power_on_init = kionix_accel_grp1_power_on_init;
- acceld->kionix_accel_operate = kionix_accel_grp1_operate;
- acceld->kionix_accel_standby = kionix_accel_grp1_standby;
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTF9:
- case KIONIX_ACCEL_WHO_AM_I_KXTI9_1001:
- case KIONIX_ACCEL_WHO_AM_I_KXTIK_1004:
- case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1005:
- if(err == KIONIX_ACCEL_WHO_AM_I_KXTIK_1004)
- acceld->accel_group = KIONIX_ACCEL_GRP3;
- else
- acceld->accel_group = KIONIX_ACCEL_GRP2;
- acceld->accel_registers = kzalloc(sizeof(u8)*accel_grp2_regs_count, GFP_KERNEL);
- if (acceld->accel_registers == NULL) {
- KMSGERR(&this_client->dev, \
- "failed to allocate memory for accel_registers. Abort.\n");
- goto err_accel_pdata_exit;
- }
- switch(acceld->accel_pdata.accel_res) {
- case KIONIX_ACCEL_RES_6BIT:
- case KIONIX_ACCEL_RES_8BIT:
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_RES_8BIT;
- break;
- case KIONIX_ACCEL_RES_12BIT:
- default:
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_RES_12BIT;
- break;
- }
- if(acceld->accel_pdata.accel_irq_use_drdy && this_client->irq) {
- acceld->accel_registers[accel_grp2_int_ctrl] |= ACCEL_GRP2_IEN | ACCEL_GRP2_IEA;
- acceld->accel_registers[accel_grp2_ctrl_reg1] |= ACCEL_GRP2_DRDYE;
- acceld->accel_drdy = 1;
- }
- else
- acceld->accel_drdy = 0;
- kionix_accel_grp2_update_g_range(acceld);
- acceld->kionix_accel_report_accel_data = kionix_accel_grp2_report_accel_data;
- acceld->kionix_accel_update_odr = kionix_accel_grp2_update_odr;
- acceld->kionix_accel_power_on_init = kionix_accel_grp2_power_on_init;
- acceld->kionix_accel_operate = kionix_accel_grp2_operate;
- acceld->kionix_accel_standby = kionix_accel_grp2_standby;
- break;
- case KIONIX_ACCEL_WHO_AM_I_KXTJ9_1007:
- case KIONIX_ACCEL_WHO_AM_I_KXCJ9_1008:
- case KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009:
- case KIONIX_ACCEL_WHO_AM_I_KXCJK_1013:
- if(err == KIONIX_ACCEL_WHO_AM_I_KXTJ2_1009)
- acceld->accel_group = KIONIX_ACCEL_GRP5;
- else if(err == KIONIX_ACCEL_WHO_AM_I_KXCJK_1013)
- acceld->accel_group = KIONIX_ACCEL_GRP6;
- else
- acceld->accel_group = KIONIX_ACCEL_GRP4;
- acceld->accel_registers = kzalloc(sizeof(u8)*accel_grp4_regs_count, GFP_KERNEL);
- if (acceld->accel_registers == NULL) {
- KMSGERR(&this_client->dev, \
- "failed to allocate memory for accel_registers. Abort.\n");
- goto err_accel_pdata_exit;
- }
- switch(acceld->accel_pdata.accel_res) {
- case KIONIX_ACCEL_RES_6BIT:
- case KIONIX_ACCEL_RES_8BIT:
- acceld->shift = 0;
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_RES_8BIT;
- break;
- case KIONIX_ACCEL_RES_12BIT:
- acceld->shift = 4;
- default:
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_RES_12BIT;
- break;
- }
- if(acceld->accel_pdata.accel_irq_use_drdy && this_client->irq) {
- acceld->accel_registers[accel_grp4_int_ctrl] |= ACCEL_GRP4_IEN | ACCEL_GRP4_IEA;
- acceld->accel_registers[accel_grp4_ctrl_reg1] |= ACCEL_GRP4_DRDYE;
- acceld->accel_drdy = 1;
- }
- else
- acceld->accel_drdy = 0;
- kionix_accel_grp4_update_g_range(acceld);
- acceld->kionix_accel_report_accel_data = kionix_accel_grp4_report_accel_data;
- acceld->kionix_accel_update_odr = kionix_accel_grp4_update_odr;
- acceld->kionix_accel_power_on_init = kionix_accel_grp4_power_on_init;
- acceld->kionix_accel_operate = kionix_accel_grp4_operate;
- acceld->kionix_accel_standby = kionix_accel_grp4_standby;
- break;
- default:
- KMSGERR(&acceld->client->dev, \
- "%s: unsupported device, who am i = %d. Abort.\n", __func__, err);
- goto err_accel_pdata_exit;
- }
-
- err = kionix_accel_setup_input_device(acceld);
- if (err)
- goto err_free_accel_registers;
-
-//add
- /*this_pdev = pdev;
- l_sensorconfig.input_dev = acceld->input_dev;*/
-
- err = misc_register(&kionix_device);
- if (err) {
- printk(KERN_ERR
- "kionix_accel_probe: kionix_device register failed\n");
- goto exit_misc_device_register_failed;
- }
-
- //dev_set_drvdata(&pdev->dev, &l_sensorconfig);
-//end add
-
-
- atomic_set(&acceld->accel_suspended, 0);
- atomic_set(&acceld->accel_suspend_continue, 1);
- atomic_set(&acceld->accel_enabled, 0);
- atomic_set(&acceld->accel_input_event, 0);
- atomic_set(&acceld->accel_enable_resume, 0);
-
- mutex_init(&acceld->mutex_earlysuspend);
- mutex_init(&acceld->mutex_resume);
-
- mutex_init(&acceld->mutex_subinput);//add 2014-6-12
-
- rwlock_init(&acceld->rwlock_accel_data);
-
- acceld->poll_interval = acceld->accel_pdata.poll_interval;
- acceld->poll_delay = msecs_to_jiffies(acceld->poll_interval);
- acceld->kionix_accel_update_odr(acceld, acceld->poll_interval);
- get_axisset(acceld);//kionix_accel_update_direction(acceld);
-
- proc_dir = proc_mkdir("sensors", NULL);
- if (proc_dir == NULL)
- KMSGERR(&this_client->dev, "failed to create /proc/sensors\n");
- else {
- proc_entry = create_proc_entry( "accelinfo", 0644, proc_dir);
- if (proc_entry == NULL)
- KMSGERR(&this_client->dev, "failed to create /proc/cpu/accelinfo\n");
- }
-
-/*
- proc_dir = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL);//&proc_root
- if (proc_dir != NULL)
- {
- proc_dir->write_proc = sensor_writeproc;
- proc_dir->read_proc = sensor_readproc;
- }
-*/
- acceld->accel_workqueue = create_singlethread_workqueue("Kionix Accel Workqueue");
- INIT_DELAYED_WORK(&acceld->accel_work, kionix_accel_work);
- init_waitqueue_head(&acceld->wqh_suspend);
-
- if (acceld->accel_drdy) {
- err = request_threaded_irq(this_client->irq, NULL, kionix_accel_isr, \
- IRQF_TRIGGER_RISING | IRQF_ONESHOT, \
- KIONIX_ACCEL_IRQ, acceld);
- if (err) {
- KMSGERR(&acceld->client->dev, "%s: request_threaded_irq returned err = %d\n", __func__, err);
- KMSGERR(&acceld->client->dev, "%s: running in software polling mode instead\n", __func__);
- acceld->accel_drdy = 0;
- }
- KMSGINF(&acceld->client->dev, "running in hardware interrupt mode\n");
- } else {
- KMSGINF(&acceld->client->dev, "running in software polling mode\n");
- }
-
- err = acceld->kionix_accel_power_on_init(acceld);
- if (err) {
- KMSGERR(&acceld->client->dev, "%s: kionix_accel_power_on_init returned err = %d. Abort.\n", __func__, err);
- goto err_free_irq;
- }
-
- err = sysfs_create_group(&this_client->dev.kobj, &kionix_accel_attribute_group);
- if (err) {
- KMSGERR(&acceld->client->dev, "%s: sysfs_create_group returned err = %d. Abort.\n", __func__, err);
- goto err_free_irq;
- }
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- /* The higher the level, the earlier it resume, and the later it suspend */
- acceld->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 50;
- acceld->early_suspend.suspend = kionix_accel_earlysuspend_suspend;
- acceld->early_suspend.resume = kionix_accel_earlysuspend_resume;
- register_early_suspend(&acceld->early_suspend);
-#endif /* CONFIG_HAS_EARLYSUSPEND */
-
-
- // satrt the polling work
- if(acceld->accel_drdy == 0)
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, acceld->poll_delay);
- return 0;
-
-exit_misc_device_register_failed:
-err_free_irq:
- if (acceld->accel_drdy)
- free_irq(this_client->irq, acceld);
- destroy_workqueue(acceld->accel_workqueue);
- input_unregister_device(acceld->input_dev);
-err_free_accel_registers:
- kfree(acceld->accel_registers);
-err_accel_pdata_exit:
- if (accel_pdata->exit)
- accel_pdata->exit();
-err_accel_pdata_power_off:
- kionix_accel_power_off(acceld);
-err_free_mem:
- kfree(acceld);
-exit_input_dev_alloc_failed:
- return err;
-}
-
-static int kionix_accel_remove(struct platform_device *pdev)
-{
- struct kionix_accel_driver *acceld = i2c_get_clientdata(this_client);
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- unregister_early_suspend(&acceld->early_suspend);
-#endif /* CONFIG_HAS_EARLYSUSPEND */
- if (NULL != acceld->accel_workqueue)
- {
- cancel_delayed_work_sync(&acceld->accel_work);
- flush_workqueue(acceld->accel_workqueue);
- destroy_workqueue(acceld->accel_workqueue);
- acceld->accel_workqueue = NULL;
- }
- sysfs_remove_group(&this_client->dev.kobj, &kionix_accel_attribute_group);
- if (acceld->accel_drdy)
- free_irq(this_client->irq, acceld);
- //destroy_workqueue(acceld->accel_workqueue);
- misc_deregister(&kionix_device);
- input_unregister_device(acceld->input_dev);
- kfree(acceld->accel_registers);
- if (acceld->accel_pdata.exit)
- acceld->accel_pdata.exit();
- kionix_accel_power_off(acceld);
- kfree(acceld);
-
- return 0;
-}
-
-static int __devexit kionix_accel_i2cremove(struct i2c_client *client)
-{
- return 0;
-}
-
-static const struct i2c_device_id kionix_accel_id[] = {
- { KIONIX_ACCEL_NAME, 0 },
- { },
-};
-
-MODULE_DEVICE_TABLE(i2c, kionix_accel_id);
-
-static struct i2c_driver kionix_accel_driver = {
- .driver = {
- .name = KIONIX_ACCEL_NAME,
- .owner = THIS_MODULE,
- },
- .probe = kionix_accel_probe,
- .remove = __devexit_p(kionix_accel_i2cremove),
- .id_table = kionix_accel_id,
-};
-
-
-static struct platform_device kionix_pdevice = {
- .name = "kionix",
- .id = 0,
- /*.dev = {
- //.release = mma8452q_platform_release,
- },*/
-};
-
-//************
-static void kionix_accel_shutdown(struct platform_device *pdev)
-{
- struct kionix_accel_driver *acceld = NULL;
- acceld = i2c_get_clientdata(this_client);
- if (acceld) {
- printk("<<<<<%s\n", __func__);
- flush_delayed_work_sync(&acceld->accel_work);
- cancel_delayed_work_sync(&acceld->accel_work);
- }
-
-}
-//****add for resume dpm timeout 2014-6-12
-static int kionix_accel_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct kionix_accel_driver *acceld = NULL;
- acceld = i2c_get_clientdata(this_client);
- if (acceld) {
- printk("<<<<<%s\n", __func__);
- flush_delayed_work_sync(&acceld->accel_work);
- cancel_delayed_work_sync(&acceld->accel_work);
- }
-}
-
-int kionix_accel_resume(struct platform_device *pdev)
-{
- struct kionix_accel_driver *acceld = NULL;
- acceld = i2c_get_clientdata(this_client);
- if (acceld) {
- printk("<<<<<%s\n", __func__);
- queue_delayed_work(acceld->accel_workqueue, &acceld->accel_work, acceld->poll_delay);
- }
-}
-//***********************
-static struct platform_driver kionix_driver = {
- .probe = kionix_accel_probe,
- .remove = kionix_accel_remove,
- .shutdown = kionix_accel_shutdown,
- .suspend = kionix_accel_suspend,
- .resume = kionix_accel_resume,
- .driver = {
- .name = "kionix",
- },
-};
-
-
-static struct class* l_dev_class = NULL;
-static struct device *l_clsdevice = NULL;
-static int __init kionix_accel_init(void)
-{
- //return i2c_add_driver(&kionix_accel_driver);
-
- int ret = 0;
- struct kionix_accel_driver *acceld;
-
- acceld = kzalloc(sizeof(*acceld), GFP_KERNEL);
- if (acceld == NULL) {
- printk("%s kzalloc fail!\n", __func__);
- return -ENOMEM;
- }
-
- ret = get_axisset(acceld);//
- if (ret < 0)
- {
- printk("%s user choose to no sensor chip!\n", __func__);
- kfree(acceld);
- return ret;
- }
- kfree(acceld);
-
- if (!(this_client = sensor_i2c_register_device2(0, KIONIX_ACCEL_I2C_ADDR, KIONIX_ACCEL_NAME,(void*)(&kionix_accel_pdata))))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
-
-
- if(iskionix())
- {
- printk(KERN_ERR "Can't find kionix!!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
- //ret = get_axisset(NULL);
-
- printk("kionix g-sensor driver init\n");
-
- //spin_lock_init(&l_sensorconfig.spinlock);
- l_dev_class = class_create(THIS_MODULE, KIONIX_ACCEL_NAME);
- //for S40 module to judge whether insmod is ok
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- l_clsdevice = device_create(l_dev_class, NULL, MKDEV(GSENSOR_MAJOR, 0), NULL, KIONIX_ACCEL_NAME);
- if (IS_ERR(l_clsdevice)){
- ret = PTR_ERR(l_clsdevice);
- printk(KERN_ERR "Failed to create device %s !!!",KIONIX_ACCEL_NAME);
- return ret;
- }
-
- if((ret = platform_device_register(&kionix_pdevice)))
- {
- printk(KERN_ERR "%s Can't register kionix platform devcie!!!\n", __FUNCTION__);
- return ret;
- }
- if ((ret = platform_driver_register(&kionix_driver)) != 0)
- {
- printk(KERN_ERR "%s Can't register kionix platform driver!!!\n", __FUNCTION__);
- return ret;
- }
-
- return 0;
-
-}
-module_init(kionix_accel_init);
-
-static void __exit kionix_accel_exit(void)
-{
- //i2c_del_driver(&kionix_accel_driver);
- platform_driver_unregister(&kionix_driver);
- platform_device_unregister(&kionix_pdevice);
-
- device_destroy(l_dev_class, MKDEV(GSENSOR_MAJOR, 0));
-
- class_destroy(l_dev_class);
- sensor_i2c_unregister_device(this_client);
-}
-module_exit(kionix_accel_exit);
-
-MODULE_DESCRIPTION("Kionix accelerometer driver");
-MODULE_AUTHOR("Kuching Tan <kuchingtan@kionix.com>");
-MODULE_LICENSE("GPL");
-MODULE_VERSION("3.3.0");
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.h b/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.h
deleted file mode 100755
index b7be9b8f..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kionix_gsensor/kionix_accel.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/* include/linux/input/kionix_accel.h - Kionix accelerometer driver
- *
- * Copyright (C) 2012 Kionix, Inc.
- * Written by Kuching Tan <kuchingtan@kionix.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __KIONIX_ACCEL_H__
-#define __KIONIX_ACCEL_H__
-
-#define KIONIX_ACCEL_I2C_ADDR 0x0E
-#define KIONIX_ACCEL_NAME "kionix_accel"
-#define KIONIX_ACCEL_IRQ "kionix-irq"
-
-struct kionix_accel_platform_data {
- /* Although the accelerometer can perform at high ODR,
- * there is a need to keep the maximum ODR to a lower
- * value due to power consumption or other concern.
- * Use this variable to set the minimum allowable
- * interval for data to be reported from the
- * accelerometer. Unit is measured in milli-
- * seconds. Recommended value is 5ms. */
- unsigned int min_interval;
- /* Use this variable to set the default interval for
- * data to be reported from the accelerometer. This
- * value will be used during driver setup process,
- * but can be changed by the system during runtime via
- * sysfs control. Recommended value is 200ms.*/
- unsigned int poll_interval;
-
- /* This variable controls the corresponding direction
- * of the accelerometer that is mounted on the board
- * of the device. Refer to the porting guide for
- * details. Valid value is 1 to 8. */
- u8 accel_direction;
-
- /* Use this variable to choose whether or not to use
- * DRDY hardware interrupt mode to trigger a data
- * report event instead of using software polling.
- * Note that for those accelerometer model that does
- * not support DRDY hardware interrupt, the driver
- * will revert to software polling mode automatically.
- * Valid value is 0 or 1.*/
- bool accel_irq_use_drdy;
-
- /* Use this variable to control the number of
- * effective bits of the accelerometer output.
- * Use the macro definition to select the desired
- * number of effective bits. */
- #define KIONIX_ACCEL_RES_12BIT 0
- #define KIONIX_ACCEL_RES_8BIT 1
- #define KIONIX_ACCEL_RES_6BIT 2
- u8 accel_res;
-
- /* Use this variable to control the G range of
- * the accelerometer output. Use the macro definition
- * to select the desired G range.*/
- #define KIONIX_ACCEL_G_2G 0
- #define KIONIX_ACCEL_G_4G 1
- #define KIONIX_ACCEL_G_6G 2
- #define KIONIX_ACCEL_G_8G 3
- u8 accel_g_range;
-
- /* Optional callback functions that can be implemented
- * on per product basis. If these callbacks are defined,
- * they will be called by the driver. */
- int (*init)(void);
- void (*exit)(void);
- int (*power_on)(void);
- int (*power_off)(void);
-};
-#endif /* __KIONIX_ACCEL_H__ */
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/Makefile
deleted file mode 100755
index 23eca917..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_kxte9
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := kxte9.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.c b/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.c
deleted file mode 100755
index 2f25a4f8..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.c
+++ /dev/null
@@ -1,1798 +0,0 @@
-/* drivers/i2c/chips/kxte9.c - KXTE9 accelerometer driver
- *
- * Copyright (C) 2010 Kionix, Inc.
- * Written by Kuching Tan <kuchingtan@kionix.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-#include <linux/fs.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/uaccess.h>
-#include <linux/workqueue.h>
-#include <linux/irq.h>
-#include <linux/gpio.h>
-#include <linux/interrupt.h>
-#include <linux/slab.h>
-//#include <linux/kxte9.h>
-#include <linux/platform_device.h>
-#include <linux/miscdevice.h>
-#include <mach/hardware.h>
-#include "kxte9.h"
-//#include <linux/earlysuspend.h>
-#include <mach/wmt-i2c-bus.h>
-
-#define NAME "kxte9"
-#define G_MAX 2000
-/* OUTPUT REGISTERS */
-#define CT_RESP 0x0C
-#define WHO_AM_I 0x0F
-#define TILT_POS_CUR 0x10
-#define TILT_POS_PRE 0x11
-#define XOUT 0x12
-#define INT_STATUS_REG 0x16
-#define INT_SRC_REG2 0x17
-#define INT_REL 0x1A
-/* CONTROL REGISTERS */
-#define CTRL_REG1 0x1B
-#define CTRL_REG2 0x1C
-#define CTRL_REG3 0x1D
-#define INT_CTRL1 0x1E
-#define INT_CTRL2 0x1F
-#define TILT_TIMER 0x28
-#define WUF_TIMER 0x29
-#define B2S_TIMER 0x2A
-#define WUF_THRESH 0x5A
-#define B2S_THRESH 0x5B
-/* CTRL_REG1 BITS */
-#define PC1_OFF 0x00
-#define PC1_ON 0x80
-/* INT_SRC_REG2 BITS */
-#define TPS 0x01
-#define WUFS 0x02
-#define B2SS 0x04
-/* Direction Mask */
-/* Used for TILT_POS_CUR, TILT_POS_PRE */
-/* INT_SRC_REG1, CTRL_REG2 */
-#define DIR_LE 0x20
-#define DIR_RI 0x10
-#define DIR_DO 0x08
-#define DIR_UP 0x04
-#define DIR_FD 0x02
-#define DIR_FU 0x01
-/* ODR MASKS */
-#define ODRM 0x18 // CTRL_REG1
-#define OWUFM 0x03 // CTRL_REG3
-#define OB2SM 0x0C // CTRL_REG3
-/* INPUT_ABS CONSTANTS */
-#define FUZZ 32
-#define FLAT 32
-/* RESUME STATE INDICES */
-#define RES_CTRL_REG1 0
-#define RES_CTRL_REG3 1
-#define RES_INT_CTRL1 2
-#define RES_TILT_TIMER 3
-#define RES_WUF_TIMER 4
-#define RES_B2S_TIMER 5
-#define RES_WUF_THRESH 6
-#define RES_B2S_THRESH 7
-#define RES_CURRENT_ODR 8
-#define RESUME_ENTRIES 9
-/* OFFSET and SENSITIVITY */
-//#define OFFSET 32 //6-bit
-#define OFFSET 128 //8-bit
-#define SENS 16
-
-#define IOCTL_BUFFER_SIZE 64
-
-//#define WM3445_A0
-//#define INT_MODE
-
-//////////////////////////////////////////////////////////////////////////
-//#define DEBUG_WMT_GSENSOR
-#ifdef DEBUG_WMT_GSENSOR
-#define kxte9_dbg(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__ , ## args)
-//#define kxte9_dbg(fmt, args...) if (kpadall_isrundbg()) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-#else
-#define kxte9_dbg(fmt, args...)
-#endif
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_DEBUG "[%s]: " fmt, __FUNCTION__, ## args)
-//////////////////////////////////////////////////////////////////////////
-
-/*
- * The following table lists the maximum appropriate poll interval for each
- * available output data rate.
- */
-struct {
- unsigned int interval;
- u8 mask;
-} kxte9_odr_table[] = {
- {1000, ODR1E},
- {334, ODR3E},
- {100, ODR10E},
- {25, ODR40E},
- {8, ODR125E},
-};
-
-struct kxte9_data {
- //struct i2c_client *client;
- struct kxte9_platform_data *pdata;
- struct mutex lock;
- struct delayed_work input_work;
- struct input_dev *input_dev;
-#ifdef INT_MODE
- struct work_struct irq_work;
-#endif
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
- int hw_initialized;
- atomic_t enabled;
- u8 resume[RESUME_ENTRIES];
- int i2c_xfer_complete;
- int suspend;
-};
-
-struct gsensor_config
-{
- int op;
- int samp;
- int xyz_axis[3][3]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- int sensorlevel;
- unsigned int avg_count;
- unsigned int kxte9_8bit;
- int name;
- int bmp;
- unsigned int ctraddr;
- unsigned int ocaddr;
- unsigned int idaddr;
- unsigned int peaddr;
- unsigned int pcaddr;
- unsigned int itbmp;
- unsigned int itaddr;
- unsigned int isbmp;
- unsigned int isaddr;
- int irq;
-};
-
-static struct gsensor_config gconf = {
- .op = 0,
- .samp = 40,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .avg_count = 4,
- .kxte9_8bit = 1,
- .name = 3,
-#ifdef WM3445_A0
- .bmp = 0x100, /* GPIO 8 */
- .ctraddr = GPIO_BASE_ADDR + 0x40,
- .ocaddr = GPIO_BASE_ADDR + 0x80,
- .idaddr = GPIO_BASE_ADDR + 0x00,
- .peaddr = GPIO_BASE_ADDR + 0x480,
- .pcaddr = GPIO_BASE_ADDR + 0x4c0,
- .itbmp = 0x30000, /* Rising Edge */
- .itaddr = GPIO_BASE_ADDR + 0x300,
- .isbmp = 0x100,
- .isaddr = GPIO_BASE_ADDR + 0x304,
- .irq = IRQ_GPIO8,
-#else
- .bmp = 0x8, /* GPIO 3 */
- .ctraddr = GPIO_BASE_ADDR + 0x40,
- .ocaddr = GPIO_BASE_ADDR + 0x80,
- .idaddr = GPIO_BASE_ADDR + 0x00,
- .peaddr = GPIO_BASE_ADDR + 0x480,
- .pcaddr = GPIO_BASE_ADDR + 0x4c0,
- .itbmp = 0x83000000, /* Rising Edge */
- .itaddr = GPIO_BASE_ADDR + 0x300,
- .isbmp = 0x8,
- .isaddr = GPIO_BASE_ADDR + 0x320,
- .irq = 5,
-#endif
-};
-
-static struct kxte9_platform_data kxte9_pdata = {
- .min_interval = 1,
- .poll_interval = 100,
- .ctrl_reg1_init = ODR10E & ~B2SE & ~WUFE & ~TPE,
- .engine_odr_init = OB2S1 | OWUF1,
- .int_ctrl_init = KXTE9_IEA,
- .tilt_timer_init = 0x00,
- .wuf_timer_init = 0x00,
- .wuf_thresh_init = 0x20,
- .b2s_timer_init = 0x00,
- .b2s_thresh_init = 0x60,
-};
-
-#ifdef WM3445_A0
-#define SET_GPIO_GSENSOR_INT() {\
- REG32_VAL(gconf.ctraddr) &= ~gconf.bmp; \
- REG32_VAL(gconf.ocaddr) &= ~gconf.bmp; \
- REG32_VAL(gconf.peaddr) |= gconf.bmp; \
- REG32_VAL(gconf.pcaddr) &= ~gconf.bmp; \
- REG32_VAL(gconf.itaddr) |= gconf.itbmp; \
- REG32_VAL(GPIO_BASE_ADDR + 0x308) |= gconf.bmp; \
- REG32_VAL(gconf.isaddr) |= gconf.isbmp; \
-}
-#define ENABLE_SENSOR_INT(enable) { \
- if (enable) \
- {\
- REG32_VAL(GPIO_BASE_ADDR + 0x308) &= ~gconf.bmp; \
- } else {\
- REG32_VAL(GPIO_BASE_ADDR + 0x308) |= gconf.bmp; \
- }\
-}
-
-#else
-#define SET_GPIO_GSENSOR_INT() {\
- REG32_VAL(gconf.ctraddr) |= gconf.bmp; \
- REG32_VAL(gconf.ocaddr) &= ~gconf.bmp; \
- REG32_VAL(gconf.pcaddr) &= ~gconf.bmp; \
- REG32_VAL(gconf.itaddr) |= gconf.itbmp; \
- REG32_VAL(gconf.isaddr) |= gconf.isbmp; \
-}
-#endif
-
-#define X_CONVERT(x) x*gconf.xyz_axis[ABS_X][1]
-#define Y_CONVERT(y) y*gconf.xyz_axis[ABS_Y][1]
-#define Z_CONVERT(z) z*gconf.xyz_axis[ABS_Z][1]
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void kxte9_early_suspend(struct early_suspend *h);
-static void kxte9_late_resume(struct early_suspend *h);
-#endif
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-//extern int wmt_i2c_xfer_continue_if_4(struct i2c_msg *msg, unsigned int num, int bus_id);
-extern int i2c_api_do_send(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-extern int i2c_api_do_recv(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-extern unsigned int wmt_read_oscr(void);
-
-static struct kxte9_data *te9 = NULL;
-static atomic_t kxte9_dev_open_count;
-static struct kobject *android_gsensor_kobj = NULL;
-static void kxte9_read_callback(void *data);
-struct i2c_msg *kxte9_msg;
-unsigned char *i2c_read_buf;
-unsigned char *i2c_write_buf;
-static struct timer_list kxte9_timer;
-static unsigned char *x_count;
-static unsigned char *y_count;
-static unsigned char *z_count;
-static unsigned int x_total = 0, y_total = 0, z_total = 0;
-static unsigned int xyz_index = 0;
-
-static int wait_i2c_xfer_complete(void)
-{
- unsigned int now_time = 0;
- unsigned int delay_time = 0;
-
- now_time = wmt_read_oscr();
- while (!te9->i2c_xfer_complete) {
- delay_time = wmt_read_oscr() - now_time;
- if (delay_time > 60000) {//20ms
- printk(KERN_WARNING "[kxte9] transfer timeout!\n");
- return 0;
- }
- }
- return 1;
-}
-
-static void kxte9_read_callback(void *data)
-{
- int xyz[3];
-
- if (te9->suspend) {
- te9->i2c_xfer_complete = 1;
- return;
- }
- if (xyz_index >= gconf.avg_count)
- xyz_index = 0;
- x_total -= x_count[xyz_index];
- y_total -= y_count[xyz_index];
- z_total -= z_count[xyz_index];
- if (gconf.kxte9_8bit) {
- x_count[xyz_index] = i2c_read_buf[0];
- y_count[xyz_index] = i2c_read_buf[1];
- z_count[xyz_index] = i2c_read_buf[2];
- } else {
- x_count[xyz_index] = i2c_read_buf[0] & ~0x03;
- y_count[xyz_index] = i2c_read_buf[1] & ~0x03;
- z_count[xyz_index] = i2c_read_buf[2] & ~0x03;
- }
- x_total += x_count[xyz_index];
- y_total += y_count[xyz_index];
- z_total += z_count[xyz_index];
- xyz[ABS_X] = (x_total/gconf.avg_count - OFFSET) << 4;
- xyz[ABS_Y] = (y_total/gconf.avg_count - OFFSET) << 4;
- xyz[ABS_Z] = (z_total/gconf.avg_count - OFFSET) << 4;
- //printk(KERN_DEBUG " [%d] x:%d y:%d z:%d\n", xyz_index, x_count[xyz_index], y_count[xyz_index], z_count[xyz_index]);
- //printk(KERN_DEBUG " total x:%d y:%d z:%d\n", x_total, y_total, z_total);
- //printk(KERN_DEBUG " avg x:%d y:%d z:%d\n", x_total/gconf.avg_count, y_total/gconf.avg_count, z_total/gconf.avg_count);
- //printk(KERN_DEBUG "report x:%d y:%d z:%d\n", xyz[ABS_X], xyz[ABS_Y], xyz[ABS_Z]);
- xyz_index++;
- input_report_abs(te9->input_dev, ABS_X, X_CONVERT(xyz[gconf.xyz_axis[ABS_X][0]]));
- input_report_abs(te9->input_dev, ABS_Y, Y_CONVERT(xyz[gconf.xyz_axis[ABS_Y][0]]));
- input_report_abs(te9->input_dev, ABS_Z, Z_CONVERT(xyz[gconf.xyz_axis[ABS_Z][0]]));
- input_sync(te9->input_dev);
- te9->i2c_xfer_complete = 1;
- mod_timer(&kxte9_timer, jiffies + msecs_to_jiffies(te9->pdata->poll_interval));
-}
-
-static void kxte9_read_data(u8 addr, int len)
-{
- i2c_write_buf[0] = addr;
- kxte9_msg[0].addr = KXTE9_I2C_ADDR;
- kxte9_msg[0].flags = 0 ;
- kxte9_msg[0].len = 1;
- kxte9_msg[0].buf = i2c_write_buf;
- kxte9_msg[1].addr = KXTE9_I2C_ADDR;
- kxte9_msg[1].flags = I2C_M_RD;
- kxte9_msg[1].len = len;
- kxte9_msg[1].buf = i2c_read_buf;
- wmt_i2c_transfer(kxte9_msg, 2, 0, kxte9_read_callback, 0);
-}
-
-static int kxte9_i2c_read(u8 addr, u8 *data, int len)
-{
-/*
- int err;
-
- struct i2c_msg msgs[] = {
- {
- .addr = KXTE9_I2C_ADDR,
- .flags = 0 & ~(I2C_M_RD), //te9->client->flags & I2C_M_TEN,
- .len = 1,
- .buf = &addr,
- },
- {
- .addr = KXTE9_I2C_ADDR, //te9->client->addr,
- .flags = (I2C_M_RD), //(te9->client->flags & I2C_M_TEN) | I2C_M_RD,
- .len = len,
- .buf = data,
- },
- };
- err = wmt_i2c_xfer_continue_if_4(msgs, 2, 0);
-
- if(err != 2)
- errlog("read transfer error\n");
- else
- err = 0;
-
- return err;
-*/
- int ret;
- ret = i2c_api_do_recv(0, KXTE9_I2C_ADDR, addr, data, len);
- if (ret <= 0) {
- errlog("i2c_api_do_recv error!\n");
- return -1;
- }
- return 0;
-}
-
-static int kxte9_i2c_write(u8 addr, u8 *data, int len)
-{
-/*
- int err;
- int i;
- u8 buf[len + 1];
-
- struct i2c_msg msgs[] = {
- {
- .addr = KXTE9_I2C_ADDR, //te9->client->addr,
- .flags = 0 & ~(I2C_M_RD), //te9->client->flags & I2C_M_TEN,
- .len = len + 1,
- .buf = buf,
- },
- };
-
- buf[0] = addr;
- for (i = 0; i < len; i++)
- buf[i + 1] = data[i];
-
- err = wmt_i2c_xfer_continue_if_4(msgs, 1, 0);
- if(err != 1)
- errlog("write transfer error\n");
- else
- err = 0;
- return err;
-*/
- int ret;
- ret = i2c_api_do_send(0, KXTE9_I2C_ADDR, addr, data, len);
- if (ret <= 0) {
- errlog("i2c_api_do_send error!\n");
- return -1;
- }
- return 0;
-
-}
-
-int kxte9_get_bits(u8 reg_addr, u8* bits_value, u8 bits_mask)
-{
- int err;
- u8 reg_data;
-
- err = kxte9_i2c_read(reg_addr, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", reg_addr, reg_data, err);
- if(err < 0)
- return err;
-
- *bits_value = reg_data & bits_mask;
-
- return 1;
-}
-
-int kxte9_get_byte(u8 reg_addr, u8* reg_value)
-{
- int err;
- u8 reg_data;
-
- err = kxte9_i2c_read(reg_addr, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", reg_addr, reg_data, err);
- if(err < 0)
- return err;
-
- *reg_value = reg_data;
-
- return 1;
-}
-
-int kxte9_set_bits(int res_index, u8 reg_addr, u8 bits_value, u8 bits_mask)
-{
- int err=0, err1=0, retval=0;
- u8 reg_data = 0x00, reg_bits = 0x00, bits_set = 0x00;
-
- // Turn off PC1
- reg_data = te9->resume[RES_CTRL_REG1] & ~PC1_ON;
-
- err = kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, reg_data, err);
- if(err < 0)
- goto exit0;
-
- // Read from device register
- err = kxte9_i2c_read(reg_addr, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", reg_addr, reg_data, err);
- if(err < 0)
- goto exit0;
-
- // Apply mask to device register;
- reg_bits = reg_data & bits_mask;
-
- // Update resume state data
- bits_set = bits_mask & bits_value;
- te9->resume[res_index] &= ~bits_mask;
- te9->resume[res_index] |= bits_set;
-
- // Return 0 if value in device register and value to be written is the same
- if(reg_bits == bits_set)
- retval = 0;
- // Else, return 1
- else
- retval = 1;
-
- // Write to device register
- err = kxte9_i2c_write(reg_addr, &te9->resume[res_index], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", reg_addr, te9->resume[res_index], err);
- if(err < 0)
- goto exit0;
-
-exit0:
- // Turn on PC1
- reg_data = te9->resume[RES_CTRL_REG1] | PC1_ON;
-
- err1 = kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, reg_data, err);
- if(err1 < 0)
- return err1;
-
- if(err < 0)
- return err;
-
- return retval;
-}
-
-int kxte9_set_byte(int res_index, u8 reg_addr, u8 reg_value)
-{
- int err, err1, retval=0;
- u8 reg_data;
-
- // Turn off PC1
- reg_data = te9->resume[RES_CTRL_REG1] & ~PC1_ON;
-
- err = kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, reg_data, err);
- if(err < 0)
- goto exit0;
-
- // Read from device register
- err = kxte9_i2c_read(reg_addr, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", reg_addr, reg_data, err);
- if(err < 0)
- goto exit0;
-
- // Update resume state data
- te9->resume[res_index] = reg_value;
-
- // Return 0 if value in device register and value to be written is the same
- if(reg_data == reg_value)
- retval = 0;
- // Else, return 1
- else
- retval = 1;
-
- // Write to device register
- err = kxte9_i2c_write(reg_addr, &te9->resume[res_index], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", reg_addr, te9->resume[res_index], err);
- if(err < 0)
- goto exit0;
-
-exit0:
- // Turn on PC1
- reg_data = te9->resume[RES_CTRL_REG1] | PC1_ON;
- err1 = kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, reg_data, err);
- if(err1 < 0)
- return err1;
-
- if(err < 0)
- return err;
-
- return retval;
-}
-
-int kxte9_set_pc1_off(void)
-{
- u8 reg_data;
-
- reg_data = te9->resume[RES_CTRL_REG1] & ~PC1_ON;
-
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1)\n", CTRL_REG1, reg_data);
- return kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
-}
-
-int kxte9_set_pc1_on(void)
-{
- u8 reg_data;
-
- reg_data = te9->resume[RES_CTRL_REG1] | PC1_ON;
-
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1)\n", CTRL_REG1, reg_data);
- return kxte9_i2c_write(CTRL_REG1, &reg_data, 1);
-}
-
-static int kxte9_verify(void)
-{
- int err;
- u8 buf;
-
- err = kxte9_i2c_read(WHO_AM_I, &buf, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", WHO_AM_I, buf, err);
- if(err < 0)
- errlog( "read err int source\n");
- if(buf != 0)
- err = -1;
- return err;
-}
-
-static int kxte9_hw_init(void)
-{
- int err;
- u8 buf = PC1_OFF;
-
- err = kxte9_i2c_write(CTRL_REG1, &buf, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, buf, err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(CTRL_REG3, &te9->resume[RES_CTRL_REG3], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG3, te9->resume[RES_CTRL_REG3], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(INT_CTRL1, &te9->resume[RES_INT_CTRL1], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", INT_CTRL1, te9->resume[RES_INT_CTRL1], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(TILT_TIMER, &te9->resume[RES_TILT_TIMER], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", TILT_TIMER, te9->resume[RES_TILT_TIMER], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(WUF_TIMER, &te9->resume[RES_WUF_TIMER], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", WUF_TIMER, te9->resume[RES_WUF_TIMER], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(B2S_TIMER, &te9->resume[RES_B2S_TIMER], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", B2S_TIMER, te9->resume[RES_B2S_TIMER], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(WUF_THRESH, &te9->resume[RES_WUF_THRESH], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", WUF_THRESH, te9->resume[RES_WUF_THRESH], err);
- if(err < 0)
- return err;
- err = kxte9_i2c_write(B2S_THRESH, &te9->resume[RES_B2S_THRESH], 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", B2S_THRESH, te9->resume[RES_B2S_THRESH], err);
- if(err < 0)
- return err;
- buf = te9->resume[RES_CTRL_REG1] | PC1_ON;
- err = kxte9_i2c_write(CTRL_REG1, &buf, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, buf, err);
- if(err < 0)
- return err;
-
- te9->resume[RES_CTRL_REG1] = buf;
- te9->hw_initialized = 1;
-
- return 0;
-}
-
-static void kxte9_device_power_off(void)
-{
- int err;
- u8 buf = PC1_OFF;
-
- err = kxte9_i2c_write(CTRL_REG1, &buf, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1), err=%d\n", CTRL_REG1, buf, err);
- if(err < 0)
- errlog("soft power off failed\n");
-#ifdef INT_MODE
- ENABLE_SENSOR_INT(0);
-// disable_irq(gconf.irq);
-#endif
- te9->hw_initialized = 0;
-}
-
-static int kxte9_device_power_on(void)
-{
- int err;
-
- if(!te9->hw_initialized) {
- //mdelay(110);
- err = kxte9_hw_init();
- if(err < 0) {
- kxte9_device_power_off();
- return err;
- }
- }
-#ifdef INT_MODE
- ENABLE_SENSOR_INT(1);
-// enable_irq(gconf.irq);
-#endif
- return 0;
-}
-
-static u8 kxte9_resolve_dir(u8 dir)
-{
- switch (dir) {
- case 0x20: /* -X */
- if (gconf.xyz_axis[ABS_X][1] < 0)
- dir = 0x10;
- if (gconf.xyz_axis[ABS_Y][0] == 0)
- dir >>= 2;
- if (gconf.xyz_axis[ABS_Z][0] == 0)
- dir >>= 4;
- break;
- case 0x10: /* +X */
- if (gconf.xyz_axis[ABS_X][1] < 0)
- dir = 0x20;
- if (gconf.xyz_axis[ABS_Y][0] == 0)
- dir >>= 2;
- if (gconf.xyz_axis[ABS_Z][0] == 0)
- dir >>= 4;
- break;
- case 0x08: /* -Y */
- if (gconf.xyz_axis[ABS_Y][1] < 0)
- dir = 0x04;
- if (gconf.xyz_axis[ABS_X][0] == 1)
- dir <<= 2;
- if (gconf.xyz_axis[ABS_Z][0] == 1)
- dir >>= 2;
- break;
- case 0x04: /* +Y */
- if (gconf.xyz_axis[ABS_Y][1] < 0)
- dir = 0x08;
- if (gconf.xyz_axis[ABS_X][0] == 1)
- dir <<= 2;
- if (gconf.xyz_axis[ABS_Z][0] == 1)
- dir >>= 2;
- break;
- case 0x02: /* -Z */
- if (gconf.xyz_axis[ABS_Z][1] < 0)
- dir = 0x01;
- if (gconf.xyz_axis[ABS_X][0] == 2)
- dir <<= 4;
- if (gconf.xyz_axis[ABS_Y][0] == 2)
- dir <<= 2;
- break;
- case 0x01: /* +Z */
- if (gconf.xyz_axis[ABS_Z][1] < 0)
- dir = 0x02;
- if (gconf.xyz_axis[ABS_X][0] == 2)
- dir <<= 4;
- if (gconf.xyz_axis[ABS_Y][0] == 2)
- dir <<= 2;
- break;
- default:
- return -EINVAL;
- }
-
- return dir;
-}
-
-#ifdef INT_MODE
-static void kxte9_irq_work_func(struct work_struct *work)
-{
-/*
- * int_status output:
- * [INT_SRC_REG1][INT_SRC_REG2][TILT_POS_PRE][TILT_POS_CUR]
- * INT_SRC_REG2, TILT_POS_PRE, and TILT_POS_CUR directions are translated
- * based on platform data variables.
- */
-
- int err;
- int i;
- int int_status = 0;
- u8 status;
- u8 b2s_comp;
- u8 wuf_comp;
- u8 buf[2];
-
- err = kxte9_i2c_read(INT_STATUS_REG, &status, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", INT_STATUS_REG, status, err);
- if(err < 0)
- errlog("read err int source\n");
- int_status = status << 24;
- if((status & TPS) > 0) {
- err = kxte9_i2c_read(TILT_POS_CUR, buf, 2);
- kxte9_dbg("kxte9_i2c_read(%x, 2)=%x,%x, err=%d\n", TILT_POS_CUR, buf[0], buf[1], err);
- if(err < 0)
- errlog("read err tilt dir\n");
- int_status |= kxte9_resolve_dir(buf[0]);
- int_status |= (kxte9_resolve_dir(buf[1])) << 8;
- kxte9_dbg("IRQ TILT [%x]\n", kxte9_resolve_dir(buf[0]));
- }
- if((status & WUFS) > 0) {
- kxte9_dbg("for WUFS\n");
- err = kxte9_i2c_read(INT_SRC_REG2, buf, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", INT_SRC_REG2, buf[0], err);
- if(err < 0)
- kxte9_dbg("reading err wuf dir\n");
- int_status |= (kxte9_resolve_dir(buf[0])) << 16;
- b2s_comp = (te9->resume[RES_CTRL_REG3] & 0x0C) >> 2;
- wuf_comp = te9->resume[RES_CTRL_REG3] & 0x03;
- if(!te9->resume[RES_CURRENT_ODR] &&
- !(te9->resume[RES_CTRL_REG1] & ODR125E) &&
- !(b2s_comp & wuf_comp)) {
- /* set the new poll interval based on wuf odr */
- for (i = 0; i < ARRAY_SIZE(kxte9_odr_table); i++) {
- if(kxte9_odr_table[i].mask == wuf_comp << 3) {
- te9->pdata->poll_interval = kxte9_odr_table[i].interval;
- break;
- }
- }
- if(te9->input_dev) {
- cancel_delayed_work_sync(&te9->input_work);
- schedule_delayed_work(&te9->input_work,
- msecs_to_jiffies(te9->pdata->poll_interval));
- }
- }
- }
- if((status & B2SS) > 0) {
- kxte9_dbg("fro B2SS\n");
- b2s_comp = (te9->resume[RES_CTRL_REG3] & 0x0C) >> 2;
- wuf_comp = te9->resume[RES_CTRL_REG3] & 0x03;
- if(!te9->resume[RES_CURRENT_ODR] &&
- !(te9->resume[RES_CTRL_REG1] & ODR125E) &&
- !(b2s_comp & wuf_comp)) {
- /* set the new poll interval based on b2s odr */
- for (i = 1; i < ARRAY_SIZE(kxte9_odr_table); i++) {
- if(kxte9_odr_table[i].mask == b2s_comp << 3) {
- te9->pdata->poll_interval = kxte9_odr_table[i].interval;
- break;
- }
- }
- if(te9->input_dev) {
- cancel_delayed_work_sync(&te9->input_work);
- schedule_delayed_work(&te9->input_work,
- msecs_to_jiffies(te9->pdata->poll_interval));
- }
- }
- }
- input_report_abs(te9->input_dev, ABS_MISC, int_status);
- input_sync(te9->input_dev);
- err = kxte9_i2c_read(INT_REL, buf, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", INT_REL, buf[0], err);
- if(err < 0)
- errlog("error clearing interrupt\n");
- //enable_irq(gconf.irq);
-}
-
-static irqreturn_t kxte9_isr(int irq, void *dev)
-{
- unsigned int status = REG32_VAL(gconf.isaddr);
-
- // clr int status ...??
- if ((status & gconf.isbmp) != 0)
- {
- kxte9_dbg("\n");
- REG32_VAL(gconf.isaddr) |= gconf.isbmp;
- udelay(5);
- // disable int and satrt irq work
- disable_irq_nosync(irq);
- schedule_work(&te9->irq_work);
- return IRQ_HANDLED;
- }
- return IRQ_NONE;
-}
-#endif
-
-static int kxte9_update_odr(int poll_interval)
-{
- int err = -1;
- int i;
- u8 config;
-
- /* Convert the poll interval into an output data rate configuration
- * that is as low as possible. The ordering of these checks must be
- * maintained due to the cascading cut off values - poll intervals are
- * checked from shortest to longest. At each check, if the next lower
- * ODR cannot support the current poll interval, we stop searching */
- for (i = 0; i < ARRAY_SIZE(kxte9_odr_table); i++) {
- config = kxte9_odr_table[i].mask;
- if(poll_interval >= kxte9_odr_table[i].interval)
- break;
- }
-
- config |= (te9->resume[RES_CTRL_REG1] & ~(ODR40E | ODR125E));
- te9->resume[RES_CTRL_REG1] = config;
- if(atomic_read(&te9->enabled)) {
- err = kxte9_set_byte(RES_CTRL_REG1, CTRL_REG1, config);
- if(err < 0)
- return err;
- }
- klog("Set new ODR to 0x%02X\n", config);
- return 0;
-}
-
-static void kxte9_input_work_func(unsigned long unused)
-{
- //mutex_lock(&te9->lock);
- if (te9->suspend)
- return;
- if (te9->i2c_xfer_complete) {
- te9->i2c_xfer_complete = 0;
- kxte9_read_data(XOUT, 3);
- }
- //mutex_unlock(&te9->lock);
-}
-
-static int kxte9_enable(void)
-{
- int err;
- int int_status = 0;
- u8 buf;
-
- if(!atomic_cmpxchg(&te9->enabled, 0, 1)) {
- err = kxte9_device_power_on();
- err = kxte9_i2c_read(INT_REL, &buf, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", INT_REL, buf, err);
- if(err < 0) {
- errlog("error clearing interrupt: %d\n", err);
- atomic_set(&te9->enabled, 0);
- return err;
- }
- if((te9->resume[RES_CTRL_REG1] & TPS) > 0) {
- err = kxte9_i2c_read(TILT_POS_CUR, &buf, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x, err=%d\n", TILT_POS_CUR, buf, err);
- if(err < 0)
- errlog("kxte9 error reading current tilt\n");
- int_status |= kxte9_resolve_dir(buf);
- input_report_abs(te9->input_dev, ABS_MISC, int_status);
- input_sync(te9->input_dev);
- }
- kxte9_msg = kzalloc(2*sizeof(struct i2c_msg), GFP_ATOMIC);
- i2c_read_buf = kzalloc(3*sizeof(unsigned char), GFP_ATOMIC);
- i2c_write_buf = kzalloc(sizeof(char), GFP_ATOMIC);
- setup_timer(&kxte9_timer, kxte9_input_work_func, 0);
- mod_timer(&kxte9_timer, jiffies + msecs_to_jiffies(te9->pdata->poll_interval));
- kxte9_dbg("Enabled\n");
- }
- return 0;
-}
-
-static int kxte9_disable(void)
-{
- if(atomic_cmpxchg(&te9->enabled, 1, 0)) {
- del_timer_sync(&kxte9_timer);
- wait_i2c_xfer_complete();
- kfree(kxte9_msg);
- kfree(i2c_read_buf);
- kfree(i2c_write_buf);
-#ifdef WM3445_A0
- ENABLE_SENSOR_INT(1);
-#endif
- kxte9_device_power_off();
- kxte9_dbg(" Disabled\n");
- //#endif
- }
- return 0;
-}
-
-int kxte9_input_open(struct input_dev *input)
-{
- kxte9_dbg("\n");
- return kxte9_enable();
-}
-
-void kxte9_input_close(struct input_dev *dev)
-{
- kxte9_dbg("\n");
- kxte9_disable();
-}
-
-static int kxte9_input_init(void)
-{
- int err;
-
- te9->input_dev = input_allocate_device();
- if(!te9->input_dev) {
- err = -ENOMEM;
- errlog("input device allocate failed\n");
- goto err0;
- }
- te9->input_dev->open = kxte9_input_open;
- te9->input_dev->close = kxte9_input_close;
-
- input_set_drvdata(te9->input_dev, te9);
-
- set_bit(EV_ABS, te9->input_dev->evbit);
- set_bit(ABS_MISC, te9->input_dev->absbit);
-
- input_set_abs_params(te9->input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(te9->input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(te9->input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT);
-
- te9->input_dev->name = INPUT_NAME_ACC;
-
- err = input_register_device(te9->input_dev);
- if(err) {
- errlog("unable to register input polled device %s: %d\n",
- te9->input_dev->name, err);
- goto err1;
- }
-
- return 0;
-err1:
- input_free_device(te9->input_dev);
-err0:
- return err;
-}
-
-static void kxte9_input_cleanup(void)
-{
- input_unregister_device(te9->input_dev);
-}
-
-/* sysfs */
-static ssize_t kxte9_delay_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%d\n", te9->pdata->poll_interval);
-}
-
-static ssize_t kxte9_delay_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int val = simple_strtoul(buf, NULL, 10);
- u8 ctrl;
-
- te9->pdata->poll_interval = max(val, te9->pdata->min_interval);
- kxte9_update_odr(te9->pdata->poll_interval);
- ctrl = te9->resume[RES_CTRL_REG1] & 0x18;
- te9->resume[RES_CURRENT_ODR] = ctrl;
- /* All ODRs are changed when this method is used. */
- ctrl = (ctrl >> 1) | (ctrl >> 3);
- kxte9_i2c_write(CTRL_REG3, &ctrl, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1)\n", CTRL_REG3, ctrl);
- te9->resume[RES_CTRL_REG3] = ctrl;
- return count;
-}
-
-static ssize_t kxte9_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%d\n", atomic_read(&te9->enabled));
-}
-
-static ssize_t kxte9_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int val = simple_strtoul(buf, NULL, 10);
- if(val)
- kxte9_enable();
- else
- kxte9_disable();
- return count;
-}
-
-static ssize_t kxte9_tilt_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- u8 tilt;
-
- if(te9->resume[RES_CTRL_REG1] & TPE) {
- kxte9_i2c_read(TILT_POS_CUR, &tilt, 1);
- kxte9_dbg("kxte9_i2c_read(%x, 1)=%x\n", TILT_POS_CUR, tilt);
- return sprintf(buf, "%d\n", kxte9_resolve_dir(tilt));
- } else {
- return sprintf(buf, "%d\n", 0);
- }
-}
-
-static ssize_t kxte9_tilt_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int val = simple_strtoul(buf, NULL, 10);
- u8 ctrl;
- if(val)
- te9->resume[RES_CTRL_REG1] |= TPE;
- else
- te9->resume[RES_CTRL_REG1] &= (~TPE);
- ctrl = te9->resume[RES_CTRL_REG1];
- kxte9_i2c_write(CTRL_REG1, &ctrl, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1)\n", CTRL_REG1, ctrl);
- return count;
-}
-
-static ssize_t kxte9_wake_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- u8 val = te9->resume[RES_CTRL_REG1] & WUFE;
- if(val)
- return sprintf(buf, "%d\n", 1);
- else
- return sprintf(buf, "%d\n", 0);
-}
-
-static ssize_t kxte9_wake_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int val = simple_strtoul(buf, NULL, 10);
- u8 ctrl;
- if(val)
- te9->resume[RES_CTRL_REG1] |= (WUFE | B2SE);
- else
- te9->resume[RES_CTRL_REG1] &= (~WUFE & ~B2SE);
- ctrl = te9->resume[RES_CTRL_REG1];
- kxte9_i2c_write(CTRL_REG1, &ctrl, 1);
- kxte9_dbg("kxte9_i2c_write(%x, %x, 1)\n", CTRL_REG1, ctrl);
- return count;
-}
-
-static ssize_t kxte9_selftest_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int val = simple_strtoul(buf, NULL, 10);
- u8 ctrl = 0x00;
- if(val)
- ctrl = 0xCA;
- kxte9_i2c_write(0x3A, &ctrl, 1);
- kxte9_dbg("kxte9_i2c_write(0x3A, %x, 1)\n", ctrl);
- return count;
-}
-
-static DEVICE_ATTR(delay, S_IRUGO|S_IWUSR, kxte9_delay_show, kxte9_delay_store);
-static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR, kxte9_enable_show,
- kxte9_enable_store);
-static DEVICE_ATTR(tilt, S_IRUGO|S_IWUSR, kxte9_tilt_show, kxte9_tilt_store);
-static DEVICE_ATTR(wake, S_IRUGO|S_IWUSR, kxte9_wake_show, kxte9_wake_store);
-static DEVICE_ATTR(selftest, S_IWUSR, NULL, kxte9_selftest_store);
-
-static struct attribute *kxte9_attributes[] = {
- &dev_attr_delay.attr,
- &dev_attr_enable.attr,
- &dev_attr_tilt.attr,
- &dev_attr_wake.attr,
- &dev_attr_selftest.attr,
- NULL
-};
-
-static struct attribute_group kxte9_attribute_group = {
- .attrs = kxte9_attributes
-};
-/* /sysfs */
-
-static int kxte9_get_count(char *buf, int bufsize)
-{
- const char ACC_REG_SIZE = 3;
- int err;
- /* Data bytes from hardware xL, xH, yL, yH, zL, zH */
- u8 acc_data[ACC_REG_SIZE];
- /* x,y,z hardware values */
- int xyz[3];
-
- if((!buf)||(bufsize<=(sizeof(xyz)*3)))
- return -1;
-
- err = kxte9_i2c_read(XOUT, acc_data, ACC_REG_SIZE);
- kxte9_dbg("kxte9_i2c_read(%x, %x)=%x,%x,%x, err=%d\n", XOUT, ACC_REG_SIZE,
- acc_data[0], acc_data[1], acc_data[2], err);
- if(err < 0)
- return err;
-
- sprintf(buf, "%d %d %d", acc_data[0], acc_data[1], acc_data[2]);
-
- return err;
-}
-
-static int kxte9_get_mg(char *buf, int bufsize)
-{
- const char ACC_REG_SIZE = 3;
- int err;
- /* Data bytes from hardware xL, xH, yL, yH, zL, zH */
- u8 acc_data[ACC_REG_SIZE];
- /* x,y,z hardware values */
- int xyz[3], mg[3];
-
- if((!buf)||(bufsize<=(sizeof(mg))))
- return -1;
-
- err = kxte9_i2c_read(XOUT, acc_data, ACC_REG_SIZE);
- kxte9_dbg("kxte9_i2c_read(%x, %x)=%x,%x,%x, err=%x\n", XOUT, ACC_REG_SIZE,
- acc_data[0], acc_data[1], acc_data[2], err);
- if(err < 0)
- return err;
-
- xyz[0] = ((int)(acc_data[0]) - OFFSET) << 4;
- xyz[1] = ((int)(acc_data[1]) - OFFSET) << 4;
- xyz[2] = ((int)(acc_data[2]) - OFFSET) << 4;
-
- mg[0] = X_CONVERT(xyz[gconf.xyz_axis[ABS_X][0]]);
- mg[1] = Y_CONVERT(xyz[gconf.xyz_axis[ABS_Y][0]]);
- mg[2] = Z_CONVERT(xyz[gconf.xyz_axis[ABS_Z][0]]);
-
- sprintf(buf, "%d %d %d",mg[0], mg[1], mg[2]);
-
- kxte9_dbg(" [%5d] [%5d] [%5d]\n", mg[0], mg[1], mg[2]);
-
- return err;
-}
-
-static void kxte9_dump_reg(void)
-{
- u8 regval = 0;
-
- klog("**********************kxte9 reg val***************\n");
- // ct_resp
- kxte9_i2c_read(CT_RESP, &regval, 1);
- klog("ct_resp:0x%x\n", regval);
- // who_am_i
- kxte9_i2c_read(WHO_AM_I, &regval, 1);
- klog("who_am_i:0x%x\n", regval);
- // tilt_pos_cur
- kxte9_i2c_read(TILT_POS_CUR, &regval, 1);
- klog("tilt_pos_cur:0x%x\n", regval);
- // int_src_reg1
- kxte9_i2c_read(INT_STATUS_REG, &regval, 1);
- klog("int_src_reg1:0x%x\n", regval);
- // int_src_reg2
- kxte9_i2c_read(INT_SRC_REG2, &regval, 1);
- klog("int_src_reg2:0x%x\n", regval);
- // status_reg
- kxte9_i2c_read(0x18, &regval, 1);
- klog("status_reg:0x%x\n", regval);
- // int_rel
- kxte9_i2c_read(INT_REL, &regval, 1);
- klog("int_rel:0x%x\n", regval);
- // ctrl_reg1
- kxte9_i2c_read(CTRL_REG1, &regval, 1);
- klog("ctrl_reg1:0x%x\n", regval);
- // ctrl_reg2
- kxte9_i2c_read(CTRL_REG2, &regval, 1);
- klog("ctrl_reg2:0x%x\n", regval);
- // ctrl_reg3
- kxte9_i2c_read(CTRL_REG3, &regval, 1);
- klog("ctrl_reg3:0x%x\n", regval);
- // int_ctrl_reg1
- kxte9_i2c_read(INT_CTRL1, &regval, 1);
- klog("int_ctrl_reg1:0x%x\n", regval);
- // int_ctrl_reg2
- kxte9_i2c_read(0x1F, &regval, 1);
- klog("int_ctrl_reg2:0x%x\n", regval);
- // tilt_timer
- kxte9_i2c_read(TILT_TIMER, &regval, 1);
- klog("tilt_timer:0x%x\n", regval);
- // wuf_timer
- kxte9_i2c_read(WUF_TIMER, &regval, 1);
- klog("wuf_timer:0x%x\n", regval);
- // b2s_timer
- kxte9_i2c_read(B2S_TIMER, &regval, 1);
- klog("b2s_timer:0x%x\n", regval);
- // wuf_thresh
- kxte9_i2c_read(WUF_THRESH, &regval, 1);
- klog("wuf_thresh:0x%x\n", regval);
- // b2s_thresh
- kxte9_i2c_read(B2S_THRESH, &regval, 1);
- klog("b2s_thresh:0x%x\n", regval);
- // tilt_angle
- kxte9_i2c_read(0x5c, &regval, 1);
- klog("tilt_angle:0x%x\n", regval);
- // hyst_set
- kxte9_i2c_read(0x5f, &regval, 1);
- klog("hyst_set:0x%x\n", regval);
- klog("**********************************************************");
-}
-
-static int kxte9_open(struct inode *inode, struct file *file)
-{
- int ret = -1;
-
- if(kxte9_enable() < 0)
- return ret;
-
- atomic_inc(&kxte9_dev_open_count);
- kxte9_dbg("opened %d times\n",\
- atomic_read(&kxte9_dev_open_count));
- kxte9_dump_reg();
- return 0;
-}
-
-static int kxte9_release(struct inode *inode, struct file *file)
-{
- int open_count;
-
- atomic_dec(&kxte9_dev_open_count);
- open_count = (int)atomic_read(&kxte9_dev_open_count);
-
- if(open_count == 0)
- kxte9_disable();
-
- kxte9_dbg("opened %d times\n",\
- atomic_read(&kxte9_dev_open_count));
- return 0;
-}
-
-static int kxte9_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- char buffer[IOCTL_BUFFER_SIZE];
- void __user *data;
- u8 reg_buffer = 0x00;
- const u8 set = 0xFF, unset = 0x00;
- int retval=0, val_int=0;
- short val_short=0;
-
- switch (cmd) {
- case KXTE9_IOCTL_GET_COUNT:
- data = (void __user *) arg;
- if(data == NULL){
- retval = -EFAULT;
- goto err_out;
- }
- retval = kxte9_get_count(buffer, sizeof(buffer));
- if(retval < 0)
- goto err_out;
-
- if(copy_to_user(data, buffer, sizeof(buffer))) {
- retval = -EFAULT;
- goto err_out;
- }
- break;
-
- case KXTE9_IOCTL_GET_MG:
- data = (void __user *) arg;
- if(data == NULL){
- retval = -EFAULT;
- goto err_out;
- }
- retval = kxte9_get_mg(buffer, sizeof(buffer));
- if(retval < 0)
- goto err_out;
-
- if(copy_to_user(data, buffer, sizeof(buffer))) {
- retval = -EFAULT;
- goto err_out;
- }
- break;
-
- case KXTE9_IOCTL_ENABLE_OUTPUT:
- retval = kxte9_set_pc1_on();
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_DISABLE_OUTPUT:
- retval = kxte9_set_pc1_off();
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_GET_ENABLE:
- data = (void __user *) arg;
- if(data == NULL){
- retval = -EFAULT;
- goto err_out;
- }
- retval = kxte9_get_bits(CTRL_REG1, &reg_buffer, PC1_ON);
- if(retval < 0)
- goto err_out;
-
- val_short = (short)reg_buffer;
-
- if(copy_to_user(data, &val_short, sizeof(val_short))) {
- retval = -EFAULT;
- goto err_out;
- }
- break;
-
- case KXTE9_IOCTL_RESET:
- retval = kxte9_set_bits(RES_CTRL_REG3, CTRL_REG3, set, SRST);
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_UPDATE_ODR:
- data = (void __user *) arg;
- if(data == NULL){
- retval = -EFAULT;
- goto err_out;
- }
- if(copy_from_user(&val_int, data, sizeof(val_int))) {
- retval = -EFAULT;
- goto err_out;
- }
-
- mutex_lock(&te9->lock);
- te9->pdata->poll_interval = max(val_int, te9->pdata->min_interval);
- mutex_unlock(&te9->lock);
-
- retval = kxte9_update_odr(te9->pdata->poll_interval);
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_ENABLE_CTC:
- retval = kxte9_set_bits(RES_CTRL_REG3, CTRL_REG3, set, CTC);
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_DISABLE_CTC:
- retval = kxte9_set_bits(RES_CTRL_REG3, CTRL_REG3, unset, CTC);
- if(retval < 0)
- goto err_out;
- break;
-
- case KXTE9_IOCTL_GET_CT_RESP:
- data = (void __user *) arg;
- if(data == NULL){
- retval = -EFAULT;
- goto err_out;
- }
- retval = kxte9_get_byte(CT_RESP, &reg_buffer);
- if(retval < 0)
- goto err_out;
-
- buffer[0] = (char)reg_buffer;
- if(copy_to_user(data, buffer, sizeof(buffer))) {
- retval = -EFAULT;
- goto err_out;
- }
- break;
-
- default:
- retval = -ENOIOCTLCMD;
- break;
- }
-
-err_out:
- return retval;
-}
-
-static struct file_operations kxte9_fops = {
- .owner = THIS_MODULE,
- .open = kxte9_open,
- .release = kxte9_release,
- //.ioctl = kxte9_ioctl,
-};
-
-static struct miscdevice kxte9_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = NAME_DEV,
- .fops = &kxte9_fops,
-};
-
-static int kxte9_probe(void)
-{
- int err = -1;
-
- te9 = kzalloc(sizeof(*te9), GFP_KERNEL);
- if(te9 == NULL) {
- errlog("failed to allocate memory for module data\n");
- err = -ENOMEM;
- goto err0;
- }
- te9->pdata = &kxte9_pdata;
- mutex_init(&te9->lock);
- mutex_lock(&te9->lock);
-
- x_count = kzalloc(gconf.avg_count, GFP_KERNEL);
- y_count = kzalloc(gconf.avg_count, GFP_KERNEL);
- z_count = kzalloc(gconf.avg_count, GFP_KERNEL);
-
- if ((1000000/gconf.samp)%1000)
- te9->pdata->poll_interval = 1000/gconf.samp + 1;
- else
- te9->pdata->poll_interval = 1000/gconf.samp;
- printk(KERN_INFO "G-Sensor Time Interval: %d ms\n", te9->pdata->poll_interval);
-
- android_gsensor_kobj = kobject_create_and_add("kxte9_gsensor", NULL);
- if (android_gsensor_kobj == NULL) {
- errlog("gsensor_sysfs_init:subsystem_register failed\n");
- err = -ENOMEM;
- goto err0;
- }
-
- err = sysfs_create_group(android_gsensor_kobj, &kxte9_attribute_group);
- if(err)
- goto err1;
-
- if(te9->pdata->init) {
- err = te9->pdata->init();
- if(err < 0)
- goto err2;
- }
-
- memset(te9->resume, 0, ARRAY_SIZE(te9->resume));
- te9->resume[RES_CTRL_REG1] = te9->pdata->ctrl_reg1_init;
- te9->resume[RES_CTRL_REG3] = te9->pdata->engine_odr_init;
- te9->resume[RES_INT_CTRL1] = te9->pdata->int_ctrl_init;
- te9->resume[RES_TILT_TIMER] = te9->pdata->tilt_timer_init;
- te9->resume[RES_WUF_TIMER] = te9->pdata->wuf_timer_init;
- te9->resume[RES_B2S_TIMER] = te9->pdata->b2s_timer_init;
- te9->resume[RES_WUF_THRESH] = te9->pdata->wuf_thresh_init;
- te9->resume[RES_B2S_THRESH] = te9->pdata->b2s_thresh_init;
- te9->hw_initialized = 0;
- te9->i2c_xfer_complete = 1;
-
-#ifdef INT_MODE
- // init gpio
- SET_GPIO_GSENSOR_INT();
- INIT_WORK(&te9->irq_work, kxte9_irq_work_func);
-#endif
-
- err = kxte9_device_power_on();
- if(err < 0)
- goto err3;
- atomic_set(&te9->enabled, 1);
-
- err = kxte9_verify();
- if(err < 0) {
- errlog("kxte9_verify failed\n");
- goto err4;
- }
-
- err = kxte9_update_odr(te9->pdata->poll_interval);
- if(err < 0) {
- errlog("update_odr failed\n");
- goto err4;
- }
-
- err = kxte9_input_init();
- if(err < 0)
- goto err4;
-
- err = misc_register(&kxte9_device);
- if(err) {
- errlog("misc. device failed to register.\n");
- goto err5;
- }
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- te9->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- te9->earlysuspend.suspend = kxte9_early_suspend;
- te9->earlysuspend.resume = kxte9_late_resume;
- register_early_suspend(&te9->earlysuspend);
-#endif
-
- atomic_set(&te9->enabled, 0);
-
-#ifdef INT_MODE
- err = request_irq(gconf.irq, kxte9_isr,
- IRQF_TRIGGER_RISING | IRQF_DISABLED, "kxte9_irq", te9);
- if(err < 0) {
- pr_err("%s: request irq failed: %d\n", __func__, err);
- goto err6;
- }
-
-#ifdef WM3445_A0
- // enable int
- ENABLE_SENSOR_INT(1);
-#endif
-
- // enable kxte9
- /*err = kxte9_enable();
- if (err < 0) {
- errlog("kxte9_enable failed.\n");
- goto err6;
- }*/
-#endif
-
- mutex_unlock(&te9->lock);
- //kxte9_dump_reg();
-
- return 0;
-
-#ifdef INT_MODE
-err6:
- misc_deregister(&kxte9_device);
-#endif
-err5:
- kxte9_input_cleanup();
-err4:
- kxte9_device_power_off();
-err3:
- if(te9->pdata->exit)
- te9->pdata->exit();
-err2:
- //kfree(te9->pdata);
- sysfs_remove_group(android_gsensor_kobj, &kxte9_attribute_group);
-err1:
- kobject_del(android_gsensor_kobj);
- mutex_unlock(&te9->lock);
- kfree(te9);
-err0:
- return err;
-}
-
-static int kxte9_remove(void)
-{
- cancel_delayed_work_sync(&te9->input_work);
-#ifdef INT_MODE
- free_irq(gconf.irq, te9);
-#endif
- kxte9_input_cleanup();
- misc_deregister(&kxte9_device);
- kxte9_device_power_off();
- if(te9->pdata->exit)
- te9->pdata->exit();
- kobject_del(android_gsensor_kobj);
- sysfs_remove_group(android_gsensor_kobj, &kxte9_attribute_group);
- kfree(te9);
-
- return 0;
-}
-
-#ifdef CONFIG_PM
-#if 0
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void kxte9_early_suspend(struct early_suspend *h)
-{
- kxte9_dbg("start\n");
- te9->suspend = 1;
- kxte9_disable();
- kxte9_dbg("exit\n");
-}
-
-static void kxte9_late_resume(struct early_suspend *h)
-{
- kxte9_dbg("start\n");
- te9->suspend = 0;
- kxte9_enable();
- kxte9_dbg("exit\n");
-}
-#endif
-#endif
-static int kxte9_resume(struct platform_device *pdev)
-{
- te9->suspend = 0;
- kxte9_enable();
- return 0;
-}
-
-static int kxte9_suspend(struct platform_device *pdev, pm_message_t state)
-{
- te9->suspend = 1;
- kxte9_disable();
- return 0;
-}
-#endif
-
-static void kxte9_platform_release(struct device *device)
-{
- kxte9_dbg("Do nothing!!!\n");
- return;
-}
-
-static struct platform_device kxte9_plt_device = {
- .name = "kxte9",
- .id = 0,
- .dev = {
- .release = kxte9_platform_release,
- },
-};
-
-static struct platform_driver kxte9_plt_driver = {
- .probe = NULL, //kxte9_probe,
- .remove = NULL, //kxte9_remove,
- .suspend = kxte9_suspend,
- .resume = kxte9_resume,
- .driver = {
- .name = "kxte9",
- },
-};
-
-/*
- * Get the configure of sensor from u-boot.
- * Return: 1--success, 0--error.
- */
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.gsensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "KXTE9: wmt.io.gsensor not defined!\n");
- return 0;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &gconf.op,
- &gconf.samp,
- &(gconf.xyz_axis[0][0]),
- &(gconf.xyz_axis[0][1]),
- &(gconf.xyz_axis[1][0]),
- &(gconf.xyz_axis[1][1]),
- &(gconf.xyz_axis[2][0]),
- &(gconf.xyz_axis[2][1]),
- &gconf.avg_count,
- &gconf.kxte9_8bit);
-
- if (n != 10) {
- kxte9_dbg(KERN_ERR "KXTE9: wmt.io.gsensor format is incorrect!\n");
- return 0;
- }
- }
- if (gconf.op != 1)
- return 0;
- printk(KERN_INFO "KXTE9 G-Sensor driver init\n");
- kxte9_dbg("AVG Count: %d, KXTE9 8bit: %d\n",
- gconf.avg_count,
- gconf.kxte9_8bit);
- if (gconf.samp > 100) {
- printk(KERN_ERR "Sample Rate can't be greater than 100 !\n");
- gconf.samp = 100;
- }
- if (gconf.avg_count == 0)
- gconf.avg_count = 1;
- if (gconf.kxte9_8bit > 1)
- gconf.kxte9_8bit = 1;
- kxte9_dbg("wmt.io.gsensor = %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- gconf.op,
- gconf.samp,
- gconf.xyz_axis[0][0],
- gconf.xyz_axis[0][1],
- gconf.xyz_axis[1][0],
- gconf.xyz_axis[1][1],
- gconf.xyz_axis[2][0],
- gconf.xyz_axis[2][1],
- gconf.avg_count,
- gconf.kxte9_8bit);
- return 1;
-}
-
-static int get_gpioset(void)
-{
- char varbuf[96];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.gpt.gsensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "Can't get gsensor's gpio config from u-boot! -> Use default config\n");
- return 0;
- } else {
- n = sscanf(varbuf, "%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x:%x",
- &gconf.name,
- &gconf.bmp,
- &(gconf.ctraddr),
- &(gconf.ocaddr),
- &(gconf.idaddr),
- &(gconf.peaddr),
- &(gconf.pcaddr),
- &(gconf.itbmp),
- &(gconf.itaddr),
- &(gconf.isbmp),
- &(gconf.isaddr),
- &(gconf.irq));
- if (n != 12) {
- printk(KERN_ERR "wmt.gpt.gsensor format is incorrect in u-boot!!!\n");
- return 0;
- }
-
- gconf.ctraddr += WMT_MMAP_OFFSET;
- gconf.ocaddr += WMT_MMAP_OFFSET;
- gconf.idaddr += WMT_MMAP_OFFSET;
- gconf.peaddr += WMT_MMAP_OFFSET;
- gconf.pcaddr += WMT_MMAP_OFFSET;
- gconf.itaddr += WMT_MMAP_OFFSET;
- gconf.isaddr += WMT_MMAP_OFFSET;
- }
- return 1;
-}
-
-static int __init kxte9_init(void)
-{
- int ret = 0;
-
- // parsing u-boot arg
- ret = get_axisset(); // get gsensor config from u-boot
- if (!ret)
- return -EINVAL;
-
- get_gpioset();
-
- // initail
- if ((ret = kxte9_probe()) != 0) {
- errlog(" Error for kxte9_probe !!!\n");
- return ret;
- }
- atomic_set(&kxte9_dev_open_count, 0);
-
- if ((ret = platform_device_register(&kxte9_plt_device)) != 0) {
- errlog("Can't register kxte9_plt_device platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&kxte9_plt_driver)) != 0) {
- errlog("Can't register kxte9_plt_driver platform driver!!!\n");
- return ret;
- }
- klog("gsensor_kxte9 driver is loaded successfully!\n");
- return ret;
-}
-
-static void __exit kxte9_exit(void)
-{
- platform_driver_unregister(&kxte9_plt_driver);
- platform_device_unregister(&kxte9_plt_device);
- atomic_set(&kxte9_dev_open_count, 0);
- kxte9_remove();
-}
-
-module_init(kxte9_init);
-module_exit(kxte9_exit);
-
-MODULE_DESCRIPTION("KXTE9 accelerometer driver");
-MODULE_AUTHOR("Kuching Tan <kuchingtan@kionix.com>");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(VERSION_DEV);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.h b/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.h
deleted file mode 100755
index 6b5141e5..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/kxte9.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* include/linux/kxte9.h - KXTE9 accelerometer driver
- *
- * Copyright (C) 2010 Kionix, Inc.
- * Written by Kuching Tan <kuchingtan@kionix.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __KXTE9_H__
-#define __KXTE9_H__
-
-#define KXTE9_I2C_ADDR 0x0F
-/* CONTROL REGISTER 1 BITS */
-#define TPE 0x01 /* tilt position function enable bit */
-#define WUFE 0x02 /* wake-up function enable bit */
-#define B2SE 0x04 /* back-to-sleep function enable bit */
-#define ODR125E 0x20 /* 125Hz ODR mode */
-#define ODR40E 0x18 /* initial ODR masks */
-#define ODR10E 0x10
-#define ODR3E 0x08
-#define ODR1E 0x00
-/* CONTROL REGISTER 3 BITS */
-#define SRST 0x80 /* software reset */
-#define CTC 0x10 /* communication-test function */
-#define OB2S40 0x0C /* back-to-sleep ODR masks */
-#define OB2S10 0x08
-#define OB2S3 0x04
-#define OB2S1 0x00
-#define OWUF40 0x03 /* wake-up ODR masks */
-#define OWUF10 0x02
-#define OWUF3 0x01
-#define OWUF1 0x00
-/* INTERRUPT CONTROL REGISTER 1 BITS */
-#define KXTE9_IEN 0x10 /* interrupt enable */
-#define KXTE9_IEA 0x08 /* interrupt polarity */
-#define KXTE9_IEL 0x04 /* interrupt response */
-
-/* Device Meta Data */
-#define DESC_DEV "KXTE9 3-axis Accelerometer" // Device Description
-#define VERSION_DEV "1.1.7"
-#define VER_MAJOR_DEV 1
-#define VER_MINOR_DEV 1
-#define VER_MAINT_DEV 7
-#define MAX_G_DEV (2.0f) // Maximum G Level
-#define MAX_SENS_DEV (1024.0f) // Maximum Sensitivity
-#define PWR_DEV (0.03f) // Typical Current
-
-/* Input Device Name */
-//#define INPUT_NAME_ACC "kxte9_accel"
-#define INPUT_NAME_ACC "g-sensor"
-
-/* Device name for kxte9 misc. device */
-#define NAME_DEV "kxte9"
-#define DIR_DEV "/dev/kxte9"
-
-/* IOCTLs for kxte9 misc. device library */
-#define KXTE9IO 0x92
-#define KXTE9_IOCTL_GET_COUNT _IOR(KXTE9IO, 0x01, int)
-#define KXTE9_IOCTL_GET_MG _IOR(KXTE9IO, 0x02, int)
-#define KXTE9_IOCTL_ENABLE_OUTPUT _IO(KXTE9IO, 0x03)
-#define KXTE9_IOCTL_DISABLE_OUTPUT _IO(KXTE9IO, 0x04)
-#define KXTE9_IOCTL_GET_ENABLE _IOR(KXTE9IO, 0x05, int)
-#define KXTE9_IOCTL_RESET _IO(KXTE9IO, 0x06)
-#define KXTE9_IOCTL_UPDATE_ODR _IOW(KXTE9IO, 0x07, int)
-#define KXTE9_IOCTL_ENABLE_CTC _IO(KXTE9IO, 0x08)
-#define KXTE9_IOCTL_DISABLE_CTC _IO(KXTE9IO, 0x09)
-#define KXTE9_IOCTL_GET_CT_RESP _IOR(KXTE9IO, 0x0A, int)
-
-
-#ifdef __KERNEL__
-struct kxte9_platform_data {
- int poll_interval;
- int min_interval;
- /* the desired g-range, in milli-g (always 2000 for kxte9) */
- u8 g_range;
- /* used to compensate for alternate device placement within the host */
-/*
- u8 axis_map_x;
- u8 axis_map_y;
- u8 axis_map_z;
- u8 negate_x;
- u8 negate_y;
- u8 negate_z;
-*/
- /* initial configuration values, set during board configuration */
- u8 ctrl_reg1_init;
- u8 engine_odr_init;
- u8 int_ctrl_init;
- u8 tilt_timer_init;
- u8 wuf_timer_init;
- u8 b2s_timer_init;
- u8 wuf_thresh_init;
- u8 b2s_thresh_init;
-
- int (*init)(void);
- void (*exit)(void);
-//NelsonTmp{
-// int gpio;
-//}
-};
-#endif /* __KERNEL__ */
-
-#endif /* __KXTE9_H__ */
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/readme.txt b/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/readme.txt
deleted file mode 100755
index e4653a08..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/kxte9_gsensor/readme.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-The back of WM3445 MID
- ______________
-| +z |
-| \ @ |
-| \ |
-| ---- +y |
-| | |
-| | |
-| +x |
-|______________|
-(KXTE9-2050 Accelerometer)
-
-wmt.io.gsensor
-Configure G-Sensor for Enable/Disable,X,Y,Z axis mapping and sampling rate. If driver not detect this variable, then G-sensor driver won¡¦t be loaded.
-<op>:<freq>:<axis-X>:<X-dir>:<axis-Y>:<Y-dir>:<axis-Z>:<Z-dir>:<avg-count>:<8bit>
-<op>:= Operation mode for the g-sensor
-0 : KXTE9-2050 G-Sensor is disabled.
-1 : KXTE9-2050 G-Sensor is enabled.
-<freq>:= G-Sensor sampling rate. The valid values are 1,3,10,and 40.
-<axis-X>:= G-Sensor axis-x will map to which axis of device.
-0 : X
-1 : Y
-2 : Z
-<X-dir>:= If G-Sensor axis-x direction is the same as device.
-1 : Positive direction
--1 : Negative direction
-<axis-Y>:= G-Sensor axis-y will map to which axis of device.
-0 : X
-1 : Y
-2 : Z
-<Y-dir>:= If G-Sensor axis-y direction is the same as device.
-1 : Positive direction
--1 : Negative direction
-<axis-Z>:= G-Sensor axis-z will map to which axis of device.
-0 : X
-1 : Y
-2 : Z
-<Z-dir>:= If G-Sensor axis-z direction is the same as device.
-1 : Positive direction
--1 : Negative direction
-<avg-count>:= For every new/current axes values stored, add the newly stored axes with previously (avg-count-1) stored axes values and do an average
-<8bit>:= Using acceleration data as 8bit
-0 : 6bit
-1 : 8bit
-Ex:
-#KXTE9-2050 G-sensor enabled, using 40 sampling rate, X->-Y, Y->X, Z->-Z, 4 average count, using 8bit
-setenv wmt.io.gsensor 1:40:1:-1:0:-1:2:-1:4:1
diff --git a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/Makefile b/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/Makefile
deleted file mode 100755
index 2818c82f..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Makefile for the kernel device drivers.
-#
-obj-$(CONFIG_WMT_GYRO_L3G4200D) += s_wmt_gyro_l3g4200d.o
-s_wmt_gyro_l3g4200d-objs := l3g4200d_gyr.o \ No newline at end of file
diff --git a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d.h b/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d.h
deleted file mode 100755
index 4cae2bc5..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
-*
-* File Name : l3g4200d.h
-* Authors : MH - C&I BU - Application Team
-* : Carmine Iascone (carmine.iascone@st.com)
-* : Matteo Dameno (matteo.dameno@st.com)
-* Version : V 1.1 sysfs
-* Date : 2010/Aug/19
-* Description : L3G4200D digital output gyroscope sensor API
-*
-********************************************************************************
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License version 2 as
-* published by the Free Software Foundation.
-*
-* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
-* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
-* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
-* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
-* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
-* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
-* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
-*
-********************************************************************************
-* REVISON HISTORY
-*
-* VERSION | DATE | AUTHORS | DESCRIPTION
-* 1.0 | 2010/Aug/19 | Carmine Iascone | First Release
-* 1.1 | 2011/02/28 | Matteo Dameno | Self Test Added
-* 1.2 | 2013/04/29 | Howay Huo | Android Interface Added
-*******************************************************************************/
-
-#ifndef __L3G4200D_H__
-#define __L3G4200D_H__
-
-#define L3G4200D_GYR_DEV_NAME "l3g4200d_gyr"
-#define GYRO_INPUT_NAME "gyroscope"
-#define GYRO_MISCDEV_NAME "gyro_ctrl"
-
-#define L3G4200D_DRVID 0
-
-#define L3G4200D_GYR_FS_250DPS 0x00
-#define L3G4200D_GYR_FS_500DPS 0x10
-#define L3G4200D_GYR_FS_2000DPS 0x30
-
-#define L3G4200D_GYR_ENABLED 1
-#define L3G4200D_GYR_DISABLED 0
-
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define WMT_GYRO_IOCTL_MAGIC 0x11
-#define GYRO_IOCTL_SET_ENABLE _IOW(WMT_GYRO_IOCTL_MAGIC, 0, int)
-#define GYRO_IOCTL_GET_ENABLE _IOW(WMT_GYRO_IOCTL_MAGIC, 1, int)
-#define GYRO_IOCTL_SET_DELAY _IOW(WMT_GYRO_IOCTL_MAGIC, 2, int)
-#define GYRO_IOCTL_GET_DELAY _IOW(WMT_GYRO_IOCTL_MAGIC, 3, int)
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 4, unsigned int)
-
-#ifdef __KERNEL__
-
-struct l3g4200d_triple {
- short x, /* x-axis angular rate data. */
- y, /* y-axis angluar rate data. */
- z; /* z-axis angular rate data. */
-};
-
-
-struct reg_value_t {
- u8 ctrl_reg1;
- u8 ctrl_reg2;
- u8 ctrl_reg3;
- u8 ctrl_reg4;
- u8 ctrl_reg5;
- u8 ref_datacap;
- u8 fifo_ctrl_reg;
- u8 int1_cfg;
- u8 int1_ths_xh;
- u8 int1_ths_xl;
- u8 int1_ths_yh;
- u8 int1_ths_yl;
- u8 int1_ths_zh;
- u8 int1_ths_zl;
- u8 int1_duration;
-};
-
-struct l3g4200d_gyr_platform_data {
- int (*init)(void);
- void (*exit)(void);
- int (*power_on)(void);
- int (*power_off)(void);
- int poll_interval;
- int min_interval;
-
- u8 fs_range;
-
- int axis_map_x;
- int axis_map_y;
- int axis_map_z;
-
- int direction_x;
- int direction_y;
- int direction_z;
-
- struct reg_value_t init_state;
-
-};
-#endif /* __KERNEL__ */
-
-#endif /* __L3G4200D_H__ */
diff --git a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d_gyr.c b/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d_gyr.c
deleted file mode 100755
index a30c00a6..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/l3g4200d_gyro/l3g4200d_gyr.c
+++ /dev/null
@@ -1,1681 +0,0 @@
-/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
-*
-* File Name : l3g4200d_gyr_sysfs.c
-* Authors : MH - C&I BU - Application Team
-* : Carmine Iascone (carmine.iascone@st.com)
-* : Matteo Dameno (matteo.dameno@st.com)
-* : Both authors are willing to be considered the contact
-* : and update points for the driver.
-* Version : V 1.1 sysfs
-* Date : 2011/02/28
-* Description : L3G4200D digital output gyroscope sensor API
-*
-********************************************************************************
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License version 2 as
-* published by the Free Software Foundation.
-*
-* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
-* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
-* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
-* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
-* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
-* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
-* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
-*
-********************************************************************************
-* REVISON HISTORY
-*
-* VERSION | DATE | AUTHORS | DESCRIPTION
-* 1.0 | 2010/11/19 | Carmine Iascone | First Release
-* 1.1 | 2011/02/28 | Matteo Dameno | Self Test Added
-* 1.2 | 2013/04/29 | Howay Huo | Android Interface Added
-*******************************************************************************/
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/mutex.h>
-#include <linux/input-polldev.h>
-#include <linux/slab.h>
-#include <linux/workqueue.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <mach/hardware.h>
-#include <linux/irq.h>
-#include <linux/interrupt.h>
-#include <linux/gpio.h>
-#include <mach/wmt_iomux.h>
-
-#include "l3g4200d.h"
-
-#undef DEBUG
-#define DEBUG 1
-
-#define L3G4200D_I2C_ADDR 0x69
-
-/* WM8880 interrupt pin connect to the DRDY Pin of LL3G4200D */
-#define L3G4200D_IRQ_PIN WMT_PIN_GP2_GPIO17
-
-/** Maximum polled-device-reported rot speed value value in dps*/
-#define FS_MAX 32768
-
-/* l3g4200d gyroscope registers */
-#define WHO_AM_I 0x0F
-
-#define CTRL_REG1 0x20
-#define CTRL_REG2 0x21
-#define CTRL_REG3 0x22
-#define CTRL_REG4 0x23
-#define CTRL_REG5 0x24
-#define REF_DATACAP 0x25
-#define OUT_TEMP 0x26
-#define STATUS_REG 0x27
-#define OUT_X_L 0x28
-#define OUT_X_H 0x29
-#define OUT_Y_L 0x2A
-#define OUT_Y_H 0x2B
-#define OUT_Z_L 0x2C
-#define OUT_Z_H 0x2D
-#define FIFO_CTRL_REG 0x2E
-#define FIFO_SRC_REG 0x2F
-#define INT1_CFG 0x30
-#define INT1_SRC 0x31
-#define INT1_THS_XH 0x32
-#define INT1_THS_XL 0x33
-#define INT1_THS_YH 0x34
-#define INT1_THS_YL 0x35
-#define INT1_THS_ZH 0x36
-#define INT1_THS_ZL 0x37
-#define INT1_DURATION 0x38
-
-/* CTRL_REG1 */
-#define PM_MASK 0x08
-#define PM_NORMAL 0x08
-#define ENABLE_ALL_AXES 0x07
-
-/* CTRL_REG3 */
-#define I2_DRDY 0x08
-
-/* CTRL_REG4 bits */
-#define FS_MASK 0x30
-
-#define SELFTEST_MASK 0x06
-#define L3G4200D_SELFTEST_DIS 0x00
-#define L3G4200D_SELFTEST_EN_POS 0x02
-#define L3G4200D_SELFTEST_EN_NEG 0x04
-
-#define FUZZ 0
-#define FLAT 0
-#define AUTO_INCREMENT 0x80
-
-/* STATUS_REG */
-#define ZYXDA 0x08
-#define ZDA 0x04
-#define YDA 0x02
-#define XDA 0x01
-
-/** Registers Contents */
-#define WHOAMI_L3G4200D 0x00D3 /* Expected content for WAI register*/
-
-#define ODR_MASK 0xF0
-#define ODR100_BW25 0x10
-#define ODR200_BW70 0x70
-#define ODR400_BW110 0xB0
-#define ODR800_BW110 0xF0
-
-#define L3G4200D_PU_DELAY 320 //ms
-
-static struct i2c_client *l3g4200d_i2c_client = NULL;
-static int enable_print_log;
-static int interrupt_mode = 0;
-static int flush_polling_data;
-
-/*
- * L3G4200D gyroscope data
- * brief structure containing gyroscope values for yaw, pitch and roll in
- * signed short
- */
-
-struct output_rate{
- u8 odr_mask;
- u32 delay_us;
-};
-
-static const struct output_rate gyro_odr_table[] = {
- { ODR800_BW110, 1250 },
- { ODR400_BW110, 2500 },
- { ODR200_BW70, 5000 },
- { ODR100_BW25, 10000},
-};
-
-struct l3g4200d_data {
- struct i2c_client *client;
- struct l3g4200d_gyr_platform_data *pdata;
-
- struct mutex lock;
-
- struct delayed_work enable_work;
- struct delayed_work input_work;
- struct input_dev *input_dev;
- int hw_initialized;
- int selftest_enabled;
- atomic_t enabled;
-
- u8 reg_addr;
- struct reg_value_t resume_state;
-};
-
-extern int wmt_getsyspara(char *varname, char *varval, int *varlen);
-
-static int l3g4200d_i2c_read(struct l3g4200d_data *gyro,
- u8 *buf, int len)
-{
- int err;
-
- struct i2c_msg msgs[] = {
- {
- .addr = gyro->client->addr,
- .flags = gyro->client->flags & I2C_M_TEN,
- .len = 1,
- .buf = buf,
- },
- {
- .addr = gyro->client->addr,
- .flags = (gyro->client->flags & I2C_M_TEN) | I2C_M_RD,
- .len = len,
- .buf = buf,
- },
- };
-
- err = i2c_transfer(gyro->client->adapter, msgs, 2);
-
- if (err != 2) {
- dev_err(&gyro->client->dev, "read transfer error: %d\n",err);
- return -EIO;
- }
-
- return 0;
-}
-
-static int l3g4200d_i2c_write(struct l3g4200d_data *gyro,
- u8 *buf,
- int len)
-{
- int err;
-
- struct i2c_msg msgs[] = {
- {
- .addr = gyro->client->addr,
- .flags = gyro->client->flags & I2C_M_TEN,
- .len = len + 1,
- .buf = buf,
- },
- };
-
- err = i2c_transfer(gyro->client->adapter, msgs, 1);
-
- if (err != 1) {
- dev_err(&gyro->client->dev, "write transfer error\n");
- return -EIO;
- }
-
- return 0;
-}
-
-static int l3g4200d_register_write(struct l3g4200d_data *gyro, u8 *buf,
- u8 reg_address, u8 new_value)
-{
- int err = -1;
-
- /* Sets configuration register at reg_address
- * NOTE: this is a straight overwrite */
- buf[0] = reg_address;
- buf[1] = new_value;
- err = l3g4200d_i2c_write(gyro, buf, 1);
- if (err < 0)
- return err;
-
- return err;
-}
-
-static int l3g4200d_register_read(struct l3g4200d_data *gyro, u8 *buf,
- u8 reg_address)
-{
-
- int err = -1;
- buf[0] = (reg_address);
- err = l3g4200d_i2c_read(gyro, buf, 1);
- return err;
-}
-
-static int l3g4200d_register_update(struct l3g4200d_data *gyro, u8 *buf,
- u8 reg_address, u8 mask, u8 new_bit_values)
-{
- int err = -1;
- u8 init_val;
- u8 updated_val;
- err = l3g4200d_register_read(gyro, buf, reg_address);
- if (!(err < 0)) {
- init_val = buf[0];
- if((new_bit_values & mask) != (init_val & mask)) {
- updated_val = ((mask & new_bit_values) | ((~mask) & init_val));
- err = l3g4200d_register_write(gyro, buf, reg_address,
- updated_val);
- }
- else
- return 0;
- }
- return err;
-}
-
-static int l3g4200d_register_store(struct l3g4200d_data *gyro, u8 reg)
-{
- int err = -1;
- u8 buf[2];
-
- err = l3g4200d_register_read(gyro, buf, reg);
- if (err)
- return err;
-
- switch (reg) {
- case CTRL_REG1:
- gyro->resume_state.ctrl_reg1 = buf[0];
- break;
- case CTRL_REG2:
- gyro->resume_state.ctrl_reg2 = buf[0];
- break;
- case CTRL_REG3:
- gyro->resume_state.ctrl_reg3 = buf[0];
- break;
- case CTRL_REG4:
- gyro->resume_state.ctrl_reg4 = buf[0];
- break;
- case CTRL_REG5:
- gyro->resume_state.ctrl_reg5 = buf[0];
- break;
- case REF_DATACAP:
- gyro->resume_state.ref_datacap = buf[0];
- break;
- case FIFO_CTRL_REG:
- gyro->resume_state.fifo_ctrl_reg = buf[0];
- break;
- case INT1_CFG:
- gyro->resume_state.int1_cfg = buf[0];
- break;
- case INT1_THS_XH:
- gyro->resume_state.int1_ths_xh = buf[0];
- break;
- case INT1_THS_XL:
- gyro->resume_state.int1_ths_xl = buf[0];
- break;
- case INT1_THS_YH:
- gyro->resume_state.int1_ths_yh = buf[0];
- break;
- case INT1_THS_YL:
- gyro->resume_state.int1_ths_yl = buf[0];
- break;
- case INT1_THS_ZH:
- gyro->resume_state.int1_ths_zh = buf[0];
- break;
- case INT1_THS_ZL:
- gyro->resume_state.int1_ths_zl = buf[0];
- break;
- case INT1_DURATION:
- gyro->resume_state.int1_duration = buf[0];
- break;
- default:
- pr_err("%s: can't support reg (0x%02X) store\n", L3G4200D_GYR_DEV_NAME, reg);
- return -1;
- }
-
- return 0;
-}
-
-static int l3g4200d_update_fs_range(struct l3g4200d_data *gyro,
- u8 new_fs)
-{
- int res ;
- u8 buf[2];
-
- buf[0] = CTRL_REG4;
-
- res = l3g4200d_register_update(gyro, buf, CTRL_REG4,
- FS_MASK, new_fs);
-
- if (res < 0) {
- pr_err("%s : failed to update fs:0x%02x\n",
- __func__, new_fs);
- return res;
- }
-
- l3g4200d_register_store(gyro, CTRL_REG4);
-
- return 0;
-}
-
-
-static int l3g4200d_selftest(struct l3g4200d_data *gyro, u8 enable)
-{
- int err = -1;
- u8 buf[2] = {0x00,0x00};
- char reg_address, mask, bit_values;
-
- reg_address = CTRL_REG4;
- mask = SELFTEST_MASK;
- if (enable > 0)
- bit_values = L3G4200D_SELFTEST_EN_POS;
- else
- bit_values = L3G4200D_SELFTEST_DIS;
- if (atomic_read(&gyro->enabled)) {
- mutex_lock(&gyro->lock);
- err = l3g4200d_register_update(gyro, buf, reg_address,
- mask, bit_values);
- gyro->selftest_enabled = enable;
- mutex_unlock(&gyro->lock);
- if (err < 0)
- return err;
-
- l3g4200d_register_store(gyro, CTRL_REG4);
- }
- return err;
-}
-
-
-static int l3g4200d_update_odr(struct l3g4200d_data *gyro,
- int poll_interval)
-{
- int err = -1;
- int i;
- u8 config[2];
-
- for (i = ARRAY_SIZE(gyro_odr_table) - 1; i >= 0; i--) {
- if (gyro_odr_table[i].delay_us <= poll_interval){
- break;
- }
- }
-
- gyro->pdata->poll_interval = gyro_odr_table[i].delay_us;
-
- config[1] = gyro_odr_table[i].odr_mask;
- config[1] |= (ENABLE_ALL_AXES + PM_NORMAL);
-
- /* If device is currently enabled, we need to write new
- * configuration out to it */
- if (atomic_read(&gyro->enabled)) {
- config[0] = CTRL_REG1;
- err = l3g4200d_i2c_write(gyro, config, 1);
- if (err < 0)
- return err;
-
- l3g4200d_register_store(gyro, CTRL_REG1);
- }
-
- return err;
-}
-
-/* gyroscope data readout */
-static int l3g4200d_get_data(struct l3g4200d_data *gyro,
- struct l3g4200d_triple *data)
-{
- int err;
- unsigned char gyro_out[6];
- /* y,p,r hardware data */
- s16 hw_d[3] = { 0 };
-
- gyro_out[0] = (AUTO_INCREMENT | OUT_X_L);
-
- err = l3g4200d_i2c_read(gyro, gyro_out, 6);
-
- if (err < 0)
- return err;
-
- hw_d[0] = (s16) (((gyro_out[1]) << 8) | gyro_out[0]);
- hw_d[1] = (s16) (((gyro_out[3]) << 8) | gyro_out[2]);
- hw_d[2] = (s16) (((gyro_out[5]) << 8) | gyro_out[4]);
-
- data->x = ((gyro->pdata->direction_x < 0) ? (-hw_d[gyro->pdata->axis_map_x])
- : (hw_d[gyro->pdata->axis_map_x]));
- data->y = ((gyro->pdata->direction_y < 0) ? (-hw_d[gyro->pdata->axis_map_y])
- : (hw_d[gyro->pdata->axis_map_y]));
- data->z = ((gyro->pdata->direction_z < 0) ? (-hw_d[gyro->pdata->axis_map_z])
- : (hw_d[gyro->pdata->axis_map_z]));
-
- if(enable_print_log)
- printk("x = %d, y = %d, z = %d\n", data->x, data->y, data->z);
-
- return err;
-}
-
-static void l3g4200d_report_values(struct l3g4200d_data *l3g,
- struct l3g4200d_triple *data)
-{
- struct input_dev *input = l3g->input_dev;
-
- input_report_abs(input, ABS_X, data->x);
- input_report_abs(input, ABS_Y, data->y);
- input_report_abs(input, ABS_Z, data->z);
- input_sync(input);
-}
-
-static int l3g4200d_hw_init(struct l3g4200d_data *gyro)
-{
- int err = -1;
- u8 buf[8];
-
- printk(KERN_INFO "%s hw init\n", L3G4200D_GYR_DEV_NAME);
-
- buf[0] = (AUTO_INCREMENT | CTRL_REG1);
- buf[1] = gyro->resume_state.ctrl_reg1;
- buf[2] = gyro->resume_state.ctrl_reg2;
- buf[3] = gyro->resume_state.ctrl_reg3;
- buf[4] = gyro->resume_state.ctrl_reg4;
- buf[5] = gyro->resume_state.ctrl_reg5;
- buf[6] = gyro->resume_state.ref_datacap;
- err = l3g4200d_i2c_write(gyro, buf, 6);
- if(err)
- return err;
-
- buf[0] = FIFO_CTRL_REG;
- buf[1] = gyro->resume_state.fifo_ctrl_reg;
- err = l3g4200d_i2c_write(gyro, buf, 1);
- if(err)
- return err;
-
- buf[0] = INT1_CFG;
- buf[1] = gyro->resume_state.int1_cfg;
- err = l3g4200d_i2c_write(gyro, buf, 1);
- if(err)
- return err;
-
- buf[0] = (AUTO_INCREMENT | INT1_THS_XH);
- buf[1] = gyro->resume_state.int1_ths_xh;
- buf[2] = gyro->resume_state.int1_ths_xl;
- buf[3] = gyro->resume_state.int1_ths_yh;
- buf[4] = gyro->resume_state.int1_ths_yl;
- buf[5] = gyro->resume_state.int1_ths_zh;
- buf[6] = gyro->resume_state.int1_ths_zl;
- buf[7] = gyro->resume_state.int1_duration;
- err = l3g4200d_i2c_write(gyro, buf, 7);
- if(err)
- return err;
-
- gyro->hw_initialized = 1;
-
- return 0;
-}
-
-static void l3g4200d_gpio_irq_enable(void)
-{
- wmt_gpio_unmask_irq(L3G4200D_IRQ_PIN);
-}
-
-static void l3g4200d_gpio_irq_disable(void)
-{
- wmt_gpio_mask_irq(L3G4200D_IRQ_PIN);
-}
-
-static int l3g4200d_irq_hw_init(int resume)
-{
- int ret;
-
- if(!resume) {
- ret = gpio_request(L3G4200D_IRQ_PIN, "l3g4200d-gyro irq"); //enable gpio
- if(ret < 0) {
- pr_err("gpio(%d) request fail for l3g4200d-gyro irq\n", L3G4200D_IRQ_PIN);
- return ret;
- }
- }else
- gpio_re_enabled(L3G4200D_IRQ_PIN); //re-enable gpio
-
- gpio_direction_input(L3G4200D_IRQ_PIN); //gpio input
-
- wmt_gpio_setpull(L3G4200D_IRQ_PIN, WMT_GPIO_PULL_DOWN); //enable pull and pull-down
-
- wmt_gpio_mask_irq(L3G4200D_IRQ_PIN); //disable interrupt
-
- wmt_gpio_set_irq_type(L3G4200D_IRQ_PIN, IRQ_TYPE_EDGE_RISING); //rise edge and clear interrupt
-
- return 0;
-}
-
-static void l3g4200d_irq_hw_free(void)
-{
- l3g4200d_gpio_irq_disable();
- gpio_free(L3G4200D_IRQ_PIN);
-
-}
-
-static int l3g4200d_gpio_get_value(void)
-{
- return (REG8_VAL(__GPIO_BASE + 0x0002) & BIT1);
-}
-
-static int l3g4200d_flush_gyro_data(struct l3g4200d_data *gyro)
-{
- struct l3g4200d_triple data;
- int i;
-
- for (i = 0; i < 5; i++) {
- if (l3g4200d_gpio_get_value()) {
- l3g4200d_get_data(gyro, &data);
- pr_info("%s: flush_gyro_data: %d\n", L3G4200D_GYR_DEV_NAME, i);
- }
- else {
- return 0;
- }
- }
-
- return -EIO;
-}
-
-static void l3g4200d_device_power_off(struct l3g4200d_data *gyro)
-{
- int err;
- u8 buf[2];
-
- pr_info("%s power off\n", L3G4200D_GYR_DEV_NAME);
-
- buf[0] = CTRL_REG1;
- err = l3g4200d_i2c_read(gyro, buf, 1);
- if(err < 0) {
- dev_err(&gyro->client->dev, "read ctrl_reg1 failed\n");
- buf[0] = (gyro->resume_state.ctrl_reg1 | PM_MASK);
- }
-
- if(buf[0] & PM_MASK) {
- buf[1] = buf[0] & ~PM_MASK;
- buf[0] = CTRL_REG1;
-
- err = l3g4200d_i2c_write(gyro, buf, 1);
- if (err)
- dev_err(&gyro->client->dev, "soft power off failed\n");
-
- l3g4200d_register_store(gyro, CTRL_REG1);
- }
-
- if (gyro->pdata->power_off) {
- gyro->pdata->power_off();
-// gyro->hw_initialized = 0;
- }
-
-// if (gyro->hw_initialized)
-// gyro->hw_initialized = 0;
-
-}
-
-static int l3g4200d_device_power_on(struct l3g4200d_data *gyro)
-{
- int err;
- u8 buf[2];
-
- pr_info("%s power on\n", L3G4200D_GYR_DEV_NAME);
-
- if (gyro->pdata->power_on) {
- err = gyro->pdata->power_on();
- if (err < 0)
- return err;
- }
-
- if (!gyro->hw_initialized) {
- err = l3g4200d_hw_init(gyro);
- if (err) {
- l3g4200d_device_power_off(gyro);
- return err;
- }
- }
-
- buf[0] = CTRL_REG1;
- err = l3g4200d_i2c_read(gyro, buf, 1);
- if(err) {
- dev_err(&gyro->client->dev, "read ctrl_reg1 failed\n");
- buf[0] = (gyro->resume_state.ctrl_reg1 & ~PM_MASK);
- }
-
- if(!(buf[0] & PM_MASK)) {
- buf[1] = buf[0] | PM_MASK;
- buf[0] = CTRL_REG1;
- err = l3g4200d_i2c_write(gyro, buf, 1);
- if(err) {
- dev_err(&gyro->client->dev, "soft power on failed\n");
- return err;
- }
- l3g4200d_register_store(gyro, CTRL_REG1);
- }
-
- return 0;
-}
-
-static int l3g4200d_enable(struct l3g4200d_data *gyro)
-{
- int err;
-
- pr_info("%s enable\n", L3G4200D_GYR_DEV_NAME);
-
- if (!atomic_cmpxchg(&gyro->enabled, 0, 1)) {
- err = l3g4200d_device_power_on(gyro);
- if (err) {
- atomic_set(&gyro->enabled, 0);
- return err;
- }
-
- //Android will call l3g4200d_set_delay() after l3g4200d_enable;
- }
-
- return 0;
-}
-
-static int l3g4200d_disable(struct l3g4200d_data *gyro)
-{
- pr_info("%s disable\n", L3G4200D_GYR_DEV_NAME);
-
- if (atomic_cmpxchg(&gyro->enabled, 1, 0)){
- if(interrupt_mode) {
- cancel_delayed_work_sync(&gyro->enable_work);
- l3g4200d_gpio_irq_disable();
- }else
- cancel_delayed_work_sync(&gyro->input_work);
-
- l3g4200d_device_power_off(gyro);
- }
- return 0;
-}
-
-static int l3g4200d_set_delay(struct l3g4200d_data *gyro, u32 delay_us)
-{
- int odr_value = ODR100_BW25;
- int err = -1;
- int i;
- u8 buf[2] = {CTRL_REG1, 0};
-
- pr_info("l3g4200d_set_delay: %d us\n", delay_us);
-
- /* do not report noise during ODR update */
- if(interrupt_mode) {
- cancel_delayed_work_sync(&gyro->enable_work);
- l3g4200d_gpio_irq_disable();
- }else
- cancel_delayed_work_sync(&gyro->input_work);
-
- for(i=0; i < ARRAY_SIZE(gyro_odr_table); i++)
- if(delay_us <= gyro_odr_table[i].delay_us) {
- odr_value = gyro_odr_table[i].odr_mask;
- delay_us = gyro_odr_table[i].delay_us;
- break;
- }
-
- if(delay_us >= gyro_odr_table[3].delay_us) {
- odr_value = gyro_odr_table[3].odr_mask;
- delay_us = gyro_odr_table[3].delay_us;
- }
-
- err = l3g4200d_register_update(gyro, buf, CTRL_REG1, ODR_MASK, odr_value);
- if(err) {
- dev_err(&gyro->client->dev, "update odr failed 0x%x,0x%x: %d\n",
- buf[0], odr_value, err);
- return err;
- }
-
- l3g4200d_register_store(gyro, CTRL_REG1);
-
- gyro->pdata->poll_interval = max((int)delay_us, gyro->pdata->min_interval);
-
- //do not report noise at IC power-up
- // flush data before really read
- if(interrupt_mode)
- schedule_delayed_work(&gyro->enable_work, msecs_to_jiffies(
- L3G4200D_PU_DELAY));
- else {
- flush_polling_data = 1;
- schedule_delayed_work(&gyro->input_work, msecs_to_jiffies(
- L3G4200D_PU_DELAY));
- }
-
- return 0;
-}
-
-static ssize_t attr_polling_rate_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- int val;
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- mutex_lock(&gyro->lock);
- val = gyro->pdata->poll_interval;
- mutex_unlock(&gyro->lock);
- return sprintf(buf, "%d\n", val);
-}
-
-static ssize_t attr_polling_rate_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- unsigned long interval_us;
-
- if (strict_strtoul(buf, 10, &interval_us))
- return -EINVAL;
- if (!interval_us)
- return -EINVAL;
- mutex_lock(&gyro->lock);
- gyro->pdata->poll_interval = interval_us;
- l3g4200d_update_odr(gyro, interval_us);
- mutex_unlock(&gyro->lock);
- return size;
-}
-
-static ssize_t attr_range_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- int range = 0;
- char val;
- mutex_lock(&gyro->lock);
- val = gyro->pdata->fs_range;
- switch (val) {
- case L3G4200D_GYR_FS_250DPS:
- range = 250;
- break;
- case L3G4200D_GYR_FS_500DPS:
- range = 500;
- break;
- case L3G4200D_GYR_FS_2000DPS:
- range = 2000;
- break;
- }
- mutex_unlock(&gyro->lock);
- return sprintf(buf, "%d\n", range);
-}
-
-static ssize_t attr_range_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- unsigned long val;
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
- mutex_lock(&gyro->lock);
- gyro->pdata->fs_range = val;
- l3g4200d_update_fs_range(gyro, val);
- mutex_unlock(&gyro->lock);
- return size;
-}
-
-static ssize_t attr_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- int val = atomic_read(&gyro->enabled);
- return sprintf(buf, "%d\n", val);
-}
-
-static ssize_t attr_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
-
- if (val) {
- l3g4200d_enable(gyro);
- l3g4200d_set_delay(gyro, gyro->pdata->poll_interval);
- }
- else
- l3g4200d_disable(gyro);
-
- return size;
-}
-
-static ssize_t attr_get_selftest(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- int val;
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- mutex_lock(&gyro->lock);
- val = gyro->selftest_enabled;
- mutex_unlock(&gyro->lock);
- return sprintf(buf, "%d\n", val);
-}
-
-static ssize_t attr_set_selftest(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
-
- l3g4200d_selftest(gyro, val);
-
- return size;
-}
-
-#ifdef DEBUG
-static ssize_t attr_reg_set(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t size)
-{
- int rc;
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- u8 x[2];
- unsigned long val;
-
- if (strict_strtoul(buf, 16, &val))
- return -EINVAL;
- mutex_lock(&gyro->lock);
- x[0] = gyro->reg_addr;
- mutex_unlock(&gyro->lock);
- x[1] = val;
- rc = l3g4200d_i2c_write(gyro, x, 1);
- return size;
-}
-
-static ssize_t attr_reg_get(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- ssize_t ret;
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- int rc;
- u8 data;
-
- mutex_lock(&gyro->lock);
- data = gyro->reg_addr;
- mutex_unlock(&gyro->lock);
- rc = l3g4200d_i2c_read(gyro, &data, 1);
- ret = sprintf(buf, "0x%02x\n", data);
- return ret;
-}
-
-static ssize_t attr_addr_set(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t size)
-{
- struct l3g4200d_data *gyro = dev_get_drvdata(dev);
- unsigned long val;
-
- if (strict_strtoul(buf, 16, &val))
- return -EINVAL;
-
- mutex_lock(&gyro->lock);
-
- gyro->reg_addr = val;
-
- mutex_unlock(&gyro->lock);
-
- return size;
-}
-
-static ssize_t attr_get_printlog(struct device * dev,struct device_attribute * attr,
- char * buf)
-{
- ssize_t ret;
-
- ret = sprintf(buf, "%d\n", enable_print_log);
-
- return ret;
-}
-
-static ssize_t attr_set_printlog(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t size)
-{
- unsigned long val;
-
- if (strict_strtoul(buf, 10, &val))
- return -EINVAL;
-
- enable_print_log = val;
-
- return size;
-}
-
-#endif /* DEBUG */
-
-static struct device_attribute attributes[] = {
- __ATTR(pollrate_ms, 0666, attr_polling_rate_show,
- attr_polling_rate_store),
- __ATTR(range, 0666, attr_range_show, attr_range_store),
- __ATTR(enable_device, 0666, attr_enable_show, attr_enable_store),
- __ATTR(enable_selftest, 0666, attr_get_selftest, attr_set_selftest),
-#ifdef DEBUG
- __ATTR(reg_value, 0600, attr_reg_get, attr_reg_set),
- __ATTR(reg_addr, 0200, NULL, attr_addr_set),
- __ATTR(printlog, 0600, attr_get_printlog, attr_set_printlog),
-#endif
-};
-
-static int create_sysfs_interfaces(struct device *dev)
-{
- int i;
- for (i = 0; i < ARRAY_SIZE(attributes); i++)
- if (device_create_file(dev, attributes + i))
- goto error;
- return 0;
-
-error:
- for ( ; i >= 0; i--)
- device_remove_file(dev, attributes + i);
- dev_err(dev, "%s:Unable to create interface\n", __func__);
- return -1;
-}
-
-static int remove_sysfs_interfaces(struct device *dev)
-{
- int i;
- for (i = 0; i < ARRAY_SIZE(attributes); i++)
- device_remove_file(dev, attributes + i);
- return 0;
-}
-
-static void l3g4200d_data_report(struct l3g4200d_data *gyro)
-{
- struct l3g4200d_triple data_out;
- int err;
-
- err = l3g4200d_get_data(gyro, &data_out);
- if (err)
- dev_err(&gyro->client->dev, "get_gyroscope_data failed\n");
- else
- l3g4200d_report_values(gyro, &data_out);
-
-}
-
-static int l3g4200d_validate_pdata(struct l3g4200d_data *gyro)
-{
- gyro->pdata->poll_interval = max(gyro->pdata->poll_interval,
- gyro->pdata->min_interval);
-
- if (gyro->pdata->axis_map_x > 2 ||
- gyro->pdata->axis_map_y > 2 ||
- gyro->pdata->axis_map_z > 2) {
- dev_err(&gyro->client->dev,
- "invalid axis_map value x:%u y:%u z%u\n",
- gyro->pdata->axis_map_x,
- gyro->pdata->axis_map_y,
- gyro->pdata->axis_map_z);
- return -EINVAL;
- }
-
- /* Only allow 1 and -1 for direction flag */
- if (abs(gyro->pdata->direction_x) != 1 ||
- abs(gyro->pdata->direction_y) != 1 ||
- abs(gyro->pdata->direction_z) != 1) {
- dev_err(&gyro->client->dev,
- "invalid direction value x:%d y:%d z:%d\n",
- gyro->pdata->direction_x,
- gyro->pdata->direction_y,
- gyro->pdata->direction_z);
- return -EINVAL;
- }
-
- /* Enforce minimum polling interval */
- if (gyro->pdata->poll_interval < gyro->pdata->min_interval) {
- dev_err(&gyro->client->dev,
- "minimum poll interval violated\n");
- return -EINVAL;
- }
- return 0;
-}
-
-static int l3g4200d_misc_open(struct inode *inode, struct file *file)
-{
- int err;
-
- err = nonseekable_open(inode, file);
- if(err < 0)
- return err;
-
- file->private_data = i2c_get_clientdata(l3g4200d_i2c_client);
-
- return 0;
-}
-
-static int l3g4200d_misc_close(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-
-static long l3g4200d_misc_ioctl(struct file *file,
- unsigned int cmd, unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- int interval, val;
- int err = -1;
- struct l3g4200d_data *gyro = file->private_data;
-
- switch(cmd){
- case GYRO_IOCTL_GET_DELAY:
- interval = gyro->pdata->poll_interval;
- if(copy_to_user(argp, &interval, sizeof(interval)))
- return -EFAULT;
- break;
-
- case GYRO_IOCTL_SET_DELAY:
- if(copy_from_user(&interval, argp, sizeof(interval)))
- return -EFAULT;
- err = l3g4200d_set_delay(gyro, interval);
- if(err < 0)
- return err;
- break;
-
- case GYRO_IOCTL_SET_ENABLE:
- if(copy_from_user(&val, argp, sizeof(val)))
- return -EFAULT;
- if(val > 1)
- return -EINVAL;
-
- if(val)
- l3g4200d_enable(gyro);
- else
- l3g4200d_disable(gyro);
- break;
-
- case GYRO_IOCTL_GET_ENABLE:
- val = atomic_read(&gyro->enabled);
- if(copy_to_user(argp, &val, sizeof(val)))
- return -EINVAL;
- break;
-
- case WMT_IOCTL_SENSOR_GET_DRVID:
- val = L3G4200D_DRVID;
- if (copy_to_user(argp, &val, sizeof(val)))
- return -EFAULT;
- break;
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static const struct file_operations l3g4200d_misc_fops = {
- .owner = THIS_MODULE,
- .open = l3g4200d_misc_open,
- .unlocked_ioctl = l3g4200d_misc_ioctl,
- .release = l3g4200d_misc_close,
-};
-
-static struct miscdevice l3g4200d_misc_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = GYRO_MISCDEV_NAME,
- .fops = &l3g4200d_misc_fops,
-};
-
-static int l3g4200d_input_init(struct l3g4200d_data *gyro)
-{
- int err = -1;
- struct input_dev *input;
-
- gyro->input_dev = input_allocate_device();
- if (!gyro->input_dev) {
- err = -ENOMEM;
- dev_err(&gyro->client->dev,
- "input device allocate failed\n");
- goto err0;
- }
-
- input = gyro->input_dev;
-
- input_set_drvdata(input, gyro);
-
- set_bit(EV_ABS, input->evbit);
-
- input_set_abs_params(input, ABS_X, -FS_MAX, FS_MAX, FUZZ, FLAT);
- input_set_abs_params(input, ABS_Y, -FS_MAX, FS_MAX, FUZZ, FLAT);
- input_set_abs_params(input, ABS_Z, -FS_MAX, FS_MAX, FUZZ, FLAT);
-
- input->name = GYRO_INPUT_NAME;
-
- err = input_register_device(input);
- if (err) {
- dev_err(&gyro->client->dev,
- "unable to register input polled device %s\n",
- input->name);
- goto err1;
- }
-
- return 0;
-
-err1:
- input_free_device(input);
-err0:
- return err;
-}
-
-static void l3g4200d_input_cleanup(struct l3g4200d_data *gyro)
-{
- input_unregister_device(gyro->input_dev);
- input_free_device(gyro->input_dev);
-}
-
-static int l3g4300d_detect(struct i2c_client *client)
-{
- int ret;
- u8 buf[1];
- struct l3g4200d_data gyro;
-
- gyro.client = client;
-
- ret = l3g4200d_register_read(&gyro, buf, WHO_AM_I);
- if(ret)
- return 0;
-
- if(buf[0] != WHOAMI_L3G4200D){
- dev_err(&client->dev, "chipId = 0x%02X, error", buf[0]);
- return 0;
- }
-
- return 1;
-}
-
-static irqreturn_t gyro_irq_handler(int irq, void *dev_id)
-{
- if(!gpio_irqstatus(L3G4200D_IRQ_PIN))
- return IRQ_NONE;
-
- wmt_gpio_ack_irq(L3G4200D_IRQ_PIN); //clear interrupt
-
- //printk("got gyro interrupt\n");
- if(!is_gpio_irqenable(L3G4200D_IRQ_PIN)) {
- //pr_err("l3g4200d irq is disabled\n");
- return IRQ_HANDLED;
- }else
- return IRQ_WAKE_THREAD;
-}
-
-static irqreturn_t gyro_irq_thread(int irq, void *dev)
-{
- struct l3g4200d_data *gyro = dev;
-
- l3g4200d_data_report(gyro);
-
- return IRQ_HANDLED;
-}
-
-static void l3g4200d_enable_work_func(struct work_struct *work)
-{
- struct delayed_work *dwork = to_delayed_work(work);
- struct l3g4200d_data *gyro =
- container_of(dwork, struct l3g4200d_data, enable_work);
-
- l3g4200d_flush_gyro_data(gyro);
- l3g4200d_gpio_irq_enable();
-}
-
-static void l3g4200d_input_poll_func(struct work_struct *work)
-{
- struct l3g4200d_triple data;
- struct delayed_work *dwork = to_delayed_work(work);
- struct l3g4200d_data *gyro =
- container_of(dwork, struct l3g4200d_data, input_work);
-
- if(flush_polling_data == 0)
- l3g4200d_data_report(gyro);
- else {
- l3g4200d_get_data(gyro, &data); //flush the first data
- flush_polling_data = 0;
- }
-
- schedule_delayed_work(&gyro->input_work,
- usecs_to_jiffies(gyro->pdata->poll_interval));
-}
-
-static int l3g4200d_param_parse(int *p_int_mode, struct l3g4200d_gyr_platform_data *pdata)
-{
- char varbuf[64] = {0};
- int n, ret, varlen;
- int tmp[7];
-
- varlen = sizeof(varbuf);
-
- ret = wmt_getsyspara("wmt.io.gyro.l3g4200d", varbuf, &varlen);
- if(ret)
- return 0;
-
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d",
- &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4], &tmp[5], &tmp[6]);
-
- if(n != 7) {
- pr_err("l3g4200d-gyro param format error\n");
- return -1;
- }
-
- pdata->axis_map_x = tmp[0];
- pdata->direction_x = tmp[1];
- pdata->axis_map_y = tmp[2];
- pdata->direction_y = tmp[3];
- pdata->axis_map_z = tmp[4];
- pdata->direction_z = tmp[5];
- *p_int_mode = tmp[6];
-
- return 0;
-}
-
-static int l3g4200d_probe(struct i2c_client *client,
- const struct i2c_device_id *devid)
-{
- struct l3g4200d_data *gyro;
- int err = -1;
- u8 buf[2];
-
- pr_info("%s: probe start.\n", L3G4200D_GYR_DEV_NAME);
-
- if (client->dev.platform_data == NULL) {
- dev_err(&client->dev, "platform data is NULL. exiting.\n");
- err = -ENODEV;
- goto err0;
- }
-
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
- dev_err(&client->dev, "client not i2c capable:1\n");
- err = -ENODEV;
- goto err0;
- }
-
- if(l3g4300d_detect(client) == 0){
- dev_err(&client->dev, "not found the gyro\n");
- err = -ENODEV;
- goto err0;
- }
-
- gyro = kzalloc(sizeof(*gyro), GFP_KERNEL);
- if (gyro == NULL) {
- dev_err(&client->dev,
- "failed to allocate memory for module data\n");
- err = -ENOMEM;
- goto err0;
- }
-
- l3g4200d_param_parse(&interrupt_mode, client->dev.platform_data);
- if(interrupt_mode) {
- pr_info("l3g4200d-gyro in interrupt mode\n");
- err = l3g4200d_irq_hw_init(0);
- if(err)
- goto err0;
- }
- else
- pr_info("l3g4200d-gyro in polling mode\n");
-
- mutex_init(&gyro->lock);
- mutex_lock(&gyro->lock);
- gyro->client = client;
-
- gyro->pdata = kmalloc(sizeof(*gyro->pdata), GFP_KERNEL);
- if (gyro->pdata == NULL) {
- dev_err(&client->dev,
- "failed to allocate memory for pdata: %d\n", err);
- goto err1;
- }
- memcpy(gyro->pdata, client->dev.platform_data,
- sizeof(*gyro->pdata));
-
- err = l3g4200d_validate_pdata(gyro);
- if (err < 0) {
- dev_err(&client->dev, "failed to validate platform data\n");
- goto err1_1;
- }
-
- i2c_set_clientdata(client, gyro);
-
- if (gyro->pdata->init) {
- err = gyro->pdata->init();
- if (err < 0) {
- dev_err(&client->dev, "init failed: %d\n", err);
- goto err1_1;
- }
- }
-
- if(interrupt_mode)
- gyro->pdata->init_state.ctrl_reg3 |= I2_DRDY;
-
- //According to the introduction of L3G4200D's datasheet page 32,
- //the bit7 and bit6 of CTRL_REG2's value is loaded at boot. This value must not be changed
- buf[0] = CTRL_REG2;
- err = l3g4200d_i2c_read(gyro, buf, 1);
- if(err)
- goto err1_1;
-
- gyro->pdata->init_state.ctrl_reg2 = (gyro->pdata->init_state.ctrl_reg2 & 0x1F)
- | (buf[0] & 0xC0);
-
- gyro->pdata->init_state.ctrl_reg1 &= ~PM_MASK;
-
- memcpy(&gyro->resume_state, &gyro->pdata->init_state,
- sizeof(struct reg_value_t));
-
- err = l3g4200d_hw_init(gyro);
- if (err) {
- dev_err(&client->dev, "hardware init failed: %d\n", err);
- goto err2;
- }
-
- err = l3g4200d_input_init(gyro);
- if (err < 0)
- goto err3;
-
- err = create_sysfs_interfaces(&client->dev);
- if (err < 0) {
- dev_err(&client->dev,
- "%s device register failed\n", L3G4200D_GYR_DEV_NAME);
- goto err4;
- }
-
- /* As default, do not report information */
- atomic_set(&gyro->enabled, 0);
-
- if(interrupt_mode)
- INIT_DELAYED_WORK(&gyro->enable_work, l3g4200d_enable_work_func);
- else
- INIT_DELAYED_WORK(&gyro->input_work, l3g4200d_input_poll_func);
-
- err = misc_register(&l3g4200d_misc_device);
- if(err){
- dev_err(&client->dev, "l3g4200d_device register failed\n");
- goto err5;
- }
-
- if(interrupt_mode) {
- err = request_threaded_irq(gyro->client->irq, gyro_irq_handler,
- gyro_irq_thread, IRQF_SHARED, L3G4200D_GYR_DEV_NAME, gyro);
-
- if(err) {
- pr_err("%s: irq request failed: %d\n", __func__, err);
- err = -ENODEV;
- goto err6;
- }
- }
-
- mutex_unlock(&gyro->lock);
-
-#ifdef DEBUG
- pr_info("%s probed: device created successfully\n",
- L3G4200D_GYR_DEV_NAME);
-#endif
-
- return 0;
-
-err6:
- misc_deregister(&l3g4200d_misc_device);
-err5:
- remove_sysfs_interfaces(&client->dev);
-err4:
- l3g4200d_input_cleanup(gyro);
-err3:
- l3g4200d_device_power_off(gyro);
-err2:
- if (gyro->pdata->exit)
- gyro->pdata->exit();
-err1_1:
- mutex_unlock(&gyro->lock);
- kfree(gyro->pdata);
-err1:
- kfree(gyro);
- if(interrupt_mode)
- l3g4200d_irq_hw_free();
-err0:
- pr_err("%s: Driver Initialization failed\n",
- L3G4200D_GYR_DEV_NAME);
- return err;
-}
-
-static int l3g4200d_remove(struct i2c_client *client)
-{
- struct l3g4200d_data *gyro = i2c_get_clientdata(client);
-#ifdef DEBUG
- pr_info(KERN_INFO "L3G4200D driver removing\n");
-#endif
-
- l3g4200d_disable(gyro);
- if(interrupt_mode) {
- free_irq(gyro->client->irq, gyro);
- l3g4200d_irq_hw_free();
- }
- misc_deregister(&l3g4200d_misc_device);
- l3g4200d_input_cleanup(gyro);
- remove_sysfs_interfaces(&client->dev);
- kfree(gyro->pdata);
- kfree(gyro);
- return 0;
-}
-
-static void l3g4200d_shutdown(struct i2c_client *client)
-{
- struct l3g4200d_data *gyro = i2c_get_clientdata(client);
-
- pr_info("l3g4200d_shutdown\n");
-
- l3g4200d_disable(gyro);
-}
-
-
-static int l3g4200d_suspend(struct device *dev)
-{
- struct l3g4200d_data *gyro = i2c_get_clientdata(l3g4200d_i2c_client);
- int err;
- u8 buf[8];
-
- pr_info(KERN_INFO "l3g4200d_suspend\n");
-
- if(atomic_read(&gyro->enabled)) {
- if(interrupt_mode) {
- cancel_delayed_work_sync(&gyro->enable_work);
- l3g4200d_gpio_irq_disable();
- }
- else
- cancel_delayed_work_sync(&gyro->input_work);
-
- //store register value
- buf[0] = (AUTO_INCREMENT | CTRL_REG1);
- err = l3g4200d_i2c_read(gyro, buf, 6);
- if(err)
- goto err1;
- gyro->resume_state.ctrl_reg1 = buf[0];
- gyro->resume_state.ctrl_reg2 = buf[1];
- gyro->resume_state.ctrl_reg3 = buf[2];
- gyro->resume_state.ctrl_reg4 = buf[3];
- gyro->resume_state.ctrl_reg5 = buf[4];
- gyro->resume_state.ref_datacap = buf[5];
-
- buf[0] = FIFO_CTRL_REG;
- err = l3g4200d_i2c_read(gyro, buf, 1);
- if(err)
- goto err1;
- gyro->resume_state.fifo_ctrl_reg = buf[0];
-
- buf[0] = INT1_CFG;
- err = l3g4200d_i2c_read(gyro, buf, 1);
- if(err)
- goto err1;
- gyro->resume_state.int1_cfg = buf[0];
-
- buf[0] = (AUTO_INCREMENT | INT1_THS_XH);
- err = l3g4200d_i2c_read(gyro, buf, 7);
- if(err)
- goto err1;
-
- gyro->resume_state.int1_ths_xh = buf[0];
- gyro->resume_state.int1_ths_xl = buf[1];
- gyro->resume_state.int1_ths_yh = buf[2];
- gyro->resume_state.int1_ths_yl = buf[3];
- gyro->resume_state.int1_ths_zh = buf[4];
- gyro->resume_state.int1_ths_zl = buf[5];
- gyro->resume_state.int1_duration = buf[6];
- }
-
- goto exit1;
-
-err1:
- dev_err(&gyro->client->dev, "save register value fail at suspend\n");
- memcpy(&gyro->resume_state, &gyro->pdata->init_state,
- sizeof(struct reg_value_t));
-exit1:
- l3g4200d_device_power_off(gyro);
-
- if (gyro->hw_initialized)
- gyro->hw_initialized = 0;
-
- return 0;
-}
-
-static int l3g4200d_resume(struct device *dev)
-{
- struct l3g4200d_data *gyro = i2c_get_clientdata(l3g4200d_i2c_client);
- int err;
-
- pr_info(KERN_INFO "l3g4200d_resume\n");
-
- if(interrupt_mode)
- l3g4200d_irq_hw_init(1);
-
- if(atomic_read(&gyro->enabled)) {
-
- err = l3g4200d_device_power_on(gyro);
- if(err)
- {
- dev_err(&gyro->client->dev, "power_on failed at resume\n");
- atomic_set(&gyro->enabled, 0);
-
- return 0;
- }
-
- //do not report noise at IC power-up
- // flush data before really read
- if(interrupt_mode)
- schedule_delayed_work(&gyro->enable_work, msecs_to_jiffies(
- L3G4200D_PU_DELAY));
- else {
- flush_polling_data = 1;
- schedule_delayed_work(&gyro->input_work, msecs_to_jiffies(
- L3G4200D_PU_DELAY));
- }
- }else {
- memcpy(&gyro->resume_state, &gyro->pdata->init_state,
- sizeof(struct reg_value_t));
-
- err = l3g4200d_hw_init(gyro);
- if (err)
- dev_err(&gyro->client->dev, "hardware init failed at resume\n");
- }
-
- return 0;
-}
-
-static const struct i2c_device_id l3g4200d_id[] = {
- { L3G4200D_GYR_DEV_NAME , 0 },
- {},
-};
-
-MODULE_DEVICE_TABLE(i2c, l3g4200d_id);
-
-static struct dev_pm_ops l3g4200d_pm = {
- .suspend = l3g4200d_suspend,
- .resume = l3g4200d_resume,
-};
-
-static struct i2c_driver l3g4200d_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = L3G4200D_GYR_DEV_NAME,
- .pm = &l3g4200d_pm,
- },
- .probe = l3g4200d_probe,
- .remove = __devexit_p(l3g4200d_remove),
- .shutdown = l3g4200d_shutdown,
- .id_table = l3g4200d_id,
-};
-
-static struct l3g4200d_gyr_platform_data gyr_drvr_platform_data={
- .poll_interval = 10000, // us
- .min_interval = 1250, // us
-
- .fs_range = L3G4200D_GYR_FS_2000DPS,
-
- .axis_map_x = 0,
- .axis_map_y = 1,
- .axis_map_z = 2,
-
- .direction_x = 1,
- .direction_y = -1,
- .direction_z = -1,
-
- .init_state.ctrl_reg1 = 0x17, //ODR100
- .init_state.ctrl_reg2 = 0x00,
- .init_state.ctrl_reg3 = 0x00, //DRDY interrupt
- .init_state.ctrl_reg4 = 0xA0, //BDU enable, 2000 dps
- .init_state.ctrl_reg5 = 0x00,
- .init_state.ref_datacap = 0x00,
- .init_state.fifo_ctrl_reg = 0x00,
- .init_state.int1_cfg = 0x00,
- .init_state.int1_ths_xh = 0x00,
- .init_state.int1_ths_xl = 0x00,
- .init_state.int1_ths_yh = 0x00,
- .init_state.int1_ths_yl = 0x00,
- .init_state.int1_ths_zh = 0x00,
- .init_state.int1_ths_zl = 0x00,
- .init_state.int1_duration = 0x00
-};
-
-static struct i2c_board_info __initdata l3g4200d_i2c_board[] = {
- {
- I2C_BOARD_INFO(L3G4200D_GYR_DEV_NAME, L3G4200D_I2C_ADDR),
- .irq = IRQ_GPIO,
- .platform_data = &gyr_drvr_platform_data,
- },
-};
-
-static int __init l3g4200d_init(void)
-{
- int ret;
- struct i2c_adapter *adapter;
-
-#ifdef DEBUG
- pr_info("%s: gyroscope sysfs driver init\n", L3G4200D_GYR_DEV_NAME);
-#endif
-
- adapter = i2c_get_adapter(0);
- if (adapter == NULL) {
- pr_err("%s: i2c_get_adapter() error\n", L3G4200D_GYR_DEV_NAME);
- return -ENODEV;
- }
-
- l3g4200d_i2c_client = i2c_new_device(adapter, l3g4200d_i2c_board);
- if (l3g4200d_i2c_client == NULL) {
- pr_err("%s: i2c_new_device() error\n", L3G4200D_GYR_DEV_NAME);
- return -ENOMEM;
- }
-
- i2c_put_adapter(adapter);
-
- ret = i2c_add_driver(&l3g4200d_driver);
- if(ret){
- pr_err("%s: i2c_add_driver() failed\n", L3G4200D_GYR_DEV_NAME);
- i2c_unregister_device(l3g4200d_i2c_client);
- return ret;
- }
-
- return ret;
-}
-
-static void __exit l3g4200d_exit(void)
-{
-#ifdef DEBUG
- pr_info("L3G4200D exit\n");
-#endif
-
- i2c_del_driver(&l3g4200d_driver);
- i2c_unregister_device(l3g4200d_i2c_client);
-
- return;
-}
-
-module_init(l3g4200d_init);
-module_exit(l3g4200d_exit);
-
-MODULE_DESCRIPTION("l3g4200d digital gyroscope sysfs driver");
-MODULE_AUTHOR("Matteo Dameno, Carmine Iascone, STMicroelectronics");
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/Makefile
deleted file mode 100755
index 8a419fc7..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_mc3230
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := mc32x0.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0.c b/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0.c
deleted file mode 100755
index 4330dbb6..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0.c
+++ /dev/null
@@ -1,2580 +0,0 @@
-/* Date: 2011/4/8 11:00:00
- * Revision: 2.5
- */
-
-/*
- * This software program is licensed subject to the GNU General Public License
- * (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
-
- * (C) Copyright 2011 Bosch Sensortec GmbH
- * All Rights Reserved
- */
-
-
-/* file mc32x0.c
- brief This file contains all function implementations for the mc32x0 in linux
-
-*/
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/mutex.h>
-#include <linux/slab.h>
-#include <linux/mutex.h>
-//#include <linux/earlysuspend.h>
-#include <linux/delay.h>
-#include <asm/uaccess.h>
-#include <linux/miscdevice.h>
-#include <linux/platform_device.h>
-
-//#include <linux/init-input.h>
-#include <mach/hardware.h>
-#include <linux/fs.h>
-
-#include "../sensor.h"
-#include "mc32x0_driver.h"
-
-
-#if 0
-#define mcprintkreg(x...) printk(x)
-#else
-#define mcprintkreg(x...)
-#endif
-
-#if 0
-#define mcprintkfunc(x...) printk(x)
-#else
-#define mcprintkfunc(x...)
-#endif
-
-#if 0
-#define GSE_ERR(x...) printk(x)
-#define GSE_LOG(x...) printk(x)
-#else
-#define GSE_ERR(x...)
-#define GSE_LOG(x...)
-#endif
-
-static int g_virtual_z = 0;
-#define G_2_REVERSE_VIRTUAL_Z 0 //!!!!! 1
-#define SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
-#define LOW_RESOLUTION 1
-#define HIGH_RESOLUTION 2
-#define RBM_RESOLUTION 3
-#ifdef SUPPORT_VIRTUAL_Z_SENSOR
-#define Low_Pos_Max 127
-#define Low_Neg_Max -128
-#define High_Pos_Max 8191
-#define High_Neg_Max -8192
-#define VIRTUAL_Z 1
-static int Railed = 0;
-#else
-#define VIRTUAL_Z 0
-#endif
-
-
-static struct class* l_dev_class = NULL;
-
-
-
-
-#define GSENSOR_NAME "mc3230"
-#define SENSOR_DATA_SIZE 3
-#define AVG_NUM 16
-/* Addresses to scan */
-//static const unsigned short normal_i2c[2] = {0x00,I2C_CLIENT_END};
-
-
-//volatile unsigned char mc32x0_on_off=0;
-//static int mc32x0_pin_hd;
-static char mc32x0_on_off_str[32];
-#define G_0 ABS_X
-#define G_1 ABS_Y
-#define G_2 ABS_Z
-#define G_0_REVERSE 1
-#define G_1_REVERSE 1
-#define G_2_REVERSE -1
-
-#define GRAVITY_1G_VALUE 1000
-
-#define SENSOR_DMARD_IOCTL_BASE 234
-
-#define IOCTL_SENSOR_SET_DELAY_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 100)
-#define IOCTL_SENSOR_GET_DELAY_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 101)
-#define IOCTL_SENSOR_GET_STATE_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 102)
-#define IOCTL_SENSOR_SET_STATE_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 103)
-#define IOCTL_SENSOR_GET_DATA_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 104)
-
-#define IOCTL_MSENSOR_SET_DELAY_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 200)
-#define IOCTL_MSENSOR_GET_DATA_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 201)
-#define IOCTL_MSENSOR_GET_STATE_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 202)
-#define IOCTL_MSENSOR_SET_STATE_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 203)
-
-#define IOCTL_SENSOR_GET_NAME _IO(SENSOR_DMARD_IOCTL_BASE, 301)
-#define IOCTL_SENSOR_GET_VENDOR _IO(SENSOR_DMARD_IOCTL_BASE, 302)
-
-#define IOCTL_SENSOR_GET_CONVERT_PARA _IO(SENSOR_DMARD_IOCTL_BASE, 401)
-
-#define SENSOR_CALIBRATION _IOWR(SENSOR_DMARD_IOCTL_BASE, 402, int[SENSOR_DATA_SIZE])
-
-
-#define mc32x0_CONVERT_PARAMETER (1.5f * (9.80665f) / 256.0f)
-//#define mc32x0_DISPLAY_NAME "mc32x0"
-//#define mc32x0_DIPLAY_VENDOR "domintech"
-
-#define X_OUT 0x41
-#define CONTROL_REGISTER 0x44
-#define SW_RESET 0x53
-#define WHO_AM_I 0x0f
-#define WHO_AM_I_VALUE 0x06
-
-#define MC32X0_AXIS_X 0
-#define MC32X0_AXIS_Y 1
-#define MC32X0_AXIS_Z 2
-#define MC32X0_AXES_NUM 3
-#define MC32X0_DATA_LEN 6
-
-#define MC32X0_XOUT_REG 0x00
-#define MC32X0_YOUT_REG 0x01
-#define MC32X0_ZOUT_REG 0x02
-#define MC32X0_Tilt_Status_REG 0x03
-#define MC32X0_Sampling_Rate_Status_REG 0x04
-#define MC32X0_Sleep_Count_REG 0x05
-#define MC32X0_Interrupt_Enable_REG 0x06
-#define MC32X0_Mode_Feature_REG 0x07
-#define MC32X0_Sample_Rate_REG 0x08
-#define MC32X0_Tap_Detection_Enable_REG 0x09
-#define MC32X0_TAP_Dwell_Reject_REG 0x0a
-#define MC32X0_DROP_Control_Register_REG 0x0b
-#define MC32X0_SHAKE_Debounce_REG 0x0c
-#define MC32X0_XOUT_EX_L_REG 0x0d
-#define MC32X0_XOUT_EX_H_REG 0x0e
-#define MC32X0_YOUT_EX_L_REG 0x0f
-#define MC32X0_YOUT_EX_H_REG 0x10
-#define MC32X0_ZOUT_EX_L_REG 0x11
-#define MC32X0_ZOUT_EX_H_REG 0x12
-#define MC32X0_CHIP_ID_REG 0x18
-#define MC32X0_RANGE_Control_REG 0x20
-#define MC32X0_SHAKE_Threshold_REG 0x2B
-#define MC32X0_UD_Z_TH_REG 0x2C
-#define MC32X0_UD_X_TH_REG 0x2D
-#define MC32X0_RL_Z_TH_REG 0x2E
-#define MC32X0_RL_Y_TH_REG 0x2F
-#define MC32X0_FB_Z_TH_REG 0x30
-#define MC32X0_DROP_Threshold_REG 0x31
-#define MC32X0_TAP_Threshold_REG 0x32
-#define MC32X0_HIGH_END 0x01
-/*******MC3210/20 define this**********/
-
-
-#define MCUBE_8G_14BIT 0x10
-
-#define DOT_CALI
-
-#define MC32X0_LOW_END 0x02
-/*******mc32x0 define this**********/
-
-#define MCUBE_1_5G_8BIT 0x20
-//#define MCUBE_1_5G_8BIT_TAP
-//#define MCUBE_1_5G_6BIT
-#define MC32X0_MODE_DEF 0x43
-
-#define MC32X0ADDRESS 0x4c
-
-#define mc32x0_I2C_NAME "mc32x0"
-#define GSENSOR_DEV_COUNT 1
-#define GSENSOR_DURATION_MAX 200
-#define GSENSOR_DURATION_MIN 10
-#define GSENSOR_DURATION_DEFAULT 20
-
-#define MAX_RETRY 20
-#define INPUT_FUZZ 0
-#define INPUT_FLAT 0
-
-#define AUTO_CALIBRATION 0
-
-static unsigned char is_new_mc34x0 = 0;
-static unsigned char is_mc3250 = 0;
-
-static unsigned char McubeID=0;
-#ifdef DOT_CALI
-#define CALIB_PATH "/data/data/com.mcube.acc/files/mcube-calib.txt"
-//MCUBE_BACKUP_FILE
-#define BACKUP_CALIB_PATH "/data/misc/sensors/mcube-calib.txt"
-//static char backup_buf[64];
-//MCUBE_BACKUP_FILE
-#define DATA_PATH "/sdcard/mcube-register-map.txt"
-
-typedef struct {
- unsigned short x; /**< X axis */
- unsigned short y; /**< Y axis */
- unsigned short z; /**< Z axis */
-} GSENSOR_VECTOR3D;
-
-static GSENSOR_VECTOR3D gsensor_gain;
-static struct miscdevice mc32x0_device;
-
-//static struct file * fd_file = NULL;
-
-static mm_segment_t oldfs;
-//add by Liang for storage offset data
-static unsigned char offset_buf[9];
-static signed int offset_data[3];
-s16 G_RAW_DATA[3];
-static signed int gain_data[3];
-static signed int enable_RBM_calibration = 0;
-#endif
-
-#ifdef DOT_CALI
-
-#if 1
-#define GSENSOR 0xA1//0x95
-
-#define GSENSOR_IOCTL_INIT _IO(GSENSOR, 0x01)
-#define GSENSOR_IOCTL_READ_CHIPINFO _IOR(GSENSOR, 0x02, int)
-#define GSENSOR_IOCTL_READ_SENSORDATA _IOR(GSENSOR, 0x17, int)
-#define GSENSOR_IOCTL_READ_OFFSET _IOR(GSENSOR, 0x04, GSENSOR_VECTOR3D)
-#define GSENSOR_IOCTL_READ_GAIN _IOR(GSENSOR, 0x05, GSENSOR_VECTOR3D)
-#define GSENSOR_IOCTL_READ_RAW_DATA _IOR(GSENSOR, 0x30, int)
-//#define GSENSOR_IOCTL_SET_CALI _IOW(GSENSOR, 0x06, SENSOR_DATA)
-#define GSENSOR_IOCTL_GET_CALI _IOW(GSENSOR, 0x22, SENSOR_DATA)
-#define GSENSOR_IOCTL_CLR_CALI _IO(GSENSOR, 0x23)
-#define GSENSOR_MCUBE_IOCTL_READ_RBM_DATA _IOR(GSENSOR, 0x24, SENSOR_DATA)
-#define GSENSOR_MCUBE_IOCTL_SET_RBM_MODE _IO(GSENSOR, 0x25)
-#define GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE _IO(GSENSOR, 0x26)
-#define GSENSOR_MCUBE_IOCTL_SET_CALI _IOW(GSENSOR, 0x27, SENSOR_DATA)
-#define GSENSOR_MCUBE_IOCTL_REGISTER_MAP _IO(GSENSOR, 0x28)
-#define GSENSOR_IOCTL_SET_CALI_MODE _IOW(GSENSOR, 0x29,int)
-#else
-
-#define GSENSOR_IOCTL_INIT 0xa1
-#define GSENSOR_IOCTL_READ_CHIPINFO 0xa2
-#define GSENSOR_IOCTL_READ_SENSORDATA 0xa3
-#define GSENSOR_IOCTL_READ_OFFSET 0xa4
-#define GSENSOR_IOCTL_READ_GAIN 0xa5
-#define GSENSOR_IOCTL_READ_RAW_DATA 0xa6
-#define GSENSOR_IOCTL_SET_CALI 0xa7
-#define GSENSOR_IOCTL_GET_CALI 0xa8
-#define GSENSOR_IOCTL_CLR_CALI 0xa9
-
-#define GSENSOR_MCUBE_IOCTL_READ_RBM_DATA 0xaa
-#define GSENSOR_MCUBE_IOCTL_SET_RBM_MODE 0xab
-#define GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE 0xac
-#define GSENSOR_MCUBE_IOCTL_SET_CALI 0xad
-#define GSENSOR_MCUBE_IOCTL_REGISTER_MAP 0xae
-#define GSENSOR_IOCTL_SET_CALI_MODE 0xaf
-#endif
-
-typedef struct{
- int x;
- int y;
- int z;
-}SENSOR_DATA;
-
-static int load_cali_flg = 0;
-//MCUBE_BACKUP_FILE
-//static bool READ_FROM_BACKUP = false;
-//MCUBE_BACKUP_FILE
-
-#endif
-
-#define MC32X0_WAKE 1
-#define MC32X0_SNIFF 2
-#define MC32X0_STANDBY 3
-
-struct dev_data {
- struct i2c_client *client;
-};
-static struct dev_data dev;
-
-/* Addresses to scan */
-static const unsigned short normal_i2c[2] = {MC32X0ADDRESS, I2C_CLIENT_END};
-
-/*
-typedef union {
- struct {
- s16 x;
- s16 y;
- s16 z;
- } u;
- s16 v[SENSOR_DATA_SIZE];
-} raw_data;
-static raw_data offset;
-*/
-
-struct acceleration {
- int x;
- int y;
- int z;
-};
-
-//void gsensor_write_offset_to_file(void);
-//void gsensor_read_offset_from_file(void);
-//char OffsetFileName[] = "/data/misc/dmt/offset.txt";
-/*static struct sensor_config_info gsensor_info = {
- .input_type = GSENSOR_TYPE,
-};*/
-
-static u32 debug_mask = 0;
-#define dprintk(level_mask, fmt, arg...) if (unlikely(debug_mask & level_mask)) \
- printk(KERN_DEBUG fmt , ## arg)
-
-module_param_named(debug_mask, debug_mask, int, 0644);
-
-
-enum {
- DEBUG_INIT = 1U << 0,
- DEBUG_CONTROL_INFO = 1U << 1,
- DEBUG_DATA_INFO = 1U << 2,
- DEBUG_SUSPEND = 1U << 3,
-};
-
-struct mc32x0_data {
- struct mutex lock;
- struct i2c_client *client;
- struct delayed_work work;
- struct workqueue_struct *mc32x0_wq;
- struct hrtimer timer;
- struct device *device;
- struct input_dev *input_dev;
- int use_count;
- int enabled;
- volatile unsigned int duration;
- int use_irq;
- int irq;
- unsigned long irqflags;
- int gpio;
- unsigned int map[3];
- int inv[3];
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif
- // for control
- int int_gpio; //0-3
- int op;
- int samp;
- //int xyz_axis[3][3]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- int isdbg;
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- int offset[MC32X0_AXES_NUM+1]; /*+1: for 4-byte alignment*/
- s16 data[MC32X0_AXES_NUM+1];
-};
-
-static struct mc32x0_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 16,
- /*.xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },*/
- .sensor_proc = NULL,
- .isdbg = 1,
- .sensor_samp = 1, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- //.offset={0,0,0},
-};
-
-
-//=============================================================================
-enum mc3xx0_orientation
-{
- MC3XX0_TOP_LEFT_DOWN = 0,
- MC3XX0_TOP_RIGHT_DOWN,
- MC3XX0_TOP_RIGHT_UP,
- MC3XX0_TOP_LEFT_UP,
- MC3XX0_BOTTOM_LEFT_DOWN,
- MC3XX0_BOTTOM_RIGHT_DOWN,
- MC3XX0_BOTTOM_RIGHT_UP,
- MC3XX0_BOTTOM_LEFT_UP
-};
-
-enum mc3xx0_axis
-{
- MC3XX0_AXIS_X = 0,
- MC3XX0_AXIS_Y,
- MC3XX0_AXIS_Z,
- MC3XX0_AXIS_NUM
-};
-
-struct mc3xx0_hwmsen_convert
-{
- signed int sign[3];
- unsigned int map[3];
-};
-
-// Transformation matrix for chip mounting position
-static const struct mc3xx0_hwmsen_convert mc3xx0_cvt[] =
-{
- {{ 1, 1, 1}, {MC3XX0_AXIS_X, MC3XX0_AXIS_Y, MC3XX0_AXIS_Z}}, // 0: top , left-down
- {{-1, 1, 1}, {MC3XX0_AXIS_Y, MC3XX0_AXIS_X, MC3XX0_AXIS_Z}}, // 1: top , right-down
- {{-1, -1, 1}, {MC3XX0_AXIS_X, MC3XX0_AXIS_Y, MC3XX0_AXIS_Z}}, // 2: top , right-up
- {{ 1, -1, 1}, {MC3XX0_AXIS_Y, MC3XX0_AXIS_X, MC3XX0_AXIS_Z}}, // 3: top , left-up
- {{-1, 1, -1}, {MC3XX0_AXIS_X, MC3XX0_AXIS_Y, MC3XX0_AXIS_Z}}, // 4: bottom, left-down
- {{ 1, 1, -1}, {MC3XX0_AXIS_Y, MC3XX0_AXIS_X, MC3XX0_AXIS_Z}}, // 5: bottom, right-down
- {{ 1, -1, -1}, {MC3XX0_AXIS_X, MC3XX0_AXIS_Y, MC3XX0_AXIS_Z}}, // 6: bottom, right-up
- {{-1, -1, -1}, {MC3XX0_AXIS_Y, MC3XX0_AXIS_X, MC3XX0_AXIS_Z}}, // 7: bottom, left-up
-};
-
-//static unsigned char mc3xx0_current_placement = MC3XX0_BOTTOM_LEFT_DOWN; // current soldered placement
-static struct mc3xx0_hwmsen_convert *pCvt;
-
-//volatile static short sensor_duration = SENSOR_DURATION_DEFAULT;//delay
-//volatile static short sensor_state_flag = 1;
-
-#ifdef SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
-int Verify_Z_Railed(int AccData, int resolution)
-{
- int status = 0;
- GSE_LOG("%s: AccData = %d",__func__, AccData);
- if(resolution == 1) // Low resolution
- {
- if((AccData >= Low_Pos_Max && AccData >=0)|| (AccData <= Low_Neg_Max && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at Low Resolution",__func__);
- }
- }
- else if (resolution == 2) //High resolution
- {
- if((AccData >= High_Pos_Max && AccData >=0) || (AccData <= High_Neg_Max && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at High Resolution",__func__);
- }
- }
- else if (resolution == 3) //High resolution
- {
- if((AccData >= Low_Pos_Max*3 && AccData >=0) || (AccData <= Low_Neg_Max*3 && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at High Resolution",__func__);
- }
- }
- else
- GSE_LOG("%s, Wrong resolution",__func__);
-
- return status;
-}
-
-int SquareRoot(int x)
-{
- int lowerbound;
- int upperbound;
- int root;
-
- if(x < 0) return -1;
- if(x == 0 || x == 1) return x;
- lowerbound = 1;
- upperbound = x;
- root = lowerbound + (upperbound - lowerbound)/2;
-
- while(root > x/root || root+1 <= x/(root+1))
- {
- if(root > x/root)
- {
- upperbound = root;
- }
- else
- {
- lowerbound = root;
- }
- root = lowerbound + (upperbound - lowerbound)/2;
- }
- GSE_LOG("%s: Sqrt root is %d",__func__, root);
- return root;
-}
-#endif
-
-
-unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-static ssize_t mc32x0_map_show(struct device *dev, struct device_attribute *attr,char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct mc32x0_data *data;
- int i;
- data = i2c_get_clientdata(client);
- for (i = 0; i< 3; i++)
- {
- if(data->inv[i] == 1)
- {
- switch(data->map[i])
- {
- case ABS_X:
- buf[i] = 'x';
- break;
- case ABS_Y:
- buf[i] = 'y';
- break;
- case ABS_Z:
- buf[i] = 'z';
- break;
- default:
- buf[i] = '_';
- break;
- }
- }
- else
- {
- switch(data->map[i])
- {
- case ABS_X:
- buf[i] = 'X';
- break;
- case ABS_Y:
- buf[i] = 'Y';
- break;
- case ABS_Z:
- buf[i] = 'Z';
- break;
- default:
- buf[i] = '-';
- break;
- }
- }
- }
- sprintf(buf+3,"\r\n");
- return 5;
-}
-/*
-//Function as i2c_master_send, and return 1 if operation is successful.
-static int i2c_write_bytes(struct i2c_client *client, uint8_t *data, uint16_t len)
-{
- struct i2c_msg msg;
- int ret=-1;
-
- msg.flags = !I2C_M_RD;
- msg.addr = client->addr;
- msg.len = len;
- msg.buf = data;
-
- ret=i2c_transfer(client->adapter, &msg,1);
- return ret;
-}
-
-static bool gsensor_i2c_test(struct i2c_client * client)
-{
- int ret, retry;
- uint8_t test_data[1] = { 0 }; //only write a data address.
-
- for(retry=0; retry < 2; retry++)
- {
- ret =i2c_write_bytes(client, test_data, 1); //Test i2c.
- if (ret == 1)
- break;
- msleep(5);
- }
-
- return ret==1 ? true : false;
-}
-*/
-/**
- * gsensor_detect - Device detection callback for automatic device creation
- * return value:
- * = 0; success;
- * < 0; err
- */
- /*
-static int gsensor_detect(struct i2c_client *client, struct i2c_board_info *info)
-{
- struct i2c_adapter *adapter = client->adapter;
- int ret;
-
- dprintk(DEBUG_INIT, "%s enter \n", __func__);
-
- if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
- return -ENODEV;
-
- if(twi_id == adapter->nr){
- pr_info("%s: addr= %x\n",__func__,client->addr);
-
- ret = gsensor_i2c_test(client);
- if(!ret){
- pr_info("%s:I2C connection might be something wrong or maybe the other gsensor equipment! \n",__func__);
- return -ENODEV;
- }else{
- pr_info("I2C connection sucess!\n");
- strlcpy(info->type, SENSOR_NAME, I2C_NAME_SIZE);
- return 0;
- }
-
- }else{
- return -ENODEV;
- }
-}
-*/
-int mc32x0_set_image (struct i2c_client *client)
-{
- int comres = 0;
- unsigned char data;
-
-
- data = i2c_smbus_read_byte_data(client, 0x3B);
- //comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x3B, &data, 1 );
- if((data == 0x19)||(data == 0x29))
- {
- McubeID = 0x22;
- }
- else if((data == 0x90)||(data == 0xA8))
- {
- McubeID = 0x11;
- }
- else
- {
- McubeID = 0;
- }
-
- if (0x88 == data)
- {
- McubeID = 0x11;
- is_mc3250 = 1;
- }
-
- if (0x39 == data)
- {
- McubeID = 0x22;
- is_new_mc34x0 = 1;
- }
- else if (0xB8 == data)
- {
- McubeID = 0x11;
- is_new_mc34x0 = 1;
- }
-
-
- if(McubeID &MCUBE_8G_14BIT)
- {
- //#ifdef MCUBE_8G_14BIT
- data = MC32X0_MODE_DEF;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Mode_Feature_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Sleep_Count_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Sample_Rate_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Tap_Detection_Enable_REG,data);
- data = 0x3F;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_RANGE_Control_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Interrupt_Enable_REG,data);
-#ifdef DOT_CALI
- gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 1024;
-#endif
- //#endif
- }
- else if(McubeID &MCUBE_1_5G_8BIT)
- {
- #ifdef MCUBE_1_5G_8BIT
- data = MC32X0_MODE_DEF;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Mode_Feature_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Sleep_Count_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Sample_Rate_REG,data);
- data = 0x02;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_RANGE_Control_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Tap_Detection_Enable_REG,data);
- data = 0x00;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Interrupt_Enable_REG,data);
-#ifdef DOT_CALI
- gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 86;
-#endif
- #endif
- }
-
- data = 0x41;
- //comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
- i2c_smbus_write_byte_data(client, MC32X0_Mode_Feature_REG,data);
- //MC32X0_rbm(0,0);
- return comres;
-}
-
-static ssize_t mc32x0_map_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct mc32x0_data *data;
- int i;
- data = i2c_get_clientdata(client);
-
- if(count < 3) return -EINVAL;
-
- for(i = 0; i< 3; i++)
- {
- switch(buf[i])
- {
- case 'x':
- data->map[i] = ABS_X;
- data->inv[i] = 1;
- break;
- case 'y':
- data->map[i] = ABS_Y;
- data->inv[i] = 1;
- break;
- case 'z':
- data->map[i] = ABS_Z;
- data->inv[i] = 1;
- break;
- case 'X':
- data->map[i] = ABS_X;
- data->inv[i] = -1;
- break;
- case 'Y':
- data->map[i] = ABS_Y;
- data->inv[i] = -1;
- break;
- case 'Z':
- data->map[i] = ABS_Z;
- data->inv[i] = -1;
- break;
- default:
- return -EINVAL;
- }
- }
-
- return count;
-}
-
-static int mc32x0_enable(struct mc32x0_data *data, int enable);
-
-static ssize_t mc32x0_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = container_of(mc32x0_device.parent, struct i2c_client, dev);
-
- struct mc32x0_data *mc32x0 = i2c_get_clientdata(client);
-
- return sprintf(buf, "%d\n", mc32x0->enabled);
-}
-
-static ssize_t mc32x0_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- bool new_enable;
-
- struct i2c_client *client = container_of(mc32x0_device.parent, struct i2c_client, dev);
-
- struct mc32x0_data *mc32x0 = i2c_get_clientdata(client);
-
- if (sysfs_streq(buf, "1"))
- new_enable = true;
- else if (sysfs_streq(buf, "0"))
- new_enable = false;
- else {
- pr_debug("%s: invalid value %d\n", __func__, *buf);
- return -EINVAL;
- }
-
- mc32x0_enable(mc32x0, new_enable);
-
- return count;
-}
-
-static ssize_t mc32x0_delay_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%d\n", 1000/l_sensorconfig.sensor_samp);
-}
-
-static ssize_t mc32x0_delay_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- unsigned long data;
- int error;
-
- error = strict_strtoul(buf, 10, &data);
- if (error)
- return error;
- if (data > GSENSOR_DURATION_MAX)
- data = GSENSOR_DURATION_MAX;
- if (data < GSENSOR_DURATION_MIN)
- data = GSENSOR_DURATION_MIN;
- l_sensorconfig.sensor_samp = 1000/data;
-
- return count;
-}
-
-static DEVICE_ATTR(map, 0660, mc32x0_map_show, mc32x0_map_store);
-static DEVICE_ATTR(enable, 0660, mc32x0_enable_show, mc32x0_enable_store);
-static DEVICE_ATTR(delay, 0660, mc32x0_delay_show, mc32x0_delay_store);
-
-static struct attribute* mc32x0_attrs[] =
-{
- &dev_attr_map.attr,
- &dev_attr_enable.attr,
- &dev_attr_delay.attr,
- NULL
-};
-
-static const struct attribute_group mc32x0_group =
-{
- .attrs = mc32x0_attrs,
-};
-
-static int mc32x0_chip_init(struct i2c_client *client)
-{
-
- mc32x0_set_image(client);
-
- return McubeID?0:-1;
-}
-
-int mc32x0_set_mode(struct i2c_client *client, unsigned char mode)
-{
-
- int comres=0;
- unsigned char data;
-
-
- if (mode<4) {
- data = 0x40|mode;
- i2c_smbus_write_byte_data(client, MC32X0_Mode_Feature_REG,data);
- }
- return comres;
-
-}
-
-
-
-#ifdef DOT_CALI
-struct file *openFile(const char *path,int flag,int mode)
-{
- struct file *fp;
-
- fp=filp_open(path, flag, mode);
- if (IS_ERR(fp) || !fp->f_op)
- {
- GSE_LOG("Calibration File filp_open return NULL\n");
- return NULL;
- }
- else
- {
-
- return fp;
- }
-}
-
-int readFile(struct file *fp,char *buf,int readlen)
-{
- if (fp->f_op && fp->f_op->read)
- return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
- else
- return -1;
-}
-
-int writeFile(struct file *fp,char *buf,int writelen)
-{
- if (fp->f_op && fp->f_op->write)
- return fp->f_op->write(fp,buf,writelen, &fp->f_pos);
- else
- return -1;
-}
-
-int closeFile(struct file *fp)
-{
- filp_close(fp,NULL);
- return 0;
-}
-
-void initKernelEnv(void)
-{
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- printk(KERN_INFO "initKernelEnv\n");
-}
-
- int MC32X0_WriteCalibration(struct i2c_client *client, int dat[MC32X0_AXES_NUM])
-{
- int err;
- u8 buf[9];
- s16 tmp, x_gain, y_gain, z_gain ;
- s32 x_off, y_off, z_off;
- int temp_cali_dat[MC32X0_AXES_NUM] = { 0 };
- //const struct mc3xx0_hwmsen_convert *pCvt = NULL;
-
- //pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
-
- temp_cali_dat[pCvt->map[MC3XX0_AXIS_X]] = pCvt->sign[MC3XX0_AXIS_X] * dat[MC3XX0_AXIS_X];
- temp_cali_dat[pCvt->map[MC3XX0_AXIS_Y]] = pCvt->sign[MC3XX0_AXIS_Y] * dat[MC3XX0_AXIS_Y];
- temp_cali_dat[pCvt->map[MC3XX0_AXIS_Z]] = pCvt->sign[MC3XX0_AXIS_Z] * dat[MC3XX0_AXIS_Z];
-/*
- temp_cali_dat[MC3XX0_AXIS_X] = ((temp_cali_dat[MC3XX0_AXIS_X] * gsensor_gain.x) / GRAVITY_1G_VALUE);
- temp_cali_dat[MC3XX0_AXIS_Y] = ((temp_cali_dat[MC3XX0_AXIS_Y] * gsensor_gain.y) / GRAVITY_1G_VALUE);
- temp_cali_dat[MC3XX0_AXIS_Z] = ((temp_cali_dat[MC3XX0_AXIS_Z] * gsensor_gain.z) / GRAVITY_1G_VALUE);
-*/
- if (is_new_mc34x0)
- {
- temp_cali_dat[MC3XX0_AXIS_X] = -temp_cali_dat[MC3XX0_AXIS_X];
- temp_cali_dat[MC3XX0_AXIS_Y] = -temp_cali_dat[MC3XX0_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = temp_cali_dat[MC3XX0_AXIS_X];
-
- temp_cali_dat[MC3XX0_AXIS_X] = -temp_cali_dat[MC3XX0_AXIS_Y];
- temp_cali_dat[MC3XX0_AXIS_Y] = temp;
- }
-
- dat[MC3XX0_AXIS_X] = temp_cali_dat[MC3XX0_AXIS_X];
- dat[MC3XX0_AXIS_Y] = temp_cali_dat[MC3XX0_AXIS_Y];
- dat[MC3XX0_AXIS_Z] = temp_cali_dat[MC3XX0_AXIS_Z];
-
-#if 0 //modify by zwx
-
- GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n",
- dat[MC32X0_AXIS_X], dat[MC32X0_AXIS_Y], dat[MC32X0_AXIS_Z]);
-
- /*calculate the real offset expected by caller*/
- //cali_temp[MC32X0_AXIS_X] = dat[MC32X0_AXIS_X];
- //cali_temp[MC32X0_AXIS_Y] = dat[MC32X0_AXIS_Y];
- //cali_temp[MC32X0_AXIS_Z] = dat[MC32X0_AXIS_Z];
- //cali[MC32X0_AXIS_Z]= cali[MC32X0_AXIS_Z]-gsensor_gain.z;
-
-
-#endif
-// read register 0x21~0x28
-#if 1 //zwx
- //if ((err = mc32x0_read_block(client, 0x21, buf, 3)))
- //if ((err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x21, &buf[0],3)))
- err = i2c_smbus_read_i2c_block_data(client , 0x21 , 3 , &buf[0]);
-
- //if ((err = mc32x0_read_block(client, 0x24, &buf[3], 3)))
- //if ((err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x24, &buf[3],3)))
- err = i2c_smbus_read_i2c_block_data(client , 0x24 , 3 , &buf[3]);
-
- //if ((err = mc32x0_read_block(client, 0x27, &buf[6], 3)))
- //if ((err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x27, &buf[6],3)))
- err = i2c_smbus_read_i2c_block_data(client , 0x27 , 3 , &buf[6]);
-
-#else
- buf[0] = 0x21;
- err = mc32x0_rx_data(client, &buf[0], 3);
- buf[3] = 0x24;
- err = mc32x0_rx_data(client, &buf[3], 3);
- buf[6] = 0x27;
- err = mc32x0_rx_data(client, &buf[6], 3);
-#endif
-#if 1
- // get x,y,z offset
- tmp = ((buf[1] & 0x3f) << 8) + buf[0];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- x_off = tmp;
-
- tmp = ((buf[3] & 0x3f) << 8) + buf[2];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- y_off = tmp;
-
- tmp = ((buf[5] & 0x3f) << 8) + buf[4];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- z_off = tmp;
-
- // get x,y,z gain
- x_gain = ((buf[1] >> 7) << 8) + buf[6];
- y_gain = ((buf[3] >> 7) << 8) + buf[7];
- z_gain = ((buf[5] >> 7) << 8) + buf[8];
-
- // prepare new offset
- x_off = x_off + 16 * dat[MC32X0_AXIS_X] * 256 * 128 / 3 / gsensor_gain.x / (40 + x_gain);
- y_off = y_off + 16 * dat[MC32X0_AXIS_Y] * 256 * 128 / 3 / gsensor_gain.y / (40 + y_gain);
- z_off = z_off + 16 * dat[MC32X0_AXIS_Z] * 256 * 128 / 3 / gsensor_gain.z / (40 + z_gain);
-
- //storege the cerrunt offset data with DOT format
- offset_data[0] = x_off;
- offset_data[1] = y_off;
- offset_data[2] = z_off;
-
- //storege the cerrunt Gain data with GOT format
- gain_data[0] = 256*8*128/3/(40+x_gain);
- gain_data[1] = 256*8*128/3/(40+y_gain);
- gain_data[2] = 256*8*128/3/(40+z_gain);
- printk("%d %d ======================\n\n ",gain_data[0],x_gain);
-#endif
- buf[0]=0x43;
- //mc32x0_write_block(client, 0x07, buf, 1);
- //mc32x0_write_reg(client,0x07,0x43);
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf[0]);
- buf[0] = x_off & 0xff;
- buf[1] = ((x_off >> 8) & 0x3f) | (x_gain & 0x0100 ? 0x80 : 0);
- buf[2] = y_off & 0xff;
- buf[3] = ((y_off >> 8) & 0x3f) | (y_gain & 0x0100 ? 0x80 : 0);
- buf[4] = z_off & 0xff;
- buf[5] = ((z_off >> 8) & 0x3f) | (z_gain & 0x0100 ? 0x80 : 0);
-
-
- //mc32x0_write_block(client, 0x21, buf, 6);
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x21, &buf[0], 6 );
- i2c_smbus_write_i2c_block_data(client, 0x21, 2,&buf[0]);
- i2c_smbus_write_i2c_block_data(client, 0x21+2, 2,&buf[2]);
- i2c_smbus_write_i2c_block_data(client, 0x21+4, 2,&buf[4]);
-
-
- buf[0]=0x41;
- //mc32x0_write_block(client, 0x07, buf, 1);
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf[0]);
- //mc32x0_write_reg(client,0x07,0x41);
-
- return err;
-
-}
-/*
-int mcube_read_cali_file(struct i2c_client *client)
-{
- int cali_data[3];
- int err =0;
-
- printk("%s %d\n",__func__,__LINE__);
- //MCUBE_BACKUP_FILE
- READ_FROM_BACKUP = false;
- //MCUBE_BACKUP_FILE
- initKernelEnv();
- fd_file = openFile(CALIB_PATH,O_RDONLY,0);
- //MCUBE_BACKUP_FILE
- if (fd_file == NULL)
- {
- fd_file = openFile(BACKUP_CALIB_PATH, O_RDONLY, 0);
- if(fd_file != NULL)
- {
- READ_FROM_BACKUP = true;
- }
- }
- //MCUBE_BACKUP_FILE
- if (fd_file == NULL)
- {
- GSE_LOG("fail to open\n");
- cali_data[0] = 0;
- cali_data[1] = 0;
- cali_data[2] = 0;
- return 1;
- }
- else
- {
- printk("%s %d\n",__func__,__LINE__);
- memset(backup_buf,0,64);
- if ((err = readFile(fd_file,backup_buf,128))>0)
- GSE_LOG("buf:%s\n",backup_buf);
- else
- GSE_LOG("read file error %d\n",err);
- printk("%s %d\n",__func__,__LINE__);
-
- set_fs(oldfs);
- closeFile(fd_file);
-
- sscanf(backup_buf, "%d %d %d",&cali_data[MC32X0_AXIS_X], &cali_data[MC32X0_AXIS_Y], &cali_data[MC32X0_AXIS_Z]);
- GSE_LOG("cali_data: %d %d %d\n", cali_data[MC32X0_AXIS_X], cali_data[MC32X0_AXIS_Y], cali_data[MC32X0_AXIS_Z]);
-
- //cali_data1[MC32X0_AXIS_X] = cali_data[MC32X0_AXIS_X] * gsensor_gain.x / GRAVITY_EARTH_1000;
- //cali_data1[MC32X0_AXIS_Y] = cali_data[MC32X0_AXIS_Y] * gsensor_gain.y / GRAVITY_EARTH_1000;
- //cali_data1[MC32X0_AXIS_Z] = cali_data[MC32X0_AXIS_Z] * gsensor_gain.z / GRAVITY_EARTH_1000;
- //cali_data[MC32X0_AXIS_X]=-cali_data[MC32X0_AXIS_X];
- //cali_data[MC32X0_AXIS_Y]=-cali_data[MC32X0_AXIS_Y];
- //cali_data[MC32X0_AXIS_Z]=-cali_data[MC32X0_AXIS_Z];
-
- //GSE_LOG("cali_data1: %d %d %d\n", cali_data1[MC32X0_AXIS_X], cali_data1[MC32X0_AXIS_Y], cali_data1[MC32X0_AXIS_Z]);
- printk("%s %d\n",__func__,__LINE__);
- MC32X0_WriteCalibration(client,cali_data);
- }
-
- return 0;
-}
-*/
-
-void MC32X0_rbm(struct i2c_client *client, int enable)
-{
- //int err;
- char buf1[3];
- if(enable == 1 )
- {
-#if 1
- buf1[0] = 0x43;
- //err = mc32x0_write_block(client, 0x07, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf1[0]);
- buf1[0] = 0x02;
- //err = mc32x0_write_block(client, 0x14, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x14, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x14,buf1[0]);
- buf1[0] = 0x41;
- //err = mc32x0_write_block(client, 0x07, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf1[0]);
-#else
- err = mc32x0_write_reg(client,0x07,0x43);
- err = mc32x0_write_reg(client,0x14,0x02);
- err = mc32x0_write_reg(client,0x07,0x41);
-#endif
- enable_RBM_calibration =1;
-
- GSE_LOG("set rbm!!\n");
-
- msleep(10);
- }
- else if(enable == 0 )
- {
-#if 1
- buf1[0] = 0x43;
- //err = mc32x0_write_block(client, 0x07, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf1[0]);
-
- buf1[0] = 0x00;
- //err = mc32x0_write_block(client, 0x14, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x14, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x14,buf1[0]);
- buf1[0] = 0x41;
- //err = mc32x0_write_block(client, 0x07, buf1, 0x01);
- //err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf1[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf1[0]);
-#else
- err = mc32x0_write_reg(client,0x07,0x43);
- err = mc32x0_write_reg(client,0x14,0x00);
- err = mc32x0_write_reg(client,0x07,0x41);
-#endif
- enable_RBM_calibration =0;
-
- GSE_LOG("clear rbm!!\n");
-
- msleep(10);
- }
-}
-
-/*----------------------------------------------------------------------------*/
- int MC32X0_ReadData_RBM(struct i2c_client *client,int data[MC32X0_AXES_NUM])
-{
- //u8 uData;
- u8 addr = 0x0d;
- u8 rbm_buf[MC32X0_DATA_LEN] = {0};
- int err = 0;
-
-
- //err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, addr, &rbm_buf[0],6);
- err = i2c_smbus_read_i2c_block_data(client , addr , 6 , rbm_buf);
- //err = mc32x0_read_block(client, addr, rbm_buf, 0x06);
-
- data[MC32X0_AXIS_X] = (s16)((rbm_buf[0]) | (rbm_buf[1] << 8));
- data[MC32X0_AXIS_Y] = (s16)((rbm_buf[2]) | (rbm_buf[3] << 8));
- data[MC32X0_AXIS_Z] = (s16)((rbm_buf[4]) | (rbm_buf[5] << 8));
-
- GSE_LOG("rbm_buf<<<<<[%02x %02x %02x %02x %02x %02x]\n",rbm_buf[0], rbm_buf[2], rbm_buf[2], rbm_buf[3], rbm_buf[4], rbm_buf[5]);
- GSE_LOG("RBM<<<<<[%04x %04x %04x]\n", data[MC32X0_AXIS_X], data[MC32X0_AXIS_Y], data[MC32X0_AXIS_Z]);
- GSE_LOG("RBM<<<<<[%04d %04d %04d]\n", data[MC32X0_AXIS_X], data[MC32X0_AXIS_Y], data[MC32X0_AXIS_Z]);
- return err;
-}
-
-
- int MC32X0_ReadRBMData(struct i2c_client *client, char *buf)
-{
- //struct mc32x0_data *mc32x0 = i2c_get_clientdata(client);
- int res = 0;
- int data[3];
-
- if (!buf)
- {
- return EINVAL;
- }
-
- mc32x0_set_mode(client,MC32X0_WAKE);
-/*
- if(mc32x0->status == mc32x0_CLOSE)
- {
- res = mc32x0_start(client, 0);
- if(res)
- {
- GSE_ERR("Power on mc32x0 error %d!\n", res);
- }
- }
-*/
- if((res = MC32X0_ReadData_RBM(client,data)))
- {
- GSE_ERR("%s I2C error: ret value=%d",__func__, res);
- return EIO;
- }
- else
- {
- sprintf(buf, "%04x %04x %04x", data[MC32X0_AXIS_X],
- data[MC32X0_AXIS_Y], data[MC32X0_AXIS_Z]);
-
- }
-
- return 0;
-}
- int MC32X0_ReadOffset(struct i2c_client *client,s16 ofs[MC32X0_AXES_NUM])
-{
- int err;
- u8 off_data[6];
-
-
- if(McubeID &MCUBE_8G_14BIT)
- {
-
- //if ((err = mc32x0_read_block(client, MC32X0_XOUT_EX_L_REG, off_data, MC32X0_DATA_LEN)))
- //if ((err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_EX_L_REG, &off_data[0],MC32X0_DATA_LEN)))
- err = i2c_smbus_read_i2c_block_data(client , MC32X0_XOUT_EX_L_REG , MC32X0_DATA_LEN , off_data);
-
- ofs[MC32X0_AXIS_X] = ((s16)(off_data[0]))|((s16)(off_data[1])<<8);
- ofs[MC32X0_AXIS_Y] = ((s16)(off_data[2]))|((s16)(off_data[3])<<8);
- ofs[MC32X0_AXIS_Z] = ((s16)(off_data[4]))|((s16)(off_data[5])<<8);
- }
- else if(McubeID &MCUBE_1_5G_8BIT)
- {
- //if ((err = mc32x0_read_block(client, 0, off_data, 3)))
- //if ((err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0, &off_data[0],3)))
- err = i2c_smbus_read_i2c_block_data(client , 0 , 3 , off_data);
-
- ofs[MC32X0_AXIS_X] = (s8)off_data[0];
- ofs[MC32X0_AXIS_Y] = (s8)off_data[1];
- ofs[MC32X0_AXIS_Z] = (s8)off_data[2];
- }
-
- GSE_LOG("MC32X0_ReadOffset %d %d %d \n",ofs[MC32X0_AXIS_X] ,ofs[MC32X0_AXIS_Y],ofs[MC32X0_AXIS_Z]);
-
- return 0;
-}
-/*----------------------------------------------------------------------------*/
- int MC32X0_ResetCalibration(struct i2c_client *client)
-{
-
- u8 buf[6];
- s16 tmp;
- int err;
-#if 1 //zwx
- buf[0] = 0x43;
- //if(err = mc32x0_write_block(client, 0x07, buf, 1))
- //if(err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf[0], 1 ))
- if((err = i2c_smbus_write_byte_data(client, 0x07,buf[0])))
- {
- GSE_ERR("error 0x07: %d\n", err);
- }
-
-
- //if(err = mc32x0_write_block(client, 0x21, offset_buf, 6)) // add by liang for writing offset register as OTP value
- //if(err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x21, &offset_buf[0], 6 ))
- if((err = i2c_smbus_write_i2c_block_data(client, 0x21, 6,offset_buf)))
- {
- GSE_ERR("error: %d\n", err);
- }
-
- buf[0] = 0x41;
- //if(err = mc32x0_write_block(client, 0x07, buf, 1))
- //if(err = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf[0], 1 ))
- if((err = i2c_smbus_write_byte_data(client, 0x07,buf[0])))
- {
- GSE_ERR("error: %d\n", err);
- }
-#else
- mc32x0_write_reg(client,0x07,0x43);
-
- mc32x0_write_block(client, 0x21, offset_buf, 6);
-
- mc32x0_write_reg(client,0x07,0x41);
-#endif
- msleep(20);
-
- tmp = ((offset_buf[1] & 0x3f) << 8) + offset_buf[0]; // add by Liang for set offset_buf as OTP value
- if (tmp & 0x2000)
- tmp |= 0xc000;
- offset_data[0] = tmp;
-
- tmp = ((offset_buf[3] & 0x3f) << 8) + offset_buf[2]; // add by Liang for set offset_buf as OTP value
- if (tmp & 0x2000)
- tmp |= 0xc000;
- offset_data[1] = tmp;
-
- tmp = ((offset_buf[5] & 0x3f) << 8) + offset_buf[4]; // add by Liang for set offset_buf as OTP value
- if (tmp & 0x2000)
- tmp |= 0xc000;
- offset_data[2] = tmp;
-
- //memset(mc32x0->cali_sw, 0x00, sizeof(mc32x0->cali_sw));
- return 0;
-
-}
-/*----------------------------------------------------------------------------*/
- int MC32X0_ReadCalibration(struct i2c_client *client,int dat[MC32X0_AXES_NUM])
-{
-
- signed short MC_offset[MC32X0_AXES_NUM+1]; /*+1: for 4-byte alignment*/
- int err;
- memset(MC_offset, 0, sizeof(MC_offset));
- if ((err = MC32X0_ReadOffset(client, MC_offset))) {
- GSE_ERR("read offset fail, %d\n", err);
- return err;
- }
-
- dat[MC32X0_AXIS_X] = MC_offset[MC32X0_AXIS_X];
- dat[MC32X0_AXIS_Y] = MC_offset[MC32X0_AXIS_Y];
- dat[MC32X0_AXIS_Z] = MC_offset[MC32X0_AXIS_Z];
- //modify by zwx
- //GSE_LOG("MC32X0_ReadCalibration %d %d %d \n",dat[mc32x0->cvt.map[MC32X0_AXIS_X]] ,dat[mc32x0->cvt.map[MC32X0_AXIS_Y]],dat[mc32x0->cvt.map[MC32X0_AXIS_Z]]);
-
- return 0;
-}
-
-/*----------------------------------------------------------------------------*/
-
- int MC32X0_ReadData(struct i2c_client *client, s16 buffer[MC32X0_AXES_NUM])
-{
- unsigned char buf[6];
- signed char buf1[6];
- char rbm_buf[6];
- int ret;
- //int err = 0;
-
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR
- int tempX=0;
- int tempY=0;
- int tempZ=0;
- #endif
-
- if ( enable_RBM_calibration == 0)
- {
- //err = hwmsen_read_block(client, addr, buf, 0x06);
- }
- else if (enable_RBM_calibration == 1)
- {
- memset(rbm_buf, 0, 6);
- //rbm_buf[0] = mc32x0_REG_RBM_DATA;
- //ret = mc32x0_rx_data(client, &rbm_buf[0], 6);
- //ret = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x0d, &rbm_buf[0],6);
- i2c_smbus_read_i2c_block_data(client , 0x0d , 2 , &rbm_buf[0]);
- i2c_smbus_read_i2c_block_data(client , 0x0d+2 , 2 , &rbm_buf[2]);
- i2c_smbus_read_i2c_block_data(client , 0x0d+4 , 2 , &rbm_buf[4]);
- }
-
- if ( enable_RBM_calibration == 0)
- {
-
- if(McubeID &MC32X0_HIGH_END)
- {
- #ifdef MC32X0_HIGH_END
- ret = i2c_smbus_read_i2c_block_data(client , MC32X0_XOUT_EX_L_REG , 6 , buf);
- //ret = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_EX_L_REG, &buf[0],6);
-
- buffer[0] = (signed short)((buf[0])|(buf[1]<<8));
- buffer[1] = (signed short)((buf[2])|(buf[3]<<8));
- buffer[2] = (signed short)((buf[4])|(buf[5]<<8));
- #endif
- }
- else if(McubeID &MC32X0_LOW_END)
- {
- #ifdef MC32X0_LOW_END
- ret = i2c_smbus_read_i2c_block_data(client , MC32X0_XOUT_REG , 3 , buf1);
- //ret = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_REG, &buf[0],3);
-
- buffer[0] = (signed short)buf1[0];
- buffer[1] = (signed short)buf1[1];
- buffer[2] = (signed short)buf1[2];
- #endif
- }
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
- if (g_virtual_z)
- {
- //printk("%s 1\n", __FUNCTION__);
-
- tempX = buffer[MC32X0_AXIS_X];
- tempY = buffer[MC32X0_AXIS_Y];
- tempZ = buffer[MC32X0_AXIS_Z];
- //printk(" %d:Verify_Z_Railed() %d\n", (int)buffer[MC32X0_AXIS_Z], Verify_Z_Railed((int)buffer[MC32X0_AXIS_Z], LOW_RESOLUTION));
- if(1 == Verify_Z_Railed((int)buffer[MC32X0_AXIS_Z], LOW_RESOLUTION)) // z-railed
- {
- Railed = 1;
-
- GSE_LOG("%s: Z railed", __func__);
- //printk("%s: Z railed \n", __func__);
- if (G_2_REVERSE_VIRTUAL_Z == 1)
- buffer[MC32X0_AXIS_Z] = (s8) ( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- else
- buffer[MC32X0_AXIS_Z] = (s8) -( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- }
- else
- {
- Railed = 0;
- }
- }
- #endif
- mcprintkreg("MC32X0_ReadData : %d %d %d \n",buffer[0],buffer[1],buffer[2]);
- }
- else if (enable_RBM_calibration == 1)
- {
- buffer[MC32X0_AXIS_X] = (s16)((rbm_buf[0]) | (rbm_buf[1] << 8));
- buffer[MC32X0_AXIS_Y] = (s16)((rbm_buf[2]) | (rbm_buf[3] << 8));
- buffer[MC32X0_AXIS_Z] = (s16)((rbm_buf[4]) | (rbm_buf[5] << 8));
-
- GSE_LOG("%s RBM<<<<<[%08d %08d %08d]\n", __func__,buffer[MC32X0_AXIS_X], buffer[MC32X0_AXIS_Y], buffer[MC32X0_AXIS_Z]);
- if(gain_data[0] == 0)
- {
- buffer[MC32X0_AXIS_X] = 0;
- buffer[MC32X0_AXIS_Y] = 0;
- buffer[MC32X0_AXIS_Z] = 0;
- return 0;
- }
- buffer[MC32X0_AXIS_X] = (buffer[MC32X0_AXIS_X] + offset_data[0]/2)*gsensor_gain.x/gain_data[0];
- buffer[MC32X0_AXIS_Y] = (buffer[MC32X0_AXIS_Y] + offset_data[1]/2)*gsensor_gain.y/gain_data[1];
- buffer[MC32X0_AXIS_Z] = (buffer[MC32X0_AXIS_Z] + offset_data[2]/2)*gsensor_gain.z/gain_data[2];
-
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR // add 2013-10-23
- if (g_virtual_z)
- {
- tempX = buffer[MC32X0_AXIS_X];
- tempY = buffer[MC32X0_AXIS_Y];
- tempZ = buffer[MC32X0_AXIS_Z];
- //printk("%s 2\n", __FUNCTION__);
- GSE_LOG("Original RBM<<<<<[%08d %08d %08d]\n", buffer[MC32X0_AXIS_X], buffer[MC32X0_AXIS_Y], buffer[MC32X0_AXIS_Z]);
- printk("Verify_Z_Railed() %d\n", Verify_Z_Railed((int)buffer[MC32X0_AXIS_Z], RBM_RESOLUTION));
- if(1 == Verify_Z_Railed(buffer[MC32X0_AXIS_Z], RBM_RESOLUTION)) // z-railed
- {
- GSE_LOG("%s: Z Railed in RBM mode",__FUNCTION__);
- //printk("%s: Z Railed in RBM mode\n",__FUNCTION__);
- if (G_2_REVERSE_VIRTUAL_Z == 1)
- buffer[MC32X0_AXIS_Z] = (s16) ( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- else
- buffer[MC32X0_AXIS_Z] = (s16) -( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- }
- GSE_LOG("RBM<<<<<[%08d %08d %08d]\n", buffer[MC32X0_AXIS_X], buffer[MC32X0_AXIS_Y], buffer[MC32X0_AXIS_Z]);
- }
- #endif
-
- GSE_LOG("%s offset_data <<<<<[%d %d %d]\n", __func__,offset_data[0], offset_data[1], offset_data[2]);
-
- GSE_LOG("%s gsensor_gain <<<<<[%d %d %d]\n", __func__,gsensor_gain.x, gsensor_gain.y, gsensor_gain.z);
-
- GSE_LOG("%s gain_data <<<<<[%d %d %d]\n", __func__,gain_data[0], gain_data[1], gain_data[2]);
-
- GSE_LOG("%s RBM->RAW <<<<<[%d %d %d]\n", __func__,buffer[MC32X0_AXIS_X], buffer[MC32X0_AXIS_Y], buffer[MC32X0_AXIS_Z]);
- }
-
- return 0;
-}
-
-int MC32X0_ReadRawData(struct i2c_client *client, char * buf)
-{
-
-
- int res = 0;
- s16 raw_buf[3];
-
- if (!buf)
- {
- return EINVAL;
- }
-
- //mc32x0_power_up(mc32x0);
- mc32x0_set_mode(client, MC32X0_WAKE);
- if((res = MC32X0_ReadData(client,&raw_buf[0])))
- {
- printk("%s %d\n",__FUNCTION__, __LINE__);
- GSE_ERR("I2C error: ret value=%d", res);
- return EIO;
- }
- else
- {
- //const struct mc3xx0_hwmsen_convert *pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
- GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n",
- raw_buf[MC32X0_AXIS_X], raw_buf[MC32X0_AXIS_Y], raw_buf[MC32X0_AXIS_Z]);
-
- //G_RAW_DATA[MC32X0_AXIS_X] = raw_buf[0];
- //G_RAW_DATA[MC32X0_AXIS_Y] = raw_buf[1];
- //G_RAW_DATA[MC32X0_AXIS_Z] = raw_buf[2];
- //G_RAW_DATA[MC32X0_AXIS_Z] = G_RAW_DATA[MC32X0_AXIS_Z] + gsensor_gain.z;
-/*
- raw_buf[MC3XX0_AXIS_X] = ((raw_buf[MC3XX0_AXIS_X] * GRAVITY_1G_VALUE) / gsensor_gain.x);
- raw_buf[MC3XX0_AXIS_Y] = ((raw_buf[MC3XX0_AXIS_Y] * GRAVITY_1G_VALUE) / gsensor_gain.y);
- raw_buf[MC3XX0_AXIS_Z] = ((raw_buf[MC3XX0_AXIS_Z] * GRAVITY_1G_VALUE) / gsensor_gain.z);
-*/
- if (is_new_mc34x0)
- {
- raw_buf[MC3XX0_AXIS_X] = -raw_buf[MC3XX0_AXIS_X];
- raw_buf[MC3XX0_AXIS_Y] = -raw_buf[MC3XX0_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = raw_buf[MC3XX0_AXIS_X];
-
- raw_buf[MC3XX0_AXIS_X] = raw_buf[MC3XX0_AXIS_Y];
- raw_buf[MC3XX0_AXIS_Y] = -temp;
- }
-
- G_RAW_DATA[MC3XX0_AXIS_X] = pCvt->sign[MC3XX0_AXIS_X] * raw_buf[pCvt->map[MC3XX0_AXIS_X]];
- G_RAW_DATA[MC3XX0_AXIS_Y] = pCvt->sign[MC3XX0_AXIS_Y] * raw_buf[pCvt->map[MC3XX0_AXIS_Y]];
- G_RAW_DATA[MC3XX0_AXIS_Z] = pCvt->sign[MC3XX0_AXIS_Z] * raw_buf[pCvt->map[MC3XX0_AXIS_Z]];
-
- G_RAW_DATA[MC32X0_AXIS_Z] += gsensor_gain.z*(pCvt->sign[MC3XX0_AXIS_Z])*(1);//-=GRAVITY_1G_VALUE;
-
- //printk("%s %d\n",__FUNCTION__, __LINE__);
- sprintf(buf, "%04x %04x %04x", G_RAW_DATA[MC32X0_AXIS_X],
- G_RAW_DATA[MC32X0_AXIS_Y], G_RAW_DATA[MC32X0_AXIS_Z]);
- GSE_LOG("G_RAW_DATA: (%+3d %+3d %+3d)\n",
- G_RAW_DATA[MC32X0_AXIS_X], G_RAW_DATA[MC32X0_AXIS_Y], G_RAW_DATA[MC32X0_AXIS_Z]);
- }
- return 0;
-}
-
-int mc32x0_reset (struct i2c_client *client)
-{
-
- s16 tmp, x_gain, y_gain, z_gain ;
- s32 x_off, y_off, z_off;
- u8 buf[3];
- int err;
- //mc32x0_write_reg(client,0x1b,0x6d);
- buf[0]=0x6d;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1b, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x1b,buf[0]);
-
- //mc32x0_write_reg(client,0x1b,0x43);
- buf[0]=0x43;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1b, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x1b,buf[0]);
- msleep(5);
-
- //mc32x0_write_reg(client,0x07,0x43);
- buf[0]=0x43;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x07,buf[0]);
- //mc32x0_write_reg(client,0x1C,0x80);
- buf[0]=0x80;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1C, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x1c,buf[0]);
- //mc32x0_write_reg(client,0x17,0x80);
- buf[0]=0x80;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x17, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x17,buf[0]);
- msleep(5);
- //mc32x0_write_reg(client,0x1C,0x00);
- buf[0]=0x00;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1C, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x1c,buf[0]);
- //mc32x0_write_reg(client,0x17,0x00);
- buf[0]=0x00;
- //p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x17, &buf[0], 1 );
- i2c_smbus_write_byte_data(client, 0x17,buf[0]);
- msleep(5);
-
-
-/*
- if ((err = mc32x0_read_block(new_client, 0x21, offset_buf, 6))) //add by Liang for storeage OTP offsef register value
- {
- GSE_ERR("error: %d\n", err);
- return err;
- }
-*/
- memset(offset_buf, 0, 9);
- //offset_buf[0] = 0x21;
- //err = mc32x0_rx_data(client, offset_buf, 9);
- //err = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, 0x21, &offset_buf[0],9);
- err = i2c_smbus_read_i2c_block_data(client , 0x21 , 9 , offset_buf);
-
-
- tmp = ((offset_buf[1] & 0x3f) << 8) + offset_buf[0];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- x_off = tmp;
-
- tmp = ((offset_buf[3] & 0x3f) << 8) + offset_buf[2];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- y_off = tmp;
-
- tmp = ((offset_buf[5] & 0x3f) << 8) + offset_buf[4];
- if (tmp & 0x2000)
- tmp |= 0xc000;
- z_off = tmp;
-
- // get x,y,z gain
- x_gain = ((offset_buf[1] >> 7) << 8) + offset_buf[6];
- y_gain = ((offset_buf[3] >> 7) << 8) + offset_buf[7];
- z_gain = ((offset_buf[5] >> 7) << 8) + offset_buf[8];
-
-
- //storege the cerrunt offset data with DOT format
- offset_data[0] = x_off;
- offset_data[1] = y_off;
- offset_data[2] = z_off;
-
- //storege the cerrunt Gain data with GOT format
- gain_data[0] = 256*8*128/3/(40+x_gain);
- gain_data[1] = 256*8*128/3/(40+y_gain);
- gain_data[2] = 256*8*128/3/(40+z_gain);
- printk("offser gain = %d %d %d %d %d %d======================\n\n ",
- gain_data[0],gain_data[1],gain_data[2],offset_data[0],offset_data[1],offset_data[2]);
-
- return 0;
-}
-#endif
-
-int mc32x0_read_accel_xyz(struct i2c_client *client, s16 * acc)
-{
- int comres;
- s16 raw_data[MC3XX0_AXIS_NUM] = { 0 };
- //const struct mc3xx0_hwmsen_convert *pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
-#ifdef DOT_CALI
- s16 raw_buf[6];
-
-
- comres = MC32X0_ReadData(client,&raw_buf[0]);
-
- acc[0] = raw_buf[0];
- acc[1] = raw_buf[1];
- acc[2] = raw_buf[2];
-#else
- unsigned char raw_buf[6];
- signed char raw_buf1[3];
- if(McubeID &MC32X0_HIGH_END)
- {
- #ifdef MC32X0_HIGH_END
- comres = i2c_smbus_read_i2c_block_data(client , MC32X0_XOUT_EX_L_REG , 6 , raw_buf);
- //comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_EX_L_REG, &data[0],6);
-
- acc[0] = (signed short)((raw_buf[0])|(raw_buf[1]<<8));
- acc[1] = (signed short)((raw_buf[2])|(raw_buf[3]<<8));
- acc[2] = (signed short)((raw_buf[4])|(raw_buf[5]<<8));
- #endif
- }
- else if(McubeID &MC32X0_LOW_END)
- {
- #ifdef MC32X0_LOW_END
- comres = i2c_smbus_read_i2c_block_data(client , MC32X0_XOUT_REG , 3 , raw_buf1);
- //comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_REG, &data[0],3);
-
- acc[0] = (signed short)raw_buf1[0];
- acc[1] = (signed short)raw_buf1[1];
- acc[2] = (signed short)raw_buf1[2];
- #endif
- }
-#endif
-
- raw_data[MC3XX0_AXIS_X] = acc[MC3XX0_AXIS_X];
- raw_data[MC3XX0_AXIS_Y] = acc[MC3XX0_AXIS_Y];
- raw_data[MC3XX0_AXIS_Z] = acc[MC3XX0_AXIS_Z];
-/*
- raw_data[MC3XX0_AXIS_X] = ((raw_data[MC3XX0_AXIS_X] * GRAVITY_1G_VALUE) / gsensor_gain.x);
- raw_data[MC3XX0_AXIS_Y] = ((raw_data[MC3XX0_AXIS_Y] * GRAVITY_1G_VALUE) / gsensor_gain.y);
- raw_data[MC3XX0_AXIS_Z] = ((raw_data[MC3XX0_AXIS_Z] * GRAVITY_1G_VALUE) / gsensor_gain.z);
-*/
- if (is_new_mc34x0)
- {
- raw_data[MC3XX0_AXIS_X] = -raw_data[MC3XX0_AXIS_X];
- raw_data[MC3XX0_AXIS_Y] = -raw_data[MC3XX0_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = raw_data[MC3XX0_AXIS_X];
-
- raw_data[MC3XX0_AXIS_X] = raw_data[MC3XX0_AXIS_Y];
- raw_data[MC3XX0_AXIS_Y] = -temp;
- }
-
- acc[MC3XX0_AXIS_X] = pCvt->sign[MC3XX0_AXIS_X] * raw_data[pCvt->map[MC3XX0_AXIS_X]];
- acc[MC3XX0_AXIS_Y] = pCvt->sign[MC3XX0_AXIS_Y] * raw_data[pCvt->map[MC3XX0_AXIS_Y]];
- acc[MC3XX0_AXIS_Z] = pCvt->sign[MC3XX0_AXIS_Z] * raw_data[pCvt->map[MC3XX0_AXIS_Z]];
-
- return comres;
-
-}
-
-static int mc32x0_measure(struct i2c_client *client, struct acceleration *accel)
-{
-
- s16 raw[3];
-
-#ifdef DOT_CALI
- //int ret;
-#endif
-
-
-#ifdef DOT_CALI
- if( load_cali_flg > 0)
- {
- /*ret =mcube_read_cali_file(client);
- if(ret == 0)
- load_cali_flg = ret;
- else
- load_cali_flg --;
- GSE_LOG("load_cali %d\n",ret); */
- MC32X0_WriteCalibration(client,l_sensorconfig.offset);
- load_cali_flg = 0;
- }
-#endif
- /* read acceleration data */
- mc32x0_read_accel_xyz(client,&raw[0]);
-
- accel->x = raw[0] ;
- accel->y = raw[1] ;
- accel->z = raw[2] ;
- return 0;
-}
-
-static void mc32x0_work_func(struct work_struct *work)
-{
- struct mc32x0_data *data = container_of(work, struct mc32x0_data, work);
- struct acceleration accel = {0};
-
- mc32x0_measure(data->client, &accel);
-
- //printk(KERN_ERR"mc32x0_measure: acc.x=%d, acc.y=%d, acc.z=%d\n", data->inv[0]*accel.x,data->inv[1]*accel.y, data->inv[2]*accel.z);
-
- //input_report_abs(data->input_dev, data->map[0], data->inv[0]*accel.x);
- //input_report_abs(data->input_dev, data->map[1], data->inv[1]*accel.y);
- //input_report_abs(data->input_dev, data->map[2], data->inv[2]*accel.z);
-
- //accel.x = (accel.x&0x00FF) | ((accel.y&0xFF)<<8) | ((accel.z&0xFF)<<16);
-
- input_report_abs(data->input_dev, ABS_X, accel.x);
- input_report_abs(data->input_dev, ABS_Y, accel.y);
- input_report_abs(data->input_dev, ABS_Z, accel.z);
- input_sync(data->input_dev);
-
- queue_delayed_work(data->mc32x0_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
-}
-/*
-static enum hrtimer_restart mc32x0_timer_func(struct hrtimer *timer)
-{
- struct mc32x0_data *data = container_of(timer, struct mc32x0_data, timer);
-
- queue_work(data->mc32x0_wq, &data->work);
- hrtimer_start(&data->timer, ktime_set(0, sensor_duration*1000000), HRTIMER_MODE_REL);
-
- return HRTIMER_NORESTART;
-}
-*/
-static int mc32x0_enable(struct mc32x0_data *data, int enable)
-{
- if(enable){
- msleep(10);
- mc32x0_chip_init(data->client);
- queue_delayed_work(data->mc32x0_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));//hrtimer_start(&data->timer, ktime_set(0, asensor_duration*1000000), HRTIMER_MODE_REL);
- data->enabled = true;
- }else{
- cancel_delayed_work_sync(&l_sensorconfig.work);//hrtimer_cancel(&data->timer);
- data->enabled = false;
- }
- return 0;
-}
-/*
-//MCUBE_BACKUP_FILE
-static void mcube_copy_file(const char *dstFilePath)
-{
-
- int err =0;
- initKernelEnv();
-
- fd_file = openFile(dstFilePath,O_RDWR,0);
- if (fd_file == NULL)
- {
- GSE_LOG("open %s fail\n",dstFilePath);
- return;
- }
-
- if ((err = writeFile(fd_file,backup_buf,64))>0)
- GSE_LOG("buf:%s\n",backup_buf);
- else
- GSE_LOG("write file error %d\n",err);
-
- set_fs(oldfs); ;
- closeFile(fd_file);
-
-}
-//MCUBE_BACKUP_FILE
-*/
-
-extern int wmt_setsyspara(char *varname, char *varval);
-static void update_var(void)
-{
- char varbuf[64];
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- sprintf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- (pCvt->map[MC3XX0_AXIS_X]),
- (pCvt->sign[MC3XX0_AXIS_X]),
- (pCvt->map[MC3XX0_AXIS_Y]),
- (pCvt->sign[MC3XX0_AXIS_Y]),
- (pCvt->map[MC3XX0_AXIS_Z]),
- (pCvt->sign[MC3XX0_AXIS_Z]),
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
-
- wmt_setsyspara("wmt.io.mc3230sensor",varbuf);
-}
-
-static long mc32x0_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- //int intBuf[SENSOR_DATA_SIZE];
- int ret = 0;
- //float convert_para=0.0f;
- short enable = 0;
- short delay = 0;
- //short val=1000/l_sensorconfig.sensor_samp;
- unsigned int uval ;
-#ifdef DOT_CALI
- void __user *data1;
- char strbuf[256];
- //int cali[3];
- SENSOR_DATA sensor_data;
- struct i2c_client *client = container_of(mc32x0_device.parent, struct i2c_client, dev);
- //struct mc32x0_data* this = (struct mc32x0_data *)i2c_get_clientdata(client); /* ?õô????????????. */
-#endif
-
- switch (cmd) {
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
-
- if (copy_from_user(&enable, (short*)arg, sizeof(short)))
- {
- errlog("Can't get enable flag!!!\n");
- ret = -EFAULT;
- goto errioctl;
- }
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor. l_sensorconfig.sensor_samp=%d\n", enable, l_sensorconfig.sensor_samp);
-
- if (enable != l_sensorconfig.sensor_enable)
- {
-
- l_sensorconfig.sensor_enable = enable;
-
- }
- } else {
- errlog("Wrong enable argument!!!\n");
- ret = -EFAULT;
- goto errioctl;
- }
- break;
- case ECS_IOCTL_APP_SET_DELAY://IOCTL_SENSOR_SET_DELAY_ACCEL:
- /*if(copy_from_user((void *)&sensor_duration, (void __user *) arg, sizeof(short))!=0){
- printk("copy from error in %s.\n",__func__);
- }*/
-
- // set the rate of g-sensor
- if (copy_from_user(&delay,(short*)arg, sizeof(short)))
- {
- errlog("Can't get set delay!!!\n");
- ret = -EFAULT;
- goto errioctl;
- }
- dbg("Get delay=%d \n", delay);
-
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- if (delay > 0)
- {
- l_sensorconfig.sensor_samp = 1000/delay;
- } else {
- errlog("error delay argument(delay=%d)!!!\n",delay);
- ret = -EFAULT;
- goto errioctl;
- }
-
- break;
-/*
- case IOCTL_SENSOR_GET_DELAY_ACCEL:
-
- if(copy_to_user((void __user *) arg, (const void *)&val, sizeof(short))!=0){
- printk("copy to error in %s.\n",__func__);
- }
-
- break;*/
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = MC3230_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("mc32x0_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
- if(McubeID &MCUBE_1_5G_8BIT)
- uval = (8<<8) | 3; //mc3230:8 bit ,+/-1.5g
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- break;
- /*case IOCTL_SENSOR_GET_STATE_ACCEL:
- if(copy_to_user((void __user *) arg, (const void *)&sensor_state_flag, sizeof(short))!=0){
- printk("copy to error in %s.\n",__func__);
- }
-
- break;
-
- case IOCTL_SENSOR_SET_STATE_ACCEL:
- if(copy_from_user((void *)&sensor_state_flag, (void __user *) arg, sizeof(short))!=0){
- printk("copy from error in %s.\n",__func__);
- }
-
- break;
- case IOCTL_SENSOR_GET_NAME:
- if(copy_to_user((void __user *) arg,(const void *)mc32x0_DISPLAY_NAME, sizeof(mc32x0_DISPLAY_NAME))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
-
- case IOCTL_SENSOR_GET_VENDOR:
- if(copy_to_user((void __user *) arg,(const void *)mc32x0_DIPLAY_VENDOR, sizeof(mc32x0_DIPLAY_VENDOR))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
-
- case IOCTL_SENSOR_GET_CONVERT_PARA:
- convert_para = mc32x0_CONVERT_PARAMETER;
- if(copy_to_user((void __user *) arg,(const void *)&convert_para,sizeof(float))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
- */
-
- #ifdef DOT_CALI
- case GSENSOR_IOCTL_READ_SENSORDATA:
- case GSENSOR_IOCTL_READ_RAW_DATA:
- GSE_LOG("fwq GSENSOR_IOCTL_READ_RAW_DATA\n");
- MC32X0_ReadRawData(client,strbuf);
- if (copy_to_user((void __user *) arg, &strbuf, strlen(strbuf)+1)) {
- printk("failed to copy sense data to user space.");
- return -EFAULT;
- }
-
-
- break;
-
-
- case GSENSOR_MCUBE_IOCTL_SET_CALI:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_CALI!!\n");
- data1 = (void __user *)arg;
-
-
- //data = (unsigned char*)arg;
-
-
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
- if(copy_from_user(&sensor_data, data1, sizeof(sensor_data)))
- {
- ret = -EFAULT;
- break;
- }
- //if(atomic_read(&this->suspend))
- //{
- // GSE_ERR("Perform calibration in suspend state!!\n");
- // err = -EINVAL;
- //}
- else
- {
- //this->cali_sw[MC32X0_AXIS_X] += sensor_data.x;
- //this->cali_sw[MC32X0_AXIS_Y] += sensor_data.y;
- //this->cali_sw[MC32X0_AXIS_Z] += sensor_data.z;
-
- l_sensorconfig.offset[MC32X0_AXIS_X] = sensor_data.x;
- l_sensorconfig.offset[MC32X0_AXIS_Y] = sensor_data.y;
- l_sensorconfig.offset[MC32X0_AXIS_Z] = sensor_data.z;
-
- GSE_LOG("GSENSOR_MCUBE_IOCTL_SET_CALI %d %d %d %d %d %d!!\n", l_sensorconfig.offset[MC32X0_AXIS_X], l_sensorconfig.offset[MC32X0_AXIS_Y],l_sensorconfig.offset[MC32X0_AXIS_Z] ,sensor_data.x, sensor_data.y ,sensor_data.z);
-
- update_var();
- ret = MC32X0_WriteCalibration(client, l_sensorconfig.offset);
- }
-
- break;
-
- case GSENSOR_IOCTL_CLR_CALI:
- GSE_LOG("fwq GSENSOR_IOCTL_CLR_CALI!!\n");
- l_sensorconfig.offset[0] = 0;
- l_sensorconfig.offset[1] = 0;
- l_sensorconfig.offset[2] = 0;
-
- update_var();
- ret = MC32X0_ResetCalibration(client);
- break;
-
- case GSENSOR_IOCTL_GET_CALI:
- GSE_LOG("fwq mc32x0 GSENSOR_IOCTL_GET_CALI\n");
-
- data1 = (unsigned char*)arg;
-
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
-
- if((ret = MC32X0_ReadCalibration(client,l_sensorconfig.offset)))
- {
- GSE_LOG("fwq mc32x0 MC32X0_ReadCalibration error!!!!\n");
- break;
- }
-
- sensor_data.x = l_sensorconfig.offset[0];//this->cali_sw[MC32X0_AXIS_X];
- sensor_data.y = l_sensorconfig.offset[1];//this->cali_sw[MC32X0_AXIS_Y];
- sensor_data.z = l_sensorconfig.offset[2];//this->cali_sw[MC32X0_AXIS_Z];
- // if(copy_to_user(data, &sensor_data, sizeof(sensor_data)))
-
- if(copy_to_user(data1, &sensor_data, sizeof(sensor_data)))
- {
- ret = -EFAULT;
- break;
- }
- break;
- // add by liang ****
- //add in Sensors_io.h
- //#define GSENSOR_IOCTL_SET_CALI_MODE _IOW(GSENSOR, 0x0e, int)
- case GSENSOR_IOCTL_SET_CALI_MODE:
- GSE_LOG("fwq mc32x0 GSENSOR_IOCTL_SET_CALI_MODE\n");
- break;
-
- case GSENSOR_MCUBE_IOCTL_READ_RBM_DATA:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_RBM_DATA\n");
- data1 = (void __user *) arg;
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
- MC32X0_ReadRBMData(client,(char *)&strbuf);
- if(copy_to_user(data1, &strbuf, strlen(strbuf)+1))
- {
- ret = -EFAULT;
- break;
- }
- break;
-
- case GSENSOR_MCUBE_IOCTL_SET_RBM_MODE:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_RBM_MODE\n");
- //MCUBE_BACKUP_FILE
- /*if(READ_FROM_BACKUP==true)
- {
-
- mcube_copy_file(CALIB_PATH);
-
- READ_FROM_BACKUP = false;
- }*/
- //MCUBE_BACKUP_FILE
- MC32X0_rbm(client, 1);
-
- break;
-
- case GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE\n");
-
- MC32X0_rbm(client, 0);
-
- break;
-
- case GSENSOR_MCUBE_IOCTL_REGISTER_MAP:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_REGISTER_MAP\n");
-
- //MC32X0_Read_Reg_Map(client);
-
- break;
-#endif
-
-
-
- default:
- ret = -EINVAL;
- break;
- }
-
-errioctl:
-
- return ret;
-}
-
-
-static int mc32x0_open(struct inode *inode, struct file *filp)
-{
- /*int ret;
- ret = nonseekable_open(inode, filp);*/
- return 0;
-}
-
-static int mc32x0_release(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-static struct file_operations sensor_fops =
-{
- .owner = THIS_MODULE,
- .open = mc32x0_open,
- .release = mc32x0_release,
- .unlocked_ioctl = mc32x0_ioctl,
-};
-
-//#ifdef CONFIG_HAS_EARLYSUSPEND
-static int mc32x0_i2c_suspend(struct platform_device *pdev, pm_message_t state)
-{
- /*struct mc32x0_data *data;
- char mc32x0_address;
- char mc32x0_data;
-
- //printk("mc32x0_early_suspend 2 \n");
-
- data = container_of(handler, struct mc32x0_data, early_suspend);
-
- hrtimer_cancel(&data->timer);
- */
- cancel_delayed_work_sync(&l_sensorconfig.work);
- mc32x0_set_mode(l_sensorconfig.client,MC32X0_STANDBY);
- return 0;
-}
-
-static int mc32x0_i2c_resume(struct platform_device *pdev)
-{
- struct mc32x0_data *data = &l_sensorconfig;
- //char mc32x0_address;
- //char mc32x0_data;
-
- //printk("mc32x0_early_resume 2\n");
-
- //data = container_of(handler, struct mc32x0_data, early_suspend);
-
- //Add 20130722
- mc32x0_chip_init(data->client);
- MC32X0_ResetCalibration(data->client);
- MC32X0_WriteCalibration(data->client,l_sensorconfig.offset);//mcube_read_cali_file(data->client);
- //before
-
- mc32x0_set_mode(data->client,MC32X0_WAKE);
-
- queue_delayed_work(data->mc32x0_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
- //hrtimer_start(&data->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
- return 0;
-}
-//#endif
-
-static struct miscdevice mc32x0_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &sensor_fops,
-};
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- //int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- //unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&l_sensorconfig.lock);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- // should do sth
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- klog("Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- dbg("The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&l_sensorconfig.lock);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-static int mc32x0_probe(struct platform_device *pdev)
-{
- int ret = 0;
- struct mc32x0_data *data = &l_sensorconfig;
- struct i2c_client *client = data->client;
-
-#ifdef DOT_CALI
- load_cali_flg = 30;
-#endif
- data->sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (data->sensor_proc != NULL)
- {
- data->sensor_proc->write_proc = sensor_writeproc;
- data->sensor_proc->read_proc = sensor_readproc;
- }
-
- data->mc32x0_wq = create_singlethread_workqueue("mc32x0_wq");
- if (!data->mc32x0_wq )
- {
- ret = -ENOMEM;
- goto err_create_workqueue_failed;
- }
-
- INIT_DELAYED_WORK(&data->work, mc32x0_work_func);
- //INIT_WORK(&data->work, mc32x0_work_func);
- mutex_init(&data->lock);
-
-
- data->input_dev = input_allocate_device();
- if (!data->input_dev) {
- ret = -ENOMEM;
- goto exit_input_dev_alloc_failed;
- }
-
-
- dev.client=client;
-
- i2c_set_clientdata(client, data);
- #ifdef DOT_CALI
- mc32x0_reset(client);
- #endif
-
- set_bit(EV_ABS, data->input_dev->evbit);
- data->map[0] = G_0;
- data->map[1] = G_1;
- data->map[2] = G_2;
- data->inv[0] = G_0_REVERSE;
- data->inv[1] = G_1_REVERSE;
- data->inv[2] = G_2_REVERSE;
-
- input_set_abs_params(data->input_dev, ABS_X, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
- input_set_abs_params(data->input_dev, ABS_Y, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
- input_set_abs_params(data->input_dev, ABS_Z, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
-
- data->input_dev->name = "g-sensor";
-
-
- ret = input_register_device(data->input_dev);
- if (ret) {
- goto exit_input_register_device_failed;
- }
- mc32x0_device.parent = &client->dev;
- ret = misc_register(&mc32x0_device);
- if (ret) {
- goto exit_misc_device_register_failed;
- }
-
- ret = sysfs_create_group(&client->dev.kobj, &mc32x0_group);
-/*
- if (!data->use_irq){
- hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
- data->timer.function = mc32x0_timer_func;
- hrtimer_start(&data->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
- }
-*/
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- data->early_suspend.suspend = mc32x0_early_suspend;
- data->early_suspend.resume = mc32x0_early_resume;
- register_early_suspend(&data->early_suspend);
-#endif
- data->enabled = true;
- queue_delayed_work(data->mc32x0_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
- strcpy(mc32x0_on_off_str,"gsensor_int2");
- dprintk(DEBUG_INIT,"mc32x0 probe ok \n");
-
- return 0;
-exit_misc_device_register_failed:
-exit_input_register_device_failed:
- input_free_device(data->input_dev);
-exit_input_dev_alloc_failed:
- destroy_workqueue(data->mc32x0_wq);
-err_create_workqueue_failed:
- kfree(data);
- printk("mc32x0 probe failed \n");
- return ret;
-
-}
-
-static int mc32x0_remove(struct platform_device *pdev)
-{
- /*struct mc32x0_data *data = i2c_get_clientdata(client);
-
- hrtimer_cancel(&data->timer);
- input_unregister_device(data->input_dev);
- //gpio_release(mc32x0_pin_hd, 2);
- misc_deregister(&mc32x0_device);
- sysfs_remove_group(&client->dev.kobj, &mc32x0_group);
- kfree(data);*/
-
- if (NULL != l_sensorconfig.mc32x0_wq)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.mc32x0_wq);
- destroy_workqueue(l_sensorconfig.mc32x0_wq);
- l_sensorconfig.mc32x0_wq = NULL;
- }
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- misc_deregister(&mc32x0_device);
- input_unregister_device(l_sensorconfig.input_dev);
- sysfs_remove_group(&l_sensorconfig.client->dev.kobj, &mc32x0_group);
- return 0;
-}
-
-static void mc32x0_shutdown(struct platform_device *pdev)
-{
- struct mc32x0_data *data = &l_sensorconfig;//i2c_get_clientdata(client);
- if(data->enabled)
- mc32x0_enable(data,0);
-}
-/*
-static const struct i2c_device_id mc32x0_id[] = {
- { SENSOR_NAME, 0 },
- { }
-};
-
-MODULE_DEVICE_TABLE(i2c, mc32x0_id);
-
-static struct i2c_driver mc32x0_driver = {
- .class = I2C_CLASS_HWMON,
- .driver = {
- .owner = THIS_MODULE,
- .name = SENSOR_NAME,
- },
- .id_table = mc32x0_id,
- .probe = mc32x0_probe,
- .remove = mc32x0_remove,
- .shutdown = mc32x0_shutdown,
- .detect = gsensor_detect,
- .address_list = normal_i2c,
-};
-*/
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
- //int tmpoff[3] = {0};
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- pCvt = (struct mc3xx0_hwmsen_convert *)kzalloc(sizeof(struct mc3xx0_hwmsen_convert), GFP_KERNEL);
-
- if (wmt_getsyspara("wmt.io.mc3230.virtualz", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- //return -1;
- } else {
- sscanf(varbuf, "%d", &g_virtual_z);
-
- }
- printk("%s g_virtual_z %d\n", __FUNCTION__, g_virtual_z);
- memset(varbuf, 0, sizeof(varbuf));
- if (wmt_getsyspara("wmt.io.mc3230sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1; //open it for no env just,not insmod such module 2014-6-30
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(pCvt->map[MC3XX0_AXIS_X]),
- &(pCvt->sign[MC3XX0_AXIS_X]),
- &(pCvt->map[MC3XX0_AXIS_Y]),
- &(pCvt->sign[MC3XX0_AXIS_Y]),
- &(pCvt->map[MC3XX0_AXIS_Z]),
- &(pCvt->sign[MC3XX0_AXIS_Z]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2])
- );
- if (n != 12) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- pCvt->map[MC3XX0_AXIS_X],
- pCvt->sign[MC3XX0_AXIS_X],
- pCvt->map[MC3XX0_AXIS_Y],
- pCvt->sign[MC3XX0_AXIS_Y],
- pCvt->map[MC3XX0_AXIS_Z],
- pCvt->sign[MC3XX0_AXIS_Z],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static void mc32x0_platform_release(struct device *device)
-{
- return;
-}
-
-static struct platform_device mc32x0_pdevice = {
- .name = GSENSOR_NAME,
- .id = 0,
- .dev = {
- .release = mc32x0_platform_release,
- },
-};
-
-static struct platform_driver mc32x0_pdriver = {
- .probe = mc32x0_probe,
- .remove = mc32x0_remove,
- .suspend = mc32x0_i2c_suspend,
- .resume = mc32x0_i2c_resume,
- .shutdown = mc32x0_shutdown,
- .driver = {
- .name = GSENSOR_NAME,
- },
-};
-
-
-static int __init mc32x0_init(void)
-{
- struct i2c_client *this_client;
- int ret = 0;
-
- dprintk(DEBUG_INIT, "======%s=========. \n", __func__);
- // parse g-sensor u-boot arg
- ret = get_axisset();
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- if (!(this_client = sensor_i2c_register_device(0, MC32X0_I2C_ADDR, GSENSOR_NAME)))
- {
- printk(KERN_ERR"Can't register gsensor i2c device!\n");
- return -1;
- }
-
- if (mc32x0_chip_init(this_client))
- {
- printk(KERN_ERR"Failed to init MC32X0!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
- //printk(KERN_ERR"McubeID:%d\n",McubeID);
- l_sensorconfig.client = this_client;
-
- l_dev_class = class_create(THIS_MODULE, GSENSOR_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&mc32x0_pdevice)))
- {
- klog("Can't register mc3230 platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&mc32x0_pdriver)) != 0)
- {
- errlog("Can't register mc3230 platform driver!!!\n");
- return ret;
- }
- return ret;
-}
-
-static void __exit mc32x0_exit(void)
-{
-#ifdef CONFIG_HAS_EARLYSUSPEND
- unregister_early_suspend(&l_sensorconfig.earlysuspend);
-#endif
- platform_driver_unregister(&mc32x0_pdriver);
- platform_device_unregister(&mc32x0_pdevice);
- sensor_i2c_unregister_device(l_sensorconfig.client);
- class_destroy(l_dev_class);
-}
-
-//*********************************************************************************************************
-MODULE_AUTHOR("Long Chen <lchen@mcube-inc.com>");
-MODULE_DESCRIPTION("mc32x0 driver");
-MODULE_LICENSE("GPL");
-MODULE_VERSION("1.1");
-
-module_init(mc32x0_init);
-module_exit(mc32x0_exit);
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.c b/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.c
deleted file mode 100755
index 19c81b97..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright (C) 2011 MCUBE, Inc.
- *
- * Initial Code:
- * Tan Liang
- */
-
-
-
-
-
-#include <linux/delay.h>
-
-#include "mc32x0_driver.h"
-
-
-mc32x0_t *p_mc32x0; /**< pointer to MC32X0 device structure */
-
-
-/** API Initialization routine
- \param *mc32x0 pointer to MC32X0 structured type
- \return result of communication routines
- */
-
-int mcube_mc32x0_init(mc32x0_t *mc32x0)
-{
- int comres=0;
- unsigned char data;
-
- p_mc32x0 = mc32x0; /* assign mc32x0 ptr */
- p_mc32x0->dev_addr = MC32X0_I2C_ADDR; /* preset I2C_addr */
- comres += p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_CHIP_ID, &data, 1); /* read Chip Id */
-
- p_mc32x0->chip_id = data;
-
- // init other reg
- data = 0x63;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1b, &data, 1);
- data = 0x43;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1b, &data, 1);
- msleep(5);
-
- data = 0x43;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x07, &data, 1);
- data = 0x80;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1c, &data, 1);
- data = 0x80;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x17, &data, 1);
- msleep(5);
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x1c, &data, 1);
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, 0x17, &data, 1);
-
- return comres;
-}
-
-int mc32x0_set_image (void)
-{
- int comres;
- unsigned char data;
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
-#ifdef MCUBE_2G_10BIT_TAP
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x80;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x05;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Dwell_Reject_REG, &data, 1 );
-
- data = 0x33;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x07;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Threshold_REG, &data, 1 );
-
- data = 0x04;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-#ifdef MCUBE_2G_10BIT
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x33;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-#ifdef MCUBE_8G_14BIT_TAP
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x80;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x05;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Dwell_Reject_REG, &data, 1 );
-
- data = 0x3F;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x07;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Threshold_REG, &data, 1 );
-
- data = 0x04;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-#ifdef MCUBE_8G_14BIT
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x3F;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-
-
-#ifdef MCUBE_1_5G_8BIT
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x02;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-
-#ifdef MCUBE_1_5G_8BIT_TAP
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x80;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x02;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x03;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Dwell_Reject_REG, &data, 1 );
-
- data = 0x07;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_TAP_Threshold_REG, &data, 1 );
-
- data = 0x04;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-#endif
-
-
-#ifdef MCUBE_1_5G_6BIT
-
- data = MC32X0_MODE_DEF;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Mode_Feature_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sleep_Count_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Sample_Rate_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE_Control_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Tap_Detection_Enable_REG, &data, 1 );
-
- data = 0x00;
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_Interrupt_Enable_REG, &data, 1 );
-
-
-#endif
-
-
-
- return comres;
-}
-
-
-int mc32x0_get_offset(unsigned char *offset)
-{
- return 0;
-}
-
-
-int mc32x0_set_offset(unsigned char offset)
-{
- return 0;
-}
-
-
-
-
-/** set mc32x0s range
- \param range
-
- \see MC32X0_RANGE_2G
- \see MC32X0_RANGE_4G
- \see MC32X0_RANGE_8G
-*/
-int mc32x0_set_range(char range)
-{
- int comres = 0;
- unsigned char data;
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- if (range<3) {
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE__REG, &data, 1);
- data = MC32X0_SET_BITSLICE(data, MC32X0_RANGE, range);
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE__REG, &data, 1);
-
- }
- return comres;
-
-}
-
-
-/* readout select range from MC32X0
- \param *range pointer to range setting
- \return result of bus communication function
- \see MC32X0_RANGE_2G, MC32X0_RANGE_4G, MC32X0_RANGE_8G
- \see mc32x0_set_range()
-*/
-int mc32x0_get_range(unsigned char *range)
-{
-
- int comres = 0;
- unsigned char data;
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_RANGE__REG, &data, 1);
- data = MC32X0_GET_BITSLICE(data, MC32X0_RANGE);
-
- *range = data;
-
-
- return comres;
-
-}
-
-
-
-int mc32x0_set_mode(unsigned char mode) {
-
- int comres=0;
- unsigned char data;
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- if (mode<4) {
- data = MC32X0_MODE_DEF;
- data = MC32X0_SET_BITSLICE(data, MC32X0_MODE, mode);
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_MODE__REG, &data, 1 );
-
- p_mc32x0->mode = mode;
- }
- return comres;
-
-}
-
-
-
-int mc32x0_get_mode(unsigned char *mode)
-{
- if (p_mc32x0==0)
- return E_NULL_PTR;
- *mode = p_mc32x0->mode;
- return 0;
-}
-
-
-int mc32x0_set_bandwidth(char bw)
-{
- int comres = 0;
- unsigned char data;
-
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- if (bw<7) {
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_BANDWIDTH__REG, &data, 1 );
- data = MC32X0_SET_BITSLICE(data, MC32X0_BANDWIDTH, bw);
- comres += p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, MC32X0_BANDWIDTH__REG, &data, 1 );
-
- }
-
- return comres;
-
-
-}
-
-int mc32x0_get_bandwidth(unsigned char *bw) {
- int comres = 1;
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_BANDWIDTH__REG, bw, 1 );
-
- *bw = MC32X0_GET_BITSLICE(*bw, MC32X0_BANDWIDTH);
-
- return comres;
-
-}
-
-
-int mc32x0_read_accel_x(short *a_x)
-{
- int comres;
- unsigned char data[2];
-
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_EX_L_REG, &data[0],2);
-
- *a_x = ((short)data[0])|(((short)data[1])<<8);
-
- return comres;
-
-}
-
-
-
-int mc32x0_read_accel_y(short *a_y)
-{
- int comres;
- unsigned char data[2];
-
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_YOUT_EX_L_REG, &data[0],2);
-
- *a_y = ((short)data[0])|(((short)data[1])<<8);
-
- return comres;
-}
-
-
-int mc32x0_read_accel_z(short *a_z)
-{
- int comres;
- unsigned char data[2];
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_ZOUT_EX_L_REG, &data[0],2);
-
- *a_z = ((short)data[0])|(((short)data[1])<<8);
-
- return comres;
-}
-
-
-int mc32x0_read_accel_xyz(mc32x0acc_t * acc)
-{
- int comres;
- unsigned char data[6];
-
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
-#ifdef MC32X0_HIGH_END
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_EX_L_REG, &data[0],6);
-
- acc->x = ((signed short)data[0])|(((signed short)data[1])<<8);
- acc->y = ((signed short)data[2])|(((signed short)data[3])<<8);
- acc->z = ((signed short)data[4])|(((signed short)data[5])<<8);
-#endif
-
-#ifdef MC32X0_LOW_END
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_XOUT_REG, &data[0],3);
-
-#ifndef MCUBE_1_5G_6BIT
- acc->x = (signed char)data[0];
- acc->y = (signed char)data[1];
- acc->z = (signed char)data[2];
-#else
- acc->x = (signed short)GET_REAL_VALUE(data[0],6);
- acc->y = (signed short)GET_REAL_VALUE(data[1],6);
- acc->z = (signed short)GET_REAL_VALUE(data[2],6);
-#endif
-
-#endif
-
-
-
-
- return comres;
-
-}
-
-
-
-int mc32x0_get_interrupt_status(unsigned char * ist)
-{
-
- int comres=0;
- if (p_mc32x0==0)
- return E_NULL_PTR;
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, MC32X0_Tilt_Status_REG, ist, 1);
- return comres;
-}
-
-
-
-int mc32x0_read_reg(unsigned char addr, unsigned char *data, unsigned char len)
-{
-
- int comres;
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_READ_FUNC(p_mc32x0->dev_addr, addr, data, len);
- return comres;
-
-}
-
-
-int mc32x0_write_reg(unsigned char addr, unsigned char *data, unsigned char len)
-{
-
- int comres;
-
- if (p_mc32x0==0)
- return E_NULL_PTR;
-
- comres = p_mc32x0->MC32X0_BUS_WRITE_FUNC(p_mc32x0->dev_addr, addr, data, len);
-
- return comres;
-
-}
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.h b/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.h
deleted file mode 100755
index 0aca80e8..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3230_gsensor/mc32x0_driver.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2011 MCUBE, Inc.
- *
- * Initial Code:
- * Tan Liang
- */
-
-
-
-#ifndef __MC32X0_H__
-#define __MC32X0_H__
-
-
-
-#define MC32X0_WR_FUNC_PTR char (* bus_write)(unsigned char, unsigned char *, unsigned char)
-
-#define MC32X0_BUS_WRITE_FUNC(dev_addr, reg_addr, reg_data, wr_len)\
- bus_write(reg_addr, reg_data, wr_len)
-
-#define MC32X0_RD_FUNC_PTR char (* bus_read)( unsigned char, unsigned char *, unsigned char)
-
-#define MC32X0_BUS_READ_FUNC(dev_addr, reg_addr, reg_data, r_len)\
- bus_read(reg_addr, reg_data, r_len)
-
-#define GET_REAL_VALUE(rv, bn) \
- ((rv & (0x01 << (bn - 1))) ? (- (rv & ~(0xffff << (bn - 1)))) : (rv & ~(0xffff << (bn - 1))))
-
-
-
-//#define MC32X0_HIGH_END
-/*******MC3210/20 define this**********/
-
-//#define MCUBE_2G_10BIT_TAP
-//#define MCUBE_2G_10BIT
-//#define MCUBE_8G_14BIT_TAP
-//#define MCUBE_8G_14BIT
-
-
-
-//#define MC32X0_LOW_END
-/*******MC3230 define this**********/
-
-//#define MCUBE_1_5G_8BIT
-//#define MCUBE_1_5G_8BIT_TAP
-
-
-
-
-
-/** MC32X0 I2C Address
-*/
-
-#define MC32X0_I2C_ADDR 0x4c // 0x98 >> 1
-
-
-
-/*
- MC32X0 API error codes
-*/
-
-#define E_NULL_PTR (char)-127
-
-/*
- *
- * register definitions
- *
- */
-
-#define MC32X0_XOUT_REG 0x00
-#define MC32X0_YOUT_REG 0x01
-#define MC32X0_ZOUT_REG 0x02
-#define MC32X0_Tilt_Status_REG 0x03
-#define MC32X0_Sampling_Rate_Status_REG 0x04
-#define MC32X0_Sleep_Count_REG 0x05
-#define MC32X0_Interrupt_Enable_REG 0x06
-#define MC32X0_Mode_Feature_REG 0x07
-#define MC32X0_Sample_Rate_REG 0x08
-#define MC32X0_Tap_Detection_Enable_REG 0x09
-#define MC32X0_TAP_Dwell_Reject_REG 0x0a
-#define MC32X0_DROP_Control_Register_REG 0x0b
-#define MC32X0_SHAKE_Debounce_REG 0x0c
-#define MC32X0_XOUT_EX_L_REG 0x0d
-#define MC32X0_XOUT_EX_H_REG 0x0e
-#define MC32X0_YOUT_EX_L_REG 0x0f
-#define MC32X0_YOUT_EX_H_REG 0x10
-#define MC32X0_ZOUT_EX_L_REG 0x11
-#define MC32X0_ZOUT_EX_H_REG 0x12
-#define MC32X0_CHIP_ID 0x18
-#define MC32X0_RANGE_Control_REG 0x20
-#define MC32X0_SHAKE_Threshold_REG 0x2B
-#define MC32X0_UD_Z_TH_REG 0x2C
-#define MC32X0_UD_X_TH_REG 0x2D
-#define MC32X0_RL_Z_TH_REG 0x2E
-#define MC32X0_RL_Y_TH_REG 0x2F
-#define MC32X0_FB_Z_TH_REG 0x30
-#define MC32X0_DROP_Threshold_REG 0x31
-#define MC32X0_TAP_Threshold_REG 0x32
-
-
-
-
-/** MC32X0 acceleration data
- \brief Structure containing acceleration values for x,y and z-axis in signed short
-
-*/
-
-typedef struct {
- short x, /**< holds x-axis acceleration data sign extended. Range -512 to 511. */
- y, /**< holds y-axis acceleration data sign extended. Range -512 to 511. */
- z; /**< holds z-axis acceleration data sign extended. Range -512 to 511. */
-} mc32x0acc_t;
-
-/* RANGE */
-
-#define MC32X0_RANGE__POS 2
-#define MC32X0_RANGE__LEN 2
-#define MC32X0_RANGE__MSK 0x0c
-#define MC32X0_RANGE__REG MC32X0_RANGE_Control_REG
-
-/* MODE */
-
-#define MC32X0_MODE__POS 0
-#define MC32X0_MODE__LEN 2
-#define MC32X0_MODE__MSK 0x03
-#define MC32X0_MODE__REG MC32X0_Mode_Feature_REG
-
-#define MC32X0_MODE_DEF 0x43
-
-
-/* BANDWIDTH */
-
-#define MC32X0_BANDWIDTH__POS 4
-#define MC32X0_BANDWIDTH__LEN 3
-#define MC32X0_BANDWIDTH__MSK 0x70
-#define MC32X0_BANDWIDTH__REG MC32X0_RANGE_Control_REG
-
-
-#define MC32X0_GET_BITSLICE(regvar, bitname)\
- (regvar & bitname##__MSK) >> bitname##__POS
-
-
-#define MC32X0_SET_BITSLICE(regvar, bitname, val)\
- (regvar & ~bitname##__MSK) | ((val<<bitname##__POS)&bitname##__MSK)
-
-
-
-
-
-
-#define MC32X0_RANGE_2G 0
-#define MC32X0_RANGE_4G 1
-#define MC32X0_RANGE_8G 2
-
-
-#define MC32X0_WAKE 1
-#define MC32X0_SNIFF 2
-#define MC32X0_STANDBY 3
-
-
-#define MC32X0_LOW_PASS_512HZ 0
-#define MC32X0_LOW_PASS_256HZ 1
-#define MC32X0_LOW_PASS_128HZ 2
-#define MC32X0_LOW_PASS_64HZ 3
-#define MC32X0_LOW_PASS_32HZ 4
-#define MC32X0_LOW_PASS_16HZ 5
-#define MC32X0_LOW_PASS_8HZ 6
-
-
-
-
-
-typedef struct {
- unsigned char mode; /**< save current MC32X0 operation mode */
- unsigned char chip_id; /**< save MC32X0's chip id which has to be 0x00/0x01 after calling mc32x0_init() */
- unsigned char dev_addr; /**< initializes MC32X0's I2C device address 0x4c */
- MC32X0_WR_FUNC_PTR; /**< function pointer to the SPI/I2C write function */
- MC32X0_RD_FUNC_PTR; /**< function pointer to the SPI/I2C read function */
-} mc32x0_t;
-
-
-
-/* Function prototypes */
-
-
-
-
-int mcube_mc32x0_init(mc32x0_t *mc32x0);
-
-int mc32x0_set_image (struct i2c_client *client) ;
-
-int mc32x0_set_range(char);
-
-int mc32x0_get_range(unsigned char*);
-
-int mc32x0_set_mode(struct i2c_client *client, unsigned char mode);
-
-int mc32x0_get_mode(unsigned char *);
-
-int mc32x0_set_bandwidth(char);
-
-int mc32x0_get_bandwidth(unsigned char *);
-
-int mc32x0_read_accel_x(short *);
-
-int mc32x0_read_accel_y(short *);
-
-int mc32x0_read_accel_z(short *);
-
-int mc32x0_read_accel_xyz(struct i2c_client *client, s16 * acc);
-
-int mc32x0_get_interrupt_status(unsigned char *);
-
-int mc32x0_read_reg(unsigned char , unsigned char *, unsigned char);
-
-int mc32x0_write_reg(unsigned char , unsigned char*, unsigned char );
-
-
-#endif
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/Makefile
deleted file mode 100644
index de65868d..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_mc3xxx
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := mc3xxx.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/mc3xxx.c b/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/mc3xxx.c
deleted file mode 100644
index c7d37a7a..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mc3xxx_gsensor/mc3xxx.c
+++ /dev/null
@@ -1,2719 +0,0 @@
-/*****************************************************************************
- *
- * Copyright (c) 2013 mCube, Inc. All rights reserved.
- *
- * This source is subject to the mCube Software License.
- * This software is protected by Copyright and the information and source code
- * contained herein is confidential. The software including the source code
- * may not be copied and the information contained herein may not be used or
- * disclosed except with the written permission of mCube Inc.
- *
- * All other rights reserved.
- *
- * This code and information are provided "as is" without warranty of any
- * kind, either expressed or implied, including but not limited to the
- * implied warranties of merchantability and/or fitness for a
- * particular purpose.
- *
- * The following software/firmware and/or related documentation ("mCube Software")
- * have been modified by mCube Inc. All revisions are subject to any receiver's
- * applicable license agreements with mCube Inc.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- *
- *****************************************************************************/
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/mutex.h>
-#include <linux/slab.h>
-#include <linux/mutex.h>
-//#include <linux/earlysuspend.h>
-#include <linux/delay.h>
-#include <asm/uaccess.h>
-#include <linux/miscdevice.h>
-#include <linux/platform_device.h>
-
-
-#include <mach/hardware.h>
-#include <linux/fs.h>
-
-#include "../sensor.h"
-
-
-//#include <mach/sys_config.h>
-
-//=== CONFIGURATIONS ==========================================================
-//#define _MC3XXX_DEBUG_ON_
-
-//=============================================================================
-#ifdef _MC3XXX_DEBUG_ON_
- #define mcprintkreg(x...) printk(x)
- #define mcprintkfunc(x...) printk(x)
- #define GSE_ERR(x...) printk(x)
- #define GSE_LOG(x...) printk(x)
-#else
- #define mcprintkreg(x...)
- #define mcprintkfunc(x...)
- #define GSE_ERR(x...)
- #define GSE_LOG(x...)
-#endif
-
-static int g_virtual_z = 0;
-#define G_2_REVERSE_VIRTUAL_Z 0 //!!!!! 1
-#define SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
-#define LOW_RESOLUTION 1
-#define HIGH_RESOLUTION 2
-#define RBM_RESOLUTION 3
-#ifdef SUPPORT_VIRTUAL_Z_SENSOR
-#define Low_Pos_Max 127
-#define Low_Neg_Max -128
-#define High_Pos_Max 8191
-#define High_Neg_Max -8192
-#define VIRTUAL_Z 1
-static int Railed = 0;
-#else
-#define VIRTUAL_Z 0
-#endif
-
-
-static struct class* l_dev_class = NULL;
-
-
-#define SENSOR_NAME "mc3xxx"
-#define SENSOR_DRIVER_VERSION "1.0.0"
-#define SENSOR_DATA_SIZE 3
-
-//static int mc3xxx_pin_hd;
-//static char mc3xxx_on_off_str[32];
-#define G_0 ABS_Y
-#define G_1 ABS_X
-#define G_2 ABS_Z
-#define G_0_REVERSE 1
-#define G_1_REVERSE 1
-#define G_2_REVERSE 1
-
-//static unsigned char s_bResolution = 0x00;
-static unsigned char s_bPCODE = 0x00;
-static unsigned short mc3xxx_i2c_auto_probe_addr[] = { 0x4C, 0x6C, 0x4E, 0x6D, 0x6E, 0x6F };
-
-//=============================================================================
-#define SENSOR_DMARD_IOCTL_BASE 234
-#define IOCTL_SENSOR_SET_DELAY_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 100)
-#define IOCTL_SENSOR_GET_DELAY_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 101)
-#define IOCTL_SENSOR_GET_STATE_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 102)
-#define IOCTL_SENSOR_SET_STATE_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 103)
-#define IOCTL_SENSOR_GET_DATA_ACCEL _IO(SENSOR_DMARD_IOCTL_BASE, 104)
-
-#define IOCTL_MSENSOR_SET_DELAY_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 200)
-#define IOCTL_MSENSOR_GET_DATA_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 201)
-#define IOCTL_MSENSOR_GET_STATE_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 202)
-#define IOCTL_MSENSOR_SET_STATE_MAGNE _IO(SENSOR_DMARD_IOCTL_BASE, 203)
-
-#define IOCTL_SENSOR_GET_NAME _IO(SENSOR_DMARD_IOCTL_BASE, 301)
-#define IOCTL_SENSOR_GET_VENDOR _IO(SENSOR_DMARD_IOCTL_BASE, 302)
-#define IOCTL_SENSOR_GET_CONVERT_PARA _IO(SENSOR_DMARD_IOCTL_BASE, 401)
-//#define SENSOR_CALIBRATION _IOWR(SENSOR_DMARD_IOCTL_BASE, 402, int[SENSOR_DATA_SIZE])
-
-//=============================================================================
-#define MC3XXX_CONVERT_PARAMETER (1.5f * (9.80665f) / 256.0f)
-#define MC3XXX_DISPLAY_NAME SENSOR_NAME
-#define MC3XXX_DIPLAY_VENDOR "mCube"
-
-//=============================================================================
-#define MC3XXX_AXIS_X 0
-#define MC3XXX_AXIS_Y 1
-#define MC3XXX_AXIS_Z 2
-#define MC3XXX_AXIS_NUM 3
-#define MC3XXX_DATA_LEN 6
-
-
-/***********************************************
- *** REGISTER MAP
- ***********************************************/
-#define MC3XXX_REG_XOUT 0x00
-#define MC3XXX_REG_YOUT 0x01
-#define MC3XXX_REG_ZOUT 0x02
-#define MC3XXX_REG_TILT_STATUS 0x03
-#define MC3XXX_REG_SAMPLE_RATE_STATUS 0x04
-#define MC3XXX_REG_SLEEP_COUNT 0x05
-#define MC3XXX_REG_INTERRUPT_ENABLE 0x06
-#define MC3XXX_REG_MODE_FEATURE 0x07
-#define MC3XXX_REG_SAMPLE_RATE 0x08
-#define MC3XXX_REG_TAP_DETECTION_ENABLE 0x09
-#define MC3XXX_REG_TAP_DWELL_REJECT 0x0A
-#define MC3XXX_REG_DROP_CONTROL 0x0B
-#define MC3XXX_REG_SHAKE_DEBOUNCE 0x0C
-#define MC3XXX_REG_XOUT_EX_L 0x0D
-#define MC3XXX_REG_XOUT_EX_H 0x0E
-#define MC3XXX_REG_YOUT_EX_L 0x0F
-#define MC3XXX_REG_YOUT_EX_H 0x10
-#define MC3XXX_REG_ZOUT_EX_L 0x11
-#define MC3XXX_REG_ZOUT_EX_H 0x12
-#define MC3XXX_REG_RANGE_CONTROL 0x20
-#define MC3XXX_REG_SHAKE_THRESHOLD 0x2B
-#define MC3XXX_REG_UD_Z_TH 0x2C
-#define MC3XXX_REG_UD_X_TH 0x2D
-#define MC3XXX_REG_RL_Z_TH 0x2E
-#define MC3XXX_REG_RL_Y_TH 0x2F
-#define MC3XXX_REG_FB_Z_TH 0x30
-#define MC3XXX_REG_DROP_THRESHOLD 0x31
-#define MC3XXX_REG_TAP_THRESHOLD 0x32
-#define MC3XXX_REG_PRODUCT_CODE 0x3B
-
-/***********************************************
- *** RETURN CODE
- ***********************************************/
-#define MC3XXX_RETCODE_SUCCESS (0)
-#define MC3XXX_RETCODE_ERROR_I2C (-1)
-#define MC3XXX_RETCODE_ERROR_NULL_POINTER (-2)
-#define MC3XXX_RETCODE_ERROR_STATUS (-3)
-#define MC3XXX_RETCODE_ERROR_SETUP (-4)
-#define MC3XXX_RETCODE_ERROR_GET_DATA (-5)
-#define MC3XXX_RETCODE_ERROR_IDENTIFICATION (-6)
-
-
-/***********************************************
- *** CONFIGURATION
- ***********************************************/
-#define MC3XXX_BUF_SIZE 256
-
-#define MCUBE_1_5G_8BIT 0x01 //MC3XXX_LOW_END
-#define MCUBE_8G_14BIT 0x02 //MC3XXX_HIGH_END
-
-#define DOT_CALI
-
-
-#define SENSOR_DURATION_DEFAULT 20
-
-#define INPUT_FUZZ 0
-#define INPUT_FLAT 0
-
-/***********************************************
- *** PRODUCT ID
- ***********************************************/
-#define MC3XXX_PCODE_3210 0x90
-#define MC3XXX_PCODE_3230 0x19
-#define MC3XXX_PCODE_3250 0x88
-#define MC3XXX_PCODE_3410 0xA8
-#define MC3XXX_PCODE_3410N 0xB8
-#define MC3XXX_PCODE_3430 0x29
-#define MC3XXX_PCODE_3430N 0x39
-#define MC3XXX_PCODE_3510B 0x40
-#define MC3XXX_PCODE_3530B 0x30
-#define MC3XXX_PCODE_3510C 0x10
-#define MC3XXX_PCODE_3530C 0x6E
-
-//=============================================================================
-static unsigned char is_new_mc34x0 = 0;
-static unsigned char is_mc3250 = 0;
-static unsigned char is_mc35xx = 0;
-static unsigned char Sensor_Accuracy = 0;
-
-
-//=============================================================================
-#ifdef DOT_CALI
-#define CALIB_PATH "/data/data/com.mcube.acc/files/mcube-calib.txt"
-//MCUBE_BACKUP_FILE
-#define BACKUP_CALIB_PATH "/data/misc/mcube-calib.txt"
-static char backup_buf[64];
-//MCUBE_BACKUP_FILE
-#define DATA_PATH "/sdcard/mcube-register-map.txt"
-
-typedef struct {
- unsigned short x; /**< X axis */
- unsigned short y; /**< Y axis */
- unsigned short z; /**< Z axis */
-} GSENSOR_VECTOR3D;
-
-static GSENSOR_VECTOR3D gsensor_gain = { 0 };
-static struct miscdevice mc3xxx_device;
-
-static struct file * fd_file = NULL;
-
-static mm_segment_t oldfs = { 0 };
-static unsigned char offset_buf[6] = { 0 };
-static signed int offset_data[3] = { 0 };
-s16 G_RAW_DATA[3] = { 0 };
-static signed int gain_data[3] = { 0 };
-static signed int enable_RBM_calibration = 0;
-
-#define GSENSOR 0x95
-#define GSENSOR_IOCTL_INIT _IO(GSENSOR, 0x01)
-#define GSENSOR_IOCTL_READ_CHIPINFO _IOR(GSENSOR, 0x02, int)
-#define GSENSOR_IOCTL_READ_SENSORDATA _IOR(GSENSOR, 0x03, int)
-#define GSENSOR_IOCTL_READ_OFFSET _IOR(GSENSOR, 0x04, GSENSOR_VECTOR3D)
-#define GSENSOR_IOCTL_READ_GAIN _IOR(GSENSOR, 0x05, GSENSOR_VECTOR3D)
-#define GSENSOR_IOCTL_READ_RAW_DATA _IOR(GSENSOR, 0x06, int)
-//#define GSENSOR_IOCTL_SET_CALI _IOW(GSENSOR, 0x06, SENSOR_DATA)
-#define GSENSOR_IOCTL_GET_CALI _IOW(GSENSOR, 0x07, SENSOR_DATA)
-#define GSENSOR_IOCTL_CLR_CALI _IO(GSENSOR, 0x08)
-#define GSENSOR_MCUBE_IOCTL_READ_RBM_DATA _IOR(GSENSOR, 0x09, SENSOR_DATA)
-#define GSENSOR_MCUBE_IOCTL_SET_RBM_MODE _IO(GSENSOR, 0x0a)
-#define GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE _IO(GSENSOR, 0x0b)
-#define GSENSOR_MCUBE_IOCTL_SET_CALI _IOW(GSENSOR, 0x0c, SENSOR_DATA)
-#define GSENSOR_MCUBE_IOCTL_REGISTER_MAP _IO(GSENSOR, 0x0d)
-#define GSENSOR_IOCTL_SET_CALI_MODE _IOW(GSENSOR, 0x0e,int)
-#define GSENSOR_MCUBE_IOCTL_READ_PRODUCT_ID _IOR(GSENSOR, 0x0f, int)
-#define GSENSOR_MCUBE_IOCTL_READ_FILEPATH _IOR(GSENSOR, 0x10, char[256])
-
-
-static int MC3XXX_ReadRegMap(struct i2c_client *client, u8 *pbUserBuf);
-static int mc3xxx_chip_init(struct i2c_client *client);
-static int MC3XXX_ResetCalibration(struct i2c_client *client);
-static int MC3XX0_ValidateSensorIC(unsigned char bPCode);
-
-
-typedef struct{
- int x;
- int y;
- int z;
-}SENSOR_DATA;
-
-static int load_cali_flg = 0;
-static int wake_mc3xxx_flg = 0;
-
-//MCUBE_BACKUP_FILE
-static bool READ_FROM_BACKUP = false;
-//MCUBE_BACKUP_FILE
-
-#endif
-
-#define MC3XXX_WAKE 1
-#define MC3XXX_SNIFF 2
-#define MC3XXX_STANDBY 3
-
-struct dev_data {
- struct i2c_client *client;
-};
-
-static struct dev_data dev = { 0 };
-
-struct acceleration {
- int x;
- int y;
- int z;
-};
-
-struct mc3xxx_data {
- struct mutex lock;
- struct i2c_client *client;
- struct delayed_work work;
- struct workqueue_struct *mc3xxx_wq;
- struct hrtimer timer;
- struct device *device;
- struct input_dev *input_dev;
- int use_count;
- int enabled;
- volatile unsigned int duration;
- int use_irq;
- int irq;
- unsigned long irqflags;
- int gpio;
- unsigned int map[3];
- int inv[3];
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif
- // for control
- int int_gpio; //0-3
- int op;
- int samp;
- //int xyz_axis[3][3]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- int isdbg;
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- int offset[MC3XXX_AXIS_NUM+1]; /*+1: for 4-byte alignment*/
- s16 data[MC3XXX_AXIS_NUM+1];
-};
-
-static struct mc3xxx_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 16,
- /*.xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },*/
- .sensor_proc = NULL,
- .isdbg = 1,
- .sensor_samp = 1, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- //.offset={0,0,0},
-};
-
-
-//=============================================================================
-enum mc3xx0_orientation
-{
- MC3XX0_TOP_LEFT_DOWN = 0,
- MC3XX0_TOP_RIGHT_DOWN,
- MC3XX0_TOP_RIGHT_UP,
- MC3XX0_TOP_LEFT_UP,
- MC3XX0_BOTTOM_LEFT_DOWN,
- MC3XX0_BOTTOM_RIGHT_DOWN,
- MC3XX0_BOTTOM_RIGHT_UP,
- MC3XX0_BOTTOM_LEFT_UP
-};
-
-
-struct mc3xx0_hwmsen_convert
-{
- signed int sign[3];
- unsigned int map[3];
-};
-
-// Transformation matrix for chip mounting position
-static const struct mc3xx0_hwmsen_convert mc3xx0_cvt[] =
-{
- {{ 1, 1, 1}, {MC3XXX_AXIS_X, MC3XXX_AXIS_Y, MC3XXX_AXIS_Z}}, // 0: top , left-down
- {{-1, 1, 1}, {MC3XXX_AXIS_Y, MC3XXX_AXIS_X, MC3XXX_AXIS_Z}}, // 1: top , right-down
- {{-1, -1, 1}, {MC3XXX_AXIS_X, MC3XXX_AXIS_Y, MC3XXX_AXIS_Z}}, // 2: top , right-up
- {{ 1, -1, 1}, {MC3XXX_AXIS_Y, MC3XXX_AXIS_X, MC3XXX_AXIS_Z}}, // 3: top , left-up
- {{-1, 1, -1}, {MC3XXX_AXIS_X, MC3XXX_AXIS_Y, MC3XXX_AXIS_Z}}, // 4: bottom, left-down
- {{ 1, 1, -1}, {MC3XXX_AXIS_Y, MC3XXX_AXIS_X, MC3XXX_AXIS_Z}}, // 5: bottom, right-down
- {{ 1, -1, -1}, {MC3XXX_AXIS_X, MC3XXX_AXIS_Y, MC3XXX_AXIS_Z}}, // 6: bottom, right-up
- {{-1, -1, -1}, {MC3XXX_AXIS_Y, MC3XXX_AXIS_X, MC3XXX_AXIS_Z}}, // 7: bottom, left-up
-};
-
-//static unsigned char mc3xx0_current_placement = MC3XX0_TOP_RIGHT_UP; // current soldered placement
-static struct mc3xx0_hwmsen_convert *pCvt;
-
-#ifdef SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
-int Verify_Z_Railed(int AccData, int resolution)
-{
- int status = 0;
- GSE_LOG("%s: AccData = %d",__func__, AccData);
- if(resolution == 1) // Low resolution
- {
- if((AccData >= Low_Pos_Max && AccData >=0)|| (AccData <= Low_Neg_Max && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at Low Resolution",__func__);
- }
- }
- else if (resolution == 2) //High resolution
- {
- if((AccData >= High_Pos_Max && AccData >=0) || (AccData <= High_Neg_Max && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at High Resolution",__func__);
- }
- }
- else if (resolution == 3) //High resolution
- {
- if((AccData >= Low_Pos_Max*3 && AccData >=0) || (AccData <= Low_Neg_Max*3 && AccData < 0))
- {
- status = 1;
- GSE_LOG("%s: Railed at High Resolution",__func__);
- }
- }
- else
- GSE_LOG("%s, Wrong resolution",__func__);
-
- return status;
-}
-
-int SquareRoot(int x)
-{
- int lowerbound;
- int upperbound;
- int root;
-
- if(x < 0) return -1;
- if(x == 0 || x == 1) return x;
- lowerbound = 1;
- upperbound = x;
- root = lowerbound + (upperbound - lowerbound)/2;
-
- while(root > x/root || root+1 <= x/(root+1))
- {
- if(root > x/root)
- {
- upperbound = root;
- }
- else
- {
- lowerbound = root;
- }
- root = lowerbound + (upperbound - lowerbound)/2;
- }
- GSE_LOG("%s: Sqrt root is %d",__func__, root);
- return root;
-}
-#endif
-
-
-unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-
-//=============================================================================
-//volatile static short sensor_duration = SENSOR_DURATION_DEFAULT;
-//volatile static short sensor_state_flag = 1;
-
-//=============================================================================
-static ssize_t mc3xxx_map_show(struct device *dev, struct device_attribute *attr,char *buf)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct mc3xxx_data *data = NULL;
- int i = 0;
- data = i2c_get_clientdata(client);
- for (i = 0; i< 3; i++)
- {
- if(data->inv[i] == 1)
- {
- switch(data->map[i])
- {
- case ABS_X:
- buf[i] = 'x';
- break;
- case ABS_Y:
- buf[i] = 'y';
- break;
- case ABS_Z:
- buf[i] = 'z';
- break;
- default:
- buf[i] = '_';
- break;
- }
- }
- else
- {
- switch(data->map[i])
- {
- case ABS_X:
- buf[i] = 'X';
- break;
- case ABS_Y:
- buf[i] = 'Y';
- break;
- case ABS_Z:
- buf[i] = 'Z';
- break;
- default:
- buf[i] = '-';
- break;
- }
- }
- }
- sprintf(buf+3,"\r\n");
- return 5;
-}
-
-/*****************************************
- *** show_regiter_map
- *****************************************/
-static ssize_t show_regiter_map(struct device *dev, struct device_attribute *attr, char *buf)
-{
- u8 _bIndex = 0;
- u8 _baRegMap[64] = { 0 };
- ssize_t _tLength = 0;
-
- struct i2c_client *client = to_i2c_client(dev);
-
- MC3XXX_ReadRegMap(client, _baRegMap);
-
- for (_bIndex = 0; _bIndex < 64; _bIndex++)
- _tLength += snprintf((buf + _tLength), (PAGE_SIZE - _tLength), "Reg[0x%02X]: 0x%02X\n", _bIndex, _baRegMap[_bIndex]);
-
- return (_tLength);
-}
-
-static ssize_t mc3xxx_map_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t count)
-{
- struct i2c_client *client = to_i2c_client(dev);
- struct mc3xxx_data *data = NULL;
- int i = 0;
- data = i2c_get_clientdata(client);
-
- if(count < 3) return -EINVAL;
-
- for(i = 0; i< 3; i++)
- {
- switch(buf[i])
- {
- case 'x':
- data->map[i] = ABS_X;
- data->inv[i] = 1;
- break;
- case 'y':
- data->map[i] = ABS_Y;
- data->inv[i] = 1;
- break;
- case 'z':
- data->map[i] = ABS_Z;
- data->inv[i] = 1;
- break;
- case 'X':
- data->map[i] = ABS_X;
- data->inv[i] = -1;
- break;
- case 'Y':
- data->map[i] = ABS_Y;
- data->inv[i] = -1;
- break;
- case 'Z':
- data->map[i] = ABS_Z;
- data->inv[i] = -1;
- break;
- default:
- return -EINVAL;
- }
- }
-
- return count;
-}
-
-//=============================================================================
-static ssize_t mc3xxx_version_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- return sprintf(buf, "%s\n", SENSOR_DRIVER_VERSION);
-}
-
-//=============================================================================
-static ssize_t mc3xxx_chip_id_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- unsigned char bChipID[4] = { 0 };
- struct i2c_client *client = to_i2c_client(dev);
-
- i2c_smbus_read_i2c_block_data(client, 0x3C, 4, bChipID);
-
- return sprintf(buf, "%02X-%02X-%02X-%02X\n", bChipID[0], bChipID[1], bChipID[2], bChipID[3]);
-}
-/*
-//=============================================================================
-static ssize_t mc3xxx_position_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- printk("%s called\n", __func__);
- return sprintf(buf, "%d\n", mc3xx0_current_placement);
-}
-
-//=============================================================================
-static ssize_t mc3xxx_position_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
- unsigned long position = 0;
-
- printk("%s called\n", __func__);
-
- position = simple_strtoul(buf, NULL,10);
-
- if (position < 8)
- mc3xx0_current_placement = position;
-
- return count;
-}
-*/
-
-static int mc3xxx_enable(struct mc3xxx_data *data, int enable)
-{
- if(enable)
- {
- msleep(10);
- //mutex_lock(&data->lock);
- mc3xxx_chip_init(data->client);
- //mutex_unlock(&data->lock);
- queue_delayed_work(data->mc3xxx_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));//hrtimer_start(&data->timer, ktime_set(0, sensor_duration*1000000), HRTIMER_MODE_REL);
- data->enabled = true;
- }
- else
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);//hrtimer_cancel(&data->timer);
- data->enabled = false;
- }
- return 0;
-}
-
-static ssize_t mc3xxx_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct i2c_client *client = container_of(mc3xxx_device.parent, struct i2c_client, dev);
-
- struct mc3xxx_data *mc3xxx = i2c_get_clientdata(client);
-
-
- return sprintf(buf, "%d\n", mc3xxx->enabled);
-}
-
-static ssize_t mc3xxx_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
-
- bool new_enable;
-
- struct i2c_client *client = container_of(mc3xxx_device.parent, struct i2c_client, dev);
-
- struct mc3xxx_data *mc3xxx = i2c_get_clientdata(client);
-
- if (sysfs_streq(buf, "1"))
- new_enable = true;
- else if (sysfs_streq(buf, "0"))
- new_enable = false;
- else
- {
- pr_debug("%s: invalid value %d\n", __func__, *buf);
- return -EINVAL;
- }
-
- mc3xxx_enable(mc3xxx, new_enable);
-
- return count;
-}
-
-
-static DRIVER_ATTR(regmap , S_IRUGO, show_regiter_map, NULL );
-static DEVICE_ATTR(map, S_IWUSR | S_IRUGO, mc3xxx_map_show, mc3xxx_map_store);
-static DEVICE_ATTR(version , S_IRUGO , mc3xxx_version_show , NULL );
-static DEVICE_ATTR(chipid , S_IRUGO , mc3xxx_chip_id_show , NULL );
-//static DEVICE_ATTR(position, S_IRUGO | S_IWUSR | S_IWGRP, mc3xxx_position_show, mc3xxx_position_store);
-static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, mc3xxx_enable_show, mc3xxx_enable_store);
-static struct attribute* mc3xxx_attrs[] =
-{
- &driver_attr_regmap,
- &dev_attr_map.attr,
- &dev_attr_version.attr,
- &dev_attr_chipid.attr,
- //&dev_attr_position.attr,
- &dev_attr_enable.attr,
- NULL
-};
-
-static const struct attribute_group mc3xxx_group =
-{
- .attrs = mc3xxx_attrs,
-};
-
-//=============================================================================
-static int mc3xxx_chip_init(struct i2c_client *client)
-{
- unsigned char data = 0;
-
- data = i2c_smbus_read_byte_data(client, MC3XXX_REG_PRODUCT_CODE);
- s_bPCODE =data;
- if((data == MC3XXX_PCODE_3230)||(data == MC3XXX_PCODE_3430)
- ||(data == MC3XXX_PCODE_3430N)||(data == MC3XXX_PCODE_3530B)
- ||((data|0x0E) == MC3XXX_PCODE_3530C))
- Sensor_Accuracy = MCUBE_1_5G_8BIT; //8bit
- else if((data == MC3XXX_PCODE_3210)||(data == MC3XXX_PCODE_3410)
- ||(data == MC3XXX_PCODE_3250)||(data == MC3XXX_PCODE_3410N)
- ||(data == MC3XXX_PCODE_3510B)||(data == MC3XXX_PCODE_3510C))
- Sensor_Accuracy = MCUBE_8G_14BIT; //14bit
- else
- Sensor_Accuracy = 0;
-
- if (data == MC3XXX_PCODE_3250)
- is_mc3250 = 1;
-
- if ((data == MC3XXX_PCODE_3430N)||(data == MC3XXX_PCODE_3410N))
- is_new_mc34x0 = 1;
-
- if((MC3XXX_PCODE_3510B == data) || (MC3XXX_PCODE_3510C == data)
- ||(data == MC3XXX_PCODE_3530B)||((data|0x0E) == MC3XXX_PCODE_3530C))
- is_mc35xx = 1;
-
-
- if(MCUBE_8G_14BIT == Sensor_Accuracy)
- {
- data = 0x43;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_MODE_FEATURE, data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_SLEEP_COUNT, data);
-
- data = 0x00;
- if (is_mc35xx)
- {
- data = 0x0A;
- }
-
- i2c_smbus_write_byte_data(client, MC3XXX_REG_SAMPLE_RATE, data);
-
- data = 0x3F;
- if ((MC3XXX_PCODE_3510B == s_bPCODE) || (MC3XXX_PCODE_3510C == s_bPCODE))
- data = 0x25;
- else if ((MC3XXX_PCODE_3530B == s_bPCODE) || (MC3XXX_PCODE_3530C == (s_bPCODE|0x0E)))
- data = 0x02;
-
- i2c_smbus_write_byte_data(client, MC3XXX_REG_RANGE_CONTROL, data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_TAP_DETECTION_ENABLE, data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_INTERRUPT_ENABLE, data);
-
- #ifdef DOT_CALI
- gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 1024;
- #endif
- }
- else if(MCUBE_1_5G_8BIT == Sensor_Accuracy)
- {
- data = 0x43;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_MODE_FEATURE, data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_SLEEP_COUNT, data);
-
- data = 0x00;
- if (is_mc35xx)
- {
- data = 0x0A;
- }
-
- i2c_smbus_write_byte_data(client, MC3XXX_REG_SAMPLE_RATE, data);
-
- data = 0x32;
- if ((MC3XXX_PCODE_3510B == s_bPCODE) || (MC3XXX_PCODE_3510C == s_bPCODE))
- data = 0x25;
- else if ((MC3XXX_PCODE_3530B == s_bPCODE) || (MC3XXX_PCODE_3530C == (s_bPCODE|0x0E)))
- data = 0x02;
-
- i2c_smbus_write_byte_data(client, MC3XXX_REG_RANGE_CONTROL,data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_TAP_DETECTION_ENABLE, data);
- data = 0x00;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_INTERRUPT_ENABLE, data);
-
- #ifdef DOT_CALI
- gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 86;
- if (is_mc35xx)
- {
- gsensor_gain.x = gsensor_gain.y = gsensor_gain.z = 64;
- }
- #endif
- }
-
- data = 0x41;
- i2c_smbus_write_byte_data(client, MC3XXX_REG_MODE_FEATURE, data);
-
- return 0;
-}
-
-//=============================================================================
-int mc3xxx_set_mode(struct i2c_client *client, unsigned char mode)
-{
- int comres = 0;
- unsigned char data = 0;
-
- if (mode < 4)
- {
- data = (0x40 | mode);
- comres = i2c_smbus_write_byte_data(client, MC3XXX_REG_MODE_FEATURE, data);
- }
-
- return comres;
-}
-
-
-
-#ifdef DOT_CALI
-//=============================================================================
-struct file *openFile(char *path,int flag,int mode)
-{
- struct file *fp = NULL;
-
- fp = filp_open(path, flag, mode);
-
- if (IS_ERR(fp) || !fp->f_op)
- {
- GSE_LOG("Calibration File filp_open return NULL\n");
- return NULL;
- }
-
- return fp;
-}
-
-//=============================================================================
-int readFile(struct file *fp,char *buf,int readlen)
-{
- if (fp->f_op && fp->f_op->read)
- return fp->f_op->read(fp,buf,readlen, &fp->f_pos);
- else
- return -1;
-}
-
-//=============================================================================
-int writeFile(struct file *fp,char *buf,int writelen)
-{
- if (fp->f_op && fp->f_op->write)
- return fp->f_op->write(fp,buf,writelen, &fp->f_pos);
- else
- return -1;
-}
-
-//=============================================================================
-int closeFile(struct file *fp)
-{
- filp_close(fp,NULL);
-
- return 0;
-}
-
-//=============================================================================
-void initKernelEnv(void)
-{
- oldfs = get_fs();
- set_fs(KERNEL_DS);
- printk(KERN_INFO "initKernelEnv\n");
-}
-
-//=============================================================================
- int MC3XXX_WriteCalibration(struct i2c_client *client, int dat[MC3XXX_AXIS_NUM])
-{
- int err = 0;
- u8 buf[9] = { 0 };
- s16 tmp = 0, x_gain = 0, y_gain = 0, z_gain = 0;
- s32 x_off = 0, y_off = 0, z_off = 0;
- int temp_cali_dat[MC3XXX_AXIS_NUM] = { 0 };
- //const struct mc3xx0_hwmsen_convert *pCvt = NULL;
-
- u8 bMsbFilter = 0x3F;
- s16 wSignBitMask = 0x2000;
- s16 wSignPaddingBits = 0xC000;
- s32 dwRangePosLimit = 0x1FFF;
- s32 dwRangeNegLimit = -0x2000;
-
- if (is_mc35xx)
- {
- bMsbFilter = 0x7F;
- wSignBitMask = 0x4000;
- wSignPaddingBits = 0x8000;
- dwRangePosLimit = 0x3FFF;
- dwRangeNegLimit = -0x4000;
- }
-
- //pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
-
- temp_cali_dat[pCvt->map[MC3XXX_AXIS_X]] = pCvt->sign[MC3XXX_AXIS_X] * dat[MC3XXX_AXIS_X];
- temp_cali_dat[pCvt->map[MC3XXX_AXIS_Y]] = pCvt->sign[MC3XXX_AXIS_Y] * dat[MC3XXX_AXIS_Y];
- temp_cali_dat[pCvt->map[MC3XXX_AXIS_Z]] = pCvt->sign[MC3XXX_AXIS_Z] * dat[MC3XXX_AXIS_Z];
-
- if ((is_new_mc34x0)||(is_mc35xx))
- {
- temp_cali_dat[MC3XXX_AXIS_X] = -temp_cali_dat[MC3XXX_AXIS_X];
- temp_cali_dat[MC3XXX_AXIS_Y] = -temp_cali_dat[MC3XXX_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = temp_cali_dat[MC3XXX_AXIS_X];
-
- temp_cali_dat[MC3XXX_AXIS_X] = -temp_cali_dat[MC3XXX_AXIS_Y];
- temp_cali_dat[MC3XXX_AXIS_Y] = temp;
- }
-
- dat[MC3XXX_AXIS_X] = temp_cali_dat[MC3XXX_AXIS_X];
- dat[MC3XXX_AXIS_Y] = temp_cali_dat[MC3XXX_AXIS_Y];
- dat[MC3XXX_AXIS_Z] = temp_cali_dat[MC3XXX_AXIS_Z];
-
- GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n",
- dat[MC3XXX_AXIS_X], dat[MC3XXX_AXIS_Y], dat[MC3XXX_AXIS_Z]);
-
- // read register 0x21~0x29
- err = i2c_smbus_read_i2c_block_data(client , 0x21 , 3 , &buf[0]);
- err |= i2c_smbus_read_i2c_block_data(client , 0x24 , 3 , &buf[3]);
- err |= i2c_smbus_read_i2c_block_data(client , 0x27 , 3 , &buf[6]);
-
-
- // get x,y,z offset
- tmp = ((buf[1] & bMsbFilter) << 8) + buf[0];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- x_off = tmp;
-
- tmp = ((buf[3] & bMsbFilter) << 8) + buf[2];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- y_off = tmp;
-
- tmp = ((buf[5] & bMsbFilter) << 8) + buf[4];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- z_off = tmp;
-
- // get x,y,z gain
- x_gain = ((buf[1] >> 7) << 8) + buf[6];
- y_gain = ((buf[3] >> 7) << 8) + buf[7];
- z_gain = ((buf[5] >> 7) << 8) + buf[8];
-
- // prepare new offset
- x_off = x_off + 16 * dat[MC3XXX_AXIS_X] * 256 * 128 / 3 / gsensor_gain.x / (40 + x_gain);
- y_off = y_off + 16 * dat[MC3XXX_AXIS_Y] * 256 * 128 / 3 / gsensor_gain.y / (40 + y_gain);
- z_off = z_off + 16 * dat[MC3XXX_AXIS_Z] * 256 * 128 / 3 / gsensor_gain.z / (40 + z_gain);
-
- //add for over range
- if( x_off > dwRangePosLimit)
- {
- x_off = dwRangePosLimit;
- }
- else if( x_off < dwRangeNegLimit)
- {
- x_off = dwRangeNegLimit;
- }
-
- if( y_off > dwRangePosLimit)
- {
- y_off = dwRangePosLimit;
- }
- else if( y_off < dwRangeNegLimit)
- {
- y_off = dwRangeNegLimit;
- }
-
- if( z_off > dwRangePosLimit)
- {
- z_off = dwRangePosLimit;
- }
- else if( z_off < dwRangeNegLimit)
- {
- z_off = dwRangeNegLimit;
- }
-
- //storege the cerrunt offset data with DOT format
- offset_data[0] = x_off;
- offset_data[1] = y_off;
- offset_data[2] = z_off;
-
- //storege the cerrunt Gain data with GOT format
- gain_data[0] = 256*8*128/3/(40+x_gain);
- gain_data[1] = 256*8*128/3/(40+y_gain);
- gain_data[2] = 256*8*128/3/(40+z_gain);
- printk("%d %d ======================\n\n ",gain_data[0],x_gain);
-
- buf[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x07, buf[0]);
-
- buf[0] = x_off & 0xff;
- buf[1] = ((x_off >> 8) & bMsbFilter) | (x_gain & 0x0100 ? 0x80 : 0);
- buf[2] = y_off & 0xff;
- buf[3] = ((y_off >> 8) & bMsbFilter) | (y_gain & 0x0100 ? 0x80 : 0);
- buf[4] = z_off & 0xff;
- buf[5] = ((z_off >> 8) & bMsbFilter) | (z_gain & 0x0100 ? 0x80 : 0);
-
- i2c_smbus_write_i2c_block_data(client, 0x21, 2, &buf[0]);
- i2c_smbus_write_i2c_block_data(client, 0x21+2, 2, &buf[2]);
- i2c_smbus_write_i2c_block_data(client, 0x21+4, 2, &buf[4]);
-
- buf[0] = 0x41;
- i2c_smbus_write_byte_data(client, 0x07,buf[0]);
-
- msleep(50);
-
- return err;
-
-}
-
-int mcube_read_cali_file(struct i2c_client *client)
-{
- int cali_data[3] = { 0 };
- int err =0;
- //char buf[64];
- printk("%s %d\n",__func__,__LINE__);
- //MCUBE_BACKUP_FILE
- READ_FROM_BACKUP = false;
- //MCUBE_BACKUP_FILE
- initKernelEnv();
- fd_file = openFile(CALIB_PATH,O_RDONLY,0);
- //MCUBE_BACKUP_FILE
- if (fd_file == NULL)
- {
- fd_file = openFile(BACKUP_CALIB_PATH, O_RDONLY, 0);
- if(fd_file != NULL)
- {
- READ_FROM_BACKUP = true;
- }
- }
- //MCUBE_BACKUP_FILE
- if (fd_file == NULL)
- {
- GSE_LOG("fail to open\n");
- cali_data[0] = 0;
- cali_data[1] = 0;
- cali_data[2] = 0;
-
- return -1;
- }
- else
- {
- printk("%s %d\n",__func__,__LINE__);
- memset(backup_buf,0,64);
- if ((err = readFile(fd_file,backup_buf,128))>0)
- GSE_LOG("buf:%s\n",backup_buf);
- else
- GSE_LOG("read file error %d\n",err);
- printk("%s %d\n",__func__,__LINE__);
-
- set_fs(oldfs);
- closeFile(fd_file);
-
- sscanf(backup_buf, "%d %d %d",&cali_data[MC3XXX_AXIS_X], &cali_data[MC3XXX_AXIS_Y], &cali_data[MC3XXX_AXIS_Z]);
- GSE_LOG("cali_data: %d %d %d\n", cali_data[MC3XXX_AXIS_X], cali_data[MC3XXX_AXIS_Y], cali_data[MC3XXX_AXIS_Z]);
-
- MC3XXX_WriteCalibration(client, cali_data);
- }
- return 0;
-}
-
-//=============================================================================
-static int mcube_write_log_data(struct i2c_client *client, u8 data[0x3f])
-{
- #define _WRT_LOG_DATA_BUFFER_SIZE (66 * 50)
-
- s16 rbm_data[3]={0}, raw_data[3]={0};
- int err =0;
- char *_pszBuffer = NULL;
- int n=0,i=0;
-
- initKernelEnv();
- fd_file = openFile(DATA_PATH ,O_RDWR | O_CREAT,0);
- if (fd_file == NULL)
- {
- GSE_LOG("mcube_write_log_data fail to open\n");
- }
- else
- {
- rbm_data[MC3XXX_AXIS_X] = (s16)((data[0x0d]) | (data[0x0e] << 8));
- rbm_data[MC3XXX_AXIS_Y] = (s16)((data[0x0f]) | (data[0x10] << 8));
- rbm_data[MC3XXX_AXIS_Z] = (s16)((data[0x11]) | (data[0x12] << 8));
-
- raw_data[MC3XXX_AXIS_X] = (rbm_data[MC3XXX_AXIS_X] + offset_data[0]/2)*gsensor_gain.x/gain_data[0];
- raw_data[MC3XXX_AXIS_Y] = (rbm_data[MC3XXX_AXIS_Y] + offset_data[1]/2)*gsensor_gain.y/gain_data[1];
- raw_data[MC3XXX_AXIS_Z] = (rbm_data[MC3XXX_AXIS_Z] + offset_data[2]/2)*gsensor_gain.z/gain_data[2];
-
- _pszBuffer = kzalloc(_WRT_LOG_DATA_BUFFER_SIZE, GFP_KERNEL);
- if (NULL == _pszBuffer)
- {
- GSE_ERR("fail to allocate memory for buffer\n");
- closeFile(fd_file);
- return -1;
- }
- memset(_pszBuffer, 0, _WRT_LOG_DATA_BUFFER_SIZE);
-
- n += sprintf(_pszBuffer+n, "G-sensor RAW X = %d Y = %d Z = %d\n", raw_data[0] ,raw_data[1] ,raw_data[2]);
- n += sprintf(_pszBuffer+n, "G-sensor RBM X = %d Y = %d Z = %d\n", rbm_data[0] ,rbm_data[1] ,rbm_data[2]);
- for(i=0; i<64; i++)
- {
- n += sprintf(_pszBuffer+n, "mCube register map Register[%x] = 0x%x\n",i,data[i]);
- }
- msleep(50);
- if ((err = writeFile(fd_file,_pszBuffer,n))>0)
- GSE_LOG("buf:%s\n",_pszBuffer);
- else
- GSE_LOG("write file error %d\n",err);
-
- kfree(_pszBuffer);
-
- set_fs(oldfs);
- closeFile(fd_file);
- }
- return 0;
-}
-
-//=============================================================================
-void MC3XXX_rbm(struct i2c_client *client, int enable)
-{
- char buf1[3] = { 0 };
- if(enable == 1 )
- {
- buf1[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x07, buf1[0]);
-
- buf1[0] = 0x6D;
- i2c_smbus_write_byte_data(client, 0x1B, buf1[0]);
-
- buf1[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x1B, buf1[0]);
-
- buf1[0] = 0x00;
- i2c_smbus_write_byte_data(client, 0x3B, buf1[0]);
-
- buf1[0] = 0x02;
- i2c_smbus_write_byte_data(client, 0x14, buf1[0]);
-
- buf1[0] = 0x41;
- i2c_smbus_write_byte_data(client, 0x07, buf1[0]);
-
- enable_RBM_calibration = 1;
-
- GSE_LOG("set rbm!!\n");
-
- msleep(10);
- }
- else if(enable == 0 )
- {
- buf1[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x07, buf1[0]);
-
- buf1[0] = 0x00;
- i2c_smbus_write_byte_data(client, 0x14, buf1[0]);
- GSE_LOG("set rbm!! %x @@@@\n",s_bPCODE);
-
- buf1[0] = s_bPCODE;
- i2c_smbus_write_byte_data(client, 0x3B, buf1[0]);
-
- buf1[0] = 0x6D;
- i2c_smbus_write_byte_data(client, 0x1B, buf1[0]);
-
- buf1[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x1B, buf1[0]);
-
- buf1[0] = 0x41;
- i2c_smbus_write_byte_data(client, 0x07, buf1[0]);
-
- enable_RBM_calibration = 0;
-
- GSE_LOG("clear rbm!!\n");
-
- msleep(10);
- }
-}
-
-/*----------------------------------------------------------------------------*/
- int MC3XXX_ReadData_RBM(struct i2c_client *client,int data[MC3XXX_AXIS_NUM])
-{
- u8 addr = 0x0d;
- u8 rbm_buf[MC3XXX_DATA_LEN] = {0};
- int err = 0;
-
- //err = p_mc3xxx->MC3XXX_BUS_READ_FUNC(p_mc3xxx->dev_addr, addr, &rbm_buf[0],6);
- err = i2c_smbus_read_i2c_block_data(client , addr , 6 , rbm_buf);
- //err = mc3xxx_read_block(client, addr, rbm_buf, 0x06);
-
- data[MC3XXX_AXIS_X] = (s16)((rbm_buf[0]) | (rbm_buf[1] << 8));
- data[MC3XXX_AXIS_Y] = (s16)((rbm_buf[2]) | (rbm_buf[3] << 8));
- data[MC3XXX_AXIS_Z] = (s16)((rbm_buf[4]) | (rbm_buf[5] << 8));
-
- GSE_LOG("rbm_buf<<<<<[%02x %02x %02x %02x %02x %02x]\n",rbm_buf[0], rbm_buf[2], rbm_buf[2], rbm_buf[3], rbm_buf[4], rbm_buf[5]);
- GSE_LOG("RBM<<<<<[%04x %04x %04x]\n", data[MC3XXX_AXIS_X], data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]);
- GSE_LOG("RBM<<<<<[%04d %04d %04d]\n", data[MC3XXX_AXIS_X], data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]);
- return err;
-}
-
-
- int MC3XXX_ReadRBMData(struct i2c_client *client, char *buf)
-{
- int res = 0;
- int data[3];
-
- if (!buf)
- {
- return EINVAL;
- }
-
- mc3xxx_set_mode(client,MC3XXX_WAKE);
-
- res = MC3XXX_ReadData_RBM(client,data);
-
- if(res)
- {
- GSE_ERR("%s I2C error: ret value=%d",__func__, res);
- return EIO;
- }
- else
- {
- sprintf(buf, "%04x %04x %04x", data[MC3XXX_AXIS_X],
- data[MC3XXX_AXIS_Y], data[MC3XXX_AXIS_Z]);
-
- }
-
- return 0;
-}
- int MC3XXX_ReadOffset(struct i2c_client *client,s16 ofs[MC3XXX_AXIS_NUM])
-{
- int err = 0;
- u8 off_data[6] = { 0 };
-
- if(Sensor_Accuracy == MCUBE_8G_14BIT)
- {
- err = i2c_smbus_read_i2c_block_data(client, MC3XXX_REG_XOUT_EX_L, MC3XXX_DATA_LEN, off_data);
-
- ofs[MC3XXX_AXIS_X] = ((s16)(off_data[0]))|((s16)(off_data[1])<<8);
- ofs[MC3XXX_AXIS_Y] = ((s16)(off_data[2]))|((s16)(off_data[3])<<8);
- ofs[MC3XXX_AXIS_Z] = ((s16)(off_data[4]))|((s16)(off_data[5])<<8);
- }
- else if(Sensor_Accuracy == MCUBE_1_5G_8BIT)
- {
- err = i2c_smbus_read_i2c_block_data(client, 0, 3, off_data);
-
- ofs[MC3XXX_AXIS_X] = (s8)off_data[0];
- ofs[MC3XXX_AXIS_Y] = (s8)off_data[1];
- ofs[MC3XXX_AXIS_Z] = (s8)off_data[2];
- }
-
- GSE_LOG("MC3XXX_ReadOffset %d %d %d\n", ofs[MC3XXX_AXIS_X], ofs[MC3XXX_AXIS_Y], ofs[MC3XXX_AXIS_Z]);
-
- return err;
-}
-/*----------------------------------------------------------------------------*/
- static int MC3XXX_ResetCalibration(struct i2c_client *client)
-{
- u8 buf[6] = { 0 };
- s16 tmp = 0;
- int err = 0;
-
- u8 bMsbFilter = 0x3F;
- s16 wSignBitMask = 0x2000;
- s16 wSignPaddingBits = 0xC000;
-
- buf[0] = 0x43;
- err = i2c_smbus_write_byte_data(client, 0x07, buf[0]);
- if(err)
- {
- GSE_ERR("error 0x07: %d\n", err);
- }
-
- err = i2c_smbus_write_i2c_block_data(client, 0x21, 6, offset_buf);
- if(err)
- {
- GSE_ERR("error: %d\n", err);
- }
-
- buf[0] = 0x41;
- err = i2c_smbus_write_byte_data(client, 0x07, buf[0]);
- if(err)
- {
- GSE_ERR("error: %d\n", err);
- }
-
- msleep(20);
-
-
- if (is_mc35xx)
- {
- bMsbFilter = 0x7F;
- wSignBitMask = 0x4000;
- wSignPaddingBits = 0x8000;
- }
-
- tmp = ((offset_buf[1] & bMsbFilter) << 8) + offset_buf[0];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- offset_data[0] = tmp;
-
- tmp = ((offset_buf[3] & bMsbFilter) << 8) + offset_buf[2];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- offset_data[1] = tmp;
-
- tmp = ((offset_buf[5] & bMsbFilter) << 8) + offset_buf[4];
- if (tmp & wSignBitMask)
- tmp |= wSignPaddingBits;
- offset_data[2] = tmp;
-
- return 0;
-}
-
-//=============================================================================
- int MC3XXX_ReadCalibration(struct i2c_client *client,int dat[MC3XXX_AXIS_NUM])
-{
- signed short MC_offset[MC3XXX_AXIS_NUM + 1] = { 0 }; // +1: for 4-byte alignment
- int err = 0;
-
- memset(MC_offset, 0, sizeof(MC_offset));
-
- err = MC3XXX_ReadOffset(client, MC_offset);
-
- if (err)
- {
- GSE_ERR("read offset fail, %d\n", err);
- return err;
- }
-
- dat[MC3XXX_AXIS_X] = MC_offset[MC3XXX_AXIS_X];
- dat[MC3XXX_AXIS_Y] = MC_offset[MC3XXX_AXIS_Y];
- dat[MC3XXX_AXIS_Z] = MC_offset[MC3XXX_AXIS_Z];
-
- return 0;
-}
-
-//=============================================================================
-int MC3XXX_ReadData(struct i2c_client *client, s16 buffer[MC3XXX_AXIS_NUM])
-{
- unsigned char buf[6] = { 0 };
- signed char buf1[6] = { 0 };
- char rbm_buf[6] = { 0 };
- int ret = 0;
-
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR
- int tempX=0;
- int tempY=0;
- int tempZ=0;
- #endif
-
- if (enable_RBM_calibration == 0)
- {
- //err = hwmsen_read_block(client, addr, buf, 0x06);
- }
- else if (enable_RBM_calibration == 1)
- {
- memset(rbm_buf, 0, 6);
- i2c_smbus_read_i2c_block_data(client, 0x0d , 2, &rbm_buf[0]);
- i2c_smbus_read_i2c_block_data(client, 0x0d+2, 2, &rbm_buf[2]);
- i2c_smbus_read_i2c_block_data(client, 0x0d+4, 2, &rbm_buf[4]);
- }
-
- if (enable_RBM_calibration == 0)
- {
- if(Sensor_Accuracy == MCUBE_8G_14BIT)
- {
- ret = i2c_smbus_read_i2c_block_data(client, MC3XXX_REG_XOUT_EX_L, 6, buf);
-
- buffer[0] = (signed short)((buf[0])|(buf[1]<<8));
- buffer[1] = (signed short)((buf[2])|(buf[3]<<8));
- buffer[2] = (signed short)((buf[4])|(buf[5]<<8));
- }
- else if(Sensor_Accuracy == MCUBE_1_5G_8BIT)
- {
- ret = i2c_smbus_read_i2c_block_data(client, MC3XXX_REG_XOUT, 3, buf1);
-
- buffer[0] = (signed short)buf1[0];
- buffer[1] = (signed short)buf1[1];
- buffer[2] = (signed short)buf1[2];
- }
-
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR //add 2013-10-23
- if (g_virtual_z)
- {
- //printk("%s 1\n", __FUNCTION__);
-
- tempX = buffer[MC3XXX_AXIS_X];
- tempY = buffer[MC3XXX_AXIS_Y];
- tempZ = buffer[MC3XXX_AXIS_Z];
- //printk(" %d:Verify_Z_Railed() %d\n", (int)buffer[MC32X0_AXIS_Z], Verify_Z_Railed((int)buffer[MC32X0_AXIS_Z], LOW_RESOLUTION));
- if(1 == Verify_Z_Railed((int)buffer[MC3XXX_AXIS_Z], LOW_RESOLUTION)) // z-railed
- {
- Railed = 1;
-
- GSE_LOG("%s: Z railed", __func__);
- //printk("%s: Z railed \n", __func__);
- if (G_2_REVERSE_VIRTUAL_Z == 1)
- buffer[MC3XXX_AXIS_Z] = (s8) ( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- else
- buffer[MC3XXX_AXIS_Z] = (s8) -( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- }
- else
- {
- Railed = 0;
- }
- }
- #endif
- mcprintkreg("MC3XXX_ReadData: %d %d %d\n", buffer[0], buffer[1], buffer[2]);
- }
- else if (enable_RBM_calibration == 1)
- {
- buffer[MC3XXX_AXIS_X] = (s16)((rbm_buf[0]) | (rbm_buf[1] << 8));
- buffer[MC3XXX_AXIS_Y] = (s16)((rbm_buf[2]) | (rbm_buf[3] << 8));
- buffer[MC3XXX_AXIS_Z] = (s16)((rbm_buf[4]) | (rbm_buf[5] << 8));
-
- GSE_LOG("%s RBM<<<<<[%08d %08d %08d]\n", __func__, buffer[MC3XXX_AXIS_X], buffer[MC3XXX_AXIS_Y], buffer[MC3XXX_AXIS_Z]);
-
- if(gain_data[0] == 0)
- {
- buffer[MC3XXX_AXIS_X] = 0;
- buffer[MC3XXX_AXIS_Y] = 0;
- buffer[MC3XXX_AXIS_Z] = 0;
-
- return 0;
- }
-
- buffer[MC3XXX_AXIS_X] = (buffer[MC3XXX_AXIS_X] + offset_data[0]/2)*gsensor_gain.x/gain_data[0];
- buffer[MC3XXX_AXIS_Y] = (buffer[MC3XXX_AXIS_Y] + offset_data[1]/2)*gsensor_gain.y/gain_data[1];
- buffer[MC3XXX_AXIS_Z] = (buffer[MC3XXX_AXIS_Z] + offset_data[2]/2)*gsensor_gain.z/gain_data[2];
-
- #ifdef SUPPORT_VIRTUAL_Z_SENSOR // add 2013-10-23
- if (g_virtual_z)
- {
- tempX = buffer[MC3XXX_AXIS_X];
- tempY = buffer[MC3XXX_AXIS_Y];
- tempZ = buffer[MC3XXX_AXIS_Z];
- //printk("%s 2\n", __FUNCTION__);
- GSE_LOG("Original RBM<<<<<[%08d %08d %08d]\n", buffer[MC3XXX_AXIS_X], buffer[MC3XXX_AXIS_Y], buffer[MC3XXX_AXIS_Z]);
- printk("Verify_Z_Railed() %d\n", Verify_Z_Railed((int)buffer[MC3XXX_AXIS_Z], RBM_RESOLUTION));
- if(1 == Verify_Z_Railed(buffer[MC3XXX_AXIS_Z], RBM_RESOLUTION)) // z-railed
- {
- GSE_LOG("%s: Z Railed in RBM mode",__FUNCTION__);
- //printk("%s: Z Railed in RBM mode\n",__FUNCTION__);
- if (G_2_REVERSE_VIRTUAL_Z == 1)
- buffer[MC3XXX_AXIS_Z] = (s16) ( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- else
- buffer[MC3XXX_AXIS_Z] = (s16) -( gsensor_gain.z - (abs(tempX) + abs(tempY)));
- }
- GSE_LOG("RBM<<<<<[%08d %08d %08d]\n", buffer[MC3XXX_AXIS_X], buffer[MC3XXX_AXIS_Y], buffer[MC3XXX_AXIS_Z]);
- }
- #endif
-
- GSE_LOG("%s offset_data <<<<<[%d %d %d]\n", __func__, offset_data[0], offset_data[1], offset_data[2]);
- GSE_LOG("%s gsensor_gain <<<<<[%d %d %d]\n", __func__, gsensor_gain.x, gsensor_gain.y, gsensor_gain.z);
- GSE_LOG("%s gain_data <<<<<[%d %d %d]\n", __func__, gain_data[0], gain_data[1], gain_data[2]);
- GSE_LOG("%s RBM->RAW <<<<<[%d %d %d]\n", __func__, buffer[MC3XXX_AXIS_X], buffer[MC3XXX_AXIS_Y], buffer[MC3XXX_AXIS_Z]);
- }
-
- return 0;
-}
-
-//=============================================================================
-int MC3XXX_ReadRawData(struct i2c_client *client, char * buf)
-{
- int res = 0;
- s16 raw_buf[3] = { 0 };
-
- if (!buf || !client)
- {
- return -EINVAL;
- }
-
- mc3xxx_set_mode(client, MC3XXX_WAKE);
- res = MC3XXX_ReadData(client,&raw_buf[0]);
- if(res)
- {
- printk("%s %d\n",__FUNCTION__, __LINE__);
- GSE_ERR("I2C error: ret value=%d", res);
- return -EIO;
- }
- else
- {
- //const struct mc3xx0_hwmsen_convert *pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
-
- GSE_LOG("UPDATE dat: (%+3d %+3d %+3d)\n",
- raw_buf[MC3XXX_AXIS_X], raw_buf[MC3XXX_AXIS_Y], raw_buf[MC3XXX_AXIS_Z]);
-
- if ((is_new_mc34x0)||(is_mc35xx))
- {
- raw_buf[MC3XXX_AXIS_X] = -raw_buf[MC3XXX_AXIS_X];
- raw_buf[MC3XXX_AXIS_Y] = -raw_buf[MC3XXX_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = raw_buf[MC3XXX_AXIS_X];
-
- raw_buf[MC3XXX_AXIS_X] = raw_buf[MC3XXX_AXIS_Y];
- raw_buf[MC3XXX_AXIS_Y] = -temp;
- }
-
- G_RAW_DATA[MC3XXX_AXIS_X] = pCvt->sign[MC3XXX_AXIS_X] * raw_buf[pCvt->map[MC3XXX_AXIS_X]];
- G_RAW_DATA[MC3XXX_AXIS_Y] = pCvt->sign[MC3XXX_AXIS_Y] * raw_buf[pCvt->map[MC3XXX_AXIS_Y]];
- G_RAW_DATA[MC3XXX_AXIS_Z] = pCvt->sign[MC3XXX_AXIS_Z] * raw_buf[pCvt->map[MC3XXX_AXIS_Z]];
-
- G_RAW_DATA[MC3XXX_AXIS_Z] += gsensor_gain.z*(pCvt->sign[MC3XXX_AXIS_Z])*(1);//G_RAW_DATA[MC3XXX_AXIS_Z]+gsensor_gain.z;
-
- sprintf(buf, "%04x %04x %04x", G_RAW_DATA[MC3XXX_AXIS_X],
- G_RAW_DATA[MC3XXX_AXIS_Y], G_RAW_DATA[MC3XXX_AXIS_Z]);
-
- GSE_LOG("G_RAW_DATA: (%+3d %+3d %+3d)\n",
- G_RAW_DATA[MC3XXX_AXIS_X], G_RAW_DATA[MC3XXX_AXIS_Y], G_RAW_DATA[MC3XXX_AXIS_Z]);
- }
-
- return 0;
-}
-
-//=============================================================================
-static int MC3XXX_ReadRegMap(struct i2c_client *client, u8 *pbUserBuf)
-{
- u8 data[128] = {0};
- //u8 addr = 0x00;
- int err = 0;
- int i = 0;
-
- if(NULL == client)
- {
- err = -EINVAL;
- return err;
- }
-
-
- for(i = 0; i < 64; i++)
- {
- data[i] = i2c_smbus_read_byte_data(client, i);
- printk(KERN_INFO "mcube register map Register[%x] = 0x%x\n", i ,data[i]);
- }
-
- msleep(50);
-
- mcube_write_log_data(client, data);
-
- msleep(50);
-
- if (NULL != pbUserBuf)
- {
- printk(KERN_INFO "copy to user buffer\n");
- memcpy(pbUserBuf, data, 64);
- }
-
- return err;
-}
-
-//=============================================================================
-void MC3XXX_Reset(struct i2c_client *client)
-{
- //s16 tmp = 0, x_gain = 0, y_gain = 0, z_gain = 0;
- u8 buf[3] = { 0 };
- int err = 0;
-
- buf[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x07, buf[0]);
-
- i2c_smbus_read_i2c_block_data(client, 0x04, 1, buf);
-
- if (0x00 == (buf[0] & 0x40))
- {
- buf[0] = 0x6d;
- i2c_smbus_write_byte_data(client, 0x1b, buf[0]);
-
- buf[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x1b, buf[0]);
- }
-
- msleep(5);
-
- buf[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x07, buf[0]);
-
- buf[0] = 0x80;
- i2c_smbus_write_byte_data(client, 0x1c, buf[0]);
-
- buf[0] = 0x80;
- i2c_smbus_write_byte_data(client, 0x17, buf[0]);
-
- msleep(5);
-
- buf[0] = 0x00;
- i2c_smbus_write_byte_data(client, 0x1c, buf[0]);
-
- buf[0] = 0x00;
- i2c_smbus_write_byte_data(client, 0x17, buf[0]);
-
- msleep(5);
-
- memset(offset_buf, 0, sizeof(offset_buf));
-
- err = i2c_smbus_read_i2c_block_data(client, 0x21, 6, offset_buf);
-
- i2c_smbus_read_i2c_block_data(client, 0x04, 1, buf);
-
- if (0x00 == (buf[0] & 0x40))
- {
- buf[0] = 0x6d;
- i2c_smbus_write_byte_data(client, 0x1b, buf[0]);
-
- buf[0] = 0x43;
- i2c_smbus_write_byte_data(client, 0x1b, buf[0]);
- }
-
- buf[0] = 0x41;
- i2c_smbus_write_byte_data(client, 0x07, buf[0]);
-
-}
-#endif
-
-int mc3xxx_read_accel_xyz(struct i2c_client *client, s16 * acc)
-{
- int comres = 0;
- s16 raw_data[MC3XXX_AXIS_NUM] = { 0 };
- //const struct mc3xx0_hwmsen_convert *pCvt = &mc3xx0_cvt[mc3xx0_current_placement];
-
-#ifdef DOT_CALI
- s16 raw_buf[6] = { 0 };
-
- comres = MC3XXX_ReadData(client, &raw_buf[0]);
-
- raw_data[MC3XXX_AXIS_X] = raw_buf[0];
- raw_data[MC3XXX_AXIS_Y] = raw_buf[1];
- raw_data[MC3XXX_AXIS_Z] = raw_buf[2];
-#else
- unsigned char raw_buf[6] = { 0 };
- signed char raw_buf1[3] = { 0 };
-
- if(Sensor_Accuracy == MCUBE_8G_14BIT)
- {
- comres = i2c_smbus_read_i2c_block_data(client, MC3XXX_REG_XOUT_EX_L, 6, raw_buf);
-
- raw_data[MC3XXX_AXIS_X] = (signed short)((raw_buf[0])|(raw_buf[1]<<8));
- raw_data[MC3XXX_AXIS_Y] = (signed short)((raw_buf[2])|(raw_buf[3]<<8));
- raw_data[MC3XXX_AXIS_Z] = (signed short)((raw_buf[4])|(raw_buf[5]<<8));
- }
- else if(Sensor_Accuracy == MCUBE_1_5G_8BIT)
- {
- comres = i2c_smbus_read_i2c_block_data(client, MC3XXX_REG_XOUT, 3, raw_buf1);
-
- raw_data[MC3XXX_AXIS_X] = (signed short)raw_buf1[0];
- raw_data[MC3XXX_AXIS_Y] = (signed short)raw_buf1[1];
- raw_data[MC3XXX_AXIS_Z] = (signed short)raw_buf1[2];
- }
-#endif
-
- if((is_new_mc34x0)||(is_mc35xx))
- {
- raw_data[MC3XXX_AXIS_X] = -raw_data[MC3XXX_AXIS_X];
- raw_data[MC3XXX_AXIS_Y] = -raw_data[MC3XXX_AXIS_Y];
- }
- else if (is_mc3250)
- {
- s16 temp = 0;
-
- temp = raw_data[MC3XXX_AXIS_X];
-
- raw_data[MC3XXX_AXIS_X] = raw_data[MC3XXX_AXIS_Y];
- raw_data[MC3XXX_AXIS_Y] = -temp;
- }
- //printk("%s:%d %d %d\n",__FUNCTION__,raw_data[0],raw_data[1],raw_data[2]);
- acc[MC3XXX_AXIS_X] = pCvt->sign[MC3XXX_AXIS_X] * raw_data[pCvt->map[MC3XXX_AXIS_X]];
- acc[MC3XXX_AXIS_Y] = pCvt->sign[MC3XXX_AXIS_Y] * raw_data[pCvt->map[MC3XXX_AXIS_Y]];
- acc[MC3XXX_AXIS_Z] = pCvt->sign[MC3XXX_AXIS_Z] * raw_data[pCvt->map[MC3XXX_AXIS_Z]];
-
- return comres;
-}
-
-//=============================================================================
-static void mc3xxx_work_func(struct work_struct *work)
-{
- struct mc3xxx_data *data = &l_sensorconfig;//container_of(work, struct mc3xxx_data, work);
- //int ret = 0;
- s16 raw[3] = { 0 };
-
-#ifdef DOT_CALI
- if( load_cali_flg > 0)
- {
- /* ret = mcube_read_cali_file(data->client);
-
- if(ret == 0)
- load_cali_flg = ret;
- else
- load_cali_flg--;
-
- GSE_LOG("load_cali %d\n",ret); */
- MC3XXX_WriteCalibration(data->client,l_sensorconfig.offset);
- load_cali_flg = 0;
- }
-#endif
-#if 1
-//gsensor not use when resume
- if(wake_mc3xxx_flg==1){
- wake_mc3xxx_flg=0;
-
-
- mc3xxx_chip_init(data->client);
- MC3XXX_ResetCalibration(data->client);
-
- MC3XXX_WriteCalibration(data->client,l_sensorconfig.offset);
- /*ret =mcube_read_cali_file(data->client);
- if(ret !=0)
- printk("*load_cali %d\n",ret); */
- }
-#endif
-
- mc3xxx_read_accel_xyz(data->client, &raw[0]);
- //printk("%s:%d %d %d\n",__FUNCTION__,raw[0],raw[1],raw[2]);
- input_report_abs(data->input_dev, ABS_X, raw[0]);
- input_report_abs(data->input_dev, ABS_Y, raw[1]);
- input_report_abs(data->input_dev, ABS_Z, raw[2]);
- input_sync(data->input_dev);
-
- queue_delayed_work(data->mc3xxx_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
-}
-/*
-//=============================================================================
-static enum hrtimer_restart mc3xxx_timer_func(struct hrtimer *timer)
-{
- struct mc3xxx_data *data = container_of(timer, struct mc3xxx_data, timer);
-
- queue_work(data->mc3xxx_wq, &data->work);
-
- hrtimer_start(&data->timer, ktime_set(0, sensor_duration*1000000), HRTIMER_MODE_REL);
-
- return HRTIMER_NORESTART;
-}
-*/
-//MCUBE_BACKUP_FILE
-static void mcube_copy_file(const char *dstFilePath)
-{
- int err =0;
- initKernelEnv();
-
- fd_file = openFile(dstFilePath,O_RDWR,0);
- if (fd_file == NULL)
- {
- GSE_LOG("open %s fail\n",dstFilePath);
- return;
- }
-
- if ((err = writeFile(fd_file,backup_buf,64))>0)
- GSE_LOG("buf:%s\n",backup_buf);
- else
- GSE_LOG("write file error %d\n",err);
-
- set_fs(oldfs); ;
- closeFile(fd_file);
-
-}
-//MCUBE_BACKUP_FILE
-
-extern int wmt_setsyspara(char *varname, char *varval);
-static void update_var(void)
-{
- char varbuf[64];
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- sprintf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- (pCvt->map[MC3XXX_AXIS_X]),
- (pCvt->sign[MC3XXX_AXIS_X]),
- (pCvt->map[MC3XXX_AXIS_Y]),
- (pCvt->sign[MC3XXX_AXIS_Y]),
- (pCvt->map[MC3XXX_AXIS_Z]),
- (pCvt->sign[MC3XXX_AXIS_Z]),
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
-
- wmt_setsyspara("wmt.io.mc3230sensor",varbuf);
-}
-
-static long wmt_mc3xxx_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- short enable = 0;
- short delay = 0;
- unsigned int temp;
-
- switch (cmd){
-
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, (short*)arg, sizeof(short)))
- {
- errlog("Can't get enable flag!!!\n");
- return -EFAULT;
- }
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor. l_sensorconfig.sensor_samp=%d\n", enable, l_sensorconfig.sensor_samp);
-
- if (enable != l_sensorconfig.sensor_enable)
- {
-
- l_sensorconfig.sensor_enable = enable;
-
- }
- } else {
- errlog("Wrong enable argument!!!\n");
- return -EFAULT;
- }
- break;
- case ECS_IOCTL_APP_SET_DELAY://IOCTL_SENSOR_SET_DELAY_ACCEL:
- // set the rate of g-sensor
- if (copy_from_user(&delay,(short*)arg, sizeof(short)))
- {
- errlog("Can't get set delay!!!\n");
- return -EFAULT;
- }
- dbg("Get delay=%d \n", delay);
-
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- if (delay > 0)
- {
- l_sensorconfig.sensor_samp = 1000/delay;
- } else {
- errlog("error delay argument(delay=%d)!!!\n",delay);
- return -EFAULT;
- }
-
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- temp = MC3230_DRVID;
- if (copy_to_user((unsigned int*)arg, &temp, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("mc32x0_driver_id:%d\n",temp);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
- if(Sensor_Accuracy &MCUBE_1_5G_8BIT){
- if(is_mc35xx) //mc3236:8 bit ,+/-2g
- temp = (8<<8) | 4;
- else
- temp = (8<<8) | 3; //mc3230:8 bit ,+/-1.5g
-
- }
- if (copy_to_user((unsigned int *)arg, &temp, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",temp);
- break;
- default:
- return -EINVAL;
- break;
- }
- return 0;
-}
-
-
-static long mc3xxx_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- //int intBuf[SENSOR_DATA_SIZE] = { 0 };
- int ret = 0;
- float convert_para = 0.0f;
-
- int prod = -1;
-
-
-#ifdef DOT_CALI
- void __user *data1 = NULL;
- char strbuf[256] = { 0 };
- //int cali[3] = { 0 };
- SENSOR_DATA sensor_data = { 0 };
- struct i2c_client *client = container_of(mc3xxx_device.parent, struct i2c_client, dev);
-#endif
-
- struct mc3xxx_data *data = NULL;
-
- data = i2c_get_clientdata(client);
-
- switch (cmd) {
-
-
-/* case IOCTL_SENSOR_SET_DELAY_ACCEL:
- if(copy_from_user((void *)&sensor_duration, (void __user *) arg, sizeof(short))!=0){
- printk("copy from error in %s.\n",__func__);
- }
-
- break;
-
- case IOCTL_SENSOR_GET_DELAY_ACCEL:
- if(copy_to_user((void __user *) arg, (const void *)&sensor_duration, sizeof(short))!=0){
- printk("copy to error in %s.\n",__func__);
- }
-
- break;
-
- case IOCTL_SENSOR_GET_STATE_ACCEL:
- if(copy_to_user((void __user *) arg, (const void *)&sensor_state_flag, sizeof(short))!=0){
- printk("copy to error in %s.\n",__func__);
- }
-
- break;
-
- case IOCTL_SENSOR_SET_STATE_ACCEL:
- if(copy_from_user((void *)&sensor_state_flag, (void __user *) arg, sizeof(short))!=0){
- printk("copy from error in %s.\n",__func__);
- }
-
- break;*/
- case IOCTL_SENSOR_GET_NAME:
- if(copy_to_user((void __user *) arg,(const void *)MC3XXX_DISPLAY_NAME, sizeof(MC3XXX_DISPLAY_NAME))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
-
- case IOCTL_SENSOR_GET_VENDOR:
- if(copy_to_user((void __user *) arg,(const void *)MC3XXX_DIPLAY_VENDOR, sizeof(MC3XXX_DIPLAY_VENDOR))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
-
- case IOCTL_SENSOR_GET_CONVERT_PARA:
- convert_para = MC3XXX_CONVERT_PARAMETER;
- if(copy_to_user((void __user *) arg,(const void *)&convert_para,sizeof(float))!=0){
- printk("copy to error in %s.\n",__func__);
- }
- break;
-
-#ifdef DOT_CALI
- case GSENSOR_IOCTL_READ_SENSORDATA:
- case GSENSOR_IOCTL_READ_RAW_DATA:
- //case GSENSOR_MCUBE_IOCTL_READ_RBM_DATA:
- GSE_LOG("fwq GSENSOR_IOCTL_READ_RAW_DATA\n");
-
- //mutex_lock(&data->lock);
- MC3XXX_ReadRawData(client, strbuf);
- //mutex_unlock(&data->lock);
-
- if (copy_to_user((void __user *) arg, &strbuf, strlen(strbuf)+1))
- {
- printk("failed to copy sense data to user space.");
- return -EFAULT;
- }
- break;
-
- case GSENSOR_MCUBE_IOCTL_SET_CALI:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_CALI!!\n");
- data1 = (void __user *)arg;
-
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
- if(copy_from_user(&sensor_data, data1, sizeof(sensor_data)))
- {
- ret = -EFAULT;
- break;
- }
- else
- {
- l_sensorconfig.offset[MC3XXX_AXIS_X] = sensor_data.x;
- l_sensorconfig.offset[MC3XXX_AXIS_Y] = sensor_data.y;
- l_sensorconfig.offset[MC3XXX_AXIS_Z] = sensor_data.z;
- update_var();
- GSE_LOG("GSENSOR_MCUBE_IOCTL_SET_CALI %d %d %d %d %d %d!!\n", l_sensorconfig.offset[MC3XXX_AXIS_X], l_sensorconfig.offset[MC3XXX_AXIS_Y],l_sensorconfig.offset[MC3XXX_AXIS_Z] ,sensor_data.x, sensor_data.y ,sensor_data.z);
-
- //mutex_lock(&data->lock);
- ret = MC3XXX_WriteCalibration(client, l_sensorconfig.offset);
- //mutex_unlock(&data->lock);
- }
- break;
-
- case GSENSOR_IOCTL_CLR_CALI:
- GSE_LOG("fwq GSENSOR_IOCTL_CLR_CALI!!\n");
- //mutex_lock(&data->lock);
- l_sensorconfig.offset[0] = 0;
- l_sensorconfig.offset[1] = 0;
- l_sensorconfig.offset[2] = 0;
-
- update_var();
- ret = MC3XXX_ResetCalibration(client);
- //mutex_unlock(&data->lock);
- break;
-
- case GSENSOR_IOCTL_GET_CALI:
- GSE_LOG("fwq mc3xxx GSENSOR_IOCTL_GET_CALI\n");
-
- data1 = (unsigned char*)arg;
-
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
-
- if((ret = MC3XXX_ReadCalibration(client,l_sensorconfig.offset)))
- {
- GSE_LOG("fwq mc3xxx MC3XXX_ReadCalibration error!!!!\n");
- break;
- }
-
- sensor_data.x = l_sensorconfig.offset[MC3XXX_AXIS_X];
- sensor_data.y = l_sensorconfig.offset[MC3XXX_AXIS_Y];
- sensor_data.z = l_sensorconfig.offset[MC3XXX_AXIS_Z];
-
- if(copy_to_user(data1, &sensor_data, sizeof(sensor_data)))
- {
- ret = -EFAULT;
- break;
- }
- break;
-
- case GSENSOR_IOCTL_SET_CALI_MODE:
- GSE_LOG("fwq mc3xxx GSENSOR_IOCTL_SET_CALI_MODE\n");
- break;
-
- case GSENSOR_MCUBE_IOCTL_READ_RBM_DATA:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_RBM_DATA\n");
- data1 = (void __user *) arg;
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
- MC3XXX_ReadRBMData(client,(char *)&strbuf);
- if(copy_to_user(data1, &strbuf, strlen(strbuf)+1))
- {
- ret = -EFAULT;
- break;
- }
- break;
- case GSENSOR_MCUBE_IOCTL_SET_RBM_MODE:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_SET_RBM_MODE\n");
- //MCUBE_BACKUP_FILE
- if(READ_FROM_BACKUP==true)
- {
-
- //mcube_copy_file(CALIB_PATH);
-
- READ_FROM_BACKUP = false;
- }
- //MCUBE_BACKUP_FILE
- //mutex_lock(&data->lock);
- MC3XXX_rbm(client, 1);
- //mutex_unlock(&data->lock);
- break;
-
- case GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_CLEAR_RBM_MODE\n");
- //mutex_lock(&data->lock);
- MC3XXX_rbm(client, 0);
- //mutex_unlock(&data->lock);
- break;
-
- case GSENSOR_MCUBE_IOCTL_REGISTER_MAP:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_REGISTER_MAP\n");
- MC3XXX_ReadRegMap(client, NULL);
- break;
-
- case GSENSOR_MCUBE_IOCTL_READ_PRODUCT_ID:
- GSE_LOG("fwq GSENSOR_MCUBE_IOCTL_READ_PRODUCT_ID\n");
- data1 = (void __user *) arg;
- if(data1 == NULL)
- {
- ret = -EINVAL;
- break;
- }
-
- if (MC3XXX_RETCODE_SUCCESS != (prod = MC3XX0_ValidateSensorIC(s_bPCODE)))
- GSE_LOG("Not mCube accelerometers!\n");
-
- if(copy_to_user(data1, &prod, sizeof(prod)))
- {
- GSE_LOG("%s: read pcode fail to copy!\n", __func__);
- return -EFAULT;
- }
- break;
-#endif
-
- default:
- ret = -EINVAL;
- break;
- }
-
- return ret;
-}
-
-
-static int mc3xxx_open(struct inode *inode, struct file *filp)
-{
- return nonseekable_open(inode, filp);
-}
-
-static int mc3xxx_release(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-static int wmt_mc3xxx_open(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-static int wmt_mc3xxx_release(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-
-//=============================================================================
-static struct file_operations sensor_fops =
-{
- .owner = THIS_MODULE,
- .open = mc3xxx_open,
- .release = mc3xxx_release,
- .unlocked_ioctl = mc3xxx_ioctl,
-};
-
-static struct file_operations wmt_sensor_fops =
-{
- .owner = THIS_MODULE,
- .open = wmt_mc3xxx_open,
- .release = wmt_mc3xxx_release,
- .unlocked_ioctl = wmt_mc3xxx_ioctl,
-};
-
-
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- //int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- //unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&l_sensorconfig.lock);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- // should do sth
- }
- //printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- klog("Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- dbg("The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- //mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&l_sensorconfig.lock);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-//#ifdef CONFIG_HAS_EARLYSUSPEND
-static void mc3xxx_early_suspend(struct platform_device *pdev, pm_message_t state)
-{
- /*struct mc3xxx_data *data = NULL;
-
- data = container_of(handler, struct mc3xxx_data, early_suspend);
-
- hrtimer_cancel(&data->timer);*/
-
- cancel_delayed_work_sync(&l_sensorconfig.work);
- mc3xxx_set_mode(l_sensorconfig.client,MC3XXX_STANDBY);
-}
-
-//=============================================================================
-static void mc3xxx_early_resume(struct platform_device *pdev)
-{
- struct mc3xxx_data *data = &l_sensorconfig;
-
- wake_mc3xxx_flg =1;
- //data = container_of(handler, struct mc3xxx_data, early_suspend);
-
- mc3xxx_set_mode(data->client,MC3XXX_WAKE);
-
- queue_delayed_work(data->mc3xxx_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
- //hrtimer_start(&data->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
-}
-//#endif
-
-//=============================================================================
-static struct miscdevice mc3xxx_device =
-{
- .minor = MISC_DYNAMIC_MINOR,
- .name = SENSOR_NAME,
- .fops = &sensor_fops,
-};
-
-static struct miscdevice mc3xxx_wmt_device =
-{
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &wmt_sensor_fops,
-};
-
-
-
-/*****************************************
- *** MC3XX0_ValidateSensorIC
- *****************************************/
-static int MC3XX0_ValidateSensorIC(unsigned char bPCode)
-{
- unsigned char _baOurSensorList[] = { MC3XXX_PCODE_3210 , MC3XXX_PCODE_3230 ,
- MC3XXX_PCODE_3250 ,
- MC3XXX_PCODE_3410 , MC3XXX_PCODE_3430 ,
- MC3XXX_PCODE_3410N, MC3XXX_PCODE_3430N,
- MC3XXX_PCODE_3510B, MC3XXX_PCODE_3530B,
- MC3XXX_PCODE_3510C, MC3XXX_PCODE_3530C
- };
-
- int _nSensorCount = (sizeof(_baOurSensorList) / sizeof(_baOurSensorList[0]));
- int _nCheckIndex = 0;
-
- GSE_LOG("[%s] code to be verified: 0x%X, _nSensorCount: %d\n", __FUNCTION__, bPCode, _nSensorCount);
-
- for (_nCheckIndex = 0; _nCheckIndex < _nSensorCount; _nCheckIndex++)
- {
- if (_baOurSensorList[_nCheckIndex] == bPCode)
- return (MC3XXX_RETCODE_SUCCESS);
- }
-
- if (MC3XXX_PCODE_3530C == (bPCode | 0x0E))
- return (MC3XXX_RETCODE_SUCCESS);
-
- return (MC3XXX_RETCODE_ERROR_IDENTIFICATION);
-}
-
-/*****************************************
- *** _mc3xxx_i2c_auto_probe
- *****************************************/
-static int _mc3xxx_i2c_auto_probe(struct i2c_client *client)
-{
- unsigned char _baDataBuf[2] = {0};
- int _nProbeAddrCount = (sizeof(mc3xxx_i2c_auto_probe_addr) / sizeof(mc3xxx_i2c_auto_probe_addr[0]));
- int _nCount = 0;
- int _nCheckCount = 0;
-
- //GSE_FUN();
-
- s_bPCODE = 0x00;
-
- for (_nCount = 0; _nCount < _nProbeAddrCount; _nCount++)
- {
- _nCheckCount = 0;
- client->addr = mc3xxx_i2c_auto_probe_addr[_nCount];
-
- //GSE_LOG("[%s] probing addr: 0x%X\n", __FUNCTION__, client->addr);
-
-_I2C_AUTO_PROBE_RECHECK_:
- _baDataBuf[0] = MC3XXX_REG_PRODUCT_CODE;
- if (0 > i2c_master_send(client, &(_baDataBuf[0]), 1))
- {
- //GSE_ERR("ERR: addr: 0x%X fail to communicate-2!\n", client->addr);
- continue;
- }
-
- if (0 > i2c_master_recv(client, &(_baDataBuf[0]), 1))
- {
- //GSE_ERR("ERR: addr: 0x%X fail to communicate-3!\n", client->addr);
- continue;
- }
-
- _nCheckCount++;
-
- //GSE_LOG("[%s][%d] addr: 0x%X ok to read REG(0x3B): 0x%X\n", __FUNCTION__, _nCheckCount, client->addr, _baDataBuf[0]);
-
- if (0x00 == _baDataBuf[0])
- {
- if (1 == _nCheckCount)
- {
- MC3XXX_Reset(client);
- goto _I2C_AUTO_PROBE_RECHECK_;
- }
- }
-
- if (MC3XXX_RETCODE_SUCCESS == MC3XX0_ValidateSensorIC(_baDataBuf[0]))
- {
- //GSE_LOG("[%s] addr: 0x%X confirmed ok to use.\n", __FUNCTION__, client->addr);
-
- s_bPCODE = _baDataBuf[0];
-
- return (MC3XXX_RETCODE_SUCCESS);
- }
- }
-
- return (MC3XXX_RETCODE_ERROR_I2C);
-}
-
-
-//=============================================================================
-//static int mc3xxx_probe(struct i2c_client *client,
-// const struct i2c_device_id *id)
-static int mc3xxx_probe(struct platform_device *pdev)
-{
- int ret = 0;
- //int product_code = 0;
- struct mc3xxx_data *data = &l_sensorconfig;
- struct i2c_client *client = l_sensorconfig.client;
-
- #ifdef DOT_CALI
- load_cali_flg = 30;
- #endif
-/*
- if (MC3XXX_RETCODE_SUCCESS != _mc3xxx_i2c_auto_probe(client))
- {
- GSE_ERR("ERR: fail to probe mCube sensor!\n");
- goto err_check_functionality_failed;
- }
-
- data = kzalloc(sizeof(struct mc3xxx_data), GFP_KERNEL);
- if(data == NULL)
- {
- ret = -ENOMEM;
- goto err_alloc_data_failed;
- }
-*/
- data->sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (data->sensor_proc != NULL)
- {
- data->sensor_proc->write_proc = sensor_writeproc;
- data->sensor_proc->read_proc = sensor_readproc;
- }
-
- data->mc3xxx_wq = create_singlethread_workqueue("mc3xxx_wq");
- if (!data->mc3xxx_wq )
- {
- ret = -ENOMEM;
- goto err_create_workqueue_failed;
- }
- INIT_DELAYED_WORK(&data->work, mc3xxx_work_func);
- mutex_init(&data->lock);
-
- //sensor_duration = SENSOR_DURATION_DEFAULT;
- //sensor_state_flag = 1;
-
-
- data->client = client;
- dev.client=client;
-
- i2c_set_clientdata(client, data);
-
- data->input_dev = input_allocate_device();
- if (!data->input_dev) {
- ret = -ENOMEM;
- goto exit_input_dev_alloc_failed;
- }
-
- #ifdef DOT_CALI
- MC3XXX_Reset(client);
- #endif
-
- ret = mc3xxx_chip_init(client);
- if (ret < 0) {
- goto err_chip_init_failed;
- }
-
- set_bit(EV_ABS, data->input_dev->evbit);
- data->map[0] = G_0;
- data->map[1] = G_1;
- data->map[2] = G_2;
- data->inv[0] = G_0_REVERSE;
- data->inv[1] = G_1_REVERSE;
- data->inv[2] = G_2_REVERSE;
-
- input_set_abs_params(data->input_dev, ABS_X, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
- input_set_abs_params(data->input_dev, ABS_Y, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
- input_set_abs_params(data->input_dev, ABS_Z, -32*8, 32*8, INPUT_FUZZ, INPUT_FLAT);
-
- data->input_dev->name = "g-sensor";
-
- ret = input_register_device(data->input_dev);
- if (ret) {
- goto exit_input_register_device_failed;
- }
-
- mc3xxx_device.parent = &client->dev;
-
- ret = misc_register(&mc3xxx_device);
- if (ret) {
- goto exit_misc_device_register_failed;
- }
-
- ret = misc_register(&mc3xxx_wmt_device);
- if (ret) {
- goto exit_misc_device_register_failed;
- }
-
- ret = sysfs_create_group(&data->input_dev->dev.kobj, &mc3xxx_group);
-/*
- if (!data->use_irq){
- hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
- data->timer.function = mc3xxx_timer_func;
- //hrtimer_start(&data->timer, ktime_set(1, 0), HRTIMER_MODE_REL);
- }
-*/
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- data->early_suspend.suspend = mc3xxx_early_suspend;
- data->early_suspend.resume = mc3xxx_early_resume;
- register_early_suspend(&data->early_suspend);
-#endif
- data->enabled = 1;
- queue_delayed_work(data->mc3xxx_wq, &data->work, msecs_to_jiffies(sample_rate_2_memsec(data->sensor_samp)));
- //strcpy(mc3xxx_on_off_str,"gsensor_int2");
- //gpio_set_one_pin_io_status(mc3xxx_pin_hd,0,mc3xxx_on_off_str);
-
- printk("mc3xxx probe ok \n");
-
- return 0;
-exit_misc_device_register_failed:
-exit_input_register_device_failed:
- input_free_device(data->input_dev);
-err_chip_init_failed:
-exit_input_dev_alloc_failed:
- destroy_workqueue(data->mc3xxx_wq);
-err_create_workqueue_failed:
- kfree(data);
-//err_alloc_data_failed:
-//err_check_functionality_failed:
- printk("mc3xxx probe failed \n");
- return ret;
-
-}
-
-//static int mc3xxx_remove(struct i2c_client *client)
-static int mc3xxx_remove(struct platform_device *pdev)
-{
- /*struct mc3xxx_data *data = i2c_get_clientdata(client);
-
- hrtimer_cancel(&data->timer);
- input_unregister_device(data->input_dev);
-// gpio_release(mc3xxx_pin_hd, 2);
- misc_deregister(&mc3xxx_device);
- sysfs_remove_group(&data->input_dev->dev.kobj, &mc3xxx_group);
- kfree(data);
- return 0;*/
-
- if (NULL != l_sensorconfig.mc3xxx_wq)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.mc3xxx_wq);
- destroy_workqueue(l_sensorconfig.mc3xxx_wq);
- l_sensorconfig.mc3xxx_wq = NULL;
- }
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- misc_deregister(&mc3xxx_device);
- misc_deregister(&mc3xxx_wmt_device);
- sysfs_remove_group(&l_sensorconfig.input_dev->dev.kobj, &mc3xxx_group);
- input_unregister_device(l_sensorconfig.input_dev);
- return 0;
-}
-
-//=============================================================================
-/*
-static void mc3xxx_shutdown(struct i2c_client *client)
-{
- struct mc3xxx_data *data = i2c_get_clientdata(client);
-
- if(data->enabled)
- mc3xxx_enable(data, 0);
-}
-*/
-
-//=============================================================================
-
-static const struct i2c_device_id mc3xxx_id[] =
-{
- { SENSOR_NAME, 0 },
- { }
-};
-
-MODULE_DEVICE_TABLE(i2c, mc3xxx_id);
-/*
-static struct i2c_driver mc3xxx_driver =
-{
- .class = I2C_CLASS_HWMON,
-
- .driver = {
- .owner = THIS_MODULE,
- .name = SENSOR_NAME,
- },
- .id_table = mc3xxx_id,
- .probe = mc3xxx_probe,
- .remove = mc3xxx_remove,
- //.shutdown = mc3xxx_shutdown,
-};
-*/
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
- //int tmpoff[3] = {0};
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
-
- pCvt = (struct mc3xx0_hwmsen_convert *)kzalloc(sizeof(struct mc3xx0_hwmsen_convert), GFP_KERNEL);
-
- if (wmt_getsyspara("wmt.io.mc3230.virtualz", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- //return -1;
- } else {
- sscanf(varbuf, "%d", &g_virtual_z);
-
- }
- printk("%s g_virtual_z %d\n", __FUNCTION__, g_virtual_z);
- memset(varbuf, 0, sizeof(varbuf));
- if (wmt_getsyspara("wmt.io.mc3230sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1; //open it for no env just,not insmod such module 2014-6-30
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(pCvt->map[MC3XXX_AXIS_X]),
- &(pCvt->sign[MC3XXX_AXIS_X]),
- &(pCvt->map[MC3XXX_AXIS_Y]),
- &(pCvt->sign[MC3XXX_AXIS_Y]),
- &(pCvt->map[MC3XXX_AXIS_Z]),
- &(pCvt->sign[MC3XXX_AXIS_Z]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2])
- );
- if (n != 12) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- pCvt->map[MC3XXX_AXIS_X],
- pCvt->sign[MC3XXX_AXIS_X],
- pCvt->map[MC3XXX_AXIS_Y],
- pCvt->sign[MC3XXX_AXIS_Y],
- pCvt->map[MC3XXX_AXIS_Z],
- pCvt->sign[MC3XXX_AXIS_Z],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static void mc3xxx_platform_release(struct device *device)
-{
- return;
-}
-
-
-static struct platform_device mc3xxx_pdevice = {
- .name = SENSOR_NAME,
- .id = 0,
- .dev = {
- .release = mc3xxx_platform_release,
- },
-};
-
-static struct platform_driver mc3xxx_pdriver = {
- .probe = mc3xxx_probe,
- .remove = mc3xxx_remove,
- .suspend = mc3xxx_early_suspend,
- .resume = mc3xxx_early_resume,
- //.shutdown = mc3xxx_shutdown,
- .driver = {
- .name = SENSOR_NAME,
- },
-};
-
-
-static int __init mc3xxx_init(void)
-{
- int ret = -1;
- struct i2c_client *this_client;
- printk("mc3xxx: init\n");
-
- //ret = i2c_add_driver(&mc3xxx_driver);
-
- // parse g-sensor u-boot arg
- ret = get_axisset();
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
-
- if (!(this_client = sensor_i2c_register_device(0, mc3xxx_i2c_auto_probe_addr[0], SENSOR_NAME)))
- {
- printk(KERN_ERR"Can't register gsensor i2c device!\n");
- return -1;
- }
-
- if (MC3XXX_RETCODE_SUCCESS != _mc3xxx_i2c_auto_probe(this_client))
- {
- GSE_ERR("ERR: fail to auto_probe mCube sensor!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
-
- l_sensorconfig.client = this_client;
-
- l_dev_class = class_create(THIS_MODULE, SENSOR_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&mc3xxx_pdevice)))
- {
- klog("Can't register mc3xxx platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&mc3xxx_pdriver)) != 0)
- {
- errlog("Can't register mc3xxx platform driver!!!\n");
- return ret;
- }
-
-
- return ret;
-}
-
-static void __exit mc3xxx_exit(void)
-{
- //i2c_del_driver(&mc3xxx_driver);
-#ifdef CONFIG_HAS_EARLYSUSPEND
- unregister_early_suspend(&l_sensorconfig.earlysuspend);
-#endif
- platform_driver_unregister(&mc3xxx_pdriver);
- platform_device_unregister(&mc3xxx_pdevice);
- sensor_i2c_unregister_device(l_sensorconfig.client);
- class_destroy(l_dev_class);
-}
-
-//=============================================================================
-module_init(mc3xxx_init);
-module_exit(mc3xxx_exit);
-
-MODULE_DESCRIPTION("mc3xxx accelerometer driver");
-MODULE_AUTHOR("mCube-inc");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(SENSOR_DRIVER_VERSION);
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/Makefile
deleted file mode 100755
index 99ecc6a1..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_mma7660
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := mma7660.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.c b/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.c
deleted file mode 100755
index f0a0b1ee..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.c
+++ /dev/null
@@ -1,1052 +0,0 @@
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/gpio.h>
-#include <asm/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/freezer.h>
-#include <linux/platform_device.h>
-#include <linux/proc_fs.h>
-#include <mach/hardware.h>
-#include "mma7660.h"
-
-
-//#define DEBUG 1
-
-#undef dbg
-
-//#if 0
- #define dbg(fmt, args...) if (l_sensorconfig.isdbg) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
- //#define dbg(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
- //#define dbg(format, arg...) printk(KERN_ALERT format, ## arg)
-
-
-//#else
-// #define dbg(format, arg...)
-//#endif
-
-/////////////////////Macro constant
-#define SENSOR_POLL_WAIT_TIME 1837
-#define MAX_FAILURE_COUNT 10
-#define MMA7660_ADDR 0x4C
-#define LAND_PORT_MASK 0x1C
-#define LAND_LEFT 0x1
-#define LAND_RIGHT 0x2
-#define PORT_INVERT 0x5
-#define PORT_NORMAL 0x6
-
-#define LANDSCAPE_LOCATION 0
-#define PORTRAIT_LOCATION 1
-
-#define SENSOR_UI_MODE 0
-#define SENSOR_GRAVITYGAME_MODE 1
-
-#define UI_SAMPLE_RATE 0xFC
-
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define GSENSOR_MAJOR 161
-#define GSENSOR_NAME "mma7660"
-#define GSENSOR_DRIVER_NAME "mma7660_drv"
-
-
-#define sin30_1000 500
-#define cos30_1000 866
-
-#define DISABLE 0
-#define ENABLE 1
-
-////////////////////////the rate of g-sensor/////////////////////////////////////////////
-#define SENSOR_DELAY_FASTEST 0
-#define SENSOR_DELAY_GAME 20
-#define SENSOR_DELAY_UI 60
-#define SENSOR_DELAY_NORMAL 200
-
-#define FASTEST_MMA_AMSR 0 // 120 samples/sec
-#define GAME_MMA_AMSR 1 // 1, (64, samples/sec)
-#define UI_MMA_AMSR 3 // 2, 3,4, (16, 8,32 samples/sec)
-#define NORMAL_MMA_AMSR 5 // 5, 6, 7 (4, 2, 1 samples/sec)
-
-/////////////////////////////////////////////////////////////////////////
-static int xyz_g_table[64] = {
-0,47,94,141,188,234,281,328,
-375,422,469,516,563,609,656,703,
-750,797,844,891,938,984,1031,1078,
-1125,1172,1219,1266,1313,1359,1406,1453,
--1500,-1453,-1406,-1359,-1313,-1266,-1219,-1172,
--1125,-1078,-1031,-984,-938,-891,-844,-797,
--750,-703,-656,-609,-563,-516,-469,-422,
--375,-328,-281,-234,-188,-141,-94,-47
-};
-
-static struct platform_device *this_pdev;
-
-static struct class* l_dev_class = NULL;
-static struct device *l_clsdevice = NULL;
-
-
-
-struct mma7660_config
-{
- int op;
- int int_gpio; //0-3
- int xyz_axis[3][2]; // (axis,direction)
- int rxyz_axis[3][2];
- int irq;
- struct proc_dir_entry* sensor_proc;
- int sensorlevel;
- int shake_enable; // 1--enable shake, 0--disable shake
- int manual_rotation; // 0--landance, 90--vertical
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg; // 0-- no debug log, 1--show debug log
- int sensor_samp; // 1,2,4,8,16,32,64,120
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- spinlock_t spinlock;
- int pollcnt; // the counts of polling
- int offset[3];
-};
-
-static struct mma7660_config l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .irq = 6,
- .int_gpio = 3,
- .sensor_proc = NULL,
- .sensorlevel = SENSOR_GRAVITYGAME_MODE,
- .shake_enable = 0, // default enable shake
- .isdbg = 0,
- .sensor_samp = 10, // 4sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .pollcnt = 0, // Don't report the x,y,z when the driver is loaded until 2~3 seconds
- .offset = {0,0,0},
-};
-
-
-static struct timer_list l_polltimer; // for shaking
-static int is_sensor_good = 0; // 1-- work well, 0 -- exception
-struct work_struct poll_work;
-static struct mutex sense_data_mutex;
-static int revision = -1;
-static int l_resumed = 0; // 1: suspend --> resume;2: suspend but not resumed; other values have no meaning
-
-//////////////////Macro function//////////////////////////////////////////////////////
-
-#define SET_MMA_SAMPLE(buf,samp) { \
- buf[0] = 0; \
- sensor_i2c_write(MMA7660_ADDR,7,buf,1); \
- buf[0] = samp; \
- sensor_i2c_write(MMA7660_ADDR,8,buf,1); \
- buf[0] = 0x01; \
- sensor_i2c_write(MMA7660_ADDR,7,buf,1); \
-}
-
-////////////////////////Function define/////////////////////////////////////////////////////////
-
-static unsigned int mma_sample2AMSR(unsigned int samp);
-
-////////////////////////Function implement/////////////////////////////////////////////////
-// rate: 1,2,4,8,16,32,64,120
-static unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-
-
-static ssize_t gsensor_vendor_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- ssize_t ret = 0;
-
- sprintf(buf, "MMA7660_%#x\n", revision);
- ret = strlen(buf) + 1;
-
- return ret;
-}
-
-static DEVICE_ATTR(vendor, 0444, gsensor_vendor_show, NULL);
-
-static struct kobject *android_gsensor_kobj;
-static int gsensor_sysfs_init(void)
-{
- int ret ;
-
- android_gsensor_kobj = kobject_create_and_add("android_gsensor", NULL);
- if (android_gsensor_kobj == NULL) {
- printk(KERN_ERR
- "mma7660 gsensor_sysfs_init:"\
- "subsystem_register failed\n");
- ret = -ENOMEM;
- goto err;
- }
-
- ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr);
- if (ret) {
- printk(KERN_ERR
- "mma7660 gsensor_sysfs_init:"\
- "sysfs_create_group failed\n");
- goto err4;
- }
-
- return 0 ;
-err4:
- kobject_del(android_gsensor_kobj);
-err:
- return ret ;
-}
-
-static int gsensor_sysfs_exit(void)
-{
- sysfs_remove_file(android_gsensor_kobj, &dev_attr_vendor.attr);
- kobject_del(android_gsensor_kobj);
- return 0;
-}
-
-//extern int wmt_i2c_xfer_continue_if_4(struct i2c_msg *msg, unsigned int num, int bus_id);
-extern int i2c_api_do_send(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-extern int i2c_api_do_recv(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-
-int sensor_i2c_write(unsigned int addr,unsigned int index,char *pdata,int len)
-{
- /*struct i2c_msg msg[1];
- unsigned char buf[len+1];
-
- //addr = (addr >> 1);
- buf[0] = index;
- memcpy(&buf[1],pdata,len);
- msg[0].addr = addr;
- msg[0].flags = 0 ;
- msg[0].flags &= ~(I2C_M_RD);
- msg[0].len = len+1;
- msg[0].buf = buf;
-//tmp sensor_i2c_do_xfer(msg,1);
- if (wmt_i2c_xfer_continue_if_4(msg,1,0) <= 0)
- {
- klog("write error!\n");
- return -1;
- }*/
- int ret;
- ret = i2c_api_do_send(0, addr, index, pdata, len);
- if (ret <= 0) {
- klog("i2c_api_do_send error!\n");
- return -1;
- }
-
-#ifdef DEBUG
-{
- int i;
-
- printk("sensor_i2c_write(addr 0x%x,index 0x%x,len %d\n",addr,index,len);
- for(i=0;i<len;i+=8){
- printk("%d : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",i,
- pdata[i],pdata[i+1],pdata[i+2],pdata[i+3],pdata[i+4],pdata[i+5],pdata[i+6],pdata[i+7]);
- }
-}
-#endif
- return 0;
-} /* End of sensor_i2c_write */
-
-int sensor_i2c_read(unsigned int addr,unsigned int index,char *pdata,int len)
-{
- /*struct i2c_msg msg[2];
- unsigned char buf[len+1];
- int ret = 0;
-
- //addr = (addr >> 1);
- memset(buf,0x55,len+1);
- buf[0] = index;
- buf[1] = 0x0;
-
- msg[0].addr = addr;
- msg[0].flags = 0 ;
- msg[0].flags &= ~(I2C_M_RD);
- msg[0].len = 1;
- msg[0].buf = buf;
-
- msg[1].addr = addr;
- msg[1].flags = 0 ;
- msg[1].flags |= (I2C_M_RD);
- msg[1].len = len;
- msg[1].buf = buf;
-
- //tmp sensor_i2c_do_xfer(msg, 2);
- ret = wmt_i2c_xfer_continue_if_4(msg, 2,0);
- if (ret < 0)
- {
- klog("read error!\n");
- return ret;
- }
-
- memcpy(pdata,buf,len);*/
- int ret;
- ret = i2c_api_do_recv(0, addr, index, pdata, len);
- if (ret <= 0) {
- klog("i2c_api_do_recv error!\n");
- return -1;
- }
-#ifdef DEBUG
-{
- int i;
-
- printk("sensor_i2c_read(addr 0x%x,index 0x%x,len %d\n",addr,index,len);
- for(i=0;i<len;i+=8){
- printk("%d : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",i,
- pdata[i],pdata[i+1],pdata[i+2],pdata[i+3],pdata[i+4],pdata[i+5],pdata[i+6],pdata[i+7]);
- }
-}
-#endif
- return 0;
-} /* End of sensor_i2c_read */
-
-void mma7660_chip_init(void)
-{
- char txData[1];
- char amsr = 0;
-
- // the default mode is for UI
- txData[0]=0;
- sensor_i2c_write(MMA7660_ADDR,7,txData,1);
- txData[0] = 0;
- sensor_i2c_write(MMA7660_ADDR,5,txData,1);
- //txData[0] = (1 == l_sensorconfig.shake_enable) ? 0xF0:0x10;
- txData[0] = 0; // disable all int ,for polling
- sensor_i2c_write(MMA7660_ADDR,6,txData,1);
- amsr = 0;// 8 - i;
- txData[0] = 0xF8 | amsr;
- dbg("G-Sensor: SR = 0x%X\n", txData[0]);
- sensor_i2c_write(MMA7660_ADDR,8,txData,1);
- txData[0] = 0x01; // for polling
- sensor_i2c_write(MMA7660_ADDR,7,txData,1);
- return;
-}
-
-static unsigned int mma_sample2AMSR(unsigned int samp)
-{
- int i = 0;
- unsigned int amsr;
-
- if (samp >= 120)
- {
- return 0;
- }
- while (samp)
- {
- samp = samp >> 1;
- i++;
- }
- amsr = 8 - i;
- return amsr;
-}
-
-static int mma_enable_disable(int enable)
-{
- char buf[1];
-
- // disable all interrupt of g-sensor
- memset(buf, 0, sizeof(buf));
- if ((enable < 0) || (enable > 1))
- {
- return -1;
- }
- buf[0] = 0;
- sensor_i2c_write(MMA7660_ADDR,7,buf,1);
- if (enable != 0)
- {
- buf[0] = (1 == l_sensorconfig.shake_enable) ? 0xF0:0x10;
- } else {
- buf[0] = 0;
- }
- sensor_i2c_write(MMA7660_ADDR,6,buf,1);
- buf[0] = 0xf9;
- sensor_i2c_write(MMA7660_ADDR,7,buf,1);
- return 0;
-}
-
-// To contol the g-sensor for UI
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the g-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the g-sensor node...\n");
- return 0;
-}
-
-static /*int*/ long
-mmad_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- char rwbuf[5];
- short delay, enable; //amsr = -1;
- unsigned int uval = 0;
- int i = 0;
- unsigned char rxData[3] = {0};
- int intBuf[3] = {0};
- dbg("g-sensor ioctr...\n");
- memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- return -EFAULT;
- }
- klog("Get delay=%d\n", delay);
- //klog("before change sensor sample:%d...\n", l_sensorconfig.sensor_samp);
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- l_sensorconfig.sensor_samp = 1000/delay;
-
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- klog("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- l_sensorconfig.sensor_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = MMA7660_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("mma7660_driver_id:%d\n",uval);
- break;
- case ECS_IOCTL_APP_READ_XYZ:
- sensor_i2c_read(MMA7660_ADDR,0,rxData,3);
-
- for (i=0; i < 3; i++)
- {
- if (rxData[i]&0x40) break;
- }
- //if (l_sensorconfig.pollcnt >= 20)
- if (3 == i)
- {
- intBuf[0] = xyz_g_table[rxData[l_sensorconfig.xyz_axis[0][0]]]*l_sensorconfig.xyz_axis[0][1];
- intBuf[1] = xyz_g_table[rxData[l_sensorconfig.xyz_axis[1][0]]]*l_sensorconfig.xyz_axis[1][1];
- intBuf[2] = xyz_g_table[rxData[l_sensorconfig.xyz_axis[2][0]]]*l_sensorconfig.xyz_axis[2][1];
-
- if (copy_to_user((unsigned int*)arg, intBuf, sizeof(intBuf)))
- {
- return -EFAULT;
- }
- }
- break;
- }
-
-
-
- return 0;
-}
-
-
-static void mma_work_func(struct work_struct *work)
-{
- struct mma7660_config *data;
- unsigned char rxData[3];
- //unsigned char tiltval = 0;
- int i = 0;
- int x,y,z;
-
- dbg("enter...\n");
- data = dev_get_drvdata(&this_pdev->dev);
- if (!l_sensorconfig.sensor_enable)
- {
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return;
- }
- mutex_lock(&sense_data_mutex);
- is_sensor_good = 1; // for watchdog
- l_sensorconfig.test_pass = 1; // for testing
-
- /*sensor_i2c_read(MMA7660_ADDR,3,rxData,1);
- tiltval = rxData[0];
- if (tiltval & 0x80) {
- if (1 == l_sensorconfig.shake_enable) {
- printk(KERN_NOTICE "shake!!!\n");
- input_report_key(data->input_dev, KEY_NEXTSONG, 1);
- input_report_key(data->input_dev, KEY_NEXTSONG, 0);
- input_sync(data->input_dev);
-
- }
- } else*/ {
- sensor_i2c_read(MMA7660_ADDR,0,rxData,3);
- /* dbg(KERN_DEBUG "Angle: x=%d, y=%d, z=%d\n",
- xy_degree_table[rxData[0]],
- xy_degree_table[rxData[1]],
- z_degree_table[rxData[2]]);
- dbg(KERN_DEBUG "G value: x=%d, y=%d, z=%d\n",
- xyz_g_table[rxData[0]],
- xyz_g_table[rxData[1]],
- xyz_g_table[rxData[2]]);
- */
- for (i=0; i < 3; i++)
- {
- if (rxData[i]&0x40) break;
- }
- //if (l_sensorconfig.pollcnt >= 20)
- if (3 == i)
- {
- x = xyz_g_table[rxData[l_sensorconfig.xyz_axis[0][0]]]*l_sensorconfig.xyz_axis[0][1];
- y = xyz_g_table[rxData[l_sensorconfig.xyz_axis[1][0]]]*l_sensorconfig.xyz_axis[1][1];
- z = xyz_g_table[rxData[l_sensorconfig.xyz_axis[2][0]]]*l_sensorconfig.xyz_axis[2][1];
- input_report_abs(data->input_dev, ABS_X, x);
- input_report_abs(data->input_dev, ABS_Y, y);
- input_report_abs(data->input_dev, ABS_Z, z);
- input_sync(data->input_dev);
- dbg("gx=%x,gy=%x,gz=%x\n",x,y,z);
- }
- }
- //gsensor_int_ctrl(ENABLE);
- mutex_unlock(&sense_data_mutex);
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-}
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&sense_data_mutex);
- // disable int
- //gsensor_int_ctrl(DISABLE);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "level=%d\n", &l_sensorconfig.sensorlevel))
- {
- } else if (sscanf(buffer, "shakenable=%d\n", &l_sensorconfig.shake_enable))
- {
- /*
- regval[0] = 0;
- sensor_i2c_write(MMA7660_ADDR,7,regval,1); // standard mode
- sensor_i2c_read(MMA7660_ADDR,6,regval,1);
- switch (l_sensorconfig.shake_enable)
- {
- case 0: // disable shake
- regval[0] &= 0x1F;
- sensor_i2c_write(MMA7660_ADDR,6, regval,1);
- dbg("Shake disable!!\n");
- break;
- case 1: // enable shake
- regval[0] |= 0xE0;
- sensor_i2c_write(MMA7660_ADDR,6, regval,1);
- dbg("Shake enable!!\n");
- break;
- };
- sensor_i2c_write(MMA7660_ADDR,7,&oldval,1);
- */
- } /*else if (sscanf(buffer, "rotation=%d\n", &l_sensorconfig.manual_rotation))
- {
- switch (l_sensorconfig.manual_rotation)
- {
- case 90:
- // portrait
- input_report_abs(mma7660data->input_dev, ABS_X, cos30_1000);
- input_report_abs(mma7660data->input_dev, ABS_Y, 0);
- input_report_abs(mma7660data->input_dev, ABS_Z, sin30_1000);
- input_sync(mma7660data->input_dev);
- break;
- case 0:
- // landscape
- input_report_abs(mma7660data->input_dev, ABS_X, 0);
- input_report_abs(mma7660data->input_dev, ABS_Y, cos30_1000);
- input_report_abs(mma7660data->input_dev, ABS_Z, sin30_1000);
- input_sync(mma7660data->input_dev);
- break;
- };
- }*/ else if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "init=%d\n", &inputval))
- {
- mma7660_chip_init();
- dbg("Has reinit sensor !!!\n");
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- amsr = mma_sample2AMSR(sample);
- SET_MMA_SAMPLE(tembuf, amsr);
- klog("sample:%d ,amsr:%d \n", sample, amsr);
- l_sensorconfig.sensor_samp = sample;
- }
- printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- printk(KERN_ALERT "Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- printk(KERN_ERR "The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-
-static int mma7660_init_client(struct platform_device *pdev)
-{
- struct mma7660_config *data;
-// int ret;
-
- data = dev_get_drvdata(&pdev->dev);
- mutex_init(&sense_data_mutex);
- /*Only for polling, not interrupt*/
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
-
-
- return 0;
-
-//err:
-// return ret;
-}
-
-static struct file_operations mmad_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .unlocked_ioctl = mmad_ioctl,
-};
-
-
-static struct miscdevice mmad_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &mmad_fops,
-};
-
-static int mma7660_probe(
- struct platform_device *pdev)
-{
- int err;
-
- this_pdev = pdev;
- l_sensorconfig.queue = create_singlethread_workqueue("sensor-intterupt-handle");
- INIT_DELAYED_WORK(&l_sensorconfig.work, mma_work_func);
-
- l_sensorconfig.input_dev = input_allocate_device();
- if (!l_sensorconfig.input_dev) {
- err = -ENOMEM;
- printk(KERN_ERR
- "mma7660_probe: Failed to allocate input device\n");
- goto exit_input_dev_alloc_failed;
- }
- l_sensorconfig.input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY);
- set_bit(KEY_NEXTSONG, l_sensorconfig.input_dev->keybit);
-
- /* x-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_X, -65532, 65532, 0, 0);
- /* y-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Y, -65532, 65532, 0, 0);
- /* z-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Z, -65532, 65532, 0, 0);
-
- l_sensorconfig.input_dev->name = "g-sensor";
-
- err = input_register_device(l_sensorconfig.input_dev);
-
- if (err) {
- printk(KERN_ERR
- "mma7660_probe: Unable to register input device: %s\n",
- l_sensorconfig.input_dev->name);
- goto exit_input_register_device_failed;
- }
-
- err = misc_register(&mmad_device);
- if (err) {
- printk(KERN_ERR
- "mma7660_probe: mmad_device register failed\n");
- goto exit_misc_device_register_failed;
- }
-
- dev_set_drvdata(&pdev->dev, &l_sensorconfig);
- mma7660_chip_init();
- mma7660_init_client(pdev);
- gsensor_sysfs_init();
-
- // satrt the polling work
- l_sensorconfig.sensor_samp = 10;
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return 0;
-
-exit_misc_device_register_failed:
-exit_input_register_device_failed:
- input_free_device(l_sensorconfig.input_dev);
-//exit_alloc_data_failed:
-exit_input_dev_alloc_failed:
-//exit_check_functionality_failed:
- return err;
-}
-
-static int mma7660_remove(struct platform_device *pdev)
-{
- if (NULL != l_sensorconfig.queue)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- destroy_workqueue(l_sensorconfig.queue);
- l_sensorconfig.queue = NULL;
- }
- gsensor_sysfs_exit();
- misc_deregister(&mmad_device);
- input_unregister_device(l_sensorconfig.input_dev);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
- //free_irq(l_sensorconfig.irq, &l_sensorconfig);
- return 0;
-}
-
-static int mma7660_suspend(struct platform_device *pdev, pm_message_t state)
-{
- //gsensor_int_ctrl(DISABLE);
- cancel_delayed_work_sync(&l_sensorconfig.work);
- del_timer(&l_polltimer);
- dbg("...ok\n");
- //l_resumed = 2;
-
- return 0;
-}
-
-static int mma7660_resume(struct platform_device *pdev)
-{
-
- //mma7660_chip_init();
- //gsensor_int_ctrl(ENABLE);
- //mma_enable_disable(1);
- l_resumed = 1;
- mod_timer(&l_polltimer, jiffies + msecs_to_jiffies(SENSOR_POLL_WAIT_TIME));
- dbg("...ok\n");
-
- return 0;
-}
-
-static void mma7660_platform_release(struct device *device)
-{
- return;
-}
-
-static void mma7660_shutdown(struct platform_device *pdev)
-{
-
- flush_delayed_work_sync(&l_sensorconfig.work);
- cancel_delayed_work_sync(&l_sensorconfig.work);
-
-}
-
-static struct platform_device mma7660_device = {
- .name = "mma7660",
- .id = 0,
- .dev = {
- .release = mma7660_platform_release,
- },
-};
-
-static struct platform_driver mma7660_driver = {
- .probe = mma7660_probe,
- .remove = mma7660_remove,
- .suspend = mma7660_suspend,
- .resume = mma7660_resume,
- .shutdown = mma7660_shutdown,
- .driver = {
- .name = "mma7660",
- },
-};
-
-/*
- * Brief:
- * Get the configure of sensor from u-boot.
- * Input:
- * no use.
- * Output:
- * no use.
- * Return:
- * 0--success, -1--error.
- * History:
- * Created by HangYan on 2010-4-19
- * Author:
- * Hang Yan in ShenZhen.
- */
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void* param)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.mma7660gsensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2]));
- if (n != 10) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-
-// Add one timer to reinit sensor every 5s
-static void sensor_polltimer_timeout(unsigned long timeout)
-{
- schedule_work(&poll_work);
-}
-
-static void poll_work_func(struct work_struct *work)
-{
- char rxData[1];
-
- //mutex_lock(&sense_data_mutex);
- if (l_sensorconfig.pollcnt != 20)
- {
- l_sensorconfig.pollcnt++;
- }
- dbg("read to work!\n");
- //spin_lock(&l_sensorconfig.spinlock);
- mutex_lock(&sense_data_mutex);
- if (1 == l_resumed)
- {
- mma7660_chip_init();
- //gsensor_int_ctrl(ENABLE);
- //mma_enable_disable(1);
- dbg("reinit for resume...\n");
- l_resumed = 0;
- //spin_unlock(&l_sensorconfig.spinlock);
- mutex_unlock(&sense_data_mutex);
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-
- return;
- }
- //spin_unlock(&l_sensorconfig.spinlock);
- mutex_unlock(&sense_data_mutex);
- if (!is_sensor_good)
- {
- //mma7660_chip_init();
- // if ic is blocked then wake g-sensor
- sensor_i2c_read(MMA7660_ADDR,3,rxData,1);
- } else {
- is_sensor_good = 0;
- }
-
- //mutex_unlock(&sense_data_mutex);
- mod_timer(&l_polltimer, jiffies + msecs_to_jiffies(SENSOR_POLL_WAIT_TIME));
-
-}
-
-static int mma7660_open(struct inode *inode, struct file *file)
-{
- return 0;
-}
-
-static int mma7660_release(struct inode *inode, struct file *file)
-{
- return 0;
-}
-
-
-static struct file_operations mma7660_fops = {
- .owner = THIS_MODULE,
- .open = mma7660_open,
- .release = mma7660_release,
-};
-
-static int is_mma7660(void)
-{
- char txData[2];
- int i = 0;
-
- txData[1] = 0;
- for (i = 0; i < 3; i++)
- {
- if(sensor_i2c_write(MMA7660_ADDR,7,txData,1) == 0)
- {
- return 0;
- }
- }
- return -1;
-}
-
-static int __init mma7660_init(void)
-{
- int ret = 0;
-
- if (is_mma7660())
- {
- printk(KERN_ERR "Can't find mma7660!!\n");
- return -1;
- }
- ret = get_axisset(NULL); // get gsensor config from u-boot
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
- /*if ((ret != 0) || !l_sensorconfig.op)
- return -EINVAL;*/
-
-
- printk(KERN_INFO "mma7660fc g-sensor driver init\n");
-
- spin_lock_init(&l_sensorconfig.spinlock);
- INIT_WORK(&poll_work, poll_work_func);
- // Create device node
- if (register_chrdev (GSENSOR_MAJOR, GSENSOR_NAME, &mma7660_fops)) {
- printk (KERN_ERR "unable to get major %d\n", GSENSOR_MAJOR);
- return -EIO;
- }
-
- l_dev_class = class_create(THIS_MODULE, GSENSOR_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- l_clsdevice = device_create(l_dev_class, NULL, MKDEV(GSENSOR_MAJOR, 0), NULL, GSENSOR_NAME);
- if (IS_ERR(l_clsdevice)){
- ret = PTR_ERR(l_clsdevice);
- printk(KERN_ERR "Failed to create device %s !!!",GSENSOR_NAME);
- return ret;
- }
-
- if((ret = platform_device_register(&mma7660_device)))
- {
- printk(KERN_ERR "%s Can't register mma7660 platform devcie!!!\n", __FUNCTION__);
- return ret;
- }
- if ((ret = platform_driver_register(&mma7660_driver)) != 0)
- {
- printk(KERN_ERR "%s Can't register mma7660 platform driver!!!\n", __FUNCTION__);
- return ret;
- }
-
- setup_timer(&l_polltimer, sensor_polltimer_timeout, 0);
- mod_timer(&l_polltimer, jiffies + msecs_to_jiffies(SENSOR_POLL_WAIT_TIME));
- is_sensor_good = 1;
-
- return 0;
-}
-
-static void __exit mma7660_exit(void)
-{
- del_timer(&l_polltimer);
- platform_driver_unregister(&mma7660_driver);
- platform_device_unregister(&mma7660_device);
- device_destroy(l_dev_class, MKDEV(GSENSOR_MAJOR, 0));
- unregister_chrdev(GSENSOR_MAJOR, GSENSOR_NAME);
- class_destroy(l_dev_class);
-
-}
-
-module_init(mma7660_init);
-module_exit(mma7660_exit);
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.h b/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.h
deleted file mode 100755
index db6c06c0..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma7660_gsensor/mma7660.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Definitions for akm8976 compass chip.
- */
-#ifndef AKM8976_H
-#define AKM8976_H
-
-#include <linux/ioctl.h>
-
-/* Compass device dependent definition */
-#define AKECS_MODE_MEASURE 0x00 /* Starts measurement. Please use AKECS_MODE_MEASURE_SNG */
- /* or AKECS_MODE_MEASURE_SEQ instead of this. */
-#define AKECS_MODE_PFFD 0x01 /* Start pedometer and free fall detect. */
-#define AKECS_MODE_E2P_READ 0x02 /* E2P access mode (read). */
-#define AKECS_MODE_POWERDOWN 0x03 /* Power down mode */
-
-#define AKECS_MODE_MEASURE_SNG 0x10 /* Starts single measurement */
-#define AKECS_MODE_MEASURE_SEQ 0x11 /* Starts sequential measurement */
-
-/* Default register settings */
-#define CSPEC_AINT 0x01 /* Amplification for acceleration sensor */
-#define CSPEC_SNG_NUM 0x01 /* Single measurement mode */
-#define CSPEC_SEQ_NUM 0x02 /* Sequential measurement mode */
-#define CSPEC_SFRQ_32 0x00 /* Measurement frequency: 32Hz */
-#define CSPEC_SFRQ_64 0x01 /* Measurement frequency: 64Hz */
-#define CSPEC_MCS 0x07 /* Clock frequency */
-#define CSPEC_MKS 0x01 /* Clock type: CMOS level */
-#define CSPEC_INTEN 0x01 /* Interruption pin enable: Enable */
-
-#define RBUFF_SIZE 31 /* Rx buffer size */
-#define MAX_CALI_SIZE 0x1000U /* calibration buffer size */
-
-/* AK8976A register address */
-#define AKECS_REG_ST 0xC0
-#define AKECS_REG_TMPS 0xC1
-#define AKECS_REG_MS1 0xE0
-#define AKECS_REG_MS2 0xE1
-#define AKECS_REG_MS3 0xE2
-
-#define AKMIO 0xA1
-
-/* IOCTLs for AKM library */
-#define ECS_IOCTL_RESET _IO(AKMIO, 0x04)
-#define ECS_IOCTL_INT_STATUS _IO(AKMIO, 0x05)
-#define ECS_IOCTL_FFD_STATUS _IO(AKMIO, 0x06)
-#define ECS_IOCTL_SET_MODE _IOW(AKMIO, 0x07, short)
-#define ECS_IOCTL_GETDATA _IOR(AKMIO, 0x08, char[RBUFF_SIZE+1])
-#define ECS_IOCTL_GET_NUMFRQ _IOR(AKMIO, 0x09, char[2])
-#define ECS_IOCTL_SET_PERST _IO(AKMIO, 0x0A)
-#define ECS_IOCTL_SET_G0RST _IO(AKMIO, 0x0B)
-#define ECS_IOCTL_SET_YPR _IOW(AKMIO, 0x0C, short[12])
-#define ECS_IOCTL_GET_OPEN_STATUS _IOR(AKMIO, 0x0D, int)
-#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(AKMIO, 0x0E, int)
-#define ECS_IOCTL_GET_CALI_DATA _IOR(AKMIO, 0x0F, char[MAX_CALI_SIZE])
-#define ECS_IOCTL_GET_DELAY _IOR(AKMIO, 0x30, short)
-
-/* 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_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_GET_DELAY ECS_IOCTL_GET_DELAY
-#define ECS_IOCTL_APP_SET_MVFLAG _IOW(AKMIO, 0x19, short) /* Set raw magnetic vector flag */
-#define ECS_IOCTL_APP_GET_MVFLAG _IOR(AKMIO, 0x1A, short) /* Get raw magnetic vector flag */
-
-/* IOCTLs for pedometer */
-#define ECS_IOCTL_SET_STEP_CNT _IOW(AKMIO, 0x20, short)
-#define SENSOR_DATA_SIZE 3
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define ECS_IOCTL_APP_SET_AFLAG _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x02, short)
-#define ECS_IOCTL_APP_SET_DELAY _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x03, short)
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
-#define ECS_IOCTL_APP_READ_XYZ _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x05, int[SENSOR_DATA_SIZE])
-
-#define MMA7660_DRVID 0
-
-
-
-/* Default GPIO setting */
-#define ECS_RST 146 /*MISC4, bit2 */
-#define ECS_CLK_ON 155 /*MISC5, bit3 */
-#define ECS_INTR 161 /*INT2, bit1 */
-
-/* MISC */
-#define MMA7660_ADDR 0x4C
-#define SENSOR_UI_MODE 0
-#define SENSOR_GRAVITYGAME_MODE 1
-#define UI_SAMPLE_RATE 0xFC
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define sin30_1000 500
-#define cos30_1000 866
-#define DISABLE 0
-#define ENABLE 1
-
-struct mma7660_platform_data {
- int reset;
- int clk_on;
- int intr;
-};
-
-extern char *get_mma_cal_ram(void);
-
-#endif
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/Makefile
deleted file mode 100755
index 4dcceb42..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_mma8452q
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := mma8x5x.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.c b/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.c
deleted file mode 100755
index 443d3b18..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.c
+++ /dev/null
@@ -1,982 +0,0 @@
-#include <linux/module.h>
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/irq.h>
-#include <linux/miscdevice.h>
-#include <linux/gpio.h>
-#include <asm/uaccess.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/freezer.h>
-#include <linux/platform_device.h>
-#include <linux/proc_fs.h>
-#include <mach/hardware.h>
-#include "mma8x5x.h" //"mma8452q.h"
-#include "../sensor.h"
-
-//#define DEBUG 1
-
-#undef dbg
-
-//#if 0
- #define dbg(fmt, args...) if (l_sensorconfig.isdbg) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
- //#define dbg(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
- //#define dbg(format, arg...) printk(KERN_ALERT format, ## arg)
-
-
-//#else
-// #define dbg(format, arg...)
-//#endif
-
-/////////////////////Macro constant
-#define SENSOR_POLL_WAIT_TIME 1837
-#define MAX_FAILURE_COUNT 10
-#define MMA8452_ADDR 0x1C //slave 0x1D??high
-#define LAND_PORT_MASK 0x1C
-#define LAND_LEFT 0x1
-#define LAND_RIGHT 0x2
-#define PORT_INVERT 0x5
-#define PORT_NORMAL 0x6
-
-#define LANDSCAPE_LOCATION 0
-#define PORTRAIT_LOCATION 1
-
-#define SENSOR_UI_MODE 0
-#define SENSOR_GRAVITYGAME_MODE 1
-
-#define UI_SAMPLE_RATE 0xFC
-
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define GSENSOR_MAJOR 161
-#define GSENSOR_NAME "mma8452q"
-#define GSENSOR_DRIVER_NAME "mma8452q_drv"
-
-
-#define sin30_1000 500
-#define cos30_1000 866
-
-#define DISABLE 0
-#define ENABLE 1
-
-////////////////////////the rate of g-sensor/////////////////////////////////////////////
-#define SENSOR_DELAY_FASTEST 0
-#define SENSOR_DELAY_GAME 20
-#define SENSOR_DELAY_UI 60
-#define SENSOR_DELAY_NORMAL 200
-
-#define FASTEST_MMA_AMSR 0 // 120 samples/sec
-#define GAME_MMA_AMSR 1 // 1, (64, samples/sec)
-#define UI_MMA_AMSR 3 // 2, 3,4, (16, 8,32 samples/sec)
-#define NORMAL_MMA_AMSR 5 // 5, 6, 7 (4, 2, 1 samples/sec)
-
-#define MMA8451_ID 0x1A
-#define MMA8452_ID 0x2A
-#define MMA8453_ID 0x3A
-#define MMA8652_ID 0x4A
-#define MMA8653_ID 0x5A
-#define MODE_CHANGE_DELAY_MS 100
-/* register enum for mma8x5x registers */
-enum {
- MMA8X5X_STATUS = 0x00,
- MMA8X5X_OUT_X_MSB,
- MMA8X5X_OUT_X_LSB,
- MMA8X5X_OUT_Y_MSB,
- MMA8X5X_OUT_Y_LSB,
- MMA8X5X_OUT_Z_MSB,
- MMA8X5X_OUT_Z_LSB,
-
- MMA8X5X_F_SETUP = 0x09,
- MMA8X5X_TRIG_CFG,
- MMA8X5X_SYSMOD,
- MMA8X5X_INT_SOURCE,
- MMA8X5X_WHO_AM_I,
- MMA8X5X_XYZ_DATA_CFG,
- MMA8X5X_HP_FILTER_CUTOFF,
-
- MMA8X5X_PL_STATUS,
- MMA8X5X_PL_CFG,
- MMA8X5X_PL_COUNT,
- MMA8X5X_PL_BF_ZCOMP,
- MMA8X5X_P_L_THS_REG,
-
- MMA8X5X_FF_MT_CFG,
- MMA8X5X_FF_MT_SRC,
- MMA8X5X_FF_MT_THS,
- MMA8X5X_FF_MT_COUNT,
-
- MMA8X5X_TRANSIENT_CFG = 0x1D,
- MMA8X5X_TRANSIENT_SRC,
- MMA8X5X_TRANSIENT_THS,
- MMA8X5X_TRANSIENT_COUNT,
-
- MMA8X5X_PULSE_CFG,
- MMA8X5X_PULSE_SRC,
- MMA8X5X_PULSE_THSX,
- MMA8X5X_PULSE_THSY,
- MMA8X5X_PULSE_THSZ,
- MMA8X5X_PULSE_TMLT,
- MMA8X5X_PULSE_LTCY,
- MMA8X5X_PULSE_WIND,
-
- MMA8X5X_ASLP_COUNT,
- MMA8X5X_CTRL_REG1,
- MMA8X5X_CTRL_REG2,
- MMA8X5X_CTRL_REG3,
- MMA8X5X_CTRL_REG4,
- MMA8X5X_CTRL_REG5,
-
- MMA8X5X_OFF_X,
- MMA8X5X_OFF_Y,
- MMA8X5X_OFF_Z,
-
- MMA8X5X_REG_END,
-};
-
-enum {
- MODE_2G = 0,
- MODE_4G,
- MODE_8G,
-};
-
-static int mma8x5x_chip_id[] ={
- MMA8451_ID,
- MMA8452_ID,
- MMA8453_ID,
- MMA8652_ID,
- MMA8653_ID,
-};
-
-static struct i2c_client *this_client = NULL;
-/////////////////////////////////////////////////////////////////////////
-
-static struct platform_device *this_pdev;
-
-static struct class* l_dev_class = NULL;
-static struct device *l_clsdevice = NULL;
-
-
-
-struct mma8452q_config
-{
- int op;
- int int_gpio; //0-3
- int xyz_axis[3][2]; // (axis,direction)
- int rxyz_axis[3][2];
- int irq;
- struct proc_dir_entry* sensor_proc;
- int sensorlevel;
- int shake_enable; // 1--enable shake, 0--disable shake
- int manual_rotation; // 0--landance, 90--vertical
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg; // 0-- no debug log, 1--show debug log
- int sensor_samp; // 1,2,4,8,16,32,64,120
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- spinlock_t spinlock;
- int pollcnt; // the counts of polling
- int offset[3];
-};
-
-static struct mma8452q_config l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .irq = 6,
- .int_gpio = 3,
- .sensor_proc = NULL,
- .sensorlevel = SENSOR_GRAVITYGAME_MODE,
- .shake_enable = 0, // default enable shake
- .isdbg = 0,
- .sensor_samp = 10, // 4sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .pollcnt = 0, // Don't report the x,y,z when the driver is loaded until 2~3 seconds
- .offset = {0,0,0},
-};
-
-
-
-struct work_struct poll_work;
-static struct mutex sense_data_mutex;
-static int revision = -1;
-static int l_resumed = 0; // 1: suspend --> resume;2: suspend but not resumed; other values have no meaning
-
-//////////////////Macro function//////////////////////////////////////////////////////
-
-#define SET_MMA_SAMPLE(buf,samp) { \
- buf[0] = 0; \
- sensor_i2c_write(/*MMA8452_ADDR,*/7,buf,1); \
- buf[0] = samp; \
- sensor_i2c_write(/*MMA8452_ADDR,*/8,buf,1); \
- buf[0] = 0x01; \
- sensor_i2c_write(/*MMA8452_ADDR,*/7,buf,1); \
-}
-
-////////////////////////Function define/////////////////////////////////////////////////////////
-
-static unsigned int mma_sample2AMSR(unsigned int samp);
-
-////////////////////////Function implement/////////////////////////////////////////////////
-// rate: 1,2,4,8,16,32,64,120
-static unsigned int sample_rate_2_memsec(unsigned int rate)
-{
- return (1000/rate);
-}
-
-
-
-static ssize_t gsensor_vendor_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- ssize_t ret = 0;
-
- sprintf(buf, "MMA8452_%#x\n", revision);
- ret = strlen(buf) + 1;
-
- return ret;
-}
-
-static DEVICE_ATTR(vendor, 0444, gsensor_vendor_show, NULL);
-
-static struct kobject *android_gsensor_kobj;
-static int gsensor_sysfs_init(void)
-{
- int ret ;
-
- android_gsensor_kobj = kobject_create_and_add("android_gsensor", NULL);
- if (android_gsensor_kobj == NULL) {
- printk(KERN_ERR
- "mma8452q gsensor_sysfs_init:"\
- "subsystem_register failed\n");
- ret = -ENOMEM;
- goto err;
- }
-
- ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr);
- if (ret) {
- printk(KERN_ERR
- "mma8452q gsensor_sysfs_init:"\
- "sysfs_create_group failed\n");
- goto err4;
- }
-
- return 0 ;
-err4:
- kobject_del(android_gsensor_kobj);
-err:
- return ret ;
-}
-
-static int gsensor_sysfs_exit(void)
-{
- sysfs_remove_file(android_gsensor_kobj, &dev_attr_vendor.attr);
- kobject_del(android_gsensor_kobj);
- return 0;
-}
-
-//extern int wmt_i2c_xfer_continue_if_4(struct i2c_msg *msg, unsigned int num, int bus_id);
-extern int i2c_api_do_send(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-extern int i2c_api_do_recv(int bus_id, char chip_addr, char sub_addr, char *buf, unsigned int size);
-
-int sensor_i2c_write(/*unsigned int addr,*/unsigned int index,char *pdata,int len)
-{
-
- char wrData[12] = {0};
- struct i2c_client *client = this_client;
-
- struct i2c_msg msgs =
- {.addr = client->addr, .flags = 0, .len = len+1, .buf = wrData,};
-
-
- if (!client || (!pdata))
- {
- printk("%s NULL client!\n", __FUNCTION__);
- return -EIO;
- }
-
- wrData[0] = index;
- strncpy(&wrData[1], pdata, len);
-
- if (i2c_transfer(client->adapter, &msgs, 1) < 0) {
- printk( "%s: transfer failed.", __func__);
- return -EIO;
- }
-
- return 0;
-} /* End of sensor_i2c_write */
-
-int sensor_i2c_read(/*unsigned int addr,*/unsigned int index,char *pdata,int len)
-{
- char rdData[2] = {0};
- struct i2c_client *client = this_client;
-
- struct i2c_msg msgs[2] =
- {
- {.addr = client->addr, .flags = 0|I2C_M_NOSTART, .len = 1, .buf = rdData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = len, .buf = pdata,},
- };
- rdData[0] = index;
- if (!client || (!pdata))
- {
- printk("%s NULL client!\n", __FUNCTION__);
- return -EIO;
- }
- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
- printk( "%s: transfer failed.", __func__);
- return -EIO;
- }
-
- return 0;//rdData[0]; i2c read ok!!
-
-} /* End of sensor_i2c_read */
-
-//****************add for mma8452q******************************
-
-static int mma8452q_chip_init(void)
-{
- char txData[1] = {0};
-
- int result;
-
- txData[0] = 0x1; //active mode
- result = sensor_i2c_write(/*MMA8452_ADDR,*/MMA8X5X_CTRL_REG1,txData,1);
- if (result < 0)
- goto out;
-
- txData[0] = MODE_2G;
- result = sensor_i2c_write(/*MMA8452_ADDR,*/MMA8X5X_XYZ_DATA_CFG,txData,1);
- if (result < 0)
- goto out;
-
- txData[0] = 0x1; //wake mode
- result = sensor_i2c_write(/*MMA8452_ADDR,*/MMA8X5X_SYSMOD,txData,1);
- if (result < 0)
- goto out;
-
- msleep(MODE_CHANGE_DELAY_MS);
- return 0;
-out:
-
- return result;
-
-}
-
-static unsigned int mma_sample2AMSR(unsigned int samp)
-{
- int i = 0;
- unsigned int amsr;
-
- if (samp >= 120)
- {
- return 0;
- }
- while (samp)
- {
- samp = samp >> 1;
- i++;
- }
- amsr = 8 - i;
- return amsr;
-}
-
-static int mma_enable_disable(int enable)
-{
- char buf[1];
-
- // disable all interrupt of g-sensor
- memset(buf, 0, sizeof(buf));
- if ((enable < 0) || (enable > 1))
- {
- return -1;
- }
- buf[0] = 0;
- sensor_i2c_write(/*MMA8452_ADDR,*/7,buf,1);
- if (enable != 0)
- {
- buf[0] = (1 == l_sensorconfig.shake_enable) ? 0xF0:0x10;
- } else {
- buf[0] = 0;
- }
- sensor_i2c_write(/*MMA8452_ADDR,*/6,buf,1);
- buf[0] = 0xf9;
- sensor_i2c_write(/*MMA8452_ADDR,*/7,buf,1);
- return 0;
-}
-
-// To contol the g-sensor for UI
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the g-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the g-sensor node...\n");
- return 0;
-}
-
-static long
-mmad_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- char rwbuf[5];
- short delay, enable; //amsr = -1;
- unsigned int uval = 0;
-
- dbg("g-sensor ioctr...\n");
- memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case ECS_IOCTL_APP_SET_DELAY:
- // set the rate of g-sensor
- if (copy_from_user(&delay, argp, sizeof(short)))
- {
- printk(KERN_ALERT "Can't get set delay!!!\n");
- return -EFAULT;
- }
- klog("Get delay=%d\n", delay);
- //klog("before change sensor sample:%d...\n", l_sensorconfig.sensor_samp);
- if ((delay >=0) && (delay < 20))
- {
- delay = 20;
- } else if (delay > 200)
- {
- delay = 200;
- }
- l_sensorconfig.sensor_samp = 1000/delay;
-
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- klog("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- l_sensorconfig.sensor_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = MMA8452Q_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("mma8452q_driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
-
- uval = (16<<8) | 4; // 16bit:4g 0xxx xx //mma8452Q
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- default:
- break;
- }
-
-
-
- return 0;
-}
-
-
-static void mma_work_func(struct work_struct *work)
-{
- struct mma8452q_config *data;
- /*unsigned*/ short rxData[3] = {0};
- //unsigned char tiltval = 0;
- int i = 0;
- int x,y,z;
- char tmp[6] = {0};
-
- data = dev_get_drvdata(&this_pdev->dev);
- if (!l_sensorconfig.sensor_enable)
- {
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return;
- }
- mutex_lock(&sense_data_mutex);
-
-
- i = sensor_i2c_read(/*MMA8452_ADDR,*/MMA8X5X_OUT_X_MSB,tmp, sizeof(tmp));
-#if 0
- for (i=0; i<6; i++)
- sensor_i2c_read(/*MMA8452_ADDR,*/MMA8X5X_OUT_X_MSB+i,&tmp[i], 1);
- i = 0;
-#endif
-
- if (0 == i)
- {
- rxData[0] = ((tmp[0] << 8 )&0xff00 ) | (tmp[1] );
- rxData[1] = ((tmp[2] << 8) &0xff00 ) | (tmp[3] );
- rxData[2] = ((tmp[4] << 8) &0xff00 ) | (tmp[5] );
- x = rxData[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1];
- y = rxData[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1];
- z = rxData[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1];
- #if 0
- x = (x*9800) >> 14;
- y = (y*9800) >> 14;
- z = (z*9800) >> 14;
- #endif
- //printk("x,y,z (%d, %d, %d) \n", rxData[0], rxData[1], rxData[2]);
- //printk("x,y,z (%d, %d, %d) \n", x, y, z);
- //printk("x 0x%x\n", tmp[0]);
- input_report_abs(data->input_dev, ABS_X, x);
- input_report_abs(data->input_dev, ABS_Y, y);
- input_report_abs(data->input_dev, ABS_Z, z);
- input_sync(data->input_dev);
- }
-
-
- mutex_unlock(&sense_data_mutex);
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
-}
-
-static int sensor_writeproc( struct file *file,
- const char *buffer,
- unsigned long count,
- void *data )
-{
-
- int inputval = -1;
- int enable, sample = -1;
- char tembuf[8];
- unsigned int amsr = 0;
- int test = 0;
-
- mutex_lock(&sense_data_mutex);
- // disable int
- //gsensor_int_ctrl(DISABLE);
- memset(tembuf, 0, sizeof(tembuf));
- // get sensor level and set sensor level
- if (sscanf(buffer, "level=%d\n", &l_sensorconfig.sensorlevel))
- {
- } else if (sscanf(buffer, "shakenable=%d\n", &l_sensorconfig.shake_enable))
- {
-
- }
- else if (sscanf(buffer, "isdbg=%d\n", &l_sensorconfig.isdbg))
- {
- // only set the dbg flag
- } else if (sscanf(buffer, "init=%d\n", &inputval))
- {
- mma8452q_chip_init();
- dbg("Has reinit sensor !!!\n");
- } else if (sscanf(buffer, "samp=%d\n", &sample))
- {
- if (sample > 0)
- {
- if (sample != l_sensorconfig.sensor_samp)
- {
- amsr = mma_sample2AMSR(sample);
- SET_MMA_SAMPLE(tembuf, amsr);
- klog("sample:%d ,amsr:%d \n", sample, amsr);
- l_sensorconfig.sensor_samp = sample;
- }
- printk(KERN_ALERT "sensor samp=%d(amsr:%d) has been set.\n", sample, amsr);
- } else {
- printk(KERN_ALERT "Wrong sample argumnet of sensor.\n");
- }
- } else if (sscanf(buffer, "enable=%d\n", &enable))
- {
- if ((enable < 0) || (enable > 1))
- {
- printk(KERN_ERR "The argument to enable/disable g-sensor should be 0 or 1 !!!\n");
- } else if (enable != l_sensorconfig.sensor_enable)
- {
- mma_enable_disable(enable);
- l_sensorconfig.sensor_enable = enable;
- }
- } else if (sscanf(buffer, "sensor_test=%d\n", &test))
- { // for test begin
- l_sensorconfig.test_pass = 0;
- } else if (sscanf(buffer, "sensor_testend=%d\n", &test))
- { // Don nothing only to be compatible the before testing program
- }
- mutex_unlock(&sense_data_mutex);
- return count;
-}
-
-static int sensor_readproc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
-{
- int len = 0;
-
- len = sprintf(page,
- "test_pass=%d\nisdbg=%d\nrate=%d\nenable=%d\n",
- l_sensorconfig.test_pass,
- l_sensorconfig.isdbg,
- l_sensorconfig.sensor_samp,
- l_sensorconfig.sensor_enable
- );
- return len;
-}
-
-
-
-static int mma8452q_init_client(struct platform_device *pdev)
-{
- struct mma8452q_config *data;
-// int ret;
-
- data = dev_get_drvdata(&pdev->dev);
- mutex_init(&sense_data_mutex);
- /*Only for polling, not interrupt*/
- l_sensorconfig.sensor_proc = create_proc_entry(GSENSOR_PROC_NAME, 0666, NULL/*&proc_root*/);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- l_sensorconfig.sensor_proc->write_proc = sensor_writeproc;
- l_sensorconfig.sensor_proc->read_proc = sensor_readproc;
- }
-
-
- return 0;
-
-//err:
-// return ret;
-}
-
-static struct file_operations mmad_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .unlocked_ioctl = mmad_ioctl,
-};
-
-
-static struct miscdevice mmad_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "sensor_ctrl",
- .fops = &mmad_fops,
-};
-
-static int mma8452q_probe(struct platform_device *pdev)
-{
- int err;
-
- this_pdev = pdev;
- l_sensorconfig.queue = create_singlethread_workqueue("sensor-intterupt-handle");
- INIT_DELAYED_WORK(&l_sensorconfig.work, mma_work_func);
-
- l_sensorconfig.input_dev = input_allocate_device();
- if (!l_sensorconfig.input_dev) {
- err = -ENOMEM;
- printk(KERN_ERR
- "mma8452q_probe: Failed to allocate input device\n");
- goto exit_input_dev_alloc_failed;
- }
- l_sensorconfig.input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY);
- set_bit(KEY_NEXTSONG, l_sensorconfig.input_dev->keybit);
-
- /* x-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_X, -65532, 65532, 0, 0);
- /* y-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Y, -65532, 65532, 0, 0);
- /* z-axis acceleration */
- input_set_abs_params(l_sensorconfig.input_dev, ABS_Z, -65532, 65532, 0, 0);
-
- l_sensorconfig.input_dev->name = "g-sensor";
-
- err = input_register_device(l_sensorconfig.input_dev);
-
- if (err) {
- printk(KERN_ERR
- "mma8452q_probe: Unable to register input device: %s\n",
- l_sensorconfig.input_dev->name);
- goto exit_input_register_device_failed;
- }
-
- err = misc_register(&mmad_device);
- if (err) {
- printk(KERN_ERR
- "mma8452q_probe: mmad_device register failed\n");
- goto exit_misc_device_register_failed;
- }
-
- dev_set_drvdata(&pdev->dev, &l_sensorconfig);
- mma8452q_chip_init();
- mma8452q_init_client(pdev);
- gsensor_sysfs_init();
-
- // satrt the polling work
- l_sensorconfig.sensor_samp = 10;
- queue_delayed_work(l_sensorconfig.queue, &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- return 0;
-
-exit_misc_device_register_failed:
-exit_input_register_device_failed:
- input_free_device(l_sensorconfig.input_dev);
-
-exit_input_dev_alloc_failed:
-
- return err;
-}
-
-static int mma8452q_remove(struct platform_device *pdev)
-{
- if (NULL != l_sensorconfig.queue)
- {
- cancel_delayed_work_sync(&l_sensorconfig.work);
- flush_workqueue(l_sensorconfig.queue);
- destroy_workqueue(l_sensorconfig.queue);
- l_sensorconfig.queue = NULL;
- }
- gsensor_sysfs_exit();
- misc_deregister(&mmad_device);
- input_unregister_device(l_sensorconfig.input_dev);
- if (l_sensorconfig.sensor_proc != NULL)
- {
- remove_proc_entry(GSENSOR_PROC_NAME, NULL);
- l_sensorconfig.sensor_proc = NULL;
- }
-
- return 0;
-}
-
-static int mma8452q_suspend(struct platform_device *pdev, pm_message_t state)
-{
- //gsensor_int_ctrl(DISABLE);
- cancel_delayed_work_sync(&l_sensorconfig.work);
-
- dbg("...ok\n");
- //l_resumed = 2;
-
- return 0;
-}
-
-static int mma8452q_resume(struct platform_device *pdev)
-{
-
- l_resumed = 1;
-
- mma8452q_chip_init();
- queue_delayed_work(l_sensorconfig.queue, \
- &l_sensorconfig.work, msecs_to_jiffies(sample_rate_2_memsec(l_sensorconfig.sensor_samp)));
- dbg("...ok\n");
-
- return 0;
-}
-
-static void mma8452q_platform_release(struct device *device)
-{
- return;
-}
-
-static void mma8452q_shutdown(struct platform_device *pdev)
-{
- flush_delayed_work_sync(&l_sensorconfig.work);
- cancel_delayed_work_sync(&l_sensorconfig.work);
-
-}
-
-static struct platform_device mma8452q_device = {
- .name = "mma8452q",
- .id = 0,
- .dev = {
- .release = mma8452q_platform_release,
- },
-};
-
-static struct platform_driver mma8452q_driver = {
- .probe = mma8452q_probe,
- .remove = mma8452q_remove,
- .suspend = mma8452q_suspend,
- .resume = mma8452q_resume,
- .shutdown = mma8452q_shutdown,
- .driver = {
- .name = "mma8452q",
- },
-};
-
-/*
- * Brief:
- * Get the configure of sensor from u-boot.
- * Input:
- * no use.
- * Output:
- * no use.
- * Return:
- * 0--success, -1--error.
- * History:
- * Created by HangYan on 2010-4-19
- * Author:
- * Hang Yan in ShenZhen.
- */
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void* param)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.mma8452qgsensor", varbuf, &varlen)) {
- printk(KERN_DEBUG "Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2]));
- if (n != 10) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
-
- printk("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static int is_mma8452q(void)
-{
- char rxData[2] = {0};
- int ret = 0;
- int i = 0;
- //char rdData[10] = {0};
- //char wbuf[6] = {0};
- //char rbuf[0x33] = {0};
-
- ret = sensor_i2c_read(MMA8X5X_WHO_AM_I,rxData,1);
- //printk("<<<<%s ret %d, val 0x%x\n", __FUNCTION__, ret, rxData[0]);
- for(i = 0 ; i < sizeof(mma8x5x_chip_id)/sizeof(mma8x5x_chip_id[0]);i++)
- if(rxData[0] == mma8x5x_chip_id[i])
- return 0;
-#if 0
- struct i2c_client* client = gsensor_get_i2c_client();
- if (!client){
- printk("client NULL!\n");
- return -1;
- }
-
- for (i=0; i<6; i++)
- wbuf[i] = i+2;
- //sensor_i2c_write(0x25, wbuf, 6);
- //rbuf[0] = 0x11;
- //sensor_i2c_read(0xb, rbuf, 0x1);
- mma8452q_chip_init();
- for (i=0; i<0x12; i++) {
- sensor_i2c_read(0xb+i, rbuf, 0x1);
- printk("<<<<%s reg 0x%x val 0x%x\n", __FUNCTION__, 0xb+i, rbuf[0]);
- }
-#endif
- return -1;
-}
-
-static int __init mma8452q_init(void)
-{
- int ret = 0;
-
- ret = get_axisset(NULL);
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
-
- if (!(this_client = sensor_i2c_register_device(0, GSENSOR_I2C_ADDR, GSENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
-
- if (is_mma8452q())
- {
- printk(KERN_ERR "Can't find mma8452q!!\n");
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
-
-
-
- printk(KERN_INFO "mma8452qfc g-sensor driver init\n");
-
- spin_lock_init(&l_sensorconfig.spinlock);
-
- // Create device node
-
- l_dev_class = class_create(THIS_MODULE, GSENSOR_NAME);
- //for S40 module to judge whether insmod is ok
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- l_clsdevice = device_create(l_dev_class, NULL, MKDEV(GSENSOR_MAJOR, 0), NULL, GSENSOR_NAME);
- if (IS_ERR(l_clsdevice)){
- ret = PTR_ERR(l_clsdevice);
- printk(KERN_ERR "Failed to create device %s !!!",GSENSOR_NAME);
- return ret;
- }
-
- if((ret = platform_device_register(&mma8452q_device)))
- {
- printk(KERN_ERR "%s Can't register mma8452q platform devcie!!!\n", __FUNCTION__);
- return ret;
- }
- if ((ret = platform_driver_register(&mma8452q_driver)) != 0)
- {
- printk(KERN_ERR "%s Can't register mma8452q platform driver!!!\n", __FUNCTION__);
- return ret;
- }
-
- return 0;
-}
-
-static void __exit mma8452q_exit(void)
-{
- platform_driver_unregister(&mma8452q_driver);
- platform_device_unregister(&mma8452q_device);
- device_destroy(l_dev_class, MKDEV(GSENSOR_MAJOR, 0));
-
- class_destroy(l_dev_class);
- sensor_i2c_unregister_device(this_client);
-
-}
-
-module_init(mma8452q_init);
-module_exit(mma8452q_exit);
-MODULE_LICENSE("GPL");
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.h b/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.h
deleted file mode 100755
index d8d386b2..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mma8452q_gsensor/mma8x5x.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Definitions for akm8976 compass chip.
- */
-#ifndef AKM8976_H
-#define AKM8976_H
-
-#include <linux/ioctl.h>
-
-#define GSENSOR_I2C_NAME "mma8452q"
-#define GSENSOR_I2C_ADDR 0x1c
-/* Compass device dependent definition */
-#define AKECS_MODE_MEASURE 0x00 /* Starts measurement. Please use AKECS_MODE_MEASURE_SNG */
- /* or AKECS_MODE_MEASURE_SEQ instead of this. */
-#define AKECS_MODE_PFFD 0x01 /* Start pedometer and free fall detect. */
-#define AKECS_MODE_E2P_READ 0x02 /* E2P access mode (read). */
-#define AKECS_MODE_POWERDOWN 0x03 /* Power down mode */
-
-#define AKECS_MODE_MEASURE_SNG 0x10 /* Starts single measurement */
-#define AKECS_MODE_MEASURE_SEQ 0x11 /* Starts sequential measurement */
-
-/* Default register settings */
-#define CSPEC_AINT 0x01 /* Amplification for acceleration sensor */
-#define CSPEC_SNG_NUM 0x01 /* Single measurement mode */
-#define CSPEC_SEQ_NUM 0x02 /* Sequential measurement mode */
-#define CSPEC_SFRQ_32 0x00 /* Measurement frequency: 32Hz */
-#define CSPEC_SFRQ_64 0x01 /* Measurement frequency: 64Hz */
-#define CSPEC_MCS 0x07 /* Clock frequency */
-#define CSPEC_MKS 0x01 /* Clock type: CMOS level */
-#define CSPEC_INTEN 0x01 /* Interruption pin enable: Enable */
-
-#define RBUFF_SIZE 31 /* Rx buffer size */
-#define MAX_CALI_SIZE 0x1000U /* calibration buffer size */
-
-/* AK8976A register address */
-#define AKECS_REG_ST 0xC0
-#define AKECS_REG_TMPS 0xC1
-#define AKECS_REG_MS1 0xE0
-#define AKECS_REG_MS2 0xE1
-#define AKECS_REG_MS3 0xE2
-
-#define AKMIO 0xA1
-
-/* IOCTLs for AKM library */
-#define ECS_IOCTL_RESET _IO(AKMIO, 0x04)
-#define ECS_IOCTL_INT_STATUS _IO(AKMIO, 0x05)
-#define ECS_IOCTL_FFD_STATUS _IO(AKMIO, 0x06)
-#define ECS_IOCTL_SET_MODE _IOW(AKMIO, 0x07, short)
-#define ECS_IOCTL_GETDATA _IOR(AKMIO, 0x08, char[RBUFF_SIZE+1])
-#define ECS_IOCTL_GET_NUMFRQ _IOR(AKMIO, 0x09, char[2])
-#define ECS_IOCTL_SET_PERST _IO(AKMIO, 0x0A)
-#define ECS_IOCTL_SET_G0RST _IO(AKMIO, 0x0B)
-#define ECS_IOCTL_SET_YPR _IOW(AKMIO, 0x0C, short[12])
-#define ECS_IOCTL_GET_OPEN_STATUS _IOR(AKMIO, 0x0D, int)
-#define ECS_IOCTL_GET_CLOSE_STATUS _IOR(AKMIO, 0x0E, int)
-#define ECS_IOCTL_GET_CALI_DATA _IOR(AKMIO, 0x0F, char[MAX_CALI_SIZE])
-#define ECS_IOCTL_GET_DELAY _IOR(AKMIO, 0x30, short)
-
-/* 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_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_GET_DELAY ECS_IOCTL_GET_DELAY
-#define ECS_IOCTL_APP_SET_MVFLAG _IOW(AKMIO, 0x19, short) /* Set raw magnetic vector flag */
-#define ECS_IOCTL_APP_GET_MVFLAG _IOR(AKMIO, 0x1A, short) /* Get raw magnetic vector flag */
-
-/* IOCTLs for pedometer */
-#define ECS_IOCTL_SET_STEP_CNT _IOW(AKMIO, 0x20, short)
-
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define ECS_IOCTL_APP_SET_AFLAG _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x02, short)
-#define ECS_IOCTL_APP_SET_DELAY _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x03, short)
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
-
-//#define MMA8452_DRVID 6
-
-
-
-/* Default GPIO setting */
-#define ECS_RST 146 /*MISC4, bit2 */
-#define ECS_CLK_ON 155 /*MISC5, bit3 */
-#define ECS_INTR 161 /*INT2, bit1 */
-
-/* MISC */
-#define MMA8452_ADDR 0x1C
-#define SENSOR_UI_MODE 0
-#define SENSOR_GRAVITYGAME_MODE 1
-#define UI_SAMPLE_RATE 0xFC
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define sin30_1000 500
-#define cos30_1000 866
-#define DISABLE 0
-#define ENABLE 1
-
-struct mma7660_platform_data {
- int reset;
- int clk_on;
- int intr;
-};
-
-extern char *get_mma_cal_ram(void);
-
-#endif
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/Makefile
deleted file mode 100755
index bdf4598d..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-s_wmt_msensor_mmc328x-objs += mmc328x.o
-obj-m += s_wmt_msensor_mmc328x.o
-s_wmt_generic_mecs-objs += mecs.o
-obj-m += s_wmt_generic_mecs.o \ No newline at end of file
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.c b/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.c
deleted file mode 100755
index 335ad266..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * Copyright (C) 2010 MEMSIC, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <linux/interrupt.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/workqueue.h>
-#include <linux/freezer.h>
-#include <asm/uaccess.h>
-//#include <linux/export.h>
-#include <linux/module.h>
-#include "mecs.h"
-
-#define DEBUG 0
-
-#define ECS_DATA_DEV_NAME "ecompass_data"
-#define ECS_CTRL_DEV_NAME "ecompass_ctrl"
-
-static int ecs_ctrl_open(struct inode *inode, struct file *file);
-static int ecs_ctrl_release(struct inode *inode, struct file *file);
-static int ecs_ctrl_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
-
-static DECLARE_WAIT_QUEUE_HEAD(open_wq);
-
-static atomic_t open_count;
-static atomic_t open_flag;
-static atomic_t reserve_open_flag;
-
-static atomic_t a_flag;
-static atomic_t m_flag;
-static atomic_t o_flag;
-
-static short ecompass_delay = 0;
-
-
-static struct input_dev *ecs_data_device;
-
-static struct file_operations ecs_ctrl_fops = {
- .owner = THIS_MODULE,
- .open = ecs_ctrl_open,
- .release = ecs_ctrl_release,
- .unlocked_ioctl = ecs_ctrl_ioctl,
-};
-
-static struct miscdevice ecs_ctrl_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = ECS_CTRL_DEV_NAME,
- .fops = &ecs_ctrl_fops,
-};
-
-static int ecs_ctrl_open(struct inode *inode, struct file *file)
-{
-#if 1
- atomic_set(&reserve_open_flag, 1);
- atomic_set(&open_flag, 1);
- atomic_set(&open_count, 1);
- wake_up(&open_wq);
-
- return 0;
-#else
- int ret = -1;
-
- if (atomic_cmpxchg(&open_count, 0, 1) == 0) {
- if (atomic_cmpxchg(&open_flag, 0, 1) == 0) {
- atomic_set(&reserve_open_flag, 1);
- wake_up(&open_wq);
- ret = 0;
- }
- }
-
- return ret;
-#endif
-}
-
-static int ecs_ctrl_release(struct inode *inode, struct file *file)
-{
- atomic_set(&reserve_open_flag, 0);
- atomic_set(&open_flag, 0);
- atomic_set(&open_count, 0);
- wake_up(&open_wq);
-
- return 0;
-}
-
-static int ecs_ctrl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- void __user *pa = (void __user *)arg;
- short flag;
- short delay;
- int parms[4];
- int ypr[12];
- unsigned int uval = 0;
-
- switch (cmd) {
- case ECOMPASS_IOC_SET_MODE:
- break;
- case ECOMPASS_IOC_SET_DELAY:
- if (copy_from_user(&delay, pa, sizeof(delay)))
- return -EFAULT;
- ecompass_delay = delay;
- break;
- case ECOMPASS_IOC_GET_DELAY:
- delay = ecompass_delay;
- if (copy_to_user(pa, &delay, sizeof(delay)))
- return -EFAULT;
- break;
-
- case ECOMPASS_IOC_SET_AFLAG:
- if (copy_from_user(&flag, pa, sizeof(flag)))
- return -EFAULT;
- if (flag < 0 || flag > 1)
- return -EINVAL;
- atomic_set(&a_flag, flag);
- break;
- case ECOMPASS_IOC_GET_AFLAG:
- flag = atomic_read(&a_flag);
- if (copy_to_user(pa, &flag, sizeof(flag)))
- return -EFAULT;
- break;
- case ECOMPASS_IOC_SET_MFLAG:
- if (copy_from_user(&flag, pa, sizeof(flag)))
- return -EFAULT;
- if (flag < 0 || flag > 1)
- return -EINVAL;
- atomic_set(&m_flag, flag);
- break;
- case ECOMPASS_IOC_GET_MFLAG:
- flag = atomic_read(&m_flag);
- if (copy_to_user(pa, &flag, sizeof(flag)))
- return -EFAULT;
- break;
- case ECOMPASS_IOC_SET_OFLAG:
- if (copy_from_user(&flag, pa, sizeof(flag)))
- return -EFAULT;
- if (flag < 0 || flag > 1)
- return -EINVAL;
- atomic_set(&o_flag, flag);
- break;
- case ECOMPASS_IOC_GET_OFLAG:
- flag = atomic_read(&o_flag);
- if (copy_to_user(pa, &flag, sizeof(flag)))
- return -EFAULT;
- break;
-
- case ECOMPASS_IOC_SET_APARMS:
- if (copy_from_user(parms, pa, sizeof(parms)))
- return -EFAULT;
- /* acceleration x-axis */
- input_set_abs_params(ecs_data_device, ABS_X,
- parms[0], parms[1], parms[2], parms[3]);
- /* acceleration y-axis */
- input_set_abs_params(ecs_data_device, ABS_Y,
- parms[0], parms[1], parms[2], parms[3]);
- /* acceleration z-axis */
- input_set_abs_params(ecs_data_device, ABS_Z,
- parms[0], parms[1], parms[2], parms[3]);
- break;
- case ECOMPASS_IOC_GET_APARMS:
- break;
- case ECOMPASS_IOC_SET_MPARMS:
- if (copy_from_user(parms, pa, sizeof(parms)))
- return -EFAULT;
- /* magnetic raw x-axis */
- input_set_abs_params(ecs_data_device, ABS_HAT0X,
- parms[0], parms[1], parms[2], parms[3]);
- /* magnetic raw y-axis */
- input_set_abs_params(ecs_data_device, ABS_HAT0Y,
- parms[0], parms[1], parms[2], parms[3]);
- /* magnetic raw z-axis */
- input_set_abs_params(ecs_data_device, ABS_BRAKE,
- parms[0], parms[1], parms[2], parms[3]);
- break;
- case ECOMPASS_IOC_GET_MPARMS:
- break;
- case ECOMPASS_IOC_SET_OPARMS_YAW:
- if (copy_from_user(parms, pa, sizeof(parms)))
- return -EFAULT;
- /* orientation yaw */
- input_set_abs_params(ecs_data_device, ABS_RX,
- parms[0], parms[1], parms[2], parms[3]);
- break;
- case ECOMPASS_IOC_GET_OPARMS_YAW:
- break;
- case ECOMPASS_IOC_SET_OPARMS_PITCH:
- if (copy_from_user(parms, pa, sizeof(parms)))
- return -EFAULT;
- /* orientation pitch */
- input_set_abs_params(ecs_data_device, ABS_RY,
- parms[0], parms[1], parms[2], parms[3]);
- break;
- case ECOMPASS_IOC_GET_OPARMS_PITCH:
- break;
- case ECOMPASS_IOC_SET_OPARMS_ROLL:
- if (copy_from_user(parms, pa, sizeof(parms)))
- return -EFAULT;
- /* orientation roll */
- input_set_abs_params(ecs_data_device, ABS_RZ,
- parms[0], parms[1], parms[2], parms[3]);
- break;
- case ECOMPASS_IOC_GET_OPARMS_ROLL:
- break;
-
- case ECOMPASS_IOC_SET_YPR:
- if (copy_from_user(ypr, pa, sizeof(ypr)))
- return -EFAULT;
- /* Report acceleration sensor information */
- if (atomic_read(&a_flag)) {
- input_report_abs(ecs_data_device, ABS_X, ypr[0]);
- input_report_abs(ecs_data_device, ABS_Y, ypr[1]);
- input_report_abs(ecs_data_device, ABS_Z, ypr[2]);
- input_report_abs(ecs_data_device, ABS_WHEEL, ypr[3]);
- }
-
- /* Report magnetic sensor information */
- if (atomic_read(&m_flag)) {
- input_report_abs(ecs_data_device, ABS_HAT0X, ypr[4]);
- input_report_abs(ecs_data_device, ABS_HAT0Y, ypr[5]);
- input_report_abs(ecs_data_device, ABS_BRAKE, ypr[6]);
- input_report_abs(ecs_data_device, ABS_GAS, ypr[7]);
- }
-
- /* Report orientation information */
- if (atomic_read(&o_flag)) {
- input_report_abs(ecs_data_device, ABS_RX, ypr[8]);
- input_report_abs(ecs_data_device, ABS_RY, ypr[9]);
- input_report_abs(ecs_data_device, ABS_RZ, ypr[10]);
- input_report_abs(ecs_data_device, ABS_RUDDER, ypr[11]);
- }
-
- input_sync(ecs_data_device);
- break;
-
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = 0;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
-
- default:
- break;
- }
-
- return 0;
-}
-
-static ssize_t ecs_ctrl_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- ssize_t ret = 0;
-
- sprintf(buf, "ecompass_ctrl");//!!!
- ret = strlen(buf) + 1;
-
- return ret;
-}
-
-static DEVICE_ATTR(ecs_ctrl, S_IRUGO, ecs_ctrl_show, NULL);
-
-//**********************
-static struct input_dev *g_input;
-struct timer_list mytimer;
-static void rep_pwer(long var)
-{
- static int i = 0;
- i++;
-#if 0
- input_report_abs(g_input, ABS_X,i);
- input_report_abs(g_input, ABS_Y, i);
- input_report_abs(g_input, ABS_Z, i);
- //input_report_abs(ecs_data_device, ABS_GAS, 2);
- input_sync(g_input);
-#endif
-
- input_report_abs(ecs_data_device, ABS_HAT0X,i);
- input_report_abs(ecs_data_device, ABS_HAT0Y, i);
- input_report_abs(ecs_data_device, ABS_BRAKE, i);
- input_report_abs(ecs_data_device, ABS_GAS, 2);
- input_sync(ecs_data_device);
- //printk("<<<<memscid timer\n");
- mod_timer(&mytimer, jiffies + HZ/10);
-}
-//**********************************
-
-static int __init ecompass_init(void)
-{
- int res = 0;
-
- pr_info("ecompass driver: init\n");
-
- //*******************here want to report KEY_POWER using timer*** to test suspend & resume
- init_timer(&mytimer);
- mytimer.function = rep_pwer;
- mytimer.expires = jiffies + 2*HZ;
- mytimer.data = 100;
- // add_timer(&mytimer);
- printk("<<<<%s add timer ok!\n", __FUNCTION__);
-
-
- int err=0;
- g_input=input_allocate_device();
- if (!g_input)
- return -ENOMEM;
- else
- printk(KERN_INFO "input device allocate Success !!\n");
- /* Setup input device */
- set_bit(EV_ABS, g_input->evbit);
- /* Accelerometer [-78.5, 78.5]m/s2 in Q16 */
- input_set_abs_params(g_input, ABS_HAT0X, -5144576, 5144576, 0, 0);
- input_set_abs_params(g_input, ABS_HAT0Y, -5144576, 5144576, 0, 0);
- input_set_abs_params(g_input, ABS_BRAKE, -5144576, 5144576, 0, 0);
-
- /* Set InputDevice Name */
- g_input->name = "ecompass_data";
-
- /* Register */
- //err = input_register_device(g_input);
- //*****************************************2013-4-13
-
- ecs_data_device = input_allocate_device();
- if (!ecs_data_device) {
- res = -ENOMEM;
- pr_err("%s: failed to allocate input device\n", __FUNCTION__);
- goto out;
- }
-
- set_bit(EV_ABS, ecs_data_device->evbit);
-
- /* 32768 == 1g, range -4g ~ +4g */
- /* acceleration x-axis */
- input_set_abs_params(ecs_data_device, ABS_X,
- -32768*4, 32768*4, 0, 0);
- /* acceleration y-axis */
- input_set_abs_params(ecs_data_device, ABS_Y,
- -32768*4, 32768*4, 0, 0);
- /* acceleration z-axis */
- input_set_abs_params(ecs_data_device, ABS_Z,
- -32768*4, 32768*4, 0, 0);
- /* acceleration status, 0 ~ 3 */
- input_set_abs_params(ecs_data_device, ABS_WHEEL,
- 0, 100, 0, 0);
-
- /* 32768 == 1gauss, range -4gauss ~ +4gauss */
- /* magnetic raw x-axis */
- input_set_abs_params(ecs_data_device, ABS_HAT0X,
- -32768*4, 32768*4, 0, 0);
- /* magnetic raw y-axis */
- input_set_abs_params(ecs_data_device, ABS_HAT0Y,
- -32768*4, 32768*4, 0, 0);
- /* magnetic raw z-axis */
- input_set_abs_params(ecs_data_device, ABS_BRAKE,
- -32768*4, 32768*4, 0, 0);
- /* magnetic raw status, 0 ~ 3 */
- input_set_abs_params(ecs_data_device, ABS_GAS,
- 0, 100, 0, 0);
-
- /* 65536 == 360degree */
- /* orientation yaw, 0 ~ 360 */
- input_set_abs_params(ecs_data_device, ABS_RX,
- 0, 65536, 0, 0);
- /* orientation pitch, -180 ~ 180 */
- input_set_abs_params(ecs_data_device, ABS_RY,
- -65536/2, 65536/2, 0, 0);
- /* orientation roll, -90 ~ 90 */
- input_set_abs_params(ecs_data_device, ABS_RZ,
- -65536/4, 65536/4, 0, 0);
- /* orientation status, 0 ~ 3 */
- input_set_abs_params(ecs_data_device, ABS_RUDDER,
- 0, 100, 0, 0);
-
- ecs_data_device->name = ECS_DATA_DEV_NAME;
-#if 1
- res = input_register_device(ecs_data_device);
- if (res) {
- pr_err("%s: unable to register input device: %s\n",
- __FUNCTION__, ecs_data_device->name);
- goto out_free_input;
- }
-#endif
-
- res = misc_register(&ecs_ctrl_device);
- if (res) {
- pr_err("%s: ecs_ctrl_device register failed\n", __FUNCTION__);
- goto out_free_input;
- }
- res = device_create_file(ecs_ctrl_device.this_device, &dev_attr_ecs_ctrl);
- if (res) {
- pr_err("%s: device_create_file failed\n", __FUNCTION__);
- goto out_deregister_misc;
- }
-
- return 0;
-
-out_deregister_misc:
- misc_deregister(&ecs_ctrl_device);
-out_free_input:
- input_free_device(ecs_data_device);
-out:
- return res;
-}
-
-static void __exit ecompass_exit(void)
-{
- pr_info("ecompass driver: exit\n");
- device_remove_file(ecs_ctrl_device.this_device, &dev_attr_ecs_ctrl);
- misc_deregister(&ecs_ctrl_device);
- input_free_device(ecs_data_device);
-}
-
-module_init(ecompass_init);
-module_exit(ecompass_exit);
-
-MODULE_DESCRIPTION("MEMSIC eCompass Driver");
-MODULE_LICENSE("GPL");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.h b/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.h
deleted file mode 100755
index c328e585..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mecs.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 MEMSIC, Inc.
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * Definitions for ECOMPASS magnetic sensor chip.
- */
-#ifndef __ECOMPASS_H__
-#define __ECOMPASS_H__
-
-#include <linux/ioctl.h>
-
-/* Use 'e' as magic number */
-#define ECOMPASS_IOM 'e'
-
-/* IOCTLs for ECOMPASS device */
-#define ECOMPASS_IOC_SET_MODE _IOW(ECOMPASS_IOM, 0x00, short)
-#define ECOMPASS_IOC_SET_DELAY _IOW(ECOMPASS_IOM, 0x01, short)
-#define ECOMPASS_IOC_GET_DELAY _IOR(ECOMPASS_IOM, 0x02, short)
-
-#define ECOMPASS_IOC_SET_AFLAG _IOW(ECOMPASS_IOM, 0x10, short)
-#define ECOMPASS_IOC_GET_AFLAG _IOR(ECOMPASS_IOM, 0x11, short)
-#define ECOMPASS_IOC_SET_MFLAG _IOW(ECOMPASS_IOM, 0x12, short)
-#define ECOMPASS_IOC_GET_MFLAG _IOR(ECOMPASS_IOM, 0x13, short)
-#define ECOMPASS_IOC_SET_OFLAG _IOW(ECOMPASS_IOM, 0x14, short)
-#define ECOMPASS_IOC_GET_OFLAG _IOR(ECOMPASS_IOM, 0x15, short)
-
-#define ECOMPASS_IOC_SET_APARMS _IOW(ECOMPASS_IOM, 0x20, int[4])
-#define ECOMPASS_IOC_GET_APARMS _IOR(ECOMPASS_IOM, 0x21, int[4])
-#define ECOMPASS_IOC_SET_MPARMS _IOW(ECOMPASS_IOM, 0x22, int[4])
-#define ECOMPASS_IOC_GET_MPARMS _IOR(ECOMPASS_IOM, 0x23, int[4])
-#define ECOMPASS_IOC_SET_OPARMS_YAW _IOW(ECOMPASS_IOM, 0x24, int[4])
-#define ECOMPASS_IOC_GET_OPARMS_YAW _IOR(ECOMPASS_IOM, 0x25, int[4])
-#define ECOMPASS_IOC_SET_OPARMS_PITCH _IOW(ECOMPASS_IOM, 0x26, int[4])
-#define ECOMPASS_IOC_GET_OPARMS_PITCH _IOR(ECOMPASS_IOM, 0x27, int[4])
-#define ECOMPASS_IOC_SET_OPARMS_ROLL _IOW(ECOMPASS_IOM, 0x28, int[4])
-#define ECOMPASS_IOC_GET_OPARMS_ROLL _IOR(ECOMPASS_IOM, 0x29, int[4])
-
-#define ECOMPASS_IOC_SET_YPR _IOW(ECOMPASS_IOM, 0x30, int[12])
-
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
-#endif /* __ECOMPASS_H__ */
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.c b/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.c
deleted file mode 100755
index 4148b5f1..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright (C) 2011 MEMSIC, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/jiffies.h>
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include <linux/miscdevice.h>
-#include <linux/mutex.h>
-#include <linux/mm.h>
-#include <linux/device.h>
-#include <linux/fs.h>
-#include <linux/delay.h>
-#include <linux/sysctl.h>
-#include <asm/uaccess.h>
-#include <linux/input.h>
-//#include <linux/mmc328x.h>
-#include "mmc328x.h"
-#define DEBUG 0
-#define MAX_FAILURE_COUNT 3
-#define READMD 0
-
-#define MMC328X_DELAY_TM 10 /* ms */
-#define MMC328X_DELAY_RM 10 /* ms */
-#define MMC328X_DELAY_STDN 1 /* ms */
-#define MMC328X_DELAY_RRM 1 /* ms */
-
-#define MMC328X_RETRY_COUNT 3
-#define MMC328X_RRM_INTV 100
-
-
-//******************************* move from memsicd 2013-4-26
-#define MMC328X_OFFSET_X 4096
-#define MMC328X_OFFSET_Y 4096
-#define MMC328X_OFFSET_Z 4096
-//******************************************
-
-#define MMC328X_DEV_NAME "mmc328x"
-#define CONFIG_SENSORS_MMC328xMA_MAG //add rambo 2013-4-20
-struct i2c_client *g_client;
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static u32 read_idx = 0;
-
-static struct i2c_client *this_client;
-
-static struct wmt_msensor_data l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 5,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .isdbg = 0,
- .sensor_samp = 10, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .offset={0,0,0},
-};
-
-static int get_axisset(void)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.msensor328x", varbuf, &varlen)) {
- printk("Can't get gsensor config in u-boot!!!!\n");
- //return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d",
-
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1])
-
- );
- if (n != 6) {
- printk("gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- printk("get the sensor config: %d:%d:%d:%d:%d:%d\n",
-
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1]
- );
- }
- return 0;
-}
-
-
-static int mmc328x_i2c_rx_data(char *buf, int len)
-{
- uint8_t i;
- struct i2c_msg msgs[] = {
- {
- .addr = this_client->addr,
- .flags = 0,
- .len = 1,
- .buf = buf,
- },
- {
- .addr = this_client->addr,
- .flags = I2C_M_RD,
- .len = len,
- .buf = buf,
- }
- };
-
- for (i = 0; i < MMC328X_RETRY_COUNT; i++) {
- if (i2c_transfer(this_client->adapter, msgs, 2) >= 0) {
- break;
- }
- mdelay(10);
- }
-
- if (i >= MMC328X_RETRY_COUNT) {
- pr_err("%s: retry over %d\n", __FUNCTION__, MMC328X_RETRY_COUNT);
- return -EIO;
- }
-
- return 0;
-}
-
-static int mmc328x_i2c_tx_data(char *buf, int len)
-{
- uint8_t i;
- struct i2c_msg msg[] = {
- {
- .addr = this_client->addr,
- .flags = 0,
- .len = len,
- .buf = buf,
- }
- };
-
- for (i = 0; i < MMC328X_RETRY_COUNT; i++) {
- if (i2c_transfer(this_client->adapter, msg, 1) >= 0) {
- break;
- }
- mdelay(10);
- }
-
- if (i >= MMC328X_RETRY_COUNT) {
- pr_err("%s: retry over %d\n", __FUNCTION__, MMC328X_RETRY_COUNT);
- return -EIO;
- }
- return 0;
-}
-
-static int mmc328x_open(struct inode *inode, struct file *file)
-{
- return nonseekable_open(inode, file);
-}
-
-static int mmc328x_release(struct inode *inode, struct file *file)
-{
- return 0;
-}
-
-static int mmc328x_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
- void __user *pa = (void __user *)arg;
- unsigned char data[16] = {0};
- int vec[3] = {0};
- int tmp[3] = {0};
-
- int MD_times = 0;
-
- switch (cmd) {
- case MMC328X_IOC_TM:
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_TM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- return -EFAULT;
- }
- /* wait TM done for coming data read */
- msleep(MMC328X_DELAY_TM);
- break;
- case MMC328X_IOC_RM:
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- return -EFAULT;
- }
- /* wait external capacitor charging done for next SET*/
- msleep(MMC328X_DELAY_RM);
- break;
- case MMC328X_IOC_RRM:
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RRM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- return -EFAULT;
- }
- /* wait external capacitor charging done for next RRM */
- msleep(MMC328X_DELAY_RM);
- break;
- case MMC328X_IOC_READ:
- data[0] = MMC328X_REG_DATA;
- if (mmc328x_i2c_rx_data(data, 6) < 0) {
- return -EFAULT;
- }
- tmp[0] = data[1] << 8 | data[0];
- tmp[1] = data[3] << 8 | data[2];
- tmp[2] = data[5] << 8 | data[4];
- tmp[2] = 8192 - tmp[2] ;
- //add 2013-4-26
- tmp[0] -= MMC328X_OFFSET_X;
- tmp[1] -= MMC328X_OFFSET_Y;
- tmp[2] -= MMC328X_OFFSET_Z;
- //add end
- vec[0] = tmp[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1];
-
- vec[1] = tmp[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1];
-
- vec[2] = tmp[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1];
-
- #if DEBUG
- printk("[X - %04x] [Y - %04x] [Z - %04x]\n",
- vec[0], vec[1], vec[2]);
- #endif
- if (copy_to_user(pa, vec, sizeof(vec))) {
- return -EFAULT;
- }
- break;
- case MMC328X_IOC_READXYZ:
- /* do RM every MMC328X_RRM_INTV times read */
- if (!(read_idx % MMC328X_RRM_INTV)) {
-#ifdef CONFIG_SENSORS_MMC328xMA_MAG
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RRM;
- mmc328x_i2c_tx_data(data, 2);
- msleep(MMC328X_DELAY_RRM);
-#endif
- /* RM */
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RM;
- /* not check return value here, assume it always OK */
- mmc328x_i2c_tx_data(data, 2);
- /* wait external capacitor charging done for next RM */
- msleep(MMC328X_DELAY_RM);
- }
- read_idx++;
-
- /* send TM cmd before read */
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_TM;
- /* not check return value here, assume it always OK */
- mmc328x_i2c_tx_data(data, 2);
- /* wait TM done for coming data read */
- msleep(MMC328X_DELAY_TM);
-#if READMD
- /* Read MD */
- data[0] = MMC328X_REG_DS;
- if (mmc328x_i2c_rx_data(data, 1) < 0) {
- return -EFAULT;
- }
- while (!(data[0] & 0x01)) {
- msleep(1);
- /* Read MD again*/
- data[0] = MMC328X_REG_DS;
- if (mmc328x_i2c_rx_data(data, 1) < 0) {
- return -EFAULT;
- }
-
- if (data[0] & 0x01) break;
- MD_times++;
- if (MD_times > 2) {
- #if DEBUG
- printk("TM not work!!");
- #endif
- return -EFAULT;
- }
- }
-#endif
- /* read xyz raw data */
- data[0] = MMC328X_REG_DATA;
- if (mmc328x_i2c_rx_data(data, 6) < 0) {
- return -EFAULT;
- }
- tmp[0] = data[1] << 8 | data[0];
- tmp[1] = data[3] << 8 | data[2];
- tmp[2] = data[5] << 8 | data[4];
- tmp[2] = 8192 - tmp[2];
- //add 2013-4-26
- tmp[0] -= MMC328X_OFFSET_X;
- tmp[1] -= MMC328X_OFFSET_Y;
- tmp[2] -= MMC328X_OFFSET_Z;
- //add
- vec[0] = tmp[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1];
-
- vec[1] = tmp[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1];
-
- vec[2] = tmp[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1];
-
-
-
- #if DEBUG
- printk("[X - %04x] [Y - %04x] [Z - %04x]\n",
- vec[0], vec[1], vec[2]);
- #endif
- if (copy_to_user(pa, vec, sizeof(vec))) {
- return -EFAULT;
- }
-
- break;
- default:
- break;
- }
-
- return 0;
-}
-
-static ssize_t mmc328x_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- ssize_t ret = 0;
-
- sprintf(buf, "MMC328X");//!!!
- ret = strlen(buf) + 1;
-
- return ret;
-}
-
-static DEVICE_ATTR(mmc328x, S_IRUGO, mmc328x_show, NULL);
-
-static struct file_operations mmc328x_fops = {
- .owner = THIS_MODULE,
- .open = mmc328x_open,
- .release = mmc328x_release,
- .unlocked_ioctl = mmc328x_ioctl,
-};
-
-static struct miscdevice mmc328x_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = MMC328X_DEV_NAME,
- .fops = &mmc328x_fops,
-};
-
-static int mmc328x_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
- unsigned char data[16] = {0};
- int res = 0;
-
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
- pr_err("%s: functionality check failed\n", __FUNCTION__);
- res = -ENODEV;
- goto out;
- }
- this_client = client;
-
- res = misc_register(&mmc328x_device);//
- if (res) {
- pr_err("%s: mmc328x_device register failed\n", __FUNCTION__);
- goto out;
- }
- res = device_create_file(&client->dev, &dev_attr_mmc328x);//
- if (res) {
- pr_err("%s: device_create_file failed\n", __FUNCTION__);
- goto out_deregister;
- }
-
- /* send RM/RRM cmd to mag sensor first of all */
-#ifdef CONFIG_SENSORS_MMC328xMA_MAG
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RRM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- }
- msleep(MMC328X_DELAY_RRM);
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_TM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- }
- msleep(5*MMC328X_DELAY_TM);
-#endif
-
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_RM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- /* assume RM always success */
- }
-#ifndef CONFIG_SENSORS_MMC328xMA_MAG
- /* wait external capacitor charging done for next RM */
- msleep(MMC328X_DELAY_RM);
-#else
- msleep(10*MMC328X_DELAY_RM);
- data[0] = MMC328X_REG_CTRL;
- data[1] = MMC328X_CTRL_TM;
- if (mmc328x_i2c_tx_data(data, 2) < 0) {
- }
-#endif
-
- return 0;
-
-out_deregister:
- misc_deregister(&mmc328x_device);
-out:
- return res;
-}
-
-static int mmc328x_remove(struct i2c_client *client)
-{
- device_remove_file(&client->dev, &dev_attr_mmc328x);
- misc_deregister(&mmc328x_device);
-
- return 0;
-}
-
-static const struct i2c_device_id mmc328x_id[] = {
- { MMC328X_I2C_NAME, 0 },
- { }
-};
-
-static struct i2c_driver mmc328x_driver = {
- .probe = mmc328x_probe,
- .remove = mmc328x_remove,
- .id_table = mmc328x_id,
- .driver = {
- .owner = THIS_MODULE,
- .name = MMC328X_I2C_NAME,
- },
-};
-
-//****************************add by rambo to create i2c client 2013-4-18
-static struct i2c_board_info mmc328x_board_info =
-{
- .type = MMC328X_I2C_NAME,
- .addr = MMC328X_I2C_ADDR,
-};
-
-//******************************************
-
-static int __init mmc328x_init(void)
-{
- int ret;
- pr_info("mmc328x driver: init\n");
-
- ret = get_axisset();
- struct i2c_adapter *adapter;
- adapter = i2c_get_adapter(0);
- if (!adapter)
- {
- printk("<<<<<%s i2c get adapter fail!\n", __FUNCTION__);
- return -1;
- }
- g_client = i2c_new_device(adapter, &mmc328x_board_info);
- if (!g_client)
- {
- printk("<<<<%s i2c new device fail!\n", __FUNCTION__);
- i2c_put_adapter(adapter);
- return -1;
- }
- i2c_put_adapter(adapter);
-
- return i2c_add_driver(&mmc328x_driver);
-}
-
-static void __exit mmc328x_exit(void)
-{
- if (g_client != NULL)
- {
- i2c_unregister_device(g_client);
- }
- pr_info("mmc328x driver: exit\n");
- i2c_del_driver(&mmc328x_driver);
-}
-
-module_init(mmc328x_init);
-module_exit(mmc328x_exit);
-
-MODULE_DESCRIPTION("MEMSIC MMC328X Magnetic Sensor Driver");
-MODULE_LICENSE("GPL");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.h b/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.h
deleted file mode 100755
index f272ea1d..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mmc328x_msensor/mmc328x.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2010 MEMSIC, Inc.
- *
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-/*
- * Definitions for mmc328x magnetic sensor chip.
- */
-#ifndef __MMC328X_H__
-#define __MMC328X_H__
-
-#include <linux/ioctl.h>
-
-#define MMC328X_I2C_NAME "mmc328x"
-
-/*
- * This address comes must match the part# on your target.
- * Address to the sensor part# support as following list:
- * MMC3280MS - 0110000b
- * MMC3281MS - 0110001b
- * MMC3282MS - 0110010b
- * MMC3283MS - 0110011b
- * MMC3284MS - 0110100b
- * MMC3285MS - 0110101b
- * MMC3286MS - 0110110b
- * MMC3287MS - 0110111b
- * Please refer to sensor datasheet for detail.
- */
- struct wmt_msensor_data{
- // for control
- int int_gpio; //0-3
- int op;
- int samp;
- int xyz_axis[3][2]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg;
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- int offset[3];
- struct i2c_client *client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-#define MMC328X_I2C_ADDR 0x30
-
-/* MMC328X register address */
-#define MMC328X_REG_CTRL 0x07
-#define MMC328X_REG_DATA 0x00
-#define MMC328X_REG_DS 0x06
-
-/* MMC328X control bit */
-#define MMC328X_CTRL_TM 0x01
-#define MMC328X_CTRL_RM 0x20
-#define MMC328X_CTRL_RRM 0x40
-#define MMC328X_CTRL_NOBOOST 0x10
-
-/* Use 'm' as magic number */
-#define MMC328X_IOM 'm'
-
-/* IOCTLs for MMC328X device */
-#define MMC328X_IOC_TM _IO (MMC328X_IOM, 0x00)
-#define MMC328X_IOC_RM _IO (MMC328X_IOM, 0x01)
-#define MMC328X_IOC_READ _IOR(MMC328X_IOM, 0x02, int[3])
-#define MMC328X_IOC_READXYZ _IOR(MMC328X_IOM, 0x03, int[3])
-#define MMC328X_IOC_RRM _IO (MMC328X_IOM, 0x04)
-#define MMC328X_IOC_NOBOOST _IO (MMC328X_IOM, 0x05)
-
-#endif /* __MMC328X_H__ */
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/Makefile
deleted file mode 100755
index 16baea79..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_mxc622x
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := mxc622x.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.c b/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.c
deleted file mode 100755
index 9c94b6ed..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.c
+++ /dev/null
@@ -1,1151 +0,0 @@
-/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
- *
- * File Name : mxc622x_acc.c
- * Description : MXC622X accelerometer sensor API
- *
- *******************************************************************************
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
- * OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
- * PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
- * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
- * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
- * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
- * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *
- * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
- *
-
- ******************************************************************************/
-#include <linux/module.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/delay.h>
-#include <linux/fs.h>
-#include <linux/i2c.h>
-
-#include <linux/input.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <linux/uaccess.h>
-#include <linux/slab.h>
-
-#include <linux/workqueue.h>
-#include <linux/irq.h>
-#include <linux/gpio.h>
-#include <linux/interrupt.h>
-#ifdef CONFIG_HAS_EARLYSUSPEND
-#include <linux/earlysuspend.h>
-#endif
-#include <linux/platform_device.h>
-
-#include "mxc622x.h"
-#include "../sensor.h"
-#ifdef CONFIG_ARCH_SC8810
-#include <mach/eic.h>
-#endif
-
-#define G_MAX 16000 /** Maximum polled-device-reported g value */
-#define WHOAMI_MXC622X_ACC 0x25 /* Expctd content for WAI */
-
-/* CONTROL REGISTERS */
-#define WHO_AM_I 0x08 /* WhoAmI register */
-
-#define FUZZ 32
-#define FLAT 32
-#define I2C_RETRY_DELAY 5
-#define I2C_RETRIES 5
-#define I2C_AUTO_INCREMENT 0x80
-
-/* RESUME STATE INDICES */
-
-#define RESUME_ENTRIES 20
-#define DEVICE_INFO "Memsic, MXC622X"
-#define DEVICE_INFO_LEN 32
-
-/* end RESUME STATE INDICES */
-
-#define DEBUG
-//#define MXC622X_DEBUG
-
-#define MAX_INTERVAL 50
-
-#ifdef __KERNEL__
-static struct mxc622x_acc_platform_data mxc622x_plat_data = {
- .poll_interval = 20,
- .min_interval = 10,
-};
-#endif
-
-#ifdef I2C_BUS_NUM_STATIC_ALLOC
-static struct i2c_board_info mxc622x_i2c_boardinfo = {
- I2C_BOARD_INFO(MXC622X_ACC_I2C_NAME, MXC622X_ACC_I2C_ADDR),
-#ifdef __KERNEL__
- .platform_data = &mxc622x_plat_data
-#endif
-};
-#endif
-
-struct mxc622x_acc_data {
- struct i2c_client *client;
- struct mxc622x_acc_platform_data *pdata;
-
- struct mutex lock;
- struct delayed_work input_work;
-
- struct input_dev *input_dev;
-
- int hw_initialized;
- /* hw_working=-1 means not tested yet */
- int hw_working;
- atomic_t enabled;
- int on_before_suspend;
-
- u8 resume_state[RESUME_ENTRIES];
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend early_suspend;
-#endif
-};
-
-/*
- * Because misc devices can not carry a pointer from driver register to
- * open, we keep this global. This limits the driver to a single instance.
- */
-struct mxc622x_acc_data *mxc622x_acc_misc_data;
-struct i2c_client *mxc622x_i2c_client = NULL;
-static struct class* l_dev_class = NULL;
-struct i2c_client *this_client = NULL;
-//////////////////////////////////////////////////////
-struct mx622x_sensordata{
- // for control
- int int_gpio; //0-3
- int op;
- int samp;
- int xyz_axis[3][3]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg;
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- //int offset[3];
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
- s16 offset[3+1]; /*+1: for 4-byte alignment*/
-
-
-};
-
-static struct mx622x_sensordata l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .samp = 16,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .sensor_proc = NULL,
- .isdbg = 0,
- .sensor_samp = 1, // 1 sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- //.offset={0,0,0},
-};
-
-//////////////////////////////////////////////////////
-
-
-static int mxc622x_acc_i2c_read(struct mxc622x_acc_data *acc, u8 * buf, int len)
-{
- int err;
- int tries = 0;
-
- struct i2c_msg msgs[] = {
- {
- .addr = acc->client->addr,
- .flags = acc->client->flags & I2C_M_TEN,
- .len = 1,
- .buf = buf, },
- {
- .addr = acc->client->addr,
- .flags = (acc->client->flags & I2C_M_TEN) | I2C_M_RD,
- .len = len,
- .buf = buf, },
- };
-
- do {
- err = i2c_transfer(acc->client->adapter, msgs, 2);
- if (err != 2)
- msleep_interruptible(I2C_RETRY_DELAY);
- } while ((err != 2) && (++tries < I2C_RETRIES));
-
- if (err != 2) {
- dev_err(&acc->client->dev, "read transfer error\n");
- err = -EIO;
- } else {
- err = 0;
- }
-
- return err;
-}
-
-static int mxc622x_acc_i2c_write(struct mxc622x_acc_data *acc, u8 * buf, int len)
-{
- int err;
- int tries = 0;
-
- struct i2c_msg msgs[] = { { .addr = acc->client->addr,
- .flags = acc->client->flags & I2C_M_TEN,
- .len = len + 1, .buf = buf, }, };
- do {
- err = i2c_transfer(acc->client->adapter, msgs, 1);
- if (err != 1)
- msleep_interruptible(I2C_RETRY_DELAY);
- } while ((err != 1) && (++tries < I2C_RETRIES));
-
- if (err != 1) {
- dev_err(&acc->client->dev, "write transfer error\n");
- err = -EIO;
- } else {
- err = 0;
- }
-
- return err;
-}
-
-static int mxc622x_acc_hw_init(struct mxc622x_acc_data *acc)
-{
- int err = -1;
- u8 buf[7];
-
- printk(KERN_INFO "%s: hw init start\n", MXC622X_ACC_DEV_NAME);
-
- buf[0] = WHO_AM_I;
- err = mxc622x_acc_i2c_read(acc, buf, 1);
- if (err < 0)
- goto error_firstread;
- else
- acc->hw_working = 1;
- if ((buf[0] & 0x3F) != WHOAMI_MXC622X_ACC) {
- err = -1; /* choose the right coded error */
- goto error_unknown_device;
- }
-
- acc->hw_initialized = 1;
- printk(KERN_INFO "%s: hw init done\n", MXC622X_ACC_DEV_NAME);
- return 0;
-
-error_firstread:
- acc->hw_working = 0;
- dev_warn(&acc->client->dev, "Error reading WHO_AM_I: is device "
- "available/working?\n");
- goto error1;
-error_unknown_device:
- dev_err(&acc->client->dev,
- "device unknown. Expected: 0x%x,"
- " Replies: 0x%x\n", WHOAMI_MXC622X_ACC, buf[0]);
-error1:
- acc->hw_initialized = 0;
- dev_err(&acc->client->dev, "hw init error 0x%x,0x%x: %d\n", buf[0],
- buf[1], err);
- return err;
-}
-
-static void mxc622x_acc_device_power_off(struct mxc622x_acc_data *acc)
-{
- int err;
- u8 buf[2] = { MXC622X_REG_CTRL, MXC622X_CTRL_PWRDN };
-
- err = mxc622x_acc_i2c_write(acc, buf, 1);
- if (err < 0)
- dev_err(&acc->client->dev, "soft power off failed: %d\n", err);
-}
-
-static int mxc622x_acc_device_power_on(struct mxc622x_acc_data *acc)
-{
- int err = -1;
- u8 buf[2] = { MXC622X_REG_CTRL, MXC622X_CTRL_PWRON };
-
- err = mxc622x_acc_i2c_write(acc, buf, 1);
- if (err < 0)
- dev_err(&acc->client->dev, "soft power on failed: %d\n", err);
-
- if (!acc->hw_initialized) {
- err = mxc622x_acc_hw_init(acc);
- if (acc->hw_working == 1 && err < 0) {
- mxc622x_acc_device_power_off(acc);
- return err;
- }
- }
-
- return 0;
-}
-
-
-/* */
-
-static int mxc622x_acc_register_write(struct mxc622x_acc_data *acc, u8 *buf,
- u8 reg_address, u8 new_value)
-{
- int err = -1;
-
- if (atomic_read(&acc->enabled)) {
- /* Sets configuration register at reg_address
- * NOTE: this is a straight overwrite */
- buf[0] = reg_address;
- buf[1] = new_value;
- err = mxc622x_acc_i2c_write(acc, buf, 1);
- if (err < 0)
- return err;
- }
- return err;
-}
-
-static int mxc622x_acc_register_read(struct mxc622x_acc_data *acc, u8 *buf,
- u8 reg_address)
-{
-
- int err = -1;
- buf[0] = (reg_address);
- err = mxc622x_acc_i2c_read(acc, buf, 1);
- return err;
-}
-
-static int mxc622x_acc_register_update(struct mxc622x_acc_data *acc, u8 *buf,
- u8 reg_address, u8 mask, u8 new_bit_values)
-{
- int err = -1;
- u8 init_val;
- u8 updated_val;
- err = mxc622x_acc_register_read(acc, buf, reg_address);
- if (!(err < 0)) {
- init_val = buf[1];
- updated_val = ((mask & new_bit_values) | ((~mask) & init_val));
- err = mxc622x_acc_register_write(acc, buf, reg_address,
- updated_val);
- }
- return err;
-}
-
-/* */
-
-static int mxc622x_acc_get_acceleration_data(struct mxc622x_acc_data *acc,
- int *xyz)
-{
- int err = -1;
- /* Data bytes from hardware x, y */
- u8 acc_data[2];
-
- acc_data[0] = MXC622X_REG_DATA;
- err = mxc622x_acc_i2c_read(acc, acc_data, 2);
-
- if (err < 0)
- {
- #ifdef DEBUG
- printk(KERN_INFO "%s I2C read error %d\n", MXC622X_ACC_I2C_NAME, err);
- #endif
- return err;
- }
-
- xyz[0] = (signed char)acc_data[0];
- xyz[1] = (signed char)acc_data[1];
- xyz[2] = 8; //32;
-
- #ifdef MXC622X_DEBUG
- printk("x = %d, y = %d\n", xyz[0], xyz[1]);
- #endif
-
- #ifdef MXC622X_DEBUG
-
- printk(KERN_INFO "%s read x=%d, y=%d, z=%d\n",
- MXC622X_ACC_DEV_NAME, xyz[0], xyz[1], xyz[2]);
- printk(KERN_INFO "%s poll interval %d\n", MXC622X_ACC_DEV_NAME, acc->pdata->poll_interval);
-
- #endif
- return err;
-}
-
-static void mxc622x_acc_report_values(struct mxc622x_acc_data *acc, int *xyz)
-{
- int txyz,tx,ty,tz = 0;
- static int suf=0; // To report every merging value
-
- tx = xyz[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1];
- ty = xyz[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1];
- tz = xyz[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1];
- suf++;
- if (suf > 5)
- {
- suf = 0;
- }
-
- // packet the x,y,z
- txyz = (tx&0x00FF) | ((ty&0xFF)<<8) | ((tz&0xFF)<<16) | ((suf&0xFF)<<24);
- input_report_abs(acc->input_dev, ABS_X, txyz);
- /*input_report_abs(acc->input_dev, ABS_Y, xyz[1]);
- input_report_abs(acc->input_dev, ABS_Z, xyz[2]);*/
- input_sync(acc->input_dev);
-}
-
-static int mxc622x_acc_enable(struct mxc622x_acc_data *acc)
-{
- int err;
-
- if (!atomic_cmpxchg(&acc->enabled, 0, 1)) {
- err = mxc622x_acc_device_power_on(acc);
- if (err < 0) {
- atomic_set(&acc->enabled, 0);
- return err;
- }
-
- schedule_delayed_work(&acc->input_work, msecs_to_jiffies(
- acc->pdata->poll_interval));
- }
-
- return 0;
-}
-
-static int mxc622x_acc_disable(struct mxc622x_acc_data *acc)
-{
- if (atomic_cmpxchg(&acc->enabled, 1, 0)) {
- cancel_delayed_work_sync(&acc->input_work);
- mxc622x_acc_device_power_off(acc);
- }
-
- return 0;
-}
-
-static int mxc622x_acc_misc_open(struct inode *inode, struct file *file)
-{
- int err;
- err = nonseekable_open(inode, file);
- if (err < 0)
- return err;
-
- file->private_data = mxc622x_acc_misc_data;
-
- return 0;
-}
-
-static /*int*/long mxc622x_acc_misc_ioctl(/*struct inode *inode, */struct file *file,
- unsigned int cmd, unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //u8 buf[4];
- //u8 mask;
- //u8 reg_address;
- //u8 bit_values;
- int err;
- int interval;
- int xyz[3] = {0};
- struct mxc622x_acc_data *acc = file->private_data;
- unsigned int uval = 0;
-
-// printk(KERN_INFO "%s: %s call with cmd 0x%x and arg 0x%x\n",
-// MXC622X_ACC_DEV_NAME, __func__, cmd, (unsigned int)arg);
-
- switch (cmd) {
- case MXC622X_ACC_IOCTL_GET_DELAY:
- interval = acc->pdata->poll_interval;
- if (copy_to_user(argp, &interval, sizeof(interval)))
- return -EFAULT;
- break;
-
- //case MXC622X_ACC_IOCTL_SET_DELAY:
- case ECS_IOCTL_APP_SET_DELAY:
- if (copy_from_user(&interval, argp, sizeof(interval)))
- return -EFAULT;
- if (interval < 0 || interval > 1000)
- return -EINVAL;
- //if(interval > MAX_INTERVAL)
- //interval = MAX_INTERVAL;
- acc->pdata->poll_interval = max(interval,
- acc->pdata->min_interval);
- break;
-
- //case MXC622X_ACC_IOCTL_SET_ENABLE:
- case ECS_IOCTL_APP_SET_AFLAG:
- if (copy_from_user(&interval, argp, sizeof(interval)))
- return -EFAULT;
- if (interval > 1)
- return -EINVAL;
- if (interval)
- err = mxc622x_acc_enable(acc);
- else
- err = mxc622x_acc_disable(acc);
- return err;
- break;
-
- case MXC622X_ACC_IOCTL_GET_ENABLE:
- interval = atomic_read(&acc->enabled);
- if (copy_to_user(argp, &interval, sizeof(interval)))
- return -EINVAL;
- break;
- case MXC622X_ACC_IOCTL_GET_COOR_XYZ:
- err = mxc622x_acc_get_acceleration_data(acc, xyz);
- if (err < 0)
- return err;
- #ifdef DEBUG
- // printk(KERN_ALERT "%s Get coordinate xyz:[%d, %d, %d]\n",
- // __func__, xyz[0], xyz[1], xyz[2]);
- #endif
- if (copy_to_user(argp, xyz, sizeof(xyz))) {
- printk(KERN_ERR " %s %d error in copy_to_user \n",
- __func__, __LINE__);
- return -EINVAL;
- }
- break;
- case MXC622X_ACC_IOCTL_GET_CHIP_ID:
- {
- u8 devid = 0;
- u8 devinfo[DEVICE_INFO_LEN] = {0};
- err = mxc622x_acc_register_read(acc, &devid, WHO_AM_I);
- if (err < 0) {
- printk("%s, error read register WHO_AM_I\n", __func__);
- return -EAGAIN;
- }
- sprintf(devinfo, "%s, %#x", DEVICE_INFO, devid);
-
- if (copy_to_user(argp, devinfo, sizeof(devinfo))) {
- printk("%s error in copy_to_user(IOCTL_GET_CHIP_ID)\n", __func__);
- return -EINVAL;
- }
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
- uval = MXC622X_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("mxc622x_driver_id:%d\n",uval);
- break;
-
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int mxc622x_acc_misc_close(struct inode *inode, struct file *filp)
-{
- return 0;
-}
-
-
-static const struct file_operations mxc622x_acc_misc_fops = {
- .owner = THIS_MODULE,
- .open = mxc622x_acc_misc_open,
- .unlocked_ioctl = mxc622x_acc_misc_ioctl,
- .release = mxc622x_acc_misc_close,
-};
-
-static struct miscdevice mxc622x_acc_misc_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = GSENSOR_DEV_NODE,//MXC622X_ACC_DEV_NAME,
- .fops = &mxc622x_acc_misc_fops,
-};
-
-static void mxc622x_acc_input_work_func(struct work_struct *work)
-{
- struct mxc622x_acc_data *acc;
-
- int xyz[3] = { 0 };
- int err;
-
- acc = mxc622x_acc_misc_data; /*container_of((struct delayed_work *)work,
- struct mxc622x_acc_data, input_work); */
-
- mutex_lock(&acc->lock);
- err = mxc622x_acc_get_acceleration_data(acc, xyz);
- if (err < 0)
- dev_err(&acc->client->dev, "get_acceleration_data failed\n");
- else
- mxc622x_acc_report_values(acc, xyz);
-
- schedule_delayed_work(&acc->input_work, msecs_to_jiffies(
- acc->pdata->poll_interval));
- mutex_unlock(&acc->lock);
-}
-
-#ifdef MXC622X_OPEN_ENABLE
-int mxc622x_acc_input_open(struct input_dev *input)
-{
- struct mxc622x_acc_data *acc = input_get_drvdata(input);
-
- return mxc622x_acc_enable(acc);
-}
-
-void mxc622x_acc_input_close(struct input_dev *dev)
-{
- struct mxc622x_acc_data *acc = input_get_drvdata(dev);
-
- mxc622x_acc_disable(acc);
-}
-#endif
-
-static int mxc622x_acc_validate_pdata(struct mxc622x_acc_data *acc)
-{
- acc->pdata->poll_interval = max(acc->pdata->poll_interval,
- acc->pdata->min_interval);
-
- /* Enforce minimum polling interval */
- if (acc->pdata->poll_interval < acc->pdata->min_interval) {
- dev_err(&acc->client->dev, "minimum poll interval violated\n");
- return -EINVAL;
- }
-
- return 0;
-}
-
-static int mxc622x_acc_input_init(struct mxc622x_acc_data *acc)
-{
- int err;
- // Polling rx data when the interrupt is not used.
- if (1/*acc->irq1 == 0 && acc->irq1 == 0*/) {
- INIT_DELAYED_WORK(&acc->input_work, mxc622x_acc_input_work_func);
- }
-
- acc->input_dev = input_allocate_device();
- if (!acc->input_dev) {
- err = -ENOMEM;
- dev_err(&acc->client->dev, "input device allocate failed\n");
- goto err0;
- }
-
-#ifdef MXC622X_ACC_OPEN_ENABLE
- acc->input_dev->open = mxc622x_acc_input_open;
- acc->input_dev->close = mxc622x_acc_input_close;
-#endif
-
- input_set_drvdata(acc->input_dev, acc);
-
- set_bit(EV_ABS, acc->input_dev->evbit);
-
- input_set_abs_params(acc->input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(acc->input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT);
- input_set_abs_params(acc->input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT);
-
- acc->input_dev->name = GSENSOR_INPUT_NAME;//MXC622X_ACC_INPUT_NAME;
-
- err = input_register_device(acc->input_dev);
- if (err) {
- dev_err(&acc->client->dev,
- "unable to register input polled device %s\n",
- acc->input_dev->name);
- goto err1;
- }
-
- return 0;
-
-err1:
- input_free_device(acc->input_dev);
-err0:
- return err;
-}
-
-static void mxc622x_acc_input_cleanup(struct mxc622x_acc_data *acc)
-{
- input_unregister_device(acc->input_dev);
- input_free_device(acc->input_dev);
-}
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void mxc622x_early_suspend (struct early_suspend* es);
-static void mxc622x_early_resume (struct early_suspend* es);
-#endif
-
-static int is_mxc622x(struct i2c_client *client)
-{
- int tempvalue;
-
- /* read chip id */
- tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I);
- if ((tempvalue & 0x003F) == WHOAMI_MXC622X_ACC) {
- //printk(KERN_INFO "%s I2C driver registered!\n",
- // MXC622X_ACC_DEV_NAME);
- return 1;
- }
- return 0;
-}
-
-static int mxc622x_acc_probe(struct i2c_client *client)
-{
-
- struct mxc622x_acc_data *acc;
-
- int err = -1;
- int tempvalue;
-
- pr_info("%s: probe start.\n", MXC622X_ACC_DEV_NAME);
-
- /*if (client->dev.platform_data == NULL) {
- dev_err(&client->dev, "platform data is NULL. exiting.\n");
- err = -ENODEV;
- goto exit_check_functionality_failed;
- }*/
-
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
- dev_err(&client->dev, "client not i2c capable\n");
- err = -ENODEV;
- goto exit_check_functionality_failed;
- }
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_BYTE |
- I2C_FUNC_SMBUS_BYTE_DATA |
- I2C_FUNC_SMBUS_WORD_DATA)) {
- dev_err(&client->dev, "client not smb-i2c capable:2\n");
- err = -EIO;
- goto exit_check_functionality_failed;
- }
-
-
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_I2C_BLOCK)){
- dev_err(&client->dev, "client not smb-i2c capable:3\n");
- err = -EIO;
- goto exit_check_functionality_failed;
- }
- /*
- * OK. From now, we presume we have a valid client. We now create the
- * client structure, even though we cannot fill it completely yet.
- */
-
- acc = kzalloc(sizeof(struct mxc622x_acc_data), GFP_KERNEL);
- if (acc == NULL) {
- err = -ENOMEM;
- dev_err(&client->dev,
- "failed to allocate memory for module data: "
- "%d\n", err);
- goto exit_alloc_data_failed;
- }
-
- mutex_init(&acc->lock);
- mutex_lock(&acc->lock);
-
- acc->client = client;
- mxc622x_i2c_client = client;
- i2c_set_clientdata(client, acc);
-
- /* read chip id */
- tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I);
-
- if ((tempvalue & 0x003F) == WHOAMI_MXC622X_ACC) {
- printk(KERN_INFO "%s I2C driver registered!\n",
- MXC622X_ACC_DEV_NAME);
- } else {
- acc->client = NULL;
- printk(KERN_INFO "I2C driver not registered!"
- " Device unknown 0x%x\n", tempvalue);
- goto err_mutexunlockfreedata;
- }
- acc->pdata = kzalloc(sizeof(struct mxc622x_acc_platform_data), GFP_KERNEL);
- if (acc->pdata == NULL) {
- err = -ENOMEM;
- dev_err(&client->dev,
- "failed to allocate memory for pdata: %d\n",
- err);
- goto exit_kfree_pdata;
- }
-
- //memcpy(acc->pdata, client->dev.platform_data, sizeof(*acc->pdata));
- acc->pdata->poll_interval = 20;
- acc->pdata->min_interval = 10;
-
- err = mxc622x_acc_validate_pdata(acc);
- if (err < 0) {
- dev_err(&client->dev, "failed to validate platform data\n");
- goto exit_kfree_pdata;
- }
-
- i2c_set_clientdata(client, acc);
-
-
- /*if (acc->pdata->init) {
- err = acc->pdata->init();
- if (err < 0) {
- dev_err(&client->dev, "init failed: %d\n", err);
- goto err2;
- }
- }*/
-
- err = mxc622x_acc_device_power_on(acc);
- if (err < 0) {
- dev_err(&client->dev, "power on failed: %d\n", err);
- goto err2;
- }
-
- atomic_set(&acc->enabled, 1);
-
- err = mxc622x_acc_input_init(acc);
- if (err < 0) {
- dev_err(&client->dev, "input init failed\n");
- goto err_power_off;
- }
- mxc622x_acc_misc_data = acc;
-
- err = misc_register(&mxc622x_acc_misc_device);
- if (err < 0) {
- dev_err(&client->dev,
- "misc MXC622X_ACC_DEV_NAME register failed\n");
- goto err_input_cleanup;
- }
-
- mxc622x_acc_device_power_off(acc);
-
- /* As default, do not report information */
- atomic_set(&acc->enabled, 0);
-
- acc->on_before_suspend = 0;
-
- #ifdef CONFIG_HAS_EARLYSUSPEND
- acc->early_suspend.suspend = mxc622x_early_suspend;
- acc->early_suspend.resume = mxc622x_early_resume;
- acc->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN;
- register_early_suspend(&acc->early_suspend);
-#endif
-
- mutex_unlock(&acc->lock);
-
- dev_info(&client->dev, "%s: probed\n", MXC622X_ACC_DEV_NAME);
-
- return 0;
-
-err_input_cleanup:
- mxc622x_acc_input_cleanup(acc);
-err_power_off:
- mxc622x_acc_device_power_off(acc);
-err2:
- if (acc->pdata->exit) acc->pdata->exit();
-exit_kfree_pdata:
- kfree(acc->pdata);
-err_mutexunlockfreedata:
- kfree(acc);
- mutex_unlock(&acc->lock);
- i2c_set_clientdata(client, NULL);
- mxc622x_acc_misc_data = NULL;
-exit_alloc_data_failed:
-exit_check_functionality_failed:
- printk(KERN_ERR "%s: Driver Init failed\n", MXC622X_ACC_DEV_NAME);
- return err;
-}
-
-static int __devexit mxc622x_acc_remove(struct i2c_client *client)
-{
- /* TODO: revisit ordering here once _probe order is finalized */
- struct mxc622x_acc_data *acc = mxc622x_acc_misc_data;//i2c_get_clientdata(client);
-
- misc_deregister(&mxc622x_acc_misc_device);
- mxc622x_acc_input_cleanup(acc);
- mxc622x_acc_device_power_off(acc);
- if (acc->pdata->exit)
- acc->pdata->exit();
- kfree(acc->pdata);
- kfree(acc);
-
- return 0;
-}
-
-static int mxc622x_acc_resume(struct platform_device *pdev)
-{
- struct mxc622x_acc_data *acc = mxc622x_acc_misc_data;
-
- if (acc != NULL && acc->on_before_suspend) {
- acc->on_before_suspend = 0;
- acc->hw_initialized = 0;
- return mxc622x_acc_enable(acc);
- }
- return 0;
-}
-
-static int mxc622x_acc_suspend(struct platform_device *pdev, pm_message_t state)
-{
- struct mxc622x_acc_data *acc = mxc622x_acc_misc_data;
- if (acc != NULL) {
- if (atomic_read(&acc->enabled)) {
- acc->on_before_suspend = 1;
- return mxc622x_acc_disable(acc);
- }
- }
- return 0;
-}
-
-static int mxc622x_probe(struct platform_device *pdev)
-{
- return 0;
-}
-
-static int mxc622x_remove(struct platform_device *pdev)
-{
- return 0;
-}
-
-static struct platform_driver mxc622x_driver = {
- .probe = mxc622x_probe,
- .remove = mxc622x_remove,
- .suspend = mxc622x_acc_suspend,
- .resume = mxc622x_acc_resume,
- .driver = {
- .name = GSENSOR_I2C_NAME,
- },
-};
-
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-
-static void mxc622x_early_suspend (struct early_suspend* es)
-{
- struct mxc622x_acc_data *acc = mxc622x_acc_misc_data; //i2c_get_clientdata(client);
-#ifdef MXC622X_DEBUG
- printk("%s.\n", __func__);
-#endif
- if (acc != NULL) {
- if (atomic_read(&acc->enabled)) {
- acc->on_before_suspend = 1;
- return mxc622x_acc_disable(acc);
- }
- }
-}
-
-static void mxc622x_early_resume (struct early_suspend* es)
-{
- struct mxc622x_acc_data *acc = mxc622x_acc_misc_data; //i2c_get_clientdata(client);
-#ifdef MXC622X_DEBUG
- printk("%s.\n", __func__);
-#endif
-
- if (acc != NULL && acc->on_before_suspend) {
- acc->on_before_suspend = 0;
- acc->hw_initialized = 0;
- return mxc622x_acc_enable(acc);
- }
-
-}
-
-#endif /* CONFIG_HAS_EARLYSUSPEND */
-
-static const struct i2c_device_id mxc622x_acc_id[]
- = { { MXC622X_ACC_DEV_NAME, 0 }, { }, };
-
-MODULE_DEVICE_TABLE(i2c, mxc622x_acc_id);
-
-#if 0
-static struct i2c_driver mxc622x_acc_driver = {
- .driver = {
- .name = MXC622X_ACC_I2C_NAME,
- },
- .probe = mxc622x_acc_probe,
- .remove = __devexit_p(mxc622x_acc_remove),
- .resume = mxc622x_acc_resume,
- .suspend = mxc622x_acc_suspend,
- .id_table = mxc622x_acc_id,
-};
-#endif
-
-#ifdef I2C_BUS_NUM_STATIC_ALLOC
-
-int i2c_static_add_device(struct i2c_board_info *info)
-{
- struct i2c_adapter *adapter;
- struct i2c_client *client;
- int err;
-
- adapter = i2c_get_adapter(I2C_STATIC_BUS_NUM);
- if (!adapter) {
- pr_err("%s: can't get i2c adapter\n", __FUNCTION__);
- err = -ENODEV;
- goto i2c_err;
- }
-
- client = i2c_new_device(adapter, info);
- if (!client) {
- pr_err("%s: can't add i2c device at 0x%x\n",
- __FUNCTION__, (unsigned int)info->addr);
- err = -ENODEV;
- goto i2c_err;
- }
-
- i2c_put_adapter(adapter);
-
- return 0;
-
-i2c_err:
- return err;
-}
-
-#endif /*I2C_BUS_NUM_STATIC_ALLOC*/
-
-static void mxc622x_platform_release(struct device *device)
-{
- dbg("...\n");
- return;
-}
-
-
-static struct platform_device mxc622x_device = {
- .name = GSENSOR_I2C_NAME,
- .id = 0,
- .dev = {
- .release = mxc622x_platform_release,
- },
-};
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void* param)
-{
- char varbuf[64];
- int n;
- int varlen;
-
- int tmp_offset[3] = {0};
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.mxc622xsensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &l_sensorconfig.int_gpio,
- &l_sensorconfig.samp,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &tmp_offset[0],
- &tmp_offset[1],
- &tmp_offset[2]
- );
- if (n != 12) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
- l_sensorconfig.offset[0] = tmp_offset[0];
- l_sensorconfig.offset[1] = tmp_offset[1];
- l_sensorconfig.offset[2] = tmp_offset[2];
- l_sensorconfig.sensor_samp = l_sensorconfig.samp;
-
- dbg("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.int_gpio,
- l_sensorconfig.samp,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-
-static int __init mxc622x_acc_init(void)
-{
- int ret = 0;
-
- printk(KERN_INFO "%s accelerometer driver: init\n",
- MXC622X_ACC_I2C_NAME);
- ret = get_axisset(NULL);
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
-
- if (!(this_client = sensor_i2c_register_device(0, GSENSOR_I2C_ADDR, GSENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if(!is_mxc622x(this_client))
- {
- dbg("isn't mxc622x gsensor!\n");
- return -1;
- }
- // parse g-sensor u-boot arg
-
- /*if (ret)
- {
- errlog("only for test!\n");
- return -1;
- }*/
-#ifdef I2C_BUS_NUM_STATIC_ALLOC
- ret = i2c_static_add_device(&mxc622x_i2c_boardinfo);
- if (ret < 0) {
- pr_err("%s: add i2c device error %d\n", __FUNCTION__, ret);
- goto init_err;
- }
-#endif
- ret = mxc622x_acc_probe(this_client);
- if (ret)
- {
- sensor_i2c_unregister_device(this_client);
- return -1;
- }
- // create the platform device
- l_dev_class = class_create(THIS_MODULE, GSENSOR_I2C_NAME);
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
- if((ret = platform_device_register(&mxc622x_device)))
- {
- klog("Can't register mc3230 platform devcie!!!\n");
- return ret;
- }
- if ((ret = platform_driver_register(&mxc622x_driver)) != 0)
- {
- errlog("Can't register mc3230 platform driver!!!\n");
- return ret;
- }
-
- //return i2c_add_driver(&mxc622x_acc_driver);
-
-init_err:
- return ret;
-}
-
-static void __exit mxc622x_acc_exit(void)
-{
- //printk(KERN_INFO "%s accelerometer driver exit\n", MXC622X_ACC_DEV_NAME);
-
- platform_driver_unregister(&mxc622x_driver);
- platform_device_unregister(&mxc622x_device);
- class_destroy(l_dev_class);
- mxc622x_acc_remove(mxc622x_i2c_client);
- sensor_i2c_unregister_device(this_client);
- #ifdef I2C_BUS_NUM_STATIC_ALLOC
- i2c_unregister_device(mxc622x_i2c_client);
- #endif
-
- //i2c_del_driver(&mxc622x_acc_driver);
- return;
-}
-
-module_init(mxc622x_acc_init);
-module_exit(mxc622x_acc_exit);
-
-MODULE_DESCRIPTION("mxc622x accelerometer misc driver");
-MODULE_AUTHOR("Memsic");
-MODULE_LICENSE("GPL");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.h b/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.h
deleted file mode 100755
index 2b83bb7b..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/mxc622x_gsensor/mxc622x.h
+++ /dev/null
@@ -1,83 +0,0 @@
-
-/******************** (C) COPYRIGHT 2010 STMicroelectronics ********************
-*
-* File Name : mxc622x.h
-* Authors : MH - C&I BU - Application Team
-*
-********************************************************************************
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License version 2 as
-* published by the Free Software Foundation.
-*
-* THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES
-* OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE
-* PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT.
-* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
-* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
-* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
-* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
-*
-* THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
-*
-*******************************************************************************/
-
-
-#ifndef __MXC622X_H__
-#define __MXC622X_H__
-
-#include <linux/ioctl.h> /* For IOCTL macros */
-#include <linux/input.h>
-
-#ifndef DEBUG
-#define DEBUG
-#endif
-
-#define GSENSOR_I2C_NAME "mxc622x"
-#define GSENSOR_I2C_ADDR 0x15
-
-#define MXC622X_ACC_IOCTL_BASE 77
-/** The following define the IOCTL command values via the ioctl macros */
-#define MXC622X_ACC_IOCTL_SET_DELAY _IOW(MXC622X_ACC_IOCTL_BASE, 0, int)
-#define MXC622X_ACC_IOCTL_GET_DELAY _IOR(MXC622X_ACC_IOCTL_BASE, 1, int)
-#define MXC622X_ACC_IOCTL_SET_ENABLE _IOW(MXC622X_ACC_IOCTL_BASE, 2, int)
-#define MXC622X_ACC_IOCTL_GET_ENABLE _IOR(MXC622X_ACC_IOCTL_BASE, 3, int)
-#define MXC622X_ACC_IOCTL_GET_COOR_XYZ _IOW(MXC622X_ACC_IOCTL_BASE, 22, int)
-#define MXC622X_ACC_IOCTL_GET_CHIP_ID _IOR(MXC622X_ACC_IOCTL_BASE, 255, char[32])
-
-/************************************************/
-/* Accelerometer defines section */
-/************************************************/
-#define MXC622X_ACC_DEV_NAME "mxc622x"
-#define MXC622X_ACC_INPUT_NAME "accelerometer"
-#define MXC622X_ACC_I2C_ADDR 0x15
-#define MXC622X_ACC_I2C_NAME MXC622X_ACC_DEV_NAME
-
-/* MXC622X register address */
-#define MXC622X_REG_CTRL 0x04
-#define MXC622X_REG_DATA 0x00
-
-/* MXC622X control bit */
-#define MXC622X_CTRL_PWRON 0x00 /* power on */
-#define MXC622X_CTRL_PWRDN 0x80 /* power donw */
-
-//#if defined(CONFIG_MACH_SP6810A)
-//#define I2C_BUS_NUM_STATIC_ALLOC
-#define I2C_STATIC_BUS_NUM ( 0) // Need to be modified according to actual setting
-//#endif
-
-struct mxc622x_acc_platform_data {
- int poll_interval;
- int min_interval;
-
- int (*init)(void);
- void (*exit)(void);
- int (*power_on)(void);
- int (*power_off)(void);
-
-};
-
-#endif /* __MXC622X_H__ */
-
-
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/sensor.c b/ANDROID_3.4.5/drivers/input/sensor/sensor.c
deleted file mode 100755
index 5a82a9fb..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/sensor.c
+++ /dev/null
@@ -1,114 +0,0 @@
-#include <linux/i2c.h>
-#include <linux/export.h>
-//#include <linux/mutex.h>
-#include "sensor.h"
-//DEFINE_MUTEX(mutex_client);
-//static struct i2c_client *sensor_client=NULL;
-struct i2c_client *sensor_i2c_register_device(int bus_no, int client_addr, const char *client_name)
-{
- struct i2c_adapter *adapter = NULL;
- struct i2c_client *sensor_client=NULL;
-
- struct i2c_board_info sensor_i2c_board_info = {
- .type = "unused",
- .flags = 0x00,
- .addr = 0xff,
- .platform_data = NULL,
- .archdata = NULL,
- .irq = -1,
- };
-
- if ((bus_no<0) || (client_addr>0x7f) || (client_addr<0)|| (!client_name))
- {
- printk(KERN_ERR "%s param error! pls check out!\n", __FUNCTION__);
- return NULL;
- }
- printk(KERN_INFO "%s busno %d client_addr 0x%x client_name %s \n", __FUNCTION__, \
- bus_no, client_addr, client_name);
-
- sensor_i2c_board_info.addr = client_addr;
- //sensor_i2c_board_info.type = client_name;
- strcpy(sensor_i2c_board_info.type, client_name);
-
- adapter = i2c_get_adapter(bus_no);/*in bus NR*/
-
- if (NULL == adapter) {
- printk("can not get i2c adapter, client address error\n");
- return NULL;
- }
-
- //mutex_lock(&mutex_client);
- sensor_client = i2c_new_device(adapter, &sensor_i2c_board_info);
-
-
- if (sensor_client == NULL) {
- printk("allocate i2c client failed\n");
- //mutex_unlock(&mutex_client);
- return NULL;
- }
- i2c_put_adapter(adapter);
- //mutex_unlock(&mutex_client);
-
- return sensor_client;
-}
-EXPORT_SYMBOL(sensor_i2c_register_device);
-
-struct i2c_client *sensor_i2c_register_device2(int bus_no, int client_addr, const char *client_name,void *pdata)
-{
- struct i2c_adapter *adapter = NULL;
- struct i2c_client *sensor_client=NULL;
-
- struct i2c_board_info sensor_i2c_board_info = {
- .type = "unused",
- .flags = 0x00,
- .addr = 0xff,
- .platform_data = NULL,
- .archdata = NULL,
- .irq = -1,
- };
-
- if ((bus_no<0) || (client_addr>0x7f) || (client_addr<0)|| (!client_name))
- {
- printk(KERN_ERR "%s param error! pls check out!\n", __FUNCTION__);
- return NULL;
- }
- printk(KERN_INFO "%s busno %d client_addr 0x%x client_name %s \n", __FUNCTION__, \
- bus_no, client_addr, client_name);
-
- sensor_i2c_board_info.addr = client_addr;
- sensor_i2c_board_info.platform_data = pdata;
- //sensor_i2c_board_info.type = client_name;
- strcpy(sensor_i2c_board_info.type, client_name);
-
- adapter = i2c_get_adapter(bus_no);/*in bus NR*/
-
- if (NULL == adapter) {
- printk("can not get i2c adapter, client address error\n");
- return NULL;
- }
-
- //mutex_lock(&mutex_client);
- sensor_client = i2c_new_device(adapter, &sensor_i2c_board_info);
-
-
- if (sensor_client == NULL) {
- printk("allocate i2c client failed\n");
- //mutex_unlock(&mutex_client);
- return NULL;
- }
- i2c_put_adapter(adapter);
- //mutex_unlock(&mutex_client);
-
- return sensor_client;
-}
-EXPORT_SYMBOL(sensor_i2c_register_device2);
-
-void sensor_i2c_unregister_device(struct i2c_client *client)
-{
- if (client != NULL)
- {
- i2c_unregister_device(client);
- }
-}
-EXPORT_SYMBOL(sensor_i2c_unregister_device);
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/sensor.h b/ANDROID_3.4.5/drivers/input/sensor/sensor.h
deleted file mode 100755
index 9a51433d..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/sensor.h
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef __SENSOR_H__
-#define __SENSOR_H__
-#include <linux/i2c.h>
-#include <linux/i2c-dev.h>
-#include <linux/proc_fs.h>
-#include <linux/input.h>
-#include <linux/delay.h>
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-#include <linux/earlysuspend.h>
-#endif
-
-
-//#define GSENSOR_I2C_NAME "unused"
-//#define GSENSOR_I2C_ADDR 0xff
-
-
-#define GSENSOR_PROC_NAME "gsensor_config"
-#define GSENSOR_INPUT_NAME "g-sensor"
-#define GSENSOR_DEV_NODE "sensor_ctrl"
-
-#define SENSOR_PROC_NAME "lsensor_config"
-#define SENSOR_INPUT_NAME "l-sensor"
-#define SENSOR_DEV_NODE "lsensor_ctrl"
-
-#undef dbg
-#define dbg(fmt, args...) if (l_sensorconfig.isdbg) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-enum gsensor_id
-{
- MMA7660_DRVID = 0,
- MC3230_DRVID ,
- DMARD08_DRVID ,
- DMARD06_DRVID ,
- DMARD10_DRVID ,
- MXC622X_DRVID ,
- MMA8452Q_DRVID ,
- STK8312_DRVID ,
- KIONIX_DRVID,
- DMARD09_DRVID ,
- //add new gsensor id here, must be in order
-};
-
-#define ISL29023_DRVID 0
-
-struct wmt_gsensor_data{
- // for control
- int int_gpio; //0-3
- int op;
- int samp;
- int xyz_axis[3][2]; // (axis,direction)
- struct proc_dir_entry* sensor_proc;
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg;
- int sensor_samp; //
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- int offset[3];
- struct i2c_client *client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-
-///////////////////////// ioctrl cmd ////////////////////////
-#define WMTGSENSOR_IOCTL_MAGIC 0x09
-#define WMT_IOCTL_SENSOR_CAL_OFFSET _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x01, int) //offset calibration
-#define ECS_IOCTL_APP_SET_AFLAG _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x02, short)
-#define ECS_IOCTL_APP_SET_DELAY _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x03, short)
-#define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
-#define WMT_IOCTL_SENOR_GET_RESOLUTION _IOR(WMTGSENSOR_IOCTL_MAGIC, 0x05, short)
-
-#define WMT_LSENSOR_IOCTL_MAGIC 0x10
-#define LIGHT_IOCTL_SET_ENABLE _IOW(WMT_LSENSOR_IOCTL_MAGIC, 0x01, short)
-
-/* Function prototypes */
-extern struct i2c_client *sensor_i2c_register_device (int bus_no, int client_addr, const char *client_name);
-extern struct i2c_client *sensor_i2c_register_device2(int bus_no, int client_addr, const char *client_name,void *pdata);
-extern void sensor_i2c_unregister_device(struct i2c_client *client);
-
-
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk3310/Makefile b/ANDROID_3.4.5/drivers/input/sensor/stk3310/Makefile
deleted file mode 100755
index 19a79f84..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk3310/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_lsensor_stk3310
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := stk3310.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c b/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c
deleted file mode 100755
index 4e9fde10..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk3310/stk3310.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- * stk3310.c - stk3310 ALS & Proximity Driver
- *
- * By Intersil Corp
- * Michael DiGioia
- *
- * Based on isl29011.c
- * by Mike DiGioia <mdigioia@intersil.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/hwmon.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/sysfs.h>
-#include <linux/pm_runtime.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-//#include <linux/earlysuspend.h>
-#include <linux/platform_device.h>
-#include "../sensor.h"
-#define SENSOR_I2C_NAME "stk3310"
-#define SENSOR_I2C_ADDR 0x48
-
-#undef dbg
-#define dbg(fmt, args...)
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-/* Insmod parameters */
-//I2C_CLIENT_INSMOD_1(stk3310);
-
-#define MODULE_NAME "stk3310"
-
-
-struct stk_device {
- struct input_polled_dev* input_poll_devl;
- struct input_polled_dev* input_poll_devp;
- struct i2c_client* client;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
-
-};
-
-static struct stk_device* l_sensorconfig = NULL;
-static int l_enable = 1; // 0:don't report data
-static int p_enable = 1; // 0:don't report data
-
-static struct i2c_client *this_client = NULL;
-
-static DEFINE_MUTEX(mutex);
-
-static int isl_get_lux_datal(struct i2c_client* client)
-{
- __u16 resH, resL;
- resL = i2c_smbus_read_byte_data(client, 0x14);
- resH = i2c_smbus_read_byte_data(client, 0x13);
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
- return -1;
- }
- return (resH <<8 | resL) ;//* idev->range / idev->resolution;
-}
-
-
-static int isl_get_lux_datap(struct i2c_client* client)
-{
- __u16 resH, resL;
- resL = i2c_smbus_read_byte_data(client, 0x12);
- resH = i2c_smbus_read_byte_data(client, 0x11);
- if ((resL < 0) || (resH < 0))
- {
- errlog("Error to read lux_data!\n");
- return -1;
- }
- //return (resH <<8 | resL) ;//* idev->range / idev->resolution;
- if(resH>0)
- return 0;
- else
- return 6;
-}
-
-//#define PXM 0
-static int isl_set_default_config(struct i2c_client *client)
-{
- int ret=0;
- unsigned char regval;
-//#if PXM
- ret = i2c_smbus_write_byte_data(client, 0, (1 << 1));
- if(p_enable)
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval |= (1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- //ret = i2c_smbus_write_byte_data(client, 0, (1 << 0));
-//#else
-//#endif
- if (ret < 0)
- return -EINVAL;
- return 0;
-}
-
-/* Return 0 if detection is successful, -ENODEV otherwise */
-static int stk3310_detect(struct i2c_client *client/*, int kind,
- struct i2c_board_info *info*/)
-{
- int device;
-
- device= i2c_smbus_read_byte_data(client, 0x3e);
- if(0x13==device)
- {
- printk(KERN_ALERT "stk3310 detected OK\n");
- return 0;
- }
- else
- return -1;
-}
-
-int isl_input_open(struct input_dev* input)
-{
- return 0;
-}
-
-void isl_input_close(struct input_dev* input)
-{
-}
-
-static void isl_input_lux_poll_l(struct input_polled_dev *dev)
-{
- struct stk_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devl->input;
- struct i2c_client* client = idev->client;
- if (l_enable != 0)
- {
- mutex_lock(&mutex);
- //printk(KERN_ALERT "by flashchen val is %x",val);
- input_report_abs(input, ABS_MISC, isl_get_lux_datal(client));
- input_sync(input);
- mutex_unlock(&mutex);
- }
-}
-
-static void isl_input_lux_poll_p(struct input_polled_dev *dev)
-{
- struct stk_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devp->input;
- struct i2c_client* client = idev->client;
- if (p_enable != 0)
- {
- mutex_lock(&mutex);
- //printk(KERN_ALERT "by flashchen val is %x",val);
- input_report_abs(input, ABS_MISC, isl_get_lux_datap(client));
- input_sync(input);
- mutex_unlock(&mutex);
- }
-}
-
-static struct i2c_device_id stk3310_id[] = {
- {"stk3310", 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, stk3310_id);
-
-
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the l-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the l-sensor node...\n");
- return 0;
-}
-
-static ssize_t mmadl_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_datal(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-
-static ssize_t mmadp_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- mutex_lock(&mutex);
- lux_data = isl_get_lux_datap(l_sensorconfig->client);
- mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-static long
-mmadl_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- l_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("stk3310_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static long
-mmadp_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
- unsigned char regval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- p_enable = enable;
- if(p_enable)
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval |= (1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- else
- {
- regval = i2c_smbus_read_byte_data(l_sensorconfig->client, 0);
- regval &= ~(1 << 0);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("stk3310_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static struct file_operations mmadl_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadl_read,
- .unlocked_ioctl = mmadl_ioctl,
-};
-
-static struct miscdevice mmadl_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "lsensor_ctrl",
- .fops = &mmadl_fops,
-};
-
-static struct file_operations mmadp_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadp_read,
- .unlocked_ioctl = mmadp_ioctl,
-};
-
-static struct miscdevice mmadp_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "psensor_ctrl",
- .fops = &mmadp_fops,
-};
-#if 0
-static void stk3310_early_suspend(struct early_suspend *h)
-{
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, ISL_MOD_POWERDOWN);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-static void stk3310_late_resume(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, last_mod);
- isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-#endif
-
-static int
-stk3310_probe(struct i2c_client *client/*, const struct i2c_device_id *id*/)
-{
- int res=0;
-
- struct stk_device* idev = kzalloc(sizeof(struct stk_device), GFP_KERNEL);
- if(!idev)
- return -ENOMEM;
-
- l_sensorconfig = idev;
-
-/* last mod is ALS continuous */
- //pm_runtime_enable(&client->dev);
- idev->input_poll_devl = input_allocate_polled_device();
- if(!idev->input_poll_devl)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->input_poll_devp = input_allocate_polled_device();
- if(!idev->input_poll_devp)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->client = client;
-
- idev->input_poll_devl->private = idev;
- idev->input_poll_devl->poll = isl_input_lux_poll_l;
- idev->input_poll_devl->poll_interval = 100;//50;
- idev->input_poll_devl->input->open = isl_input_open;
- idev->input_poll_devl->input->close = isl_input_close;
- idev->input_poll_devl->input->name = "lsensor_lux";
- idev->input_poll_devl->input->id.bustype = BUS_I2C;
- idev->input_poll_devl->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devl->input, idev);
- input_set_capability(idev->input_poll_devl->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devl->input, ABS_MISC, 0, 16000, 0, 0);
-
- idev->input_poll_devp->private = idev;
- idev->input_poll_devp->poll = isl_input_lux_poll_p;
- idev->input_poll_devp->poll_interval = 100;//50;
- idev->input_poll_devp->input->open = isl_input_open;
- idev->input_poll_devp->input->close = isl_input_close;
- idev->input_poll_devp->input->name = "psensor_lux";
- idev->input_poll_devp->input->id.bustype = BUS_I2C;
- idev->input_poll_devp->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devp->input, idev);
- input_set_capability(idev->input_poll_devp->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devp->input, ABS_MISC, 0, 16000, 0, 0);
- i2c_set_clientdata(client, idev);
- /* set default config after set_clientdata */
- res = isl_set_default_config(client);
- res = misc_register(&mmadl_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerl;
- }
- res = misc_register(&mmadp_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerp;
- }
- res = input_register_polled_device(idev->input_poll_devl);
- if(res < 0)
- goto err_input_register_devicel;
- res = input_register_polled_device(idev->input_poll_devp);
- if(res < 0)
- goto err_input_register_devicep;
- // suspend/resume register
-#ifdef CONFIG_HAS_EARLYSUSPEND
- idev->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- idev->earlysuspend.suspend = stk3310_early_suspend;
- idev->earlysuspend.resume = stk3310_late_resume;
- register_early_suspend(&(idev->earlysuspend));
-#endif
-
- dbg("stk3310 probe succeed!\n");
- return 0;
-err_input_register_devicep:
- input_free_polled_device(idev->input_poll_devp);
-err_input_register_devicel:
- input_free_polled_device(idev->input_poll_devl);
-err_misc_registerp:
- misc_deregister(&mmadp_device);
-err_misc_registerl:
- misc_deregister(&mmadl_device);
-err_input_allocate_device:
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- return res;
-}
-
-static int stk3310_remove(struct i2c_client *client)
-{
- struct stk_device* idev = i2c_get_clientdata(client);
-
- //unregister_early_suspend(&(idev->earlysuspend));
- misc_deregister(&mmadl_device);
- misc_deregister(&mmadp_device);
- input_unregister_polled_device(idev->input_poll_devl);
- input_unregister_polled_device(idev->input_poll_devp);
- input_free_polled_device(idev->input_poll_devl);
- input_free_polled_device(idev->input_poll_devp);
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- printk(KERN_INFO MODULE_NAME ": %s stk3310 remove call, \n", __func__);
- return 0;
-}
-
-//****************add platform_device & platform_driver for suspend &resume 2013-7-2
-static int ls_probe(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_remove(struct platform_device *pdev){
- //printk("<<<%s\n", __FUNCTION__);
- return 0;
-}
-static int ls_suspend(struct platform_device *pdev, pm_message_t state){
- printk("<<<%s\n", __FUNCTION__);
-
- return 0;
-}
-
-static int ls_resume(struct platform_device *pdev){
- //return 0;
- int ret = 0;
- int count = 0;
-
- struct i2c_client *client = l_sensorconfig->client;
- printk("<<<%s\n", __FUNCTION__);
-
-RETRY:
- mutex_lock(&mutex);
-
- ret = isl_set_default_config(client);
-
- mutex_unlock(&mutex);
- if (ret < 0){
- printk("%s isl_set_default_config fail!\n", __FUNCTION__);
- count++;
- if (count < 5){
- mdelay(2);
- goto RETRY;
- }
- else
- return ret;
- }
- return 0;
-
-}
-static void lsdev_release(struct device *dev)
-{
- return;
-}
-static struct platform_device lsdev = {
- .name = "lsdevice",
- .id = -1,
- .dev = {
- .release = lsdev_release,
- },
-};
-static struct platform_driver lsdrv = {
- .probe = ls_probe,
- .remove = ls_remove,
- .suspend = ls_suspend,
- .resume = ls_resume,
- .driver = {
- .name = "lsdevice",
- },
-};
-//********************************************************************
-
-
-static int __init sensor_stk3310_init(void)
-{
- int ret = 0;
- printk(KERN_INFO MODULE_NAME ": %s stk3310 init call, \n", __func__);
- /*
- * Force device to initialize: i2c-15 0x44
- * If i2c_new_device is not called, even stk3310_detect will not run
- * TODO: rework to automatically initialize the device
- */
- //i2c_new_device(i2c_get_adapter(15), &isl_info);
- //return i2c_add_driver(&stk3310_driver);
- if (!(this_client = sensor_i2c_register_device(2, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if (stk3310_detect(this_client))
- {
- errlog("Can't find light sensor stk3310!\n");
- goto detect_fail;
- }
- if(stk3310_probe(this_client))
- {
- errlog("Erro for probe!\n");
- goto detect_fail;
- }
-
- ret = platform_device_register(&lsdev);
- if (ret){
- printk("<<<platform_device_register fail!\n");
- return ret;
- }
- ret = platform_driver_register(&lsdrv);
- if (ret){
- printk("<<<platform_driver_register fail!\n");
- platform_device_unregister(&lsdev);
- return ret;
- }
- return 0;
-
-detect_fail:
- sensor_i2c_unregister_device(this_client);
- return -1;
-}
-
-static void __exit sensor_stk3310_exit(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s stk3310 exit call \n", __func__);
- stk3310_remove(this_client);
- sensor_i2c_unregister_device(this_client);
- platform_driver_unregister(&lsdrv);
- platform_device_unregister(&lsdev);
- //i2c_del_driver(&stk3310_driver);
-}
-
-module_init(sensor_stk3310_init);
-module_exit(sensor_stk3310_exit);
-
-MODULE_AUTHOR("flash");
-MODULE_ALIAS("stk3310 ALS");
-MODULE_DESCRIPTION("Stk3310 Driver");
-MODULE_LICENSE("GPL v2");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/Makefile
deleted file mode 100755
index ba1a46b1..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_gsensor_stk8312
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := stk831x.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8312.h b/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8312.h
deleted file mode 100755
index c4b25cdc..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8312.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Definitions for Sensortek stk8312 accelerometer
- */
-#ifndef _STK831X_H_
-#define _STK831X_H_
-
-#include <linux/ioctl.h>
-#define STK831X_I2C_NAME "stk831x"
-#define ACC_IDEVICE_NAME "sensor_ctrl"
-#define STKDIR 0x3D
-#define STK_LSB_1G 21
-/* registers for stk8312 registers */
-
-#define STK831X_XOUT 0x00 /* x-axis acceleration*/
-#define STK831X_YOUT 0x01 /* y-axis acceleration*/
-#define STK831X_ZOUT 0x02 /* z-axis acceleration*/
-#define STK831X_TILT 0x03 /* Tilt Status */
-#define STK831X_SRST 0x04 /* Sampling Rate Status */
-#define STK831X_SPCNT 0x05 /* Sleep Count */
-#define STK831X_INTSU 0x06 /* Interrupt setup*/
-#define STK831X_MODE 0x07
-#define STK831X_SR 0x08 /* Sample rate */
-#define STK831X_PDET 0x09 /* Tap Detection */
-#define STK831X_DEVID 0x0B /* Device ID */
-#define STK831X_OFSX 0x0C /* X-Axis offset */
-#define STK831X_OFSY 0x0D /* Y-Axis offset */
-#define STK831X_OFSZ 0x0E /* Z-Axis offset */
-#define STK831X_PLAT 0x0F /* Tap Latency */
-#define STK831X_PWIN 0x10 /* Tap Window */
-#define STK831X_FTH 0x11 /* Free-Fall Threshold */
-#define STK831X_FTM 0x12 /* Free-Fall Time */
-#define STK831X_STH 0x13 /* Shake Threshold */
-#define STK831X_CTRL 0x14 /* Control Register */
-#define STK831X_RESET 0x20 /*software reset*/
-
-/* IOCTLs*/
-#define STK_IOCTL_WRITE _IOW(STKDIR, 0x01, char[8])
-#define STK_IOCTL_READ _IOWR(STKDIR, 0x02, char[8])
-#define STK_IOCTL_SET_ENABLE _IOW(STKDIR, 0x03, char)
-#define STK_IOCTL_GET_ENABLE _IOR(STKDIR, 0x04, char)
-#define STK_IOCTL_SET_DELAY _IOW(STKDIR, 0x05, char)
-#define STK_IOCTL_GET_DELAY _IOR(STKDIR, 0x06, char)
-#define STK_IOCTL_SET_OFFSET _IOW(STKDIR, 0x07, char[3])
-#define STK_IOCTL_GET_OFFSET _IOR(STKDIR, 0x08, char[3])
-#define STK_IOCTL_GET_ACCELERATION _IOR(STKDIR, 0x09, int[3])
-#define STK_IOCTL_SET_RANGE _IOW(STKDIR, 0x10, char)
-#define STK_IOCTL_GET_RANGE _IOR(STKDIR, 0x11, char)
-#define STK_IOCTL_SET_CALI _IOW(STKDIR, 0x12, char)
-
-
-#endif
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8313.h b/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8313.h
deleted file mode 100755
index 66536ac7..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk8313.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Definitions for Sensortek stk8313 accelerometer
- */
-#ifndef _STK831X_H_
-#define _STK831X_H_
-
-#include <linux/ioctl.h>
-#define STK831X_I2C_NAME "stk831x"
-#define ACC_IDEVICE_NAME "accelerometer"
-#define STKDIR 0x3D
-#define STK_LSB_1G 256
-/* register for stk8313 registers */
-
-#define STK831X_XOUT 0x00
-#define STK831X_YOUT 0x02
-#define STK831X_ZOUT 0x04
-#define STK831X_TILT 0x06 /* Tilt Status */
-#define STK831X_SRST 0x07 /* Sampling Rate Status */
-#define STK831X_SPCNT 0x08 /* Sleep Count */
-#define STK831X_INTSU 0x09 /* Interrupt setup*/
-#define STK831X_MODE 0x0A
-#define STK831X_SR 0x0B /* Sample rate */
-#define STK831X_PDET 0x0C /* Tap Detection */
-#define STK831X_DEVID 0x0E /* Device ID */
-#define STK831X_OFSX 0x0F /* X-Axis offset */
-#define STK831X_OFSY 0x10 /* Y-Axis offset */
-#define STK831X_OFSZ 0x11 /* Z-Axis offset */
-#define STK831X_PLAT 0x12 /* Tap Latency */
-#define STK831X_PWIN 0x13 /* Tap Window */
-#define STK831X_FTH 0x14 /* Fre e-Fall Threshold */
-#define STK831X_FTM 0x15 /* Free-Fall Time */
-#define STK831X_STH 0x16 /* Shake Threshold */
-#define STK831X_ISTMP 0x17 /* Interrupt Setup */
-#define STK831X_INTMAP 0x18 /*Interrupt Map*/
-#define STK831X_RESET 0x20 /*software reset*/
-
-/* IOCTLs*/
-#define STK_IOCTL_WRITE _IOW(STKDIR, 0x01, char[8])
-#define STK_IOCTL_READ _IOWR(STKDIR, 0x02, char[8])
-#define STK_IOCTL_SET_ENABLE _IOW(STKDIR, 0x03, char)
-#define STK_IOCTL_GET_ENABLE _IOR(STKDIR, 0x04, char)
-#define STK_IOCTL_SET_DELAY _IOW(STKDIR, 0x05, char)
-#define STK_IOCTL_GET_DELAY _IOR(STKDIR, 0x06, char)
-#define STK_IOCTL_SET_OFFSET _IOW(STKDIR, 0x07, char[3])
-#define STK_IOCTL_GET_OFFSET _IOR(STKDIR, 0x08, char[3])
-#define STK_IOCTL_GET_ACCELERATION _IOR(STKDIR, 0x09, int[3])
-#define STK_IOCTL_SET_RANGE _IOW(STKDIR, 0x10, char)
-#define STK_IOCTL_GET_RANGE _IOR(STKDIR, 0x11, char)
-#define STK_IOCTL_SET_CALI _IOW(STKDIR, 0x12, char)
-
-
-#endif \ No newline at end of file
diff --git a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk831x.c b/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk831x.c
deleted file mode 100755
index 68952f9c..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/stk8312_gsensor/stk831x.c
+++ /dev/null
@@ -1,3590 +0,0 @@
-/*
- * stk831x.c - Linux kernel modules for sensortek stk8311/stk8312/stk8313 accelerometer
- *
- * Copyright (C) 2011~2013 Lex Hsieh / sensortek <lex_hsieh@sensortek.com.tw>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/slab.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-#include <linux/input.h>
-#include <asm/gpio.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-#include <linux/completion.h>
-#include <linux/kthread.h>
-#include <linux/version.h>
-#include <linux/pm_runtime.h>
-#include <linux/fs.h>
-#include <linux/workqueue.h>
-#include <linux/fcntl.h>
-#include <linux/syscalls.h>
-
-
-#include "../sensor.h"
-
-
-//#define STK_ALLWINNER_PLATFORM
-#define STK_ACC_DRIVER_VERSION "1.6.1"
-/*choose polling or interrupt mode*/
-#define STK_ACC_POLLING_MODE 1
-#if (!STK_ACC_POLLING_MODE)
- #define ADDITIONAL_GPIO_CFG 1
- #define STK_INT_PIN 39
-#endif
-//#define STK_PERMISSION_THREAD
-#define STK_RESUME_RE_INIT
-//#define STK_DEBUG_PRINT
-//#define STK_DEBUG_RAWDATA
-//#define STK_LOWPASS
-#define STK_FIR_LEN 4
-
-///////////////////////////////////////
-#define CONFIG_SENSORS_STK8312////////
-/////////////////////////////////////
-#define STK_ZG_FILTER
-#ifdef CONFIG_SENSORS_STK8312
- #define STK_ZG_COUNT 1
-#elif defined (CONFIG_SENSORS_STK8313)
- #define STK_ZG_COUNT 4
-#endif
-
-#define STK_TUNE
-#ifdef CONFIG_SENSORS_STK8312
- #define STK_TUNE_XYOFFSET 3
- #define STK_TUNE_ZOFFSET 6
- #define STK_TUNE_NOISE 5
-#elif defined (CONFIG_SENSORS_STK8313)
- #define STK_TUNE_XYOFFSET 35
- #define STK_TUNE_ZOFFSET 75
- #define STK_TUNE_NOISE 20
-#endif
-#define STK_TUNE_NUM 125
-#define STK_TUNE_DELAY 125
-//Flourtise - Kevin
-#define STK_WMT_PLATFORM
-#ifdef STK_WMT_PLATFORM
- //#define STK8312_DRVID 7
- ///////////////////////// ioctrl cmd ////////////////////////^M
- #define WMTGSENSOR_IOCTL_MAGIC 0x09
- #define WMT_IOCTL_SENSOR_CAL_OFFSET _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x01, int) //offset calibration^M
- #define ECS_IOCTL_APP_SET_AFLAG _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x02, short)
- #define ECS_IOCTL_APP_SET_DELAY _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x03, short)
- #define WMT_IOCTL_SENSOR_GET_DRVID _IOW(WMTGSENSOR_IOCTL_MAGIC, 0x04, unsigned int)
- #define WMT_IOCTL_SENOR_GET_RESOLUTION _IOR(WMTGSENSOR_IOCTL_MAGIC, 0x05, short)
-
-#endif
-//Flourise - Kevin
-#ifndef STK_WMT_PLATFORM
- #ifdef CONFIG_SENSORS_STK8313
- #include <linux/stk8313.h>
- #elif defined CONFIG_SENSORS_STK8312
- #include <linux/stk8312.h>
- #else
- #error "What's your stk accelerometer?"
- #endif
-#else
- #ifdef CONFIG_SENSORS_STK8313
- #include "stk8313.h"
- #elif defined CONFIG_SENSORS_STK8312
- #include "stk8312.h"
- #else
- #error "What's your stk accelerometer?"
- #endif
-#endif /* #ifndef STK_ALLWINNER_PLATFORM */
-
-SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode);
-
-static struct i2c_client *this_client = NULL;
-
-//add 2013-6-24
-#define GSENSOR_NAME "stk8312"
-static struct class* l_dev_class = NULL;
-struct stk8312_config
-{
- int op;
- int int_gpio; //0-3
- int xyz_axis[3][2]; // (axis,direction)
- int rxyz_axis[3][2];
- int irq;
- struct proc_dir_entry* sensor_proc;
- int sensorlevel;
- int shake_enable; // 1--enable shake, 0--disable shake
- int manual_rotation; // 0--landance, 90--vertical
- struct input_dev *input_dev;
- //struct work_struct work;
- struct delayed_work work; // for polling
- struct workqueue_struct *queue;
- int isdbg; // 0-- no debug log, 1--show debug log
- int sensor_samp; // 1,2,4,8,16,32,64,120
- int sensor_enable; // 0 --> disable sensor, 1 --> enable sensor
- int test_pass;
- spinlock_t spinlock;
- int pollcnt; // the counts of polling
- int offset[3];
-};
-
-static struct stk8312_config l_sensorconfig = {
- .op = 0,
- .int_gpio = 3,
- .xyz_axis = {
- {ABS_X, -1},
- {ABS_Y, 1},
- {ABS_Z, -1},
- },
- .irq = 6,
- .int_gpio = 3,
- .sensor_proc = NULL,
- .sensorlevel = 0,
- .shake_enable = 0, // default enable shake
- .isdbg = 0,
- .sensor_samp = 10, // 4sample/second
- .sensor_enable = 1, // enable sensor
- .test_pass = 0, // for test program
- .pollcnt = 0, // Don't report the x,y,z when the driver is loaded until 2~3 seconds
- .offset = {0,0,0},
-};
-//******************************************
-
-#if defined(STK_LOWPASS)
-#define MAX_FIR_LEN 32
-struct data_filter {
- s16 raw[MAX_FIR_LEN][3];
- int sum[3];
- int num;
- int idx;
-};
-#endif
-
-struct stk831x_data
-{
- struct input_dev *input_dev;
- struct work_struct stk_work;
- int irq;
- int raw_data[3];
- atomic_t enabled;
- unsigned char delay;
- struct mutex write_lock;
- bool first_enable;
- bool re_enable;
- char recv_reg;
-#if STK_ACC_POLLING_MODE
- struct hrtimer acc_timer;
- struct work_struct stk_acc_work;
- struct workqueue_struct *stk_acc_wq;
- ktime_t acc_poll_delay;
-#endif //#if STK_ACC_POLLING_MODE
- atomic_t cali_status;
-#if defined(STK_LOWPASS)
- atomic_t firlength;
- atomic_t fir_en;
- struct data_filter fir;
-#endif
-};
-
-#define STK831X_HOLD_ODR
-#define STK831X_INIT_ODR 1//2 //2:100Hz, 3:50Hz, 4:25Hz
-#define STK831X_SAMPLE_TIME_MIN_NO 2
-#define STK831X_SAMPLE_TIME_NO 5
-const static int STK831X_SAMPLE_TIME[STK831X_SAMPLE_TIME_NO] = {2500, 5000, 10000, 20000, 40000};
-static struct stk831x_data *stk831x_data_ptr;
-static int event_since_en = 0;
-static int event_since_en_limit = 20;
-#if (!STK_ACC_POLLING_MODE)
-static struct workqueue_struct *stk_mems_work_queue = NULL;
-#endif //#if STK_ACC_POLLING_MODE
-
-#define STK_DEBUG_CALI
-#define STK_SAMPLE_NO 10
-#define STK_ACC_CALI_VER0 0x3D
-#define STK_ACC_CALI_VER1 0x01
-#define STK_ACC_CALI_FILE "/data/misc/stkacccali.conf"
-#define STK_ACC_CALI_FILE_SIZE 10
-
-#define STK_K_SUCCESS_TUNE 0x04
-#define STK_K_SUCCESS_FT2 0x03
-#define STK_K_SUCCESS_FT1 0x02
-#define STK_K_SUCCESS_FILE 0x01
-#define STK_K_NO_CALI 0xFF
-#define STK_K_RUNNING 0xFE
-#define STK_K_FAIL_LRG_DIFF 0xFD
-#define STK_K_FAIL_OPEN_FILE 0xFC
-#define STK_K_FAIL_W_FILE 0xFB
-#define STK_K_FAIL_R_BACK 0xFA
-#define STK_K_FAIL_R_BACK_COMP 0xF9
-#define STK_K_FAIL_I2C 0xF8
-#define STK_K_FAIL_K_PARA 0xF7
-#define STK_K_FAIL_OTP_OUT_RG 0xF6
-#define STK_K_FAIL_ENG_I2C 0xF5
-#define STK_K_FAIL_FT1_USD 0xF4
-#define STK_K_FAIL_FT2_USD 0xF3
-#define STK_K_FAIL_WRITE_NOFST 0xF2
-#define STK_K_FAIL_OTP_5T 0xF1
-#define STK_K_FAIL_PLACEMENT 0xF0
-
-
-#define POSITIVE_Z_UP 0
-#define NEGATIVE_Z_UP 1
-#define POSITIVE_X_UP 2
-#define NEGATIVE_X_UP 3
-#define POSITIVE_Y_UP 4
-#define NEGATIVE_Y_UP 5
-static unsigned char stk831x_placement = POSITIVE_Z_UP;
-#ifdef STK_TUNE
-static char stk_tune_offset_record[3] = {0};
-static int stk_tune_offset[3] = {0};
-static int stk_tune_sum[3] = {0};
-static int stk_tune_max[3] = {0};
-static int stk_tune_min[3] = {0};
-static int stk_tune_index = 0;
-static int stk_tune_done = 0;
-#endif
-
-static int stk_store_in_ic( struct stk831x_data *stk, char otp_offset[], char FT_index, uint32_t delay_ms);
-static int32_t stk_get_file_content(char * r_buf, int8_t buf_size);
-static int stk_store_in_file(char offset[], char mode);
-static int STK831x_ReadByteOTP(char rReg, char *value);
-static int STK831x_SetEnable(struct stk831x_data *stk, char en);
-static int STK831x_SetCali(struct stk831x_data *stk, char sstate);
-static int32_t stk_get_ic_content(struct stk831x_data *stk);
-static int STK831x_SetOffset(char buf[]);
-static void stk_handle_first_en(struct stk831x_data *stk);
-static int STK831x_GetDelay(struct stk831x_data *stk, uint32_t* gdelay_ns);
-static int STK831x_SetDelay(struct stk831x_data *stk, uint32_t sdelay_ns);
-
-#ifdef STK_ALLWINNER_PLATFORM
-static int gsensor_direct_x = 0;
-static int gsensor_direct_y = 0;
-static int gsensor_direct_z = 0;
-static int gsensor_xy_revert = 0;
-
-enum {
- DEBUG_INIT = 1U << 0,
- DEBUG_CONTROL_INFO = 1U << 1,
- DEBUG_DATA_INFO = 1U << 2,
- DEBUG_SUSPEND = 1U << 3,
-};
-static u32 debug_mask = 0;
-#define dprintk(level_mask, fmt, arg...) if (unlikely(debug_mask & level_mask)) \
- printk(KERN_DEBUG fmt , ## arg)
-
-module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
-#endif /* #ifdef STK_ALLWINNER_PLATFORM */
-
-#ifdef STK_ALLWINNER_PLATFORM
-/* Addresses to scan */
-static union
-{
- unsigned short dirty_addr_buf[2];
- const unsigned short normal_i2c[2];
-}u_i2c_addr = {{0x00},};
-static __u32 twi_id = 1;
-#endif /* #ifdef STK_ALLWINNER_PLATFORM */
-
-/**
- * gsensor_fetch_sysconfig_para - get config info from sysconfig.fex file.
- * return value:
- * = 0; success;
- * < 0; err
- */
-#ifdef STK_ALLWINNER_A20_A31
-static int gsensor_fetch_sysconfig_para(void)
-{
- int ret = -1;
- int device_used = -1;
- script_item_u val;
- script_item_value_type_e type;
-
- dprintk(DEBUG_INIT, "========%s===================\n", __func__);
-
- type = script_get_item("gsensor_para", "gsensor_used", &val);
-
- if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
- pr_err("%s: type err device_used = %d. \n", __func__, val.val);
- goto script_get_err;
- }
- device_used = val.val;
-
- if (1 == device_used) {
- type = script_get_item("gsensor_para", "gsensor_twi_id", &val);
- if(SCIRPT_ITEM_VALUE_TYPE_INT != type){
- pr_err("%s: type err twi_id = %d. \n", __func__, val.val);
- goto script_get_err;
- }
- twi_id = val.val;
-
- dprintk(DEBUG_INIT, "%s: twi_id is %d. \n", __func__, twi_id);
-
- if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("gsensor_para", "gsensor_direct_x", &val)){
- pr_err("%s: line: %d: script_get_item err. \n", __FILE__, __LINE__);
- goto script_get_err;
- }
- gsensor_direct_x = val.val;
-
- if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("gsensor_para", "gsensor_direct_y", &val)){
- pr_err("%s: line: %d: script_get_item err. \n", __FILE__, __LINE__);
- goto script_get_err;
- }
- gsensor_direct_y = val.val;
- if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("gsensor_para", "gsensor_direct_z", &val)){
- pr_err("%s: line: %d: script_get_item err. \n", __FILE__, __LINE__);
- goto script_get_err;
- }
- gsensor_direct_z = val.val;
-
- if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("gsensor_para", "gsensor_xy_revert", &val)){
- pr_err("%s: line: %d: script_get_item err. \n", __FILE__, __LINE__);
- goto script_get_err;
- }
- gsensor_xy_revert = val.val;
-
- ret = 0;
-
- } else {
- pr_err("%s: gsensor_unused. \n", __func__);
- ret = -1;
- }
-
- return ret;
-
-script_get_err:
- pr_notice("=========script_get_err============\n");
- return ret;
-}
-#endif /* #ifdef STK_ALLWINNER_A20_A31 */
-
-#ifdef STK_ALLWINNER_A13
-static int gsensor_fetch_sysconfig_para(void)
-{
- int ret = -1;
- int device_used = -1;
-
- printk("========%s===================\n", __func__);
-
- if(SCRIPT_PARSER_OK != (ret = script_parser_fetch("gsensor_para", "gsensor_used", &device_used, 1))){
- pr_err("%s: script_parser_fetch err.ret = %d. \n", __func__, ret);
- goto script_parser_fetch_err;
- }
- if(1 == device_used){
- if(SCRIPT_PARSER_OK != script_parser_fetch("gsensor_para", "gsensor_twi_id", &twi_id, 1)){
- pr_err("%s: script_parser_fetch err. \n",__func__);
- goto script_parser_fetch_err;
- }
- printk("%s: twi_id is %d. \n", __func__, twi_id);
-
- stk8313_pin_hd = gpio_request_ex("gsensor_para",NULL);
- if (stk8313_pin_hd==-1) {
- printk("stk8313_pin_hd pin request error!\n");
- }
- ret = 0;
-
- }else{
- pr_err("%s: gsensor_unused. \n", __func__);
- ret = -1;
- }
-
- return ret;
-
- script_parser_fetch_err:
- pr_notice("=========script_parser_fetch_err============\n");
- return ret;
-}
-#endif /* #ifdef STK_ALLWINNER_A13 */
-
-
-
-static int STK_i2c_Rx(char *rxData, int length)
-{
- uint8_t retry;
- struct i2c_msg msgs[] =
- {
- {
- .addr = this_client->addr,
- .flags = 0,
- .len = 1,
- .buf = rxData,
- },
- {
- .addr = this_client->addr,
- .flags = I2C_M_RD,
- .len = length,
- .buf = rxData,
- },
- };
-
- for (retry = 0; retry <= 3; retry++)
- {
- if (i2c_transfer(this_client->adapter, msgs, 2) > 0)
- break;
- else
- mdelay(10);
- }
-
- if (retry > 3)
- {
- printk(KERN_ERR "%s: retry over 3\n", __func__);
- return -EIO;
- }
- else
- return 0;
-}
-
-static int STK_i2c_Tx(char *txData, int length)
-{
- int retry;
- struct i2c_msg msg[] =
- {
- {
- .addr = this_client->addr,
- .flags = 0,
- .len = length,
- .buf = txData,
- },
- };
-
- for (retry = 0; retry <= 3; retry++)
- {
- if (i2c_transfer(this_client->adapter, msg, 1) > 0)
- break;
- else
- mdelay(10);
- }
-
- if(*txData >= 0x21 && *txData <= 0x3E)
- {
- for (retry = 0; retry <= 3; retry++)
- {
- if (i2c_transfer(this_client->adapter, msg, 1) > 0)
- break;
- else
- mdelay(10);
- }
- }
-
- if (retry > 3)
- {
- printk(KERN_ERR "%s: i2c error, retry over 3\n", __func__);
- return -EIO;
- }
- else
- return 0;
-}
-
-
-static int STK831X_SetVD(struct stk831x_data *stk)
-{
- int result;
- char buffer[2] = "";
- char reg24;
-
- msleep(2);
- result = STK831x_ReadByteOTP(0x70, &reg24);
- if(result < 0)
- {
- printk(KERN_ERR "%s: read back error, result=%d\n", __func__, result);
- return result;
- }
-
- if(reg24 != 0)
- {
- buffer[0] = 0x24;
- buffer[1] = reg24;
- //printk(KERN_INFO "%s:write 0x%x to 0x24\n", __func__, buffer[1]);
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- }
- else
- {
- //printk(KERN_INFO "%s: reg24=0, do nothing\n", __func__);
- return 0;
- }
-
- buffer[0] = 0x24;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- if(buffer[0] != reg24)
- {
- printk(KERN_ERR "%s: error, reg24=0x%x, read=0x%x\n", __func__, reg24, buffer[0]);
- return -1;
- }
- //printk(KERN_INFO "%s: successfully", __func__);
- return 0;
-}
-
-#ifdef STK_TUNE
-static void STK831x_ResetPara(void)
-{
- int ii;
- for(ii=0;ii<3;ii++)
- {
- stk_tune_sum[ii] = 0;
- stk_tune_min[ii] = 4096;
- stk_tune_max[ii] = -4096;
- }
- return;
-}
-
-static void STK831x_Tune(struct stk831x_data *stk, int acc[])
-{
- int ii;
- char offset[3];
- char mode_reg;
- int result;
- char buffer[2] = "";
-
- if (stk_tune_done==0)
- {
- if( event_since_en >= STK_TUNE_DELAY)
- {
- if ((abs(acc[0]) <= STK_TUNE_XYOFFSET) && (abs(acc[1]) <= STK_TUNE_XYOFFSET)
- && (abs(abs(acc[2])-STK_LSB_1G) <= STK_TUNE_ZOFFSET))
- stk_tune_index++;
- else
- stk_tune_index = 0;
-
- if (stk_tune_index==0)
- STK831x_ResetPara();
- else
- {
- for(ii=0;ii<3;ii++)
- {
- stk_tune_sum[ii] += acc[ii];
- if(acc[ii] > stk_tune_max[ii])
- stk_tune_max[ii] = acc[ii];
- if(acc[ii] < stk_tune_min[ii])
- stk_tune_min[ii] = acc[ii];
- }
- }
-
- if(stk_tune_index == STK_TUNE_NUM)
- {
- for(ii=0;ii<3;ii++)
- {
- if((stk_tune_max[ii] - stk_tune_min[ii]) > STK_TUNE_NOISE)
- {
- stk_tune_index = 0;
- STK831x_ResetPara();
- return;
- }
- }
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return;
- }
- mode_reg = buffer[0];
- buffer[1] = mode_reg & 0xF8;
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return;
- }
-
- stk_tune_offset[0] = stk_tune_sum[0]/STK_TUNE_NUM;
- stk_tune_offset[1] = stk_tune_sum[1]/STK_TUNE_NUM;
- if (acc[2] > 0)
- stk_tune_offset[2] = stk_tune_sum[2]/STK_TUNE_NUM - STK_LSB_1G;
- else
- stk_tune_offset[2] = stk_tune_sum[2]/STK_TUNE_NUM - (-STK_LSB_1G);
-
- offset[0] = (char) (-stk_tune_offset[0]);
- offset[1] = (char) (-stk_tune_offset[1]);
- offset[2] = (char) (-stk_tune_offset[2]);
- STK831x_SetOffset(offset);
- stk_tune_offset_record[0] = offset[0];
- stk_tune_offset_record[1] = offset[1];
- stk_tune_offset_record[2] = offset[2];
-
- buffer[1] = mode_reg | 0x1;
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return;
- }
-
- STK831X_SetVD(stk);
- stk_store_in_file(offset, STK_K_SUCCESS_TUNE);
- stk_tune_done = 1;
- atomic_set(&stk->cali_status, STK_K_SUCCESS_TUNE);
- event_since_en = 0;
- printk(KERN_INFO "%s:TUNE done, %d,%d,%d\n", __func__, offset[0], offset[1],offset[2]);
- }
- }
- }
- /*
- else
- {
- if(atomic_read(&stk->enabled))
- {
- acc[0] -= stk_tune_offset[0];
- acc[1] -= stk_tune_offset[1];
- acc[2] -= stk_tune_offset[2];
- }
- }
- */
- // printk(KERN_INFO "%s:TUNE %4d,%4d,%4d [%d,%d,%d] %d\n", __func__, acc[0], acc[1], acc[2], stk_tune_offset[0], stk_tune_offset[1],stk_tune_offset[2],stk_tune_done);
- return;
-}
-#endif
-
-#ifdef CONFIG_SENSORS_STK8312
-static int STK831x_CheckReading(int acc[], bool clear)
-{
- static int check_result = 0;
-
- if(acc[0] == 127 || acc[0] == -128 || acc[1] == 127 || acc[1] == -128 ||
- acc[2] == 127 || acc[2] == -128)
- {
- printk(KERN_INFO "%s: acc:%o,%o,%o\n", __func__, acc[0], acc[1], acc[2]);
- check_result++;
- }
- if(clear)
- {
- if(check_result == 3)
- {
- event_since_en_limit = 10000;
- printk(KERN_INFO "%s: incorrect reading\n", __func__);
- check_result = 0;
- return 1;
- }
- check_result = 0;
- }
- return 0;
-}
-static inline int STK831x_ReadSensorData(struct stk831x_data *stk)
-{
- int result;
- char buffer[3] = {0};
- int acc_xyz[3] = {0};
-#ifdef STK_ZG_FILTER
- s16 zero_fir = 0;
-#endif
-#ifdef STK_LOWPASS
- int idx, firlength = atomic_read(&stk->firlength);
-#endif
- int k_status = atomic_read(&stk->cali_status);
- memset(buffer, 0, 3);
-
- buffer[0] = STK831X_XOUT;
- result = STK_i2c_Rx(buffer, 3);
- if (result < 0)
- {
- printk(KERN_ERR "%s:i2c transfer error\n", __func__);
- return result;
- }
-
- if (buffer[0] & 0x80)
- acc_xyz[0] = buffer[0] - 256;
- else
- acc_xyz[0] = buffer[0];
- if (buffer[1] & 0x80)
- acc_xyz[1] = buffer[1] - 256;
- else
- acc_xyz[1] = buffer[1];
- if (buffer[2] & 0x80)
- acc_xyz[2] = buffer[2] - 256;
- else
- acc_xyz[2] = buffer[2];
-
-#ifdef STK_DEBUG_RAWDATA
- printk(KERN_INFO "%s:RAW %4d,%4d,%4d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
-
- if(event_since_en == 16 || event_since_en == 17)
- STK831x_CheckReading(acc_xyz, false);
- else if(event_since_en == 18)
- STK831x_CheckReading(acc_xyz, true);
-
- if(k_status == STK_K_RUNNING)
- {
- stk->raw_data[0] = acc_xyz[0];
- stk->raw_data[1] = acc_xyz[1];
- stk->raw_data[2] = acc_xyz[2];
- return 0;
- }
-
-#ifdef STK_LOWPASS //not define 2013-7-12
- if(atomic_read(&stk->fir_en))
- {
- if(stk->fir.num < firlength)
- {
- stk->fir.raw[stk->fir.num][0] = acc_xyz[0];
- stk->fir.raw[stk->fir.num][1] = acc_xyz[1];
- stk->fir.raw[stk->fir.num][2] = acc_xyz[2];
- stk->fir.sum[0] += acc_xyz[0];
- stk->fir.sum[1] += acc_xyz[1];
- stk->fir.sum[2] += acc_xyz[2];
- stk->fir.num++;
- stk->fir.idx++;
- }
- else
- {
- idx = stk->fir.idx % firlength;
- stk->fir.sum[0] -= stk->fir.raw[idx][0];
- stk->fir.sum[1] -= stk->fir.raw[idx][1];
- stk->fir.sum[2] -= stk->fir.raw[idx][2];
- stk->fir.raw[idx][0] = acc_xyz[0];
- stk->fir.raw[idx][1] = acc_xyz[1];
- stk->fir.raw[idx][2] = acc_xyz[2];
- stk->fir.sum[0] += acc_xyz[0];
- stk->fir.sum[1] += acc_xyz[1];
- stk->fir.sum[2] += acc_xyz[2];
- stk->fir.idx++;
- acc_xyz[0] = stk->fir.sum[0]/firlength;
- acc_xyz[1] = stk->fir.sum[1]/firlength;
- acc_xyz[2] = stk->fir.sum[2]/firlength;
- }
- }
-#ifdef STK_DEBUG_RAWDATA
- printk(KERN_INFO "%s:After FIR %4d,%4d,%4d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
-
-#endif /* #ifdef STK_LOWPASS */
-
-
-
-#ifdef STK_TUNE //define
- if((k_status&0xF0) != 0)
- STK831x_Tune(stk, acc_xyz);
-#endif
-
-#ifdef STK_ZG_FILTER //define
- if( abs(acc_xyz[0]) <= STK_ZG_COUNT) // 1
- acc_xyz[0] = (acc_xyz[0]*zero_fir);
- if( abs(acc_xyz[1]) <= STK_ZG_COUNT)
- acc_xyz[1] = (acc_xyz[1]*zero_fir);
- if( abs(acc_xyz[2]) <= STK_ZG_COUNT)
- acc_xyz[2] = (acc_xyz[2]*zero_fir);
-#endif /* #ifdef STK_ZG_FILTER */
-
- stk->raw_data[0] = acc_xyz[0];
- stk->raw_data[1] = acc_xyz[1];
- stk->raw_data[2] = acc_xyz[2];
-
- return 0;
-}
-
-#elif defined CONFIG_SENSORS_STK8313
-static int STK831x_CheckReading(int acc[], bool clear)
-{
- static int check_result = 0;
-
- if(acc[0] == 2047 || acc[0] == -2048 || acc[1] == 2047 || acc[1] == -2048 ||
- acc[2] == 2047 || acc[2] == -2048)
- {
- printk(KERN_INFO "%s: acc:%o,%o,%o\n", __func__, acc[0], acc[1], acc[2]);
- check_result++;
- }
- if(clear)
- {
- if(check_result == 3)
- {
- event_since_en_limit = 10000;
- printk(KERN_INFO "%s: incorrect reading\n", __func__);
- check_result = 0;
- return 1;
- }
- check_result = 0;
- }
- return 0;
-}
-static int STK831x_ReadSensorData(struct stk831x_data *stk)
-{
- int result;
- char buffer[6] = "";
- int acc_xyz[3] = {0};
-#ifdef STK_ZG_FILTER
- s16 zero_fir = 0;
-#endif
-#ifdef STK_LOWPASS
- int idx, firlength = atomic_read(&stk->firlength);
-#endif
- int k_status = atomic_read(&stk->cali_status);
-
- memset(buffer, 0, 6);
- buffer[0] = STK831X_XOUT;
- result = STK_i2c_Rx(buffer, 6);
- if (result < 0)
- {
- printk(KERN_ERR "%s:i2c transfer error\n", __func__);
- return result;
- }
-
- if (buffer[0] & 0x80)
- acc_xyz[0] = ((int)buffer[0]<<4) + (buffer[1]>>4) - 4096;
- else
- acc_xyz[0] = ((int)buffer[0]<<4) + (buffer[1]>>4);
- if (buffer[2] & 0x80)
- acc_xyz[1] = ((int)buffer[2]<<4) + (buffer[3]>>4) - 4096;
- else
- acc_xyz[1] = ((int)buffer[2]<<4) + (buffer[3]>>4);
- if (buffer[4] & 0x80)
- acc_xyz[2] = ((int)buffer[4]<<4) + (buffer[5]>>4) - 4096;
- else
- acc_xyz[2] = ((int)buffer[4]<<4) + (buffer[5]>>4);
-
-#ifdef STK_DEBUG_RAWDATA
- printk(KERN_INFO "%s:RAW %4d,%4d,%4d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
-
- if(event_since_en == 16 || event_since_en == 17)
- STK831x_CheckReading(acc_xyz, false);
- else if(event_since_en == 18)
- STK831x_CheckReading(acc_xyz, true);
- if(k_status == STK_K_RUNNING)
- {
- stk->raw_data[0] = acc_xyz[0];
- stk->raw_data[1] = acc_xyz[1];
- stk->raw_data[2] = acc_xyz[2];
- return 0;
- }
-
-#ifdef STK_LOWPASS
- if(atomic_read(&stk->fir_en))
- {
- if(stk->fir.num < firlength)
- {
- stk->fir.raw[stk->fir.num][0] = acc_xyz[0];
- stk->fir.raw[stk->fir.num][1] = acc_xyz[1];
- stk->fir.raw[stk->fir.num][2] = acc_xyz[2];
- stk->fir.sum[0] += acc_xyz[0];
- stk->fir.sum[1] += acc_xyz[1];
- stk->fir.sum[2] += acc_xyz[2];
- stk->fir.num++;
- stk->fir.idx++;
- }
- else
- {
- idx = stk->fir.idx % firlength;
- stk->fir.sum[0] -= stk->fir.raw[idx][0];
- stk->fir.sum[1] -= stk->fir.raw[idx][1];
- stk->fir.sum[2] -= stk->fir.raw[idx][2];
- stk->fir.raw[idx][0] = acc_xyz[0];
- stk->fir.raw[idx][1] = acc_xyz[1];
- stk->fir.raw[idx][2] = acc_xyz[2];
- stk->fir.sum[0] += acc_xyz[0];
- stk->fir.sum[1] += acc_xyz[1];
- stk->fir.sum[2] += acc_xyz[2];
- stk->fir.idx++;
- acc_xyz[0] = stk->fir.sum[0]/firlength;
- acc_xyz[1] = stk->fir.sum[1]/firlength;
- acc_xyz[2] = stk->fir.sum[2]/firlength;
- }
- }
-#ifdef STK_DEBUG_RAWDATA
- printk(KERN_INFO "%s:After FIR %4d,%4d,%4d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
-
-#endif /* #ifdef STK_LOWPASS */
-
-
-#ifdef STK_TUNE
- if((k_status&0xF0) != 0)
- STK831x_Tune(stk, acc_xyz);
-#endif
-
-#ifdef STK_ZG_FILTER
- if( abs(acc_xyz[0]) <= STK_ZG_COUNT)
- acc_xyz[0] = (acc_xyz[0]*zero_fir);
- if( abs(acc_xyz[1]) <= STK_ZG_COUNT)
- acc_xyz[1] = (acc_xyz[1]*zero_fir);
- if( abs(acc_xyz[2]) <= STK_ZG_COUNT)
- acc_xyz[2] = (acc_xyz[2]*zero_fir);
-#endif /* #ifdef STK_ZG_FILTER */
-
- stk->raw_data[0] = acc_xyz[0];
- stk->raw_data[1] = acc_xyz[1];
- stk->raw_data[2] = acc_xyz[2];
-
- return 0;
-}
-#endif
-
-static int STK831x_ReportValue(struct stk831x_data *stk)
-{
- //int tmp = 0;
- int rxyz[3] = {0};
-#if 1//comment 2013-8-15
- if(event_since_en < 1200)
- {
- event_since_en++;
- if(event_since_en < 12)
- return 0;
- }
-#endif
-//add by gandy
- //gsensor_direct_x = 0;
-#if 0
- if (gsensor_direct_x == 1)
- stk->raw_data[0] = -stk->raw_data[0];
-
- //gsensor_direct_y = 1;
- if (gsensor_direct_y == 1)
- stk->raw_data[1] = -stk->raw_data[1];
-
- gsensor_direct_z = 1;
- if (gsensor_direct_z == 1)
- stk->raw_data[2] = -stk->raw_data[2];
-
- if (gsensor_xy_revert == 1)
- {
- tmp = stk->raw_data[0];
- stk->raw_data[0] = stk->raw_data[1];
- stk->raw_data[1] = tmp;
- }
-#endif
-//end add
- //add coord
- //printk("x,y,z(%d,%d,%d)\n", stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
- rxyz[0] = stk->raw_data[0];
- rxyz[1] = stk->raw_data[1];
- rxyz[2] = stk->raw_data[2];
- stk->raw_data[0] = rxyz[l_sensorconfig.xyz_axis[0][0]]*l_sensorconfig.xyz_axis[0][1];
- stk->raw_data[1] = rxyz[l_sensorconfig.xyz_axis[1][0]]*l_sensorconfig.xyz_axis[1][1];
- stk->raw_data[2] = rxyz[l_sensorconfig.xyz_axis[2][0]]*l_sensorconfig.xyz_axis[2][1];
-
-
-#if 0
- stk->raw_data[0] = stk->raw_data[0]*9800*100/2133; //add for stk8132 21.34
- stk->raw_data[1] = stk->raw_data[1]*9800*100/2133;
- stk->raw_data[2] = stk->raw_data[2]*9800*100/2133;
-#endif
-
-
-#ifdef STK_DEBUG_PRINT
- printk(KERN_INFO "%s:%4d,%4d,%4d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
- input_report_abs(stk->input_dev, ABS_X, stk->raw_data[0]);
- input_report_abs(stk->input_dev, ABS_Y, stk->raw_data[1]);
- input_report_abs(stk->input_dev, ABS_Z, stk->raw_data[2]);
-
- //printk(" after x,y,z(%d,%d,%d)\n", stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
- input_sync(stk->input_dev);
- return 0;
-}
-
-static int STK831x_SetOffset(char buf[])
-{
- int result;
- char buffer[4] = "";
-
- buffer[0] = STK831X_OFSX;
- buffer[1] = buf[0];
- buffer[2] = buf[1];
- buffer[3] = buf[2];
- result = STK_i2c_Tx(buffer, 4);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- return 0;
-}
-
-static int STK831x_GetOffset(char buf[])
-{
- int result;
- char buffer[3] = "";
-
- buffer[0] = STK831X_OFSX;
- result = STK_i2c_Rx(buffer, 3);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- buf[0] = buffer[0];
- buf[1] = buffer[1];
- buf[2] = buffer[2];
- return 0;
-}
-
-static int STK831x_SetEnable(struct stk831x_data *stk, char en)
-{
- int result;
- char buffer[2] = "";
- int new_enabled = (en)?1:0;
- int k_status = atomic_read(&stk->cali_status);
-
- if(new_enabled == atomic_read(&stk->enabled))
- return 0;
- printk(KERN_INFO "%s:%x\n", __func__, en);
-
- //mutex_lock(&stk->write_lock);
- if(stk->first_enable && k_status != STK_K_RUNNING)
- stk_handle_first_en(stk);
-
- mutex_lock(&stk->write_lock);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto e_err_i2c;
- }
- if(en)
- {
- buffer[1] = (buffer[0] & 0xF8) | 0x01;
- event_since_en = 0;
-#ifdef STK_TUNE
- if((k_status&0xF0) != 0 && stk_tune_done == 0)
- {
- stk_tune_index = 0;
- STK831x_ResetPara();
- }
-#endif
- }
- else
- buffer[1] = (buffer[0] & 0xF8);
-
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto e_err_i2c;
- }
- mutex_unlock(&stk->write_lock);
-
- if(stk->first_enable && k_status != STK_K_RUNNING)
- {
- stk->first_enable = false;
- msleep(2);
- result = stk_get_ic_content(stk);
- }
- if(en)
- {
- STK831X_SetVD(stk);
-#if STK_ACC_POLLING_MODE
- hrtimer_start(&stk->acc_timer, stk->acc_poll_delay, HRTIMER_MODE_REL);
-#else
- enable_irq((unsigned int)stk->irq);
-#endif //#if STK_ACC_POLLING_MODE
- }
- else
- {
-#if STK_ACC_POLLING_MODE
- hrtimer_cancel(&stk->acc_timer);
- cancel_work_sync(&stk->stk_acc_work);
-#else
- disable_irq((unsigned int)stk->irq);
-#endif //#if STK_ACC_POLLING_MODE
- }
- //mutex_unlock(&stk->write_lock);
- atomic_set(&stk->enabled, new_enabled);
- return 0;
-
-e_err_i2c:
- mutex_unlock(&stk->write_lock);
- return result;
-}
-
-static int STK831x_GetEnable(struct stk831x_data *stk, char* gState)
-{
- *gState = atomic_read(&stk->enabled);
- return 0;
-}
-
-static int STK831x_SetDelay(struct stk831x_data *stk, uint32_t sdelay_ns)
-{
- unsigned char sr_no;
- int result;
- char buffer[2] = "";
- uint32_t sdelay_us = sdelay_ns / 1000;
-
- for(sr_no=(STK831X_SAMPLE_TIME_NO-1);sr_no>0;sr_no--)
- {
- if(sdelay_us >= STK831X_SAMPLE_TIME[sr_no])
- break;
- }
- if(sr_no < STK831X_SAMPLE_TIME_MIN_NO)
- sr_no = STK831X_SAMPLE_TIME_MIN_NO;
-
-#ifdef STK831X_HOLD_ODR
- sr_no = STK831X_INIT_ODR;
-#endif
-
-#ifdef STK_DEBUG_PRINT
-#ifdef STK831X_HOLD_ODR
- printk(KERN_INFO "%s:sdelay_us=%d, Hold delay = %d\n", __func__, sdelay_us, STK831X_SAMPLE_TIME[STK831X_INIT_ODR]);
-#else
- printk(KERN_INFO "%s:sdelay_us=%d\n", __func__, sdelay_us);
-#endif
-#endif
- mutex_lock(&stk->write_lock);
- if(stk->delay == sr_no)
- {
- mutex_unlock(&stk->write_lock);
- return 0;
- }
- buffer[0] = STK831X_SR;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto d_err_i2c;
- }
-
- buffer[1] = (buffer[0] & 0xF8) | ((sr_no & 0x07));
- buffer[0] = STK831X_SR;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto d_err_i2c;
- }
- stk->delay = sr_no;
-#if STK_ACC_POLLING_MODE
- stk->acc_poll_delay = ns_to_ktime(STK831X_SAMPLE_TIME[sr_no]*USEC_PER_MSEC);
-#endif
-
-#if defined(STK_LOWPASS)
- stk->fir.num = 0;
- stk->fir.idx = 0;
- stk->fir.sum[0] = 0;
- stk->fir.sum[1] = 0;
- stk->fir.sum[2] = 0;
-#endif
- mutex_unlock(&stk->write_lock);
-
- return 0;
-d_err_i2c:
- mutex_unlock(&stk->write_lock);
- return result;
-}
-
-static int STK831x_GetDelay(struct stk831x_data *stk, uint32_t *gdelay_ns)
-{
- int result;
- char buffer[2] = "";
-
- mutex_lock(&stk->write_lock);
- buffer[0] = STK831X_SR;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- mutex_unlock(&stk->write_lock);
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- mutex_unlock(&stk->write_lock);
- *gdelay_ns = (uint32_t) STK831X_SAMPLE_TIME[(int)buffer[0]] * 1000;
- return 0;
-}
-
-
-static int STK831x_SetRange(char srange)
-{
- int result;
- char buffer[2] = "";
-#ifdef STK_DEBUG_PRINT
- printk(KERN_INFO "%s:range=0x%x\n", __func__, srange);
-#endif
-
- if(srange >= 3)
- {
- printk(KERN_ERR "%s:parameter out of range\n", __func__);
- return -1;
- }
-
- buffer[0] = STK831X_STH;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
-
- buffer[1] = (buffer[0] & 0x3F) | srange<<6;
- buffer[0] = STK831X_STH;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- return 0;
-}
-
-static int STK831x_GetRange(char* grange)
-{
- int result;
- char buffer = 0;
-
- buffer = STK831X_STH;
- result = STK_i2c_Rx(&buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
- *grange = buffer >> 6;
- return 0;
-}
-
-static int STK831x_ReadByteOTP(char rReg, char *value)
-{
- int redo = 0;
- int result;
- char buffer[2] = "";
- *value = 0;
-
- buffer[0] = 0x3D;
- buffer[1] = rReg;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto eng_i2c_r_err;
- }
- buffer[0] = 0x3F;
- buffer[1] = 0x02;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto eng_i2c_r_err;
- }
-
- do {
- msleep(2);
- buffer[0] = 0x3F;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto eng_i2c_r_err;
- }
- if(buffer[0]& 0x80)
- {
- break;
- }
- redo++;
- }while(redo < 10);
-
- if(redo == 10)
- {
- printk(KERN_ERR "%s:OTP read repeat read 10 times! Failed!\n", __func__);
- return -STK_K_FAIL_OTP_5T;
- }
- buffer[0] = 0x3E;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- goto eng_i2c_r_err;
- }
- *value = buffer[0];
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s: read 0x%x=0x%x\n", __func__, rReg, *value);
-#endif
- return 0;
-
-eng_i2c_r_err:
- return -STK_K_FAIL_ENG_I2C;
-}
-
-static int STK831x_WriteByteOTP(char wReg, char value)
-{
- int finish_w_check = 0;
- int result;
- char buffer[2] = "";
- char read_back, value_xor = value;
- int re_write = 0;
-
- do
- {
- finish_w_check = 0;
- buffer[0] = 0x3D;
- buffer[1] = wReg;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, err=0x%x\n", __func__, result);
- goto eng_i2c_w_err;
- }
- buffer[0] = 0x3E;
- buffer[1] = value_xor;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, err=0x%x\n", __func__, result);
- goto eng_i2c_w_err;
- }
- buffer[0] = 0x3F;
- buffer[1] = 0x01;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, err=0x%x\n", __func__, result);
- goto eng_i2c_w_err;
- }
-
- do
- {
- msleep(1);
- buffer[0] = 0x3F;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, err=0x%x\n", __func__, result);
- goto eng_i2c_w_err;
- }
- if(buffer[0]& 0x80)
- {
- result = STK831x_ReadByteOTP(wReg, &read_back);
- if(result < 0)
- {
- printk(KERN_ERR "%s: read back error, result=%d\n", __func__, result);
- goto eng_i2c_w_err;
- }
-
- if(read_back == value)
- {
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s: write 0x%x=0x%x successfully\n", __func__, wReg, value);
-#endif
- re_write = 0xFF;
- break;
- }
- else
- {
- printk(KERN_ERR "%s: write 0x%x=0x%x, read 0x%x=0x%x, try again\n", __func__, wReg, value_xor, wReg, read_back);
- value_xor = read_back ^ value;
- re_write++;
- break;
- }
- }
- finish_w_check++;
- } while (finish_w_check < 5);
- } while(re_write < 10);
-
- if(re_write == 10)
- {
- printk(KERN_ERR "%s: write 0x%x fail, read=0x%x, write=0x%x, target=0x%x\n", __func__, wReg, read_back, value_xor, value);
- return -STK_K_FAIL_OTP_5T;
- }
-
- return 0;
-
-eng_i2c_w_err:
- return -STK_K_FAIL_ENG_I2C;
-}
-
-static int STK831x_WriteOffsetOTP(struct stk831x_data *stk, int FT, char offsetData[])
-{
- char regR[6], reg_comp[3];
- char mode;
- int result;
- char buffer[2] = "";
- int ft_pre_trim = 0;
-
- if(FT==1)
- {
- result = STK831x_ReadByteOTP(0x7F, &regR[0]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(regR[0]&0x10)
- {
- printk(KERN_ERR "%s: 0x7F=0x%x\n", __func__, regR[0]);
- return -STK_K_FAIL_FT1_USD;
- }
- }
- else if (FT == 2)
- {
- result = STK831x_ReadByteOTP(0x7F, &regR[0]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(regR[0]&0x20)
- {
- printk(KERN_ERR "%s: 0x7F=0x%x\n", __func__, regR[0]);
- return -STK_K_FAIL_FT2_USD;
- }
- }
-//Check End
-
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- mode = buffer[0];
- buffer[1] = (mode | 0x01);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- msleep(2);
-
-
- if(FT == 1)
- {
- result = STK831x_ReadByteOTP(0x40, &reg_comp[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x41, &reg_comp[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x42, &reg_comp[2]);
- if(result < 0)
- goto eng_i2c_err;
- }
- else if (FT == 2)
- {
- result = STK831x_ReadByteOTP(0x50, &reg_comp[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x51, &reg_comp[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x52, &reg_comp[2]);
- if(result < 0)
- goto eng_i2c_err;
- }
-
- result = STK831x_ReadByteOTP(0x30, &regR[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x31, &regR[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_ReadByteOTP(0x32, &regR[2]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(reg_comp[0] == regR[0] && reg_comp[1] == regR[1] && reg_comp[2] == regR[2])
- {
- printk(KERN_INFO "%s: ft pre-trimmed\n", __func__);
- ft_pre_trim = 1;
- }
-
- if(!ft_pre_trim)
- {
- if(FT == 1)
- {
- result = STK831x_WriteByteOTP(0x40, regR[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x41, regR[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x42, regR[2]);
- if(result < 0)
- goto eng_i2c_err;
- }
- else if (FT == 2)
- {
- result = STK831x_WriteByteOTP(0x50, regR[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x51, regR[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x52, regR[2]);
- if(result < 0)
- goto eng_i2c_err;
- }
- }
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s:OTP step1 Success!\n", __func__);
-#endif
- buffer[0] = 0x2A;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[0] = buffer[0];
- }
- buffer[0] = 0x2B;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[1] = buffer[0];
- }
- buffer[0] = 0x2E;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[2] = buffer[0];
- }
- buffer[0] = 0x2F;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[3] = buffer[0];
- }
- buffer[0] = 0x32;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[4] = buffer[0];
- }
- buffer[0] = 0x33;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto common_i2c_error;
- }
- else
- {
- regR[5] = buffer[0];
- }
-
- regR[1] = offsetData[0];
- regR[3] = offsetData[2];
- regR[5] = offsetData[1];
- if(FT==1)
- {
- result = STK831x_WriteByteOTP(0x44, regR[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x46, regR[3]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x48, regR[5]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(!ft_pre_trim)
- {
- result = STK831x_WriteByteOTP(0x43, regR[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x45, regR[2]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x47, regR[4]);
- if(result < 0)
- goto eng_i2c_err;
- }
- }
- else if (FT == 2)
- {
- result = STK831x_WriteByteOTP(0x54, regR[1]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x56, regR[3]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x58, regR[5]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(!ft_pre_trim)
- {
- result = STK831x_WriteByteOTP(0x53, regR[0]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x55, regR[2]);
- if(result < 0)
- goto eng_i2c_err;
- result = STK831x_WriteByteOTP(0x57, regR[4]);
- if(result < 0)
- goto eng_i2c_err;
- }
- }
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s:OTP step2 Success!\n", __func__);
-#endif
- result = STK831x_ReadByteOTP(0x7F, &regR[0]);
- if(result < 0)
- goto eng_i2c_err;
-
- if(FT==1)
- regR[0] = regR[0]|0x10;
- else if(FT==2)
- regR[0] = regR[0]|0x20;
-
- result = STK831x_WriteByteOTP(0x7F, regR[0]);
- if(result < 0)
- goto eng_i2c_err;
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s:OTP step3 Success!\n", __func__);
-#endif
- return 0;
-
-eng_i2c_err:
- printk(KERN_ERR "%s: read/write eng i2c error, result=0x%x\n", __func__, result);
- return result;
-
-common_i2c_error:
- printk(KERN_ERR "%s: read/write common i2c error, result=0x%x\n", __func__, result);
- return result;
-}
-
-static int STK831X_VerifyCali(struct stk831x_data *stk, unsigned char en_dis, uint32_t delay_ms)
-{
- unsigned char axis, state;
- int acc_ave[3] = {0, 0, 0};
- const unsigned char verify_sample_no = 3;
-#ifdef CONFIG_SENSORS_STK8313
- const unsigned char verify_diff = 25;
-#elif defined CONFIG_SENSORS_STK8312
- const unsigned char verify_diff = 2;
-#endif
- int result;
- char buffer[2] = "";
- int ret = 0;
-
- if(en_dis)
- {
- STK831x_SetDelay(stk, 10000000);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return -STK_K_FAIL_I2C;
- }
- buffer[1] = (buffer[0] & 0xF8) | 0x01;
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return -STK_K_FAIL_I2C;
- }
- STK831X_SetVD(stk);
- msleep(delay_ms*15);
- }
-
- for(state=0;state<verify_sample_no;state++)
- {
- STK831x_ReadSensorData(stk);
- for(axis=0;axis<3;axis++)
- acc_ave[axis] += stk->raw_data[axis];
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s: acc=%d,%d,%d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
- msleep(delay_ms);
- }
-
- for(axis=0;axis<3;axis++)
- acc_ave[axis] /= verify_sample_no;
-
- switch(stk831x_placement)
- {
- case POSITIVE_X_UP:
- acc_ave[0] -= STK_LSB_1G;
- break;
- case NEGATIVE_X_UP:
- acc_ave[0] += STK_LSB_1G;
- break;
- case POSITIVE_Y_UP:
- acc_ave[1] -= STK_LSB_1G;
- break;
- case NEGATIVE_Y_UP:
- acc_ave[1] += STK_LSB_1G;
- break;
- case POSITIVE_Z_UP:
- acc_ave[2] -= STK_LSB_1G;
- break;
- case NEGATIVE_Z_UP:
- acc_ave[2] += STK_LSB_1G;
- break;
- default:
- printk("%s: invalid stk831x_placement=%d\n", __func__, stk831x_placement);
- ret = -STK_K_FAIL_PLACEMENT;
- break;
- }
- if(abs(acc_ave[0]) > verify_diff || abs(acc_ave[1]) > verify_diff || abs(acc_ave[2]) > verify_diff)
- {
- printk(KERN_INFO "%s:Check data x:%d, y:%d, z:%d\n", __func__,acc_ave[0],acc_ave[1],acc_ave[2]);
- printk(KERN_ERR "%s:Check Fail, Calibration Fail\n", __func__);
- ret = -STK_K_FAIL_LRG_DIFF;
- }
-#ifdef STK_DEBUG_CALI
- else
- printk(KERN_INFO "%s:Check data pass\n", __func__);
-#endif
- if(en_dis)
- {
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return -STK_K_FAIL_I2C;
- }
- buffer[1] = (buffer[0] & 0xF8);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed, result=0x%x\n", __func__, result);
- return -STK_K_FAIL_I2C;
- }
- }
-
- return ret;
-}
-
-
-static int STK831x_SetCali(struct stk831x_data *stk, char sstate)
-{
- char org_enable;
- int acc_ave[3] = {0, 0, 0};
- int state, axis;
- int new_offset[3];
- char char_offset[3] = {0};
- int result;
- char buffer[2] = "";
- char reg_offset[3] = {0};
- char store_location = sstate;
- uint32_t gdelay_ns, real_delay_ms;
- char offset[3];
-
- atomic_set(&stk->cali_status, STK_K_RUNNING);
- //sstate=1, STORE_OFFSET_IN_FILE
- //sstate=2, STORE_OFFSET_IN_IC
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s:store_location=%d\n", __func__, store_location);
-#endif
- if((store_location != 3 && store_location != 2 && store_location != 1) || (stk831x_placement < 0 || stk831x_placement > 5) )
- {
- printk(KERN_ERR "%s, invalid parameters\n", __func__);
- atomic_set(&stk->cali_status, STK_K_FAIL_K_PARA);
- return -STK_K_FAIL_K_PARA;
- }
- STK831x_GetDelay(stk, &gdelay_ns);
- STK831x_GetEnable(stk, &org_enable);
- if(org_enable)
- STK831x_SetEnable(stk, 0);
- STK831x_SetDelay(stk, 10000000);
- msleep(1);
- STK831x_GetDelay(stk, &real_delay_ms);
- real_delay_ms = (real_delay_ms + (NSEC_PER_MSEC / 2)) / NSEC_PER_MSEC;
- printk(KERN_INFO "%s: delay =%d ms\n", __func__, real_delay_ms);
-
- STK831x_SetOffset(reg_offset);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
- buffer[1] = (buffer[0] & 0xF8) | 0x01;
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
-
- STK831X_SetVD(stk);
- if(store_location >= 2)
- {
- buffer[0] = 0x2B;
- buffer[1] = 0x0;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
- buffer[0] = 0x2F;
- buffer[1] = 0x0;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
- buffer[0] = 0x33;
- buffer[1] = 0x0;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
- }
-
- msleep(real_delay_ms*20);
- for(state=0;state<STK_SAMPLE_NO;state++)
- {
- STK831x_ReadSensorData(stk);
- for(axis=0;axis<3;axis++)
- acc_ave[axis] += stk->raw_data[axis];
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s: acc=%d,%d,%d\n", __func__, stk->raw_data[0], stk->raw_data[1], stk->raw_data[2]);
-#endif
- msleep(real_delay_ms);
- }
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
- buffer[1] = (buffer[0] & 0xF8);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto err_i2c_rw;
- }
-
- for(axis=0;axis<3;axis++)
- {
- if(acc_ave[axis] >= 0)
- acc_ave[axis] = (acc_ave[axis] + STK_SAMPLE_NO / 2) / STK_SAMPLE_NO;
- else
- acc_ave[axis] = (acc_ave[axis] - STK_SAMPLE_NO / 2) / STK_SAMPLE_NO;
-
- }
- if(acc_ave[2] <= -1)
- stk831x_placement = NEGATIVE_Z_UP;
- else if((acc_ave[2] >= 1))
- stk831x_placement = POSITIVE_Z_UP;
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s:stk831x_placement=%d\n", __func__, stk831x_placement);
-#endif
-
- switch(stk831x_placement)
- {
- case POSITIVE_X_UP:
- acc_ave[0] -= STK_LSB_1G;
- break;
- case NEGATIVE_X_UP:
- acc_ave[0] += STK_LSB_1G;
- break;
- case POSITIVE_Y_UP:
- acc_ave[1] -= STK_LSB_1G;
- break;
- case NEGATIVE_Y_UP:
- acc_ave[1] += STK_LSB_1G;
- break;
- case POSITIVE_Z_UP:
- acc_ave[2] -= STK_LSB_1G;
- break;
- case NEGATIVE_Z_UP:
- acc_ave[2] += STK_LSB_1G;
- break;
- default:
- printk("%s: invalid stk831x_placement=%d\n", __func__, stk831x_placement);
- atomic_set(&stk->cali_status, STK_K_FAIL_PLACEMENT);
- return -STK_K_FAIL_K_PARA;
- break;
- }
-
- for(axis=0;axis<3;axis++)
- {
- acc_ave[axis] = -acc_ave[axis];
- new_offset[axis] = acc_ave[axis];
- char_offset[axis] = new_offset[axis];
- }
-#ifdef STK_DEBUG_CALI
- printk(KERN_INFO "%s: New offset:%d,%d,%d\n", __func__, new_offset[0], new_offset[1], new_offset[2]);
-#endif
- if(store_location == 1)
- {
- STK831x_SetOffset(char_offset);
- msleep(1);
- STK831x_GetOffset(reg_offset);
- for(axis=0;axis<3;axis++)
- {
- if(char_offset[axis] != reg_offset[axis])
- {
- printk(KERN_ERR "%s: set offset to register fail!, char_offset[%d]=%d,reg_offset[%d]=%d\n",
- __func__, axis,char_offset[axis], axis, reg_offset[axis]);
- atomic_set(&stk->cali_status, STK_K_FAIL_WRITE_NOFST);
- return -STK_K_FAIL_WRITE_NOFST;
- }
- }
-
-
- result = STK831X_VerifyCali(stk, 1, real_delay_ms);
- if(result)
- {
- printk(KERN_ERR "%s: calibration check fail, result=0x%x\n", __func__, result);
- atomic_set(&stk->cali_status, -result);
- }
- else
- {
- result = stk_store_in_file(char_offset, STK_K_SUCCESS_FILE);
- if(result)
- {
- printk(KERN_INFO "%s:write calibration failed\n", __func__);
- atomic_set(&stk->cali_status, -result);
- }
- else
- {
- printk(KERN_INFO "%s successfully\n", __func__);
- atomic_set(&stk->cali_status, STK_K_SUCCESS_FILE);
- }
-
- }
- }
- else if(store_location >= 2)
- {
- for(axis=0; axis<3; axis++)
- {
-#ifdef CONFIG_SENSORS_STK8313
- new_offset[axis]>>=2;
-#endif
- char_offset[axis] = (char)new_offset[axis];
- if( (char_offset[axis]>>7)==0)
- {
- if(char_offset[axis] >= 0x20 )
- {
- printk(KERN_ERR "%s: offset[%d]=0x%x is too large, limit to 0x1f\n",
- __func__, axis, char_offset[axis] );
- char_offset[axis] = 0x1F;
- //atomic_set(&stk->cali_status, STK_K_FAIL_OTP_OUT_RG);
- //return -STK_K_FAIL_OTP_OUT_RG;
- }
- }
- else
- {
- if(char_offset[axis] <= 0xDF)
- {
- printk(KERN_ERR "%s: offset[%d]=0x%x is too large, limit to 0x20\n",
- __func__, axis, char_offset[axis]);
- char_offset[axis] = 0x20;
- //atomic_set(&stk->cali_status, STK_K_FAIL_OTP_OUT_RG);
- //return -STK_K_FAIL_OTP_OUT_RG;
- }
- else
- char_offset[axis] = char_offset[axis] & 0x3f;
- }
- }
-
- printk(KERN_INFO "%s: OTP offset:0x%x,0x%x,0x%x\n", __func__, char_offset[0], char_offset[1], char_offset[2]);
- if(store_location == 2)
- {
- result = stk_store_in_ic( stk, char_offset, 1, real_delay_ms);
- if(result == 0)
- {
- printk(KERN_INFO "%s successfully\n", __func__);
- atomic_set(&stk->cali_status, STK_K_SUCCESS_FT1);
- }
- else
- {
- printk(KERN_ERR "%s fail, result=%d\n", __func__, result);
- }
- }
- else if(store_location == 3)
- {
- result = stk_store_in_ic( stk, char_offset, 2, real_delay_ms);
- if(result == 0)
- {
- printk(KERN_INFO "%s successfully\n", __func__);
- atomic_set(&stk->cali_status, STK_K_SUCCESS_FT2);
- }
- else
- {
- printk(KERN_ERR "%s fail, result=%d\n", __func__, result);
- }
- }
- offset[0] = offset[1] = offset[2] = 0;
- stk_store_in_file(offset, store_location);
- }
-#ifdef STK_TUNE
- stk_tune_offset_record[0] = 0;
- stk_tune_offset_record[1] = 0;
- stk_tune_offset_record[2] = 0;
- stk_tune_done = 1;
-#endif
- stk->first_enable = false;
- STK831x_SetDelay(stk, gdelay_ns);
-
- if(org_enable)
- STK831x_SetEnable(stk, 1);
- return 0;
-
-err_i2c_rw:
- stk->first_enable = false;
- if(org_enable)
- STK831x_SetEnable(stk, 1);
- printk(KERN_ERR "%s: i2c read/write error, err=0x%x\n", __func__, result);
- atomic_set(&stk->cali_status, STK_K_FAIL_I2C);
- return result;
-}
-
-
-static int STK831x_GetCali(struct stk831x_data *stk)
-{
- char r_buf[STK_ACC_CALI_FILE_SIZE] = {0};
- char offset[3], mode;
- int cnt, result;
- char regR[6];
-
-#ifdef STK_TUNE
- printk(KERN_INFO "%s: stk_tune_done=%d, stk_tune_index=%d, stk_tune_offset=%d,%d,%d\n", __func__,
- stk_tune_done, stk_tune_index, stk_tune_offset_record[0], stk_tune_offset_record[1],
- stk_tune_offset_record[2]);
-#endif
- if ((stk_get_file_content(r_buf, STK_ACC_CALI_FILE_SIZE)) == 0)
- {
- if(r_buf[0] == STK_ACC_CALI_VER0 && r_buf[1] == STK_ACC_CALI_VER1)
- {
- offset[0] = r_buf[2];
- offset[1] = r_buf[3];
- offset[2] = r_buf[4];
- mode = r_buf[5];
- printk(KERN_INFO "%s:file offset:%#02x,%#02x,%#02x,%#02x\n",
- __func__, offset[0], offset[1], offset[2], mode);
- }
- else
- {
- printk(KERN_ERR "%s: cali version number error! r_buf=0x%x,0x%x,0x%x,0x%x,0x%x\n",
- __func__, r_buf[0], r_buf[1], r_buf[2], r_buf[3], r_buf[4]);
- }
- }
- else
- printk(KERN_INFO "%s: No file offset\n", __func__);
-
- for(cnt=0x43;cnt<0x49;cnt++)
- {
- result = STK831x_ReadByteOTP(cnt, &(regR[cnt-0x43]));
- if(result < 0)
- printk(KERN_ERR "%s: STK831x_ReadByteOTP failed, ret=%d\n", __func__, result);
- }
- printk(KERN_INFO "%s: OTP 0x43-0x49:%#02x,%#02x,%#02x,%#02x,%#02x,%#02x\n", __func__, regR[0],
- regR[1], regR[2],regR[3], regR[4], regR[5]);
-
- for(cnt=0x53;cnt<0x59;cnt++)
- {
- result = STK831x_ReadByteOTP(cnt, &(regR[cnt-0x53]));
- if(result < 0)
- printk(KERN_ERR "%s: STK831x_ReadByteOTP failed, ret=%d\n", __func__, result);
- }
- printk(KERN_INFO "%s: OTP 0x53-0x59:%#02x,%#02x,%#02x,%#02x,%#02x,%#02x\n", __func__, regR[0],
- regR[1], regR[2],regR[3], regR[4], regR[5]);
-
- return 0;
-}
-
-static int STK831x_Init(struct stk831x_data *stk, struct i2c_client *client)
-{
- int result;
- char buffer[2] = "";
-
-#ifdef CONFIG_SENSORS_STK8312
- printk(KERN_INFO "%s: Initialize stk8312\n", __func__);
-#elif defined CONFIG_SENSORS_STK8313
- printk(KERN_INFO "%s: Initialize stk8313\n", __func__);
-#endif
-
- buffer[0] = STK831X_RESET;
- buffer[1] = 0x00;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
-
- /* int pin is active high, psuh-pull */
- buffer[0] = STK831X_MODE;
- buffer[1] = 0xC0;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
-
- /* 50 Hz ODR */
- stk->delay = STK831X_INIT_ODR;
- buffer[0] = STK831X_SR;
- buffer[1] = stk->delay /*+ STK831X_SAMPLE_TIME_BASE*//*2*/; //debug for rotate slowly 2013-8-15
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return result;
- }
-
-#if (!STK_ACC_POLLING_MODE)
- /* enable GINT, int after every measurement */
- buffer[0] = STK831X_INTSU;
- buffer[1] = 0x10;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:interrupt init failed\n", __func__);
- return result;
- }
-#endif
- /* +- 6g mode */
- buffer[0] = STK831X_STH;
-#ifdef CONFIG_SENSORS_STK8312
- buffer[1] = 0x42;
-#elif defined CONFIG_SENSORS_STK8313
- buffer[1] = 0x82;
-#endif
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- printk(KERN_ERR "%s:set range failed\n", __func__);
- return result;
- }
-
- atomic_set(&stk->enabled, 0);
- event_since_en = 0;
-
-#ifdef STK_LOWPASS
- memset(&stk->fir, 0x00, sizeof(stk->fir));
- atomic_set(&stk->firlength, STK_FIR_LEN);
- atomic_set(&stk->fir_en, 1);
-#endif
-
-#ifdef STK_TUNE
- stk_tune_offset[0] = 0;
- stk_tune_offset[1] = 0;
- stk_tune_offset[2] = 0;
- stk_tune_done = 0;
-#endif
- return 0;
-}
-
-static void stk_handle_first_en(struct stk831x_data *stk)
-{
- char r_buf[STK_ACC_CALI_FILE_SIZE] = {0};
- char offset[3];
- char mode;
-
- if ((stk_get_file_content(r_buf, STK_ACC_CALI_FILE_SIZE)) == 0)
- {
- if(r_buf[0] == STK_ACC_CALI_VER0 && r_buf[1] == STK_ACC_CALI_VER1)
- {
- offset[0] = r_buf[2];
- offset[1] = r_buf[3];
- offset[2] = r_buf[4];
- mode = r_buf[5];
- STK831x_SetOffset(offset);
-#ifdef STK_TUNE
- stk_tune_offset_record[0] = offset[0];
- stk_tune_offset_record[1] = offset[1];
- stk_tune_offset_record[2] = offset[2];
-#endif
- printk(KERN_INFO "%s: set offset:%d,%d,%d, mode=%d\n", __func__, offset[0], offset[1], offset[2], mode);
- atomic_set(&stk->cali_status, mode);
- }
- else
- {
- printk(KERN_ERR "%s: cali version number error! r_buf=0x%x,0x%x,0x%x,0x%x,0x%x\n",
- __func__, r_buf[0], r_buf[1], r_buf[2], r_buf[3], r_buf[4]);
- //return -EINVAL;
- }
- }
-#ifdef STK_TUNE
- else if(stk_tune_offset_record[0]!=0 || stk_tune_offset_record[1]!=0 || stk_tune_offset_record[2]!=0)
- {
- STK831x_SetOffset(stk_tune_offset_record);
- stk_tune_done = 1;
- atomic_set(&stk->cali_status, STK_K_SUCCESS_TUNE);
- printk(KERN_INFO "%s: set offset:%d,%d,%d\n", __func__, stk_tune_offset_record[0],
- stk_tune_offset_record[1],stk_tune_offset_record[2]);
- }
-#endif
- else
- {
- offset[0] = offset[1] = offset[2] = 0;
- stk_store_in_file(offset, STK_K_NO_CALI);
- atomic_set(&stk->cali_status, STK_K_NO_CALI);
- }
- printk(KERN_INFO "%s: finish, cali_status = 0x%x\n", __func__, atomic_read(&stk->cali_status));
- return;
-}
-
-static int32_t stk_get_ic_content(struct stk831x_data *stk)
-{
- int result;
- char regR;
-
- result = STK831x_ReadByteOTP(0x7F, &regR);
- if(result < 0)
- {
- printk(KERN_ERR "%s: read/write eng i2c error, result=0x%x\n", __func__, result);
- return result;
- }
-
- if(regR&0x20)
- {
- atomic_set(&stk->cali_status, STK_K_SUCCESS_FT2);
- printk(KERN_INFO "%s: OTP 2 used\n", __func__);
- return 2;
- }
- if(regR&0x10)
- {
- atomic_set(&stk->cali_status, STK_K_SUCCESS_FT1);
- printk(KERN_INFO "%s: OTP 1 used\n", __func__);
- return 1;
- }
- return 0;
-}
-
-static int stk_store_in_ic( struct stk831x_data *stk, char otp_offset[], char FT_index, uint32_t delay_ms)
-{
- int result;
- char buffer[2] = "";
-
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
- buffer[1] = (buffer[0] & 0xF8) | 0x01;
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
- STK831X_SetVD(stk);
-
- buffer[0] = 0x2B;
- buffer[1] = otp_offset[0];
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
- buffer[0] = 0x2F;
- buffer[1] = otp_offset[2];
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
- buffer[0] = 0x33;
- buffer[1] = otp_offset[1];
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
-
-
-#ifdef STK_DEBUG_CALI
- //printk(KERN_INFO "%s:Check All OTP Data after write 0x2B 0x2F 0x33\n", __func__);
- //STK831x_ReadAllOTP();
-#endif
-
- msleep(delay_ms*15);
- result = STK831X_VerifyCali(stk, 0, 0);
- if(result)
- {
- printk(KERN_ERR "%s: calibration check1 fail, FT_index=%d\n", __func__, FT_index);
- goto ic_err_misc;
- }
-#ifdef STK_DEBUG_CALI
- //printk(KERN_INFO "\n%s:Check All OTP Data before write OTP\n", __func__);
-
-#endif
- //Write OTP
- printk(KERN_INFO "\n%s:Write offset data to FT%d OTP\n", __func__, FT_index);
- result = STK831x_WriteOffsetOTP(stk, FT_index, otp_offset);
- if(result < 0)
- {
- printk(KERN_INFO "%s: write OTP%d fail\n", __func__, FT_index);
- goto ic_err_misc;
- }
-
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Rx(buffer, 1);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
- buffer[1] = (buffer[0] & 0xF8);
- buffer[0] = STK831X_MODE;
- result = STK_i2c_Tx(buffer, 2);
- if (result < 0)
- {
- goto ic_err_i2c_rw;
- }
-
- msleep(1);
- STK831x_Init(stk, this_client);
-#ifdef STK_DEBUG_CALI
- //printk(KERN_INFO "\n%s:Check All OTP Data after write OTP and reset\n", __func__);
-#endif
-
- result = STK831X_VerifyCali(stk, 1, delay_ms);
- if(result)
- {
- printk(KERN_ERR "%s: calibration check2 fail\n", __func__);
- goto ic_err_misc;
- }
- return 0;
-
-ic_err_misc:
- STK831x_Init(stk, this_client);
- msleep(1);
- atomic_set(&stk->cali_status, -result);
- return result;
-
-ic_err_i2c_rw:
- printk(KERN_ERR "%s: i2c read/write error, err=0x%x\n", __func__, result);
- msleep(1);
- STK831x_Init(stk, this_client);
- atomic_set(&stk->cali_status, STK_K_FAIL_I2C);
- return result;
-}
-
-static int32_t stk_get_file_content(char * r_buf, int8_t buf_size)
-{
- struct file *cali_file;
- mm_segment_t fs;
- ssize_t ret;
-
- cali_file = filp_open(STK_ACC_CALI_FILE, O_RDONLY,0);
- if(IS_ERR(cali_file))
- {
- printk(KERN_ERR "%s: filp_open error, no offset file!\n", __func__);
- return -ENOENT;
- }
- else
- {
- fs = get_fs();
- set_fs(get_ds());
- ret = cali_file->f_op->read(cali_file,r_buf, STK_ACC_CALI_FILE_SIZE,&cali_file->f_pos);
- if(ret < 0)
- {
- printk(KERN_ERR "%s: read error, ret=%d\n", __func__, ret);
- filp_close(cali_file,NULL);
- return -EIO;
- }
- set_fs(fs);
- }
-
- filp_close(cali_file,NULL);
- return 0;
-}
-
-#ifdef STK_PERMISSION_THREAD
-static struct task_struct *STKPermissionThread = NULL;
-
-static int stk_permission_thread(void *data)
-{
- int ret = 0;
- int retry = 0;
- mm_segment_t fs = get_fs();
- set_fs(KERNEL_DS);
- msleep(20000);
- do{
- msleep(5000);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input0/driver/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input1/driver/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input2/driver/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input3/driver/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input4/driver/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input0/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input1/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input2/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input3/cali" , 0666);
- ret = sys_fchmodat(AT_FDCWD, "/sys/class/input/input4/cali" , 0666);
- ret = sys_chmod(STK_ACC_CALI_FILE , 0666);
- ret = sys_fchmodat(AT_FDCWD, STK_ACC_CALI_FILE , 0666);
- //if(ret < 0)
- // printk("fail to execute sys_fchmodat, ret = %d\n", ret);
- if(retry++ > 10)
- break;
- }while(ret == -ENOENT);
- set_fs(fs);
- printk(KERN_INFO "%s exit, retry=%d\n", __func__, retry);
- return 0;
-}
-#endif /* #ifdef STK_PERMISSION_THREAD */
-
-static int stk_store_in_file(char offset[], char mode)
-{
- struct file *cali_file;
- char r_buf[STK_ACC_CALI_FILE_SIZE] = {0};
- char w_buf[STK_ACC_CALI_FILE_SIZE] = {0};
- mm_segment_t fs;
- ssize_t ret;
- int8_t i;
-
- w_buf[0] = STK_ACC_CALI_VER0;
- w_buf[1] = STK_ACC_CALI_VER1;
- w_buf[2] = offset[0];
- w_buf[3] = offset[1];
- w_buf[4] = offset[2];
- w_buf[5] = mode;
-
- cali_file = filp_open(STK_ACC_CALI_FILE, O_CREAT | O_RDWR,0666);
-
- if(IS_ERR(cali_file))
- {
- printk(KERN_ERR "%s: filp_open error!\n", __func__);
- return -STK_K_FAIL_OPEN_FILE;
- }
- else
- {
- fs = get_fs();
- set_fs(get_ds());
-
- ret = cali_file->f_op->write(cali_file,w_buf,STK_ACC_CALI_FILE_SIZE,&cali_file->f_pos);
- if(ret != STK_ACC_CALI_FILE_SIZE)
- {
- printk(KERN_ERR "%s: write error!\n", __func__);
- filp_close(cali_file,NULL);
- return -STK_K_FAIL_W_FILE;
- }
- cali_file->f_pos=0x00;
- ret = cali_file->f_op->read(cali_file,r_buf, STK_ACC_CALI_FILE_SIZE,&cali_file->f_pos);
- if(ret < 0)
- {
- printk(KERN_ERR "%s: read error!\n", __func__);
- filp_close(cali_file,NULL);
- return -STK_K_FAIL_R_BACK;
- }
- set_fs(fs);
-
- //printk(KERN_INFO "%s: read ret=%d!\n", __func__, ret);
- for(i=0;i<STK_ACC_CALI_FILE_SIZE;i++)
- {
- if(r_buf[i] != w_buf[i])
- {
- printk(KERN_ERR "%s: read back error, r_buf[%x](0x%x) != w_buf[%x](0x%x)\n",
- __func__, i, r_buf[i], i, w_buf[i]);
- filp_close(cali_file,NULL);
- return -STK_K_FAIL_R_BACK_COMP;
- }
- }
- }
- filp_close(cali_file,NULL);
-
-#ifdef STK_PERMISSION_THREAD
- fs = get_fs();
- set_fs(KERNEL_DS);
- ret = sys_chmod(STK_ACC_CALI_FILE , 0666);
- ret = sys_fchmodat(AT_FDCWD, STK_ACC_CALI_FILE , 0666);
- set_fs(fs);
-#endif
- //printk(KERN_INFO "%s successfully\n", __func__);
- return 0;
-}
-
-static int stk_open(struct inode *inode, struct file *file)
-{
- int ret;
- ret = nonseekable_open(inode, file);
- if(ret < 0)
- return ret;
- file->private_data = stk831x_data_ptr;
- return 0;
-}
-
-static int stk_release(struct inode *inode, struct file *file)
-{
- return 0;
-}
-
-#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,36))
-static long stk_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-#else
-static int stk_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-#endif
-{
- void __user *argp = (void __user *)arg;
- int retval = 0;
- char state = 0, restore_state = 0;
- char rwbuf[8] = "";
- uint32_t delay_ns;
- char char3_buffer[3];
- int result;
- int int3_buffer[3];
- struct stk831x_data *stk = file->private_data;
- unsigned int uval = -1;
-/* printk(KERN_INFO "%s: cmd = 0x%x\n", __func__, cmd); */
-
- if(cmd == ECS_IOCTL_APP_SET_DELAY || cmd == STK_IOCTL_SET_DELAY || cmd == STK_IOCTL_SET_OFFSET || cmd == STK_IOCTL_SET_RANGE || cmd == STK_IOCTL_WRITE || cmd == STK_IOCTL_SET_CALI)
- {
- STK831x_GetEnable(stk, &restore_state);
- if(restore_state)
- STK831x_SetEnable(stk, 0);
- }
-
- switch (cmd)
- {
- case STK_IOCTL_SET_OFFSET:
- if(copy_from_user(&char3_buffer, argp, sizeof(char3_buffer)))
- return -EFAULT;
- break;
- case ECS_IOCTL_APP_SET_DELAY:
- case STK_IOCTL_SET_DELAY:
- if(copy_from_user(&delay_ns, argp, sizeof(uint32_t)))
- return -EFAULT;
- break;
- case STK_IOCTL_WRITE:
- case STK_IOCTL_READ:
- if (copy_from_user(&rwbuf, argp, sizeof(rwbuf)))
- return -EFAULT;
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- case STK_IOCTL_SET_ENABLE:
- case STK_IOCTL_SET_RANGE:
- case STK_IOCTL_SET_CALI:
- if(copy_from_user(&state, argp, sizeof(char)))
- return -EFAULT;
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-
- uval = STK8312_DRVID;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<driver_id:%d\n",uval);
- break;
- case WMT_IOCTL_SENOR_GET_RESOLUTION:
- uval = (8<<8) | 12; // 8bit:12g 0xxx xx
-
- if (copy_to_user((unsigned int *)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- printk("<<<<<<<resolution:0x%x\n",uval);
- default:
- break;
- }
-
- switch (cmd)
- {
- case STK_IOCTL_WRITE:
- if (rwbuf[0] < 2)
- return -EINVAL;
- result = STK_i2c_Tx(&rwbuf[1], rwbuf[0]);
- if (result < 0)
- return result;
- break;
- case STK_IOCTL_SET_OFFSET:
- STK831x_SetOffset(char3_buffer);
- break;
- case ECS_IOCTL_APP_SET_DELAY:
- case STK_IOCTL_SET_DELAY:
- STK831x_SetDelay(stk, delay_ns);
- break;
- case STK_IOCTL_READ:
- if (rwbuf[0] < 1)
- return -EINVAL;
- result = STK_i2c_Rx(&rwbuf[1], rwbuf[0]);
- if (result < 0)
- return result;
- break;
- case STK_IOCTL_GET_DELAY:
- STK831x_GetDelay(stk, &delay_ns);
- break;
- case STK_IOCTL_GET_OFFSET:
- STK831x_GetOffset(char3_buffer);
- break;
- case STK_IOCTL_GET_ACCELERATION:
- STK831x_ReadSensorData(stk);
- int3_buffer[0] = stk->raw_data[0];
- int3_buffer[1] = stk->raw_data[1];
- int3_buffer[2] = stk->raw_data[2];
- break;
- case ECS_IOCTL_APP_SET_AFLAG:
- case STK_IOCTL_SET_ENABLE:
- STK831x_SetEnable(stk, state);
- break;
- case STK_IOCTL_GET_ENABLE:
- STK831x_GetEnable(stk, &state);
- break;
- case STK_IOCTL_SET_RANGE:
- STK831x_SetRange(state);
- break;
- case STK_IOCTL_GET_RANGE:
- STK831x_GetRange(&state);
- break;
- case STK_IOCTL_SET_CALI:
- STK831x_SetCali(stk, state);
- break;
- default:
- //retval = -ENOTTY;
- break;
- }
-
- if(cmd == ECS_IOCTL_APP_SET_DELAY || cmd == STK_IOCTL_SET_DELAY || cmd == STK_IOCTL_SET_OFFSET || cmd == STK_IOCTL_SET_RANGE || cmd == STK_IOCTL_WRITE || cmd == STK_IOCTL_SET_CALI)
- {
- if(restore_state)
- STK831x_SetEnable(stk, restore_state);
- }
- switch (cmd)
- {
- case STK_IOCTL_GET_ACCELERATION:
- if(copy_to_user(argp, &int3_buffer, sizeof(int3_buffer)))
- return -EFAULT;
- break;
- case STK_IOCTL_READ:
- if(copy_to_user(argp, &rwbuf, sizeof(rwbuf)))
- return -EFAULT;
- break;
- case STK_IOCTL_GET_DELAY:
- if(copy_to_user(argp, &delay_ns, sizeof(delay_ns)))
- return -EFAULT;
- break;
- case STK_IOCTL_GET_OFFSET:
- if(copy_to_user(argp, &char3_buffer, sizeof(char3_buffer)))
- return -EFAULT;
- break;
- case STK_IOCTL_GET_RANGE:
- case STK_IOCTL_GET_ENABLE:
- if(copy_to_user(argp, &state, sizeof(char)))
- return -EFAULT;
- break;
- default:
- break;
- }
-
- return retval;
-}
-
-
-static struct file_operations stk_fops = {
- .owner = THIS_MODULE,
- .open = stk_open,
- .release = stk_release,
-#if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,36))
- .unlocked_ioctl = stk_ioctl,
-#else
- .ioctl = stk_ioctl,
-#endif
-};
-
-static struct miscdevice stk_device = {
- .minor = MISC_DYNAMIC_MINOR,
-#ifndef STK_WMT_PLATFORM
- .name = "stk831x",
-#else
- .name = "sensor_ctrl",
-#endif
- .fops = &stk_fops,
-};
-
-
-#if STK_ACC_POLLING_MODE
-static enum hrtimer_restart stk_acc_timer_func(struct hrtimer *timer)
-{
- struct stk831x_data *stk = container_of(timer, struct stk831x_data, acc_timer);
- queue_work(stk->stk_acc_wq, &stk->stk_acc_work);
- hrtimer_forward_now(&stk->acc_timer, stk->acc_poll_delay);
- return HRTIMER_RESTART;
-}
-
-static void stk_acc_poll_work_func(struct work_struct *work)
-{
- struct stk831x_data *stk = container_of(work, struct stk831x_data, stk_acc_work);
- STK831x_ReadSensorData(stk);
- STK831x_ReportValue(stk);
- return;
-}
-
-#else
-
-static irqreturn_t stk_mems_irq_handler(int irq, void *data)
-{
- struct stk831x_data *pData = data;
- disable_irq_nosync(pData->irq);
- queue_work(stk_mems_work_queue,&pData->stk_work);
- return IRQ_HANDLED;
-}
-
-
-static void stk_mems_wq_function(struct work_struct *work)
-{
- struct stk831x_data *stk = container_of(work, struct stk831x_data, stk_work);
- STK831x_ReadSensorData(stk);
- STK831x_ReportValue(stk);
- enable_irq(stk->irq);
-}
-
-static int stk831x_irq_setup(struct i2c_client *client, struct stk831x_data *stk_int)
-{
- int error;
- int irq= -1;
-#if ADDITIONAL_GPIO_CFG
- if (gpio_request(STK_INT_PIN, "EINT"))
- {
- printk(KERN_ERR "%s:gpio_request() failed\n",__func__);
- return -1;
- }
- gpio_direction_input(STK_INT_PIN);
-
- irq = gpio_to_irq(STK_INT_PIN);
- if ( irq < 0 )
- {
- printk(KERN_ERR "%s:gpio_to_irq() failed\n",__func__);
- return -1;
- }
- client->irq = irq;
- stk_int->irq = irq;
-#endif //#if ADDITIONAL_GPIO_CFG
- printk(KERN_INFO "%s: irq # = %d\n", __func__, irq);
- if(irq < 0)
- printk(KERN_ERR "%s: irq number was not specified!\n", __func__);
- error = request_irq(client->irq, stk_mems_irq_handler, IRQF_TRIGGER_RISING , "stk-mems", stk_int);
- if (error < 0)
- {
- printk(KERN_ERR "%s: request_irq(%d) failed for (%d)\n", __func__, client->irq, error);
- return -1;
- }
- disable_irq(irq);
- return irq;
-}
-
-#endif //#if STK_ACC_POLLING_MODE
-
-static ssize_t stk831x_enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- return scnprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&stk->enabled));
-}
-
-static ssize_t stk831x_enable_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- unsigned long data;
- int error;
-
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
-
- error = strict_strtoul(buf, 10, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- if ((data == 0)||(data==1))
- STK831x_SetEnable(stk,data);
- else
- printk(KERN_ERR "%s: invalud argument, data=%ld\n", __func__, data);
- return count;
-}
-
-static ssize_t stk831x_value_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- int ddata[3];
-
- printk(KERN_INFO "driver version:%s\n",STK_ACC_DRIVER_VERSION);
- STK831x_ReadSensorData(stk);
- ddata[0]= stk->raw_data[0];
- ddata[1]= stk->raw_data[1];
- ddata[2]= stk->raw_data[2];
- return scnprintf(buf, PAGE_SIZE, "%d %d %d\n", ddata[0], ddata[1], ddata[2]);
-}
-
-static ssize_t stk831x_delay_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- uint32_t gdelay_ns;
-
- STK831x_GetDelay(stk, &gdelay_ns);
- return scnprintf(buf, PAGE_SIZE, "%d\n", gdelay_ns/1000000);
-}
-
-static ssize_t stk831x_delay_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- unsigned long data;
- int error;
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- char restore_state = 0;
-
- error = strict_strtoul(buf, 10, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
-
- STK831x_GetEnable(stk, &restore_state);
- if(restore_state)
- STK831x_SetEnable(stk, 0);
-
- STK831x_SetDelay(stk, data*1000000); // ms to ns
-
- if(restore_state)
- STK831x_SetEnable(stk, restore_state);
- return count;
-}
-
-static ssize_t stk831x_cali_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- int status = atomic_read(&stk->cali_status);
-
- if(status != STK_K_RUNNING)
- STK831x_GetCali(stk);
- return scnprintf(buf, PAGE_SIZE, "%02x\n", status);
-}
-
-static ssize_t stk831x_cali_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- unsigned long data;
- int error;
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- error = strict_strtoul(buf, 10, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- STK831x_SetCali(stk, data);
- return count;
-}
-
-static ssize_t stk831x_send_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int error, i;
- char *token[2];
- int w_reg[2];
- char buffer[2] = "";
-
- for (i = 0; i < 2; i++)
- token[i] = strsep((char **)&buf, " ");
- if((error = strict_strtoul(token[0], 16, (unsigned long *)&(w_reg[0]))) < 0)
- {
- printk(KERN_ERR "%s:strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- if((error = strict_strtoul(token[1], 16, (unsigned long *)&(w_reg[1]))) < 0)
- {
- printk(KERN_ERR "%s:strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- printk(KERN_INFO "%s: reg[0x%x]=0x%x\n", __func__, w_reg[0], w_reg[1]);
- buffer[0] = w_reg[0];
- buffer[1] = w_reg[1];
- error = STK_i2c_Tx(buffer, 2);
- if (error < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return error;
- }
- return count;
-}
-
-static ssize_t stk831x_recv_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- return scnprintf(buf, PAGE_SIZE, "%02x\n", stk->recv_reg);
-}
-
-static ssize_t stk831x_recv_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- char buffer[2] = "";
- unsigned long data;
- int error;
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
-
- error = strict_strtoul(buf, 16, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
-
- buffer[0] = data;
- error = STK_i2c_Rx(buffer, 2);
- if (error < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return error;
- }
- stk->recv_reg = buffer[0];
- printk(KERN_INFO "%s: reg[0x%x]=0x%x\n", __func__, (int)data , (int)buffer[0]);
- return count;
-}
-
-static ssize_t stk831x_allreg_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- int error;
- char buffer[16] = "";
- char show_buffer[14] = "";
- int aa,bb, no, show_no = 0;
-
- for(bb=0;bb<4;bb++)
- {
- buffer[0] = bb * 0x10;
- error = STK_i2c_Rx(buffer, 16);
- if (error < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return error;
- }
- for(aa=0;aa<16;aa++)
- {
- no = bb*0x10+aa;
- printk(KERN_INFO "stk reg[0x%x]=0x%x\n", no, buffer[aa]);
- switch(no)
- {
- case 0x0:
- case 0x1:
- case 0x2:
- case 0x3:
- case 0x4:
- case 0x5:
- case STK831X_INTSU:
- case STK831X_MODE:
- case STK831X_SR:
- case STK831X_OFSX:
- case STK831X_OFSY:
- case STK831X_OFSZ:
- case STK831X_STH:
- case 0x24:
- show_buffer[show_no] = buffer[aa];
- show_no++;
- break;
- default:
- break;
- }
- }
- }
- return scnprintf(buf, PAGE_SIZE, "0x0=%02x,0x1=%02x,0x2=%02x,0x3=%02x,0x4=%02x,0x5=%02x,INTSU=%02x,MODE=%02x,SR=%02x,OFSX=%02x,OFSY=%02x,OFSZ=%02x,STH=%02x,0x24=%02x\n",
- show_buffer[0], show_buffer[1], show_buffer[2], show_buffer[3], show_buffer[4],
- show_buffer[5], show_buffer[6], show_buffer[7], show_buffer[8], show_buffer[9],
- show_buffer[10], show_buffer[11], show_buffer[12], show_buffer[13]);
-}
-
-static ssize_t stk831x_sendo_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- int error, i;
- char *token[2];
- int w_reg[2];
- char buffer[2] = "";
-
- for (i = 0; i < 2; i++)
- token[i] = strsep((char **)&buf, " ");
- if((error = strict_strtoul(token[0], 16, (unsigned long *)&(w_reg[0]))) < 0)
- {
- printk(KERN_ERR "%s:strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- if((error = strict_strtoul(token[1], 16, (unsigned long *)&(w_reg[1]))) < 0)
- {
- printk(KERN_ERR "%s:strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
- printk(KERN_INFO "%s: reg[0x%x]=0x%x\n", __func__, w_reg[0], w_reg[1]);
-
- buffer[0] = w_reg[0];
- buffer[1] = w_reg[1];
- error = STK831x_WriteByteOTP(buffer[0], buffer[1]);
- if (error < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return error;
- }
- return count;
-}
-
-
-static ssize_t stk831x_recvo_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- char buffer[2] = "";
- unsigned long data;
- int error;
-
- error = strict_strtoul(buf, 16, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=0x%x\n", __func__, error);
- return error;
- }
-
- buffer[0] = data;
- error = STK831x_ReadByteOTP(buffer[0], &buffer[1]);
- if (error < 0)
- {
- printk(KERN_ERR "%s:failed\n", __func__);
- return error;
- }
- printk(KERN_INFO "%s: reg[0x%x]=0x%x\n", __func__, buffer[0] , buffer[1]);
- return count;
-}
-
-static ssize_t stk831x_firlen_show(struct device *dev,
-struct device_attribute *attr, char *buf)
-{
-#ifdef STK_LOWPASS
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- int len = atomic_read(&stk->firlength);
-
- if(atomic_read(&stk->firlength))
- {
- printk(KERN_INFO "len = %2d, idx = %2d\n", stk->fir.num, stk->fir.idx);
- printk(KERN_INFO "sum = [%5d %5d %5d]\n", stk->fir.sum[0], stk->fir.sum[1], stk->fir.sum[2]);
- printk(KERN_INFO "avg = [%5d %5d %5d]\n", stk->fir.sum[0]/len, stk->fir.sum[1]/len, stk->fir.sum[2]/len);
- }
- return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&stk->firlength));
-#else
- return snprintf(buf, PAGE_SIZE, "not support\n");
-#endif
-}
-
-static ssize_t stk831x_firlen_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
-#ifdef STK_LOWPASS
- struct stk831x_data *stk = i2c_get_clientdata(this_client);
- int error;
- unsigned long data;
-
- error = strict_strtoul(buf, 10, &data);
- if (error)
- {
- printk(KERN_ERR "%s: strict_strtoul failed, error=%d\n", __func__, error);
- return error;
- }
-
- if(data > MAX_FIR_LEN)
- {
- printk(KERN_ERR "%s: firlen exceed maximum filter length\n", __func__);
- }
- else if (data < 1)
- {
- atomic_set(&stk->firlength, 1);
- atomic_set(&stk->fir_en, 0);
- memset(&stk->fir, 0x00, sizeof(stk->fir));
- }
- else
- {
- atomic_set(&stk->firlength, data);
- memset(&stk->fir, 0x00, sizeof(stk->fir));
- atomic_set(&stk->fir_en, 1);
- }
-#else
- printk(KERN_ERR "%s: firlen is not supported\n", __func__);
-#endif
- return count;
-}
-
-
-static DEVICE_ATTR(enable, 0644, stk831x_enable_show, stk831x_enable_store);
-static DEVICE_ATTR(value, 0444, stk831x_value_show, NULL);
-static DEVICE_ATTR(delay, 0644, stk831x_delay_show, stk831x_delay_store);
-static DEVICE_ATTR(cali, 0644, stk831x_cali_show, stk831x_cali_store);
-static DEVICE_ATTR(send, 0200, NULL, stk831x_send_store);
-static DEVICE_ATTR(recv, 0644, stk831x_recv_show, stk831x_recv_store);
-static DEVICE_ATTR(allreg, 0444, stk831x_allreg_show, NULL);
-static DEVICE_ATTR(sendo, 0200, NULL, stk831x_sendo_store);
-static DEVICE_ATTR(recvo, 0200, NULL, stk831x_recvo_store);
-static DEVICE_ATTR(firlen, 0644, stk831x_firlen_show, stk831x_firlen_store);
-
-static struct attribute *stk831x_attributes[] = {
- &dev_attr_enable.attr,
- &dev_attr_value.attr,
- &dev_attr_delay.attr,
- &dev_attr_cali.attr,
- &dev_attr_send.attr,
- &dev_attr_recv.attr,
- &dev_attr_allreg.attr,
- &dev_attr_sendo.attr,
- &dev_attr_recvo.attr,
- &dev_attr_firlen.attr,
- NULL
-};
-
-static struct attribute_group stk831x_attribute_group = {
-#ifndef STK_ALLWINNER_PLATFORM
- .name = "driver",
-#endif
- .attrs = stk831x_attributes,
-};
-static int stk831x_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
- int error;
- struct stk831x_data *stk;
-
- printk(KERN_INFO "stk831x_probe: driver version:%s\n",STK_ACC_DRIVER_VERSION);
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
- {
- printk(KERN_ERR "%s:i2c_check_functionality error\n", __func__);
- error = -ENODEV;
- goto exit_i2c_check_functionality_error;
- }
-
- stk = kzalloc(sizeof(struct stk831x_data),GFP_KERNEL);
- if (!stk)
- {
- printk(KERN_ERR "%s:memory allocation error\n", __func__);
- error = -ENOMEM;
- goto exit_kzalloc_error;
- }
- stk831x_data_ptr = stk;
- mutex_init(&stk->write_lock);
-
-#if (STK_ACC_POLLING_MODE)
- stk->stk_acc_wq = create_singlethread_workqueue("stk_acc_wq");
- INIT_WORK(&stk->stk_acc_work, stk_acc_poll_work_func);
- hrtimer_init(&stk->acc_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
-// stk->acc_poll_delay = ns_to_ktime(40 * NSEC_PER_MSEC);
- stk->acc_poll_delay = ns_to_ktime(STK831X_SAMPLE_TIME[STK831X_INIT_ODR]*USEC_PER_MSEC);
- stk->acc_timer.function = stk_acc_timer_func;
-#else
- stk_mems_work_queue = create_workqueue("stk_mems_wq");
- if(stk_mems_work_queue)
- INIT_WORK(&stk->stk_work, stk_mems_wq_function);
- else
- {
- printk(KERN_ERR "%s:create_workqueue error\n", __func__);
- error = -EPERM;
- goto exit_create_workqueue_error;
- }
-
- error = stk831x_irq_setup(client, stk);
- if(!error)
- {
- goto exit_irq_setup_error;
- }
-#endif //#if STK_ACC_POLLING_MODE
-
- i2c_set_clientdata(client, stk);
- this_client = client;
-
- error = STK831x_Init(stk, client);
- if (error)
- {
- printk(KERN_ERR "%s:stk831x initialization failed\n", __func__);
- goto exit_stk_init_error;
- }
- atomic_set(&stk->cali_status, STK_K_NO_CALI);
- stk->first_enable = true;
- stk->re_enable = false;
- event_since_en_limit = 20;
-
- stk->input_dev = input_allocate_device();
- if (!stk->input_dev)
- {
- error = -ENOMEM;
- printk(KERN_ERR "%s:input_allocate_device failed\n", __func__);
- goto exit_input_dev_alloc_error;
- }
-#ifndef STK_WMT_PLATFORM
- stk->input_dev->name = ACC_IDEVICE_NAME;
-#else
- stk->input_dev->name = "g-sensor";
-#endif
- set_bit(EV_ABS, stk->input_dev->evbit);
-
- input_set_abs_params(stk->input_dev, ABS_X, -65532, 65532, 0, 0);
- input_set_abs_params(stk->input_dev, ABS_Y, -65532, 65532, 0, 0);
- input_set_abs_params(stk->input_dev, ABS_Z, -65532, 65532, 0, 0);
-
-
- error = input_register_device(stk->input_dev);
- if (error)
- {
- printk(KERN_ERR "%s:Unable to register input device: %s\n", __func__, stk->input_dev->name);
- goto exit_input_register_device_error;
- }
-
- error = misc_register(&stk_device);
- if (error)
- {
- printk(KERN_ERR "%s: misc_register failed\n", __func__);
- goto exit_misc_device_register_error;
- }
- error = sysfs_create_group(&stk_device.this_device->kobj, &stk831x_attribute_group);
- if (error)
- {
- printk(KERN_ERR "%s: sysfs_create_group failed\n", __func__);
- goto exit_sysfs_create_group_error;
- }
-
- printk(KERN_INFO "%s successfully\n", __func__);
- return 0;
-exit_sysfs_create_group_error:
- //sysfs_remove_group(&stk->input_dev->dev.kobj, &stk831x_attribute_group);
- sysfs_remove_group(&stk_device.this_device->kobj, &stk831x_attribute_group);
-exit_misc_device_register_error:
- misc_deregister(&stk_device);
-exit_input_register_device_error:
- input_unregister_device(stk->input_dev);
-exit_input_dev_alloc_error:
-exit_stk_init_error:
-#if (STK_ACC_POLLING_MODE)
- hrtimer_try_to_cancel(&stk->acc_timer);
- destroy_workqueue(stk->stk_acc_wq);
-#else
- free_irq(client->irq, stk);
-#if ADDITIONAL_GPIO_CFG
-exit_irq_setup_error:
- gpio_free( STK_INT_PIN );
-#endif //#if ADDITIONAL_GPIO_CFG
- destroy_workqueue(stk_mems_work_queue);
-exit_create_workqueue_error:
-#endif //#if (!STK_ACC_POLLING_MODE)
- mutex_destroy(&stk->write_lock);
- kfree(stk);
- stk = NULL;
-exit_kzalloc_error:
-exit_i2c_check_functionality_error:
- return error;
-}
-
-static int stk831x_remove(struct i2c_client *client)
-{
- struct stk831x_data *stk = i2c_get_clientdata(client);
-
- //sysfs_remove_group(&stk->input_dev->dev.kobj, &stk831x_attribute_group);
- sysfs_remove_group(&stk_device.this_device->kobj, &stk831x_attribute_group);
- misc_deregister(&stk_device);
- input_unregister_device(stk->input_dev);
- cancel_work_sync(&stk->stk_work);
-#if (STK_ACC_POLLING_MODE)
- hrtimer_try_to_cancel(&stk->acc_timer);
- destroy_workqueue(stk->stk_acc_wq);
-#else
- free_irq(client->irq, stk);
-#if ADDITIONAL_GPIO_CFG
- gpio_free( STK_INT_PIN );
-#endif //#if ADDITIONAL_GPIO_CFG
- if (stk_mems_work_queue)
- destroy_workqueue(stk_mems_work_queue);
-#endif //#if (!STK_ACC_POLLING_MODE)
- mutex_destroy(&stk->write_lock);
- kfree(stk);
- stk = NULL;
- return 0;
-}
-
-static const struct i2c_device_id stk831x[] = {
- { STK831X_I2C_NAME, 0 },
- { }
-};
-
-#ifdef CONFIG_PM_SLEEP
-static int stk831x_suspend(struct device *dev)
-{
- struct i2c_client *client = container_of(dev, struct i2c_client, dev);
- struct stk831x_data *stk = i2c_get_clientdata(client);
- printk(KERN_INFO "%s\n", __func__);
- if(atomic_read(&stk->enabled))
- {
- STK831x_SetEnable(stk, 0);
- stk->re_enable = true;
- }
- return 0;
-}
-
-
-static int stk831x_resume(struct device *dev)
-{
- struct i2c_client *client = container_of(dev, struct i2c_client, dev);
- struct stk831x_data *stk = i2c_get_clientdata(client);
-#ifdef STK_RESUME_RE_INIT
- int error;
-#endif
-
- printk(KERN_INFO "%s\n", __func__);
-#ifdef STK_RESUME_RE_INIT
- error = STK831x_Init(stk, this_client);
- if (error)
- {
- printk(KERN_ERR "%s:stk831x initialization failed\n", __func__);
- return error;
- }
- stk->first_enable = true;
-#endif
- if(stk->re_enable)
- {
- stk->re_enable = false;
- STK831x_SetEnable(stk, 1);
- }
- return 0;
-}
-#endif /* CONFIG_PM_SLEEP */
-
-
-#ifdef CONFIG_PM_RUNTIME
-static int stk831x_runtime_suspend(struct device *dev)
-{
- struct i2c_client *client = container_of(dev, struct i2c_client, dev);
- struct stk831x_data *stk = i2c_get_clientdata(client);
- printk(KERN_INFO "%s\n", __func__);
- if(atomic_read(&stk->enabled))
- {
- STK831x_SetEnable(stk, 0);
- stk->re_enable = true;
- }
- return 0;
-}
-
-
-static int stk831x_runtime_resume(struct device *dev)
-{
- struct i2c_client *client = container_of(dev, struct i2c_client, dev);
- struct stk831x_data *stk = i2c_get_clientdata(client);
- printk(KERN_INFO "%s\n", __func__);
- stk->first_enable = true;
- if(stk->re_enable)
- {
- stk->re_enable = false;
- STK831x_SetEnable(stk, 1);
- }
- return 0;
-}
-#endif /* CONFIG_PM_RUNTIME */
-
-static const struct dev_pm_ops stk831x_pm_ops = {
- SET_SYSTEM_SLEEP_PM_OPS(stk831x_suspend, stk831x_resume)
- SET_RUNTIME_PM_OPS(stk831x_runtime_suspend, stk831x_runtime_resume, NULL)
-};
-
-static void stk831x_shutdown(struct i2c_client *client)
-{
- struct stk831x_data *stk = NULL;
-
- stk = i2c_get_clientdata(client);
- hrtimer_cancel(&stk->acc_timer);
- cancel_work_sync(&stk->stk_acc_work);
-}
-
-static struct i2c_driver stk831x_driver = {
- .probe = stk831x_probe,
- .remove = stk831x_remove,
- .id_table = stk831x,
- .shutdown = stk831x_shutdown,
-// .suspend = stk831x_suspend,
-// .resume = stk831x_resume,
- .driver = {
- .name = STK831X_I2C_NAME,
- .pm = &stk831x_pm_ops,
- },
-};
-
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int get_axisset(void* param)
-{
- char varbuf[64];
- int n;
- int varlen;
- //int tmpoff[3] = {0};
- memset(varbuf, 0, sizeof(varbuf));
- varlen = sizeof(varbuf);
- if (wmt_getsyspara("wmt.io.stk8312sensor", varbuf, &varlen)) {
- errlog("Can't get gsensor config in u-boot!!!!\n");
- return -1;
- } else {
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
- &l_sensorconfig.op,
- &(l_sensorconfig.xyz_axis[0][0]),
- &(l_sensorconfig.xyz_axis[0][1]),
- &(l_sensorconfig.xyz_axis[1][0]),
- &(l_sensorconfig.xyz_axis[1][1]),
- &(l_sensorconfig.xyz_axis[2][0]),
- &(l_sensorconfig.xyz_axis[2][1]),
- &(l_sensorconfig.offset[0]),
- &(l_sensorconfig.offset[1]),
- &(l_sensorconfig.offset[2]));
- if (n != 10) {
- printk(KERN_ERR "gsensor format is error in u-boot!!!\n");
- return -1;
- }
-
- printk("get the sensor config: %d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
- l_sensorconfig.op,
- l_sensorconfig.xyz_axis[0][0],
- l_sensorconfig.xyz_axis[0][1],
- l_sensorconfig.xyz_axis[1][0],
- l_sensorconfig.xyz_axis[1][1],
- l_sensorconfig.xyz_axis[2][0],
- l_sensorconfig.xyz_axis[2][1],
- l_sensorconfig.offset[0],
- l_sensorconfig.offset[1],
- l_sensorconfig.offset[2]
- );
- }
- return 0;
-}
-
-static int is_stk8312(void)
-{
- struct i2c_client *client = NULL;
- int ret = 0;
- char wbuf[1] = {0x0b};
- char rbuf[1] = {0x0};
- //int devid = 0;
- client = this_client;
- if (!client)
- {
- return 0;
- }
-#if 0
-
- devid = i2c_smbus_read_byte_data(client, 0x0b); //fail!!!
-#endif
-
- ret = i2c_master_send(client, wbuf, 1);
- ret = i2c_master_recv(client, rbuf, 1);
- printk("<<<%s devid 0x%x\n", __FUNCTION__ ,rbuf[0]);
-#if 0 //also ok!!
- struct i2c_msg msg[2] = {
- {.addr = client->addr,
- .flags = 0,
- .len = 1,
- .buf = wbuf,
- },
- { .addr = client->addr,
- .flags = I2C_M_RD,
- .len = 1,
- .buf = rbuf,
- },
- };
-
- ret = i2c_transfer(client->adapter, msg, 2);
-
- printk("ret %d, id 0x%x\n", ret, rbuf[0]);
-#endif
- if (rbuf[0] == 0x58)
- return 1;
- else
- return 0;
-
-
-}
-
-static int __init stk831x_init(void)
-{
- int ret = 0;
- printk(KERN_EMERG"%d:%s",__LINE__,__func__);
-
- ret = get_axisset(NULL);
- if (ret < 0)
- {
- printk("<<<<<%s user choose to no sensor chip!\n", __func__);
- return ret;
- }
-
- if (!(this_client = sensor_i2c_register_device(0, STKDIR, STK831X_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- ret = is_stk8312();
- if (!ret)
- {
- printk("%s not find stk8312\n", __FUNCTION__);
- sensor_i2c_unregister_device(this_client);
- return -1;
-
- }
-
-
- l_dev_class = class_create(THIS_MODULE, GSENSOR_NAME);
- //for S40 module to judge whether insmod is ok
- if (IS_ERR(l_dev_class)){
- ret = PTR_ERR(l_dev_class);
- printk(KERN_ERR "Can't class_create gsensor device !!\n");
- return ret;
- }
-
- ret = i2c_add_driver(&stk831x_driver);
- if (ret!=0)
- {
- printk(KERN_EMERG"======stk831x init fail, ret=0x%x======\n", ret);
- i2c_del_driver(&stk831x_driver);
- return ret;
- }
-#ifdef STK_PERMISSION_THREAD
- STKPermissionThread = kthread_run(
- ,"stk","Permissionthread");
- if(IS_ERR(STKPermissionThread))
- STKPermissionThread = NULL;
-#endif // STK_PERMISSION_THREAD
- printk(KERN_EMERG"%d:%s",__LINE__,__func__);
-
- return ret;
-}
-
-static void __exit stk831x_exit(void)
-{
- //sensor_i2c_unregister_device(this_client);
- i2c_del_driver(&stk831x_driver);
- class_destroy(l_dev_class);
-#ifdef STK_PERMISSION_THREAD
- if(STKPermissionThread)
- STKPermissionThread = NULL;
-#endif // STK_PERMISSION_THREAD
- sensor_i2c_unregister_device(this_client);
-}
-
-module_init(stk831x_init);
-module_exit(stk831x_exit);
-
-MODULE_AUTHOR("Lex Hsieh / Sensortek");
-MODULE_DESCRIPTION("stk831x 3-Axis accelerometer driver");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(STK_ACC_DRIVER_VERSION);
diff --git a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/Makefile b/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/Makefile
deleted file mode 100755
index 1f89e698..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-KERNELDIR=../../../../
-#KERNELDIR=/home/hangyan/android8850/kernel/ANDROID_3.0.8
-CROSS = arm_1103_le-
-CC= $(CROSS)gcc
-LD= $(CROSS)ld
-STRIP = $(CROSS)strip
-
-DEBUG = n
-
-# Add your debugging flag (or not) to EXTRA_CFLAGS
-ifeq ($(DEBUG),y)
-# DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-DEBFLAGS = -O0 -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-
-else
- DEBFLAGS = -O2 -Wall
-endif
-
-EXTRA_CFLAGS += $(DEBFLAGS)
-
-
-MY_MODULE_NAME=s_wmt_lsensor_us5182
-
-obj-m := $(MY_MODULE_NAME).o
-$(MY_MODULE_NAME)-objs := us5182.o
-
-default:
- $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
- $(STRIP) --strip-debug $(MY_MODULE_NAME).ko
- rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions
-
-clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.c b/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.c
deleted file mode 100755
index b251fb83..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.c
+++ /dev/null
@@ -1,1098 +0,0 @@
-/*
- * us5182.c - us5182 ALS & Proximity Driver
- *
- * By Intersil Corp
- * Michael DiGioia
- *
- * Based on isl29011.c
- * by Mike DiGioia <mdigioia@intersil.com>
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/i2c.h>
-#include <linux/kernel.h>
-#include <linux/hwmon.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/sysfs.h>
-#include <linux/pm_runtime.h>
-#include <linux/input-polldev.h>
-#include <linux/miscdevice.h>
-#include <asm/uaccess.h>
-//#include <linux/earlysuspend.h>
-#include <linux/types.h>
-#include "../sensor.h"
-#include "us5182.h"
-/* Insmod parameters */
-//I2C_CLIENT_INSMOD_1(us5182);
-
-#define MODULE_NAME "us5182"
-
-#undef dbg
-#define dbg(fmt, args...)
-
-#undef errlog
-#undef klog
-#define errlog(fmt, args...) printk(KERN_ERR "[%s]: " fmt, __FUNCTION__, ## args)
-#define klog(fmt, args...) printk(KERN_ALERT "[%s]: " fmt, __FUNCTION__, ## args)
-
-struct us_device {
- struct input_polled_dev* input_poll_devl;
- struct input_polled_dev* input_poll_devp;
- struct i2c_client* client;
- struct class* class;
- struct device *lsdev;
- dev_t devno;
-#ifdef CONFIG_HAS_EARLYSUSPEND
- struct early_suspend earlysuspend;
-#endif
- u8 enable_id;
-
-};
-static int psh_l8th = 90;
-static int psh_h8th = 0;
-
-static int psl_l8th = 50;
-static int psl_h8th = 0;
-
-static struct i2c_client *this_client = NULL;
-/*=====Global variable===============================*/
-static u8 error_flag, debounces;
-static int previous_value, this_value;
-static struct i2c_client *gclient = NULL;
-/*===================================================*/
-static u8 reg_cache[us5182_NUM_CACHABLE_REGS];
-
-static struct us_device* l_sensorconfig = NULL;
-static int l_enable = 0; // 0:don't report data
-static int p_enable = 0; // 0:don't report data
-
-extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlen);
-static int no_adc_map = 1;
-
-static DEFINE_MUTEX(mutex);
-
-static int us5182_i2c_read(struct i2c_client *client,u8 reg)
-{
-#if 0
- int val;
- val = i2c_smbus_read_byte_data(client, reg);
- if (val < 0)
- printk("%s %d i2c transfer error\n", __func__, __LINE__);
- return val;
-#endif
-//in default our i2c controller, will not send repeatStart signal in read process.(stop-start)
-//well this sensor must have the repeatStart signal to work normally
-//so we have to pass I2C_M_NOSTART flag to controller 2013-7-5
- char rdData[2] = {0};
-
- struct i2c_msg msgs[2] =
- {
- {.addr = client->addr, .flags = 0|I2C_M_NOSTART, .len = 1, .buf = rdData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = rdData,},
- };
- rdData[0] = reg;
-
- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
- printk( "%s: transfer failed.", __func__);
- return -EIO;
- }
-
- return rdData[0];
-}
-
-static int get_als_resolution(struct i2c_client *client)
-{
- return (us5182_i2c_read(client,REGS_CR01) & 0x18) >> 3;
-}
-
-
-static int isl_get_lux_datal(struct i2c_client* client)
-{
-
- int lsb, msb, bitdepth;
-
- mutex_lock(&mutex);
- lsb = us5182_i2c_read(client, REGS_LSB_SENSOR);//
-
- if (lsb < 0) {
- mutex_unlock(&mutex);
- return lsb;
- }
-
- msb = us5182_i2c_read(client, REGS_MSB_SENSOR);//
- mutex_unlock(&mutex);
-
- if (msb < 0)
- return msb;
-
- bitdepth = get_als_resolution(client);//?????
- switch(bitdepth){
- case 0:
- lsb &= 0xF0; // 12bit??
- lsb >>= 4; //add
- return ((msb << 4) | lsb);
- break;
- case 1:
- lsb &= 0xFC; //?? 14bit
- lsb >>= 2;
- return ((msb << 6) | lsb);
- break;
- }
-
- return ((msb << 8) | lsb);
-}
-
-
-static int get_ps_resolution(struct i2c_client *client)
-{
- u8 data;
-
- data = (us5182_i2c_read(client,REGS_CR02) & 0x18) >> 3;
-
- return data;
-}
-
-static int isl_get_lux_datap(struct i2c_client* client)
-{
-
- int lsb, msb, bitdepth;
-
- mutex_lock(&mutex);
- lsb = us5182_i2c_read(client, REGS_LSB_SENSOR_PS);
-
- if (lsb < 0) {
- mutex_unlock(&mutex);
- return lsb;
- }
-
- msb = us5182_i2c_read(client, REGS_MSB_SENSOR_PS);
- mutex_unlock(&mutex);
-
- if (msb < 0)
- return msb;
-
- bitdepth = get_ps_resolution(client);
- switch(bitdepth){
- case 0:
- lsb &= 0xF0; // 12bit ??
- lsb >>= 4;
- return ((msb << 4) | lsb);
- break;
- case 1:
- lsb &= 0xFC; // 14bit ??
- lsb >>= 2;
- return ((msb << 6) | lsb);
- break;
- }
-
- return ((msb << 8) | lsb); //we use 16bit now
-}
-
-
-
-/* Return 0 if detection is successful, -ENODEV otherwise */
-static int us5182_detect(struct i2c_client *client/*, int kind,
- struct i2c_board_info *info*/)
-{
-
- char rxData[2] = {0xb2, 0};
- int ret = 0;
-
-#if 1
- //rxData[0] = 0xb2;
-
- struct i2c_msg msgs[2] = {
-
- {.addr = client->addr, .flags = 0|I2C_M_NOSTART, .len = 1, .buf = rxData,},
- {.addr = client->addr, .flags = I2C_M_RD, .len = 1, .buf = rxData,}
- };
- ret = i2c_transfer(client->adapter, msgs, 2);
- if (ret < 0){
- printk(KERN_ERR "%s i2c_transfer error!\n", __FUNCTION__);
- return -EIO;
- }
-
-#endif
-
- if(0x26 == rxData[0])
- {
- printk(KERN_ALERT "us5182 detected OK\n");
- return 0;
- }
- else
- return -1;
-}
-
-int isl_input_open(struct input_dev* input)
-{
- return 0;
-}
-
-void isl_input_close(struct input_dev* input)
-{
-}
-
-//Fixme plan to transfer the adc value to the config.xml lux 2013-5-10
-static __u16 uadc[8] = {2, 8, 100, 400, 900, 1000, 1500, 1900};//customize
-static __u16 ulux[9] = {128, 200, 1300, 2000, 3000, 4000, 5000, 6000, 7000};
-static __u16 adc_to_lux(__u16 adc)
-{
- static long long var = 0;
- int i = 0; //length of array is 8,9
- for (i=0; i<8; i++) {
- if ( adc < uadc[i]){
- break;
- }
- }
- if ( i<9)
- {
- var++;
- if (var%2)
- return ulux[i]+0;
- else
- return ulux[i]-1;
- }
- return ulux[4];
-}
-
-static void isl_input_lux_poll_l(struct input_polled_dev *dev)
-{
- struct us_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devl->input;
- struct i2c_client* client = idev->client;
- int ret_val = 0;
-
- if (client == NULL){
- printk("%s client NULL!\n", __FUNCTION__);
- return;
- }
-
- //printk("%s\n", __FUNCTION__);
- if (l_enable != 0)
- {
- //mutex_lock(&mutex); //dead lock!! 2013-7-9!!!
- //printk(KERN_ALERT "by flashchen val is %x",val);
- ret_val = isl_get_lux_datal(client); //adc
- if (ret_val < 0)
- return;
- if (!no_adc_map)
- ret_val = adc_to_lux(ret_val);
-
- input_report_abs(input, ABS_MISC, ret_val);
- //printk("%s %d\n", __FUNCTION__, ret_val);
- input_sync(input);
- //mutex_unlock(&mutex);
- }
-}
-
-static void isl_input_lux_poll_p(struct input_polled_dev *dev)
-{
- struct us_device* idev = dev->private;
- struct input_dev* input = idev->input_poll_devp->input;
- struct i2c_client* client = idev->client;
-
- int tmp_val = 0, debounce = 0;
- int ret_val = 0;
-
- //printk("%s\n", __FUNCTION__);
- if (p_enable != 0)
- {
- //mutex_lock(&mutex);
- //printk(KERN_ALERT "by flashchen val is %x",val);
-
- #if 0 //just read raw data out 2013-7-18
- for (debounce=0; debounce<10; debounce++){
- ret_val = isl_get_lux_datap(client);
- if (ret_val < 0)
- return;
-
- tmp_val += ret_val;
- msleep(1);
- }
- tmp_val /= 10;
- //add for near/far detection!
- if (tmp_val > 0x00ff)
- tmp_val = 6;
- else
- tmp_val = 0;
- input_report_abs(input, ABS_MISC, tmp_val);
- input_sync(input);
- #endif
-
- tmp_val = us5182_i2c_read(client, REGS_CR00);
-
- if (tmp_val & CR0_PROX_MASK) //approach
- input_report_abs(input, ABS_MISC, 0);
- else
- input_report_abs(input, ABS_MISC, 6);
-
- input_sync(input);
- //printk("%s %d\n", __FUNCTION__, tmp_val);
- //mutex_unlock(&mutex);
- }
-}
-
-#if 0
-static struct i2c_device_id us5182_id[] = {
- {"us5182", 0},
- {}
-};
-
-MODULE_DEVICE_TABLE(i2c, us5182_id);
-#endif // 2013-7-9
-
-static int mmad_open(struct inode *inode, struct file *file)
-{
- dbg("Open the l-sensor node...\n");
- return 0;
-}
-
-static int mmad_release(struct inode *inode, struct file *file)
-{
- dbg("Close the l-sensor node...\n");
- return 0;
-}
-
-static ssize_t mmadl_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
- //printk("%s try to mutex_lock \n", __FUNCTION__);
- //mutex_lock(&mutex);
- //printk("lock ok!\n");
- lux_data = isl_get_lux_datal(l_sensorconfig->client);
- //mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- printk("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- //return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-
-static ssize_t mmadp_read(struct file *fl, char __user *buf, size_t cnt, loff_t *lf)
-{
- int lux_data = 0;
-
- //mutex_lock(&mutex);
- lux_data = isl_get_lux_datap(l_sensorconfig->client);
- //mutex_unlock(&mutex);
- if (lux_data < 0)
- {
- errlog("Failed to read lux data!\n");
- return -1;
- }
- printk(KERN_ALERT "lux_data is %x\n",lux_data);
- //return 0;
- copy_to_user(buf, &lux_data, sizeof(lux_data));
- return sizeof(lux_data);
-}
-
-static long
-mmadl_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
-
- //printk("l-sensor ioctr... cmd 0x%x arg %d\n", cmd, arg);
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- l_enable = enable;
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("us5182_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static long
-mmadp_ioctl(/*struct inode *inode,*/ struct file *file, unsigned int cmd,
- unsigned long arg)
-{
- void __user *argp = (void __user *)arg;
- //char rwbuf[5];
- short enable; //amsr = -1;
- unsigned int uval;
- unsigned char regval;
-
- dbg("l-sensor ioctr...\n");
- //memset(rwbuf, 0, sizeof(rwbuf));
- switch (cmd) {
- case LIGHT_IOCTL_SET_ENABLE:
- // enable/disable sensor
- if (copy_from_user(&enable, argp, sizeof(short)))
- {
- printk(KERN_ERR "Can't get enable flag!!!\n");
- return -EFAULT;
- }
- dbg("enable=%d\n",enable);
- if ((enable >=0) && (enable <=1))
- {
- dbg("driver: disable/enable(%d) gsensor.\n", enable);
-
- //l_sensorconfig.sensor_enable = enable;
- dbg("Should to implement d/e the light sensor!\n");
- p_enable = enable;
- #if 1
- if(p_enable)
- {
- regval = us5182_i2c_read(l_sensorconfig->client, 0);
- regval &= ~(3 << 4);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- else
- {
- regval = us5182_i2c_read(l_sensorconfig->client, 0);
- regval &= ~(3 << 4);
- regval |= (1 << 4);
- i2c_smbus_write_byte_data(l_sensorconfig->client, 0, regval);
- }
- #endif
-
- } else {
- printk(KERN_ERR "Wrong enable argument in %s !!!\n", __FUNCTION__);
- return -EINVAL;
- }
- break;
- case WMT_IOCTL_SENSOR_GET_DRVID:
-#define DRVID 0
- uval = DRVID ;
- if (copy_to_user((unsigned int*)arg, &uval, sizeof(unsigned int)))
- {
- return -EFAULT;
- }
- dbg("us5182_driver_id:%d\n",uval);
- default:
- break;
- }
-
- return 0;
-}
-
-
-static struct file_operations mmadl_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadl_read,
- .unlocked_ioctl = mmadl_ioctl,
-};
-
-static struct miscdevice mmadl_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "lsensor_ctrl",
- .fops = &mmadl_fops,
-};
-
-static struct file_operations mmadp_fops = {
- .owner = THIS_MODULE,
- .open = mmad_open,
- .release = mmad_release,
- .read = mmadp_read,
- .unlocked_ioctl = mmadp_ioctl,
-};
-
-static struct miscdevice mmadp_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = "psensor_ctrl",
- .fops = &mmadp_fops,
-};
-
-#ifdef CONFIG_HAS_EARLYSUSPEND
-static void us5182_early_suspend(struct early_suspend *h)
-{
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, ISL_MOD_POWERDOWN);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-
-static void us5182_late_resume(struct early_suspend *h)
-{
- struct i2c_client *client = l_sensorconfig->client;
-
- dbg("start\n");
- mutex_lock(&mutex);
- //pm_runtime_get_sync(dev);
- //isl_set_mod(client, last_mod);
- //isl_set_default_config(client);
- //pm_runtime_put_sync(dev);
- mutex_unlock(&mutex);
- dbg("exit\n");
-}
-#endif
-
-int us5182_i2c_write(struct i2c_client *client, u8 reg,u8 mask, u8 shift, int val ) {
- //struct us5182_data *data = i2c_get_clientdata(client);
- int err;
- u8 tmp;
- mutex_lock(&mutex);
-
- tmp = reg_cache[reg];
- tmp &= ~mask;
- tmp |= val << shift;
-
- err = i2c_smbus_write_byte_data(client, reg, tmp);
- if (!err)
- reg_cache[reg] = tmp;
-
- mutex_unlock(&mutex);
- if (err >= 0) return 0;
-
- printk("%s %d i2c transfer error\n", __func__, __LINE__);
- return err;
-}
-
-
-static int set_word_mode(struct i2c_client *client, int mode)
-{
- //
- return us5182_i2c_write(client, REGS_CR00,
- CR0_WORD_MASK, CR0_WORD_SHIFT, mode);
-}
-
-
-static int set_oneshotmode(struct i2c_client *client, int mode)
-{
- return us5182_i2c_write(client,REGS_CR00,CR0_ONESHOT_MASK, CR0_ONESHOT_SHIFT, mode);
-}
-
-
-static int set_opmode(struct i2c_client *client, int mode)
-{
- return us5182_i2c_write(client,REGS_CR00,CR0_OPMODE_MASK,
- CR0_OPMODE_SHIFT, mode);
-}
-
-/* power_status */
-static int set_power_status(struct i2c_client *client, int status)
-{
- if(status == CR0_SHUTDOWN_EN )
- return us5182_i2c_write(client,REGS_CR00,CR0_SHUTDOWN_MASK,
- CR0_SHUTDOWN_SHIFT,CR0_SHUTDOWN_EN);
- else
- return us5182_i2c_write(client,REGS_CR00,CR0_SHUTDOWN_MASK,
- CR0_SHUTDOWN_SHIFT, CR0_OPERATION);
-}
-
-
-static int us5182_init_client(struct i2c_client *client)
-{
-
- struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
- int i = 0;
- int v = -1;
- if ( !i2c_check_functionality(adapter,I2C_FUNC_SMBUS_BYTE_DATA) ) {
- printk(KERN_INFO "byte op is not permited.\n");
- return -EIO;
- }
-
- /* read all the registers once to fill the cache.
- * if one of the reads fails, we consider the init failed */
-
- for (i = 0; i < ARRAY_SIZE(reg_cache); i++) {
- v = us5182_i2c_read(client, i);
- printk("reg 0x%x value 0x%x \n", i, v);
- if (v < 0)
- return -ENODEV;
- reg_cache[i] = v;
- }
-
- /*Set Default*/
- set_word_mode(client, 0);//word enable? //just byte one time
- set_power_status(client,CR0_OPERATION); //power on?
- set_opmode(client,CR0_OPMODE_ALSONLY); //CR0_OPMODE_ALSANDPS CR0_OPMODE_ALSONLY
- set_oneshotmode(client, CR0_ONESHOT_DIS);
-
- us5182_i2c_write(client, REGS_CR03, CR3_LEDDR_MASK, CR3_LEDDR_SHIFT, CR3_LEDDR_50);
-
- //set als gain
- us5182_i2c_write(client, REGS_CR01, CR1_ALS_GAIN_MASK, CR1_ALS_GAIN_SHIFT, CR1_ALS_GAIN_X8);
-
- //set ps threshold --> lth, hth
- us5182_i2c_write(client, REGS_INT_LSB_TH_HI_PS, 0xff, 0, psh_l8th); //
- us5182_i2c_write(client, REGS_INT_MSB_TH_HI_PS, 0xff, 0, psh_h8th); //0 default
-
- us5182_i2c_write(client, REGS_INT_LSB_TH_LO_PS, 0xff, 0, psl_l8th); //
- us5182_i2c_write(client, REGS_INT_MSB_TH_LO_PS, 0xff, 0, psl_h8th); // 0 default
- //set_resolution(client,us5182_RES_16);
- //set_range(client,3);
- //set_int_ht(client,0x3E8); //1000 lux
- //set_int_lt(client,0x8); //8 lux
- //dev_info(&data->client->dev, "us5182 ver. %s found.\n",DRIVER_VERSION);
-
- /*init global variable*/
- error_flag = 0;
- previous_value = 0;
- this_value = 0;
- debounces = 2;//debounces 5 times
- return 0;
-}
-//******add for sys debug devic_attribute
-static ssize_t reg_show(struct device *dev, struct device_attribute *attr, char *buf) {
-
- int i = 0, val = 0;
- printk("<<<<<<<<<reg dump\n");
-
- for (i=0; i<=0x1f; i++) {
- val = us5182_i2c_read(gclient, i);
- printk("reg 0x%x: val 0x%x \n", i, val);
-
- }
- printk("\n");
- printk("<<<<<<<<<<<<<<<<<<<<dump end\n");
- return 0;
-}
-
-static ssize_t reg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {
-
- int reg = 0, val = 0;
- int ret = 0;
- int res = 0;
-
- printk("buf is %s\n", buf);
-
- ret = sscanf(buf, "%x:%x", &reg, &val);
- printk("reg:val is 0x%x:0x%x\n", reg, val);
-
- if (reg<0 || val<0) {
- printk("param error!\n");
- return -1;
- }
-
- res = us5182_i2c_read(gclient, reg);
- i2c_smbus_write_byte_data(gclient, reg, val);
- printk(KERN_ERR "reg 0x%x 0x%x -->0x%x\n", reg, res, val);
-
- return count;
-}
-//struct device_attribute dev_attr_reg = __ATTR(reg, 0644, reg_show, reg_store);
-//DEVICE_ATTR(reg, 0644, reg_show, reg_store);
-
-static ssize_t adc_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
-
- int i;
- int size = sizeof(uadc)/sizeof(uadc[0]);
- printk("<<<%s\n", __FUNCTION__);
- for (i=0; i<size; i++)
- {
- printk(" %5d ", uadc[i]);
- //sprintf(buf, "%d " &uadc[i]);
- }
- printk("\n");
-
- return sizeof(uadc);
- //printk(" %s \n", buf);
-}
-
-static ssize_t adc_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
-{
- __u32 tmp;
- int index;
- int n;
- int size = sizeof(uadc)/sizeof(uadc[0]);
-
- printk("<<<%s\n", __FUNCTION__);
- printk("<< %s >>>\n", buf);
- n = sscanf(buf, "%d:%d", &index, &tmp);
- printk("<<<<int n %d %d:%d \n", n, index, tmp);
- if ( n==2 && index>=0 && index<size){
-
- uadc[index] = tmp;
- no_adc_map = 0;
- }
- else {
- printk("<<<param error!\n");
- no_adc_map = 1;
- }
- return count;
-}
-
-static struct device_attribute us5182_attr[] =
-{
- __ATTR(reg, 0644, reg_show, reg_store),
- __ATTR(adc, 0644, adc_show, adc_store),
- __ATTR_NULL,
-};
-
-static int device_create_attribute(struct device *dev, struct device_attribute *attr)
-{
- int err = 0, i;
- for (i=0; NULL != attr[i].attr.name; i++)
- {
- err = device_create_file(dev, &attr[i]); //&attr[i].attr
- if (err)
- break;
- }
- if (err)
- {
- for (; i>=0; i--)
- device_remove_file(dev, &attr[i]);//&attr[i].attr
- }
- return err;
-}
-
-static void device_remove_attribute(struct device *dev, struct device_attribute *attr)
-{
- int i;
- for (i=0; attr[i].attr.name != NULL; i++)
- device_remove_file(dev, &attr[i]); //&attr[i].attr
-}
-//add end
-static int
-us5182_probe(struct i2c_client *client, const struct i2c_device_id *id)
-{
- int res=0;
-
- struct us_device* idev = kzalloc(sizeof(struct us_device), GFP_KERNEL);
- if(!idev)
- return -ENOMEM;
-
- l_sensorconfig = idev;
-
- /*initial enable device id*/
- idev->enable_id = 0x00;
-
- gclient = client;
- /* initialize the us5182 chip */
- res = us5182_init_client(client);//
-
- if (res != 0)
- goto err_input_allocate_device;
-/* last mod is ALS continuous */
- //pm_runtime_enable(&client->dev);
- idev->input_poll_devl = input_allocate_polled_device();
- if(!idev->input_poll_devl)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->input_poll_devp = input_allocate_polled_device();
- if(!idev->input_poll_devp)
- {
- res = -ENOMEM;
- goto err_input_allocate_device;
- }
- idev->client = client;
-
- idev->input_poll_devl->private = idev;
- idev->input_poll_devl->poll = isl_input_lux_poll_l;
- idev->input_poll_devl->poll_interval = 100;//50;
- idev->input_poll_devl->input->open = isl_input_open;
- idev->input_poll_devl->input->close = isl_input_close;
- idev->input_poll_devl->input->name = "lsensor_lux";
- idev->input_poll_devl->input->id.bustype = BUS_I2C;
- idev->input_poll_devl->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devl->input, idev);
- input_set_capability(idev->input_poll_devl->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devl->input, ABS_MISC, 0, 16000, 0, 0);
-
- idev->input_poll_devp->private = idev;
- idev->input_poll_devp->poll = isl_input_lux_poll_p;
- idev->input_poll_devp->poll_interval = 10;//100; 50ms
- idev->input_poll_devp->input->open = isl_input_open;
- idev->input_poll_devp->input->close = isl_input_close;
- idev->input_poll_devp->input->name = "psensor_lux";
- idev->input_poll_devp->input->id.bustype = BUS_I2C;
- idev->input_poll_devp->input->dev.parent = &client->dev;
-
- input_set_drvdata(idev->input_poll_devp->input, idev);
- input_set_capability(idev->input_poll_devp->input, EV_ABS, ABS_MISC);
- input_set_abs_params(idev->input_poll_devp->input, ABS_MISC, 0, 16000, 0, 0);
- i2c_set_clientdata(client, idev);
- /* set default config after set_clientdata */
- //res = isl_set_default_config(client);
- res = misc_register(&mmadl_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerl;
- }
- res = misc_register(&mmadp_device);
- if (res) {
- errlog("mmad_device register failed\n");
- goto err_misc_registerp;
- }
- res = input_register_polled_device(idev->input_poll_devl);
- if(res < 0)
- goto err_input_register_devicel;
- res = input_register_polled_device(idev->input_poll_devp);
- if(res < 0)
- goto err_input_register_devicep;
- // suspend/resume register
-#ifdef CONFIG_HAS_EARLYSUSPEND
- idev->earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
- idev->earlysuspend.suspend = us5182_early_suspend;
- idev->earlysuspend.resume = us5182_late_resume;
- register_early_suspend(&(idev->earlysuspend));
-#endif
-
- dbg("us5182 probe succeed!\n");
- res = alloc_chrdev_region(&idev->devno, 0, 1, "us5182");
- if(res)
- {
- printk("can't allocate chrdev\n");
- return 0;
- }
- idev->class = class_create(THIS_MODULE, "us5182-lsensor");
- if (IS_ERR(idev->class)) {
- printk("<<< %s class_create() error!\n", __FUNCTION__);
- return 0;
- }
- idev->lsdev = device_create(idev->class, NULL, idev->devno, NULL, "us5182");
- if (IS_ERR(idev->lsdev)) {
- printk("<<< %s device_create() error!\n", __FUNCTION__);
- return 0;
- }
- res = device_create_attribute(idev->lsdev, us5182_attr);
- return 0;
-err_input_register_devicep:
- input_free_polled_device(idev->input_poll_devp);
-err_input_register_devicel:
- input_free_polled_device(idev->input_poll_devl);
-err_misc_registerp:
- misc_deregister(&mmadp_device);
-err_misc_registerl:
- misc_deregister(&mmadl_device);
-err_input_allocate_device:
- //__pm_runtime_disable(&client->dev, false);
- kfree(idev);
- return res;
-}
-
-static int us5182_remove(struct i2c_client *client)
-{
- int i = 0;
- struct us_device* idev = i2c_get_clientdata(client);
-#if 1
- //device_remove_file(idev->lsdev, &dev_attr_reg);
- device_remove_attribute(idev->lsdev, us5182_attr);
- unregister_chrdev_region(idev->devno, 1);
- device_destroy(idev->class, idev->devno);
- class_destroy(idev->class);
-#endif
- printk("%s %d\n", __FUNCTION__, i++); // 0
- //unregister_early_suspend(&(idev->earlysuspend));
- misc_deregister(&mmadl_device);
- printk("%s %d\n", __FUNCTION__, i++);
- misc_deregister(&mmadp_device);
- printk("%s %d\n", __FUNCTION__, i++);
- input_unregister_polled_device(idev->input_poll_devl);//here block??
- printk("%s %d\n", __FUNCTION__, i++);
- input_unregister_polled_device(idev->input_poll_devp);
- printk("%s %d\n", __FUNCTION__, i++);
- input_free_polled_device(idev->input_poll_devl);
- printk("%s %d\n", __FUNCTION__, i++);
- input_free_polled_device(idev->input_poll_devp);
- printk("%s %d\n", __FUNCTION__, i++);
- //__pm_runtime_disable(&client->dev, false);
-
- kfree(idev);
- printk(KERN_INFO MODULE_NAME ": %s us5182 remove call, \n", __func__);
- return 0;
-}
-static void us5182_shutdown(struct i2c_client *client)
-{
- l_enable = 0;
- p_enable = 0;
-}
-
-static int us5182_suspend(struct i2c_client *client, pm_message_t message)
-{
- return 0;
-}
-static int us5182_resume(struct i2c_client *client)
-{
- int res = 0;
- res = us5182_init_client(client);//
- return 0;
-}
-
-static const struct i2c_device_id us5182_id[] = {
- { SENSOR_I2C_NAME , 0 },
- {},
-};
-
-
-static struct i2c_driver us5182_i2c_driver =
-{
- .probe = us5182_probe,
- .remove = us5182_remove,
- .suspend = us5182_suspend,
- .resume = us5182_resume,
- .shutdown = us5182_shutdown,
- .driver = {
- .name = SENSOR_I2C_NAME,
- .owner = THIS_MODULE,
- },
- .id_table = us5182_id,
-};
-
-static int get_adc_val(void)
-{
- int i=0, varlen=0, n=0;
- __u32 buf[8] = {0};
- char varbuf[50] ={0};
- char *name = "wmt.io.lsensor";
- char *psth = "wmt.io.psensor";
- int thbuf[4] = {0};
-
- varlen = sizeof(varbuf);
- if (wmt_getsyspara(psth, varbuf, &varlen))
- {
- printk("<<<<fail to wmt_syspara %s\n", "wmt.io.psensor");
-
- }
- else
- {
- n = sscanf(varbuf, "%d:%d:%d:%d", &thbuf[0], &thbuf[1], &thbuf[2], &thbuf[3]);
- if (n == 4)
- {
- psh_h8th = thbuf[0];
- psh_l8th = thbuf[1];
- psl_h8th = thbuf[2];
- psl_l8th = thbuf[3];
- }
- else
- printk("wmt.io.psensor error!\n");
- }
- if (wmt_getsyspara(name, varbuf, &varlen))
- {
- printk("<<<<fail to wmt_syspara %s\n", "wmt.io.lsensor");
- no_adc_map = 1;
- return -1;
- }
- n = sscanf(varbuf, "%d:%d:%d:%d:%d:%d:%d:%d", &buf[0], &buf[1], &buf[2], &buf[3], &buf[4], &buf[5], \
- &buf[6], &buf[7]);
- //printk("<<< n %d \n", n);
- if (n != 8)
- {
- printk("<<<<<%s uboot env wmt.io.lsensor param error!\n", __FUNCTION__);
- return -1;
- }
- for (i=0; i<8; i++)
- {
- //printk("<<<< %5d ", buf[i]);
- uadc[i] = buf[i];
- }
- no_adc_map = 0;
- //printk("\n");
- return 0;
-}
-
-static int __init sensor_us5182_init(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s us5182 init call, \n", __func__);
- /*
- * Force device to initialize: i2c-15 0x44
- * If i2c_new_device is not called, even us5182_detect will not run
- * TODO: rework to automatically initialize the device
- */
- //i2c_new_device(i2c_get_adapter(15), &isl_info);
- //return i2c_add_driver(&us5182_driver);
- if (!(this_client = sensor_i2c_register_device(4, SENSOR_I2C_ADDR, SENSOR_I2C_NAME)))
- {
- printk(KERN_EMERG"Can't register gsensor i2c device!\n");
- return -1;
- }
- if (us5182_detect(this_client)) //
- {
- errlog("Can't find light sensor us5182!\n");
- goto detect_fail;
- }
-
- get_adc_val();
-/*
- if(us5182_probe(this_client))
- {
- errlog("Erro for probe!\n");
- goto detect_fail;
- }
-*/
- if(i2c_add_driver(&us5182_i2c_driver) < 0)
- {
- errlog("Erro for i2c_add_driver()!\n");
- goto detect_fail;
- }
- return 0;
-
-detect_fail:
- sensor_i2c_unregister_device(this_client);
- return -1;
-}
-
-static void __exit sensor_us5182_exit(void)
-{
- printk(KERN_INFO MODULE_NAME ": %s us5182 exit call \n", __func__);
- //us5182_remove(this_client);
- i2c_del_driver(&us5182_i2c_driver);
- sensor_i2c_unregister_device(this_client);
-
-}
-
-module_init(sensor_us5182_init);
-module_exit(sensor_us5182_exit);
-
-MODULE_AUTHOR("rambo");
-MODULE_ALIAS("us5182 ALS");
-MODULE_DESCRIPTION("us5182 Driver");
-MODULE_LICENSE("GPL v2");
-
diff --git a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.h b/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.h
deleted file mode 100755
index 361d91e8..00000000
--- a/ANDROID_3.4.5/drivers/input/sensor/us5182_lpsensor/us5182.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2012 UPI finley_huang <finley_huang@upi-semi.com>. All Rights Reserved.
- * us5182 Light Sensor Driver for Linux 2.6
- */
-
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef __us5182_H__
-#define __us5182_H__
-
-#include <linux/types.h>
-
-#define SENSOR_I2C_NAME "us5182"
-#define SENSOR_I2C_ADDR (0x72>>1) //0x72 //7bit 0x39
-/*us5182 Slave Addr*/
-#define LIGHT_ADDR 0x39 //0x72 //7bit 0x39
-
-/*Interrupt PIN for S3C6410*/
-//#define IRQ_LIGHT_INT IRQ_EINT(6) //comment for compile error
-
-/*Register Set*/
-#define REGS_CR00 0x00
-#define REGS_CR01 0x01
-#define REGS_CR02 0x02
-#define REGS_CR03 0x03
-//ALS
-#define REGS_INT_LSB_TH_LO 0x04
-#define REGS_INT_MSB_TH_LO 0x05
-#define REGS_INT_LSB_TH_HI 0x06
-#define REGS_INT_MSB_TH_HI 0x07
-//PS
-#define REGS_INT_LSB_TH_LO_PS 0x08
-#define REGS_INT_MSB_TH_LO_PS 0x09
-#define REGS_INT_LSB_TH_HI_PS 0x0A
-#define REGS_INT_MSB_TH_HI_PS 0x0B
-//ALS data
-#define REGS_LSB_SENSOR 0x0C
-#define REGS_MSB_SENSOR 0x0D
-//PS data
-#define REGS_LSB_SENSOR_PS 0x0E
-#define REGS_MSB_SENSOR_PS 0x0F
-
-#define REGS_CR10 0x10
-#define REGS_CR11 0x11
-#define REGS_CR16 0x16
-#define REGS_CR20 0x20
-#define REGS_CR21 0x21
-#define REGS_CR22 0x22
-#define REGS_CR29 0x29
-#define REGS_CR2A 0x2A
-#define REGS_CR2B 0x2B
-#define REGS_VERSION_ID 0x1F
-#define REGS_CHIP_ID 0xB2
-
-/*ShutDown_EN*/
-#define CR0_OPERATION 0x0
-#define CR0_SHUTDOWN_EN 0x1
-
-#define CR0_SHUTDOWN_SHIFT (7)
-#define CR0_SHUTDOWN_MASK (0x1 << CR0_SHUTDOWN_SHIFT)
-
-/*OneShot_EN*/
-#define CR0_ONESHOT_EN 0x01
-#define CR0_ONESHOT_DIS 0x00
-#define CR0_ONESHOT_SHIFT (6)
-#define CR0_ONESHOT_MASK (0x1 << CR0_ONESHOT_SHIFT)
-
-/*Operation Mode*/
-#define CR0_OPMODE_ALSANDPS 0x0
-#define CR0_OPMODE_ALSONLY 0x1
-#define CR0_OPMODE_IRONLY 0x2
-
-#define CR0_OPMODE_SHIFT (4)
-#define CR0_OPMODE_MASK (0x3 << CR0_OPMODE_SHIFT)
-
-/*all int flag (PROX, INT_A, INT_P)*/
-#define CR0_ALL_INT_CLEAR 0x0
-
-#define CR0_ALL_INT_SHIFT (1)
-#define CR0_ALL_INT_MASK (0x7 << CR0_ALL_INT_SHIFT)
-
-
-/*indicator of object proximity detection*/
-#define CR0_PROX_CLEAR 0x0
-
-#define CR0_PROX_SHIFT (3)
-#define CR0_PROX_MASK (0x1 << CR0_PROX_SHIFT)
-
-/*interrupt status of proximity sensor*/
-#define CR0_INTP_CLEAR 0x0
-
-#define CR0_INTP_SHIFT (2)
-#define CR0_INTP_MASK (0x1 << CR0_INTP_SHIFT)
-
-/*interrupt status of ambient sensor*/
-#define CR0_INTA_CLEAR 0x0
-
-#define CR0_INTA_SHIFT (1)
-#define CR0_INTA_MASK (0x1 << CR0_INTA_SHIFT)
-
-/*Word mode enable*/
-#define CR0_WORD_EN 0x1
-
-#define CR0_WORD_SHIFT (0)
-#define CR0_WORD_MASK (0x1 << CR0_WORD_SHIFT)
-
-
-/*ALS fault queue depth for interrupt enent output*/
-#define CR1_ALS_FQ_1 0x0
-#define CR1_ALS_FQ_4 0x1
-#define CR1_ALS_FQ_8 0x2
-#define CR1_ALS_FQ_16 0x3
-#define CR1_ALS_FQ_24 0x4
-#define CR1_ALS_FQ_32 0x5
-#define CR1_ALS_FQ_48 0x6
-#define CR1_ALS_FQ_63 0x7
-
-#define CR1_ALS_FQ_SHIFT (5)
-#define CR1_ALS_FQ_MASK (0x7 << CR1_ALS_FQ_SHIFT)
-
-/*resolution for ALS*/
-#define CR1_ALS_RES_12BIT 0x0
-#define CR1_ALS_RES_14BIT 0x1
-#define CR1_ALS_RES_16BIT 0x2
-#define CR1_ALS_RES_16BIT_2 0x3
-
-#define CR1_ALS_RES_SHIFT (3)
-#define CR1_ALS_RES_MASK (0x3 << CR1_ALS_RES_SHIFT)
-
-/*sensing amplifier selection for ALS*/
-#define CR1_ALS_GAIN_X1 0x0
-#define CR1_ALS_GAIN_X2 0x1
-#define CR1_ALS_GAIN_X4 0x2
-#define CR1_ALS_GAIN_X8 0x3
-#define CR1_ALS_GAIN_X16 0x4
-#define CR1_ALS_GAIN_X32 0x5
-#define CR1_ALS_GAIN_X64 0x6
-#define CR1_ALS_GAIN_X128 0x7
-
-#define CR1_ALS_GAIN_SHIFT (0)
-#define CR1_ALS_GAIN_MASK (0x7 << CR1_ALS_GAIN_SHIFT)
-
-
-/*PS fault queue depth for interrupt event output*/
-#define CR2_PS_FQ_1 0x0
-#define CR2_PS_FQ_4 0x1
-#define CR2_PS_FQ_8 0x2
-#define CR2_PS_FQ_15 0x3
-
-#define CR2_PS_FQ_SHIFT (6)
-#define CR2_PS_FQ_MASK (0x3 << CR2_PS_FQ_SHIFT)
-
-/*interrupt type setting */
-/*low active*/
-#define CR2_INT_LEVEL 0x0
-/*low pulse*/
-#define CR2_INT_PULSE 0x1
-
-#define CR2_INT_SHIFT (5)
-#define CR2_INT_MASK (0x1 << CR2_INT_SHIFT)
-
-/*resolution for PS*/
-#define CR2_PS_RES_12 0x0
-#define CR2_PS_RES_14 0x1
-#define CR2_PS_RES_16 0x2
-#define CR2_PS_RES_16_2 0x3
-
-#define CR2_PS_RES_SHIFT (3)
-#define CR2_PS_RES_MASK (0x3 << CR2_PS_RES_SHIFT)
-
-/*sensing amplifier selection for PS*/
-#define CR2_PS_GAIN_1 0x0
-#define CR2_PS_GAIN_2 0x1
-#define CR2_PS_GAIN_4 0x2
-#define CR2_PS_GAIN_8 0x3
-#define CR2_PS_GAIN_16 0x4
-#define CR2_PS_GAIN_32 0x5
-#define CR2_PS_GAIN_64 0x6
-#define CR2_PS_GAIN_128 0x7
-
-#define CR2_PS_GAIN_SHIFT (0)
-#define CR2_PS_GAIN_MASK (0x7 << CR2_PS_GAIN_SHIFT)
-
-/*wait-time slot selection*/
-#define CR3_WAIT_SEL_0 0x0
-#define CR3_WAIT_SEL_4 0x1
-#define CR3_WAIT_SEL_8 0x2
-#define CR3_WAIT_SEL_16 0x3
-
-#define CR3_WAIT_SEL_SHIFT (6)
-#define CR3_WAIT_SEL_MASK (0x3 << CR3_WAIT_SEL_SHIFT)
-
-/*IR-LED drive peak current setting*/
-#define CR3_LEDDR_12_5 0x0
-#define CR3_LEDDR_25 0x1
-#define CR3_LEDDR_50 0x2
-#define CR3_LEDDR_100 0x3
-
-#define CR3_LEDDR_SHIFT (4)
-#define CR3_LEDDR_MASK (0x3 << CR3_LEDDR_SHIFT)
-
-/*INT pin source selection*/
-#define CR3_INT_SEL_BATH 0x0
-#define CR3_INT_SEL_ALS 0x1
-#define CR3_INT_SEL_PS 0x2
-#define CR3_INT_SEL_PSAPP 0x3
-
-#define CR3_INT_SEL_SHIFT (2)
-#define CR3_INT_SEL_MASK (0x3 << CR3_INT_SEL_SHIFT)
-
-/*software reset for register and core*/
-#define CR3_SOFTRST_EN 0x1
-
-#define CR3_SOFTRST_SHIFT (0)
-#define CR3_SOFTRST_MASK (0x1 << CR3_SOFTRST_SHIFT)
-
-/*modulation frequency of LED driver*/
-#define CR10_FREQ_DIV2 0x0
-#define CR10_FREQ_DIV4 0x1
-#define CR10_FREQ_DIV8 0x2
-#define CR10_FREQ_DIV16 0x3
-
-#define CR10_FREQ_SHIFT (1)
-#define CR10_FREQ_MASK (0x3 << CR10_FREQ_SHIFT)
-
-/*50/60 Rejection enable*/
-#define CR10_REJ_5060_DIS 0x00
-#define CR10_REJ_5060_EN 0x01
-
-#define CR10_REJ_5060_SHIFT (0)
-#define CR10_REJ_5060_MASK (0x1 << CR10_REJ_5060_SHIFT)
-
-#define us5182_NUM_CACHABLE_REGS 0x12
-
-/*enable sensor*/
-#define ID_LIGHT 0
-#define ID_PROXIMITY 1
-
-#define DEVICE_LIGHT (1 << ID_LIGHT)
-#define DEVICE_PROXIMITY (1 << ID_PROXIMITY)
-#endif