4.15号驱动

news2024/11/25 22:43:00

设备树

1. 设备树介绍

1.1 引入

在linux内核3.10版本之前,arm公司将驱动相关的硬件信息(地址、中断号、i2c从机地址)都存放在arch/arm目录

由于每一个设备都会对应一个文件,进行描述硬件的信息,这个目录下会存放大量的垃圾代码,有些驱动不存在,硬件的信息依然存在这个目录下,会导致这个目录没有层次结构

arm公司效仿PowerPC架构,进行整改

1.2 什么是设备树

在linux内核3.10版本之后,内核中引入了设备树,设备树用来存放硬件相关的信息

它本质上就是一个结构体,这个管理方式会让层次目录更为清晰

这个设备树在内核启动时,会被内核进行解析

驱动工程师需要将所有的硬件相关信息,编写到设备树中

编程时从设备树中获取相关地址信息就可以

1.3 设备树相关文件

设备树目录:linux@ubuntu:~$ cd linux-5.10.61/arch/arm/boot/dts/

设备树源文件:stm32mp157a-fsmp1a.dts

设备树头文件:stm32mp15xx-fsmp1x.dtsi

编写设备树命令:make dtbs

设备树镜像文件:stm32mp157a-fsmp1a.dtb

1.4 设备树语法

设备树由节点和子节点组成

节点中包含属性、键值对信息

1.5 属性/键值对格式(重点)

用双引号标识字符串属性:

string-property = "a string";

用尖括号标识无符号32位整数列表:

cell-property = ;

用中括号分隔二进制列表:

binary-property = [01 23 45 67];

可以使用逗号分隔混合键值对:

mixed-property = "a string", [01 23 45 67], ;

用逗号分隔串属性字符串列表:

string-list = "red fish", "blue fish";

1.6 节点格式(重点)

节点格式:<name>[@<unit-address>]

<name>是一个简单的 ASCII 字符串,长度最多为 31 个字符

节点是根据它所代表的设备类型来命名

@:分隔符

unit-address:地址

2. 添加设备树

2.1 添加步骤

设备树目录:linux@ubuntu:~$ cd linux-5.10.61/arch/arm/boot/dts/

打开设备树源文件:vi stm32mp157a-fsmp1a.dts

添加如下节点信息

编译设备树,并且进行拷贝

3. 设备树结构体

在linux内核解析设备树成功之后,每一个节点会通过device_node结构体进行描述

属性是通过struct property结构体进行描述

在同一个节点中,属性构成链表

3.1 节点结构体

struct device_node { //mynode@0x12345678
    const char *name; //节点的名字mynode
    const char *full_name; //节点全名字mynode@0x12345678
    struct property *properties; //属性结构体
    struct  device_node *parent;  //父节点
    struct  device_node *child;   //子节点
};

3.2 属性结构体

struct property {
    char    *name; //属性对应的名字,键值对对应的键的名称
    int length; //值的长度
    void    *value; //属性对应的内容,键值对对应的值的内容
    struct property *next; //指向同一个节点,下一个属性信息
    //在同一个节点中,属性构成链表
};    

4. 设备树API接口

4.1 获取节点API接口

#include <linux/of.h>
struct device_node *of_find_node_by_path(const char *path)
函数功能:通过路径获取节点相关信息
参数:
    path:节点的路径("/mynode@0x12345678")
返回值:
    成功返回节点结构体指针
    失败返回NULL
struct device_node *of_find_node_by_name(struct device_node *from,
    const char *name);  
函数功能:通过节点的名字获取节点相关信息
参数:
    from:NULL,表示从根节点出发
    name:节点的名字("mynode")
返回值:
    成功返回节点结构体指针
    失败返回NULL  
    
struct device_node *of_find_compatible_node(struct device_node *from,
    const char *type, const char *compat);    
函数功能:通过产商固定含义的键,获取节点相关的信息
参数:
    from:NULL,表示从根节点出发
    type:NUL
   compat:固定产商的名称("hqyj,fsmp1a")
