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

文章目录

  • 设备树驱动模型
  • 如何使用设备树写驱动程序
    • 设备树节点要与 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 配对了。一个平台设备只能配对一个平台驱动,一个平台驱动可以配对多个平台设备。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式再探——状态模式

目录 一、背景介绍二、思路&方案三、过程1.状态模式简介2.状态模式的类图3.状态模式代码4.状态模式还可以优化的地方5.状态模式的项目实战&#xff0c;优化后 四、总结五、升华 一、背景介绍 最近产品中有这样的业务需求&#xff0c;不同时间(这里不是活动的执行时间&…

前端学习——Vue (Day1)

Vue 快速上手 Vue 是什么 创建 Vue 实例 Vue2官网&#xff1a;https://v2.cn.vuejs.org/ <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息和状态&#xff1b;通过语音识别模块对当前垃圾种类进行语音识别&#xff1b; 通过蜂鸣器进行声光报警提醒垃圾桶已满&#xff1b;采用舵机控制垃圾桶打开关闭&#xff1b;超声波检测当前垃圾桶满溢程度&#xff1…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文&#xff1a;FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

大模型开发(十):Chat Completion Models API 详解

全文共8000余字&#xff0c;预计阅读时间约18~28分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;详解Chat Completion Models的参数及应用实例&#xff0c;并基于该API实现一个本地知识库的多轮对话智能助理 代码&文件下载点这里 一、…

【前端|CSS系列第4篇】CSS布局之网格布局

前言 最近在做的一个项目前台首页有一个展示词条的功能&#xff0c;每一个词条都以一个固定大小的词条卡片进行展示&#xff0c;要将所有的词条卡片展示出来&#xff0c;大概是下面这种布局 每一行的卡片数目会随着屏幕大小自动变化&#xff0c;并且希望整个卡片区域周围不要…

ChatGPT 4.0 —— Code Interpreter

&#x1f4ce;产品销售数据集.csv 选取以上的数据集作为输入&#xff0c;对Code Interpreter 进行测试 1.输入指定数据集&#xff0c;要求给出该数据集的概貌 2.请分析销售的总金额和其他变量的关系 Python Script: # Import required libraries import matplotlib.pyplot a…

java项目之网络视频播放器(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络视频播放器。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&a…

vs2015 工程组织与动态加载

10.Visual Studio动态加载_哔哩哔哩_bilibili 1.工程组织 ① researcher.cpp #include "nn/nn.h"#include "nn/factory.h" #include "nn/factory_impl/factory_impl.h"#include <iostream>int main() {int ret 0;factory_i* fct new f…

Java实现获取客户端真实IP方法小结

Java实现获取客户端真实IP方法小结 在jsP里&#xff0c;获取客户端的IP地址的方法是&#xff1a;request.getRemoteAddr()&#xff0c;这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件&am…

【数据挖掘】bytewax 与 ydata工具可实时了解您的数据

一、说明 在这篇博文中&#xff0c;我们将介绍如何将开源流式处理解决方案 bytewax 与 ydata 分析相结合并加以利用&#xff0c;以提高流式处理流的质量。 STream 处理支持在传输中和存储之前对数据进行实时分析&#xff0c;并且可以是有状态的&#xff0c;也可以是无状态的。 …

双向循环链表的基本操作(创建节点,头插,头删,尾插,尾删)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建链表节点&#xff1a; DoubleLink crea…

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具&#xff0c;采用拖拽式设计模式&#xff0c;不需任何服务器和组件支持&#xff0c;即可在 Mac、Linux 和 Windows 操作系统中&#xff0c;设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…

第五章 编程之免交互

免交互&#xff1a;不需要人为控制就可以完成的自动化操作&#xff08;自动化运维&#xff09; shell脚本和面交互是一个概念&#xff0c;但是两种写法 shell&#xff1a;默认解释器是bash 使用i/o&#xff08;输入/输出&#xff09;重定向的方式&#xff0c;将命令的列表提供…

Flask 定制日志并输出到文件

Flask 定制日志并输出到文件 定制日志器flask缺省日志器配置自定义日志器 定制日志器 flask缺省日志器配置 flask自带的日志系统&#xff0c;缺省配置dictConfig()&#xff0c;但必须在Flask()应用之前使用 # flask缺省配置 from logging.config import dictConfig dictConfig…

文心千帆大模型测评分享,效果超出预期

一、前言 现如今&#xff0c;随着ChatGPT的爆火越来越多的人开始关注人工智能领域了&#xff0c;大家都在尝试使用它来帮助自己在工作上提高效率亦或是解决一些问题。但ChatGPT是有一定的使用门槛的&#xff1a;首先需要我们“科学上网”才能访问&#xff0c;其次GPT4的价格相…

C语言库函数 — 错误信息报告函数

前言 本文介绍错误信息报告函数 错误信息报告函数的作用&#xff1a; 帮助程序员快速定位代码中的错误&#xff0c;以便更快地进行调试和修复问题。 文章目录 前言一、错误信息报告函数什么是错误信息报告函数错误信息报告函数的作用strerror函数介绍strerror函数使用错误码对应…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前&#xff0c;我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写&#xff0c;由王立柱和刘志红翻译。全书通俗易懂&#xff0c;内容丰富&#xff0c;是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

C++的类型转换

文章目录 一. C语言的类型转换二. C的四种类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast 三. RTTI结束语 一. C语言的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类…

25 MFC 数据库

文章目录 导入ADO库 导入ADO库 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")void CADODlg::OnBnClickedBtnQuery() {//导入ADO库::CoInitialize(NULL);//初始化COM库_ConnectionPtr pCo…