static int gsensor_sysfs_init(void) { int ret ; android_gsensor_kobj = kobject_create_and_add("android_gsensor", NULL); if (android_gsensor_kobj == NULL) { mmaprintk(KERN_ERR "MMA8452 gsensor_sysfs_init:"\ "subsystem_register failed\n"); ret = -ENOMEM; goto err; } ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr); // "vendor" if (ret) { mmaprintk(KERN_ERR "MMA8452 gsensor_sysfs_init:"\ "sysfs_create_group failed\n"); goto err4; } return 0 ; err4: kobject_del(android_gsensor_kobj); err: return ret ; }
static int mma7660_set_rate(struct i2c_client *client, char rate) { char buffer[2]; int ret = 0; if (rate > 128) return -EINVAL; mmaprintk("[ZWP]%s,rate = %d\n",__FUNCTION__,rate); //因为增加了滤波功能,即每RawDataLength次才上报一次,所以提升gsensor两个档级 if(rate > 2) rate -= 2; mmaprintk("[ZWP]%s,new rate = %d\n",__FUNCTION__,rate); /* for (i = 0; i < 7; i++) { if (rate & (0x1 << i)) break; } buffer[0] = MMA7660_REG_SR; buffer[1] = 0xf8 | (0x07 & (~i)); */ buffer[0] = MMA7660_REG_SR; buffer[1] = 0xf8 | (0x07 & rate); ret = mma7660_tx_data(client, &(buffer[0]), 2); ret = mma7660_rx_data(client, &(buffer[0]), 1); return ret; }
static int mma7660_resume(android_early_suspend_t *h) { struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev); struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client); mmaprintk("Gsensor mma7760 resume!!\n"); return mma7660_start_dev(mma7660->curr_tate); }
static void mma8452_resume(struct early_suspend *h) { struct i2c_client *client = container_of(mma8452_device.parent, struct i2c_client, dev); struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); mmaprintk("Gsensor mma8452 resume!! mma8452->status %d\n",mma8452->status); //if((mma8452->status == MMA8452_SUSPEND) && (mma8452->status != MMA8452_OPEN)) // if (mma8452->status == MMA8452_OPEN) // mma8452_start_dev(client,mma8452->curr_tate); }
static int mma8452_resume(struct i2c_client *client) { int ret; struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); mmaprintk("Gsensor mma8452 2 level resume!! mma8452->status %d\n",mma8452->status); // if((mma8452->status == MMA8452_SUSPEND) && (mma8452->status != MMA8452_OPEN)) //if (mma8452->status == MMA8452_OPEN) // ret = mma8452_start_dev(client, mma8452->curr_tate); return ret; }
static void mma7660_work_func(struct work_struct *work) { struct mma7660_data *mma7660 = container_of(work, struct mma7660_data, work); struct i2c_client *client = mma7660->client; if (mma7660_get_data(client) < 0) mmaprintk(KERN_ERR "MMA7660 mma_work_func: Get data failed\n"); enable_irq(client->irq); }
static void mma8452_suspend(struct early_suspend *h) { struct i2c_client *client = container_of(mma8452_device.parent, struct i2c_client, dev); struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); mmaprintk("Gsensor mma8452 enter suspend mma8452->status %d\n",mma8452->status); // if(mma8452->status == MMA8452_OPEN) // { //mma8452->status = MMA8452_SUSPEND; // mma8452_close_dev(client); // } }
static int mma7660_reset_rate(struct i2c_client *client, char rate) { int ret = 0; mmaprintk("\n----------------------------mma7660_reset_rate------------------------\n"); ret = mma7660_close_dev(client); ret = mma7660_start_dev(client, rate); return ret ; }
static int mma8452_suspend(struct i2c_client *client, pm_message_t mesg) { int ret; mmaprintk("Gsensor mma8452 enter 2 level suspend mma8452->status %d\n",mma8452->status); struct mma8452_data *mma8452 = (struct mma8452_data *)i2c_get_clientdata(client); // if(mma8452->status == MMA8452_OPEN) // { // mma8452->status = MMA8452_SUSPEND; // ret = mma8452_close_dev(client); // } return ret; }
static void mma7660_report_value(struct i2c_client *client, struct mma7660_axis *axis) { struct mma7660_data *mma7660 = i2c_get_clientdata(client); //struct mma7660_axis *axis = (struct mma7660_axis *)rbuf; /* Report acceleration sensor information */ input_report_abs(mma7660->input_dev, ABS_X, axis->x); input_report_abs(mma7660->input_dev, ABS_Y, axis->z); input_report_abs(mma7660->input_dev, ABS_Z, axis->y); input_sync(mma7660->input_dev); mmaprintk("Gsensor x==%d y==%d z==%d\n",axis->x,axis->y,axis->z); }
static int mma7660_init_client(struct i2c_client *client) { struct mma7660_data *mma7660; int ret; mma7660 = i2c_get_clientdata(client); mmaprintk("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq)); if ( !gpio_is_valid(client->irq)) { mmaprintk("+++++++++++gpio_is_invalid\n"); return -EINVAL; } ret = gpio_request(client->irq, "mma7660_int"); if (ret) { mmaprintk( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq)); return ret; } ret = gpio_direction_input(client->irq); if (ret) { mmaprintk("failed to set mma7990_trig GPIO gpio input\n"); return ret; } gpio_pull_updown(client->irq, GPIOPullUp); client->irq = gpio_to_irq(client->irq); ret = request_irq(client->irq, mma7660_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, mma7660); mmaprintk("request irq is %d,ret is 0x%x\n",client->irq,ret); if (ret ) { mmaprintk(KERN_ERR "mma7660_init_client: request irq failed,ret is %d\n",ret); return ret; } disable_irq(client->irq); init_waitqueue_head(&data_ready_wq); return 0; }
static int mma7660_get_data(struct i2c_client *client) { char buffer[3]; int ret; struct mma7660_axis axis; //struct rk2818_gs_platform_data *pdata = client->dev.platform_data; do { memset(buffer, 0, 3); buffer[0] = MMA7660_REG_X_OUT; ret = mma7660_rx_data(client, &buffer[0], 3); if (ret < 0) return ret; } while ((buffer[0] & 0x40) || (buffer[1] & 0x40) || (buffer[2] & 0x40)); axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]) - 46875; axis.y = -mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]); axis.z = -mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]); /* if(pdata->swap_xy) { axis.y = -axis.y; swap(axis.x,axis.y); } */ //计算RawDataLength次值的平均值 Xaverage += axis.x; Yaverage += axis.y; Zaverage += axis.z; mmaprintk( "%s: ------------------mma7660_GetData axis = %d %d %d,average=%d %d %d--------------\n", __func__, axis.x, axis.y, axis.z,Xaverage,Yaverage,Zaverage); if((++RawDataNum)>=RawDataLength){ RawDataNum = 0; axis.x = Xaverage/RawDataLength; axis.y = Yaverage/RawDataLength; axis.z = Zaverage/RawDataLength; mma7660_report_value(client, &axis); Xaverage = Yaverage = Zaverage = 0; } #if 0 // mmaprintk( "%s: ------------------mma7660_GetData axis = %d %d %d--------------\n", // __func__, axis.x, axis.y, axis.z); //memcpy(sense_data, &axis, sizeof(axis)); mma7660_report_value(client, &axis); //atomic_set(&data_ready, 0); //wake_up(&data_ready_wq); #endif return 0; }
static int mma7660_start_dev(struct i2c_client *client, char rate) { char buffer[MMA7660_REG_LEN]; int ret = 0; buffer[0] = MMA7660_REG_INTSU; buffer[1] = 0x10; //0x10; modify by zhao ret = mma7660_tx_data(client, &buffer[0], 2); ret = mma7660_rx_data(client, &buffer[0], 1); ret = mma7660_set_rate(client, rate); buffer[0] = MMA7660_REG_MODE; buffer[1] = 0x01; ret = mma7660_tx_data(client, &buffer[0], 2); ret = mma7660_rx_data(client, &buffer[0], 1); enable_irq(client->irq); mmaprintk("\n----------------------------mma7660_start------------------------\n"); return ret; }
static int mma7660_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mma7660_data *mma7660; int err; Xaverage = Yaverage = Zaverage = RawDataNum = 0; mma7660 = kzalloc(sizeof(struct mma7660_data), GFP_KERNEL); if (!mma7660) { mmaprintk("[mma7660]:alloc data failed.\n"); err = -ENOMEM; goto exit_alloc_data_failed; } INIT_WORK(&mma7660->work, mma7660_work_func); INIT_DELAYED_WORK(&mma7660->delaywork, mma7660_delaywork_func); mma7660->client = client; //mma7660->swap_xy = i2c_set_clientdata(client, mma7660); this_client = client; err = mma7660_init_client(client); if (err < 0) { mmaprintk(KERN_ERR "mma7660_probe: mma7660_init_client failed\n"); goto exit_request_gpio_irq_failed; } mma7660->input_dev = input_allocate_device(); if (!mma7660->input_dev) { err = -ENOMEM; mmaprintk(KERN_ERR "mma7660_probe: Failed to allocate input device\n"); goto exit_input_allocate_device_failed; } set_bit(EV_ABS, mma7660->input_dev->evbit); /* x-axis acceleration */ input_set_abs_params(mma7660->input_dev, ABS_X, -MMA7660_RANGE, MMA7660_RANGE, 0, 0); /* y-axis acceleration */ input_set_abs_params(mma7660->input_dev, ABS_Y, -MMA7660_RANGE, MMA7660_RANGE, 0, 0); /* z-axis acceleration */ input_set_abs_params(mma7660->input_dev, ABS_Z, -MMA7660_RANGE, MMA7660_RANGE, 0, 0); mma7660->input_dev->name = "gsensor"; mma7660->input_dev->dev.parent = &client->dev; err = input_register_device(mma7660->input_dev); if (err < 0) { mmaprintk(KERN_ERR "mma7660_probe: Unable to register input device: %s\n", mma7660->input_dev->name); goto exit_input_register_device_failed; } mma7660_device.parent = &client->dev; err = misc_register(&mma7660_device); if (err < 0) { mmaprintk(KERN_ERR "mma7660_probe: mmad_device register failed\n"); goto exit_misc_device_register_mma7660_device_failed; } err = gsensor_sysfs_init(); if (err < 0) { mmaprintk(KERN_ERR "mma7660_probe: gsensor sysfs init failed\n"); goto exit_gsensor_sysfs_init_failed; } #ifdef CONFIG_ANDROID_POWER mma7660_early_suspend.suspend = mma7660_suspend; mma7660_early_suspend.resume = mma7660_resume; mma7660_early_suspend.level = 0x2; android_register_early_suspend(&mma7660_early_suspend); #endif mmaprintk(KERN_INFO "mma7660 probe ok\n"); mma7660->status = -1; #if 0 mma7660_start(client, MMA7660_RATE_32); #endif return 0; exit_gsensor_sysfs_init_failed: misc_deregister(&mma7660_device); exit_misc_device_register_mma7660_device_failed: input_unregister_device(mma7660->input_dev); exit_input_register_device_failed: input_free_device(mma7660->input_dev); exit_input_allocate_device_failed: free_irq(client->irq, mma7660); exit_request_gpio_irq_failed: kfree(mma7660); exit_alloc_data_failed: ; return err; }
static int mma7660_suspend(struct i2c_client *client, pm_message_t mesg) { mmaprintk("Gsensor mma7760 enter 2 level suspend\n"); return mma7660_close_dev(client); }
static int mma7660_suspend(android_early_suspend_t *h) { struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev); mmaprintk("Gsensor mma7760 enter suspend\n"); return mma7660_close_dev(client); }
static int mma8452_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mma8452_data *mma8452; struct mma8452_platform_data *pdata = pdata = client->dev.platform_data; int err; char devid; mmaprintkf("%s enter\n",__FUNCTION__); mma8452 = kzalloc(sizeof(struct mma8452_data), GFP_KERNEL); if (!mma8452) { mmaprintk("[mma8452]:alloc data failed.\n"); err = -ENOMEM; goto exit_alloc_data_failed; } INIT_WORK(&mma8452->work, mma8452_work_func); INIT_DELAYED_WORK(&mma8452->delaywork, mma8452_delaywork_func); memset(&(mma8452->sense_data), 0, sizeof(struct mma8452_axis) ); mutex_init(&(mma8452->sense_data_mutex) ); atomic_set(&(mma8452->data_ready), 0); init_waitqueue_head(&(mma8452->data_ready_wq) ); mma8452->start_count = 0; mutex_init(&(mma8452->operation_mutex) ); mma8452->status = MMA8452_CLOSE; mma8452->client = client; i2c_set_clientdata(client, mma8452); this_client = client; devid = mma8452_get_devid(this_client); if ((MMA8452_DEVID != devid) && (MMA8451_DEVID != devid)) { pr_info("mma8452: invalid devid\n"); goto exit_invalid_devid; } err = mma8452_init_client(client); if (err < 0) { mmaprintk(KERN_ERR "mma8452_probe: mma8452_init_client failed\n"); goto exit_request_gpio_irq_failed; } mma8452->input_dev = input_allocate_device(); if (!mma8452->input_dev) { err = -ENOMEM; mmaprintk(KERN_ERR "mma8452_probe: Failed to allocate input device\n"); goto exit_input_allocate_device_failed; } set_bit(EV_ABS, mma8452->input_dev->evbit); /* x-axis acceleration */ input_set_abs_params(mma8452->input_dev, ABS_X, -2000, 2000, 0, 0); //2g full scale range /* y-axis acceleration */ input_set_abs_params(mma8452->input_dev, ABS_Y, -2000, 2000, 0, 0); //2g full scale range /* z-axis acceleration */ input_set_abs_params(mma8452->input_dev, ABS_Z, -2000, 2000, 0, 0); //2g full scale range // mma8452->input_dev->name = "compass"; mma8452->input_dev->name = "gsensor"; mma8452->input_dev->dev.parent = &client->dev; err = input_register_device(mma8452->input_dev); if (err < 0) { mmaprintk(KERN_ERR "mma8452_probe: Unable to register input device: %s\n", mma8452->input_dev->name); goto exit_input_register_device_failed; } mma8452_device.parent = &client->dev; err = misc_register(&mma8452_device); if (err < 0) { mmaprintk(KERN_ERR "mma8452_probe: mmad_device register failed\n"); goto exit_misc_device_register_mma8452_device_failed; } err = gsensor_sysfs_init(); if (err < 0) { mmaprintk(KERN_ERR "mma8452_probe: gsensor sysfs init failed\n"); goto exit_gsensor_sysfs_init_failed; } #ifdef CONFIG_HAS_EARLYSUSPEND mma8452_early_suspend.suspend = mma8452_suspend; mma8452_early_suspend.resume = mma8452_resume; mma8452_early_suspend.level = 0x2; register_early_suspend(&mma8452_early_suspend); #endif printk(KERN_INFO "mma8452 probe ok\n"); #if 0 // mma8452_start_test(this_client); mma8452_start(client, MMA8452_RATE_12P5); #endif return 0; exit_gsensor_sysfs_init_failed: misc_deregister(&mma8452_device); exit_misc_device_register_mma8452_device_failed: input_unregister_device(mma8452->input_dev); exit_input_register_device_failed: input_free_device(mma8452->input_dev); exit_input_allocate_device_failed: free_irq(client->irq, mma8452); exit_request_gpio_irq_failed: cancel_delayed_work_sync(&mma8452->delaywork); cancel_work_sync(&mma8452->work); exit_invalid_devid: kfree(mma8452); exit_alloc_data_failed: ; mmaprintk("%s error\n",__FUNCTION__); return -1; }
static int mma7660_resume(struct i2c_client *client) { struct mma7660_data *mma7660 = (struct mma7660_data *)i2c_get_clientdata(client); mmaprintk("Gsensor mma7760 2 level resume!!\n"); return mma7660_start_dev(client, mma7660->curr_tate); }