Linux内核驱动开发-001字符设备开发-003独立按键杂项驱动

1驱动程序

/*************************************************************************> File Name: key_misc.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年04月22日 星期一 17时20分42秒************************************************************************/#if 1
/*=========================The key_misc driver=========================*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>/*寄存器地址映射*/
#define GPGCON (0x56000060)
#define GPGUP (0x56000068)
#define GPGDAT (0x56000064)/*保存寄存器地址映射*/
unsigned int *regGPGCON;
unsigned int *regGPGUP;
unsigned int *regGPGDAT;/*接收返回的键值*/
u8 key=0;/*key函数声明*/
void key_init(void);
u8 key_press(void);
void delay_nms(u32 t);/*驱动函数声明*/
void ioremap_r(void);
static int __init key_driver_init(void);static int key_driver_open(struct inode *node, struct file *fp);
static ssize_t key_driver_read(struct file *fp, char __user *user_buffer, size_t len, loff_t *offset);
static ssize_t key_driver_write(struct file *fp, const char __user *user_buffer, size_t len, loff_t *offset);
static int key_driver_close(struct inode *node, struct file *fp);void iounmap_r(void);
static void __exit key_driver_exit(void);/*定义字符设备文件操作结构体变量*/
static struct file_operations fops = 
{.owner = THIS_MODULE,.open = key_driver_open,.read = key_driver_read,.write = key_driver_write,.release = key_driver_close
};static struct miscdevice key_dev =
{.minor = MISC_DYNAMIC_MINOR,.name = "key_r",.fops = &fops
};#if 1
/*******************************************************************************
* 函 数 名	: ioremap_r
* 函数功能	: 寄存器映射
* 输    入  :无 							
* 输    出  :无
*******************************************************************************/
void ioremap_r(void)
{/*寄存器映射*/regGPGCON = ioremap(GPGCON, 4);//【源地址】【需要映射的地址大小】<返回目标地址>regGPGUP = ioremap(GPGUP,4);regGPGDAT = ioremap(GPGDAT, 4);
}
#endif#if 1
/*******************************************************************************
* 函 数 名	: key_driver_init
* 函数功能	: key驱动初始化
* 输    入  :无 							
* 输    出  :无
*******************************************************************************/
static int __init key_driver_init(void)
{int ret=0;ret=misc_register(&key_dev);if(ret<0){printk("misc_register is failed\n");goto misc_register_err;}/*寄存器映射*/ioremap_r();/*key初始化*/key_init();printk("key_driver_init OK\n");return 0;misc_register_err:return -1;
}
#endif#if 1
static int key_driver_open(struct inode *node, struct file *fp)
{return 0;
}
#endif#if 1
static ssize_t key_driver_read(struct file *fp, char __user *user_buffer, size_t len, loff_t *offset)
{key_press();copy_to_user(user_buffer,&key,4);
//    key=0;return sizeof(key);
}
#endif#if 1
/*******************************************************************************
* 函 数 名 : key_driver_write
* 函数功能 : key驱动写数据
* 输    入 :
*               fp:
*      user_buffer:
*           offset:
* 输    出 :无
*******************************************************************************/
static ssize_t key_driver_write(struct file *fp, const char __user *user_buffer, size_t len, loff_t *offset)
{return 0;
}
#endif#if 1
static int key_driver_close(struct inode *node, struct file *fp)
{return 0;
}
#endif#if 1
/*******************************************************************************
* 函 数 名	: ioremap_r
* 函数功能	: 寄存器反映射
* 输    入  :无 							
* 输    出  :无
*******************************************************************************/
void iounmap_r(void)
{/*寄存器反映射*/iounmap(regGPGCON);iounmap(regGPGUP);iounmap(regGPGDAT);
}
#endif#if 1
/*******************************************************************************
* 函 数 名 : key_driver_exit
* 函数功能 : 退出key驱动
* 输    入 : 无
* 输    出 : 无
*******************************************************************************/
static void __exit key_driver_exit(void)
{iounmap_r();misc_deregister(&key_dev);printk("key_driver_exit OK\n");
}
#endif/*=========================key配置函数=========================*//*******************************************************************************
* 函 数 名	: key_init
* 函数功能	: 独立按键初始化
* 输    入  :无 							
* 输    出  :无
*******************************************************************************/
//K1-EINT8-GPG0,K2-EINT11-GPG3,K3-EINT13-GPG5,
//K4-EINT14-GPG6,K5-EINT15-GPG7,K6-EINT19-GPG11
void key_init(void)
{*regGPGCON&=~((0X03<<0)|(0X03<<6)|(0X03<<10)|(0X03<<12)|(0X03<<14)|(0X03<<22));//KEY控制引脚配置-输入状态*regGPGUP|=(0X01<<0)|(0X01<<11);//上拉使能寄存器-置位-禁止上拉//思考:为何要关闭K1和K6按键对应引脚内部的上拉电阻?(原理图)//这里和LED的区别是:不需要将按键的数据寄存器初始化,
//而LED是需要保证初始状态为关闭	
}
/*******************************************************************************
* 函 数 名         : key_press
* 函数功能		     : 检测按键按下
* 输    入         : 
*					 无
* 输    出         : 返回键值
*******************************************************************************/
u8 key_press(void)
{if((*regGPGDAT&(0X01<<0))==0)//问题1:【&】和【==】的优先级不确定,导致按键功能故障;解决:使用括号{key=1;}else if((*regGPGDAT&(1<<3))==0){key=2;}else if((*regGPGDAT&(1<<5))==0){key=3;}else if((*regGPGDAT&(1<<6))==0){key=4;}else if((*regGPGDAT&(1<<7))==0){key=5;}else if((*regGPGDAT&(1<<11))==0){key=6;}else{key=0;} return key;
}/*******************************************************************************
* 函 数 名         : delay_nms
* 函数功能		     : 延时nms
* 输    入         : 
*									 	t:延时时间
* 输    出         : 无
*******************************************************************************/
void delay_nms(u32 t)
{u32 i=0;u32 j=0;for(i=0;i<t;i++){for(j=0;j<100;j++);}
}module_init(key_driver_init);
module_exit(key_driver_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("XXX");
/*=========================The key_misc driver=========================*/
#endif

2应用程序

/*************************************************************************> File Name: main.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年04月22日 星期一 17时20分42秒************************************************************************/#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>int main(void)
{
#if 1
/*====================key-r====================*/    int fd=0;int n=0;fd=open("dev/key_r",O_RDWR);//这里路径一定要对,尤其是手动创建设备结点的时候if(fd<0){printf("opening is failed\n");return -1;}while(1){read(fd,&n,4);printf("%d\n",n);sleep(1);}return 0;
/*========================================*/    
#endif
}

3运行结果

由运行结果可以看到,6颗独立按键的驱动全部正常。

在这里插入图片描述

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

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

相关文章

QT QZipReader改进,以支持大于2G的zip文件

QZipReader对ZIP文件读取非常方便好用。即使在最新版的QT 6.6.1里&#xff0c;仍然存在一些问题&#xff1a;对于大于2G的zip文件不支持。 虽然有标准zlib可调用&#xff0c;但包装成一个易用且功能成熟的zip解压功能库&#xff0c;还是有很大的工作量&#xff0c;也需要有一定…

Vue 常用修饰符

目录 定义 事件修饰符 v-on&#xff08;缩写&#xff09; 鼠标按键修饰符 v-bind 修饰符&#xff08;缩写:&#xff09; 键值修饰符 表单修饰符 定义 修饰符是用于限定类型以及类型成员的声明的一种符号&#xff0c;vue 中修饰符分为以下五种&#xff1a;事件修饰符、鼠…

网络通信 mac表 tcp连接

多台设备连接到集线器上通过mac地址广播通信 设备连接到交换机上&#xff0c;交换机记录mac表&#xff0c;就不需要广播了&#xff0c;但是机器增多就不行了&#xff0c;交换机只关注mac地址 多台设备连接到交换机上&#xff0c;不同局域网的设备要通信&#xff0c;就把多个交…

交通工程绪论

一、交通工程 交通工程学定义交通工程学研究的内容交通工程学的产生与发展交通工程学在道路运输管理中的作用 1. 交通工程学定义 早在20世纪30年代&#xff0c;美国交通工程师协会(American Institute of Traffic Engineers)给交通工程学(Traffic Engineering)下了一个定义&a…

转:Learn Rust the Dangerous Way-系列文章翻译-总述

原文地址 太精彩了&#xff0c;不转不足以表达我的喜爱。 前言 《Learn Rust the Dangerous Way》​cliffle.com/p/dangerust/ 最近发现了一个学习Rust的优秀系列文章&#xff0c;本人准备对该系列文章进行翻译。 本文是《Learn Rust the Dangerous Way》系列文章翻译的第…

每日一题 — 二分查找

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 朴素二分查找模板&#xff1a; while(.......){//防止溢出int mid left(right - left)/2;if(........){right mid-1;}else if(......){left mid1;}else{return mid;}} 代码&#xff1a; public int search(int[] num…

jdbc操作数据库 and 一个商品管理页面

文章目录 1. 介绍1.1 应用知识介绍1.2 项目介绍 2. 文件目录2.1 目录2.2 介绍以下&#xff08;从上到下&#xff09; 3. 相关代码3.1 DBConnection.java3.2 MysqlUtil.java3.3 AddServlet.java3.4 CommodityServlet.java3.5 DelectServlet.java3.6 SelectByIdServlet.java3.7 S…

揭秘Faiss:大规模相似性搜索与聚类的技术神器深度解析!

Faiss&#xff08;由Facebook AI Research开发&#xff09;是一个用于高效相似性搜索和密集向量聚类的库。它用C编写&#xff0c;并提供Python绑定&#xff0c;旨在帮助研究人员和工程师在大规模数据集上进行快速的相似性搜索和聚类操作。 一、介绍&#xff1a; Faiss的核心功…

双链向表专题

1.链表的分类 链表的种类非常多组合起来就有 2 2 8种 链表说明&#xff1a; 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&#xff1a; 单链表 和 双向带头循环链表 1. 无头单向⾮循环链表&#xff1a;结构简单&#xff0c;⼀般不会单独⽤来存数…

Ultralytics YOLOv8 英伟达™ Jetson®处理器部署

系列文章目录 前言 本综合指南提供了在英伟达 Jetson设备上部署Ultralytics YOLOv8 的详细攻略。此外&#xff0c;它还展示了性能基准&#xff0c;以证明YOLOv8 在这些小巧而功能强大的设备上的性能。 备注 本指南使用Seeed Studio reComputer J4012进行测试&#xff0c;它基于…

在邮件控件Aspose.Email中,处理Outlook TNEF 格式电子邮件

Microsoft Outlook 中常见的传输中性封装格式 (TNEF)电子邮件在处理和提取其内容时可能会带来挑战。在这篇博文中&#xff0c;我们将探讨如何使用强大的 .NET C# 库来处理此类消息&#xff0c;该库简化了各种电子邮件格式&#xff08;包括 TNEF&#xff09;的处理。 Aspose.Em…

尚硅谷-JavaSE阶段考试与面试题库

一、基础题 1&#xff09;用最有效的的方法算出2称以8等于几 答案&#xff1a;2<<3 2&#xff09;两个对象a和b&#xff0c;请问ab和a.equals(b)有什么区别&#xff1f; ab&#xff1a;比较对象地址 a.equals(b)&#xff1a;如果a对象没有重写过equals方法&#xff0c…

【技术干货】润石红外额温枪方案芯片功能介绍

手持红外额温枪框图中&#xff0c;以电池采用9V为例&#xff0c;先通过一个高压LDO RS3002 把电池电压转为3V&#xff0c;供整个系统使用&#xff0c;包括为 MCU&#xff0c;背光灯&#xff0c;运放 等器件供电&#xff0c;然后再用一个低功耗LDO RS3236 从3V 降为1.5V&#…

c++ 泛型的赋值运算符怎么写 简单实验

1.概要 1.泛型的赋值运算符怎么写 A operator(const A& a) A<T> operator(const A<T>& a) 那个是正确的呢&#xff1f; 结果&#xff1a;都可以&#xff0c;但是不能重复 2.代码 #include <iostream> using namespace std;class B { public:B ope…

C++设计模式探讨(2)-单例模式

介绍 这段介绍来自网络&#xff1a; 单例模式是一种创建型的软件设计模式&#xff0c;在工程项目中非常常见。通过单例模式的设计&#xff0c;使得创建的类在当前进程中只有一个实例&#xff0c;并提供一个全局性的访问点&#xff0c;这样可以规避因频繁创建对象而导致的内存…

Go语言第二篇-基本数据类型与转义字符

-———————————————————————————— 随便记录没什么顺序&#xff1a; ———————————————————————————— &#x1f523;本部分内容记录了以下知识点&#xff1a; &#x1f30f;转义字符的使用 &#x1f30f;基本数据类型的使…

node項目的开发

01 创建package.json文件&#xff1a; npm init 创建一个package.json 项目描述的文件。package name &#xff1a; 包名version&#xff1a;版本description&#xff1a;项目描述entry point&#xff1a;入口文件 默认index.jstset command&#xff1a;测试命名git reposito…

协程/线程/进程的简单应用

使用FastApi模拟网络IO接口 import timefrom fastapi import FastAPIapp FastAPI()# 文件名 api.py # 运行: uvicorn api:app --reloadapp.get("/sleep/{times}") def sleep(times: int):# 模拟接口耗时time.sleep(times)return {"sleep": times}async…

rc_visard 3D Stereo Senso

1 简介 rc_visard 3D立体视觉传感器 支持的接口标准 GenICam Generic Interface for CamerasGigE Gigabit Ethernet 词汇表 SGM semi-global matching 半全局匹配 SLAM Simultaneous Localization and Mapping 即时定位与地图构建 2 安全 3 硬件规格 坐标系 rc_visar…

TypeScript 中 interface 和 type 的使用#记录

一、interface&#xff1a;接口 interface A{label: string; }const aa ((aObj: A) > {console.log(aObj.label);//123return aObj.label; })aa({label: 123}) 1、可选属性 interface A{label: string;age?: number; } 2、只读属性 interface A{label: string;age?:…