驱动开发点亮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.创建项目工程与日志 第二部分:调通硬件电路与驱动程序 第三部分:编写最基础的应用程序 第四部分&…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
uniapp获取当前位置和经纬度信息
1.1. 获取当前位置和经纬度信息(需要配置高的SDK) 调用uni-app官方API中的uni.chooseLocation(),即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...
信息系统分析与设计复习
2024试卷 单选题(20) 1、在一个聊天系统(类似ChatGPT)中,属于控制类的是()。 A. 话语者类 B.聊天文字输入界面类 C. 聊天主题辨别类 D. 聊天历史类 解析 B-C-E备选架构中分析类分为边界类、控制类和实体类。 边界…...