2023/10/30-LED灯驱动开发
k1.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "head.h"
char kbuf[128] = {};
unsigned int major;
//定义三个指针指向映射后的虚拟内存
unsigned int *vir_rcc;
unsigned int *vir_moder_led1;
unsigned int *vir_odr_led1;
unsigned int *vir_moder_led2;
unsigned int *vir_odr_led2;
unsigned int *vir_moder_led3;
unsigned int *vir_odr_led3;
// 封装操作方法
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=0;ret = copy_to_user(ubuf,kbuf,size);if(ret = 0){printk("copy_to_user 内核->用户 filed!\n");return -EIO;}//printk("copy_to_user 内核->用户 success!,ubuf=%s\n",ubuf);printk("copy_to_user 内核->用户 success!\n");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=0;ret = copy_from_user(kbuf,ubuf,size);if(ret = 0){printk("copy_from_user 用户->内核 filed!\n");return -EIO;}//printk("copy_from_user 用户->内核 success!,ubuf=%s\n",ubuf);printk("copy_from_user 用户->内核 success!\n");if(kbuf[0] == '0') //关灯{(*vir_odr_led1) &= (~(0x1 << 10));(*vir_odr_led2) &= (~(0x1 << 10));(*vir_odr_led3) &= (~(0x1 << 8));}else if(kbuf[0] == '1') //开灯{(*vir_odr_led1) |= (0x1 << 10);(*vir_odr_led2) |= (0x1 << 10);(*vir_odr_led3) |= (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_rcc = ioremap(PHY_RCC,4);if(vir_rcc == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_moder_led1 = ioremap(PHY_LED1_MODER,4);if(vir_moder_led1 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_odr_led1 = ioremap(PHY_LED1_ODR,4);if(vir_odr_led1 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_moder_led2 = ioremap(PHY_LED2_MODER,4);if(vir_moder_led2 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_odr_led2 = ioremap(PHY_LED2_ODR,4);if(vir_odr_led2 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_moder_led3 = ioremap(PHY_LED3_MODER,4);if(vir_moder_led3 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}vir_odr_led3 = ioremap(PHY_LED3_ODR,4);if(vir_odr_led3 == NULL){printk("物理内存映射filed! %d\n",__LINE__);return -EFAULT;}printk("物理内存映射成功!\n");//LED1寄存器初始化(*vir_rcc) |= (0x3 << 4); //GPIOE控制器时钟使能(*vir_moder_led1) &= (~(0x3 << 20)); //MODER[21:20] => 00(*vir_moder_led1) |= (0x1 << 20); //MODER[21:20] => 01(*vir_odr_led1) &= (~(0x1 << 10)); //默认为关灯(*vir_moder_led2) &= (~(0x3 << 20)); //MODER[21:20] => 00(*vir_moder_led2) |= (0x1 << 20); //MODER[21:20] => 01(*vir_odr_led2) &= (~(0x1 << 10)); //默认为关灯(*vir_moder_led3) &= (~(0x3 << 16)); //MODER[17:16] => 00(*vir_moder_led3) |= (0x1 << 16); //MODER[17:16] => 01(*vir_odr_led3) &= (~(0x1 << 8)); //默认为关灯return 0;
}
static void __exit mycdev_exit(void)
{//取消内存映射iounmap(vir_rcc);iounmap(vir_moder_led1);iounmap(vir_odr_led1);iounmap(vir_moder_led2);iounmap(vir_odr_led2);iounmap(vir_moder_led3);iounmap(vir_odr_led3);//注销字符设备驱动unregister_chrdev(major,"mychrdev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
test.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,const char * argv[])
{char buf[128] = {0};int fd = open("/dev/mychrdev",O_RDWR);if(fd < 0){printf("文件/dev/mychrdev打开失败\n");return -1;}printf("文件/dev/mychrdev打开成功\n");while(1){printf("输入要进行的操作=> 0(关灯) <-> 1(开灯) : ");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = '\0';//User -> 内核write(fd,buf,sizeof(buf));}/*//User -> 内核write(fd,buf,sizeof(buf));//内核 -> Userread(fd,buf,sizeof(buf));*/close(fd);return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_RCC 0x50000A28#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#endif



相关文章:
2023/10/30-LED灯驱动开发
k1.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h" char kbuf[128] {}; unsigned int major; //定义三个指针指向映射后的虚拟内…...
华为OD 报文解压缩(100分)【java】B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...
二、vue基础语法
一、模板语法 1、文本渲染 使用双花括号语法插入文本 <template><div><h3>msg: {{ message }}</h3></div> </template><script> export default {data() {return {message: "输出信息"}} } </script><style s…...
Java —— 程序逻辑控制
目录 1. 顺序结构 2. 分支结构 2.1 if 语句 2.1.1 语法格式1 2.1.2 语法格式2 2.1.3 语法格式3 2.2 switch 语句 3. 循环结构 3.1 while循环 3.2 break与continue 3.3 for循环 4. 输入输出 4.1 输出到控制台 格式化字符串 4.2 从键盘输入 5. 练习 和C语言类似地, Java的程序逻辑…...
I - Bob vs ATM(博弈论)
传送门:nefu_10-18 - Virtual Judge (vjudge.net) 思路: nim游戏的变形。 (())相当于在一堆n个石子中取任意个,sg(n)n; ((()))(())(),相当于可以在3堆石子分别为3&am…...
请解释一下 CSS3 的 Flexbox(弹性盒布局模型), 以及适用场景?
解析: CSS3的Flexbox(弹性盒布局模型)是一种强大的布局技术,用于创建灵活和响应式的布局。它解决了传统CSS布局模型在垂直和水平居中、等高列、自适应宽度等方面的一些挑战,使开发人员能够更轻松地构建各种复杂的布局。在下面的详…...
MYSQL 根据唯一索引键更新死锁问题
mysql 死锁问题及死锁权重分析 问题发生过程:1、生产发现死锁一次 语句为sql1:UPDATE table set data ‘123’ where business_no ABC; 该行数据的id1, business_no ABC tablbe 字段 id:主键 business_no为唯一索引字段,其…...
Appium+python+unittest搭建UI自动化框架!
阅读本小节,需要读者具备如下前提条件: 1. 掌握一种编程语言基础,如java、python等。 2. 掌握一种单元测试框架,如java语言的testng框架、python的unittest框架。 3. 掌握目前主流的UI测试框架,移动端APP测试框架Appiu…...
使用kubekey部署k8s集群和kubesphere、在已有k8s集群上部署kubesphere
目录 前言什么是kubekey(简称kk)单节点上安装 kubesphere(all in one 快速熟悉kubesphere)部署 kubernetes和和kubesphere 多节点安装部署 kubernetes和和kubesphere 离线安装k8s v1.22.17和kubesphere v3.3.2联网-在已有k8s集群上…...
React useMemo useCallback useEffect 的区别(保姆级教程)
因个人工作原因,在2023年学起了React TS 这个 “前端大佬” “高阶玩家” 标配的技术栈,一套学习下来个人总结就是:React真特么难用!传染病式的渲染逻辑是真让人难受!维护之前的代码就是深渊!难怪React项目…...
网络安全中的人工智能:优点、缺点、机遇和危险
2022 年秋天,人工智能在商业领域爆发,引起了轰动,不久之后,似乎每个人都发现了 ChatGPT 和 DALL-E 等生成式 AI 系统的新的创新用途。世界各地的企业开始呼吁将其集成到他们的产品中,并寻找使用它来提高组织效率的方法…...
36 机器学习(四):异常值检测|线性回归|逻辑回归|聚类算法|集成学习
文章目录 异常值检测箱线图z-score 保存模型 与 使用模型回归的性能评估线性回归正规方程的线性回归梯度下降的线性回归原理介绍L1 和 L2 正则化的介绍api介绍------LinearRegressionapi介绍------SGDRegressor 岭回归 和 Lasso 回归 逻辑回归基本使用原理介绍正向原理介绍损失…...
maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories
前言 略 说明 新设备上安装了mvn 3.8.5,编译新项目出错: [ERROR] Non-resolvable parent POM for com.admin.project:1.0: Could not transfer artifact com.extend.parent:pom:1.6.9 from/to maven-default-http-blocker (http://0.0.0.0/): Bl…...
盒式交换机堆叠配置
目录 1.配置环形拓扑堆叠 2.设备组建堆叠 3.设备组件堆叠 堆叠 istack,是指将多台支持堆叠特性的交换机设备组合在一起,从逻辑上组合成一台交换设备。如图所示,SwitchA与 SwitchB 通过堆叠线缆连接后组成堆叠 istack,对于上游和…...
openEuler 服务器安装 JumpServer (all-in-one 模式)
openEuler 服务器安装 JumpServer JumpServer 简介什么是 JumpServer ?JumpServer 的各种类型资产JumpServer 产品特色或优势JumpServer 符合 4A 规范 JumpServer 系统架构应用架构组件说明 JumpServer 安装部署环境要求网络端口网络端口列表防火墙常用命令 在线脚本…...
vue3后台管理系统之路由守卫
下载进度条 pnpm install nprogress //路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问) import router from /router import setting from ./setting // eslint-disable-next-line typescript-eslint/ban-ts-comment /…...
微信小程序连接数据库与WXS的使用
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯Ἲ…...
django 项目基本配置
项目工程初始化 安装框架 pip install django使用命令创建项目 django-admin startproject 项目名称效果 根目录创建apps用以放置所有包 切换至apps目录创建子应用 python ../manage.py startapp usermuxi_shop_back/settings.py # Build paths inside the project lik…...
JAVA基础(JAVA SE)学习笔记(六)面向对象编程(基础)
前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段:Java面向对象编程 6.面向对象编程(基础) 7.面向对象编程&…...
吉利高端品牌领克汽车携手体验家,重塑智能创新的汽车服务体验
浙江吉利控股集团(以下简称“吉利集团”)始建于1986年,1997年进入汽车行业,一直专注实业,专注技术创新和人才培养,坚定不移地推动企业转型升级和可持续发展。现资产总值超5100亿元,员工总数超过…...
华为VRRP配置避坑指南:我在eNSP里踩过的那些‘雷’,你最好别再踩了
华为VRRP配置避坑指南:我在eNSP里踩过的那些‘雷’,你最好别再踩了 第一次在eNSP里配置VRRP时,我盯着屏幕上"Master"状态的显示,以为大功告成。直到测试时发现PC死活ping不通虚拟网关,才意识到自己掉进了第一…...
如何打破Minecraft数据编辑的次元壁?NBTExplorer如何成为游戏数据解构的瑞士军刀?
如何打破Minecraft数据编辑的次元壁?NBTExplorer如何成为游戏数据解构的瑞士军刀? 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾…...
TestDisk PhotoRec:专业级数据恢复工具如何拯救你的丢失文件与分区
TestDisk & PhotoRec:专业级数据恢复工具如何拯救你的丢失文件与分区 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 在数字时代,数据恢复工具TestDisk和PhotoRec已成为技术爱好者…...
激光熔覆熔池匙孔模拟仿真:探究温度场与流场的高精度模型及UDF技术解析
激光熔覆熔池匙孔温度场与流场模拟仿真。 现成模型,UDF包括高斯旋转体热源、VOF梯度计算、反冲压力、表面张力等。文章:激光熔覆是一种利用高能量密度的激光束将材料熔化并与基体材料结合形成强固连接的先进制造技术。在这个过程中,熔池匙孔的…...
别再乱分析时序了!用set_case_analysis给Design Compiler/PrimeTime做个‘场景假设’
数字IC设计中的时序分析利器:set_case_analysis实战指南 在数字IC设计流程中,时序分析是确保芯片功能正确性的关键环节。然而,当设计复杂度上升,特别是涉及多时钟域、多工作模式时,传统的时序分析往往会陷入"数据…...
慧科讯业:2026年北京车展前瞻报告
行业背景政策:汽车政策从补贴转向内需 技术双轮驱动,L3 自动驾驶准入标准 2026 年落地,新能源车购置税减半至 2027 年。消费:购车群体年轻化,26-35 岁占比 42.3%,智能化成核心标配,决策更理性。…...
CUDA 13.3新特性实测:AI训练吞吐提升47%的5个算子重写法则(含GEMM/Softmax/FlashAttention手写PTX代码)
更多请点击: https://intelliparadigm.com 第一章:CUDA 13.3新特性全景解析与AI训练性能跃迁机制 CUDA 13.3 于2024年中正式发布,标志着NVIDIA在GPU加速计算生态中对大模型训练、低精度推理及异构内存管理的深度重构。本次更新并非简单功能叠…...
避开这些坑!蓝桥杯单片机操作24C02存储器的5个常见错误与调试技巧
避开这些坑!蓝桥杯单片机操作24C02存储器的5个常见错误与调试技巧 在蓝桥杯单片机竞赛中,24C02存储器的使用是一个常见但容易出错的环节。许多参赛者在实现按键次数存储功能时,往往会遇到数据读取异常、写入失败或显示乱码等问题。本文将针对…...
UniApp项目里用微信物流插件,我踩过的三个坑(附完整manifest.json配置)
UniApp集成微信物流插件实战:避坑指南与最佳配置方案 第一次在UniApp项目中集成微信物流插件时,那种"明明按文档操作却报错"的挫败感至今记忆犹新。作为经历过完整踩坑过程的开发者,我将分享三个最易被忽视的关键环节——从权限申请…...
从Civitai与HuggingFace看AIGC模型生态:技术普惠、内容边界与本土化挑战
1. AIGC模型生态的双子星:Civitai与HuggingFace的技术基因 第一次打开HuggingFace的网站时,我差点以为误入了某个极客论坛——满屏的英文术语、密密麻麻的模型参数、几乎没有一张示例图片。但当我下载第一个Stable Diffusion模型时,2GB的文件…...
