# 2023/5/17 用户程序控制三盏灯的亮灭

news2024/12/22 22:52:01

2023/5/17 用户程序控制三盏灯的亮灭

led1:0:灭;1:亮
led2:0:灭;1:亮
led3:0:灭;1:亮
输入格式:例:000、101

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#define RCC_AHB4_ENSETR   0x50000a28

#define GPIOE_MODER       0x50006000
#define GPIOE_ODR         0x50006014

#define GPIOF_MODER       0x50007000
#define GPIOF_ODR         0x50007014

#define GPIO_PIN_8 8
#define GPIO_PIN_10 10

#endif

mycdev.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] = {0};


unsigned int *vir_rcc;

unsigned int *vir_moder1;
unsigned int *vir_odr1;
unsigned int *vir_odr3;

unsigned int *vir_moder2;
unsigned int *vir_odr2;


//封装驱动中的操作方法
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;
    //判断用户的需求,如果内核满足不了,给内核能满足的最大值
    if(size > sizeof(kbuf))
    {
        size = sizeof(kbuf);
    }
    ret = copy_to_user(ubuf,kbuf,size);//内核向用户拷贝数据
    if(ret)
    {
        printk("copy_to_user failed __%d__\n",__LINE__);
        return ret;
    }
    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)
{
    int ret;
    //判断用户的需求,如果内核满足不了,给内核能满足的最大值
    if(size > sizeof(kbuf))
    {
        size = sizeof(kbuf);
    }
    ret = copy_from_user(kbuf,ubuf,size);
    if(ret)
    {
        printk("copy_from_user failed __%d__\n",__LINE__);
        return ret;
    }
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    //LED1开关
    if('1' == kbuf[0])//开灯
    {
        (*vir_odr1) |= (1 << GPIO_PIN_10);
    }else if('0' == kbuf[0])
    {
        (*vir_odr1) &= (~(1 << GPIO_PIN_10));
    }

    //LED2开关
     if('1' == kbuf[1])//开灯
    {
        (*vir_odr2) |= (1 << GPIO_PIN_10);
    }else if('0' == kbuf[1])
    {
        (*vir_odr2) &= (~(1 << GPIO_PIN_10));
    }

    //LED3开关
    if('1' == kbuf[2])//开灯
    {
        (*vir_odr3) |= (1 << GPIO_PIN_8);
    }else if('0' == kbuf[2])
    {
        (*vir_odr3) &= (~(1 << GPIO_PIN_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);

    //进行LED的相关寄存器映射
    vir_moder1 = ioremap(GPIOE_MODER,4);
    if(NULL == vir_moder1)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }

    vir_moder2 = ioremap(GPIOF_MODER,4);
    if(NULL == vir_moder2)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }   

    vir_odr1 = ioremap(GPIOE_ODR,4);
    if(NULL == vir_odr1)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }
    vir_odr3 = ioremap(GPIOE_ODR,4);
    if(NULL == vir_odr3)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }
    vir_odr2 = ioremap(GPIOF_ODR,4);
    if(NULL == vir_odr2)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }

    vir_rcc = ioremap(RCC_AHB4_ENSETR,4);
    if(NULL == vir_rcc)
    {
        printk("寄存器映射失败 __%d__\n",__LINE__);
        return -ENOMEM;
    }

    printk("寄存器映射成功\n");

    //寄存器初始化
    //LED1、LED3初始化
    (*vir_rcc) |= (1 << 4);

    (*vir_moder1) &= (~(3 << GPIO_PIN_10*2));
    (*vir_moder1) |= (1 << GPIO_PIN_10*2);
    (*vir_odr1) &= (~(1 << GPIO_PIN_10));

    (*vir_moder1) &= (~(3 << GPIO_PIN_8*2));
    (*vir_moder1) |= (1 << GPIO_PIN_8*2);
    (*vir_odr3) &= (~(1 << GPIO_PIN_8));

    //LED2初始化
    (*vir_rcc) |= (1 << 5);

    (*vir_moder2) &= (~(3 << GPIO_PIN_10*2));
    (*vir_moder2) |= (1 << GPIO_PIN_10*2);
    (*vir_odr2) &= (~(1 << GPIO_PIN_10));

    printk("寄存器初始化成功\n");

    return 0;
}
static void __exit mycdev_exit(void)
{
    //取消内存映射
    iounmap(vir_rcc);
    iounmap(vir_moder1);
    iounmap(vir_moder2);
    iounmap(vir_odr1);
    iounmap(vir_odr2);
    iounmap(vir_odr3);
    //字符设备驱动注销
    unregister_chrdev(major,"mycdev");

}

