rk3288的SDK修复cm3218光敏驱动bug
瑞芯的Android 4.4的SDK中kernel的补丁例如以下:
diff --git a/arch/arm/boot/dts/rk3288-tb_8846.dts b/arch/arm/boot/dts/rk3288-tb_8846.dts
index c92d973..850fd42 100644
--- a/arch/arm/boot/dts/rk3288-tb_8846.dts
+++ b/arch/arm/boot/dts/rk3288-tb_8846.dts
@@ -533,6 +533,15 @@
status = "okay";
}; + sensor@48 {
+ compatible = "light_cm3218";
+ reg = <0x48>;
+ type = <SENSOR_TYPE_LIGHT>;
+ irq-gpio = <&gpio8 GPIO_A3 IRQ_TYPE_EDGE_FALLING>;
+ irq_enable = <0>;
+ poll_delay_ms = <30>;
+ layout = <1>;
+ };
}; &i2c2 {
diff --git a/drivers/i2c/busses/i2c-rockchip.c b/drivers/i2c/busses/i2c-rockchip.c
index 3f64ff0..db28071 100644
--- a/drivers/i2c/busses/i2c-rockchip.c
+++ b/drivers/i2c/busses/i2c-rockchip.c
@@ -716,12 +716,17 @@ static int rockchip_i2c_doxfer(struct rockchip_i2c *i2c, i2c_writel(I2C_IPD_ALL_CLEAN, i2c->regs + I2C_IPD);
rockchip_i2c_disable_irq(i2c);
- rockchip_i2c_disable(i2c);
spin_unlock_irqrestore(&i2c->lock, flags); - if (error == -EAGAIN)
- i2c_dbg(i2c->dev, "No ack(complete_what: 0x%x), Maybe slave(addr: 0x%04x) not exist or abnormal power-on\n",
+ if (error == -EAGAIN){
+ i2c_dbg(i2c->dev,
+ "No ack(complete_what: 0x%x), Maybe slave(addr: 0x%04x) not exist or abnormal power-on\n",
i2c->complete_what, i2c->addr);
+ rockchip_i2c_send_stop(i2c);
+ msleep(5);
+ }
+
+ rockchip_i2c_disable(i2c);
return error;
} diff --git a/drivers/input/sensors/lsensor/cm3218.c b/drivers/input/sensors/lsensor/cm3218.c
index b6201d6..8eee009 100644
--- a/drivers/input/sensors/lsensor/cm3218.c
+++ b/drivers/input/sensors/lsensor/cm3218.c
@@ -119,39 +119,46 @@ static int cm3218_read(struct i2c_client *client, u8 reg)
} /****************operate according to sensor chip:start************/
+static int cm3218_read_lux(struct i2c_client *client, int *lux)
+{
+ int lux_data;
+
+ lux_data = cm3218_read(client, CM3218_REG_ADDR_ALS);
+ if (lux_data < 0) {
+ dev_err(&client->dev, "Error in reading Lux DATA\n");
+ return lux_data;
+ }
+
+ dev_vdbg(&client->dev, "lux = %u\n", lux_data);
+
+ if (lux_data < 0)
+ return lux_data;
+
+ *lux = lux_data * LENSFACTOR;
+ *lux /= 1000;
+
+ return 0;
+} static int sensor_active(struct i2c_client *client, int enable, int rate)
{
- struct sensor_private_data *sensor =
- (struct sensor_private_data *) i2c_get_clientdata(client);
- int result = 0;
- int status = 0;
-
- sensor->client->addr = sensor->ops->ctrl_reg;
- sensor->ops->ctrl_data = cm3218_read(client,sensor->client->addr);
-
- //register setting according to chip datasheet
- if(!enable)
- {
- status = CM3218_CMD_ALS_SD; //cm3218
- sensor->ops->ctrl_data |= status;
- }
- else
- {
- status = ~CM3218_CMD_ALS_SD; //cm3218
- sensor->ops->ctrl_data &= status;
+ int status;
+
+ if (!enable) {
+ status = cm3218_write(client, CM3218_REG_ADDR_CMD,0x0001);
+ } else {
+ status = cm3218_write(client, CM3218_REG_ADDR_CMD,0x0000);
} - DBG("%s:reg=0x%x,reg_ctrl=0x%x,enable=%d\n",__func__,sensor->ops->ctrl_reg, sensor->ops->ctrl_data, enable);
- result = cm3218_write(client,sensor->client->addr, sensor->ops->ctrl_data);
- if(result)
+ if (status)
printk("%s:fail to active sensor\n",__func__);
-
- return result; + return status;
} -
+/*
+ * cm3218 device initialization.
+ */
static int sensor_init(struct i2c_client *client)
{
int status, i;
@@ -159,21 +166,24 @@ static int sensor_init(struct i2c_client *client)
(struct sensor_private_data *) i2c_get_clientdata(client); for (i = 0; i < 5; i++) {
- status = cm3218_write(client, CM3218_REG_ADDR_CMD,
- CM3218_CMD_ALS_SD);
+ /* shut down */
+ status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_CMD_ALS_SD);
if (status >= 0)
break;
+ /* Clear interrupt */
cm3218_read_ara(client);
} + /* power on (1T, HS, interrupt disable) */
status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_DEFAULT_CMD);
if (status < 0) {
dev_err(&client->dev, "Init CM3218 CMD fails\n");
return status;
} - if(sensor->pdata->irq_enable)
- {
+ /* enable interrupt */
+ if(sensor->pdata->irq_enable){
+
status = cm3218_write(client, CM3218_REG_ADDR_CMD, CM3218_DEFAULT_CMD | CM3218_CMD_ALS_INT_EN);
if (status < 0) {
dev_err(&client->dev, "Init CM3218 CMD fails\n");
@@ -181,9 +191,7 @@ static int sensor_init(struct i2c_client *client)
}
} - /* Clean interrupt status */
- cm3218_read(client, CM3218_REG_ADDR_STATUS);
-
+
return status;
} @@ -224,25 +232,7 @@ report:
return index;
} -static int cm3218_read_lux(struct i2c_client *client, int *lux)
-{
- int lux_data;
-
- lux_data = cm3218_read(client, CM3218_REG_ADDR_ALS);
- if (lux_data < 0) {
- dev_err(&client->dev, "Error in reading Lux DATA\n");
- return lux_data;
- }
-
- dev_vdbg(&client->dev, "lux = %u\n", lux_data); - if (lux_data < 0)
- return lux_data;
-
- *lux = lux_data * LENSFACTOR;
- *lux /= 1000;
- return 0;
-} static int sensor_report_value(struct i2c_client *client)
{
@@ -254,14 +244,14 @@ static int sensor_report_value(struct i2c_client *client)
cm3218_read_lux(client,&result); index = light_report_value(sensor->input_dev, result);
+
DBG("%s:%s result=0x%x,index=%d\n",__func__,sensor->ops->name, result,index); - if((sensor->pdata->irq_enable)&& (sensor->ops->int_status_reg >= 0)) //read sensor intterupt status register
- {
-
+ /* read sensor intterupt status register */
+ if((sensor->pdata->irq_enable)&& (sensor->ops->int_status_reg >= 0)){
+
result= sensor_read_reg(client, sensor->ops->int_status_reg);
- if(result)
- {
+ if(result){
printk("%s:fail to clear sensor int status,ret=0x%x\n",__func__,result);
}
}
@@ -272,17 +262,17 @@ static int sensor_report_value(struct i2c_client *client) struct sensor_operate light_cm3218_ops = {
.name = "cm3218",
- .type = SENSOR_TYPE_LIGHT, //sensor type and it should be correct
- .id_i2c = LIGHT_ID_CM3218, //i2c id number
- .read_reg = CM3218_REG_ADDR_ALS, //read data
- .read_len = 2, //data length
- .id_reg = SENSOR_UNKNOW_DATA, //read device id from this register
- .id_data = SENSOR_UNKNOW_DATA, //device id
- .precision = 16, //8 bits
- .ctrl_reg = CM3218_REG_ADDR_CMD, //enable or disable
- .int_status_reg = CM3218_REG_ADDR_STATUS, //intterupt status register
- .range = {0,65535}, //range
- .brightness ={10,255}, // brightness
+ .type = SENSOR_TYPE_LIGHT, /* sensor type and it should be correct */
+ .id_i2c = LIGHT_ID_CM3218, /* i2c id number */
+ .read_reg = CM3218_REG_ADDR_ALS, /* read data */
+ .read_len = 2, /* data length */
+ .id_reg = SENSOR_UNKNOW_DATA, /* read device id from this register */
+ .id_data = SENSOR_UNKNOW_DATA, /* device id */
+ .precision = 16, /* 8 bits */
+ .ctrl_reg = CM3218_REG_ADDR_CMD, /* enable or disable */
+ .int_status_reg = SENSOR_UNKNOW_DATA, /* intterupt status register */
+ .range = {0,65535}, /* range */
+ .brightness ={10,255}, /* brightness */
.trig = SENSOR_UNKNOW_DATA,
.active = sensor_active,
.init = sensor_init,
@@ -291,7 +281,7 @@ struct sensor_operate light_cm3218_ops = { /****************operate according to sensor chip:end************/ -//function name should not be changed
+/* function name should not be changed */
static struct sensor_operate *light_get_ops(void)
{
return &light_cm3218_ops;
@@ -317,5 +307,3 @@ static void __exit light_cm3218_exit(void) module_init(light_cm3218_init);
module_exit(light_cm3218_exit);
-
-
diff --git a/drivers/input/sensors/sensor-dev.c b/drivers/input/sensors/sensor-dev.c
index 960d44f..68ab664 100755
--- a/drivers/input/sensors/sensor-dev.c
+++ b/drivers/input/sensors/sensor-dev.c
@@ -2113,9 +2113,9 @@ static const struct i2c_device_id sensor_id[] = {
/*light sensor*/
{"lightsensor", LIGHT_ID_ALL},
{"light_cm3217", LIGHT_ID_CM3217},
- {"light_cm3218", LIGHT_ID_CM3218},
- {"light_cm3232", LIGHT_ID_CM3232},
- {"light_al3006", LIGHT_ID_AL3006},
+ {"light_cm3218", LIGHT_ID_CM3218},
+ {"light_cm3232", LIGHT_ID_CM3232},
+ {"light_al3006", LIGHT_ID_AL3006},
{"ls_stk3171", LIGHT_ID_STK3171},
{"ls_isl29023", LIGHT_ID_ISL29023},
{"ls_ap321xx", LIGHT_ID_AP321XX},
@@ -2162,8 +2162,9 @@ static struct of_device_id sensor_dt_ids[] = {
^M
/*light sensor*/
{ .compatible = "light_cm3217" },
- { .compatible = "light_cm3232" },
- { .compatible = "light_al3006" },
+ { .compatible = "light_cm3218" },
+ { .compatible = "light_cm3232" },
+ { .compatible = "light_al3006" },
{ .compatible = "ls_stk3171" },
{ .compatible = "ls_ap321xx" },
^M
diff --git a/include/linux/sensor-dev.h b/include/linux/sensor-dev.h
index 16e916f..6c21fcd 100755
--- a/include/linux/sensor-dev.h
+++ b/include/linux/sensor-dev.h
@@ -80,7 +80,7 @@ enum sensor_id {
^M
LIGHT_ID_ALL,
LIGHT_ID_CM3217,
- LIGHT_ID_CM3218,
+ LIGHT_ID_CM3218, /* ID = 46 */^M
LIGHT_ID_CM3232,
LIGHT_ID_AL3006,
LIGHT_ID_STK3171,
rk3288的SDK修复cm3218光敏驱动bug的更多相关文章
- 服务器cpu过高修复:操作系统内核bug导致
服务器cpu过高修复:操作系统内核bug导致修改系统内核参数/etc/sysctl.conf添加下面2条参数:vm.dirty_background_ratio=5vm.dirty_ratio=10
- 解决由于显卡驱动BUG导致桌面右键卡顿的问题:bat文件源码
@ ECHO OFF%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...
- 一个MySQL-JDBC驱动bug引起的血案……
问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL ...
- 一个MySQL JDBC驱动bug引起的血案
1.1 问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是 ...
- ux.form.field.TreePicker 扩展,修复火狐不能展开bug
/** * A Picker field that contains a tree panel on its popup, enabling selection of tree nodes. * 动态 ...
- duilib修复ActiveXUI控件bug,以支持flash透明动态背景
转载请说明原出处,谢谢~~ 昨天在QQ控件里和同学说起QQ2013登陆窗体的开发,从界面角度考虑,单单一个登陆界面是很容易做出来的.腾讯公司为了 防止各种盗号行为可谓煞费苦心,QQ2013采用了动态背 ...
- mac系统下修复第三方Python包bug
发现问题 今天在github上fork了CI 3.x的中文手册,按照README文档一步步进行Sphinx和相关工具的安装,最终build生成html版手册.操作到第6步执行`make html`的时 ...
- Scrum立会报告+燃尽图(十一月十九日总第二十七次):功能开发与修复上一阶段bug
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
随机推荐
- js控制元素的显示与隐藏
<body class="easyui-layout"> <div id = "centerId" data-options="re ...
- extends:类似于java中的继承特征,extends="struts-default"
extends:类似于java中的继承特征,extends="struts-default"就是继承struts-default.xml,它里面定义了许多跳转类型.拦截器等一些常用 ...
- UVa 1641 ASCII Area
题意: 就是用一个字符矩阵代表一个闭合的阴影部分,然后求阴影部分的面积. 分析: 一个'/'和'\'字符都代表半个小方块的面积. 关键就是判断'.'是否属于阴影部分,这才是本题的关键. 从第一列开始, ...
- acdream 小晴天老师系列——苹果大丰收(DP)
小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买 ...
- datagrid中需要填写长文本,扩展的textarea
$.extend($.fn.datagrid.defaults.editors, { textarea: {//textarea就是你要自定义editor的名称 init: function(cont ...
- 数组中所有重复次数大于等于minTimes的数字
class Program { static void Main(string[] args) { int[] input = { 1, 1, 1, 2, 2, 5, 2, 4, 9, 9, 20 } ...
- SharePoint中修改密码的WEB Part之终极版:即可以修改AD,又可以修改本机用户密码的Web Part!!
转:http://www.cnblogs.com/dosboy/archive/2007/08/01/838859.html 在网上查了那么多SharePoint密码修改的第三方开发,都有问题.总结下 ...
- 设计模式_State_状态模式
形象例子: 跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我 ...
- 【译】 AWK教程指南 附录B-Actions
Actions 是由下列指令(statement)所组成: 表达式 ( 函数调用,赋值...) print 表达式列表 printf( 格式化字符串, 表达式列表) if( 表达式 ) 语句 [els ...
- 从代码都发布遇到的问题总结(C#调用非托管dll文件,部署项目) 转
http://www.cnblogs.com/Purple_Xiapei/archive/2012/06/30/2570928.html