当前位置: 首页 > news >正文

嵌入式Linux驱动开发(二)LED驱动

1. Linux下LED驱动原理

与裸机区别在于,编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写,linux下需要经过MMU。

1.1 地址映射相关概念

1)MMU(Memory Manage Unit - 内存管理单元)
①完成虚拟空间到物理空间映射。(地址映射)
②内存保护,设置存储器访问权限,设置虚拟存储空间缓冲特性。
2)虚拟地址(VA):对于x位处理器,虚拟地址范围为2^x Byte。比如32位处理器,对应4GB虚拟地址范围。

  我的板子上512MB的DDR3就是物理内存,经过MMU映射到4GB的虚拟空间。linux内核启动后会初始化MMU,此后CPU访问的都是虚拟地址。

1.2 物理内存和虚拟内存的转换函数

1)ioremap:用于获取指定物理地址空间对应的虚拟地址空间。

<以对IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器操作为例>
<映射后对SW_MUX_GPIO1_IO03的操作就是对该寄存器的操作>
#define SW_MUX_GPIO1_IO03_BASE (0X020E0068)                 <寄存器物理地址>
static void __iomem* SW_MUX_GPIO1_IO03;                     <虚拟地址对应的指针>
SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4);     <进行转换,由于6ULL一个寄存器4字节,所以映射长度为4>

2)ioremap:卸载驱动时释放ioremap做的映射。

iounmap(SW_MUX_GPIO1_IO03);

1.3 I/O内存访问函数

I/O端口:外部寄存器或内存映射到IO空间,称为I/O端口。
I/O内存:外部寄存器或内存映射到内存空间。(ARM下只有I/O内存)
在上面1.2节完成了物理地址和虚拟地址的映射,但是不建议直接对映射后的地址进行读写,使用以下函数进行:
1)读操作函数

<--8-16-32bit 读操作函数:addr为要读取的内存地址-->
u8 readb(const volatile void __iomem *addr)     
u16 readw(const volatile void __iomem *addr)
u32 readl(const volatile void __iomem *addr)

2)写操作函数

<--8-16-32bit 写操作函数:value为写入值,addr为要写入的内存地址-->
void writeb(u8 value, volatile void __iomem *addr)
void writew(u16 value, volatile void __iomem *addr)
void writel(u32 value, volatile void __iomem *addr)

2. Linux下LED驱动流程

<---初始化并注册驱动--->
<led_init:内存映射,初始化led时钟,IO复用和属性,LED初始状态,注册字符设备驱动>
module_init(led_init)<---向led设备写入,进行亮灭控制--->
led_writeled_switch<---关闭led设备,注销驱动--->
<led_exit:取消内存映射,注销字符设备驱动>
module_exit(led_exit)

测试:
在这里插入图片描述

相关文章:

嵌入式Linux驱动开发(二)LED驱动

1. Linux下LED驱动原理 与裸机区别在于&#xff0c;编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写&#xff0c;linux下需要经过MMU。 1.1 地址映射相关概念 1&#xff09;MMU&#xff08;Memory Manage Unit - 内存管理单元&#xff09;&#xff1a; …...

C++学习

强制转换运算符 C 引入了四种不同的强制转换运算符以进行强制转换&#xff1a; const_caststatic_castreinterpret_castdynamic_cast C语言强制类型转换缺点&#xff1a; 主要是为了克服C语言强制类型转换的以下三个缺点。 没有从形式上体现转换功能和风险的不同。 例如&am…...

JavaEE简单示例——依赖注入

简单介绍&#xff1a; 首先我们要知道&#xff0c;依赖注入就是赋值&#xff0c;带着这句话去理解依赖注入就非常的简单了&#xff0c;将文中所有的依赖注入全部脑部替换成给属性赋值&#xff0c;再去理解依赖注入的概念。 依赖注入&#xff08;DI&#xff09;是指IoC容器在运…...

大数据框架之Hive: 第7章 综合案例练习(初级)

第7章 综合案例练习&#xff08;初级&#xff09; 一 环境准备 1.1 建表语句 hive> -- 创建学生表 DROP TABLE IF EXISTS student; create table if not exists student_info(stu_id string COMMENT 学生id,stu_name string COMMENT 学生姓名,birthday string COMMENT 出…...

kafka:linux 安装 kafka集群

kafka运行依赖于 jdk、zookeeper&#xff0c;kafka可视化工具选择kafka-eagle。所以要装的组件有&#xff1a;jdk、zookeeper、kafka、kafka-eagle一、安装jdk下载linux版本的jdk包&#xff0c;比如&#xff1a;jdk-8u192-linux-x64.tar.gz。将其复制到 /opt 目录下并解压&…...

