Lis3de_porting_guide:(这个 porting guide 只是完成 Gsensor 旋转时,在 Man-Pad 上看到屏幕旋转)
调试 Lis3de 是基于 Lis3dh.c 这个驱动进行修改完成的。平台是在 RK3188 4.2.2 的 SDK上。
1、明确 Lis3de 和 Lis3dh 的区别:
a)Lis3de 的 I2C address 是:0x28 或者 0x29
b)Lis3dh 的 I2C address 是:0x18 或者 0x19
2、Lis3de 是 8bit 的 Gsensor,Lis3dh 是 16bit 的 Gsensor
首先将 Lis3dh 调试正常:
1、Lis3dh 是 RK 调试正常了的 Gsensor,只需要在 menuconfig 中选中,然后在 board 文件中将 INT 脚配置正确,就可以正常使用了。
Man-pad 中的配置:
#define LIS3DH_INT_PIN RK30_PIN3_PD7
#if defined (CONFIG_GS_LIS3DH)
{
.type = "gs_lis3dh",
.addr = 0x18, //0x19(SA0-->VCC), 0x18(SA0-->GND)
.flags = 0,
.irq = LIS3DH_INT_PIN,
.platform_data = &lis3dh_info,
},
2、Lis3de 使用的也是一样的驱动文件,将 lis3dh.c 修改为 lis3de.c。在 makfile 和 Kconfig 中添加相应的语句。
lis3de.c 中修改的代码:
a)
#define LIS3DH_PRECISION 8
static int sensor_convert_data(struct i2c_client *client, char high_byte, char low_byte)
{
s64 result;
printk("andrew-----%s\n",__func__);
struct sensor_private_data *sensor =
(struct sensor_private_data *) i2c_get_clientdata(client);
//int precision = sensor->ops->precision;
switch (sensor->devid) {
case LIS3DH_DEVID:
// result = ((int)high_byte << 8) | (int)low_byte;
result = (int)high_byte;
if (result < LIS3DH_BOUNDARY)
result = result* LIS3DH_GRAVITY_STEP;
else
result = ~( ((~result & (0x7fff>>(16-LIS3DH_PRECISION)) ) + 1)
* LIS3DH_GRAVITY_STEP) + 1;
break;
default:
printk(KERN_ERR "%s: devid wasn't set correctly\n",__func__);
return -EFAULT;
}
return (int)result;
}
b)
在 board 文件中添加相应的文件,和 lis3dh 除了宏定义,其他完全一样。
#if defined (CONFIG_GS_LIS3DE)
{
.type = "gs_lis3dh",
.addr = 0x28, //0x39(SA0-->VCC), 0x38(SA0-->GND)
.flags = 0,
.irq = LIS3DH_INT_PIN,
.platform_data = &lis3dh_info,
},
#endif