驱动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");

实现效果

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

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

相关文章

Linux性能优化--补充

14.1. 性能工具的位置 本书描述的性能工具来源于Internet上许多不同的位置。幸运的是&#xff0c;大多数主要发行版都把它们放在一起&#xff0c;包含在了其发行版的当前版本中。表A-1描述了全部工具&#xff0c;提供了指向其原始源位置的地址&#xff0c;并注明它们是否包含在…

YOLOv7改进实战 | 更换轻量化主干网络Backbone(一)之Ghostnet

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

官方认证:研发效能(DevOps)工程师职业技术认证

培养端到端的研发效能人才 为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共…

Apache Doris (四十五): Doris数据更新与删除 - Sequence 列

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 基本原理

WGCNA分析教程五 | [更新版]

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 往期WGCNA分析教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 WGCNA分析 | 全流程分析代码 | 代码四 关于WGCNA分析教程日常更新 学习无处不在&#xff0c;我们的教程会在…

[环境配置]anaconda3的base环境与python版本对应关系表

anaconda3版本 base环境对应python版本 Anaconda3-2018.12-Windows-x86_64.exe 3.7 Anaconda3-2019.03-Windows-x86_64.exe 3.7 Anaconda3-2019.07-Windows-x86_64.exe 3.7 Anaconda3-2019.10-Windows-x86_64.exe 3.7 Anaconda3-2020.02-Windows-x86_64.exe 3.7 An…

Alpine.js 精简重

建议有 js 基础&#xff0c;先阅读官网文档&#xff0c;如果您会 vue 类似框架&#xff0c;上手会更快 https://alpinejs.dev js 代码中可以使用 Alpine.sore 定义全局数据 Alpine.store(tabs, {current: first,items: [first, second, third], }) x-text 可以运算任何 js 表…

ubuntu16.04下标定Astra相机

ubuntu16.04下标定Astra相机 1.安装相机驱动 rosrun camera_calibration cameracalibrator.py --size 7x5 --square 0.018 image:/camera/rgb/image_raw camera:/camera/rgb 2.下载camere_calibration 3.进行标定 打开终端&#xff0c;输入 roslaunch astra_launch astrap…

从入门到进阶 之 ElasticSearch 配置优化篇

&#x1f339; 以上分享从入门到进阶 之 ElasticSearch 配置优化篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏…

浏览器不能访问阿里云ECS

一、浏览器不能访问端口 在阿里云ECS中构建了工程&#xff0c;nigix或者tomcat或者其他&#xff0c;然后在本地浏览器访问ip端口的时候&#xff0c;连接超时&#xff0c;解决办法&#xff1a; 进入阿里云ECS服务 -> 查看公网ip (外部连接需要使用公网) -> 进入ECS实例的…

攻防世界web篇-cookie

看到cookie立马就会想到F12键看cookie的一些信息 我这个实在存储里面看的&#xff0c;是以.php点缀结尾&#xff0c;可以试一下在链接中加上.php 得到的结果是这样 这里&#xff0c;我就只能上csdn搜索一下了&#xff0c;看到别人写的是在get请求中可以看到flag值

Mysql 约束,基本查询,复合查询与函数

文章目录 约束空属性约束默认值约束zerofill主键约束自增长约束唯一键约束外键约束 查询select的执行顺序单表查询排序 updatedelete整张表的拷贝复合语句group by分组查询 函数日期函数字符串函数数学函数其他函数 复合查询合并查询union 约束 空属性约束 两个值&#xff1a…

Windows安装Jenkins

JDK 11 以上 https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20%2B8/OpenJDK11U-jdk_x64_windows_hotspot_11.0.20_8.msi https://www.jenkins.io/download/ 下载windows安装版本 授权用户administrator logon as services windows(server)安装…

操作系统【OS】中断和异常

异常&#xff08;内中断&#xff09; 中断&#xff08;外中断&#xff09; 基本概念 由CPU执行指令内部产生的事件内中断都是不可屏蔽中断&#xff0c;一旦出现&#xff0c;就要立即处理。 由来自CPU外部的设备发出的中断请求&#xff08;常用于输入输出&#xff09;典型的由…

element-ui 以CDN 方式引入原生js开发的几个别坑 (+vue)

element-ui 以CDN 方式引入原生js开发的几个坑 最近两个月太忙了 忙的没空写文章 两个月赶出来了几个的项目 一个是雪佛兰裸眼3D的一个商品屏幕展示项目 一个是广汽云渲染的一个云看车项目 一个是奥迪中国充电桩的网页开发项目&#xff0c; 奥迪中国做个饭也是目前正在做的 不…

机器人SLAM与自主导航

机器人技术的迅猛发展&#xff0c;促使机器人逐渐走进了人们的生活&#xff0c;服务型室内移动机器人更是获得了广泛的关注。但室内机器人的普及还存在许多亟待解决的问题&#xff0c;定位与导航就是其中的关键问题之一。在这类问题的研究中&#xff0c;需要把握三个重点&#…

Python 打包whl文件Setup参数

setup 函数常用的参数如下 参数说明name包名称version包版本author程序的作者author_email程序的作者的邮箱地址maintainer维护者maintainer_email维护者的邮箱地址url程序的官网地址license程序的授权信息description程序的简单描述long_description程序的详细描述platforms程…

专题:链表常考题目汇总

文章目录 反转类型&#xff1a;206.反转链表完整版二刷记录 25. K个一组反转链表1 &#xff1a;子链表左闭右闭反转版本2 &#xff1a; 子链表左闭右开反转版本&#xff08;推荐&#xff09;⭐反转链表左闭右闭和左闭右开 合并类型&#xff1a;21.合并两个有序链表1: 递归法2: …

10月19日,每日信息差

今天是2023年10月19日&#xff0c;以下是为您准备的17条信息差 第一、中国海洋石油遭南向资金净卖出2.38亿港元 第二、阅文集团侯晓楠&#xff1a;网文已经成为中国文化的一张全球名片。据了解&#xff0c;2022年以来&#xff0c;阅文已经在海外上线了自制的300多部动漫影视作…

作为决策者,谁能拒绝这样一张数据可视化报表

数据分析是决策的一大助力&#xff0c;因此作为企业的管理决策者都会希望获得一份直观易懂、支持灵活自助分析的数据可视化报表&#xff0c;比如说由奥威BI数据可视化软件制作的这张BI报表。 名称&#xff1a;零售业数据分析驾驶舱 来源&#xff1a;奥威BI零售数据分析方案 …