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

这篇具有很好参考价值的文章主要介绍了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设备驱动需要兼顾的几点

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析,linux嵌入式开发,设备树添加复位属性驱动加载异常,设备树添加新复位属性,添加新的复位节点驱动程序文章来源地址https://www.toymoban.com/news/detail-717363.html

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

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

到了这里,关于linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点

    (1)学习韦东山老师的Linux,因为他讲的很精简,以至于很多人听不懂。接下来我讲介绍韦东山老师的驱动实验班的第二个Hello程序。 (2)注意,请先学习完视频再来看这个教程!本文仅供入门学习!如需深入,请搜索其他博客! (3)因为上一个教程已经讲的很详细了,所

    2024年02月05日
    浏览(34)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之设备节点 (物联技术666)

    链接:https://pan.baidu.com/s/1hOBKyRom-4EZMBpFn1H9kQ?pwd=1688 提取码:1688  Linux设备节点 设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对 /dev 目录下的东西变得不再熟悉。有时候遇见问题就会变得抓狂 本文是我

    2024年02月22日
    浏览(40)
  • Linux设备树:删除节点和属性的方法

    [ 摘要 ]:本文主要介绍了在设备树中删除节点(node)和属性(property)的方法。为了便于理解,笔者先介绍了 dtsi 和 dts 的关系,然后构建了虚拟的需求场景,最终给出示例。 设备树文件可以分为 dtsi 和 dts 两种类型。dtsi 类似于 C 语言中的头文件,供其他设备树文件引用,

    2024年02月07日
    浏览(29)
  • 驱动开发--自动创建设备节点udev机制的实现过程

    udev:自动创建设备节点的机制,创建设备节点的逻辑在用户空间 1.驱动程序 2.应用程序 3.头文件

    2024年02月09日
    浏览(37)
  • RK3568平台开发系列讲解(驱动基础篇)自动创建设备节点

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自动创建设备节点分为两个步骤: 步骤一:使用 class_create 函数创建一个类。 步骤二:使用 device_create 函数在我们创建的类下面创建一个设备。 Linux 驱动实验中,当我们通过 insmod 命令加载模块后,

    2023年04月12日
    浏览(44)
  • 【IMX6ULL驱动开发学习】01.编写第一个hello驱动+自动创建设备节点(不涉及硬件操作)

    目录 一、驱动程序编写流程 二、代码编写 2.1 驱动程序hello_drv.c 2.2 测试程序 2.3 编写驱动程序的Makefile 三、上机实验 3.1 NFS 挂载 3.2 测试示例 构造file_operations结构体 在里面填充open/read/write/ioctl成员 注册file_operations结构体 int major = register_chrdev(0, \\\"name\\\", fops); 入口函数:调用

    2024年02月13日
    浏览(30)
  • linux设备驱动(5)--设备树

    代码学习资料来源于: 第6.1讲 Linux设备树详解-什么是设备树?_哔哩哔哩_bilibili 仅用于个人学习/复习,侵联删 在linux内核3.x版本之后,linux内核开始使用设备树, 设备树描述开发板上的硬件信息 。 如上图所示,树的主干就是系统总线,IIC控制器,GPIO控制器,SPI控制器等都

    2024年02月11日
    浏览(24)
  • 4、Linux驱动开发:设备-设备号&设备号注册

    🍅点击这里查看所有博文   随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有

    2024年02月15日
    浏览(45)
  • Linux设备驱动程序(一)——设备驱动简介

    这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作

    2024年02月05日
    浏览(77)
  • Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(三

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包