springboot实现Hessian协议的RPC服务

背景 这段时间在公司接手了一个新项目&#xff0c;看到一段代码非常奇怪的&#xff0c;研究了好久。内容大概是这样 public void getUser (int id) {userService.getById(id); }当我点击这个方法进去的时候&#xff0c;我发现这个UserService类居然是导入jar包的一个接口&…...

2-6 SpringCloud快速开发入门: Eureka 服务注册中心发现与消费服务

接上一章节向Eureka 服务注册中心注册服务&#xff0c;这里讲讲Eureka 服务注册中心发现与消费服务 Eureka 服务注册中心发现与消费服务 我们已经搭建一个服务注册中心&#xff0c;同时也向这个服务注册中心注册了服务&#xff0c;接下来我们就可以发现和消费服务了&#xff0…...

Java-Web之s2-001与CommonsCollections

本文源自我个人入坑Java-Web安全的一点小经验&#xff0c;献给那些看得懂java代码但不知道从哪里入手代审的师傅们&#xff1a;&#xff09; Struts2之s2-001 环境配置 说说环境配置的问题&#xff0c;大多数人对漏洞复现的恐惧感还是来自于环境的配置&#xff0c;也许配了大…...

【JavaSE】数组的定义和使用(下)

数组的定义和使用&#xff08;下&#xff09;4. 数组练习4.1 模拟实现toString4.2 数组拷贝4.3 比较两个数组是否相同4.4 填充数组4.3 求数组中元素的平均值4.4 查找数组中指定元素&#xff08;顺序查找&#xff09;4.5 查找数组中指定元素&#xff08;二分查找&#xff09;4.6…...

Oracle 实现对全局错误语句的审计监控 ORA- alert

--将所有数据库ora-错误写入表create table error_tab (username varchar2(4000), d_current_nr_error varchar2(4000), ora_server_error_msg varchar2(4000), full_text varchar2(4000),errdate date);create or replace trigger error_triggerafter servererror on database…...

React解决样式冲突问题的方法

React解决样式冲突问题的方法 前言&#xff1a; 1、React最终编译打包后都在一个html页面中&#xff0c;如果在两个组件中取一样类名分别引用在自身&#xff0c;那么后者会覆盖前者。 2、默认情况下&#xff0c;只要导入了组件&#xff0c;不管组件有没有显示在页面中&#x…...

Go项目(用户操作微服务)

简介 用户留言、收藏、修改收货地址等&#xff0c;统一放在用户操作微服务这里按照业务类型划分微服务表设计&#xff0c;三张表// 用户收藏 type UserFav struct {BaseModel// 联合索引 idx_user_goods&#xff0c;且唯一User int32 gorm:"type:int;index:idx_user_goo…...

Spring Boot统一功能处理

目录 一、统一用户登录权限验证 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置 1.3 统一访问前缀 二、统一异常处理 三、统一数据格式返回 一、统一用户登录权限验证 1.1 自定义拦截器 拦截器是一个普通的类&#xff0c;需要实现HandlerInterceptor接口并重写pre…...

ETCD多次出现CONTEXT DEADLINE EXCEEDED

roothqa-master-01:~# etcdctl --endpoints$ETCD_ENDPOINTS member list --write-outtable {“level”:“warn”,“ts”:“2020-03-23T14:19:45.0330800”,“caller”:“clientv3/retry_interceptor.go:61”,“msg”:“retrying of unary invoker failed”,“target”:“endpoi…...

git 提交 多人开发避免冲突

代码正常提交 git add . git commit -m ‘备注信息’ git status 查看本地提交状态 git pull 拉取代码 git push origin master 指定远程仓库名和分支名 ‘’ 如果多人开发 A和B 提交避免冲突 B拉取代码修改内容直接提交后 A也修改了内容在git add / git commit / git pull / g…...

求职复盘:干了四年外包出来,面试5次全挂

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…...

AXI总线核心解读---基于官方文档

AXI总线 何处使用AXI ZYNQ异构芯片&#xff0c;内部总线使用的AXI总线纯FPGA的IP接口也要用高速接口&#xff0c;DDR&#xff08;AXI、传统&#xff09;等模块都有涉及到 什么是AXI总线 AXI的三种形式: AXI-FULL&#xff1a;高性能的存储器映射需求—可以256个以内发送 存储器…...

