正点原子嵌入式linux驱动开发——设备树下LED驱动

news2024/11/18 1:40:23

经过对设备树的学习以及驱动开发中常用的OF函数介绍,本篇笔记将之前的新字符设备驱动的LED,换成设备树形式

设备树LED驱动原理

在之前的新字符设备驱动实验中,直接在驱动文件newchrled.c中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。现在使用设备树来向Linux内核传递相关的寄存器物理地址,Linux驱动文件使用上一篇笔记中重点学习讲解的OF函数从设备树中获取所需的属性值,然后使用获取到的属性值来初始化相关的IO。本章实验重点内容如下:

  1. 在stm32mp157d-atk.dts文件中创建相应节点设备。
  2. 编写驱动程序,获取设备树种相关属性值。
  3. 使用获取的有关属性值来初始化LED使用的GPIO。

硬件原理图

这个就是之前的LED灯的原理图,没有区别,这里不再展示。

实验程序

修改设备树文件

在根节点“/”下创建一个名为“stm32mp1_led”的子节点,打开stm32mp157d-atk.dts文件,在根节点“/”最后面输入如下所示内容:

示例代码24.3.1.1 stm32mp1_led节点 
1 stm32mp1_led { 
2     compatible = "atkstm32mp1-led"; 
3     status = "okay"; 
4     reg = <0X50000A28 0X04 /* RCC_MP_AHB4ENSETR */ 
5            0X5000A000 0X04 /* GPIOI_MODER */ 
6            0X5000A004 0X04 /* GPIOI_OTYPER */ 
7            0X5000A008 0X04 /* GPIOI_OSPEEDR */ 
8            0X5000A00C 0X04 /* GPIOI_PUPDR */ 
9            0X5000A018 0X04 >; /* GPIOI_BSRR */ 
10 };

第2行,属性compatible设置stm32mp1_led节点兼容为“atkstm32mp1-led”。

第3行,属性status设置状态为“okay”。

第4-9行,reg属性,非常重要!reg属性设置了驱动里面所要使用的寄存器物理地址,比如第4行的“0X50000A28 0X04”表示STM32MP1的RCC_MP_AHB4ENSETR寄存器,其中寄存器地址为0X50000A28,长度为4个字节。

设备树修改完成以后输入如下命令重新编译一下
stm32mp157d-atk.dts:

make dtbs

编译完成后得到stm32mp157d-atk.dtb,使用新的stm32mp157d-atk.dtb启动Linux内核。Linux启动成功以后进入到/proc/device-tree/目录中查看是否有“stm32mp1_led”这个节点,结果如下图所示:
stm32mp1_led节点
如果没有“stm32mp1_led”节点的话可以重点检查下面两点:

  1. 检查设备树修改是否成功,也就是stm32mp1_led节点是否为根节点“/”的子节点。
  2. 检查是否使用新的设备树启动的Linux内核。

可以进入到stm32mp1_led的目录中,使用cat查看各个属性值。

LED灯驱动编写

在之前已经编写好的LED驱动基础上,在dtsled_dev结构体中,加上struct device_node* nd的设备节点;然后需要在驱动的led_init函数中,加上获取设备树属性的操作:主要是通过dtsled.nd(之前的dtsled_dev结构体)来接住of_find_node_by_path(“/stm32mp1_led”)的返回值,从而获得LED节点;而后通过property*的proper来接住of_find_property返回值,获取compatible属性;int ret来接住of_property_read_string返回值,获取status属性值;再用ret接住of_property_read_u32_array返回值,获取reg属性值,存放到regdata数组中;以上属性值全部存到了dtsled.nd之中就获得了LED的相关寄存器,之后通过of_iomap来获取dtsled.nd的reg属性以及内存映射,从而获得了要操作的寄存器地址。

编写测试APP

这个可以直接用之前的ledApp.c文件。

编译驱动程序和测试APP

编译驱动

在Makefile文件中,将obj-m的值改为dtsled.o即可,然后通过“make -j8”就可以编译,最终得到dtsled.ko文件。

编译测试APP

可以通过如下命令编译:

arm-none-linux-gnueabihf-gcc ledApp.c -o ledApp

运行测试

将之前编译得到的dtsled.ko和ledApp拷贝到rootfs/lib/modules/5.4.31目录中,然后重启开发板,进入/lib/modules/5.4.31目录,输入如下命令加载dtsled.ko:

depmod //第一次加载驱动的时候需要运行此命令
modprobe dtsled //加载驱动

