Linux下编写zlg7290驱动(3)-键盘驱动编写

2.3. 数据处理实现

执行上述代码后系统中就注册了我们的input设备,接下来我们要做的是活得键盘的键值,zlg7290多可以支持64个按键,每个按键按下后都会产生一个中断,我们写驱动是可以使用轮询不断检测是否有按键也可以触发中断来判断是否有按键按下。

本例使用中断方式,当按键按下后会触发终端,终端读取zlg7290相应寄存器,读出键值,然后将键值提交给上层。这写这个中断处理函数是需要注意,zlg7290是使用i2c总线通信的,但是linux内核提供的i2c数据交互函数i2c_transfer是一个可能引起睡眠的操作,所以不能出现在终端处理函数中,但是我们又需要通过这个函数从设备上读出我们的键值,所以我们在这里需要使用linux内核为我们提供的下半部机制工作队列。

中断处理函数:启动工作队列

irqreturn_t zlg7290_interrupt(int irq, void *devid)

{

printk("irq = %d\n", irq);

schedule_work(&zlg7290->work);

return IRQ_HANDLED;

}

工作队列处理函数:中断返回后执行,读取设备的键值并提交给上层。

static void zlg7290_work(struct work_struct *work)

{

struct zlg7290 *ctr_zlg7290 = container_of(work, struct zlg7290, work);

unsigned char val = 0;

size_t len;

unsigned char status = 0;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &status);

if(status & 0x1) {

val = 1;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &val);

if (val == 0) {

val = 3;

zlg7290_hw_read(ctr_zlg7290, 1, &len, &val);

if (val == 0 || val == 0xFF)

goto out;

}

if (val > 56) {

switch (val) {

case 0xFE: val = 57; break;

case 0xFD: val = 58; break;

case 0xFB: val = 59; break;

case 0xF7: val = 60; break;

case 0xEF: val = 61; break;

case 0xDF: val = 62; break;

case 0xBF: val = 63; break;

case 0x7F: val = 64; break;

}

}

input_report_key(ctr_zlg7290->key, key_value[val], 1);

input_report_key(ctr_zlg7290->key, key_value[val], 0);

input_sync(ctr_zlg7290->key);

}

out:

return;

}

input_report_key,提交键值到上层,input_sync提交同步事件。类似的函数还有如下:

input_report_rel(struct input_dev *dev, unsigned int code, int value)

input_report_abs(struct input_dev *dev, unsigned int code, int value);

input_report_ff_status(struct input_dev *dev, unsigned int code, int value);

input_report_switch(struct input_dev *dev, unsigned int code, int value);

到此这个键盘的驱动就完成了。

2.3. 测试

测试程序如下:

#include

#include

#include

#include

#include

#include

int main(int argc, const char *argv[])

{

struct input_event ev;

int fd = open("/dev/input/event1", O_RDWR);

if (fd < 0) {

perror("open");

exit(1);

}

while(1) {

read(fd, &ev, sizeof(ev));

switch(ev.type)

{

case EV_KEY:

printf("user:key_val = %d %d\n", ev.code, ev.value);

break;

default:

break;

}

}

return 0;

}

执行程序后终端会根据不同的按键打印出如下内容:

user:key_val = 1 1

user:key_val = 1 0

user:key_val = 2 1

user:key_val = 2 0

user:key_val = 3 1

user:key_val = 3 0

……

user:key_val = 64 1

user:key_val = 64 0

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践

一、背景 Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而&#xff0c;对于给定的某个应用函数&#xff0c;由于影响其计费成本的因素并不唯一&#xff0c;使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。以传统云…

git分支解析

1、概述和优点 在版本控制过程中&#xff0c;同时会推进多个任务&#xff0c;为此&#xff0c;就可以为每个任务创建单独的分支。开发人员可以把自己的任务和主线任务分离开来&#xff0c;在开发自己的分支的时候不会影响主分支。 分支的好处&#xff1a; 同时推进多个功能开发…

CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem:Webpack5 升级后相关插件和配置更新说明

前言 项目对应的 webpack5 版本如下&#xff1a; npm i webpack5.89.0 -D npm i webpack-cli5.1.4 -D升级插件 说明一下&#xff0c;我更喜欢固定版本号&#xff0c;这样随机bug会少很多&#xff0c;更可控~ npm i postcss-loader6.1.1 -D npm i postcss-pxtorem6.0.0 -D配…

Postman创建及删除workspace工作空间

文章目录 一、Postman创建workspace工作空间二、Postman删除workspace工作空间 一、Postman创建workspace工作空间 打开Postman 点击 Workspaces → Create Workspaces 如图所示操作 工作空间创建完成 二、Postman删除workspace工作空间 点击 Workspaces → 选择要删除…

35.java后端面试宝典

一、自我介绍。 我叫什么&#xff0c;这次是应聘什么岗位&#xff0c;会什么技术&#xff0c;会什么框架&#xff0c;熟练掌握框架之间的整合技术&#xff0c;做过什么项目并且介绍主要做了什么&#xff0c;并且可以为公司带来什么价值。 总的来说&#xff0c;初级Java工程师岗…

vue 项目 index.html 中使用环境变量

目录 1&#xff0c;Vue-CLI&#xff08;Webpack&#xff09;2&#xff0c;Vite 1&#xff0c;Vue-CLI&#xff08;Webpack&#xff09; <!DOCTYPE html> <html lang""><head><link rel"icon" href"<% BASE_URL %>favicon…

