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

驱动实现LED点灯

demo.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 *vir_moder;
unsigned int *vir_odr;
unsigned int *vir_led2_moder;
unsigned int *vir_led2_odr;
unsigned int *vir_rcc;
unsigned int major;
char kbuf[128]={};
//封装操作方法
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 failed!\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;}printk("kbuf=%s\n",kbuf);//led1if(kbuf[0] == '0')//关灯{printk("kbuf[0]=%c\n",kbuf[0]);//关灯逻辑(*vir_odr) &= (~(0x1<<10));}if(kbuf[0] == '1')//开灯{//开灯逻辑(*vir_odr) |= (0x1<<10);}//led2if(kbuf[1] == '0')//关灯{//关灯逻辑(*vir_led2_odr) &= (~(0x1<<10));}if(kbuf[1] == '1')//开灯{printk("kbuf[1]=%c\n",kbuf[1]);//开灯逻辑(*vir_led2_odr) |= (0x1<<10);}//led3if(kbuf[2] == '0')//关灯{//关灯逻辑(*vir_odr) &= (~(0x1<<8));}if(kbuf[2] == '1')//开灯{printk("kbuf[2]=%c\n",kbuf[2]);//开灯逻辑(*vir_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,"mychrdev",&fops);if(major < 0){printk("字符设备驱动注册失败\n");return major;}printk("注册字符设备驱动成功major=%d\n",major);//进行寄存器地址的映射vir_moder = ioremap(PHY_LED1_3_MODER,4);if(vir_moder == NULL){printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir_odr = ioremap(PHY_LED1_3_ODR,4);if(vir_odr == NULL){printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir_led2_moder = ioremap(PHY_LED2_MODER,4);if(vir_led2_moder == NULL){printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir_led2_odr = ioremap(PHY_LED2_ODR,4);if(vir_led2_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控制器使能(*vir_moder) &= (~(0x3 << 20));//MODER[21:20]->00(*vir_moder) &= (~(0x3 << 16));//MODER[17:16]->00(*vir_moder) |= (0x1 << 20);//MODER[21:20]->01 PE10(*vir_moder) |= (0x1 << 16);//MODER[17:16]->01 PE8(*vir_led2_moder) &= (~(0x3 << 20));//MODER[21:20]->00(*vir_led2_moder) |= (0x1 << 20);//MODER[21:20]->01 PF10(*vir_odr) &= (~(0x1 << 10));(*vir_odr) &= (~(0x1 << 8));(*vir_led2_odr) &= (~(0x1 << 10));return 0;
}//出口函数,卸载内核模块时执行
static void __exit mycdev_exit(void)
{//#define __exit     __section(".exit.text")//__exit指定出口函数保存在。exit.text段中//取消映射内存iounmap(vir_moder);iounmap(vir_odr);iounmap(vir_led2_moder);iounmap(vir_led2_odr);iounmap(vir_rcc);//注销字符设备驱动unregister_chrdev(major,"mychrdev");}//用于声明入口函数
module_init(mycdev_init);
//用于声明出口函数
module_exit(mycdev_exit);
//声明当前内核模块遵循GPL协议(许可证)
MODULE_LICENSE("GPL");

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_LED2_MODER 0x50007000
#define PHY_LED2_ODR 0x50007014
#define PHY_LED1_3_MODER 0x50006000
#define PHY_LED1_3_ODR 0x50006014
#define PHY_RCC 0x50000A28#endif

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';//因为读到的字符串在最后一个是执行命令的换行符,所以要把最后一个字符替换成'\0'write(fd,buf,sizeof(buf));//将数据传递给内核(将用户空间的buf拷贝到内核空间)}close(fd);return 0;
}

Makefile