【Linux修炼】15.进程间通信

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程间通信进程间通信一.理解进程间通信1.1 什么是通信1.2 为什么要有通信1.3 如何进行进程间通信二.管道2.1 匿名管道2.2 匿名管道编码部分2.3 管道的特点2.4 如何理解命令行中的管道2.5 进程控制多个子进程三.命名管道3.…...

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…...

如何优化查询大数据量的表

给你100万条数据的一张表&#xff0c;你将如何查询优化&#xff1f;1.两种查询引擎查询速度&#xff08;myIsam 引擎 &#xff09;InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多…...

SAM-Veteran拆解:多任务强化学习(GRPO)如何教会MLLM“见好就收”?

SAM-Veteran技术解析&#xff1a;多任务强化学习如何赋予MLLM智能决策能力 当你在Photoshop中用魔棒工具选择某个区域时&#xff0c;是否经历过反复点击"增加选区"却始终无法精准捕捉边缘的挫败感&#xff1f;这种"永远在修正"的困境正是计算机视觉领域长期…...

如何构建大型可维护的Vugu项目:Go WebAssembly UI库最佳实践指南

如何构建大型可维护的Vugu项目&#xff1a;Go WebAssembly UI库最佳实践指南 【免费下载链接】vugu Vugu: A modern UI library for GoWebAssembly (experimental) 项目地址: https://gitcode.com/gh_mirrors/vu/vugu Vugu是一个现代化的Go语言WebAssembly UI库&#xf…...

Nextcloud Android文件同步革命:实现跨设备无缝数据访问的完整指南 [特殊字符]

Nextcloud Android文件同步革命&#xff1a;实现跨设备无缝数据访问的完整指南 &#x1f4f1; 【免费下载链接】android &#x1f4f1; Nextcloud Android app 项目地址: https://gitcode.com/gh_mirrors/andr/android Nextcloud Android应用是一款功能强大的开源云存储…...

噪声系数测试中的Y因子:为什么ENR超噪比是你的关键指标?

噪声系数测试中的Y因子&#xff1a;为什么ENR超噪比是你的关键指标&#xff1f; 在无线通信系统的设计与验证中&#xff0c;噪声系数&#xff08;Noise Figure&#xff09;是衡量接收机灵敏度的核心参数之一。而Y因子法作为噪声系数测试的黄金标准&#xff0c;其准确度很大程度…...

OnTopReplica组切换模式揭秘:自动轮换多个监控窗口的完整指南

OnTopReplica组切换模式揭秘&#xff1a;自动轮换多个监控窗口的完整指南 【免费下载链接】OnTopReplica A real-time always-on-top “replica” of a window of your choice (on Windows). 项目地址: https://gitcode.com/gh_mirrors/on/OnTopReplica OnTopReplica是一…...

在openKylin下安装配置GitLab遇到的问题及解决方案(v0.1.0)

作者&#xff1a;沈传越 明德融创工作室&#xff08;Minter Fusion Studio, MFS&#xff09; 出品 本文安装的GitLab-ce 15.10.0版。操作系统openKylin 2.0 SP2。 一、安装GitLab-ce依赖软件时报错 1. 错误描述 在执行sudo apt-get install curl openssh-server ca-certifi…...

Shawl:Windows服务化的技术桥梁

Shawl&#xff1a;Windows服务化的技术桥梁 【免费下载链接】shawl Windows service wrapper for arbitrary commands 项目地址: https://gitcode.com/gh_mirrors/sh/shawl 问题引入&#xff1a;程序后台运行的困境 在Windows环境中&#xff0c;让应用程序脱离终端独立…...

终极游戏画质优化指南:3步让所有显卡享受DLSS级性能提升

终极游戏画质优化指南&#xff1a;3步让所有显卡享受DLSS级性能提升 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler 还在为显卡性能…...

MySQL数据同步神器Canal实战:从配置到Java客户端开发全流程

MySQL数据同步神器Canal实战&#xff1a;从配置到Java客户端开发全流程 在数据驱动的时代&#xff0c;实时数据同步已成为现代应用架构的核心需求。想象一下电商平台的库存实时更新、金融系统的交易流水同步、物流系统的状态追踪——这些场景都离不开高效可靠的数据同步机制。…...

OpenClaw多任务测试:Qwen3-32B在RTX4090D上的并发表现

OpenClaw多任务测试&#xff1a;Qwen3-32B在RTX4090D上的并发表现 1. 测试背景与实验设计 去年冬天第一次接触OpenClaw时&#xff0c;我就被它的"多线程任务调度"特性吸引。作为一个经常需要同时处理文件整理、邮件发送和截图识别的开发者&#xff0c;这种能力理论…...