android g-sensor porting

kernel_gsensor.patch:

diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile

index 4fcafff..b2cdbdd 100644
--- a/drivers/hwmon/Makefile
+++ b/drivers/hwmon/Makefile
@@ -143,7 +143,7 @@ obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o
 obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o
 obj-$(CONFIG_SENSORS_MAG3110)   += mag3110.o
 obj-$(CONFIG_MXC_MMA8451)       += mxc_mma8451.o
-obj-$(CONFIG_MXC_MMA8x5x)       += mma8x5x.o
+obj-$(CONFIG_MXC_MMA8x5x)       += mma8x5x.o sensor_test.o
 
 obj-$(CONFIG_PMBUS) += pmbus/
 
diff --git a/drivers/hwmon/sensor_test.c b/drivers/hwmon/sensor_test.c
new file mode 100755
index 0000000..cb82440
--- /dev/null
+++ b/drivers/hwmon/sensor_test.c
@@ -0,0 +1,206 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/types.h>
+#include <linux/of.h>
+#include <linux/gfp.h>
+#include <linux/string.h>
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/hwmon.h>
+#include <linux/input.h>
+#include <linux/miscdevice.h>
+
+static struct input_dev *idev;
+static struct delayed_work work;
+static int enable = 0;
+
+struct gsensor_data_axis {
+ short x;
+ short y;
+ short z;
+};
+
+short landscape[2][3] = {{0xbf6c, 0xfe90, 0x6b8}, {0xbf60, 0xfe80, 0x6d4}};
+short portrait[2][3] = {{0xf624, 0x3480, 0x2018}, {0xf580, 0x33d4, 0x2380}};
+static int count= 0;
+
+static ssize_t gsensor_enable_show(struct device *dev,
+   struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "%d\n", enable);
+}
+
+static ssize_t gsensor_enable_store(struct device *dev,
+    struct device_attribute *attr,
+    const char *buf, size_t count)
+{
+ enable = simple_strtoul(buf, NULL, 10);
+
+ printk("enable=0x%x\n", enable);
+
+ return count;
+}
+
+static DEVICE_ATTR(enable, S_IWUSR | S_IRUGO,
+   gsensor_enable_show, gsensor_enable_store);
+
+static void gsensor_report_data(void)
+{
+ struct gsensor_data_axis data;
+
+ if ((count >> 4) % 2  == 0) {
+ if (count % 2 == 0) {
+ data.x = landscape[0][0];
+ data.y = landscape[0][1];
+ data.z = landscape[0][2];
+ } else {
+ data.x = landscape[1][0];
+ data.y = landscape[1][1];
+ data.z = landscape[1][2];
+ }
+ } else {
+ if (count % 2 == 0) {
+ data.x = portrait[0][0];
+ data.y = portrait[0][1];
+ data.z = portrait[0][2];
+ } else {
+ data.x = portrait[1][0];
+ data.y = portrait[1][1];
+ data.z = portrait[1][2];
+ }
+ }
+ count++;
+
+ input_report_abs(idev, ABS_X, data.x);
+ input_report_abs(idev, ABS_Y, data.y);
+ input_report_abs(idev, ABS_Z, data.z);
+ input_sync(idev);
+}
+
+static void gsensor_work(void){
+ int delay;
+
+ delay = msecs_to_jiffies(1000);
+ if (delay >= HZ)
+ delay = round_jiffies_relative(delay);
+ schedule_delayed_work(&work, delay);
+}
+
+static void gsensor_poll(struct work_struct *work)
+{
+ gsensor_report_data();
+ gsensor_work();
+}
+
+static int gsensor_probe(struct platform_device *pdev)
+{
+ int result, chip_id;
+
+ printk("%s\n", __func__);
+ chip_id = 0x3A;
+
+ idev = input_allocate_device();
+ if (!idev) {
+ result = -ENOMEM;
+ printk("alloc input device failed!\n");
+ return result;
+ }
+ idev->name = "FreescaleAccelerometer";
+ idev->uniq = "mma8453";
+ idev->id.bustype = BUS_I2C;
+ idev->evbit[0] = BIT_MASK(EV_ABS);
+ input_set_abs_params(idev, ABS_X, -0x7fff, 0x7fff, 0, 0);
+ input_set_abs_params(idev, ABS_Y, -0x7fff, 0x7fff, 0, 0);
+ input_set_abs_params(idev, ABS_Z, -0x7fff, 0x7fff, 0, 0);
+
+ result = input_register_device(idev);
+ if (result) {
+ printk("register input device failed!\n");
+ return result;
+ }
+
+ INIT_DELAYED_WORK(&work, gsensor_poll);
+
+ gsensor_work();
+
+ printk(KERN_INFO"gsensor device driver probe successfully\n");
+ return 0;
+
+ return result;
+}
+
+static int gsensor_remove(struct platform_device *dev)
+{
+ cancel_delayed_work_sync(&work);
+ input_unregister_device(idev);
+ input_free_device(idev);
+
+ return 0;
+}
+
+void gsensor_release(struct device *dev)
+{
+
+}
+
+static struct platform_device gsensor_device = {
+ .name = "gsensor_test",
+ .id     = 0,
+ .dev   = {
+ .release  = gsensor_release,
+ },
+};
+
+static struct platform_driver gsensor_driver = {
+ .probe = gsensor_probe,
+ .remove = gsensor_remove,
+ .driver = {
+ .name = "gsensor_test",
+ .owner  = THIS_MODULE,
+ },
+};
+
+int __init gsensor_driver_init(void)
+{
+ int ret;
+
+ ret = platform_device_register(&gsensor_device);
+ if (ret)
+ {
+ printk("Cannot register gsensor device!\n");
+ return ret;
+ }
+
+ ret = platform_driver_register(&gsensor_driver);
+ if (ret)
+ {
+ printk("Cannot register gsensor driver!\n");
+ return ret;
+ }
+
+ return ret;
+}
+
+void __exit gsensor_driver_exit(void)
+{
+ platform_driver_unregister(&gsensor_driver);
+
+ platform_device_unregister(&gsensor_device);
+}
+
+
+module_init(gsensor_driver_init);
+module_exit(gsensor_driver_exit);
+
+MODULE_LICENSE("GPL");
+

