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切片和空切片一不一样都不清楚?那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、定义:本质上,webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具,当 webpack 处理应用它会在内部从一个或多个入口点构建一个依赖图(dependency graph),然后将你项目中所程序时,需的…...
.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名
先来说个额外的问题:如何在请求上下文(比如过滤器的中)获取请求对应的Area和Controller 名字?(假设请求上下文对象为 filterContext ): 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:…...
微信怎么定时发圈?
定时发圈的妙用 在合适的时间点发布新的产品、促销活动,不仅能够及时提醒用户品牌的存在,还可以引发用户的兴趣,增加品牌的曝光率。 选择最佳的发朋友圈时间段,以确保推广内容得到最大的曝光和关注,提高广告投放的效果…...
记录造数据测试接口
一、前言 在java开发中经常需要造数据进行测试接口,这里记录一下常用的通过造数据测试接口的方法。 二、一般的接口传参方式 1、接口的方式最好是使用JSON或者map的方式,这样的好处是传参可以灵活伸缩,返回的结果也最好是JSON或者map的方式…...
数据结构基础7:二叉树【链式结构】实现和递归思想。
二叉树的链式结构实现 一.二叉树链式结构的实现:1.前置说明:1.创建二叉树:2.二叉树的结构: 2.二叉树的遍历:1.二叉树的前中后序遍历:2.内容拓展: 二.二叉树链式(题目)题目一:计算节点…...
[.NET 6] IHostedService 的呼叫等等我的爱——等待Web应用准备就绪
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是技术而是人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在这篇文章中,我将介绍如何等…...
基于jeecg-boot的flowable流程自定义业务退回撤回或驳回到发起人后的再次流程提交
更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 主要…...
python如何学习
功能如此强大、高效的Python,却非常的简单好学,这让学它的同学爱不释手,也让越来越多的互联网企业开始用Python来做主要的开发语言,比如谷歌、Facebook(现Meta)、豆瓣、知乎等知名互联网公司都在使用Python…...
Centos7更新php7.2版本升级
之前搭建的LNMP环境php使用yum安装的版本为7.2,现有项目wordpress安装wp插件需要php7.4版本的支持,需要在原来的环境更新php版本。 一、卸载php7.2 yum remove php*原先的安装方式是yum安装直接yum remove就可以卸载否则需要rpm命令查询,按…...
操作系统学习笔记---计算机系统概述
目录 概念 功能和目标 特征 并发 共享(资源共享) 虚拟 异步 发展与分类 手工操作阶段(无OS) 批处理阶段 单道批处理系统 多道批处理系统 分时操作系统 实时操作系统 网络操作系统 分布式计算机系统 个人计算机操…...
uniapp H5 navigateBack无法返回上一层级
项目场景: 提交表单后需要返回上一级 原因分析: H5在PC端打开,当前页面重新加载的情况下,出现navigateBack不能返回,由于H5端页面刷新后返回页面栈会消失 //提交 const handleSubmit async () > {form.value?.a…...
Android性能优化之应用瘦身(APK瘦身)
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览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——实现在线选座功能——技能提升
首先声明一点:下面的内容是从一个uniapp的程序中摘录的,并非本人所写,先做记录,以免后续遇到相似需求抓耳挠腮。 这里写目录标题 效果图代码——html部分cu-custom组件anil-seat组件 代码——jscss部分 效果图 代码——html部分 …...
领域驱动设计:微服务的各种边界
文章目录 演进式架构微服务还是小单体?微服务边界的作用 在用 DDD 进行微服务设计时,我们可以通过事件风暴来确定领域模型边界,划定微服务边界,定义业务和系统运行边界,从而保证微服务的单一职责和随需而变的架构演进能…...
MySQL之数据类型
目录 一、MySQL数据类型分类 二、数值类型 1、整数类型 2、bit类型 3、小数类型 三、字符串类型 1、char 2、varchar 3、char和varchar比较 四、日期和时间类型 五、enum和set 一、MySQL数据类型分类 MySQL 数据类型可以大致分为以下三类: 数值类型:用于…...
词法作用域改变词法作用域
一、词法作用域 1.定义: 为什么叫词法作用域?因为大部分标准语言编译器的第一个工作阶段叫作词法化,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。 简单来说࿰…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
