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

应用程序

#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)); // 将数据传递给内核}close(fd);return 0;
}

头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#define PHY_LED1_MODER 0X50006000
#define PHY_LED1_ODR   0X50006014
#define PHY_RCC        0X50000A28#define PHY_LED2_MODER 0X50007000
#define PHY_LED2_ODR   0X50007014#define PHY_LED3_MODER 0X50006000
#define PHY_LED3_ODR   0X50006014#endif

驱动程序

#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_odr;unsigned int *vir_moder2;
unsigned int *vir_odr2;unsigned int *vir_moder3;
unsigned int *vir_odr3;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_odr3) &= (~(0X1<<8));}else if (kbuf[0] == '1'){// 开灯逻辑(*vir_odr) |= (0X1<<10);(*vir_odr2) |= (0X1<<10);(*vir_odr3) |= (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_moder2 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}vir_moder3 = ioremap(PHY_LED3_MODER, 4);if (vir_moder3 == 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_odr2 == NULL){printk("物理内存地址映射失败%d\n", __LINE__);return -EFAULT;}vir_odr3 = ioremap(PHY_LED3_ODR, 4);if (vir_odr3 == 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");//LED1寄存器初始化(*vir_rcc) |= (0X1<<4);//GPIOE控制器时钟使能(*vir_moder) &= (~(0X3<<20));//MODER[21:20]->00(*vir_moder) |= (0X1<<20);//MODER[21:20]->01(*vir_odr) &= (~(0X1<<10));//默认关灯//LED2寄存器初始化(*vir_rcc) |= (0X1<<5);//GPIOF控制器时钟使能(*vir_moder2) &= (~(0X3<<20));//MODER[21:20]->00(*vir_moder2) |= (0X1<<20);//MODER[21:20]->01(*vir_odr2) &= (~(0X1<<10));//默认关灯//LED3寄存器初始化(*vir_rcc) |= (0X1<<4);//GPIOE控制器时钟使能(*vir_moder3) &= (~(0X3<<16));//MODER[17:16]->00(*vir_moder3) |= (0X1<<16);//MODER[17:16]->01(*vir_odr3) &= (~(0X1<<8));//默认关灯return 0;
}
static void __exit mycdev_exit(void)
{//取消内存映射iounmap(vir_moder);iounmap(vir_odr);iounmap(vir_rcc);// 注销字符设备驱动unregister_chrdev(major, "mychrdev");
}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

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

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

相关文章

59 分割等和子集

分割等和子集 NP 完全问题&#xff08;01背包&#xff09;题解1 二维DP题解2 空间优化DP&#xff08;改为1D&#xff09; 给你一个只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&a…

从头开始机器学习:逻辑回归

一、说明 本篇实现线性回归的先决知识是&#xff1a;基本线性代数&#xff0c;微积分&#xff08;偏导数&#xff09;、梯度和、Python &#xff08;NumPy&#xff09;&#xff1b;从线性方程入手&#xff0c;逐渐理解线性回归预测问题。 二、逻辑回归简介 我们将以我们在线性回…

Unity3D Shader新手入门教程:3D溶解与腐蚀特效详解

引言 在游戏开发中&#xff0c;特效是非常重要的一部分&#xff0c;它能够增加游戏的趣味性和可玩性。其中&#xff0c;Shader特效是一种非常常见和常用的特效&#xff0c;它能够通过改变物体表面的渲染方式来实现各种各样的特效效果。本文将详细介绍Unity3D中的Shader 3D溶解与…

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…

基于金枪鱼群优化的BP神经网络(分类应用) - 附代码

基于金枪鱼群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于金枪鱼群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.金枪鱼群优化BP神经网络3.1 BP神经网络参数设置3.2 金枪鱼群算法应用 4.测试结果…

接口自动化测试持续集成,Soapui接口功能测试参数化

按照自动化测试分层实现的原理&#xff0c;每一层的脚本实现都要进行参数化&#xff0c;自动化的目标就是要实现脚本代码与测试数据分离。当测试数据进行调整的时候不会对脚本的实现带来震荡&#xff0c;从而提高脚本的稳定性与灵活度&#xff0c;降低脚本的维护成本。Soapui最…

【学习笔记】RabbitMQ01:基础概念认识以及快速部署

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 一、认识RabbitMQ1.1 消息中间件&#xff08;MQ Message Queue 消息队列1.2 主流的消息中间件1.3 MQ的应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理 二、RabbitMQ运行环境搭建…

