参考资料

  • Documentation/input/input-programming.txt
  • Documentation/input/event-codes.txt

一、准备QEMU

启动虚拟设备:./qemu-imx6ull-gui.sh
ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image目录下修改设备树和内核

二、QEMU触摸屏操作方法

2.1 原理:

  1. 鼠标在屏幕上按下、松开:

    1. QEMU改变GPIO电平、产生中断
    2. 在touch_pressure_register中记录压力值
  2. 鼠标在屏幕上滑动
    1. 在touch_x_register、touch_y_register中记录坐标

2.2 寄存器说明

地址 寄存器 说明
0x021B4000 touch_pressure_register 记录触摸屏压力值,只有0、1两个取值。1表示按下,0表示松开
0x021B4004 touch_x_register 记录触摸屏X坐标
0x021B4008 touch_y_register 记录触摸屏Y坐标
0x021B400C touch_clean_register 写入任意值,就会清零上述3个寄存器(仅用于测试)

鼠标在屏幕上按下、松开:

  • QEMU改变GPIO电平、产生中断
  • 在touch_pressure_register中记录压力值
    鼠标在屏幕上滑动
  • 在touch_x_register、touch_y_register中记录坐标
    仅能模拟单点触摸,不能模拟多点触摸

三、编写驱动程序

#include <linux/module.h>
#include <linux/init.h>
#include <linux/irqreturn.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/of_gpio.h>#define TOUCHSCREEN_POLL_TIME_MS 10struct qemu_ts_con {volatile unsigned int pressure;volatile unsigned int x;volatile unsigned int y;volatile unsigned int clean;
};static struct input_dev *g_input_dev;
static int g_irq;
static struct qemu_ts_con *ts_con;
struct timer_list ts_timer;static void ts_irq_timer(unsigned long _data)
{if(ts_con->pressure) {input_event(g_input_dev, EV_ABS, ABS_X, ts_con->x);input_event(g_input_dev, EV_ABS, ABS_Y, ts_con->y);input_sync(g_input_dev);mod_timer(&ts_timer, jiffies + msecs_to_jiffies(TOUCHSCREEN_POLL_TIME_MS));}
}static irqreturn_t input_dev_demo_irq(int irq, void *dev_id)
{/* read data *//* report data *///input_event(g_input_dev, EV_KEY, XX, 0);//input_sync(g_input_dev);//printk("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);if(ts_con->pressure) {input_event(g_input_dev, EV_ABS, ABS_X, ts_con->x);input_event(g_input_dev, EV_ABS, ABS_Y, ts_con->y);input_event(g_input_dev, EV_KEY, BTN_TOUCH, 1);input_sync(g_input_dev);mod_timer(&ts_timer, jiffies + msecs_to_jiffies(TOUCHSCREEN_POLL_TIME_MS));            //更新中断时间} else {input_event(g_input_dev, EV_KEY, BTN_TOUCH, 0);input_sync(g_input_dev);}return IRQ_HANDLED;
}static int input_dev_demo_probe(struct platform_device *pdev)
{struct device *dev = &pdev->dev;int error = 0;//struct resource *irq;struct resource *io;int gpio;/* get hardware info from device tree */gpio = of_get_gpio(pdev->dev.of_node, 0);if(!gpio) {printk(KERN_ERR"of_get_gpio error\n");return -1;}/* alloc/set/register input_dev */g_input_dev = devm_input_allocate_device(dev);if(!g_input_dev) {printk(KERN_ERR"devm_input_allocate_device error\n");return -1;}g_input_dev->name = "input_dev_demo";g_input_dev->phys = "input_dev_demo";g_input_dev->dev.parent = dev;g_input_dev->id.bustype = BUS_HOST;g_input_dev->id.vendor  = 0x0001;g_input_dev->id.product = 0x0001;g_input_dev->id.version = 0x0001;/* set 1: which type event ? */__set_bit(EV_KEY, g_input_dev->evbit);__set_bit(EV_ABS, g_input_dev->evbit);__set_bit(INPUT_PROP_DIRECT, g_input_dev->propbit);               //设备触摸设备标志位,可以让tslib识别到/* set 2: which event? */__set_bit(BTN_TOUCH, g_input_dev->keybit);__set_bit(ABS_X, g_input_dev->absbit);__set_bit(ABS_Y, g_input_dev->absbit);/* set 3: event params ? */input_set_abs_params(g_input_dev, ABS_X, 0, 0xffff, 0, 0);         //设置X和Y的范围,起始值input_set_abs_params(g_input_dev, ABS_Y, 0, 0xffff, 0, 0);error = input_register_device(g_input_dev);/* hardware operation  */io = platform_get_resource(pdev, IORESOURCE_MEM, 0);       //获取IO资源ts_con = ioremap(io->start, io->end - io->start);g_irq = gpio_to_irq(gpio);          //获取中断号error = request_irq(g_irq, input_dev_demo_irq, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "input_dev_demo_irq", NULL);setup_timer(&ts_timer, ts_irq_timer, (unsigned long)NULL); //初始化定时器return 0;
}static int input_dev_demo_remove(struct platform_device *pdev)
{del_timer_sync(&ts_timer);         //删除定时器iounmap(ts_con);             //释放io资源free_irq(g_irq, NULL);input_unregister_device(g_input_dev);return 0;
}static struct of_device_id input_dev_demo_of_match[] = {{ .compatible = "100ask,input_dev_demo" },{ },
};static struct platform_driver input_dev_demo_driver = {.probe = input_dev_demo_probe,.remove = input_dev_demo_remove,.driver = {.name = "input_dev_demo",.of_match_table = input_dev_demo_of_match,}
};static int __init input_dev_demo_init(void)
{return platform_driver_register(&input_dev_demo_driver);
}static void __exit input_dev_demo_exit(void)
{platform_driver_unregister(&input_dev_demo_driver);
}module_init(input_dev_demo_init);
module_exit(input_dev_demo_exit);
MODULE_LICENSE("GPL");

