内核模块中的驱动程序代码无法执行?

路卡

为什么在加载时此内核模块不执行任何操作?

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#define DEVICE_NAME "hello-1.00.a"
#define DRIVER_NAME "hello"
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(struct platform_device *pdev){
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static int hello_exit(struct platform_device *pdev){
    printk(KERN_ALERT "Goodbye, cruel world\n");
    return 0;
}

static const struct of_device_id myled_of_match[] =
{
    {.compatible = DEVICE_NAME},
    {},
};

MODULE_DEVICE_TABLE(of, myled_of_match);

static struct platform_driver hello_driver =
    {
        .driver = {
        .name = DRIVER_NAME,
        .owner = THIS_MODULE,
        .of_match_table = myled_of_match
    },
    .probe = hello_init,
    .remove = hello_exit
};

module_platform_driver(hello_driver);

它必须print Hello, world\n,如果我这样做lsmod该模块似乎已加载:

lsmod
hello_world 1538 0 - Live 0xbf000000 (O)

但是在控制台和dmesg

如果我使用module_init并且module_exit一切正常,但是我需要指向platform_device *pdev设备的指针,该怎么办?

编辑:

原始模块如下所示:

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void){
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}

static void hello_exit(void){
    printk(KERN_ALERT "Goodbye, cruel world\n");
}


module_init(hello_init);
module_exit(hello_exit);

在我的设备树blob中显示以下条目:

hello {
    compatible = "dglnt,hello-1.00.a";
    reg = <0x41220000 0x10000>;
};
锯末

如果我使用module_init和module_exit都可以

简短的“原始”代码仅包含模块框架。确保在加载模块时调用init例程,并在卸载前调用exit例程。该“原始”代码不是驱动程序。

较长的内核模块是驱动程序,正在加载,但是由于它具有不执行任何操作的默认初始化和退出代码(由module_platform_driver()的扩展生成),因此没有消息。当内核使用设备树时,不能保证可加载模块中的驱动程序代码被调用。

为什么在加载时此内核模块不执行任何操作?

驱动程序的探测功能(将输出消息)可能未得到调用,因为设备树中没有任何内容指示需要此设备驱动程序。

开发板的“设备树”的代码段包含

    compatible = "dglnt,hello-1.00.a";

但驱动程序声明应将其指定为

#define DEVICE_NAME "hello-1.00.a"
...   
    {.compatible = DEVICE_NAME},

这些字符串应匹配,以便驱动程序可以与“设备树”节点中的此引用设备绑定。

此外,设备节点应声明为

    status = "okay";

覆盖任何可能禁用设备的默认状态。

设备树中正确配置的节点应可以按预期执行驱动程序的探测功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过调试重建内核模块(驱动程序)

如何从ubuntu 16.04内核客户端和内核模块中删除nvidia驱动程序,或使内核clent和模块使用相同的nvidia驱动程序?

为什么内核使用默认的块驱动程序而不是我的驱动程序代码?

谁在驱动程序代码中调用“探针”功能?

内核驱动程序和内核模块之间有什么区别?

内核模块在执行某条语句后无法执行语句

Gradle:无法执行SQL,找不到驱动程序

如何列出受SecureBoot影响的驱动程序/内核模块?

如何检查给定的驱动程序内核模块是否支持给定的设备?

字符设备,平台驱动程序和内核模块之间的区别

Wifi加密狗缺少内核模块的编译/安装驱动程序?

当驱动程序有内核模块时,为什么我的相机不工作?

如何防止内核模块视频驱动程序探测特定的图形卡设备

在多个不同的内核模块(驱动程序)之间进行通信

在Linux内核模块(驱动程序)关键部分等待用户空间输入

Nvidia驱动程序安装错误-“内核模块生成失败。”

Linux设备驱动程序代码中的MODULE_ALIAS是什么?

编译简单的设备驱动程序代码

声音驱动程序-AWS EC2 ubuntu 16.04实例的snd-aloop内核模块设置问题

无法在 Linux 中的 Jenkins 上执行 chrome 驱动程序

在solaris的内核模块代码中以pfile的形式获取数据

如何修复在Linux内核SPI驱动程序中始终无法通过验证的SPI驱动程序

有没有一种方法可以在运行时知道驱动程序是内核模块还是静态链接?

恢复特定的内核和模块(nvidia 驱动程序)

Linux内核驱动程序模块:使用单个驱动程序处理多个设备文件

如何阻止内核内置的驱动程序,即不是模块的驱动程序

D 中的内核模块

内核模块中的Stackoverflow

找不到适合我的Java应用程序代码的驱动程序