驱动开发点亮led灯
头文件
#ifndef __HEAD_H__
#define __HEAD_H__#define PHY_LED_MODER 0X50006000
#define PHY_LED_ODR 0X50006014
#define PHY_LED_RCC 0X50000A28
#define PHY_LED_FMODER 0X50007000
#define PHY_LED_FODR 0X50007014#endif
驱动代码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include "head.h"
#include <linux/io.h>
#include <linux/device.h>unsigned int major;
char kbuf[128] = {0};
unsigned int *vir_moder;
unsigned int *vir_fmoder;
unsigned int *vir_rcc;
unsigned int *vir_odr;
unsigned int *vir_fodr;
struct class *clz;
struct device *dev;int myDev_open(struct inode *major, struct file *file)
{printk("%s:%s,%d\n", __FILE__, __func__, __LINE__);return 0;
}ssize_t myDev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof)
{int ret;ret = copy_from_user(kbuf, ubuf, size);if (ret){printk("copy_from_user failed!\n");return ret;}switch (kbuf[0]){case '1'://pe10if (kbuf[1] == '1'){(*vir_odr) |= (0x1 << 10);}else if (kbuf[1] == '0'){(*vir_odr) &= (~(0x1 << 10));}break;case '2'://pe8if (kbuf[1] == '1'){(*vir_fodr) |= (0x1 << 10);}else if (kbuf[1] == '0'){(*vir_fodr) &= (~(0x1 << 10));}break;case '3'://pf10if (kbuf[1] == '1'){(*vir_odr) |= (0x1 << 8);}else if (kbuf[1] == '0'){(*vir_odr) &= (~(0x1 << 8));}break;default:break;}return 0;
}ssize_t myDev_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 failed!\n");return ret;}return 0;
}int myDev_close(struct inode *major, struct file *file)
{printk("myDev_close\n");return 0;
}struct file_operations fop = {.open = myDev_open,.release = myDev_close,.read = myDev_read,.write = myDev_write};static int __init mydev_init(void)
{int i = 0;major = register_chrdev(0, "myCharDev", &fop);if (major < 0){printk("设备注册失败\n");return major;}printk("设备注册成功!major=%d\n", major);vir_moder = ioremap(PHY_LED_MODER, 4);if (vir_moder == NULL){printk("内存映射失败%d\n", __LINE__);return -EFAULT;}vir_fmoder = ioremap(PHY_LED_FMODER, 4);if (vir_fmoder == NULL){printk("内存映射失败%d\n", __LINE__);return -EFAULT;}vir_rcc = ioremap(PHY_LED_RCC, 4);if (vir_rcc == NULL){printk("内存映射失败%d\n", __LINE__);return -EFAULT;}vir_odr = ioremap(PHY_LED_ODR, 4);if (vir_odr == NULL){printk("内存映射失败%d\n", __LINE__);return -EFAULT;}vir_fodr = ioremap(PHY_LED_FODR, 4);if (vir_fodr == NULL){printk("内存映射失败%d\n", __LINE__);return -EFAULT;}// pe10(*vir_moder) &= (~(0x3 << 20));(*vir_moder) |= (0x1 << 20);// pe8(*vir_moder) &= (~(0x3 << 16));(*vir_moder) |= (0x1 << 16);// pf10(*vir_fmoder) &= (~(0x3 << 20));(*vir_fmoder) |= (0x1 << 20);(*vir_rcc) |= (0x1 << 4);(*vir_rcc) |= (0x1 << 5);(*vir_odr) &= (~(0x1 << 10));(*vir_odr) &= (~(0x1 << 8));(*vir_fodr) &= (~(0x1 << 10));clz = class_create(THIS_MODULE, "mydev");if (IS_ERR(clz)){printk("提交目录失败\n");return -PTR_ERR(clz);}printk("提交目录成功\n");for (i = 0; i < 3; i++){dev = device_create(clz, NULL, MKDEV(major, i), NULL, "mydev%d", i);if (IS_ERR(dev)){printk("提交设备节点信息失败\n");return -PTR_ERR(clz);}}printk("提交设备节点信息成功\n");return 0;
}static void __exit mydev_exit(void)
{printk("mydev_exit\n");iounmap(vir_moder);iounmap(vir_rcc);iounmap(vir_odr);iounmap(vir_fmoder);iounmap(vir_fodr);int i;for (i = 0; i < 3; i++){device_destroy(clz, MKDEV(major, i));}class_destroy(clz);unregister_chrdev(major, "myCharDev");
}module_init(mydev_init);
module_exit(mydev_exit);
MODULE_LICENSE("GPL");
测试代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main()
{char buf[128];int fd = open("/dev/mydev0", O_RDWR);if (fd < 0){perror("open failed!\n");exit(-1);}printf("打开设备成功!\n");while (1){printf("请输入led灯的逻辑》\n");printf("11:led1亮\n");printf("10:led1灭\n");printf("21:led2亮\n");printf("20:led2灭\n");printf("31:led3亮\n");printf("30:led3灭\n");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = '\0';write(fd, buf, sizeof(buf));}close(fd);return 0;
}
相关文章:
驱动开发点亮led灯
头文件 #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED_MODER 0X50006000 #define PHY_LED_ODR 0X50006014 #define PHY_LED_RCC 0X50000A28 #define PHY_LED_FMODER 0X50007000 #define PHY_LED_FODR 0X50007014#endif驱动代码 #include <linux/init.h> #incl…...
回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现IPSO-SVM改进粒子群优化算法优化支持向量机多输入单输出回归预测(多指标,多图…...
数学建模之“TOPSIS数学模型”原理和代码详解
一、简介 TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种多准则决策分析方法,用于解决多个候选方案之间的排序和选择问题。它基于一种数学模型,通过比较每个候选方案与理想解和负理想解之间的相…...
threejs使用gui改变相机的参数
调节相机远近角度 定义相机的配置: const cameraConfg reactive({ fov: 45 }) gui中加入调节fov的方法 const gui new dat.GUI();const cameraFolder gui.addFolder("相机属性设置");cameraFolder.add(cameraConfg, "fov", 0, 100).name(…...
计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv
文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是…...
PHP8的字符串操作3-PHP8知识详解
今天继续分享字符串的操作,前面说到了字符串的去除空格和特殊字符,获取字符串的长度,截取字符串、检索字符串。 今天继续分享字符串的其他操作。如:替换字符串、分割和合成字符串。 5、替换字符串 替换字符串就是对指定字符串中…...
Unity VR:XR Interaction Toolkit 输入系统(Input System):获取手柄的输入
文章目录 📕教程说明📕Input System 和 XR Input Subsystem(推荐 Input System)📕Input Action Asset⭐Actions Maps⭐Actions⭐Action Properties🔍Action Type (Value, Button, Pass through) ⭐Binding …...
智慧工地一体化云平台源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机
智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最终实现项目对人、机、料、法、环的全…...
C# 表达式体方法 C#算阶乘
//表达式体方法private int Add(int a, int b) > a b;[Fact]public void Test(){var result1 Factorial(1);//1var result2 Factorial(2);//2var result3 Factorial(3);//6var result4 Factorial(4);//24var result5 Factorial(5);//120var result6 Add(100, 200);//…...
互联网发展历程:保护与隔离,防火墙的安全壁垒
互联网的快速发展,不仅带来了便利和连接,也引发了越来越多的安全威胁。在数字时代,保护数据和网络安全变得尤为重要。然而,在早期的网络中,安全问题常常让人担忧。 安全问题的困扰:网络威胁日益增加 随着互…...
基于IMX6ULLmini的linux裸机开发系列七:中断处理流程
中断上下文 cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文 中断上下文是指CPU在进入中断之前保存的寄存器状态和其他相关信息。当CPU接收到中断请求时,它会保存当前正在执行的指令的状…...
Postman软件基本用法:浏览器复制请求信息并导入到软件从而测试、发送请求
本文介绍在浏览器中,获取网页中的某一个请求信息,并将其导入到Postman软件,并进行API请求测试的方法。 Postman是一款流行的API开发和测试工具,它提供了一个用户友好的界面,用于创建、测试、调试和文档化API。本文就介…...
react go实现用户历史登录列表页面
refer: http://ip-api.com/ 1.首先需要创建一个保存用户历史的登录的表,然后连接go 2.在用户登录的时候,获取用户的IP IP位置,在后端直接处理数据即可(不需要在前端传递数据) (1)增加路由&am…...
如何做好服务性能测试
一、什么是性能测试 新功能上线或切换底层数据库或扩容调优,根据实际业务场景的需要,做必要的性能压测,收集性能数据,作为上线的基准报告。 性能测试一般分一下几个阶段: 1. 性能测试 并发量小(jmeter 并…...
速通蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统
一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中&a…...
虚拟拍摄,如何用stable diffusion制作自己的形象照?
最近收到了某活动的嘉宾邀请,我将分享: 主题:生成式人工智能的创新实践 简要描述:从品牌营销、智能体、数字内容创作、下一代社区范式等方面,分享LLM与图像等生成式模型的落地应用与实践经验。 领域/研究方向ÿ…...
开启AI创新之旅!“华为云杯”2023人工智能应用创新大赛等你来挑战
简介 近年来,人工智能技术的发展如日中天,深刻地改变着我们的生活方式和产业格局。 为了培养AI人才,持续赋能AI企业,推进国家新一代人工智能开放创新平台建设,打造更加完善的AI技术创新生态,华为…...
npm和node版本升级教程
cmd中查看本地安装的node版本 node -v //查询node的位置 where node2.官网下载所需要的node版本,安装在刚查出来的文件夹下,即覆盖掉原来的版本 3.查看node版本是否已经更新 4.查看npm版本是否和node版本相匹配 cnpm install -g npm...
C++入门篇9---list
list是带头双向循环链表 一、list的相关接口及其功能 1. 构造函数 函数声明功能说明list(size_type n,const value_type& valvalue_type())构造的list中包含n个值为val的元素list()构造空的listlist(const list& x)拷贝构造list(InputIterator first, InputIterator…...
STM32基于CubeIDE和HAL库 基础入门学习笔记:物联网项目开发流程和思路
文章目录: 第一部分:项目开始前的计划与准备 1.项目策划和开发规范 1.1 项目要求文档 1.2 技术实现文档 1.3 开发规范 2.创建项目工程与日志 第二部分:调通硬件电路与驱动程序 第三部分:编写最基础的应用程序 第四部分&…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
