跟踪G-Sensor有时不起作用的问题

简介: 跟踪G-Sensor有时不起作用的问题        最近在生产反馈中,有提到批量机器中有大约2%的机器遇到不转屏的问题。笔者通过反复跟踪,重现了这个问题,通过分析lsmod,看到驱动又已经加载,但是就是不起作用,再通过getevent看信息,发现没有数据报上来,这说明有问题,G-sensor没有报数据肯定就不转屏了,那怎么解决呢?       仔细分析了G-sensor的驱动,流程上也没看出什么问题来,当然如果流程有问题就不可能是小概率出问题了, 那应该是大面积有问题了。

跟踪G-Sensor有时不起作用的问题

       最近在生产反馈中,有提到批量机器中有大约2%的机器遇到不转屏的问题。笔者通过反复跟踪,重现了这个问题,通过分析lsmod,看到驱动又已经加载,但是就是不起作用,再通过getevent看信息,发现没有数据报上来,这说明有问题,G-sensor没有报数据肯定就不转屏了,那怎么解决呢?

      仔细分析了G-sensor的驱动,流程上也没看出什么问题来,当然如果流程有问题就不可能是小概率出问题了, 那应该是大面积有问题了。层层分析,还是觉得在detect处理上有疑点,全志平台提供的驱动,读一遍chip ID后,就判断是不是BMA250,或者BMA250E,如果都不是就返回了,上层也就认为没有找到G-sensor,就不会去读数据。通过加了一些打印后,通过大量的测试跟踪,发现G-sensor没有的时候,在detect的时候都没有读成功,于是笔者又从硬件原理图上分析了一下,原来在同一组IIC上,不止它一个,而它就是相对比较晚加载的一个,因此在加载它驱动的时候,前一个驱动使用iic可能有忙的问题,这样就可能造成超时,最终读不出chip ID。那么,我们可以在读chip ID的时候,可以尝试多读几次,一次不行,休息一会再去读,这样就尽了最多限度的努力去读chip ID了,当然极端一点的还可以在读不出chip ID的时候,也强制认为读到了,这样有一个不好地方就是,不能做多种G-sensor的兼容,如果你只有一种G-sensor,这样做也没什么。笔者通过这样一修改后,通过专项测试,以及近段时间的批量生产,没有复现了这个问题。

      因此,在靠读外设的chip ID来判断是否存在这个硬件的时候,我们可以尝试多读几次,这样软件的兼容性会好一点,有一个不好的地方就是,系统的启动时间会稍微增加一点。下面就是对G-sensor detect改造的代码:

int gsensor_detect(struct i2c_client *client, struct i2c_board_info *info)
{
	struct i2c_adapter *adapter = client->adapter;
	int ret;
	int retrytimes = 5;
	
    if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
            return -ENODEV;
            
	if(twi_id == adapter->nr){
	    for(i2c_num = 0; i2c_num < (sizeof(i2c_address)/sizeof(i2c_address[0]));i2c_num++)
	    {	    client->addr = i2c_address[i2c_num];
    	       pr_info("%s:addr= 0x%x,i2c_num:%d\n",__func__,client->addr,i2c_num);
    	       
    	       do {
		    ret = i2c_smbus_read_byte_data(client,BMA250_CHIP_ID_REG);
		    if (ret < 0) {
		              printk("FAIL read value is 0x%x, retrytimes =%d\n", ret, retrytimes);
		            
		              retrytimes--;
		              msleep(5);/*5ms*/
		            }
    	       } while((retrytimes > 0) && (ret < 0));
    	       
    	       pr_info("Read ID value is :0x%x\n",ret);
    	       if ((ret &0x00FF) == BMA250_CHIP_ID){
            		pr_info("Bosch Sensortec Device detected!\n" );
    				strlcpy(info->type, SENSOR_NAME, I2C_NAME_SIZE);
                    return 0; 
    
               }else if((ret &0x00FF) == BMA150_CHIP_ID){
            	  	
            	   pr_info("Bosch Sensortec Device detected!\n" \
    			"BMA150 registered I2C driver!\n");  
    			 strlcpy(info->type, SENSOR_NAME, I2C_NAME_SIZE);
                     return 0; 
	      } else if((ret &0x00FF) == BMA250E_CHIP_ID) { 
		strlcpy(info->type, SENSOR_NAME, I2C_NAME_SIZE);
		return 0; 	
	      }  else { 
		/*worearound we just one gsensor*/
		pr_info("set force!!!\n");
		strlcpy(info->type, SENSOR_NAME, I2C_NAME_SIZE);
		return 0; 	
					}                                                                                                                                
        }
        
        pr_info("%s:Bosch Sensortec Device not found, \
                 maybe the other gsensor equipment! \n",__func__);
        return -ENODEV;
    }else{
		return -ENODEV;
	     }
}


 

目录
相关文章
|
消息中间件 Kubernetes 网络协议
Cilium 系列 -15-7 层网络 CiliumNetworkPolicy 简介
Cilium 系列 -15-7 层网络 CiliumNetworkPolicy 简介
|
存储 网络协议 数据库
【计算机网络】第四章:网络层 (万字详解)
要让事情改变,先改变我自己;要让事情变得更好,先让自己变得更好。
【计算机网络】第四章:网络层 (万字详解)
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
477 2
|
开发者 Python
【Python】已解决:TypeError: __init__() got an unexpected keyword argument ‘port’
【Python】已解决:TypeError: __init__() got an unexpected keyword argument ‘port’
2289 0
【Python】已解决:TypeError: __init__() got an unexpected keyword argument ‘port’
|
8月前
|
人工智能 计算机视觉
YOLOv11改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
YOLOv11改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
1009 6
YOLOv11改进策略【损失函数篇】| NWD损失函数,提高小目标检测精度
|
11月前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
260 4
鸿蒙开发:切换至基于rcp的网络请求
|
SQL 关系型数据库 MySQL
破防了,谁懂啊家人们:记一次mysql问题排查
某天用户反馈线上产品报错,本文记录了这次mysql问题排查和修复的过程,希望给大家参考。
|
域名解析 搜索推荐 Apache
服务器301重定向详细教程
301重定向是一种HTTP状态码,用于指示网页已永久移至新位置,对SEO和用户体验至关重要。本文详解了301重定向的作用,包括提升搜索引擎排名和自动引导用户访问新URL。同时介绍了多种设置方法,如通过网站控制面板、Apache的mod_rewrite模块、IIS的URL重写模块等,并提醒注意新URL的准备、链接更新及流量监控。合理设置301重定向有助于网站平稳过渡和长期发展。
1669 8
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
1015 0
|
负载均衡 网络协议 Cloud Native
CentOS环境下安装Nacos
Centos安装Nacos完成入门的学习和开发任务
1572 0
CentOS环境下安装Nacos