Milvus数据一致性介绍及选择方法

1、Milvus 时钟机制 Milvus 通过时间戳水印来保障读链路的一致性&#xff0c;如下图所示&#xff0c;在往消息队列插入数据时&#xff0c; Milvus 不光会为这些插入记录打上时间戳&#xff0c;还会不间断地插入同步时间戳&#xff0c;以图中同步时间戳 syncTs1 为例&#xff0…

uniapp使用colorUI

colorUI 微动画 | ColorUI 使用文档 1&#xff1a;把colorui里三个文件复制到自己项目中去 App.vue </script> <style> import url(colorui/icon.css); import url(colorui/main.css); import url("colorui/animation.css");-webkit-keyframes show {…

Struts2 S2-061 远程命令执行漏洞(CVE-2020-17530)复现

漏洞简介 Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API&#xff0c;鼓励开发者采用MVC架构。Struts2以WebWork优秀的设计思想为核心&#xff0c;吸收了Struts框架的部分优点&#xff0c;提供了一个更加整洁的MV…

GIT 常用命令整理

一、暂存文件 1. 添加指定文件到暂存区&#xff1a;git add [file1] [file2] ... 2. 添加指定目录到暂存区&#xff0c;包括子目录&#xff1a;git add [dir] 3. 添加当前目录的所有文件到暂存区&#xff1a;git add . 4. 添加每个变化前&#xff0c;都会要求确认&#x…

心有暖阳,笃定前行,2024考研加油

2024考研学子&#xff0c;所有的付出终有收获&#xff0c;阳光终将穿透阴霾&#xff0c;终将上岸。 当曙光破晓的时候&#xff0c;你可曾记得那些星月为伴&#xff0c;孤独为友&#xff0c;理想为灯来指引前行之路的日子&#xff0c;那些默默扎根的日子终将化作星星在未来闪闪发…

力扣55. 跳跃游戏

贪心算法 思路&#xff1a; 当前所在位置 pos&#xff0c;能够到达的最远位置为 pos nums[pos]&#xff1b;如果最远位置能到达边界即能够跳出圈&#xff1a; if (rightmost > size - 1) { return true; } 在能跳跃范围内&#xff08;idx < rightmost&#xff09;更新能…

Java项目-瑞吉外卖项目优化Day3

前后端分离开发 Yapi 是一个接口结合了接口测试、接口管理的管理平台&#xff0c;需要配置比较麻烦。看弹幕说用apifox更好用。可以将接口文档导出导入。 Swagger 注意下面的地址前面要有/。 效果&#xff1a; 可以在这里实现接口的测试&#xff0c;也可以导出文档等等。一般…

【ES实战】Elacticsearch6开始的CCR的实践

Elacticsearch6的CCR的实践 文章目录 Elacticsearch6的CCR的实践基本流程CCR应用场景分析容灾备份场景单一容灾数据中心多地容灾数据中心遗留问题 数据本地化 基本流程 CCR 的主从索引的建立流程 #mermaid-svg-wKXpsIBIF6FLy5uz {font-family:"trebuchet ms",verdan…

前端与后端的异步编排(promise、async、await 、CompletableFuture)

前端与后端的异步编排 文章目录 前端与后端的异步编排1、为什么需要异步编排2、前端中的异步2.1 、Promise的使用2.1.1、Promise的基础概念2.1.2、Promise中的两个回调函数2.1.3、工具方法1、Promise.all(&#xff09;2、Promise.race()3、Promise.resolve() 2.2 、async 与 aw…

python+django教学质量评价系统o8x1z

本基于web的在线教学质量评价系统的设计与实现有管理员&#xff0c;教师&#xff0c;督导&#xff0c;学生一共四个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;督导管理&#xff0c;学生评价管理&#xff0c;课程信息管理&#xff0c;学生…

生产者和消费者模式

在一个系统中&#xff0c;存在生产者和消费者两种角色&#xff0c;他们通过内存缓冲区进行通信&#xff0c;生产者生产消费者需要的资料&#xff0c;消费者把资料做成产品。 最关键就是内存缓冲区为空的时候消费者必须等待&#xff0c;而内存缓冲区满的时候&#xff0c;生产者…

编译原理----算符优先级的分析(自底向上)

自底向上分析的分类如下所示&#xff1a; 算符优先分析 算符优先分析只规定算符之间的优先关系&#xff0c;也就是只考虑终结符之间的优先关系。 &#xff08;一&#xff09;若有文法G&#xff0c;如果G没有形如A->..BC..的产生式&#xff0c;其中B和C为非终结符&#xff…

再谈观察者模式的具体应用,如监听一个class其中一个属性,如websocket中onmessage的实现

再谈观察者模式的具体应用&#xff0c;如监听一个class其中一个属性&#xff0c;如websocket中onmessage的实现 概述 在JavaScript中&#xff0c;观察者模式是一种设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&…

springMVC-与spring整合

一、基本介绍 在项目开发中&#xff0c;spring管理的 Service和 Respository&#xff0c;SrpingMVC管理 Controller和ControllerAdvice,分工明确 当我们同时配置application.xml, springDispatcherServlet-servlet.xml , 那么注解的对象会被创建两次&#xff0c; 故…