Module 构建Linux内核模块,警告i2c\u寄存器\u板\u信息未定义

Module 构建Linux内核模块,警告i2c\u寄存器\u板\u信息未定义,module,linux-kernel,driver,Module,Linux Kernel,Driver,我跟随一个例子来编写i2c驱动程序,但不幸的是,当我编译时,我得到了这个警告 警告:“i2c_寄存器_板_信息”[/home/pi/builddriver/samplei2c/pn535.ko]未定义 虽然编译时有1个警告且没有错误,但我无法使用insmod模块。这是insmod时的错误 insmod:错误:无法插入模块pn535.ko:模块格式无效 我的问题是如何解决上述警告?我认为它使.ko文件无效。这是我的源代码 谢谢你的帮助 这在内核模块中是不可能的,因为函数i2c\u registe

我跟随一个例子来编写i2c驱动程序,但不幸的是,当我编译时,我得到了这个警告

警告:“i2c_寄存器_板_信息”[/home/pi/builddriver/samplei2c/pn535.ko]未定义

虽然编译时有1个警告且没有错误,但我无法使用insmod模块。这是insmod时的错误

insmod:错误:无法插入模块pn535.ko:模块格式无效

我的问题是如何解决上述警告?我认为它使.ko文件无效。这是我的源代码


谢谢你的帮助

这在内核模块中是不可能的,因为函数
i2c\u register\u board\u info
没有从内核源代码树导出到内核模块(使用
obj-m目标构建)。您可以通过使用(
obj-y targets
)在内核源代码树中构建驱动程序来实现这一点。

这在内核模块中是不可能的,因为函数
i2c\u register\u board\u info
没有从内核源代码树导出到内核模块(使用
obj-m targets
构建)。您可以通过使用(
obj-y targets
)在内核源代码树中构建驱动程序来实现这一点。

函数
i2c\u寄存器\u板\u信息
不会为内核模块导出(使用
EXPORT\u符号
)。只有编译到内核中的代码才能使用这些函数。据我所知,该功能是供主板开发人员使用的。你的问题是在一个驱动程序中混合了两种东西,即驱动程序本身可以是模块,平台(遗留!)代码不能。您必须删除ACPI或设备树资源提供程序的平台代码,或者作为最后手段将其拆分到另一个编译单元。我删除了i2c_寄存器_板_信息,然后我可以构建模块(.ko)的驱动程序,而无需冲突,并且可以通过在模块_init:调用的init函数中添加这些函数来insmod。。。适配器=i2c获取适配器(配置i2c总线)。。。客户端=i2c_新设备(适配器和i2c_pn535_示例开发人员)。。。不确定是好是坏。因为当我删除驱动程序(rmmod)时,驱动程序不会释放设备,也不能再次insmod,我必须重新启动设备到insmod agian。内核模块的函数
i2c\u寄存器\u板\u信息
不会导出(带有
EXPORT\u符号
)。只有编译到内核中的代码才能使用这些函数。据我所知,该功能是供主板开发人员使用的。你的问题是在一个驱动程序中混合了两种东西,即驱动程序本身可以是模块,平台(遗留!)代码不能。您必须删除ACPI或设备树资源提供程序的平台代码,或者作为最后手段将其拆分到另一个编译单元。我删除了i2c_寄存器_板_信息,然后我可以构建模块(.ko)的驱动程序,而无需冲突,并且可以通过在模块_init:调用的init函数中添加这些函数来insmod。。。适配器=i2c获取适配器(配置i2c总线)。。。客户端=i2c_新设备(适配器和i2c_pn535_示例开发人员)。。。不确定是好是坏。因为当我删除驱动程序(rmmod)时,驱动程序不会释放设备,也不能再次insmod,所以我必须将设备重新引导到insmod agian。无论是在源代码树外部还是在源代码树内部构建的,任何内核模块(
obj-m
Makefile中的目标)中都不能使用未导出的符号。只有编译到内核中的东西(
obj-y
targets)才可以使用这个功能。是的,这就是我的意思。我不是指配置文件中用“m”表示的模块。请看我上面的评论,您的答案不全面,您可以做得更好!非导出符号不能用于任何内核模块(
obj-m
Makefile中的目标),无论它是构建在源代码树外部还是内部。只有编译到内核中的东西(
obj-y
targets)才可以使用这个功能。是的,这就是我的意思。我不是指配置文件中用“m”表示的模块。请看我上面的评论,您的答案不全面,您可以做得更好!