aw9523芯片按键失效问问题分析

1、 问题分析部分

-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
问题分析部分
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------


从 GF3_L125_PP1_KeyLife_test_issue_1.zip 压缩包中的 kernel.log.8 中,
可以看到:
问题出现的时间点为:[21707.129545 / 09-20 16:57:27.430],因为之后的log ,就再无aw9523_key_work的log打印。
log 如下:

<6>[21706.915399 / 09-20 16:57:27.210][0] aw9523_key_work: key_report: p0-row=1, p1-col=2, key_code=6, key_val=1
<6>[21706.915516 / 09-20 16:57:27.210][0] aw9523_key_work: end 
<6>[21706.965627 / 09-20 16:57:27.260][0] aw9523_key_work: begin 
<6>[21706.971601 / 09-20 16:57:27.270][0] aw9523_key_work: end 
<6>[21707.021681 / 09-20 16:57:27.320][0] aw9523_key_work: begin 
<6>[21707.027302 / 09-20 16:57:27.320][0] aw9523_key_work: key_report: p0-row=1, p1-col=2, key_code=6, key_val=0
<6>[21707.129545 / 09-20 16:57:27.430][0] aw9523_key_work: begin 
<6>[21707.135858 / 09-20 16:57:27.430][0]
<6>[21713.162529 / 09-20 16:57:33.460][0] aw9523_backlight_set brightness = 91
<6>[21713.179375 / 09-20 16:57:33.480][3] aw9523_backlight_set brightness = 90
<6>[21713.212347 / 09-20 16:57:33.510][2] aw9523_backlight_set brightness = 89
<6>[21713.245690 / 09-20 16:57:33.540][2] aw9523_backlight_set brightness = 88


结合 代码分析,
static void aw9523_key_work(struct work_struct *work)
{
	printk("%s: begin \n", __func__);
	// step 1: 此处省略解析 按键的代码

	printk("\n");

	// step 2: 此时根据解析好的按代值查表,
	if (memcmp(keyst_old, keyst_new, P1_NUM_MAX)) {	// keyst changed
		for (i=0; i<P1_NUM_MAX; i++) {  //8 循环
			if (keyst_old[i] != keyst_new[i]) 
			{		// keyst of i col changed
				//step 3: 此处省略解析 按键查表流程, 如果按键查表成功,则会上报keycode 且打印log “aw9523_key_work: key_report: ”
				input_report_key(pdata->input, keymap[cnt].key_code, keymap[cnt].key_val);
				input_sync(pdata->input);
				printk("%s: key_report: p0-row=%d, p1-col=%d, key_code=%d, key_val=%d\n",__func__, j, i, keymap[cnt].key_code, keymap[cnt].key_val);
			}
		}
		// step 4 : 备份 键值为 keyst_old,
		memcpy(keyst_old, keyst_new, P1_NUM_MAX);
	}

	// step 5: 如果检测到按键已经释放了,也就是 keyst_new 全是 0 的话,说明没有按键,此时释放中断,退出,中断结束
	if(!(memcmp(&keyst_new[0], &keyst_def[KEYST_NEW][0], P1_NUM_MAX))) {			// all key release   
		enable_irq(client->irq);									//enable bb irq 
		return;
	}
	// step 6: 代码未跑到这儿
	hrtimer_start(&pdata->key_timer, ktime_set(0,(1000/HRTIMER_FRAME)*1000000), HRTIMER_MODE_REL);
	printk("%s: end \n", __func__);
}
	

分析如下:
结合代码和log 分析,在 09-20 16:57:27.430 这个时间点,
aw9523 触发了一次中断,但在中断函数中检测按键值确并示检测到相关的键值。
且如果是正常的按键的话,由于代码执行时间很快(50ms 以内),
在按键期间内(根据前面的log 计算,时间一般为110ms),一般来说会得进入好几次 aw9523_key_work 函数。

正常log 如下:
<6>[21706.915399 / 09-20 16:57:27.210][0] aw9523_key_work: key_report: p0-row=1, p1-col=2, key_code=6, key_val=1
<6>[21706.915516 / 09-20 16:57:27.210][0] aw9523_key_work: end 
<6>[21706.965627 / 09-20 16:57:27.260][0] aw9523_key_work: begin 
<6>[21706.971560 / 09-20 16:57:27.270][0] 
<6>[21706.971601 / 09-20 16:57:27.270][0] aw9523_key_work: end 
<6>[21707.021681 / 09-20 16:57:27.320][0] aw9523_key_work: begin 
<6>[21707.027221 / 09-20 16:57:27.320][0] 
<6>[21707.027302 / 09-20 16:57:27.320][0] aw9523_key_work: key_report: p0-row=1, p1-col=2, key_code=6, key_val=0


因此,根据上面的分析,得出结论,最后一次的 aw9523 中断事件为异常中断,
需请芯片产商分析同步分析,芯片异常的原因。

2、 问题分析部分

-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
后续工作部分
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------

下一步工作进行:

1. 将前面的问题分析结论给到 aw9523芯片产商,请 aw9523芯片产商 分析 及 回答如下问题
	(1)贵司是否压力测试,是否出现过极小概率芯片异常的情况?
	(2)贵司是否有芯片自检功能? 如果芯片出现问题后,是否有能力做到自我恢复?如何实现自我恢复?
	(3)该问题非常紧急,请贵协调FAE于 929日 来我司一起研发当芯片异常后的,自检及自我恢复功能实现。 ,


2. 我司内部增加 log,协调编译 debug 版本,打开相关的log, 安排继续做压力测试。


增加log , 当 aw9523 读写fail 时,打印相关的log.
修改如下:
static int aw9523_write_reg(struct i2c_client *client, int reg,
						unsigned char val)
{
	int rc;
	struct aw9523_kpad_platform_data *pdata;

	pdata = i2c_get_clientdata(client);
	mutex_lock(&pdata->read_write_lock);
	rc = __aw9523_write_reg(client, reg, val);
	mutex_unlock(&pdata->read_write_lock);

	// hyl 20190927 debug key +++
	if(rc != 0)
		printk("%s aw9523_write_reg [0x%x]=(%d) failed !!! \n", __func__, reg, val);
	// hyl 20190927 debug key ---

	return rc;
}

static int aw9523_read_reg(struct i2c_client *client, int reg,
						unsigned char *val)
{
	int rc;
	struct aw9523_kpad_platform_data *pdata;

	pdata = i2c_get_clientdata(client);
	mutex_lock(&pdata->read_write_lock);
	rc = __aw9523_read_reg(client, reg, val);
	mutex_unlock(&pdata->read_write_lock);

	// hyl 20190927 debug key +++
	if(rc != 0)
		printk("%s aw9523_read_reg [0x%x] failed !!! \n", __func__, reg);
	// hyl 20190927 debug key ---

	return rc;
}

发布了329 篇原创文章 · 获赞 66 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/101553530