当前位置: 首页 > news >正文

驱动开发day1

头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_LED1_MODER 0X50006000
#define PHY_LED1_ODR   0X50006014#define PHY_LED2_MODER 0x50007000
#define PHY_LED2_ODR   0x50007014#define PHY_LED3_MODER 0x50006000
#define PHY_LED3_ODR   0x50006014#define PHY_RCC        0X50000A28#endif

demo1.c

#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]={};
//定义指针指向映射后的虚拟内存
unsigned int *vir_moder1;
unsigned int *vir_odr1;
unsigned int *vir_moder2;
unsigned int *vir_odr2;
unsigned int *vir_moder3;
unsigned int *vir_odr3;
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)
{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 filed\n");return -EIO;  }if (kbuf[1] == '0'){// 关灯逻辑if (kbuf[0] == '1')(*vir_odr1) &= (~(0X1<<10));else if (kbuf[0] == '2')(*vir_odr2) &= (~(0X1<<10));else if (kbuf[0] == '3')(*vir_odr3) &= (~(0X1<<8));}else if (kbuf[1] == '1'){// 开灯逻辑if (kbuf[0] == '1')(*vir_odr1) |= (0X1<<10);else if (kbuf[0] == '2')(*vir_odr2) |= (0X1<<10);else if (kbuf[0] == '3')(*vir_odr3) |= (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, "mychrdev", &fops);if(major < 0){printk("字符设备驱动注册失败\n");}printk("注册字符设备驱动成功major=%d\n",major);// 进行寄存器的地址映射vir_moder1 = ioremap(PHY_LED1_MODER, 4);if (vir_moder1 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}vir_odr1 = ioremap(PHY_LED1_ODR, 4);if (vir_odr1 == 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");//LED1寄存器初始化(*vir_rcc) |= (0X3<<4);//GPIOE控制器时钟使能(*vir_moder1) &= (~(0X3<<20));//MODER[21:20]->00(*vir_moder1) |= (0X1<<20);//MODER[21:20]->01(*vir_odr1) &= (~(0X1<<10));//默认关灯vir_moder2 = ioremap(PHY_LED2_MODER, 4);if (vir_moder2 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}vir_odr2 = ioremap(PHY_LED2_ODR, 4);if (vir_odr2 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}//LED2(*vir_moder2) &= (~(0X3<<20));//MODER[21:20]->00(*vir_moder2) |= (0X1<<20);//MODER[21:20]->01(*vir_odr2) &= (~(0X1<<10));//默认关灯vir_moder3 = ioremap(PHY_LED3_MODER, 4);if (vir_moder3 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}vir_odr3 = ioremap(PHY_LED3_ODR, 4);if (vir_odr3 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}//LED3(*vir_moder3) &= (~(0X3<<16));//MODER[21:20]->00(*vir_moder3) |= (0X1<<16);//MODER[21:20]->01(*vir_odr3) &= (~(0X1<<8));//默认关灯return 0;
}//出口函数,卸载内核模块时执行
static void __exit mycdev_exit(void)
{//取消内存映射iounmap(vir_moder1);iounmap(vir_odr1);iounmap(vir_moder2);iounmap(vir_odr2);iounmap(vir_moder3);iounmap(vir_odr3);iounmap(vir_rcc);//注销字符设备驱动unregister_chrdev(major,"mychrdev");
}//用于声明入口函数
module_init(mycdev_init);
//用于声明出口函数
module_exit(mycdev_exit);
//声明当前内核模块遵循GPL协议
MODULE_LICENSE("GPL");

text.c

#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';//调用writewrite(fd, buf, sizeof(buf));//memset(buf, 0, sizeof(buf));//read(fd, buf, sizeof(buf));//printf("buf:%s\n",buf);}//调用closeclose(fd);return 0;
}

相关文章:

驱动开发day1

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014#define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014#define PHY_LED3_MODER 0x50006000 #define PHY_LED3_ODR 0x50006014#define P…...

C++ linux vscode编译

.cpp .h文件关系与编译命令 单一cpp文件编译多个.cpp文件编译.h头文件和.cpp源文件在同一目录下编译.h头文件和.cpp源文件在不同一目录下编译 单一cpp文件编译 //test.cpp为测试源文件&#xff0c; a.out为输出可执行文件 g test.cpp -o a.out多个.cpp文件编译 目录1结构如下…...

卷积神经网络CNN学习笔记