四、上机实验

[root@qemu_imx6ul:/mnt/home/picture/input]# hexdump /dev/input/event3
0000000 051f 0000 c466 0008 0003 0000 23f5 0000
0000010 051f 0000 c466 0008 0003 0001 3698 0000
0000020 051f 0000 c466 0008 0001 014a 0001 0000
0000030 051f 0000 c466 0008 0000 0000 0000 0000
0000040 0520 0000 dc31 0009 0001 014a 0000 0000
0000050 0520 0000 dc31 0009 0000 0000 0000 0000
0000060 0528 0000 acf5 0008 0003 0000 2289 0000

五、使用tslib支持触摸

在Ubuntu上执行下列命令。

  • 编译
tar xJf tslib-1.21.tar.xz
cd tslib-1.21
./configure --host=arm-linux-gnueabihf  --prefix=/
make
make install DESTDIR=$PWD/tmp
  • 复制头文件/库到工具链(非必须, 编译其他APP时需要)
cd tslib-1.21/tmp/cp include/* /home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/6.2.1/../../../../arm-linux-gnueabihf/includecp -d lib/*so*  /home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/../arm-linux-gnueabihf/libc/usr/lib/
  • 复制库、APP到开发板

    假设在Ubuntu的/home/book/nfs_rootfs目录下有tslib-1.21。
    在开发板上执行:

mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt
cp  /mnt/tslib-1.21/tmp/lib/*  -drf     /lib
cp  /mnt/tslib-1.21/tmp/bin/*            /bin
cp  /mnt/tslib-1.21/tmp/etc/ts.conf  -d  /etc
  • 使用tslib
export TSLIB_TSDEVICE=/dev/input/event3
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0ts_calibratets_test

编写简单的触摸屏驱动程序——基于QEMU相关推荐

  1. 内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试

    文章目录 一.篇头 二.QEMU:挂载虚拟分区 2.1 创建 sd.ext4.img 虚拟分区 2.2 启动 Qemu 2.3 手动挂载 sd.ext4.img 三.实现一个简单的KO 3.1 目录文 ...

  2. python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

  3. python识别excel文件格式 ——(专栏:基于python编写简单office阅卷程序②)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

  4. python识别word文件格式 ——(专栏:基于python编写简单office阅卷程序①)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

  5. dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序

    dma-buf 由浅入深(一) -- 最简单的 dma-buf 驱动程序 dma-buf 由浅入深(二) -- kmap / vmap dma-buf 由浅入深(三) -- map attachmen ...

  6. 嵌入式Linux系统之I.MX6触摸屏驱动程序TSC2007.C的分析、移植与校准

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天来记录一下I.MX6开发板移植触摸屏驱动程序的过程分析.在移植驱 ...

  7. java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.

    内核第三讲,进入ring0,以及编写第一个内核驱动程序. 一丶进入ring0之前的简介 进入0环之前,我们要明白操作系统的设计,操作系统允许驱动程序使用In out等等特权指令来操作高2G的内存.那么 ...

  8. python自动化测试-简单实现接口自动化测试(基于python)

    原标题:简单实现接口自动化测试(基于python) 一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测 ...

  9. python程序-30分钟学会用Python编写简单程序

    原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...

  10. python使用spark_如何在Python中编写简单代码,并且速度超越Spark?

    全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...

最新文章

  1. 类加载器的双亲委派及打破双亲委派
  2. SharePoint 2013 Error - TypeError: Unable to get property 'replace' of undefined or null reference
  3. 二维数组联通子数组和最大
  4. python字典怎么添加值_python字典中如何添加键值对
  5. 将自己名字PS到他人论文上,并推文说在Nature上发了新文章,如此操作你见过吗?...
  6. Android实现EditText插入表情、超链接等格式
  7. tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始
  8. python3 写入excel_python3读取、写入、追加写入excel文件
  9. 泛微OA缓存开启方式
  10. vscode插件离线下载vsix文件
  11. 苹果手机通过扫描二维码下载APP
  12. 淘宝客返利网的实现方法
  13. imap服务器怎么填写 网易邮箱,ipad设置163邮箱教程 如何设置163邮箱【详细介绍】...
  14. 30个优秀的后台管理界面设计案例分享
  15. Kafka性能监控与优化
  16. Taro开发微信小程序实现简单的登录退出功能
  17. PLSQL Developer几个可能的隐患
  18. 中职升高职c语言程序设计教程课后答案,锦职业技术学院2020年单独招生计算机应用技术专业技能测试考试大纲(中职升高职)...
  19. 2022Q3消费级AR眼镜市场季度分析:国产品牌纷纷发力,市场全面启航
  20. vscode 实用插件

热门文章

  1. 常用电感封装与电流关系
  2. 吉大计算机学院奖学金的分配,奖励资助_吉林大学奖学金设置_高考院校库
  3. 文件传输的服务器软件有哪些,好用的数据传输软件有哪些?专业的数据传输软件排行榜...
  4. 【素史】曼怛罗(70)
  5. 这个“忽悠”马云10亿的男人,还了阿里5000亿,今天当选为院士!
  6. 时间序列的平稳性检验方法汇总
  7. 安卓平台有哪些好的时间管理软件
  8. android报警声音
  9. 解决方案:智慧工地智能巡检方案视频监控系统
  10. python爬iptv直播源脚本_GitHub - bensonlai2002/iptv-m3u-maker: IPTV 国内+国外 电视台直播源m3u文件, 收集汇总本地源脚本...