STM32MP157驱动开发——LED驱动(设备树)

news2024/10/4 14:52:16

文章目录

  • 设备树驱动模型
  • 如何使用设备树写驱动程序
    • 设备树节点要与 platform_driver 能匹配
    • 设备树节点指定资源,platform_driver 获得资源
  • LED 模板驱动程序的改造:设备树驱动模型
    • 修改设备树,添加 led 设备节点
    • 修改 platform_driver 的源码
    • 编译测试
  • /sys目录
    • 设备树的信息
    • platform_device 的信息

阅读STM32MP157驱动开发——LED驱动(总线设备架构)可知,利用设备总线写的驱动代码,虽然利用platform_device结构体去定义设备资源可以避免创建太多的结构体,但是由于这些资源文件写在linux内核中,导致linux冗余,所以利用设备树管理这些资源,通过配置文件的形式在启动内核时会把设备树在内存中的地址告诉内核。

设备树相关的基础知识可以阅读博文:STM32MP157驱动开发——设备树知识

设备树驱动模型

对比总线设备架构:
在这里插入图片描述
设备树模型:
在这里插入图片描述

  • 通过配置文件──设备树来定义“资源”。
  • 无冗余代码,修改引脚时只需要修改 dts 文件并编译得到 dtb 文件,把它传给内核。
  • 无需重新编译内核/驱动。

核心永远是 file_operations 结构体【 在probe 函数里分配/设置/ 注册 file_operations 结构体】。上述方法,只是指定“硬件资源”的方式不一样。platform_device/platform_driver 只是编程的技巧,不涉及驱动的核心。

如何使用设备树写驱动程序

主要有两个步骤:

  1. 设备树节点要与 platform_driver 能匹配

  2. 设备树节点指定资源,platform_driver 获得资源

设备树节点要与 platform_driver 能匹配

① 设备树要有 compatible 属性,它的值是一个字符串
② platform_driver 中要有 of_match_table,其中一项的.compatible 成员设置为一个字符串
③ 上述 2 个字符串要一致。

实例:
在这里插入图片描述

设备树节点指定资源,platform_driver 获得资源

  1. 如果在设备树节点里使用reg 属性 , 那么内核生成对应的platform_device 时会用 reg 属性来设置 IORESOURCE_MEM 类型的资源。
  2. 如果在设备树节点里使用 interrupts 属性,那么内核生成对应的platform_device 时会用 reg 属性来设置 IORESOURCE_IRQ 类型的资源。对于 interrupts 属性,内核会检查它的有效性,所以不建议在设备树里使用该属性来表示其他资源。
  3. 如果驱动程序中根据 pin 属性来确定引脚,那么我们就在设备树节点中添加 pin 属性。

实例:

#define GROUP_PIN(g,p) ((g<<16) | (p))
100ask_led0 {
	compatible =100ask,led”;
	pin = <GROUP_PIN(5, 3)>;
};

驱动程序中,可以从 platform_device 中得到 device_node,再用of_property_read_u32 得到属性的值:

struct device_node* np = pdev->dev.of_node;
int led_pin;
int err = of_property_read_u32(np, “pin”, &led_pin);

LED 模板驱动程序的改造:设备树驱动模型

修改设备树,添加 led 设备节点

进入ubuntu系统中存放的Linux内核文件,找到单板所用的设备树文件,在它的根节点下添加如下内容:

define GROUP_PIN(g,p) ((g<<16) | (p))

/ {
        my_led@0 {
                compatible = "myled,leddrv";
                pin = <GROUP_PIN(3, 1)>;
        };

        my_led@1 {
                compatible = "myled,leddrv";
                pin = <GROUP_PIN(5, 8)>;
        };

};

修改 platform_driver 的源码

找到 chip_demo_gpio.c,在结构体变量chip_demo_gpio_driver前插入如下内容,并修改chip_demo_gpio_driver变量内容:

static const struct of_device_id my_leds[] = {
    { .compatible = "myled,leddrv" },
    { },
};

static struct platform_driver chip_demo_gpio_driver = {
    .probe      = chip_demo_gpio_probe,
    .remove     = chip_demo_gpio_remove,
    .driver     = {
        .name   = "my_led",
        .of_match_table = my_leds,
    },
};

指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有 compatile 属性,并且其值等于“myled,leddrv”,
就会导致 probe 函数被调用

其他代码和STM32MP157驱动开发——LED驱动(总线设备架构)内一样

编译测试

首先要设置 ARCH、CROSS_COMPILE、PATH 这三个环境变量后,进入 ubuntu 上板子内核源码的目录,在Linux内核源码根目录下,执行如下命令即可编译 dtb 文件:

