控制三盏灯

驱动代码

#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] = {0};
unsigned int *vir1_moder;
unsigned int *vir1_odr;
unsigned int *vir1_rcc;
unsigned int *vir2_moder;
unsigned int *vir2_odr;
unsigned int *vir2_rcc;
unsigned int *vir3_moder;
unsigned int *vir3_odr;
unsigned int *vir3_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)
{int ret;ret = copy_to_user(ubuf,kbuf,size);if (ret){printk("copy_to_user err\n");return -EIO;}return 0;
}
ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
{int ret = 0;ret = copy_from_user(kbuf,ubuf,size);if (ret){printk("copy_from_user err\n");return -EIO;}switch(kbuf[0]){case '1':(*vir1_odr) |= (0x1 << 10);break;case '2':   (*vir1_odr) &= (~(0x1 << 10));break;case '3':(*vir2_odr) |= (0x1 << 10);break;case '4':   (*vir2_odr) &= (~(0x1 << 10));break;case '5':(*vir3_odr) |= (0x1 << 8);break;case '6':   (*vir3_odr) &= (~(0x1 << 8));break;default:printk("输入错误\n");break;}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);//相关寄存器内存映射vir1_odr = ioremap(LED1_ODR,4);if (vir1_odr == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir1_rcc = ioremap(LED1_RCC,4);if (vir1_rcc == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir1_moder = ioremap(LED1_MODER,4);if (vir1_moder == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir2_odr = ioremap(LED2_ODR,4);if (vir2_odr == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir2_rcc = ioremap(LED2_RCC,4);if (vir2_rcc == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir2_moder = ioremap(LED2_MODER,4);if (vir2_moder == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir3_odr = ioremap(LED3_ODR,4);if (vir3_odr == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir3_rcc = ioremap(LED3_RCC,4);if (vir3_rcc == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}vir3_moder = ioremap(LED3_MODER,4);if (vir3_moder == NULL)  {   printk("物理内存映射失败%d\n",__LINE__);return -EFAULT;}printk("寄存器内存映射成功\n");//硬件寄存器的初始化//RCC使能(*vir1_rcc) |= (0x1 << 4);//设置PE10为输出(*vir1_moder) &= (~(0x3 << 20));(*vir1_moder) |= (0x1 << 20);//默认关灯(*vir1_odr) &= (~(0x1 << 10));//RCC使能(*vir2_rcc) |= (0x1 << 5);//设置PE10为输出(*vir2_moder) &= (~(0x3 << 20));(*vir2_moder) |= (0x1 << 20);//默认关灯(*vir1_odr) &= (~(0x1 << 10));//RCC使能(*vir1_rcc) |= (0x1 << 4);//设置PE10为输出(*vir1_moder) &= (~(0x3 << 16));(*vir1_moder) |= (0x1 << 16);//默认关灯(*vir1_odr) &= (~(0x1 << 8));return 0;
}
static void __exit mycdev_exit(void)
{//取消物理内存映射iounmap(vir1_moder);iounmap(vir1_rcc);iounmap(vir1_odr);iounmap(vir2_moder);iounmap(vir2_rcc);iounmap(vir2_odr);iounmap(vir3_moder);iounmap(vir3_rcc);iounmap(vir3_odr);//字符设备驱动注销unregister_chrdev(major,"mychrdev");}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

应用层代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.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("设备文件打开失败\n");exit(-1);}  while(1){printf("请输入对LED的控制命令1(LED1开灯)2(LED1关灯)3(LED2开灯)4(LED2关灯)5(LED3开灯)6(LED3关灯)>");fgets(buf,sizeof(buf),stdin);//在终端输入数据到bufbuf[strlen(buf)-1] = '\0';write(fd,buf,sizeof(buf));memset(buf,0,sizeof(buf));}close(fd);return 0;
}

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

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

相关文章

在外SSH远程连接macOS服务器【cpolar内网穿透】

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

Chrome 108版(64-bit 108.0.5359.125)网盘下载

还在用Selenium的朋友们注意了&#xff0c;目前Chrome的最新版是116&#xff0c;而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式&#xff0c;需要旧版的很难回去了。如果真的想要旧版的Chrome&#xff0c;只能民间自救。 我在2022年12月备份了C盘…

mybatisplus多租户原理略解

概述 当前mybatisPlus版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version> </dependency>jdk版本&#xff1a;17 springboot版本&#xff1a;…

数学建模-点评笔记 9月3日

1.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…

永恒之黑_CVE-2020-0796漏洞复现

永恒之黑&#xff1a;CVE-2020-0796漏洞复现 目录 永恒之黑&#xff1a;CVE-2020-0796漏洞复现漏洞介绍漏洞影响范围漏洞复现1.环境准备2.复现过程 漏洞介绍 本漏洞源于SMBv3没有正确处理压缩的数据包&#xff0c;在解压数据包的时候使用客户端传过来的长度进行解压时&#xf…

lv3 嵌入式开发-4 linux shell命令(文件搜索、文件处理、压缩)

目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut 3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 1 …

SPSS多元线性回归数据解读

前文我们总结了SPSS安装流程和多元线性回归操作案例&#xff1a; 链接如下&#xff1a; SPSS安装&#xff1a;保姆级SPSS图文安装教程_追忆苔上雪的博客-CSDN博客 SPSS多元线性回归操作案例&#xff1a;SPSS多元线性回归操作入门实例_追忆苔上雪的博客-CSDN博客 接下来针对…

2023 最新 Git 分布式版本控制系统介绍和下载安装使用教程

Git 基本概述 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 集中式和分布式的区别&#xff1f; 最常见的集中式版本控制系统是SVN&#xff0c;版本库是集中放在中央处理器中的&#xff0c;而干活的时候&#xff0c;用的都是自己电…

K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(下)

温故知新 &#x1f4da;第三章 Kubernetes各组件部署&#x1f4d7;安装kubectl&#xff08;可直接跳转到安装kubeadm章节&#xff0c;直接全部安装了&#xff09;&#x1f4d5;下载kubectl安装包&#x1f4d5;执行kubectl安装&#x1f4d5;验证kubectl &#x1f4d7;安装kubead…

2023年09月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

mac制作ssl证书|生成自签名证书,nodejs+express在mac上搭建https+wss(websocket)服务器

注意 mac 自带 openssl 所以没必要像 windows 一样先安装 openssl&#xff0c;直接生成即可 生成 ssl/自签名 证书 生成 key # 生成rsa私钥&#xff0c;des3算法&#xff0c;server_ssl.key是秘钥文件名 1024位强度 openssl genrsa -des3 -out server_ssl.key 1024让输入两…

EOCR-AR电机保护器自动复位的启用条件说明

为适用不同的现场使用需求&#xff0c;施耐德韩国公司推出了带有自动复位功能的模拟型电动机保护器-EOCR-AR。EOCR-AR电机保护器具有过电流、缺相、堵转保护功能&#xff0c;还可根据实际需要设置自动复位时间。 EOCR-AR自动复位的设置方法 如上图&#xff0c;R-TIME旋钮是自动…