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

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

  • 1 linux原始设备驱动信息
    • 1.1 设备树节点信息
    • 1.2 linux设备驱动
    • 1.3 makefile
    • 1.4 Kconfig
    • 1.5 对应的defconfig文件
  • 2 修改之后的linux设备驱动
    • 2.1 修改之后的设备树节点信息
    • 2.2 原始test_fw.c出现的问题以及原因分析
      • 2.2.1 原始test_fw.c出现的问题
      • 2.2.2 原始test_fw.c出现的问题的原因分析
    • 2.3 解决test_fw.c对应驱动加载异常的方法
      • 2.3.1 添加对应的test_reset.c驱动文件
      • 2.3.2 makefile添加对test_reset.c的支持
      • 2.3.3 Kconfig添加对test_reset功能的支持
      • 2.3.4 defconfig文件添加对test_reset功能的支持
  • 3 对于该问题的总结
    • 3.1 添加一个新的linux设备驱动需要兼顾的几点
    • 3.2 设备树节点添加新的属性的处理

该问题是在调试linux设备驱动时出现,根据当时对该问题的理解以及对应的验证方法去整理为该文档。

1 linux原始设备驱动信息

1.1 设备树节点信息

/ {test_fw_load@0x100000000 {compatible = "test,test-x280-fw";reg = < 0x01 0x00000000 0x0 0x20000000 >, < 0x0 0x4000f000 0x0 0x200>;};
};

1.2 linux设备驱动

这里只给出一个驱动代码的示意test_fw.c,probe函数具体的功能就不再贴出。

// SPDX-License-Identifier: GPL-2.0-or-later#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/moduleparam.h>
#include <linux/platform_device.h>#include <linux/io.h>
#include <linux/device.h>
#include <linux/firmware.h>#define TEST_FW_LOAD_VERSION "1.0"static int test_fw_probe(struct platform_device *pdev)
{printk("test fw probe\r\n");return 0;
}/*** test_fw_remove - set driver_data of the device to NULL* @pdev: pointer to platform device handle** Always returns 0*/
static int test_fw_remove(struct platform_device *pdev)
{printk("test fw probe\r\n");return 0;
}static const struct of_device_id test_fw_match[] = {{ .compatible = "test,test-x280-fw", },{},
};
MODULE_DEVICE_TABLE(of, test_fw_match);static struct platform_driver test_fw_load_driver = {.driver = {.name           = "test_fw_load",.of_match_table = test_fw_match,},.probe  = test_fw_probe,.remove = test_fw_remove,
};
module_platform_driver(test_fw_load_driver);MODULE_AUTHOR("W Test <test@test.cn>");
MODULE_VERSION(TEST_FW_LOAD_VERSION);
MODULE_LICENSE("GPL V2");

1.3 makefile

obj-$(CONFIG_TEST_FW_LOAD)      += test_fw.o

1.4 Kconfig

config TEST_FW_LOADtristate "X280 Fw load on Test Platform"select FW_LOADERhelpThis option enables support for the Test load X280 FWYou may select when support test fw load. To compile this as a modulechoose M.If unsure, say N.

1.5 对应的defconfig文件

CONFIG_TEST_FW_LOAD=y

2 修改之后的linux设备驱动

2.1 修改之后的设备树节点信息

给test_fw_load节点添加了复位属性。