【C语言进阶(14)】程序的编译与链接

文章目录 前言Ⅰ 程序的翻译环境1. 编译的过程2. 链接的过程 Ⅱ 程序的执行环境Ⅲ 预定义符号Ⅳ 预处理指令 #define1. #define 定义标识符2. #define 定义宏3. #define 替换规则 Ⅴ 预处理操作符 # 和1. # 操作符2. ## 操作符 Ⅵ 宏和函数的对比Ⅶ 预处理指令 #undefⅧ 条件编…

【力扣每日一题】2023.10.19 同积元组

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目比较简洁,给我们一个元素各不相同的数组&#xff0c;要我们找出该数组里能够组成 a*bc*d 的组合数目。 比较直观的做法是我们直接暴…

【STM32】--PZ6860L,STM32F4,ARM3.0开发板

一、ARM3.0开发板详细介绍 1.开发板整体介绍 &#xff08;1&#xff09;各种外设和主板原理图 &#xff08;2&#xff09;主板供电部分5V和3.3V兼容设计 注意跳线帽 2.STM32核心板介绍 3.核心板原理图 STM32和51的IO对应关系 下载电路 二、ARM3.0开发板ISP下载原理分析 1.I…

分布式系统部署Redis

文章目录 一、单点问题二、主从模式概念配置主从结构查看主从节点断开从属关系拓扑结构主从复制原理replication复制offset偏移量 全量复制和部分复制全量复制部分复制 实时复制redis主节点无法重启 三、主从哨兵模式哨兵概念监控程序人工恢复自动恢复为什么是哨兵集合使用dock…

一文拿下HTTP

HTTP HTTP协议 是应用层使用最广泛的协议之一&#xff0c;从浏览器获取到网页&#xff0c;就是基于http 浏览器和服务器之间的交互桥梁 基于传输层的TCP协议来实现的&#xff0c;是一种无状态的应用层协议 为啥是无状态的呢 简化服务器端的处理逻辑&#xff1a;HTTP是无状态…

如何用记事本制作一个简陋的小网页(3)——注册信息表

目录 前提须知&#xff1a; 一、表格建立之前&#xff1a; 二、表格的建立&#xff1a; 三、信息表的内容填充&#xff1a; 1.昵称 和 电话 &#xff1a; 2.密码&#xff1a; 3.性别&#xff1a; 4. 爱好&#xff1a; 5.民族&#xff1a; 6. 出生日期&#xff1a; 7.…

Android apkanalyzer简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…

Python词语转拼音

使用python写的图形汉语词语转拼音小工具 1)安装库 pip install flet 2)代码 # 声母列表 initial_consonant_list [b, p, m, f, d, t, n, l, g, k, h, j, q, x, zh, ch, sh, r,z, c, s, y, w] # 韵母列表 list_of_vowels [a, o, e, i, u, , ai, ei, ui, ao, ou, iu, ie, e…

SpringCloudSleuth异步线程支持和传递

场景 在使用Sleuth做链路跟踪时&#xff0c;默认情况下异步线程会断链&#xff0c;需要进行代码调整支持。 调整内容 方式一 使用Async实现异步线程 开启异步线程池 EnableAsync SpringBootApplication public class LizzApplication {public static void main(String[] a…

织造业的数字安全守护者:深入了解迅软DSE数据加密

客户简要介绍 某织造企业成立于2004年&#xff0c;工厂位于苏州平望&#xff0c;公司目前拥有先进纺织设备330台套和日本瑞士等前道配套设备&#xff0c;公司占地33亩、具有现代化标准厂房办公楼等3万平米。 某织造企业面料、功能性面料、新材料面料的生产商&#xff0c;公司坚…

教程更新 | 持续开源 RK3568驱动指南-驱动基础进阶篇

《iTOP-RK3568开发板驱动开发指南》手册文档更新&#xff0c;手册内容对应视频教程&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 ✦ 第一篇 驱动基础 第1章 前言 第2章 你好&#xff01;内核源码 第3章 …

Mysql第二篇---InnoDB数据存储结构

Mysql第二篇—InnoDB数据存储结构 数据库的存储结构: 页 索引结构给我们提供了高效的索引方式, 不过索引信息以及数据记录都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 确切的说是存储在页结构中. 另一方面, 索引是在存储引擎中实现的, MySQL服务器上的存储引…