modname ?= demo
arch ?= arm
ifeq ($(arch),arm)
#保存UBUNTU内核源码路径
KERNELDIR := /home/ubuntu/FSMP1A/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61/
else
#KERBELDIR保存开发板内核源码路径
KERNELDIR := /lib/modules/$(shell uname -r)/build
endif#PWD保存当前内核模块的路径
PWD := $(shell pwd)
all:
#make modules是模块化编译命令
#make -C $(KERNLEDIR) 执行make之前先切换到KERNELDIR对应的路径
#M=$(PWD)表示进行模块化编译的路径是PWD保存的路径make -C $(KERNELDIR) M=$(PWD) modules
clean:
#编译清除make -C $(KERNELDIR) M=$(PWD) clean
#将obj-m保存的文件单独链接为内核模块
obj-m :=  $(modname).o

相关文章:

驱动实现LED点灯

demo.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 *vir_moder; unsigned …...

【Reinforcement Learning】Ubuntu中mujoco210 mujoco_py D4RL安装及错误解决

Ubuntu中mujoco210 mujoco_py D4RL安装及错误解决 本文根据一篇知乎文章链接在此进行配置&#xff0c;记录在配置过程中遇到的一些问题&#xff0c;原文作者的教程很详细&#xff0c;在此对原作者表示感谢&#xff5e; 直接进行知乎原文的第2.2 有效安装过程(避坑) 2.注意上…...

设计模式截图记录

设计模式截图记录...

代碼隨想錄算法訓練營|第三十九天|738.单调递增的数字、968.监控二叉树、第八章 贪心算法總結。刷题心得(c++)

目录 讀題 738.单调递增的数字 自己看到题目的第一想法 看完代码随想录之后的想法 968.监控二叉树 自己看到题目的第一想法 看完代码随想录之后的想法 738.单调递增的数字 - 實作 思路 Code 968.监控二叉树 - 實作 思路 Code 贪心算法 總結 贪心理论基础 貪心…...

前言:自动化框架的设计模式

1、UI自动化框架的设计模式 自动化测试框架有很多种&#xff0c;常见的自动化框架分类如下&#xff1a; 在使用上面的自动化框架时&#xff0c;通常会结合使用分层思想&#xff0c;也就是一些自动化框架设计模式&#xff0c;今天重点分享一下UI自动化框架设计使用比较多的一种…...

Web架构安全分析/http/URL/Cookie攻击

Web 架构安全分析 Web 工作机制及基本概念 传统 Web 架构 LAMP 网页 概念 网页就是我们可以通过浏览器上网看到的精美页面&#xff0c;一般都是经过浏览器渲染过的 .html 页面&#xff0c;html 语言在浏览器中渲染。其中包含了CSS、JavaScript 等前端技术。通过浏览器访问…...

.git 目录中有什么?

好吧&#xff0c;我想你们中的大多数人每天都或多或少地使用 git&#xff0c;但是您是否研究过 git 创建的 .git 文件夹中的内容&#xff1f;本文[1]我们将一起探索一下&#xff0c;了解里面到底发生了什么。 ❝ git 在基本层面上只是一堆通过文件名相互链接的文本文件。 ❞ in…...

Debian11系统简单配置

debian11系统简单配置 网卡配置 修改/etc/network/interfaces address 192.168.0.188 gateway 192.168.0.1 netmask 255.255.255.0重启网卡systemctl restart networking.service systemctl restart networking 执行apt 报错 rootdebian:~# apt update 忽略:1 cdrom://[D…...

家装、家居两不误,VR全景打造沉浸式家装体验

当下&#xff0c;用户对生活品质要求日益提升&#xff0c;越来越多的用户对多功能家装用品需求较大&#xff0c;由此造就了VR全景家装开始盛行。VR全景家装打破传统二维空间模式&#xff0c;通过视觉、交互等功能让用户更加真实、直观的体验和感受家居布置的效果。 一般来说&am…...

Ubuntu服务器 Clash Dashboard

正文发不出来 链接&#xff1a;【Linux】解决Ubuntu服务器版本无法使用Clash Dashboard的问题 这个图展示了RNA-Seq实验数据生成的流程。下面是该流程的逐步解释&#xff1a; mRNA或总RNA提取&#xff1a;首先&#xff0c;从细胞或组织样本中提取mRNA或总RNA。mRNA是经过剪切…...

