底层驱动day2作业

控制三盏灯亮灭

代码:

//head.h#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_RCC 0x50000A28
#define PHY_GPIOE_MODER 0x50006000
#define PHY_GPIOF_MODER 0x50007000
#define PHY_GPIOE_ODR 0x50006014
#define PHY_GPIOF_ODR 0x50007014#endif
//demo.c#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include"include/head.h"
char kbuf[128] = {0};
int a = 10;
unsigned int major;unsigned int *vir_led1_odr;
unsigned int *vir_led1_moder;
unsigned int *vir_rcc;
unsigned int *vir_led2_odr;
unsigned int *vir_led2_moder;int mycdev_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);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 = copy_from_user(kbuf,ubuf,size);if(ret){printk("failed\n");return -EIO;}switch(kbuf[0])     //kbuf的第0位为led灯,第2位为led灯的状态{case '1':if(kbuf[2] == '0'){//关灯(*vir_led1_odr) &= (~(0x1 << 10));}else if(kbuf[2] == '1'){//开灯(*vir_led1_odr) |= (0x1 << 10);}break;case '2':if(kbuf[2] == '0'){//关灯(*vir_led2_odr) &= (~(0x1 << 10));}else if(kbuf[2] == '1'){//开灯(*vir_led2_odr) |= (0x1 << 10);}break;case '3':if(kbuf[2] == '0'){//关灯(*vir_led1_odr) &= (~(0x1 << 8));}else if(kbuf[2] == '1'){//开灯(*vir_led1_odr) |= (0x1 << 8);}break;default:break;}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 = copy_to_user(ubuf,kbuf,size);if(ret){printk("failed\n");return -EIO;}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,
};module_param(a,int,0664);
static int __init mycdev_init(void)
{printk("a = %d\n",a);major = register_chrdev(0,"mychrdev",&fops);if(major < 0){printk("字符设备驱动注册失败\n");return major;}printk("字符设备驱动注册成功 major = %d\n",major);vir_led1_moder = ioremap(PHY_GPIOE_MODER,4); if(NULL == vir_led1_moder){printk("物理内存地址映射失败\n");return -EFAULT;} vir_led1_odr = ioremap(PHY_GPIOE_ODR,4);if(NULL == vir_led1_odr){printk("物理内存地址映射失败\n");return -EFAULT;} vir_rcc = ioremap(PHY_RCC,4);if(NULL == vir_rcc){printk("物理内存地址映射失败\n");return -EFAULT;}vir_led2_moder = ioremap(PHY_GPIOF_MODER,4); if(NULL == vir_led2_moder){printk("物理内存地址映射失败\n");return -EFAULT;} vir_led2_odr = ioremap(PHY_GPIOF_ODR,4);if(NULL == vir_led2_odr){printk("物理内存地址映射失败\n");return -EFAULT;} printk("寄存器内存映射成功\n");(*vir_rcc) |= (0x1 << 4);(*vir_rcc) |= (0x1 << 5);(*vir_led1_moder) &= (~(0x3 << 20));    //led1_moder(*vir_led1_moder) |= (0x1 << 20);(*vir_led1_moder) &= (~(0x3 << 16));    //led3_moder(*vir_led1_moder) |= (0x1 << 16);(*vir_led1_odr) &= (~(0x1 << 10));      //led1_odr(*vir_led1_odr) &= (~(0x1 << 8));      //led3_odr(*vir_led2_moder) &= (~(0x3 << 20));    //led2_moder(*vir_led2_moder) |= (0x1 << 20);(*vir_led2_odr) &= (~(0X1 << 10));      //led2_odrreturn 0;
}static void __exit mycdev_exit(void)
{unregister_chrdev(major,"mychrdev");}module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");
//test.c
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<stdio.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){fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = 0;write(fd,buf,sizeof(buf));}//read(fd,buf,sizeof(buf));memset(buf,0,sizeof(buf));read(fd,buf,sizeof(buf));printf("buf:%s\n",buf);close(fd);return 0;
}

 

实验现象:

 

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

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

相关文章

vue-pdf多页预览异常,Rendering cancelled, page 1 Error at BaseExceptionClosure xxx

项目开发使用vue-pdf,单页情况预览正常&#xff0c;多页vue-pdf预览异常&#xff0c;第一次预览时&#xff0c;会先弹出异常模态窗口&#xff0c;关闭模态窗口&#xff0c;pdf又是正常显示&#xff0c;报错信息及异常截图如下&#xff1a; 报错信息 Rendering cancelled, page…

【PADS封装】2.4G PCB天线封装(量产用)

包含了我们平时常用的2.4GPCB天线封装&#xff0c;总共11种封装。完全能满足日常设计使用。 下载链接&#xff01;&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247548815&idx1&sne625e51a06755a34ab4404497770df48&chksmfcfb2c58cb8ca5…

探索图像分割技术:使用 OpenCV 的分水岭算法

