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

问题:

两款产品都有韦根输入功能,这两款产品分别使用的是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左右的中断处理不过来,连产生中断的次数都不够,估计得从性能和中断产生到处理过程的分析来进一步剖析这个问题,目前只是用一种非常规的方式来处理这个问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值