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

2023-11-08

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

该问题是在调试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_LOAD
        tristate "X280 Fw load on Test Platform"
        select FW_LOADER
        help
          This option enables support for the Test load X280 FW

          You may select when support test fw load. To compile this as a module
          choose 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_RESET
        tristate "test reset on Test Platform"
        help
          This option enables support for the TEST RESET

          You may select when support test reset. To compile this as a module
          choose M.

          If unsure, say N.

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

CONFIG_TEST_RESET=y

3 对于该问题的总结

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

在这里插入图片描述

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

  • 若新添加的设备属性需要执行具体的功能,那需要按照3.1章的部分去添加对应的设备驱动程序。
  • 若不需要,则在原始的设备驱动初始化流程直接去解析对应的设备属性即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Python科学计算的瑞士军刀——Anaconda 安装与配置

    Introduce Python是一种强大的编程语言 其提供了很多用于科学计算的模块 常见的包括numpy scipy和matplotlib 要利用Python进行科学计算 就需要一一安装所需的模块 而这些模块可能又依赖于其它的软件包或库
  • 数据库优化、索引【面试题】

    目录 数据库调优的目标 索引覆盖是什么 最左缀原则是什么 哪些因素可能会造成Mysql性能问题 如果sql语句需要使用联表查询我们如何进行优化呢 Mysql常见优化手段 你从哪些方面去优化你的数据库 一个页面响应很慢 你按照什么顺序去排查
  • java 微信请求_微信小程序请求微信api授权登录(Java后端)

    1 小程序端调用wx login 获取到微信返回的code临时凭证 2 小程序端调用我方的后台接口 Java后端调用微信的api 需要appId appSecret js code grant type authorization code
  • 简单易用的公司网页模板,助您快速建站

    在当今数字化时代 拥有一个高质量的公司网页是每个企业成功的关键 然而 对于那些没有技术专业知识的人来说 创建一个专业的网页可能是一项艰巨的任务 但是 现在有许多简单易用的公司网页模板可用于帮助您快速建站 下面 我们将简单地介绍一下如何利用这
  • 合并链表(C++)

    合并两个排序的链表 剑指Offer 25 问题描述 输入两个递增排序的链表 合并这两个链表并使新链表中的节点仍然是递增排序的 示例 输入 1 gt 2 gt 3 1 gt 3 gt 4 输出 1 gt 1 gt 2 gt 3 gt 4 gt
  • 【毕业设计】Python_基于DFM模型AHP算法的学生消费行为分析

    资源下载 https download csdn net download wouderw 87402799 1 分析学生消费行为的目的 1 分析学生的消费行为和食堂的运营状况 为食堂运营提供建议 2 根据学生的整体校园消费行为 选择合适的
  • DOTA: A Large-scale Dataset for Object Detection in Aerial Images 翻译

    DOTA 用于航空图像中目标检测的大规模数据集 原文 https arxiv org pdf 1711 10398 pdf 官网 https captain whu github io DOTA dataset https captain
  • 链栈的实现--C 语言版,详细讲解+代码实现

    顺序栈的实现 C 语言版 详细讲解 代码实现 例如 第一章 Python 机器学习入门之pandas的使用 文章目录 顺序栈的实现 C 语言版 详细讲解 代码实现 前言 一 结构体定义 二 操作步骤 1 初始化 2 判断栈是否为空 3 入栈
  • 悬铃木超级计算机,陈根:“九章”攻擂“悬铃木”,快一百亿倍的量子霸权

    文 陈根 2019年 谷歌率先宣布实现 量子霸权 量子优越性 一把把量子计算推入公众视野 激起量子计算领域的千层浪 就在近日 中国团队宣布量子计算机 九章 问世 挑战谷歌 量子霸权 实现算力全球领先 九章 作为一台76个光子100个模式的量
  • CCP学习二——通信流程

    1 概述 CCP通信按信息传输方式分为 POLLING 问答 和DAQ方式 按功能模式分为三种 SESSION 会话 CAL 标定 DAQ 查询 工作流程一般为 程序初始化完成后 通过SET S STATE设置节点当前工作状态 Sessio
  • 做研究与写论文【周志华教授】

    本文内容来自于周志华老师在2007年的报告 做研究与写论文 首先讲到研究与研发的区别 其主要区别在于 新 研究 发现新知识 发明新技术 研发 根据已有知识和技术进行研制 开发 科学研究可以扩展人类的知识 没有科学研究就没有技术进步 如何做研
  • 阿里云服务器ECS装好宝塔 但访问不了面板的解决方法

    下载宝塔桌面助手 然后连接你是阿里云服务器输入命令 Centos安装脚本yum install y wget wget O install sh http download bt cn install install sh sh insta
  • 2021-09-06 (1)

    关于计算机的硬盘序列号查找方法 最近应导师要求 帮他查一下计算机的硬盘序列号和Mac地址 咱也没查过 就网上冲浪了一番 结合自己部分使用体验总结为以下三种方法 1 wmic diskpart get serialnumber详细步骤如下 w
  • SpringBoot实现电子发票生成

    在本文中 我们将介绍如何使用Spring Boot开发一个仿真电子发票生成的应用程序 我们将会使用vue作为前端框架 后端使用Spring Boot 并借助微信二维码扫描功能来确保每个发票都是唯一 有效的 此外 我们还将介绍如何使用第三方库
  • Pandas DataFrame处理数据——列处理

    目录 一 插入数据为列 二 新增或修改列 三 对整列进行运算 四 用函数对列中的每个值进行处理 五 选择自己需要的列 六 修改列名 七 删除列 首先导入pandas库 创建一个数据框对象 import pandas as pd data p
  • Java 华为真题-选修课

    需求 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选修了两门选修课的学生 先按照班级进行划分 班级编号小的先输出 每个班级按照两门选修课成绩和的降序排序 成绩相同时按照学生的学号升序排序 输入描述
  • fegin需要实现类_学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!

    一 类 的介绍 在C 中 用 类 来描述 对象 所谓的 对象 是指现实世界中的一切事物 那么类就可以看做是对相似事物的抽象 找到这些不同事物间的共同点 如自行车和摩托车 首先他们都属于 对象 并且具有一定得相同点 和一些不同点 相同点如他们

