免费com域名网站湖北省勘察设计协会网站

news/2025/10/3 18:29:54/文章来源:
免费com域名网站,湖北省勘察设计协会网站,wordpress 443端口,西丽网站设计我们新项目硬件设计上使用gpio口做按键#xff0c;所以我就需要搞定这个驱动#xff0c;本来想自己写一个gpio口的按键驱动#xff0c;然后看了下内核下面的代码#xff0c;已经有现成的了。Linux内核下游很多很多的现成驱动#xff0c;只要你想得到的#xff0c;基本都是… 我们新项目硬件设计上使用gpio口做按键所以我就需要搞定这个驱动本来想自己写一个gpio口的按键驱动然后看了下内核下面的代码已经有现成的了。Linux内核下游很多很多的现成驱动只要你想得到的基本都是有现成的当然了不包括一些非正常的需求性问题学会在Linux下找驱动看驱动和内核代码我觉得是一件享受和快乐的事情。不过我还是在使用这个驱动上遇到了问题。1. 先说ADC 按键之前的文章有写过adc按键的实现无非就是为了省点GPIO口。RK 利用SARADC 来做多个按键2. GPIO 按键硬件原理图3. 驱动代码kernel-4.4/drivers/input/keyboard/gpio_keys.c 完整代码可查看https://gitee.com/weiqifa/gpio_key/blob/master/gpio_keys.c 驱动代码流程从probe处开始刚开始的时候我连dts文件都不会写因为之前没有接触过这个驱动。然后看了gpio_keys_get_devtree_pdata函数之后又看了内核代码下其他项目其他平台的dts文件才知道怎么写这个驱动的dts文件。实话说这个驱动完成了很多我们需要的功能比如防抖比如中断比如按键label等等。3.1 gpio_keys_get_devtree_pdata 函数解析dts文件这个文件解析的dts 有两种方式一种是直接传入irq的一种是只传入gpio口的。我们的这个项目就只传入了gpio口。3.2 gpio_keys_setup_key 函数这个函数用来设置gpio口的中断的直接看代码会比较清楚。下面这个函数我还没有想清楚它的作用看了回调函数里面的实现是为了把开启的工作队列停止掉。但是我加了打印并没有打印我猜测是为了防止误触发就是按键按下的时间非常短的时候才会调用这个。/*** devm_add_action() - add a custom action to list of managed resources* dev: Device that owns the action* action: Function that should be called* data: Pointer to data passed to action implementation** This adds a custom action to the list of managed resources so that* it gets executed as part of standard resource unwinding.*/ int devm_add_action(struct device *dev, void (*action)(void *), void *data) {struct action_devres *devres;devres  devres_alloc(devm_action_release,sizeof(struct action_devres), GFP_KERNEL);if (!devres)return -ENOMEM;devres-data  data;devres-action  action;devres_add(dev, devres);return 0; } 3.3 驱动修改驱动修改的代码如下--- a/kernel-4.4/drivers/input/keyboard/gpio_keys.cb/kernel-4.4/drivers/input/keyboard/gpio_keys.c-32,6 32,11 #include linux/of_irq.h#include linux/spinlock.h #define LOG_TAG [BUTTON]: %s() line: %d  #define PRINTK_T(fmt, args...)  printk(KERN_INFO LOG_TAG fmt, __FUNCTION__, __LINE__,  ##args)struct gpio_button_data {const struct gpio_keys_button *button;struct input_dev *input;-462,9 467,8  static int gpio_keys_setup_key(struct platform_device *pdev,spin_lock_init(bdata-lock);if (gpio_is_valid(button-gpio)) { - -               error  devm_gpio_request_one(pdev-dev, button-gpio, -                                             GPIOF_IN, desc);PRINTK_T(gpio:%d\n,button-gpio);error  devm_gpio_request(pdev-dev, button-gpio,desc);if (error  0) {dev_err(dev, Failed to request GPIO %d, error %d\n,button-gpio, error);-483,7 487,9  static int gpio_keys_setup_key(struct platform_device *pdev,if (button-irq) {bdata-irq  button-irq;} else {gpio_direction_input(button-gpio);irq  gpio_to_irq(button-gpio);PRINTK_T(weiqifa irq :%d\n,irq);if (irq  0) {error  irq;dev_err(dev,-540,8 546,10  static int gpio_keys_setup_key(struct platform_device *pdev,if (!button-can_disable)irqflags | IRQF_SHARED;-       error  devm_request_any_context_irq(pdev-dev, bdata-irq, -                                            isr, irqflags, desc, bdata);PRINTK_T(weiqifa devm_request_threaded_irq()\n);error  devm_request_threaded_irq(pdev-dev, bdata-irq,NULL,isr, irqflags| IRQF_ONESHOT, desc, bdata);if (error  0) {dev_err(dev, Unable to claim irq %d; error %d\n,bdata-irq, error);-709,6 717,8  static int gpio_keys_probe(struct platform_device *pdev)int i, error;int wakeup  0;       PRINTK_T(start.\n); if (!pdata) {pdata  gpio_keys_get_devtree_pdata(dev);if (IS_ERR(pdata))-779,6 789,8  static int gpio_keys_probe(struct platform_device *pdev)device_init_wakeup(pdev-dev, wakeup);       PRINTK_T(end.\n); return 0;err_remove_group: 可以确定的是如果不修改的话肯定是会出错的。你要知道这个驱动是在2005年就完成编写了中间经过了多少次的系统升级而且很多厂商主推的还是ADC按键驱动GPIO口驱动默认情况下是会被抛弃的厂商释放的SDK根本就不会记得修改这个驱动代码所以别以为你的手机运行正常里面就没有bugbug无处不在只是我们有了重启大法而已。4. dts 代码gpio-keys {compatible  gpio-keys;#address-cells  1;#size-cells  0;autorepeat;//pinctrl-names  default;//pinctrl-0  pwrbtn;button0 {gpios  pio 49 IRQ_TYPE_EDGE_BOTH;linux,code  KEY_F13;label  GPIO F13 Power;linux,input-type  1;gpio-key,wakeup  1;debounce-interval  100;};button1 {gpios  pio 48 IRQ_TYPE_EDGE_BOTH;linux,code  KEY_F14;label  GPIO F14 Power;linux,input-type  1;gpio-key,wakeup  1;debounce-interval  100;};button2 {gpios  pio 51 IRQ_TYPE_EDGE_BOTH;linux,code  KEY_F15;label  GPIO F15 Power;linux,input-type  1;gpio-key,wakeup  1;debounce-interval  100;};}; 5. 测试驱动烧录后按下按键可以看到键值上报.推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号

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

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

