MTK6739 Android Q 版本 TP虚拟按键无功能

新上项目 MTK6739 Android Q 平台,按照以前Android版本的虚拟按键配置方法配置如下:

#define key_1           -60,110              //auto define  
#define key_2           -60,165
#define key_3           -60,240
#define key_4           -60,315
#define key_5           -60,390
#define TPD_HAVE_BUTTON
#ifdef TPD_HAVE_BUTTON
#define TPD_KEYS        {KEY_MUTE, KEY_HOMEPAGE, KEY_BACK, KEY_VOLUMEUP, KEY_VOLUMEDOWN}
#define TPD_KEYS_DIM    	{{key_1,50,30},{key_2,50,30},{key_3,50,30},{key_4,50,30},{key_5,50,30}}
#endif

但是TP虚拟按键无功能, I wonder,难道Q版本这块驱动变化大,开始动手分析:
adb shell 查看节点 /sys/board_properties/virtualkeys.mtk-tpd 已经创建,
adb shell getevent 对应的/dev/input/event?,有TP坐标上报到上层。咦?驱动这块好像没有问题,是哪里有问题?抓log分析喽,
先看上层log,搜索关键字input、virtualkey等,看能不能找到些蛛丝马迹,发现一个:InputReader: type=1400 audit(0.0:921): avc: denied { read } for name=“virtualkeys.mtk-tpd” dev=“sysfs” ino=28056 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0 ,是个SELINUX权限问题,结合log及代码上下文,分析这个权限是不是重点嫌疑犯,上代码 frameworks/native/services/inputflinger/EventHub.cpp

bool EventHub::loadVirtualKeyMapLocked(Device* device) {
.........................
    path += "/sys/board_properties/virtualkeys.";
    path += device->identifier.getCanonicalName();
    **if (access(path.c_str(), R_OK))** {  //在这里报权限问题,直接return,看来VirtualKeyMap没有load成功
        return false;
    }
    device->virtualKeyMap = VirtualKeyMap::load(path);
    return device->virtualKeyMap != nullptr;
}

看来是权限的问题了,添加了权限再验证,发现还是不行,抓log再分析,
首先不报权限错误了,看来除了权限问题还有其它坑呀,没办法,结合log及代码上下文,查找问题:
06-12 11:19:13.858360 681 891 E VirtualKeyMap: /sys/board_properties/virtualkeys.mtk-tpd:1: Unknown virtual key type, expected 0x01.这个log信息是个什么鬼,看代码:

status_t VirtualKeyMap::Parser::parse() {
    while (!mTokenizer->isEof()) {
#if DEBUG_PARSER
        ALOGD("Parsing %s: '%s'.", mTokenizer->getLocation().string(),
                mTokenizer->peekRemainderOfLine().string());
#endif

        mTokenizer->skipDelimiters(WHITESPACE);

        if (!mTokenizer->isEol() && mTokenizer->peekChar() != '#') {
            // Multiple keys can appear on one line or they can be broken up across multiple lines.
            do {
                String8 token = mTokenizer->nextToken(WHITESPACE_OR_FIELD_DELIMITER);
                if (token != "0x01") { //这儿报错,没有找到有效的按键
                    ALOGE("%s: Unknown virtual key type, expected 0x01.",
                          mTokenizer->getLocation().string());
                    return BAD_VALUE;
                }
     。。。。。。。。。。
}

原来是解析虚拟按键信息时,报错了,难道是底层传上来的信息有问题,
加打印log,是有点不对劲:
VirtualKeyMap: Parsing /sys/board_properties/virtualkeys.mtk-tpd:1: '0x01:113:-60:110:50:30:0x01:113:-60:110:50:30:0x01:113:-60:110:50:30:。。。。。。。怎么传上来的信息不对,
adb shell cat /sys/board_properties/virtualkeys.mtk-tpd,打印出来的信息也是有问题的,看来底层也问题,上对应的代码:

static ssize_t mtk_virtual_keys_show(struct kobject *kobj,
			struct kobj_attribute *attr, char *buf)
{
	int i, j;
	for (i = 0, j = 0; i < tpd_keycnt; i++)
		j += snprintf(buf+j, PAGE_SIZE-j, "%s%s:%d:%d:%d:%d:%d%s",buf,
			     __stringify(EV_KEY), tpd_keys[i],
			     tpd_keys_dim[i][0], tpd_keys_dim[i][1],
			     tpd_keys_dim[i][2], tpd_keys_dim[i][3],
			     (i == tpd_keycnt - 1 ? "\n" : ":"));
	return j;
}

这是平台原生代码,没有改动过,理论上没有问题,但为什么上报的按键信息有问题呢,只能研究研究了,咦,发现一个问题,snprintf为什么把没有清零的buf也格式化进去了,这不对呀,难怪打印的信息那么乱,果断干掉,问题解决。

static ssize_t mtk_virtual_keys_show(struct kobject *kobj,
			struct kobj_attribute *attr, char *buf)
{
	int i, j;
	for (i = 0, j = 0; i < tpd_keycnt; i++)
		j += snprintf(buf+j, PAGE_SIZE-j, "%s:%d:%d:%d:%d:%d%s",
			     __stringify(EV_KEY), tpd_keys[i],
			     tpd_keys_dim[i][0], tpd_keys_dim[i][1],
			     tpd_keys_dim[i][2], tpd_keys_dim[i][3],
			     (i == tpd_keycnt - 1 ? "\n" : ":"));
	return j;
}

总结此MTK Q版本,TP虚拟按键这块有两个坑,第一没有SELINUX权限,第二上传按键map信息buf没有清零。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪的名字叫麦兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值