我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 #include #include #include #include #include #include #include #include #include #include #include #define TEST_FW_LOAD_VERSION "1.0"static int test_fw_probe(struct platform_device *pdev){printk("test fw probe\r\n");return 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 ");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 #include #include #include #include #include #include #include #include #include #include static int test_reset_probe(struct platform_device *pdev){        return 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 ");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章的部分去添加对应的设备驱动程序。
  • 若不需要,则在原始的设备驱动初始化流程直接去解析对应的设备属性即可。

来源地址:https://blog.csdn.net/u014100559/article/details/132865277

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录