驱动day2作业

news2024/11/7 9:32:46

编写应用程序控制三盏灯亮灭

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_LED1_MODER 0x50006000
#define PHY_LED2_MODER 0x50007000
#define PHY_LED1_ODR 0x50006014
#define PHY_LED2_ODR 0x50007014
#define PHY_RCC 0x50000A28

#endif

demo1.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 major;
char kbuf[128]={};
unsigned int *vir_moder;
unsigned int *vir_moder2;
unsigned int *vir_odr;
unsigned int *vir_odr2;
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)
{
    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 filed\n");
        return -EIO;
    }
    if(kbuf[0] == '0')//全灭
    {
        (*vir_odr) &= (~(0x1 << 10));
        (*vir_odr2) &= (~(0x1 << 10));
        (*vir_odr) &= (~(0x1 << 8));
    }
    else if(kbuf[0] == '1')//LED1亮
    {
        (*vir_odr) |= (0x1 << 10);
    }
	else if(kbuf[0] == '2')//LED2亮
	{
        (*vir_odr2) |= (0x1 << 10);
	}
	else if(kbuf[0] == '3')//LED3亮
	{
        (*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_MODER,4);
    if(vir_moder == NULL)
    {
        printk("物理内存地址映射失败%d\n", __LINE__);
        return -EFAULT;
    }
	vir_moder2 = ioremap(PHY_LED2_MODER,4);
	if(vir_moder == NULL)
    {
        printk("物理内存地址映射失败%d\n", __LINE__);
        return -EFAULT;
    }
    vir_odr = ioremap(PHY_LED1_ODR,4);
    if(vir_odr == NULL)
    {
        printk("物理内存地址映射失败%d\n", __LINE__);
        return -EFAULT;
    }
    vir_odr2 = ioremap(PHY_LED2_ODR,4);
    if(vir_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");
    //rcc使能GPIOE、GPIOF
    (*vir_rcc) |= (0x1 << 4);
    (*vir_rcc) |= (0x1 << 5);
    //moder 设PE10 PF10 PE8为输出模式
    (*vir_moder) &= (~(0x3 << 20));
    (*vir_moder) |= (0x1 << 20);
    (*vir_moder) &= (~(0x3 << 16));
    (*vir_moder) |= (0x1 << 16);
    (*vir_moder2) &= (~(0x3 << 20));
    (*vir_moder2) |= (0x1 << 20);
    //odr 设PE10 PF10 PE8默认输出0
    (*vir_odr) &= (~(0x1 << 10));
    (*vir_odr) &= (~(0x1 << 8));
    (*vir_odr2) &= (~(0x1 << 10));
    return 0;
}
static void __exit mycdev_exit(void)
{
    iounmap(vir_moder);
    iounmap(vir_odr);
    iounmap(vir_rcc);
    iounmap(vir_moder2);
    iounmap(vir_odr2);
    unregister_chrdev(major,"mychrdev");
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

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,const char * 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(LED1开)2(LED2开)3(LED3开)>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]='\0';
        write(fd,buf,sizeof(buf));
    }
    close(fd);
    return 0;
}

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

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

相关文章

海外调查问卷赚钱是真的吗?

海外问卷赚钱是真实的吗&#xff1f;我是橙河网络&#xff0c;一家问卷公司的老板&#xff0c;做这个行业已经2年时间了&#xff0c;首先给大家一个明确的回答&#xff1a;海外问卷调查赚钱是真实的&#xff01; 海外问卷调查项目&#xff0c;在国内已经存在一二十年的时间了&…

21.3 Python 使用DPKT分析数据包

dpkt项目是一个Python模块&#xff0c;主要用于对网络数据包进行解析和操作。它可以处理多种协议&#xff0c;例如TCP、UDP、IP等&#xff0c;并提供了一些常用的网络操作功能&#xff0c;例如计算校验和、解析DNS数据包等。由于其简单易用的特性&#xff0c;dpkt被广泛应用于网…

[C语言]排序的大乱炖——喵喵的成长记

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

C# Onnx Detic 检测2万1千种类别的物体

效果 lable organism benthos heterotroph cell person animal plant food artifact hop check-in dressage curvet piaffe funambulism rock_climbing contact_sport outdoor_sport gymnastics acrobatics track_and_field track jumping broad_jump high_jump Fosbury_flop …

adb 获取 Android 设备中已安装的 apk 文件

前言 今天发现手机上一个应用在应用商店已经搜索不到了&#xff0c;想把其推荐给朋友使用&#xff0c;发现不知道从哪里找原始的 apk 安装文件&#xff0c;记录一下。 如何提取 apk 两种方法 MT管理器导出 可以使用 MT管理器(Android 平台逆向神器)&#xff0c;它有个 安装…