返回值:
    成功返回节点结构体指针
    失败返回NULL  

4.2 获取属性API接口

struct property *of_find_property(const struct device_node *np,
                     const char *name,
                     int *lenp);
函数功能:根据设备节点的名称,获取属性相关的信息
参数:
    np:节点名称
    name:属性对应的名称
    lenp:值的长度
返回值:
    成功返回属性结构体指针首地址
    失败返回NULL
    
int of_property_read_string(const struct device_node *np,
                   const char *propname,
                   const char **out_string);
函数功能:通过键值对键的名称,获取字符串属性
参数:
    np:节点名称
    propname:字符串属性名称
    out_string:字符串属性输出内容
返回值:
    成功返回0
    失败返回错误码
    
int of_property_read_u32_array(const struct device_node *np,
                         const char *propname,
                         u32 *out_values, size_t sz)
函数功能:通过属性名称,获取无符号32位整数列表信息
参数:
    np:节点名称
    propname:无符号32位整数列表属性名称
    out_values:获取到的无符号32位整数列表的信息
    sz:无符号32位整数列表的成员个数
返回值:
    成功返回0
    失败返回错误码     
    
int of_property_read_u8_array(const struct device_node *np,
                        const char *propname,
                        u8 *out_values, size_t sz)     
函数功能:通过属性名称,获取二进制列表信息
参数:
    np:节点名称
    propname:二进制列表属性名称
    out_values:获取到的二进制列表的信息
    sz:二进制列表的成员个数
返回值:
    成功返回0
    失败返回错误码  
      
int of_property_read_u32_index(const struct device_node *np,
                       const char *propname,
                       u32 index, u32 *out_value);   
函数功能:通过属性名称,获取无符号32位整数列表对应索引号的信息
参数:
    np:节点名称
    propname:无符号32位整数列表属性名称
    index:索引号
    out_values:获取到的无符号32位整数列表的信息
返回值:
    成功返回0
    失败返回错误码  

5. 获取子节点信息

5.1 添加子节点

设备树目录:linux@ubuntu:~$ cd linux-5.10.61/arch/arm/boot/dts/

打开设备树源文件:vi stm32mp157a-fsmp1a.dts

添加如下子节点节点信息

编译设备树,并且进行拷贝

5.2 获取子节点API接口

struct device_node *of_get_child_by_name(const struct device_node *node,
                    const char *name);
函数功能:获取子节点信息
参数:
    node:父节点结构体指针
    name:子节点名字
返回值:
    成功返回子节点结构体指针首地址
    失败返回NULL

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

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

相关文章

aosp13/14命令行进入分屏相关实战

背景&#xff1a; 分屏一般在手机上都是都是从桌面的最近任务卡片进入的&#xff0c;一般来说手机用户都是这样操作的&#xff0c;但是有一些场景或者情况就不一定可以顺利用上这个桌面的多任务卡片进入。 比如以下场景&#xff1a; 1、可能不是桌面的多任务的场景&#xff0c…

c++入门 命名空间

文章目录 C入门命名空间域作用限定符域作用限定符操作C的域编译器的搜索原则命名空间域的展开命名空间的嵌套 C入门 命名空间 命名空间的存在&#xff1a;为了解决同域中起名字冲突的问题 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、…

使用Python实现文字识别,教你如何从图片中识别提取文字

今天分享的是如何使用Python从图片中提取文字。虽然从我的实际操作结果来看第三方库的图片文字识别效果并不是十分理想&#xff0c;但也能满足我的需求了。 首先&#xff0c;我们需要知道Python中两个非常重要的库&#xff1a;Pillow和Tesseract-OCR。Pillow是一个免费开源的图…

