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