创建数据库表的命令

创建数据库表的通用语法&#xff1a; ​CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,...columnN datatype constraint ); 其中&#xff0c;table_name 为要创建的表名&#xff0c;column1 到 columnN 为表的列名&#xff0c;datatype …...

ubuntu18.04 LTS卸载qtcreator-10.0.2

之前通过命令&#xff0c;通过.run文件&#xff0c;安装了Qt Creator 默认安装路径是/opt/ 卸载 在安装路径下&#xff0c;可以看到QtCreatorUninstaller文件 命令行运行该执行文件&#xff0c;会弹出卸载窗口&#xff0c;记得勾选下面的“仅卸载”...

通过字符设备驱动并编写应用程序控制三盏灯亮灭

现象 键盘按1三灯全亮 按0三灯全灭 头文件.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…...

SpringCloud链路追踪——Spring Cloud Sleuth 和 Zipkin 介绍 Windows 下使用初步

前言 在微服务中&#xff0c;随着服务越来越多&#xff0c;对调用链的分析越来越复杂。如何能够分析调用链&#xff0c;定位微服务中的调用瓶颈&#xff0c;并对其进行解决。 本篇博客介绍springCloud中用到的链路追踪的组件&#xff0c;Spring Cloud Sleuth和Zipkin&#xf…...

深入探究音视频开源库 WebRTC 中 NetEQ 音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、什么是NetEQ&#xff1f; 3、NetEQ技术详解 3.1、NetEQ概述 3.2、抖动消除技术 3.3、丢包补偿技术 3.4、NetEQ概要设计 3.5、NetEQ的命令机制 3.6、NetEQ的播放机制 3.7、MCU的控制机制 3.8、DSP的算法处理 3.9、DSP算法的模拟测试 4、NetEQ源文件…...

一篇文章教会你C++11入门知识点

C11入门 列表初始化1. {}初始化2. initializer_list 声明1. auto2. decltype3. nullptr 范围for循环STL新增容器1. array2. forward_list3. unordered_map和unordered_set 右值引用和移动语义1. 左值引用和右值引用2. 左值引用和右值引用比较3. 右值引用使用场景和意义4. 右值引…...

idea leetcode配置

idea leetcode配置 配置页面如下图所示&#xff0c;根据需要&#xff0c;填入登录用户名、密码、文件存放路径&#xff0c;注意如果要使用自定义的代码结构配置&#xff0c;要勾选图中框出来的选项。 Code FileName&#xff1a; $!velocityTool.camelCaseName(${question.tit…...

Golang通道(Channel)原理解析

引言 并发编程是现代软件开发中的一个重要主题。Golang作为一门并发友好的编程语言&#xff0c;提供了一种简单而强大的机制&#xff0c;即通道&#xff08;Channel&#xff09;&#xff0c;用于在不同的Goroutine之间进行通信和同步。通道的设计和原理是Golang并发模型的核心…...

使用树莓派搭建文件共享服务器-samba服务器

局域网内部通过文件共享来传输文件是一种非常方便的方式&#xff0c;小米摄像头也支持用文件共享smb模式将视频备份到局域网中的文件服务器上。之前我一直使用荣耀pro路由器游戏版&#xff0c;是自带USB接口支持文件共享服务的&#xff0c;接上USB移动硬盘&#xff0c;小米摄像…...

GitLab使用webhook触发Jenkins自动构建

1、jenkins安装gitlab插件 在插件管理中&#xff0c;搜索gitlab安装这个插件。 2、job中配置webhook地址和密钥 进入job设置&#xff0c;构建触发器中就可以看到gitlab的webhook配置&#xff0c;复制URL地址和随机令牌至gitlab中 勾选后&#xff0c;就可以展开设置&#xff…...

