http://www.voidcn.com/blog/sevenjoin/article/p-4954234.html
http://blog.youkuaiyun.com/u013129593/article/details/53010773
http://www.cnblogs.com/lihaiyan/p/4475194.html
http://www.voidcn.com/blog/xishuang_gongzi/article/p-6240391.html
1. dts configuration
kernel_imx/arch/arm/boot/dts/imx6sl-evk.dts
&i2c2{
...
/*luke add for lis3dh st*/
lis3dh@18 {
compatible = "st,lis3dh";
reg = <0x18>;
status = "okay";
};
/*ed*/
};
2. c source
CONFIG_OF is the adding for dts
#ifdef CONFIG_OF
static struct lis3dh_acc_platform_data lis3dh_pdata = {
.poll_interval = 10,
.min_interval = 10,
.axis_map_x = 0,
.axis_map_y = 1,
.axis_map_z = 2,
.negate_x = 1,
.negate_y = 0,
.negate_z = 1,
.gpio_int1 = -EINVAL,
.gpio_int2 = -EINVAL,
};
static const struct of_device_id lis3dh_i2c_dt_ids[] = {
{
.compatible = "st,lis3dh",
}
}
MODULE_DEVICE_TABLE(of,lis3dh_i2c_dt_ids);
#endif
static int lis3dh_acc_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
#ifdef CONFIG_OF
client->dev.platform_data = &lis3dh_pdata;
#endif
...
return 0;
}
static struct i2c_driver lis3dh_acc_driver = {
.driver = {
.owner = THIS_MODULE,
.name = LIS3DH_ACC_DEV_NAME,
#ifdef CONFIG_OF
.of_match_table = of_match_ptr(lis3dh_i2c_dt_ids),
#endif
},
.probe = lis3dh_acc_probe,
.remove = lis3dh_acc_remove,
.id_table = lis3dh_acc_id,
};
static int __init lis3dh_acc_init(void)
{
return i2c_add_driver(&lis3dh_acc_driver);
}
static void __exit lis3dh_acc_exit(void)
{
i2c_del_driver(&lis3dh_acc_driver);
}
module_init(lis3dh_acc_init);
module_exit(lis3dh_acc_exit);
MODULE_DESCRIPTION("lis3dh accelerometer sysfs driver");
MODULE_AUTHOR("Matteo Dameno, Carmine Iascone, STMicroelectronics");
MODULE_LICENSE("GPL");
3. result
btw: i2c_tools is the useful tools for i2c debug