make dtbs V=1

编译好的文件在路径由DTC指定,在 arch/arm64/boot/dts 目录下,移植到开发板的共享文件夹中,先保存源文件,然后覆盖源文件,重启后会挂载新的设备树,进入该目录查看是否有新添加的设备节点

cd /sys/firmware/devicetree/base 
ls 节点名称

查看/sys/devices/platform 目录下有无对应的 platform_device

加载驱动、测试驱动:

//按顺序加载模块
insmod leddrv.ko
insmod chip_demo_gpio.ko
echo "7 4 1 7" > /proc/sys/kernel/printk //打开内核输出信息
ls /dev/my_led*	//显示注册了的节点
./ledtest /dev/my_led0 on  //打开
./ledtest /dev/my_led0 off  //熄灭

/sys目录

/sys 目录下有很多内核、驱动的信息。

设备树的信息

以下目录对应设备树的根节点,可以从此进去找到自己定义的节点。

cd /sys/firmware/devicetree/base/

节点是目录,属性是文件。

  • 属性值是字符串时,用 cat 命令可以打印出来;
  • 属性值是数值时,用hexdump 命令可以打印出来。

platform_device 的信息

以下目录含有注册进内核的所有 platform_device:

/sys/devices/platform

一个设备对应一个目录
在这里插入图片描述
进入某个目录后,如果它有“driver”子目录,就表示这个 platform_device 跟某个 platform_driver 配对了。一个平台设备只能配对一个平台驱动,一个平台驱动可以配对多个平台设备。

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

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

相关文章

【论文阅读】聚集多个启发式信号作为监督用于无监督作文自动评分

摘要 本文提出一个新的无监督的AES方法ULRA&#xff0c;它不需要真实的作文分数标签进行训练&#xff1b;ULRA的核心思想是使用多个启发式的质量信号作为伪标准答案&#xff0c;然后通过学习这些质量信号的聚合来训练神经自动评分模型。为了将这些不一致的质量信号聚合为一个统…

springboot 多数据源配置

1.引入相关pom文件 <!-- spring boot 启动 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><artifactId>log4j-api</artifactId&…

7.5Java EE——Bean的装配方式

一、基于XML的装配 两种基于XML的装配方式 在基于XML的装配就是读取XML配置文件中的信息完成依赖注入&#xff0c;Spring容器提供了两种基于XML的装配方式&#xff0c;属性setter方法注入和构造方法注入。下面分别对这两种装配方式进行介绍。 a.属性setter方法注入 属性sett…

Vuex 数据共享

文章目录 前言Vuex项目的创建state 配置项getters 配置项mutations 配置项actions 配置项 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 体现数据共享的概念 所有组件都可以使用那数据 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

时序数据库 TDengine 与金山云两大产品完成兼容互认证

万物互联时代&#xff0c;企业数字化转型和政企上云如火如荼。在云计算迎来重大发展机遇的同时&#xff0c;数据库在企业数字化转型中也扮演着重要的角色——随着业务量的激增&#xff0c;数据库的弹性扩容、容灾备份等需求逐渐显现&#xff0c;在此挑战下&#xff0c;时序数据…

前端学习记录~2023.7.17~CSS杂记 Day9

前言一、浮动1、使盒子浮动起来2、清除浮动3、清除浮动元素周围的盒子&#xff08;1&#xff09;clearfix 小技巧&#xff08;2&#xff09;使用 overflow&#xff08;3&#xff09;display: flow-root 二、定位1、定位有哪些2、top、bottom、left 和 right3、定位上下文4、介绍…

jupyter notebook更换虚拟环境(内核)

jupyter notebook更换虚拟环境&#xff08;内核&#xff09; 创建一个新的虚拟环境 # stk_env 虚拟环境的名字&#xff0c;任取。 conda create -n stkenv python3.9激活虚拟环境 conda activate stkenv安装ipykernel # 为该虚拟环境&#xff0c;安装内核。 conda install -c a…

rabbitmq模块启动报java.net.SocketException: socket closed的解决方法

问题 最近在接手一个项目时&#xff0c;使用的是spring-cloud微服务构架&#xff0c;mq消息消费模块是单独一个模块&#xff0c;但启动这个模块一直报如下错误&#xff1a; java.net.SocketException: socket closed 这个错误是这个模块注册不到nacos报的错&#xff0c;刚开…

FCOS 论文学习

