IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android input touchpanel双击灭屏 -> 正文阅读

[移动开发]Android input touchpanel双击灭屏

双击亮屏这个很常见的功能:需要注意的关键的点

(1)首先得保证灭屏后不断电

注意suspend的流程中是否有关电源的操作函数,通过示波器去量是否有reset,vdd输出供电正常,中断INT信号再摁下后反应

(2)不断电并且触摸屏并未进入stop模式

这个就要具体分析对应的驱动,mxt中suspend->mxt_stop/resume->mxt_start,其中还包含了一些状态标志位,这一步需要确保在灭屏的时候getevnet有键值上报

suspend:
	enable_irq_wake(data->irq);
	//pm_stay_awake(&data->client->dev);
resume:
	disable_irq_wake(data->irq);
	//pm_relax(&data->client->dev);

(3)上报后添加单击亮屏流程

    input_report_key(input_dev, KEY_POWER, 1);
    input_sync(input_dev);
    input_report_key(input_dev, KEY_POWER, 0);
    input_sync(input_dev);

问题一:
? ? ? ? key_power getevent没有任何反应
分析:
? ? ? ? check input.c的流程,打印log,去查哪里把这个过滤点,总结下来就是需要注意
? ? ? ? is_event_supported(type, dev->evbit, EV_MAX)
? ? ? ? is_event_supported(code, dev->keybit, KEY_MAX)
? ? ? ? keybit evbit如果还不清楚的话,需要去搜一下input的流程
解决:
? ? ? ? 添加设置keybit/evbit来实现对应支持的input

    __set_bit(EV_KEY, input_dev->evbit);
    __set_bit(KEY_POWER, input_dev->keybit);
    or
    input_set_capability(input_dev, EV_KEY, KEY_POWER);

(4)以上完成单击亮屏后添加双击亮屏

依赖于mxt驱动的流程,发现单击摁下和抬起后触发的type/x/y/a/p/v值都是一样,
问题二:
? ? ? ? 想通过count每两次记录算一次单击,概率性出现count=4被丢掉
分析:
? ? ? ? 原本以为pressure是代表压力的意思但实际并未有压力检测的功能,
解决:
? ? ? ? 在irq触发的方式上使用上升沿触发IRQF_TRIGGER_RISING

     error = request_threaded_irq(data->irq, NULL, mxt_interrupt,
         data->pdata->irqflags | IRQF_ONESHOT | IRQF_TRIGGER_RISING,
         client->name, data);

(5)双击亮屏后自测多次发现的问题

问题三:
? ? ? ? 两次单击时间过程没有恢复的机制
分析:
? ? ? ? 每次时间的记录都依赖于中断去触发,所以即使单击一次超时后,
? ? ? ? 再下一次双击任然不会亮屏,1 + 2 = 1(count = 1)
解决:
? ? ? ? 在count = 1的时候调度500ms queue_delayed_work,其中用于超时500ms count恢复为0
? ? ? ? (如果要实现循环实行任务,可以在在delayed_work中将delayed_workqueue再次添加到queue中)

probe:
    data->mxt_workqueue = create_singlethread_workqueue("mxt_wq");
    if(NULL == data->mxt_workqueue)
		dev_info(&client->dev,"failed to create mxt_workqueue ");
    INIT_DELAYED_WORK(&data->mxt_work, mxtcount_func);
   
process
	if(type == 1 && suspended){
		count ++;
		dev_info(dev, "trigger into suspend double touch detect count = %d", count);
		if(count == 1){
			firsttouch = current_kernel_time();
			if(NULL != data->mxt_workqueue)
				queue_delayed_work(data->mxt_workqueue, &data->mxt_work, msecs_to_jiffies(500));
		}
		else if(count == 2){
			secondtouch = current_kernel_time();
			ts_delta = timespec_sub(secondtouch, firsttouch);
			dev_info(dev, "get the time ts_delta = %ld",timespec_to_ns(&ts_delta)/1000000);
			if((timespec_to_ns(&ts_delta)/1000000) < 500 && false == triggerOnce){
				input_report_key(input_dev, KEY_POWER, 1);
				input_sync(input_dev);
				input_report_key(input_dev, KEY_POWER, 0);
				input_sync(input_dev);
			}
			count = 0;
		}
		return;
	}else if(!suspended)
		count = 0;

resume:
	if(NULL != data->mxt_workqueue)
		cancel_delayed_work(&data->mxt_work);

以上就是我遇到的一些问题,当然不同的IC的特性还是不同的,但通用流程上应该就上面这些吧。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:53:17  更:2022-10-08 20:53:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 5:26:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码