加载成功后会出现如下信息:
驱动加载成功后输出信息
从上图中可以看出,stm32mp1_led这个节点找到了,并且compatible属性值为“atkstm32mp1-led”,status属性值为“okay”,reg属性的值为“0X50000A28 0X4 0X5000A000 0X4 0X5000A004 0X4 0X5000A008 0X4 0X5000A00C 0X4 0X5000A018 0X4”,这些都和设置的设备树一致。

加载成功后可以通过如下命令打开和关闭LED:

./ledApp /dev/dtsled 1 //打开LED灯
./ledApp /dev/dtsled 0 //关闭LED灯

可以通过如下命令卸载驱动:

rmmod dtsled.ko

总结

这一篇笔记中,主要的区别就是在stm32mp157d-atk.dts文件中,在"/"根节点下添加了LED的设备树节点,然后在驱动程序中增加了对应了结构体成员device_node* nd,然后在led_init中通过OF函数获取属性值,主要是reg属性值来读取LED的相关寄存器。

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

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

相关文章

【前端学习】—Vue生命周期(十七)

【前端学习】—Vue生命周期&#xff08;十七&#xff09; 一、Vue生命周期 二、Vue父子组件生命周期调用顺序 三、Vue中在哪个生命周期内调用异步请求

【SpringCloud微服务项目实战-mall4cloud项目(4)】——mall4cloud-rbac

mall4cloud-rbac角色权限访问控制模块 系统架构与模块介绍系统架构rbac模型介绍 相关代码权限校验接口代码 补充 代码地址 github地址 fork自github原始项目 gitee地址 fork自gitee原始项目 系统架构与模块介绍 系统架构 从图中可以看到&#xff0c;微服务集群中&#xff0c;…

Netty系列教程之NIO基础知识

近30集的孙哥视频课程&#xff0c;看完一集整理一集来的&#xff0c;内容有点多&#xff0c;请大家放心食用~ 1. 网络通讯的演变 1.1 多线程版网络通讯 在传统的开发模式中&#xff0c;客户端发起一个 HTTP 请求的过程就是建立一个 socket 通信的过程&#xff0c;服务端在建立…

直线导轨在喷涂行业中的应用场景

直线导轨因其具有精度高、速度快、刚性强、使用寿命长等特点被广泛应用在各行各种中&#xff0c;其中&#xff0c;在喷涂行业中的应用最为广泛&#xff0c;以下是直线导轨在喷涂行业中的应用场景&#xff1a; 1、平面喷涂&#xff1a;直线导轨可以应用在各种机械加工的平面&…

将Sketch文件转化为PSD文件的简单在线工具!

设计工作不仅需要UI设计工具&#xff0c;还需要Photoshop。常见的UI设计工具Sketch与Photoshop软件不兼容。如果你想在实际工作中完成Sketch转psd&#xff0c;你需要使用其他软件进行转换。但是在转换过程中容易丢失文件&#xff0c;导致同样的工作需要重复多次才能完成&#x…

图论相关算法

一、迪杰斯特拉(Dijkstra)算法 迪杰斯特拉算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题。这是一个贪心算法。 1.核心思想 &#xff08;1&#xff09;每次选中一个点&#xff0c;这个点满足两个条件&#xff1a; 未被选过距离最短 &#xff08;2&#xf…

Gazebo仿真 【ROS: noetic】

参考链接&#xff1a;《ROS机器人开发实践》_胡春旭 目标&#xff1a; 了解如何使用URDF文件创建一个机器人模型&#xff0c;然后使用xacro文件优化该模型&#xff0c;并且放置到rvizArbotiX或Gazebo仿真环境中&#xff0c;以实现丰富的ROS功能。 4.5 Gazebo仿真环境 1&#x…

kaggle新赛:UBC卵巢癌亚型分类和异常检测大赛【图像分类】

赛题名称&#xff1a;UBC Ovarian Cancer Subtype Classification and Outlier Detection (UBC-OCEAN) 赛题链接&#xff1a;https://www.kaggle.com/competitions/UBC-OCEAN 赛题背景 卵巢癌是女性生殖系统最致命的癌症。目前&#xff0c;卵巢癌诊断依赖病理学家评估亚型。…

MySQL的自增id会用完吗?用完怎么办?

MySQL作为最常用的关系型数据库&#xff0c;无论是在应用还是在面试中都是必须掌握的技能。 目录 一、MySQL自增主键会用完吗 二、MySQL自增主键用完会怎样 1.程序员自己设置的自增主键 2.程序员没有设置自增主键&#xff0c;mysql自动创建row_id 三、mysql中还有哪些自增…

