驱动day2:LED灯实现三盏灯的亮灭
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_PE_MODER 0x50006000
#define PHY_PF_MODER 0x50007000
#define PHY_PE_ODR 0x50006014
#define PHY_PF_ODR 0x50007014
#define PHY_RCC 0x50000A28#endif
应用程序
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>
int main(int argc, char const *argv[])
{char buf[128] = {0};int fd = open("/dev/mychrdev", O_RDWR);if(fd < 0){printf("打开设备文件失败\n");return -1;}printf("打开设备文件成功\n");while(1){printf("请输入要进行的操作:0(关灯) 1 (开灯)>");fgets(buf,sizeof(buf),stdin); //在终端读一个字符串buf[strlen(buf) - 1] = '\0';write(fd,buf,sizeof(buf));//将数据传递给内核}
/*fgets(buf,sizeof(buf),stdin); //在终端读一个字符串buf[strlen(buf) - 1] = '\0';write(fd,buf,sizeof(buf));//将数据传递给内核memset(buf, 0, sizeof(buf)); //清空数组read(fd,buf,sizeof(buf)); //将内核数据传递给用户printf("buf: %s\n", buf);
*/close(fd);return 0;
}
驱动程序
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "head.h"unsigned int major; //主设备号
char kbuf[128] = {}; //内核空间buf
//定义五个指针指向映射后的虚拟内存
unsigned int *vir_pe_moder;
unsigned int *vir_pf_moder;
unsigned int *vir_pe_odr;
unsigned int *vir_pf_odr;
unsigned int *vir_rcc;
//封装操作方法
int mycdev_open(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);return 0;
}
ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
{//mycdev_read()函数中的ubuf和size分别是指向应用程序中read()函数中的buf, 和sizeof(buf)的值printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);int ret;ret = copy_to_user(ubuf, kbuf, size);if(ret){printk("copy_to_user filed\n");return -EIO;}return 0;
}
ssize_t mycdev_write(struct file *file,const char *ubuf, size_t size, loff_t *lof)
{printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);int ret;ret = copy_from_user(kbuf, ubuf, size);if(ret){printk("copy_from_user failed\n");return -EIO;}if(kbuf[0] == '0')//关灯{ //关灯逻辑(*vir_pe_odr) &= (~(0x1 << 10)); //默认关灯(*vir_pf_odr) &= (~(0x1 << 10));(*vir_pe_odr) &= (~(0x1 << 8));}else if(kbuf[0] == '1'){//开灯逻辑(*vir_pe_odr) |= (0x1 << 10); (*vir_pf_odr) |= (0x1 << 10); (*vir_pe_odr) |= (0x1 << 8);}return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{printk("%s:%s:%d\n", __FILE__,__func__,__LINE__);return 0;
}//定义操作方法结构体对象
struct file_operations fops={.open = mycdev_open,.read = mycdev_read,.write= mycdev_write,.release = mycdev_close,
};static int __init mycdev_init(void)
{//注册字符设备驱动major= register_chrdev(0,"mycdev",&fops);if(major < 0){printk("字符设备驱动注册失败\n");return major;}printk("注册字符设备成功major=%d\n",major);//进行寄存器的地址映射vir_pe_moder = ioremap(PHY_PE_MODER, 4);if(vir_pe_moder == NULL){printk("物理地址内存映射失败%d\n",__LINE__);return -EFAULT;}vir_pf_moder = ioremap(PHY_PF_MODER,4);if(vir_pf_moder == NULL){printk("物理地址内存映射失败%d\n",__LINE__);return -EFAULT;}vir_pe_odr = ioremap(PHY_PE_ODR, 4);if(vir_pe_odr == NULL){printk("物理地址内存映射失败%d\n",__LINE__);return -EFAULT;}vir_pf_odr = ioremap(PHY_PF_ODR, 4);if(vir_pf_odr == NULL){printk("物理地址内存映射失败%d\n",__LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_RCC, 4);if(vir_rcc == NULL){printk("物理地址内存映射失败%d\n",__LINE__);return -EFAULT;}printk("寄存器内存映射成功\n");//LED寄存器初始化(*vir_rcc) |= (0x3 << 4); //GPIOE和GPIOF控制器时钟使能//PE10(*vir_pe_moder) &= (~(0x3 << 20)); //MODER[21:20]->00(*vir_pe_moder) |= (0x1 << 20); //MODER[21"20]->01(*vir_pe_odr) &= (~(0x1 << 10)); //默认关灯//PF10(*vir_pf_moder) &= (~(0x3 << 20));(*vir_pf_moder) |= (0x1 << 20);(*vir_pf_odr) &= (~(0x1 << 10)); //默认关灯//PE8(*vir_pe_moder) &= (~(0x3 << 16));(*vir_pe_moder) |= (0x1 << 16); (*vir_pe_odr) &= (~(0x1 << 8)); //默认关灯return 0;
}static void __exit mycdev_exit(void)
{//取消内存映射iounmap(vir_pe_moder);iounmap(vir_pf_moder);iounmap(vir_pe_odr);iounmap(vir_pf_odr);iounmap(vir_rcc);//注销字符设备驱动unregister_chrdev(major,"mychrdev");
}module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
实现效果
相关文章:

驱动day2:LED灯实现三盏灯的亮灭
head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_PE_MODER 0x50006000 #define PHY_PF_MODER 0x50007000 #define PHY_PE_ODR 0x50006014 #define PHY_PF_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif 应用程序 #include <stdio.h> #include <sys/…...
Android 编译错误:module xxx1 missing dependencies:xxx2
编译错误log module xxx1 missing dependencies:xxx2 分析方向 1.缺少依赖库 添加依赖库 shared_libs: ["libhidlbase","libhidltransport","libhwbinder","liblog","libutils","libcutils",],2.缺…...
使用EasyExcel实现Excel导入导出
介绍 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 快速:快速的读取excel中的数据。 简洁:映射excel和实体类,让…...

京东手机销售数据:2023年9月京东手机行业TOP10品牌排行榜
鲸参谋监测的京东平台9月份手机市场销售数据已出炉! 9月份,手机市场销售整体呈现下滑。鲸参谋数据显示,今年9月,京东平台手机销量为300万,环比下降约20%,同比下降约18%;销售额为92亿,…...
常量字符串
一、常量字符串是什么? 常量字符串是一个常量,它的值是首字符的地址 比如 "abcdefg" 或 "123456789" 就是常量字符串 二、常量字符串与普通字符串的区别 1.常量字符串不可更改,而普通字符串可以更改 利用memcpy内存…...

【活体检测】“深度学习驱动的人脸反欺诈检测系统:性能提升与多模型支持“
微调小视科技开源静默活体检测模型加载方式,性能提升8倍 I. 引言 在当今数字化时代,人脸反欺诈检测在各种应用中发挥着重要作用,从人脸识别到金融欺诈检测。为了满足不断增长的需求,深度学习技术已成为关键工具,但性…...
Howler.js HTML5声音引擎
介绍 Howler.js是一个不错的HTML5声音引擎。功能强大,性能不错,用起来也很方便。 1. 官网 https://howlerjs.com/ GitHub https://github.com/goldfire/howler.js 2. 兼容性 Howler默认使用Web Audio,但在IE上可以自动转为HTML 5 Audio。这…...
centos 7.9每天定期发送最新备份文件到另外一台服务器
1.需求 在本地化部署的过程中,为了使系统相对来说高可用,一般情况下,我们都会做一个负载,但是客户又会考虑成本,所以只有可怜巴巴的两台服务器,要全部服务都做负载,这个就实现不了。所以只能把…...
一文全面了解:一个神奇的 react-antd-admin 动态菜单
在React v18中使用React Router v6和Ant Design (antd) v5来动态生成菜单和路由,同时使用MockJS来模拟接口请求菜单数据,可以按照以下步骤进行: 创建一个React应用: 使用Create React App或您喜欢的其他方式创建一个React应用。 安装必要的依赖: 在项目目录中运行以下命令…...

二叉树,堆排序及TopK问题
要讲二叉树的概念,就要先讲树的概念。 树是什么呢? 树其实是一种储存数据的结构,因为他的结构倒过来和生活中的树很相似所以才被称之为树。 这是一颗多叉树,从最顶端的节点可以找到下边的几个节点,下边的节点又可以找…...
iphone xr密码错误太多次 连接itunes
itunes下载的固件在电脑在电脑的“C:\Users\用户名\AppData\Roaming\Apple Computer\iTunes\iPhone Software Updates”文件夹之中。 如果你忘记了 iPhone 密码 - 官方 Apple 支持 (中国) 下载和使用 Windows 10 版 iTunes - 官方 Apple 支持 (中国) 查找手机 iClo…...
设置RabbitMQ超时时间
RabbitMQ默认的超时时间是30分钟,在消息消费超过30分钟后,rabbitMQ会发生错误,导致整个channel被销毁,无法继续消费 在RabbitMQ安装的终端执行 rabbitmqctl eval application:set_env(rabbit,consumer_timeout,180000000). 命令…...

QT计时器
widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //计时器类 #include <QTime> //时间类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widg…...

3-k8s-镜像仓库harbor搭建
文章目录 一、概念二、安装harbor三、使用harbor仓库 一、概念 官方概念:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。 我们平时拉去镜像都是从线上仓库拉去,但是企业内部的镜像一般都不会随意传到网上,而是保存在自己公…...

0基础学习PyFlink——模拟Hadoop流程
学习大数据还是绕不开始祖级别的技术hadoop。我们不用了解其太多,只要理解其大体流程,然后用python代码模拟主要流程来熟悉其思想。 还是以单词统计为例,如果使用hadoop流程实现,则如下图。 为什么要搞这么复杂呢? 顾…...

【无人机】太阳能伪卫星VoLTE无人机设计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
2023.10.20 LED驱动
驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h"unsigned int major; unsigned int *vir_moder; unsigned int *vir_odr; unsign…...

【力扣刷题】回文链表、环形链表、合并两个有序链表
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 刷题篇 一、回文链表1.1 题目描述1.2 思路分…...
linux错误处理函数
linux c之perror、exit_perror与exit-CSDN博客 linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写-阿里云开发者社区 函数简介篇——错误处理函数:errno值、perror()、streeor()、streeor_r()_惺忪牛犊子的博客-CSDN博客...
vue2技能树(5)-条件渲染和列表渲染
目录 Vue 2 条件渲染详解v-if 和 v-else 指令项目示例 v-show 指令项目示例 v-if 和 v-show 的区别v-if 和 v-else-if 指令项目示例 Vue 2 列表渲染详解v-for 指令项目示例 计算属性和方法项目示例 v-bind:key项目示例 使用对象的v-for项目示例 v-for 的索引项目示例 …...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...