/ {test_reset: test_reset {compatible = "test,scmi-reset";#reset-cells = <1>;};
};/ {test_fw_load@0x100000000 {compatible = "test,test-x280-fw";reg = < 0x01 0x00000000 0x0 0x20000000 >, < 0x0 0x4000f000 0x0 0x200>;resets = <&test_reset 1>;reset-names = "test_reset";};
};

2.2 原始test_fw.c出现的问题以及原因分析

2.2.1 原始test_fw.c出现的问题

当给test_fw.c对应的设备树添加了复位属性之后就开始出现test_fw.c驱动的probe函数不被执行,整个设备驱动好像就没有被调用。
可以确定test_fw.c所对应的makefile,Kconfig,defconfig均已正常添加对应的配置选项,且之前test_fw.c所对应的驱动运行良好。
同时,如果把复位属性注释掉则驱动又恢复运行良好。

2.2.2 原始test_fw.c出现的问题的原因分析

由于添加上复位属性设备驱动就会出现加载异常,注释掉复位属性驱动就运行OK,那么我们可以确定问题是由于添加复位属性引入的。
该问题的主要原因是使用test_reset的复位节点配置,但是test_reset节点所对应的驱动并没有处理并加载,导致test_fw.c所对应的驱动加载异常。

2.3 解决test_fw.c对应驱动加载异常的方法

解决test_fw.c对应驱动加载异常的方法就是添加test_reset设备树节点对应节点的设备驱动,下面是已对应的示意代码为例来介绍的。

2.3.1 添加对应的test_reset.c驱动文件

// SPDX-License-Identifier: GPL-2.0-or-later#include <linux/module.h>#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/moduleparam.h>
#include <linux/platform_device.h>#include <linux/io.h>
#include <linux/device.h>/*** test_reset_probe - probe routine of the driver* @pdev: pointer to Platform device handle** Return zero for success and non-zero for failure*/
static int test_reset_probe(struct platform_device *pdev)
{return 0;
}/*** test_reset_remove - set driver_data of the device to NULL* @pdev: pointer to platform device handle** Always returns 0*/
static int test_reset_remove(struct platform_device *pdev)
{return 0;
}static const struct of_device_id test_reset_match[] = {{ .compatible = "test,scmi-reset", },{},
};
MODULE_DEVICE_TABLE(of, test_reset_match);static struct platform_driver test_reset_driver = {.driver = {.name           = "test_reset",.of_match_table = test_reset_match,},.probe  = test_reset_probe,.remove = test_reset_remove,
};
module_platform_driver(test_reset_driver);MODULE_AUTHOR("W Test <test@test.cn>");
MODULE_DESCRIPTION("TEST RESET driver");
MODULE_LICENSE("GPL V2");

2.3.2 makefile添加对test_reset.c的支持

obj-$(CONFIG_TEST_RESET)    += test_reset.o

2.3.3 Kconfig添加对test_reset功能的支持

config TEST_RESETtristate "test reset on Test Platform"helpThis option enables support for the TEST RESETYou may select when support test reset. To compile this as a modulechoose M.If unsure, say N.

2.3.4 defconfig文件添加对test_reset功能的支持

CONFIG_TEST_RESET=y

3 对于该问题的总结

3.1 添加一个新的linux设备驱动需要兼顾的几点

在这里插入图片描述

3.2 设备树节点添加新的属性的处理

  • 若新添加的设备属性需要执行具体的功能,那需要按照3.1章的部分去添加对应的设备驱动程序。
  • 若不需要,则在原始的设备驱动初始化流程直接去解析对应的设备属性即可。

相关文章:

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析 1 linux原始设备驱动信息1.1 设备树节点信息1.2 linux设备驱动1.3 makefile1.4 Kconfig1.5 对应的defconfig文件 2 修改之后的linux设备驱动2.1 修改之后的设备树节点信息2.2 原始test_fw.c出现的问题以及原因分析…...

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。

连nil切片和空切片一不一样都不清楚&#xff1f;那BAT面试官只好让你回去等通知了。 问题 package mainimport ("fmt""reflect""unsafe" )func main() {var s1 []ints2 : make([]int,0)s4 : make([]int,0)fmt.Printf("s1 pointer:%v, s2 p…...

前端构建工具 webpack 笔记

1、了解 webpack 1、定义&#xff1a;本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具&#xff0c;当 webpack 处理应用它会在内部从一个或多个入口点构建一个依赖图(dependency graph)&#xff0c;然后将你项目中所程序时&#xff0c;需的…...

.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名

先来说个额外的问题&#xff1a;如何在请求上下文&#xff08;比如过滤器的中&#xff09;获取请求对应的Area和Controller 名字&#xff1f;&#xff08;假设请求上下文对象为 filterContext &#xff09;&#xff1a; 1. 获取Area名: (string)filterContext.RouteData.DataTo…...

docker-compose部署etcd集群

1. docker-compose.yml cat > docker-compose.yml << EOF version: "3.0"networks:etcd-net: # 网络driver: bridge # 桥接模式volumes:etcd1_data: # 挂载到本地的数据卷名driver: localetcd2_data:driver: localetcd3_data:driver:…...

微信怎么定时发圈?

定时发圈的妙用 在合适的时间点发布新的产品、促销活动&#xff0c;不仅能够及时提醒用户品牌的存在&#xff0c;还可以引发用户的兴趣&#xff0c;增加品牌的曝光率。 选择最佳的发朋友圈时间段&#xff0c;以确保推广内容得到最大的曝光和关注&#xff0c;提高广告投放的效果…...

记录造数据测试接口

一、前言 在java开发中经常需要造数据进行测试接口&#xff0c;这里记录一下常用的通过造数据测试接口的方法。 二、一般的接口传参方式 1、接口的方式最好是使用JSON或者map的方式&#xff0c;这样的好处是传参可以灵活伸缩&#xff0c;返回的结果也最好是JSON或者map的方式…...

数据结构基础7:二叉树【链式结构】实现和递归思想。

二叉树的链式结构实现 一.二叉树链式结构的实现&#xff1a;1.前置说明&#xff1a;1.创建二叉树&#xff1a;2.二叉树的结构&#xff1a; 2.二叉树的遍历&#xff1a;1.二叉树的前中后序遍历&#xff1a;2.内容拓展&#xff1a; 二.二叉树链式(题目)题目一&#xff1a;计算节点…...

[.NET 6] IHostedService 的呼叫等等我的爱——等待Web应用准备就绪

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是技术而是人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在这篇文章中,我将介绍如何等…...

基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 主要…...

python如何学习

功能如此强大、高效的Python&#xff0c;却非常的简单好学&#xff0c;这让学它的同学爱不释手&#xff0c;也让越来越多的互联网企业开始用Python来做主要的开发语言&#xff0c;比如谷歌、Facebook&#xff08;现Meta&#xff09;、豆瓣、知乎等知名互联网公司都在使用Python…...

Centos7更新php7.2版本升级

之前搭建的LNMP环境php使用yum安装的版本为7.2&#xff0c;现有项目wordpress安装wp插件需要php7.4版本的支持&#xff0c;需要在原来的环境更新php版本。 一、卸载php7.2 yum remove php*原先的安装方式是yum安装直接yum remove就可以卸载否则需要rpm命令查询&#xff0c;按…...

操作系统学习笔记---计算机系统概述

目录 概念 功能和目标 特征 并发 共享&#xff08;资源共享&#xff09; 虚拟 异步 发展与分类 手工操作阶段&#xff08;无OS&#xff09; 批处理阶段 单道批处理系统 多道批处理系统 分时操作系统 实时操作系统 网络操作系统 分布式计算机系统 个人计算机操…...

uniapp H5 navigateBack无法返回上一层级

项目场景&#xff1a; 提交表单后需要返回上一级 原因分析&#xff1a; H5在PC端打开&#xff0c;当前页面重新加载的情况下&#xff0c;出现navigateBack不能返回&#xff0c;由于H5端页面刷新后返回页面栈会消失 //提交 const handleSubmit async () > {form.value?.a…...

Android性能优化之应用瘦身(APK瘦身)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览2.1 apk组成 三、优化方向3.1 源代码3.1.1 代码混…...

C语言数组和指针笔试题(二)(一定要看)

目录 字符数组二例题1例题2例题3例题4例题5例题6例题7总结 字符数组三例题1例题2例题3例题4例题5例题6例题7 字符数组二 char arr[] {a,b,c,d,e,f} 1:printf("%d\n", strlen(arr)); 2:printf("%d\n", strlen(arr0)); 3:printf("%d\n", strlen(…...

uniapp——实现在线选座功能——技能提升

首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 这里写目录标题 效果图代码——html部分cu-custom组件anil-seat组件 代码——jscss部分 效果图 代码——html部分 …...

领域驱动设计:微服务的各种边界

文章目录 演进式架构微服务还是小单体&#xff1f;微服务边界的作用 在用 DDD 进行微服务设计时&#xff0c;我们可以通过事件风暴来确定领域模型边界&#xff0c;划定微服务边界&#xff0c;定义业务和系统运行边界&#xff0c;从而保证微服务的单一职责和随需而变的架构演进能…...

MySQL之数据类型

目录 一、MySQL数据类型分类 二、数值类型 1、整数类型 2、bit类型 3、小数类型 三、字符串类型 1、char 2、varchar 3、char和varchar比较 四、日期和时间类型 五、enum和set 一、MySQL数据类型分类 MySQL 数据类型可以大致分为以下三类&#xff1a; 数值类型&#xff1a;用于…...

词法作用域改变词法作用域

一、词法作用域 1.定义&#xff1a; 为什么叫词法作用域&#xff1f;因为大部分标准语言编译器的第一个工作阶段叫作词法化&#xff0c;词法化的过程会对源代码中的字符进行检查&#xff0c;如果是有状态的解析过程&#xff0c;还会赋予单词语义。 简单来说&#xff0…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...