大麦助手DamaiHelper终极指南:三分钟搞定演唱会抢票的完整教程

大麦助手DamaiHelper终极指南&#xff1a;三分钟搞定演唱会抢票的完整教程 【免费下载链接】damaihelper 支持大麦网&#xff0c;淘票票、缤玩岛等多个平台&#xff0c;演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper &#x1f389; 大麦…...

基于DistilBERT的领域问答系统微调实践

1. 项目概述 在自然语言处理领域&#xff0c;基于Transformer架构的预训练语言模型已经成为问答系统的核心技术。DistilBERT作为BERT的精简版本&#xff0c;在保持90%以上性能的同时&#xff0c;模型体积缩小了40%&#xff0c;推理速度提升了60%&#xff0c;使其成为资源受限场…...

HSTracker:macOS炉石传说玩家的终极智能助手,轻松提升你的游戏水平!

HSTracker&#xff1a;macOS炉石传说玩家的终极智能助手&#xff0c;轻松提升你的游戏水平&#xff01; 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker 还在为记不住对手…...

Wren Engine:为AI智能体构建业务语义层的开源解决方案

1. 项目概述&#xff1a;为AI智能体构建的“业务大脑”如果你正在尝试让AI智能体&#xff08;比如Claude Code、Cursor里的AI助手&#xff09;去查询和分析公司的业务数据&#xff0c;大概率会遇到一个头疼的问题&#xff1a;AI能连上数据库&#xff0c;也能生成SQL&#xff0c…...

保姆级教程:手把手教你为WK2124 SPI转485驱动添加GPIO收发控制(基于Linux内核)

Linux内核驱动实战&#xff1a;WK2124 SPI转485的GPIO收发控制全解析 在工业控制、智能家居和物联网设备开发中&#xff0c;RS-485总线因其抗干扰能力强、传输距离远等优势成为首选通信方案。而将SPI接口扩展为多路485接口时&#xff0c;WK2124这类专用芯片常被工程师选用。本文…...

3分钟极速解锁:ncmppGui让你的网易云音乐真正自由

3分钟极速解锁&#xff1a;ncmppGui让你的网易云音乐真正自由 【免费下载链接】ncmppGui 一个使用C编写的极速ncm转换GUI工具 项目地址: https://gitcode.com/gh_mirrors/nc/ncmppGui 你是否曾在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在官方App中播放&#…...

除了管理用户,域服务器还能干啥?用Windows Server 2022的AD DS为FortiGate防火墙做流量认证

Windows Server 2022域服务与FortiGate防火墙的深度整合实践 在数字化转型浪潮下&#xff0c;企业网络架构正从传统的边界防御向零信任安全模型演进。作为身份管理核心的Active Directory域服务&#xff08;AD DS&#xff09;与下一代防火墙的联动&#xff0c;成为构建动态访问…...

ncmdump:网易云音乐加密文件终极解密方案

ncmdump&#xff1a;网易云音乐加密文件终极解密方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的加密音频无法在其他设备播放而烦恼吗&#xff1f;ncmdump音乐解密工具就是您的完美解决方案&#xff01;这…...

智能体开发框架实战:从模块化设计到生产部署全解析

1. 项目概述&#xff1a;一个面向开发者的智能体开发框架最近在开源社区里&#xff0c;我注意到一个名为little51/agent-dev的项目开始受到一些开发者的关注。乍一看这个名字&#xff0c;可能会让人联想到一些小型硬件或者51单片机相关的开发工具&#xff0c;但实际深入探究后&…...

ChatArena多智能体对话框架:从核心原理到实战应用

1. 项目概述&#xff1a;从零理解ChatArena&#xff0c;一个多智能体对话竞技场如果你对AI智能体&#xff08;Agent&#xff09;的开发、评测或者多智能体协作与竞争感兴趣&#xff0c;那么Farama Foundation旗下的ChatArena项目&#xff0c;绝对是一个值得你投入时间研究的“宝…...