+


myandroid_device_fsl.patch:

diff --git a/evk_6sl/BoardConfig.mk b/evk_6sl/BoardConfig.mk
index 08da88f..4c32678 100644
--- a/evk_6sl/BoardConfig.mk
+++ b/evk_6sl/BoardConfig.mk
@@ -58,7 +58,7 @@ USE_ATHR_GPS_HARDWARE := false
 USE_QEMU_GPS_HARDWARE := false
 
 #for accelerator sensor, need to define sensor type here
-#BOARD_HAS_SENSOR := true
+BOARD_HAS_SENSOR := true
 #SENSOR_MMA8451 := true
 
 # for recovery service
diff --git a/evk_6sl/required_hardware.xml b/evk_6sl/required_hardware.xml
index 6bb6dbe..8a4b1b1 100644
--- a/evk_6sl/required_hardware.xml
+++ b/evk_6sl/required_hardware.xml
@@ -22,6 +22,9 @@
     <feature name="android.hardware.camera" />
     <feature name="android.hardware.camera.front" />
     <feature name="android.hardware.camera.flash" />
+    <feature name="android.hardware.sensor.accelerometer" />
+    <feature name="android.hardware.sensor.compass" />
+    <feature name="android.hardware.bluetooth" />
     <feature name="android.hardware.touchscreen" />
     <feature name="android.hardware.touchscreen.multitouch" />
     <feature name="android.hardware.touchscreen.multitouch.distinct" />


myandroid_hardware_imx.patch:

diff --git a/libsensors/AccelSensor.cpp b/libsensors/AccelSensor.cpp
index fb9fdd6..b127ac0 100755
--- a/libsensors/AccelSensor.cpp
+++ b/libsensors/AccelSensor.cpp
@@ -96,6 +96,7 @@ int AccelSensor::setEnable(int32_t handle, int en)
  else
  err = disable_sensor();
  ALOGD("AccelSensor enable %d , handle %d ,mEnabled %d",en , handle ,mEnabled);
+ err = 0;
     return err;
 }
 

猜你喜欢

转载自blog.csdn.net/gaoguoxin2/article/details/74190905