类与对象(中

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.3 总结 三、析构函数 3.1 概念 3.2 特性 3.3 总结 四. 拷贝构造函数 4.1 概念 4.2 特征 4.3 总结 五.赋值运算符重载 5.1 运算符重载 5.2 赋…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具&#xff1a;socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息&#xff0c;它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息&#xff0c;而且比 netsta…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

【HCIP】OSPF的高级特性

OSPF的高级特性1 --- 不规则区域 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由…

自学Java的第二十四次笔记

一,方法重载 1.基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a; System.out.println(); out 是 PrintStream 类型 2.重载的好处 1) 减轻了起名的麻烦 2) 减轻了记名的麻烦 3.快速入门案…

免费无限换脸神器Facefusion最新版(支持数字人)

Facefusion&#xff0c;一款超炫的AI视频/图片换脸项目&#xff0c;号称“下一代换脸器和增强器”。作者一直在不停地更新&#xff0c;新版2.3.0版本甚至还支持了数字人&#xff0c;快随我去看看吧~ Facefusion2.3.0新版本介绍 Facefusion新版本升级了人脸解析能力&#xff0c…

算法学习——LeetCode力扣补充篇8(146. LRU 缓存、 215. 数组中的第K个最大元素、25. K 个一组翻转链表)

算法学习——LeetCode力扣补充篇8 146. LRU 缓存 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化…

基于深度学习的乳腺癌淋巴结转移预测模型(E-Transformer)

乳腺癌细胞淋巴结转移是界定乳腺癌早中期的重要标准&#xff0c;需要活检&#xff0c;患者体验较差。 传统的图像辅助诊断需要手动提取特征、组合图像特征&#xff0c;效率低下、效果不佳。新兴的基于深度学习的图像辅助诊断&#xff0c;利用卷积神经网络通过全连接层或机器学…

ubuntu23.10.1 php8.2安装

1、更新镜像源 apt update2、安装php 如果在这里不知道自己Linux能安装什么版本的php,可以使用apt install php,会给你提示&#xff0c;根据提示自己选择版本安装 apt install php我这里是php8.2-cli apt install php8.2-cli其他扩展包&#xff0c;在后面加个-可以查看&…

跟TED演讲学英文:How AI can bring on a second Industrial Revolution by Kevin Kelly

How AI can bring on a second Industrial Revolution Link: https://www.ted.com/talks/kevin_kelly_how_ai_can_bring_on_a_second_industrial_revolution Speaker: Kevin Kelly Date: June 2016 文章目录 How AI can bring on a second Industrial RevolutionIntroduction…

福布斯发布2024年人工智能初创企业50强

随着人工智能热潮的持续&#xff0c;一种新的技术经济正在帮助企业开发和部署人工智能驱动的应用程序。在《福布斯》第六届年度“人工智能50强”榜单上&#xff0c;这类新锐企业正大行其道。该榜单遴选了AI领域最有前途的初创公司&#xff0c;由《福布斯》在领先行业专家的帮助…

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测&#xff1a;一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌&#xff08;PC&#xff09;的五年生存率是所有癌症中…

redis五种类型介绍

Redis是一种内存数据存储系统&#xff0c;它支持五种不同的数据类型&#xff1a; 1. String String是Redis中最基本的数据类型&#xff0c;它可以存储任何形式的字符串数据&#xff0c;例如普通的文本字符串&#xff0c;二进制数据或JSON格式的数据。除此之外&#xff0c;还可以…

AtCoder Educational DP Contest

A - Frog 1 大意 有块石头&#xff0c;第块石头的高度为。从石头跳到石头的花费是。 一只青蛙在石头上&#xff0c;每次可以跳步或步&#xff0c;请问跳到石头的最小代价是多少&#xff1f; 思路 设&#xff0c;为青蛙跳到第号石头时的最小代价。 每一个点都可以由前两个点…

动态规划Dynamic programming详解-编辑距离问题【python】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

【笔试训练】day3

今天的题又简单了很多欸 1.简写单词 没思路 代码&#xff1a; #include <iostream> #include<string> using namespace std;int main() {string str;string ans;getline(cin,str);if(str[0]>Z)ans(str[0]-32);else ansstr[0];for(int i1;i<str.size();i…