【问题标题】:"disagrees about version of symbol" after changing struct spi_device更改 struct spi_device 后“不同意符号的版本”
【发布时间】:2020-11-12 22:46:19
【问题描述】:

我正在使用我的 RPi4 研究 SPI 设备驱动程序。我在 spi.h 中的struct spi_device 中添加了一个成员变量,以查看我在 DTS(设备树源)中添加的变量是否按预期进入 spi.c

struct spi_device {
struct device dev;
struct spi_controller *controller;
struct spi_controller *master;
u32 max_speed_hz;
u32 debug_sheld; // ------> for testing..
// ....}

然后我像这样编译内核以查看 spi.cspidev.c 中发生了什么,重新启动我的 RPi4,并尝试加载 spidev。 ko 模块。但是,发生了这个错误:

$ sudo insmod spidev.ko
insmod: ERROR: could not insert module spidev.ko: Invalid parameters

我使用dmesg检查了内核日志:

[ 81.717199] spidev: disagrees about version of symbol spi_sync
[ 81.717211] spidev: Unknown symbol spi_sync (err -22)
[ 81.717248] spidev: disagrees about version of symbol spi_setup
[ 81.717257] spidev: Unknown symbol spi_setup (err -22)
[ 81.717278] spidev: disagrees about version of symbol __spi_register_driver
[ 81.717287] spidev: Unknown symbol __spi_register_driver (err -22)
[ 81.717311] spidev: disagrees about version of symbol spi_slave_abort
[ 81.717320] spidev: Unknown symbol spi_slave_abort (err -22)
[ 310.352225] spidev: disagrees about version of symbol spi_sync
[ 310.352237] spidev: Unknown symbol spi_sync (err -22)
[ 310.352274] spidev: disagrees about version of symbol spi_setup
[ 310.352283] spidev: Unknown symbol spi_setup (err -22)
[ 310.352305] spidev: disagrees about version of symbol __spi_register_driver
[ 310.352314] spidev: Unknown symbol __spi_register_driver (err -22)
[ 310.352338] spidev: disagrees about version of symbol spi_slave_abort
[ 310.352347] spidev: Unknown symbol spi_slave_abort (err -22)
[ 649.449228] spidev: disagrees about version of symbol spi_sync
[ 649.449244] spidev: Unknown symbol spi_sync (err -22)
[ 649.449291] spidev: disagrees about version of symbol spi_setup
[ 649.449303] spidev: Unknown symbol spi_setup (err -22)
[ 649.449332] spidev: disagrees about version of symbol __spi_register_driver
[ 649.449343] spidev: Unknown symbol __spi_register_driver (err -22)
[ 649.449375] spidev: disagrees about version of symbol spi_slave_abort
[ 649.449386] spidev: Unknown symbol spi_slave_abort (err -22)

当我在 spi.cspidev.c 中更改某些内容时没有任何问题,但我不知道为什么在修改为struct spi_device。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: linux kernel spi


    【解决方案1】:

    您的驱动程序调用spi_syncspi_setup 和其他函数。并且您希望这些函数能够与 new spi_device 结构以及附加字段一起使用。

    但是这些函数已经编译,并且可以使用 spi_device 结构(没有附加字段)。

    这就是“不同意符号版本”消息的含义:很可能,从您的代码中调用这些函数不会正确工作。

    您需要重新编译这些函数(即重建内核),或者保持 spi_device 结构不变,而不是使用其他字段来存储附加信息。

    【讨论】:

    • 感谢您的评论。根据您的评论,我明确删除了 spi.o、spidev.ko 和 spidev.mod.* 文件并再次编译内核,希望它们与我修改的 struct spi_device 重新链接。但问题仍然存在。我明白你的意思,但这似乎是另一回事。而且,如您所知,一旦更改了头文件中的内容,源代码就会重新编译(或重新链接),这就是为什么我之前在编译内核时没有删除上面的那些文件并修改了 struct spi_device。会不会有我想念的东西?谢谢。
    • 您已经重新编译内核并加载它(从它启动),不是吗? insmod 将模块插入到当前加载的内核中。 uname -r 的输出是什么?
    • 正确。重新编译内核后,我尝试使用 insmod 加载 spidev.ko。无论对 struct spi_device 进行何种修改,内核版本都与 5.4.59-v7l+ 相同。
    猜你喜欢
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多