目录 1.全连接层存在的问题2.卷积运算3.填充(padding)3.1填充(padding)的意义 4.步幅(stride)5.三维数据的卷积运算6.结合方块思考7.批处理8.conv2d代码参考文章 1.全连接层存在的问题 在全连接层中&#xff0c;相邻层的神经元全部连接在一起&#xff0c;输出的数量可以任意决…...

Java的Socket Timeout和tcp的存活探测包是不是一个东西

背景 你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时&#xff0c;他怎么做到在timeout时间到了之后连接就报错的&#xff1f;有没有产生过误解&#xff0c;这个参数就是设置keepalive探测包的检测间隔&#xff1f; 问题真相 其实Socket.setSoTimeou…...

基于跳蛛优化的BP神经网络(分类应用) - 附代码

基于跳蛛优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于跳蛛优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.跳蛛优化BP神经网络3.1 BP神经网络参数设置3.2 跳蛛算法应用 4.测试结果&#xff1a;5.M…...

基于鹈鹕优化的BP神经网络(分类应用) - 附代码

基于鹈鹕优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于鹈鹕优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹈鹕优化BP神经网络3.1 BP神经网络参数设置3.2 鹈鹕算法应用 4.测试结果&#xff1a;5.M…...

『ARM』和『x86』处理器架构解析指南

前言 如果问大家是否知道 CPU&#xff0c;我相信不会得到否定的答案&#xff0c;但是如果继续问大家是否了解 ARM 和 X86 架构&#xff0c;他们的区别又是什么&#xff0c;相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…...

Android 13.0 系统设置 app详情页默认关闭流量数据的开关

1.概述 在13.0的系统产品开发中,移动流量消耗也是关于产品优化的一个方面,由于产品需求需要对app详情页的流量进行管控默认关闭流量开关,不让流量无故流失,所以需要从流量开关分析问题流量打开流程,然后关闭 2.系统设置 app详情页默认关闭流量数据的开关的核心类 package…...

054协同过滤算法的电影推荐系统

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…...

分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

从零开始的C++(十一)

vector的模拟实现&#xff1a; 1.构造函数&#xff1a; vector(){}vector(int n, const T& value T()){ reserve(n);for (int i 0; i < n; i){push_back(value);}}template<class InputIterator>vector(InputIterator first, InputIterator last){ auto it …...

驱动开发day2

通过物理内存映射为虚拟内存 实现三盏LED灯亮灯灭 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0x50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…...

【CANoe】文件处理_hex文件读取解析

hex文件里面只有00&#xff0c;01&#xff0c;04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析&#xff0c;可阅读&#xff1a;HEX文件格式详解 首先创建一个Block的结构体&#xff0c;根据经验我们知道&#xff0c;一个数据…...

人脸识别顶会论文及源码合集,含2023最新

今天和大家聊聊人脸识别。 人脸识别的技术经过不断发展已经相当成熟&#xff0c;在门禁、监控、手机解锁、移动支付等实际场景都能看到。我们比较熟悉的识别方式是基于可见光图像的人脸识别&#xff0c;这种方式有个非常明显的缺点&#xff1a;光线限制。 在近两年的人脸识别…...

介绍drawio和图表使用场景

图表介绍 drawio是一个基于Web技术的草图、简图和图表的解决方案。 drawio支持在线编辑器&#xff0c;app.diagram.net.并支持不同的操作系统的桌面版离线安装版本。如&#xff1a;windows, linux, macOS。 对于个人或者团队&#xff0c;把图表绘制的安全放到第一位&#xff…...

leetcode-1438: 绝对差不超过限制的最长连续子数组

给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如果不存在满足条件的子数组&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#x…...

【数据结构初阶】九、排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】八、非线性表里的二叉树&#xff08;二叉树的实现 -- C语言链式结构&#xff09;-CSDN博客 排序 排序的概念 所谓排序&#xff0c;就是使一串记录&#xff0c;按照…...

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…...

Linux1024一篇通俗易懂的liunx命令操作总结(第十课)

Linux1024一篇通俗易懂的liunx命令操作总结(第十课) 一 liunx 介绍 Linux是一种免费开源的操作系统&#xff0c;它的设计基于Unix。它最早是由芬兰的一位大学生Linus Torvalds在1991年开始编写的&#xff0c;取名为Linux。Linux具有高度的灵活性和可定制性&#xff0c;可以在…...

nuxt使用i18n进行中英文切换

中文效果图&#xff1a; 英文效果图&#xff1a; 版本&#xff1a; 安装&#xff1a; npm install --save nuxtjs/i18n 新建en.js与zh.js两个文件进行切换显示 en.js内容 import globals from ./../js/global_valexport default {/******* 公共内容开始* *****/seeMore: &quo…...

