#include <linux/earlysuspend.h>
#endif
+
+#if 0
+#define DBG(x...) printk(x)
+#else
+#define DBG(x...)
+#endif
+
+
#define SENSOR_NAME "bma150"
#define GRAVITY_EARTH 9806550
#define ABSMIN_2G (-GRAVITY_EARTH * 2)
#define BMA_IOCTL_START _IO(BMAIO, 0x03)
#define BMA_IOCTL_GETDATA _IOR(BMAIO, 0x08, char[RBUFF_SIZE+1])
-static int bma023_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
- unsigned long arg);
+/* IOCTLs for APPs */
+#define BMA_IOCTL_APP_SET_RATE _IOW(BMAIO, 0x10, char)
+
+static long bma023_ioctl( struct file *file, unsigned int cmd, unsigned long arg);
+
static void bma150_early_suspend(struct early_suspend *h);
static void bma150_late_resume(struct early_suspend *h);
mutex_lock(&bma150->value_mutex);
bma150->value = acc;
mutex_unlock(&bma150->value_mutex);
- //printk("bma150_work_func acc.x=%d,acc.y=%d,acc.z=%d\n",acc.x,acc.y,acc.z);
+ DBG("bma150_work_func acc.x=%d,acc.y=%d,acc.z=%d\n",acc.x,acc.y,acc.z);
schedule_delayed_work(&bma150->work, delay);
}
static int bma023_open(struct inode *inode, struct file *file)
{
+ printk("%s\n",__FUNCTION__);
return 0;//nonseekable_open(inode, file);
}
.name = "mma8452_daemon",//"mma8452_daemon",
.fops = &bma023_fops,
};
-static int bma023_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
- unsigned long arg)
+
+
+static bma023_enable(struct i2c_client *client, int enable)
+{
+
+ struct bma150_data *bma150 = i2c_get_clientdata(client);
+ int pre_enable = atomic_read(&bma150->enable);
+
+ mutex_lock(&bma150->enable_mutex);
+
+ if(enable)
+ {
+ if(pre_enable==0)
+ {
+ bma150_set_mode(client,BMA150_MODE_NORMAL);
+ schedule_delayed_work(&bma150->work,
+ msecs_to_jiffies(atomic_read(&bma150->delay)));
+ atomic_set(&bma150->enable, 1);
+ }
+ }
+ else
+ {
+ bma150_set_mode(client,BMA150_MODE_SLEEP);
+ cancel_delayed_work_sync(&bma150->work);
+ atomic_set(&bma150->enable, 0);
+ }
+
+ mutex_unlock(&bma150->enable_mutex);
+
+}
+
+
+static long bma023_ioctl( struct file *file, unsigned int cmd, unsigned long arg)
{
void __user *argp = (void __user *)arg;
struct i2c_client *client = container_of(bma023_device.parent, struct i2c_client, dev);
struct bma150_data *bma150 = i2c_get_clientdata(client);;
switch (cmd) {
+ case BMA_IOCTL_START:
+ bma023_enable(client, 1);
+ DBG("%s:%d,cmd=BMA_IOCTL_START\n",__FUNCTION__,__LINE__);
+ break;
+
+ case BMA_IOCTL_CLOSE:
+ bma023_enable(client, 0);
+ DBG("%s:%d,cmd=BMA_IOCTL_CLOSE\n",__FUNCTION__,__LINE__);
+ break;
+
+ case BMA_IOCTL_APP_SET_RATE:
+ atomic_set(&bma150->delay, 20);//20ms
+ DBG("%s:%d,cmd=BMA_IOCTL_APP_SET_RATE\n",__FUNCTION__,__LINE__);
+ break;
+
case BMA_IOCTL_GETDATA:
mutex_lock(&bma150->value_mutex);
if(abs(sense_data.x-bma150->value.x)>10)//·À¶¶¶¯
- sense_data.x=bma150->value.x;
+ sense_data.x=(bma150->value.x*1000)>>8;
if(abs(sense_data.y+(bma150->value.z))>10)//·À¶¶¶¯
- sense_data.y=-(bma150->value.z);
+ sense_data.y=(bma150->value.z*1000)>>8;
if(abs(sense_data.z+(bma150->value.y))>10)//·À¶¶¶¯
- sense_data.z=-(bma150->value.y);
+ sense_data.z=(bma150->value.y*1000)>>8;
//bma150->value = acc;
mutex_unlock(&bma150->value_mutex);
printk("failed to copy sense data to user space.");
return -EFAULT;
}
+
+ DBG("%s:%d,cmd=BMA_IOCTL_GETDATA\n",__FUNCTION__,__LINE__);
break;
default:
+ printk("%s:%d,error,cmd=%x\n",__FUNCTION__,__LINE__,cmd);
break;
}
return 0;
struct work_struct work;
struct early_suspend akm_early_suspend;
int eoc_irq;
+ struct akm8975_platform_data *pdata;
};
/* Addresses to scan -- protected by sense_data_mutex */
return 0;
}
+
+static int akm_get_platform_data(struct akm8975_platform_data __user *arg)
+{
+ struct akm8975_data *data = (struct akm8975_data *)i2c_get_clientdata(this_client);
+ struct akm8975_platform_data *pdata_slave;
+// struct akm8975_platform_data local_pdata_slave;
+
+// if (copy_from_user(&local_pdata_slave, arg, sizeof(local_pdata_slave)))
+// return -EFAULT;
+ pdata_slave = data->pdata;
+ if (!pdata_slave)
+ return -ENODEV;
+ if (copy_to_user(arg, pdata_slave, sizeof(*pdata_slave)))
+ return -EFAULT;
+
+ return 0;
+}
+
+
+
//static int akmd_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
// unsigned long arg)
AKMFUNC("IOCTL_GET_DELAY");
delay = akmd_delay;
break;
+ case ECS_IOCTL_GET_PLATFORM_DATA:
+ ret = akm_get_platform_data((struct akm8975_platform_data __user *)arg);
+ if(ret < 0)
+ {
+ printk("%s:error,ret=%d\n",__FUNCTION__, ret);
+ return ret;
+ }
+ break;
+
default:
return -ENOTTY;
}
int err = 0;
AKMFUNC("akm8975_probe");
-
+
+ if (client->dev.platform_data == NULL) {
+ dev_err(&client->dev, "platform data is NULL. exiting.\n");
+ err = -ENODEV;
+ goto exit0;
+ }
+
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
printk(KERN_ERR "AKM8975 akm8975_probe: check_functionality failed.\n");
err = -ENODEV;
err = -ENOMEM;
goto exit1;
}
+
+ akm->pdata = client->dev.platform_data;
INIT_WORK(&akm->work, akm8975_work_func);
i2c_set_clientdata(client, akm);