IF: 22.1, 中科院1区TOP刊被剔除WOS (10月SCI/SSCI目录已更新)~

2023年10月17日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 此次更新后SCIE期刊目录共包含9485本期刊&#xff0c;SSCI期刊目录共包含3551本期刊。此次SCIE & SSCI期刊目录更新&#xff0c;与上次更新&#xff08;2023年9月&#xff09;相比&#xff0c;共有7…

电子期刊制作宝典,让你成为专业行家

电子期刊作为一种新兴的媒体形式&#xff0c;越来越受到人们的喜爱。它不仅方便快捷&#xff0c;而且可以随时随地阅读&#xff0c;不受时间和空间的限制。那么&#xff0c;如何制作一份高质量的电子期刊呢&#xff1f; 1.首先打开FLBOOK电子杂志平台 2.然后点击模板选择电子期…

springBoot--web开发--WebMvcAutoConfiguration原理

WebMvcAutoConfiguration原理 自动配置类的生效条件hiddenHttpMethodFilter和formContentFilter的作用WebMvcConfigurer的作用 自动配置类的生效条件 点击ctarln 搜索类WebMvcAutoConfiguration hiddenHttpMethodFilter和formContentFilter的作用 hiddenHttpMethodFilter&am…

CLIP模型原理

CLIP模型 CLIP(Contrastive Language-Image Pre-Training) 模型是 OpenAI 在 2021 年初发布的用于匹配图像和文本的预训练神经网络模型&#xff0c;是近年来在多模态研究领域的经典之作。OpenAI 收集了 4 亿对图像文本对&#xff08;一张图像和它对应的文本描述&#xff09;&a…

UPS设备的最新管理方法,简单高效!

随着信息技术的快速发展&#xff0c;UPS监控系统变得至关重要。系统用于监视、管理和维护机房中的UPS设备&#xff0c;以确保稳定的电力供应&#xff0c;保护敏感的电子设备和数据中心运营。 UPS监控系统提供了对电力系统的关键可见性&#xff0c;使运维团队能够预测和解决潜在…

家政系统预约小程序具备哪些功能?

预约家政小程序有这么大的市场需求加上这么多的好处&#xff0c;相信未来发展前景不错。也必将吸引很多商家投资者着手开发属于自己的上门家政APP小程序软件&#xff0c;在实际的开发过程中需要具备哪些功能呢&#xff1f; 一、用户端功能&#xff1a; 1. 用户注册登录&#x…

绕过防火墙

1.pikuchu靶场 位置 该文件 然后找到install 文件 初始化 创建 就ok了 安全狗搭建 bug解决 进入apache目录 命令 安全狗安装 重启web服务 绕过 前端 绕过 waf 阻拦 脏数据 成功 二.yakit 中国版的bp

源码编译安装部署lnmp

源码编译安装部署lnmp 文章目录 源码编译安装部署lnmp1.简介&#xff1a;2.环境说明&#xff1a;3.部署前的准备工作4.安装nginx4.1.进入官网拉取nginx源码包4.2.通过IP地址访问nginx的web页面 5.安装mysql5.1.安装依赖包5.2.创建用户和组5.3.下载源码包并解压到/usr/local/5.4…

在数组中合并相同id数据,并且数据中某一字段不一致也统一合并进去

封装的合并的函数 function formateArray(data:any){// ts-ignorelet res data.reduce((ac,a) > {// ts-ignorelet index ac.findIndex(x > x.id a.id);index -1 ? ac.push({...a}) : ac[index] {...ac[index],...a};return ac;},[])return res;}使用 allData 原始…

忆联分布式数据库存储解决方案,助力MySQL实现高性能、低时延

据艾瑞咨询研究院《2022 年中国数据库研究报告》显示&#xff0c;截止2021年&#xff0c;中国分布式数据库占比达到 20%左右&#xff0c;主要以 MySQL 和 PostgreSQL 为代表的开源数据库为主。MySQL 作为备受欢迎的开源数据库&#xff0c;当前已广泛应用于互联网、金融、交通、…

(Python)在Matplotlib中对图像坐标轴进行log转换

对于跨度很大其分布离散的数据&#xff0c;常用log转换来缩写其差距&#xff0c;呈现在图上的效果也更好&#xff0c;比如在绘制转录组的表达量数据时&#xff0c;常用log转换之后的值进行绘制。在matplotlib中&#xff0c;支持在绘图时对数据进行log转换&#xff0c;根据log转…