1. 解决了什么问题&#xff1f; 之前的目标检测器如 RetinaNet、SSD、YOLOv3 都依赖于 anchors。基于 anchors 的检测器有如下三个缺点&#xff1a; 检测表现对于 anchors 的大小、宽高比和数量等超参数很敏感&#xff1b;即使精心设计了 anchors&#xff0c;但由于大小和宽高…

架构训练营学习笔记:4-2 存储架构模式之复制架构

高可用的关键指标 问题&#xff1a;分为故障跟灾难。不是有了多活架构就不在用复制架构 &#xff0c;还是之前的合适原则&#xff1a;多活架构的技术复杂度 跟成本都比复制架构高。 高可用的关键指标 恢复时间目标(RecoveryTimeObjective&#xff0c;RTO)指为避免在灾难发生后…

rabbitmq部署(docker方式)

前言&#xff1a;rabbitmq一旦有漏洞&#xff0c;版本升级麻烦&#xff0c;于是改为docker部署 环境&#xff1a;centos7 #停掉之前的服务 systemctl stop rabbitmq-server systemctl disable rabbitmq-server 查了官网&#xff0c;当前3.11.x 最高版本是3.11.19, 虽然3.12…

【开源分享】在线客服系统源代码-thinphp网站在线客服系统源码(附源码完整搭建教程)...

本文的核心是一个多国语言在线客服聊天系统源码。我们将在这里保持非常简单。 这是一款旧版本的PHP客服源码。 基于ThinkPHP5 workerman&#xff0c;整体架构比较老&#xff0c;PHP客服端以及界面等需要在php-fpm下运行&#xff0c;即时通讯websocket服务端需要命令行执行。 源…

N-gram模型学习

网上有很多比较细节比较复杂比较清晰的介绍&#xff0c;我这里就不再细细的描述了&#xff0c;之前看文献的时候看到了这个模型&#xff0c;脑子里又没有印象&#xff0c;结果发现是python的学习范畴。 总的来说&#xff0c;这是一种文字&#xff0c;甚至可以上升到符号关联性…

基于Python的工业图像异常检测基础技术详解

引言 博文字数7000&#xff0c;建议阅读时间20分钟。 这篇博客对当前几种典型的图像异常检测算法进行了比较&#xff0c;包括Kmeans、Kmeans以及大津法&#xff08;OTSU&#xff09;&#xff0c;并给出了相关的代码实现与测试方法。总结的比较结果如下表所示&#xff1a; 方…

cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

cocosCreator3.6以上接入Bugly上报其实很简单&#xff0c;不需要网上那么多弯弯绕&#xff0c;三须三步走。 1. 按照官网方式接入android的bugly 2. android端写一个Bugly上报管理类 3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件&…

发电厂主厂房智能照明控制系统的设计和应用

摘要&#xff1a;当前&#xff0c;电厂主厂房的照明规模较大&#xff0c;而且具有许多回路&#xff0c;增加了电厂照明负荷&#xff0c;导致照明过程中的能源消耗较高。对此&#xff0c;电厂需要合理设计智能照明系统&#xff0c;运用智能技术提高电厂照明的运行管理水平&#…

如何在化工行业运用IPD?

化工行业作为国民经济的重要基础性行业&#xff0c;包含数以万计的产品种类&#xff0c;各具有不同的物理化学特性。化工产品的消费同国民经济状况联系非常紧密&#xff0c;主要去向广泛分布于基建、房地产、农业、汽车、服装等国民经济各个领域。按应用领域划分&#xff0c;典…

PCA与SVD

PCA流程&#xff1a; 当数据维度大时&#xff0c;构建协方差矩阵并求其特征值、特征向量会导致计算量大。所以可以利用SVD求解。 PCA算法的优化目标就是: ①降维后同一维度的方差最大。 ②不同维度之间的相关性为0。 根据线性代数&#xff0c;我们可以知道同一元素的协方差就…

Django项目开发快速入门

Django项目开发快速入门 生成Django项目编写module后台管理系统admin自定义管理页面视图函数使用Django模板 生成Django项目 现在cmd中使用命令安装Django框架 pip install django3.2使用命令生成项目 django-admin startproject DjStore使用命令生成应用 python .\manage.…

管道模型--Asp.Net MVC篇 Http请求

管道模型–Asp.Net MVC篇 Http请求 我们自己写的程序,是怎样进行处理的?一个完整的HTTP请求流程: 一. 请求大致流程 拿一个实例了解整个流程的步骤: 用户浏览器输入地址 例如 http://www.csdn.net DNS解析(域名供应商) 将输入的网址解析成IP+端口 请求到达服务器Server I…