新版网站云监控计划任务系统源码+定时访问指定网址监控/更新(PHP源码)

源码简介&#xff1a; 新版网站云监控计划任务系统源码&#xff0c;能够定时访问网址监控&#xff0c;是更新的版本。该源码可以提供高效稳定的监控服务&#xff0c;免费简单使用并容易上手&#xff0c;这个为最新接口&#xff0c;能让用户更放心地进行任务监控。跟其他云任务…

SystemVerilog Assertions应用指南 Chapter1.37 使用局部变量的SVA

在序列或者属性的内部可以局部定义变量,而且可以对这种变量进行赋值。变量接着子序列放置,用逗号隔开。如果子序列匹配,那么变量赋值语句执行。每次序列被尝试匹配时,会产生变量的一个新的备份。 module cubed(enable1, a, aa, clk);input logic [7:0] a; input logic enable1,…

【力扣刷题】回文链表、环形链表、合并两个有序链表

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 刷题篇 一、回文链表1.1 题目描述1.2 思路分…

顺序队列----数据结构

队列的概念 队列&#xff0c;符合先进先出特点的一种数据结构&#xff0c;是一种特殊的线性表&#xff0c;但它不像线性表一样可以任意插入和删除操作&#xff0c;而是只允许在表的一端插入&#xff0c;也就是在队列的尾部进行插入&#xff1b;只允许在表的另一端进行删除&…

Vue2之防抖_debounce封装函数v-debounce自定义指令(传参/不传)

目录 1、防抖 2、debounce - 封装函数 3、v-debounce 全局自定义指令 1、防抖 推荐文章 &#xff1a; https://blog.csdn.net/weixin_58099903/article/details/119902796 2、debounce - 封装函数 utils / tools.js /*** 函数防抖 是n秒后延迟执行&#xff0c;多用于页面scr…

js获取视频编码

一.背景 有些浏览器不支持某些视频的编码方式导致播放出现问题&#xff0c;这个时候要限制视频上传 二.插件 https://unpkg.com/mediainfo.js0.1.4/dist/mediainfo.min.js 三.完整html代码 <!DOCTYPE html> <html lang"en"> <head><meta ch…

【微服务保护】Sentinel 流控规则 —— 深入探索 Sentinel 的流控模式、流控效果以及对热点参数进行限流

文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言 微服务架…

flutter doctor检测环境,出现CocoaPods installed but not working

1. 安装flutter, 地址: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2. 安装成功后&#xff0c;通过flutter doctor检测环境。以mac为例&#xff0c;出现了CocoaPods installed but not working 错误提示时&#xff0c;以下为解决方案: 2.1 rvm i…

AJAX: 对话框大全

AJAX:$.ajax({url: "/admin/cutting/getDataWeek",type: "GET",data:{},dataType:json,success: function (res) {if (res.code 1) {}},error:function (error) {console.log(请求失败);console.log(error);}}); $(.sub).unbind(click).click(funct…

浅析云数据安全的必要性

随着企业和个人用户越来越多地将数据存储和处理移到云上&#xff0c;云数据安全变得至关重要。云计算的发展为我们提供了卓越的灵活性和可扩展性&#xff0c;但也伴随着潜在的风险。在这个信息高度互联的时代&#xff0c;保护敏感数据是一项迫切的任务。本文将探讨云数据安全的…

microcom串口调试工具使用

microcom串口助手使用介绍 microcom是一个在终端中使用的串口助手&#xff0c;类似平常使用SSCOM一样的东西&#xff0c;不过是在终端中使用而已。 使用的是busybox构建的文件系统 microcom源码路径&#xff1a;busybox/miscutils/microcom.c microcom 参数&#xff1a; [r…

QT计时器

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //计时器类 #include <QTime> //时间类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widg…

【视觉算法系列3】在自定义数据集上训练 YOLO NAS(下篇)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请添加微信peaeci122 YOLO-NAS是目前最新的YOLO目标检测模型&#xff0c;它在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比&#xff0c;预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标…

C# Winform编程(7)文件处理技术

文件处理技术 System.IO命名空间File类的常用方法FileInfo类的常用方法文件夹类Directory的常用方法 System.IO命名空间 System.IO命名空间常用的类 类说明File提供用于创建&#xff0c;复制&#xff0c;删除&#xff0c;移动和打开文件的静态方法&#xff0c;并协助创建File…

python triangle库将一组闭合点转化为三角网格时网格过密的问题

输入点的格式&#xff1a; [[x1,y1], [x2,y2], … [xn,yn], ] segments 格式&#xff1a; 指示输入点的连接关系 三角化代码&#xff1a; t2 triangle.triangulate({vertices: path,segments: segments}, peq32.5a0.5)效果&#xff1a; 网格过密&#xff0c;根据文档&…