瑞芯的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的更多相关文章

  1. 服务器cpu过高修复:操作系统内核bug导致

    服务器cpu过高修复:操作系统内核bug导致修改系统内核参数/etc/sysctl.conf添加下面2条参数:vm.dirty_background_ratio=5vm.dirty_ratio=10

  2. 解决由于显卡驱动BUG导致桌面右键卡顿的问题:bat文件源码

    @ ECHO OFF%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...

  3. 一个MySQL-JDBC驱动bug引起的血案……

    问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是直接写入MySQL ...

  4. 一个MySQL JDBC驱动bug引起的血案

    1.1      问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是 ...

  5. ux.form.field.TreePicker 扩展,修复火狐不能展开bug

    /** * A Picker field that contains a tree panel on its popup, enabling selection of tree nodes. * 动态 ...

  6. duilib修复ActiveXUI控件bug,以支持flash透明动态背景

    转载请说明原出处,谢谢~~ 昨天在QQ控件里和同学说起QQ2013登陆窗体的开发,从界面角度考虑,单单一个登陆界面是很容易做出来的.腾讯公司为了 防止各种盗号行为可谓煞费苦心,QQ2013采用了动态背 ...

  7. mac系统下修复第三方Python包bug

    发现问题 今天在github上fork了CI 3.x的中文手册,按照README文档一步步进行Sphinx和相关工具的安装,最终build生成html版手册.操作到第6步执行`make html`的时 ...

  8. Scrum立会报告+燃尽图(十一月十九日总第二十七次):功能开发与修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

  9. Scrum立会报告+燃尽图(十一月十七日总第二十五次):设计调查问卷;修复上一阶段bug

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...

随机推荐

  1. linux aio

    前几天nginx的0.8.x正式成为stable,然后看了下代码,发现0.8加入了linux native aio的支持,我们知道在linux下有两种aio,一种是glibc实现的aio,这个比较烂, ...

  2. UDP编程(八)

    此为网络编程系列的目录,后续会把内容补上.......

  3. 【转】protobuf2.5.0在<delete [] elements_;>crash的问题。

    背景 项目中使用protobuf作为网络传输协议,最开始在项目中直接使用源代码编译,在真机上测试一直是正常的,直到某天开始在 CPU是64 bit的设备上发现protobuf导致crash了,于是就开 ...

  4. About Wisdom

    All human wisdom is summed up in two words --- wait and hope.人类所有的智慧可以归结为两个词---等待和希望. —— Alexandre D ...

  5. Runnable、Callable、Future和FutureTask用法

    http://www.cnblogs.com/dolphin0520/p/3949310.html java 1.5以前创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable ...

  6. ccr test

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. HDU 4825-Xor Sum(trie)

    题意: 给你一组数,开始询问给一个数  求组中与该数异或值最大的数. 分析:根据异或的特点 要想得到的异或值最大 尽可能的让两个数的每位都相反 先把给定的一组数建树,数的最后一位对应的节点保存这个数的 ...

  8. VIP网络水军账号

    作为一个技术部的组长,主管公司用户相关的项目.今天一名营销同事找我说他想长生3000个水军账号,我首先就想到了以下几个问题: 1.如何实现 2.产生水军对运营项目的影响,主要问题就是一个真实性问题. ...

  9. C++11 并发指南------std::thread 详解

    参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...

  10. [读书笔记]了不起的node.js(三)

    这周的nodejs学习内容为几个依赖包的使用,把书上的例子都敲了一遍.这篇就以例程为线索,复习一下一周的工作. 1.connect 这个例程主要是使用connect依赖包,connect提供一个中间件 ...