相关文章

获胜者网站建设旅游网页素材

目录 1、享元模式(Flyweight Pattern)含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式(Flyweight Pattern)含义 享元模式(Flyweight&#xff09…

深圳网站建设 设计首选中国建设银行南京分行网站首页

儿童安全门和围栏 儿童安全门和围栏用于在门口(如门道)内设置围栏,或用作自支撑围栏,将幼儿可能在其中活动的区域围起来。这些商品可能由塑料、金属、乙烯树脂或木制组件等材料制成。此政策包括但不限于可扩展围栏、伸缩安全门和…

最短路练习

最短路为背景的题 + 做法是最短路的题A - Minimum Path https://www.luogu.com.cn/problem/CF1473E经典套路,发现可以把 max 和 min 换成任意路径中的边,然后 max 和 min 就会最小化这个式子 故写一个 Dijkstra + DP…

东莞网站建设选择菲凡网络wordpress布局切换功能

题目: P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本文学习自: 题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) ———— 关系并查集其实就是在普通并查集的基础上额外开个数组r…

依据XShell采用Git三板斧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

沈阳微信网站制作重庆市建设工程管理网

文章来源:芯片开放社区,作者:OCC编辑万里征途迈出第一步,基于RISC-V的安卓10系统来了。点击链接查案演示视频: 平头哥芯片开放社区(OCC)​occ.t-head.cn今天,平头哥完成了安卓10对RISC-V的移植并开源了全部…