随机推荐

  • C++ 中调用构造函数有返回值吗?

    C 中的构造函数 最近在面试中问道一个问题 C 中构造函数有返回值吗 例如 class A public A x 1 A int i x i private int x 官方解释在C 标准规定了构造 析构 自定义类型转换符不可以指定返回类型
  • 纠错编码算法——RS编码的Matlab实现

    纠错编码算法 RS编码的Matlab实现 纠错编码是一种将数据加入冗余信息以提高数据传输质量和容错能力的方法 而RS码则是其中一种经典的纠错编码算法 本文将介绍RS码的基本原理 并提供Matlab实现源代码 一 RS编码的原理 RS编码全称
  • 3D人体重建方法漫谈

    转自 https blog csdn net Asimov Liu article details 96442990 1 概述 2 模型匹配的方法 2 1SMPL Skinned Multi Person Linear model 模型 2
  • 过滤器Filter理解

    1 背景 在设计web应用的时候 用户登录 注册是必不可少的功能 对用户登录信息进行验证的方法也是多种多样 大致可以认为如下模式 前端验证 后台验证 根据笔者的经验 一般会在前端进行一些例如是否输入数据 输入的数据的格式是否正确等一系列的验
  • Java用poi导入导出Excel

    前言 1 将用户信息导出为excel表格 导出数据 2 将Excel表中的信息录入到网站数据库 习题上传 开发中经常会设计到excel的处理 如导出Excel 导入Excel到数据库中 操作Excel目前比较流行的就是 Apache POI
  • 小程序设置按钮分享功能

    一般小程序分享可以通过右上角的分享功能进行分享 如果想要在页面内进行按钮设置 可以这样子设置 效果图 WXML中 定义button按钮来触发分享事件 在button标签上写上 open type share 属性
  • 刷题之字符串的排列 以及双指针滑动窗口

    刷题 给你两个字符串 s1 和 s2 写一个函数来判断 s2 是否包含 s1 的排列 如果是 返回 true 否则 返回 false 换句话说 s1 的排列之一是 s2 的 子串 示例 1 输入 s1 ab s2 eidbaooo 输出 t
  • 力扣练习题之数组中找两个数之和等于目标数值详细讲解

    力扣练习题 1 0 题目 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不
  • 图的深度优先遍历

    深度优先查找 原理 深度优先搜索可以从图的任意顶点开始 然后把该顶点标记为已经访问 每次迭代的时候 深度搜索紧接着处理与当前顶点邻接的未访问顶点 如果有若干个顶点 则任意选择一个 也可以按自己的条件选择 让这个过程一直持续 直到遇到一个终点
  • 2018年蓝桥杯第九届省赛b组第四题--测试次数

    第四题 标题 测试次数 x星球的居民脾气不太好 但好在他们生气的时候唯一的异常举动是 摔手机 各大厂商也就纷纷推出各种耐摔型手机 x星球的质监局规定了手机必须经过耐摔测试 并且评定出一个耐摔指数来 之后才允许上市流通 x星球有很多高耸入云的
  • 冯诺依曼体系结构、哈佛体系结构

    冯诺依曼体系结构 哈佛体系结构与改进型哈佛结构之间的区别 1 冯 诺依曼结构 冯 诺依曼结构又称作普林斯顿体系结构 Princetionarchitecture 1945年 冯 诺依曼首先提出了 存储程序 的概念和二进制原理 后来 人们把利
  • Vue之单文件组件和脚手架

    简介 主要介绍单文件组件的定义和编写方法和脚手架相关知识介绍 单文件组件的定义是一个文件只有一个组件 使用xxx vue文件 这个文件是vue团队定义的一种文件类型 xxx vue文件里面可以使用三个标签
  • SpringBoot 之AOP实现过滤器、拦截器、切面

    文章目录 AOP概述 AOP底层实现机制 过滤器 拦截器 切面区别 过滤器 Filter 使用过滤器统一请求耗时 拦截器 Interceptor 使用拦截器判断是否登录 AspectJ 简介 AspectJ 注解开发 AOP AOP 注解说
  • 【C语言进阶】文件操作

    博客主页 小王又困了 系列专栏 C语言 人之为学 不日近则日退 感谢大家点赞 收藏 评论 目录 一 什么是文件 1 1程序文件 1 2数据文件 1 3文件名 二 文件的打开和关闭 2 1文件指针 2 2文件的打开和关闭 三 文件的顺序读写
  • voc格式标签读写操作

    image load imagePath imageShape image height image width 1 if image isGrayscale else 3 writer PascalVocWriter imgFolderN
  • 使用51单片机ADC0808测量电压

    1 protues仿真图 程序 include
  • 第10篇:强化学习Q-learning求解迷宫问题 代码实现

    你好 我是郭震 zhenguo 今天重新发布强化学习第10篇 强化学习Q learning求解迷宫问题 代码实现 我想对此篇做一些更加详细的解释 1 创建地图 创建迷宫地图 包括墙网格 走到墙网格就是负奖励 注意 空白可行走网格奖励值设置为
  • 利用梳状函数求解周期函数傅里叶变换

    本文对梳状函数 1 单位冲激函数 2 梳状函数及其傅里叶变换 3 卷积和傅里叶变换 卷积是一种运算方式 针对线性时不变系统 最基础的应用就是 在时域中 一个输入 卷积上单位冲激响应 就可以得到输出 傅立叶变换的主要作用就是让函数在时域和频域
  • 在Ubuntu中配置中文输入法

    找到设置 选择区域和语言 点击Manage Installed Languagees 提示安装的话安装即可 4 点击图示内容 5 将Chinese simplified 勾选上 右键点击住 将汉语拖到第一位 重启Ubuntu 6 在输入源中
  • linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

    linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析 1 linux原始设备驱动信息 1 1 设备树节点信息 1 2 linux设备驱动 1 3 makefile 1 4 Kconfig 1 5 对应的defconfig文件 2