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 ...
随机推荐
- hibernate实体的几种状态:
hibernate实体的几种状态: 实体的生命周期中,实体主要经过瞬时(Transient),托管(Attatched或Managed),游离(Detached)和销毁(Removed)四个状态. 瞬 ...
- bzoj1453
这是一道好题,按行建线段树,每个点维护上下边界的连通性,详细见代码注释 网上写法不一,自认为比较简单,就放出来相出来献丑吧 ..,..] of longint; //u[]上边界,d[]下边界 s,f ...
- POJ 2728 Desert King ★(01分数规划介绍 && 应用の最优比率生成树)
[题意]每条路径有一个 cost 和 dist,求图中 sigma(cost) / sigma(dist) 最小的生成树. 标准的最优比率生成树,楼教主当年开场随手1YES然后把别人带错方向的题Orz ...
- (五)学习JavaScript之firstChild 属性
参考:http://www.w3school.com.cn/jsref/prop_node_firstchild.asp 定义和用法 firstChild 属性返回指定节点的首个子节点,以 Node ...
- ECSHOP:首页实现显示子分类商品,并实现点击Tab页切换分类商品
例子:首页实现显示子分类商品,并实现点击Tab页切换分类商品(非AJAX) 开始: 1. 打开调试开关 文件地址:include/cls_template.php 找到 : functi ...
- gdi写的2048
//-------------------------------------------[头文件及引用]----------------------------------------------- ...
- delphi通过OLE对word进行单元格合并操作
uses comobj, word2000procedure TForm1.Button2Click(Sender: TObject);var WordApp, WordDoc,table: OleV ...
- Windbg源码调试
Windbg提供比VS2008丰富很多的调试命令,尤其是调试多线程程序. 今天试着怎么使用源代码方式调试.为了说明调试命令,<C++标准库>一书里的例子做示范. // testcast.c ...
- getsockopt/setsockopt 函数说明
[ getsockopt/setsockopt系统调用] 功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选 ...
- Android Activity 生命周期中onStart()和onResume()的区别
首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态.Paused状态:当Activity ...