什么网站做ppt赚钱app下载注册量推广平台

spring4单切面 spring4多切面 spring4 spring5

杂题,为什么博客的标题必须互异

不会的东西越来越多了B. K-Set Tree https://www.luogu.com.cn/problem/CF1691F 令 \(F_i\) 表示以 \(1\) 为根时,\(S\) 在 \(i\) 子树内的答案。则: \[F_u=\left(C_{siz_u}^k-\sum C_{siz_v}^k\right)\cdot siz_u+\…

学习笔记:压位高精

把 ddxrS 吓到了,发出惊世疑问:『为什么高二机房正在激烈地讨论怎么写高精度?』考虑 10-base 高精度,单次运算复杂度为 \(O(\log_{10}V)\)。使用 10-base 的主要原因是 std::to_string 很方便、输出也很简单。 但效…

响应式网站有什么弊端微信公众号做推送的网站

本文详解WPF的Button控件。 目录 前言 定义 属性 事件 应用实例 1、普通应用

吉司机 + 历史和练习

并非所有历史和都是吉司机A - Just Another Game of Stones https://www.luogu.com.cn/problem/P9631发现如果选定了这一步取的位置 \(i\),那么要拿的石子是定值 \(a_i-a_i\oplus s\),当 \(a_i\le a_i\oplus s\) 时不…

探索3D空间的视觉基础模型系列 - 指南

探索3D空间的视觉基础模型系列 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

近期杂题,怎么重名了

突围E - Colinear https://atcoder.jp/contests/abc422/tasks/abc422_e 看到题目会有一个乱搞的想法:随机取一对点,那么是有 \(\dfrac 14\) 的概率都在直线上的。带进去暴力 check 一下,多来几次正确率就比较高。 什…

可以做配音兼职的网站微信网站怎么做的好名字

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …

vp 记录 edu 181

tzl 太强了!真挚的膜拜lhy 太强了!真挚的膜拜E. Sets of Complementary Sums https://codeforces.com/contest/2125/problem/E 分拆数、其实是个不牛的东西,但是写假了 😅 令集合元素升序排列为 \(b_{1\sim n}\)。…

状压 DP

没补完(1/3),动作还是太慢了A - 只不过是长的领带 2 / Just Long Neckties 2 https://www.luogu.com.cn/problem/P11665 需要观察到,任意时刻 \(B\) 中不存在重复元素。把 \(B\) 压出来,令 \(f_{i,S}\) 表示选了 …

近期杂题

这段时间比赛的一些题 和 nKessi、duanyu 讲的题目。太偏计数、数学的基本上没办法做了。A. 出关 http://222.180.160.110:61235/contest/6462/problem/1给定 \(s\),对于一个空串,任意利用下列三种操作,使其变为 \(…

学习笔记:分拆数与 Ferrers 图

需要知道概念和求法,有一定的用处分拆数与互异分拆数 要求:给定一个正整数 \(n\),要求将其划分为 \(m\) 个可重 / 不可重的正整数,问本质不同的方案数。(显然 \(m\) 与 \(\sqrt n\) 同阶。) 不妨令划分结果单调不…

DDP 与全局平衡二叉树

其实动态 DP 不是动态树 DP 的同义词动态 DP 对于转移只依赖前几项的 DP,可以放进矩阵。 默认转移范围是 \([1,n]\);如果我们需要改变求解范围,发现如果能获取转移矩阵的乘积就很快了。考虑存下来。 如果需要单点修…

所有北京网站建设公司六安网红小杨哥

目录 引言1. 构造函数1.1概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2特征 4. 赋值运算符重载4.1 运算符重载4.2 赋值运算符重载4.3 前置和后置重载 5.日期类的实现6.const成员7.取地址及const取地址操作符重载 引言 当一个类既没有成员变量又没有成…