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