module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

demo.c

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char buf[128] = {0};
    int fd = open("/dev/mycdev",O_RDWR);
    if(fd < 0)
    {
        printf("设备文件打开失败\n");
        exit(-1);
    }
    while(1)
    {    
        memset(buf,0,sizeof(buf));

        printf("请输入要进行的操作:");
        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;
}

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

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

相关文章

8.防火墙

文章目录 防火墙iptables防火墙介绍基础操作高级操作通用匹配隐含匹配端口匹配&#xff1a;--sport 源端口、--dport 目的端口 TCP标志位匹配&#xff1a;--tcp-flags TCP标志位ICMP类型匹配&#xff1a;--icmp-type ICMP类型 显式匹配多端口匹配IP范围匹配&#xff1a;-m ipra…

FPGA_学习_04_Verilog基础语法和Modelsem仿真

前言&#xff1a;对于以前学过C/C/C#的作者来讲&#xff0c;Verilog的基础语法算是特别简单的。本文主要介绍Verilog的基础语法和Modelsem仿真。 Verilog的基础语法 1 模块声明 FPGA开发是以模块为基础的&#xff0c;每个可综合的.v文件都是一个模块&#xff0c;模块由module…

华为云——代码托管的使用

一、打开前后端项目 登录华为云&#xff0c;点击页面右上角的用户名——点击个人设置 2.点击代码托管的HTTPS密码管理&#xff0c;设置自己的密码 3.回到代码仓库&#xff0c;复制HTTP地址 4.打开GitHubDesktop&#xff0c;点击左上角进行仓库克隆 &#xff08;我这里已经cl…

Redis 介绍相关知识,常用五大数据结构

1.Redis 介绍相关知识 Redis 是单线程多路 IO 复用技术 多路复用是指使用一个线程来检查多个文件描述符&#xff08;Socket&#xff09;的就绪状态&#xff0c;比如调用select 和 poll 函数&#xff0c;传入多个文件描述符&#xff0c;如果有一个文件描述符就绪&#xff0c;则…

1米挂幅「社交泛娱乐出海作战地图」预定火爆,免费抢领纸质版

移步【融云全球互联网通信云】回复“地图”免费领 家人们&#xff01; 融云自制《社交泛娱乐出海作战地图》 首开大捷&#xff01; 预约已超 300 出海必备实战手册 移步公众号报名 泰火辣~ 已预约进入排队的朋友请耐心等待 后期我们将按照报名顺序依次派送 另外&#…

终于通过啦! 我拿到了阿里云【通义千问】大模型AI测试体验资格啦!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

Jmeter的十大组件

1.Jmeter的十大组件以及执行顺序 1.十大组件 测试计划线程组配置元件前置处理器定时器取样器后置处理器断言监听器 2.执行顺序为从测试计划到监听器依次执行 测试计划> 线程组>配置元件>前置处理器>定时器> 取样器> 后置处理器>断言>监听器 3.作用…

leetcode 2130. Maximum Twin Sum of a Linked List(链表的最大孪生和)

给出一个单向链表&#xff0c;第i 个node 和 第(n-1-i)个node称为twin. 0 < i < n/2 - 1 求所有twin的最大和。 链表长度为偶数。 思路&#xff1a; 链表长度为偶数&#xff0c;就省了不少步骤&#xff0c;不用再考虑奇数时中间那个node单独计算了。 直觉上来看&#x…