Sigil插件系统深度解析:从架构设计到高级定制实战指南

Sigil插件系统深度解析&#xff1a;从架构设计到高级定制实战指南 【免费下载链接】Sigil Sigil is a multi-platform EPUB ebook editor 项目地址: https://gitcode.com/gh_mirrors/si/Sigil Sigil作为一款跨平台EPUB电子书编辑器&#xff0c;其插件系统通过Python环境…...

别再说LIN过时了!手把手教你用AUTOSAR MCAL配置LIN驱动(基于EB Tresos实战)

别再说LIN过时了&#xff01;手把手教你用AUTOSAR MCAL配置LIN驱动&#xff08;基于EB Tresos实战&#xff09; 在汽车电子领域&#xff0c;每当讨论车载网络协议时&#xff0c;CAN、FlexRay甚至以太网总是占据话题中心&#xff0c;而LIN总线却常被贴上"过时"或"…...

LiuJuan20260223Zimage与MathType公式识别:科研论文辅助工具

LiuJuan20260223Zimage与MathType公式识别&#xff1a;科研论文辅助工具 每次看到论文里那些复杂的数学公式&#xff0c;你是不是也感到头疼&#xff1f;想把它们从PDF或者图片里抠出来&#xff0c;变成可编辑的LaTeX或者Word公式&#xff0c;简直是一项体力活。手动输入不仅慢…...

KMS_VL_ALL_AIO实战指南:智能激活Windows与Office的完整解决方案

KMS_VL_ALL_AIO实战指南&#xff1a;智能激活Windows与Office的完整解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题烦恼吗&#xff1f;每次系统重装或…...

别再死记硬背漏洞了!用bWAPP靶场在Windows 10上实战SQL注入与XSS(保姆级环境搭建)

从零构建实战型Web安全实验室&#xff1a;bWAPP靶场深度攻防指南 当你在网络安全书籍上看到"SQL注入"或"XSS"这些术语时&#xff0c;是否感觉它们就像天书般难以理解&#xff1f;纸上谈兵的安全知识往往让人昏昏欲睡&#xff0c;而真正的技能提升来自于亲手…...

ECharts自定义系列(custom)实战:手把手教你为多系列柱状图添加渐变/图片背景

ECharts自定义系列深度实战&#xff1a;打造多系列柱状图的视觉盛宴 当标准图表配置无法满足你的设计需求时&#xff0c;ECharts的custom系列就像一把瑞士军刀&#xff0c;让你可以自由雕刻每一个像素。本文将带你从零开始&#xff0c;掌握如何为多系列柱状图添加渐变、图案甚至…...

Asian Beauty Z-Image Turbo 5分钟快速部署:本地东方美学AI绘画工具一键启动

Asian Beauty Z-Image Turbo 5分钟快速部署&#xff1a;本地东方美学AI绘画工具一键启动 想象一下&#xff0c;你正在策划一个东方美学主题的艺术展&#xff0c;需要大量符合传统审美的视觉素材&#xff1b;或者你是一位独立创作者&#xff0c;希望为自己的小说生成具有东方韵…...

基于深度学习的UNet卫星图像植被分割识别 植被分割识别

VM-UNet 卫星图像植被分割 &#x1f331; 本仓库使用 VM-UNet&#xff08;基于 Mamba 架构的变体&#xff0c;原用于医学图像分割&#xff09;对卫星图像进行分割。本项目将其适配地理空间应用&#xff0c;优化多通道卫星影像的处理。更多技术细节可参模型性能对比&#xff08;…...

什么是DSP? ESP32 有DSP吗?

DSP 是 Digital Signal Processor 的缩写,中文全称为 “数字信号处理器”。 简单来说,DSP 是一种专门为了极快地处理数学算法而设计的微处理器。如果说 CPU(中央处理器)是一个什么都能干的“全才经理”,那么 DSP 就是一个“数学天才”或“计算专家”。 以下是关于 DSP 的…...

保姆级教程:在Windows上用VS2017编译NCNN,并部署YOLOv5模型(含Vulkan开关避坑)

Windows平台下VS2017编译NCNN与YOLOv5模型部署全流程指南 对于需要在Windows环境下进行深度学习模型部署的开发者而言&#xff0c;NCNN作为一个轻量级的高性能神经网络前向计算框架&#xff0c;因其跨平台特性和对ARM架构的深度优化而备受青睐。本文将详细介绍如何在Windows 10…...