高通SDM450韦根数据输入过快导致数据丢失问题分析处理

news/2024/11/16 4:54:51/

问题:

两款产品都有韦根输入功能,这两款产品分别使用的是SDM450和MSM8953平台,韦根输入的驱动采用同一个,当外部输入韦根数据的时间间隔速度在1ms以内的情况下,SDM450平台会出现概率性丢失数据,而msm8953平台确没有丢失

分析调试过程

一、输入信号测试

为了排除硬件上的问题,用示波器测量主控端韦根0和韦根1的信号,从示波器上看信号质量是正常的,因而可能跟硬件的关系不大,以下是示波器抓到的主控端韦根输入的信号波形

二、源码分析

1、源码这一块,从驱动里面打印出来的数据就已经是丢失了,对于整个韦根驱动来说,数据的最原始位置就是中断获取到的数据,因而尝试在中断中加锁,但是依然是有丢失数据的情况

/* 韦根0中断处理函数*/
static irqreturn_t input_irq_d0_handler(int irq, void *dev_id)
{spin_lock(&wg_d0_in_lock);   //加锁input_data->wiegand[input_data->count]=0;input_data->count++;spin_unlock(&wg_d0_in_lock);return IRQ_HANDLED;
}/*韦根1中断处理函数*/
static irqreturn_t input_irq_d1_handler(int irq, void *dev_id)
{spin_lock(&wg_d1_in_lock);   //加锁input_data->wiegand[input_data->count]=1;input_data->count++;spin_unlock(&wg_d1_in_lock);return IRQ_HANDLED;
}

逻辑分析仪接收到的数据,从示波器以及逻辑分析仪得到主控端管脚信号都是正确的,但是数据依然丢失

2、进一步做实验,先不考虑数据的完整性,看韦根0和韦根1产生的中断次数

msm8953_64:/ #cat /proc/interrupts

从CPU的中断次数来看,外部发送两次26位韦根数据,第一次韦根0和韦根1产生的次数是正常的26次,第二次发送的时候,次数少了3次,也就是说从CPU端就已经丢失数据了,有可能是负载太大导致的,另外MSM9853平台却不会出现这个问题,SDM450和MSM8953的代码是用同一套,区别在于MSM8953是主频是2G的,SDM450主频是1.8G的

3、提高CPU性能测试

关闭性能和温控测试
adb shell stop mpdecision
adb shell stop thermal-engine
关闭性能和温控测试------>问题依然存在
adb shell stop mpdecision
adb shell stop thermal-engine#CPU一直在线测试------>问题依然存在
adb shell "echo 1 > /sys/devices/system/cpu/cpu1/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu2/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu3/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu4/online"    
adb shell "echo 1 > /sys/devices/system/cpu/cpu5/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu6/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu7/online"#将关闭CPU动态调节,CPU频率固最高运行频率上------>问题依然存在
adb shell "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor" #关闭低功耗模式----->问题解决
adb shell "echo Y > /sys/module/lpm_levels/parameters/sleep_disabled"

通过不管的测试,把CPU运行在性能模式后,问题就解决了

adb shell "echo Y > /sys/module/lpm_levels/parameters/sleep_disabled"

按照一般的理解,高通的CPU也不至于对1ms左右的中断处理不过来,连产生中断的次数都不够,估计得从性能和中断产生到处理过程的分析来进一步剖析这个问题,目前只是用一种非常规的方式来处理这个问题


http://www.ppmy.cn/news/724921.html

相关文章

[高通SDM450][Android9.0]CTA认证--Android6.0以下应用默认不授权

文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 设备在进行入网认证的时候,实验室要求应用在使用特殊权限的时候,需要告知用户,要用户授权才能使用相应的权限&…

高通SDM450 主屏mipi转EDP

主屏通过lt8911exb 将mipi信号转换成EDP信号输出,调试从大的方向上看,主要是两方面,一个是bootloader阶段的lt8911exb初始化,为了让现实过程更完整,需要在lk的display init之前就要将lt8911exb准备好.当lt8911exb准备好…

[高通SDM450][Android9.0]debug串口转通用串口

文章目录 开发平台基本信息问题描述解决方法debug口转普通串口补丁 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 由于硬件起初设计的时候,没有预留通用串口,而usb转串口又不是特别稳定,经常会挂死&#xf…

[高通SDM450][Android9.0]同一套代码兼容不同的emmc

文章目录 开发平台基本信息问题描述解决方法1. 如何计算userdata分区大小2. 兼容不同规格的emmc3.MTP模式显示异常 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 一款设备,经常会出现搭配不同内存的情况,比如216跟464&…

高通SDM450平台配置SPI0接口

一、查看原理图,需要将GPIO_0、GPIO_1、GPIO_2、GPIO_3配置成SPI接口 二、查看安SDM450平台的数据手册,文档号:80-PC173-1,查看相关的手册可知,GPIO_0、GPIO_1、GPIO_2、GPIO_3可以复用成SPI1, 三、查看高通的文档号&a…

高通SDM450平台的LDO 输出与电压调节

开始之前,首先我们要知道什么是LDO?有什么作用?LDO调试需要调哪些? 什么是LDO,有什么作用? LDO为 低压线性稳压器,高通平台有多路LDO电压输出,以SDM450 为例 共有 LDO1~LDO23 23路。用于给外设提供电源。 LDO需要调什么? LDO的调试主要 有 打开和关闭 LDO电压 和 …

GO中file文件操作

一、File文件操作 首先,file类是在os包中的,封装了底层的文件描述符和相关信息,同时封装了Read和Write的实现。 1、FileInfo接口 FileInfo接口中定义了File信息相关的方法。 type FileInfo interface {Name() string // base name …

C#(四十六)之基于流的文件操作(FileStream)

FileStream类属性和方法 属性 CanRead 指示当前文件流是否支持读取 CanWrite 指示当前文件流是否支持写入 CanSeek 指示当前文件流是否支持查找 IsAsync FileStream是同步打开还是异步打开 Length 流的长度(字节数) CanTimeOut 当前文件流是否可以…