Servlet编程---Day 06

一、会话技术概述 &#xff08;一&#xff09;什么是会话技术 类似两个人谈话&#xff0c;会话其实就是服务器和客户端的多次请求和响应 一次会话&#xff1a;多次请求和响应 组成了一次会话。从第一次发送请求建立会话&#xff0c;直到一端断开连接 http协议&#xff1a;…

web前端开发需要哪些技术?学前端顺序千万千万不要搞错啦!

宝子们&#xff0c;下午好&#xff0c;之前给大家分享了前端岗位的前景规划&#xff0c;小源看的出来&#xff0c;还是有不少宝子想入行前端的&#xff01; 那除了会面试&#xff0c;还要有充足丰富的知识储备&#xff0c;需要什么技术&#xff0c;怎么样做才能找到高薪工作呢&…

Oracle Profile详解

Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面&#xff0c;默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…

Node.js 学习系列(四)—— 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在任务完成后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 的所有 API 都支持回调函数。 例如&#xff0c;我们可以一边读取…

ubuntu22.10 ffmpeg-webrtc推拉流srs环境搭建

一、编译ffmpeg-webrtc 二、openssl&#xff0c;opus&#xff0c;x264配置 三、编译srs 四、测试 4.1推流端 4.2拉流端 五、交互与sdp 最近看到杨大佬发的动态&#xff0c;尝鲜体验一下。 一、编译ffmpeg-webrtc ffmpeg-webrtc官网&#xff1a;https://github.com/ossrs/ffmp…

Linux---相关介绍、相关下载、连接Linux系统、虚拟机快照

1. Linux系统相关 内核提供了Linux系统的主要功能&#xff0c;如硬件调度管理的能力。 Linux内核是免费开源的&#xff0c;是由林纳斯托瓦兹在1991年创立并发展至今成为服务器操作系统领域的 核心系统。 内核无法被用户直接使用&#xff0c;需要配合应用程序才能被用户使用…

C++层次遍历(队列结构)

#include <stdio.h> #include <malloc.h> typedef struct ok //树结构 { int data; struct ok *lchild; struct ok *rchild; }bittree; //队列结构 typedef struct d { int head; //头 int tail; //尾 bittree **data; //数组 …

安全狗入选中国网络安全市场全景图多个细项

5月16日&#xff0c;数说安全正式发布《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合且全面的产品与安全实力入选全景图。 数说安全采用科学、遵循市场发展规律且符合客户采购习惯的分类方法…

功能测试4年,5月份被辞退,2023年的功能真的没有出路了

在测试行业摸爬滚打5年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家轻视&#xff0c;总有人会问你&#xff0c;为啥干测试啊&#xff0c…

纯python统计基于orthofinder得到的系统发育树的关注点位置的树型结构

对于某一个物种或某类物种在整个系统发育树中的位置存在一定争议的情况&#xff0c;使用直系同源基因构建单基因树&#xff0c;并对该物种或该类物种所在结构进行统计是可以对争议起到一定的解决作用的&#xff0c;在此留下全套流程和大家交流。 主要分为几步&#xff1a; 使…

260道网络安全常见面试题汇总(附答案解析+配套资料)

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;所有的资料都整理成了PDF&#xff0c;面试题和答案将会持续更新&#xff0c;因为无论如何也不可能覆盖所有的面试题。 目录 一、渗透测试…

从内网护卫到零信任尖兵:腾讯iOA炼成记

腾讯既是企业产品的服务商又是使用者&#xff0c;很多产品最原始的出发点最早只是为了解决腾讯自身某一个需求&#xff0c;经过不断地发展完善和业务场景锤炼&#xff0c;最终进化成一个成熟的企服产品。本系列文章讲述的是这样一组Made in Tencent故事&#xff0c;这是系列的第…