贾斯卡兰巴蒂亚 一、说明 图像分割是计算机视觉的一个基本方面&#xff0c;多年来经历了巨大的转变。这将是一系列三篇博客文章&#xff0c;深入研究三种不同的图像分割技术 - 1使用OpenCV的经典分水岭算法&#xff0c;2使用PyTorch实现的基于深度学习的UNet模型&#xff0c;3 …

Ubuntu小知识总结

Ubuntu相关的小知识总结 一、Ubuntu系统下修改用户开机密码二、Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法问题描述Vmware tools灰色不能安装解决方法小知识点&#xff1a;MarkDown的空格 三、Ubuntu虚拟机网络无法连接的几种解决方法1.重启网络编辑器2. 重启虚…

Linux下使用openssl为harbor制作证书

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有&#xff1a;SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证…

免费高清壁纸下载(静态和动态壁纸)

一、网址下载&#xff08;静态壁纸&#xff09; 高清图片直接另存为就可以了。然后在电脑空白处右键——个性化设置即可替换壁纸。 ①网址&#xff1a;https://www.hippopx.com ②极简壁纸&#xff1a;https://bz.zzzmh.cn/index ③彼岸图网&#xff1a;http://pic.netbian…

OpenCV17-图像形态学操作

OpenCV17-图像形态学操作 1.形态学操作1.1腐蚀1.2膨胀 2.形态学应用2.1开运算2.2闭运算2.3形态学梯度2.4顶帽运算2.5黑帽运算2.6击中击不中变换2.7形态学应用示例 1.形态学操作 1.1腐蚀 图像腐蚀&#xff08;Image erosion&#xff09;可用于减小图像中物体的大小、填充孔洞或…

华为eNSP配置专题-VRRP的配置

文章目录 华为eNSP配置专题-VRRP的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接 2.VRRP的配置2.1、PC1的配置2.2、接入交换机acsw的配置2.3、核心交换机coresw1的配置2.4、核心交换机coresw2的配置2.5、配置VRRP2.6、配置出口…

C++多态、虚函数、纯虚函数、抽象类

多态的概念 通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个简单的例子&#xff1a;抢红包&#xff0c;我们每个人都只需要点击一下红包&#xff0c;就会抢到金额。有些人能…

OpenCV中world模块介绍

OpenCV中有很多模块&#xff0c;模块间保持最小的依赖关系&#xff0c;用户可以根据自己的实际需要链接相关的库&#xff0c;而不需链接所有的库&#xff0c;这样在最终交付应用程序时可以减少总库的大小。但如果需要依赖OpenCV的库太多,有时会带来不方便&#xff0c;此时可以使…

vue2 element手术麻醉信息系统源码,手术预约、手术安排、排班查询、手术麻醉监测、麻醉记录单

手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流程&#xff0c;实现麻醉手术过程的信息数字化&#xff0c;自动生成麻…

mac 升级node到指定版本

node版本14.15.1升级到最新稳定版18.18.2 mac系统 先查看一下自己的node版本 node -v开始升级 第一步 清除node的缓存 sudo npm cache clean -f第二步 安装n模块【管理模块 n是管理 nodejs版本】 sudo npm install -g n第三步升级node sudo n stable // 把当前系统的 Node…

计算机毕业设计 基于SpringBoot智慧养老中心管理系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【趣味随笔】盘点国内外做双足机器人的公司

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

leetCode 392. 判断子序列 动态规划 + 优化空间 / 双指针 等多种解法

392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c…

Aocoda-RC F405V2 FC(STM32F405RGT6 v.s. AT32F435RGT7) IO Definitions

[TOC](Aocoda-RC F405V2 FC(STM32F405RGT6 v.s. AT32F435RGT7) IO Definitions) 1. 源由 Aocoda-RC F405V2飞控支持betaflight/inav/Ardupilot固件&#xff0c;是一款固件兼容性非常不错的开源硬件。 之前我们对比过STM32F405RGT6 v.s. AT32F435RGT7 Comparison for Flight …

ThreadLocal源码解密

1 背景 作为一只懒懒地程序员,其实我是不太爱看源码的,晦涩、深奥、难懂、耗费时间等等,就觉得不是我这种能力平平地小老百姓能吃得消的,但现实比人强,记得曾经我就被不懂原理的情况下乱用ThreadLocal给毒打了。 犹记得当时在一个JSF服务中的责任链的校验场景中需要在源…

UART、SPI、I2C通信协议超全入门教程

本文引注: https://mp.weixin.qq.com/s/lVWK8xlDt7cOLi8WHYSuPg 1.SPI协议 1.基础 2.简介 3.工作原理 4.SPI数据传输步骤与优缺点 2.UART协议

分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>

微服务技术栈 一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分服务拆分-服务远程调用 2 eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现 3 Ribbon组件 负载均衡Ribbon-负载均衡原理Ribb…

python随手小练6

1、汉诺塔 汉诺塔&#xff1a;汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放…