This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

I got I2C remote I/O error whenever I2C wrtie

Hi

I am using linux 3.0 kernel with omap4460

the problem is that whenever I write data with I2C , I got remote I/O error

i checked Slave Address , but It was right.

I2c clock rate is 400 khz , I checked register address.. I dont know why I got remote I/O error ( omap_i2c_stat_nack error)

this is What I have done.

machine code:


static struct i2c_board_info __initdata omap4dart_board_i2c_4_boardinfo[] = {
{
/* gesture_r */
I2C_BOARD_INFO("gesture_r", 0x45),
.irq = OMAP_GPIO_IRQ(GESTURE_R_IRQ),
},
};

static int __init omap4dart_board_i2c_init(void){

omap_register_i2c_bus(4, 400, omap4dart_board_i2c_4_boardinfo, ARRAY_SIZE(omap4dart_board_i2c_4_boardinfo));

return 0;
}

-----------------------

gesture_r code

static int __devinit gesture_r_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct gesture_r_sensor *sensor;
struct input_dev *idev;
int error;
//int status;

printk(KERN_DEBUG "gesture i2c probe1");
sensor = kzalloc(sizeof(struct gesture_r_sensor), GFP_KERNEL);
idev = input_allocate_device();
if (!sensor || !idev) {
dev_err(&client->dev, "failed to allocate driver data\n");
error = -ENOMEM;
goto err_free_mem;
}
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
printk(KERN_INFO "need I2C_FUNC_I2C\n");
return -ENODEV;
}
// sensor data is filled
sensor->client = client;
sensor->dev = &client->dev;
sensor->idev = idev;
sensor->axis_irq=client->irq;

// input dev is filled
idev->name = "GESTURE_R";
idev->id.bustype = BUS_I2C;
idev->dev.parent = &client->dev;

__set_bit(EV_ABS, idev->evbit);
__set_bit(EV_SYN, idev->evbit);

input_set_abs_params(idev, ABS_X,-1,1,0,0);
input_set_abs_params(idev, ABS_Y,-1,1,0,0);

input_set_drvdata(idev, sensor);

printk(KERN_DEBUG "gesture i2c probe!! irq:%d",client->irq);
error = request_threaded_irq(client->irq,
NULL, gesture_r_interrupt_thread,
IRQF_TRIGGER_FALLING,
"gesture_r_irq", sensor);
if (error) {
dev_err(&client->dev,
"can't get IRQ %d, error %d\n", client->irq, error);
}

error = input_register_device(idev);
if (error) {
dev_err(&client->dev, "failed to register input device\n");
goto err_free_irq;
}

gesture_r_setup(client);
/* ret = sysfs_create_group(&client->dev.kobj, &gestrue_r_attr_group);
if (ret)
goto group_create_error;
*/

return 0;

//group_create_error:
// free_irq(client->irq, sensor);
// kfree(sensor);
err_free_irq:
free_irq(client->irq, sensor);
err_free_mem:
input_free_device(idev);
kfree(sensor);
return error;
}

static const struct i2c_device_id gesture_r_ids[] = {
{ "gesture_r", 0 },
{ },
};
MODULE_DEVICE_TABLE(i2c, gesture_r_ids);

static struct i2c_driver gesture_r_i2c_driver = {
.driver = {
.name = "gesture_r",
.owner = THIS_MODULE,
#ifdef CONFIG_PM
.pm = &gesture_r_pm_ops,
#endif
},
.probe = gesture_r_probe,
.remove = gesture_r_remove,
.id_table = gesture_r_ids,
};

static int __init gesture_r_init(void)
{
return i2c_add_driver(&gesture_r_i2c_driver);
}
module_init(gesture_r_init);

static void __exit gesture_r_exit(void)
{
i2c_del_driver(&gesture_r_i2c_driver);
}
module_exit(gesture_r_exit);

----------------------------------------------------------

datasheet : www.dropbox.com/.../h.pdf