linux - 如何使用 spi-loopback-test linux 内核模块?
问题描述
我不明白如何使用 linux 内核模块spi-loopback-test
。
这个模块是从spi-loopback-test.c编译的,并且仍然被维护。
它是为 SPI 回归测试目的而创建的(请参阅初始提交日志),但网络上的任何地方都没有文档或说明。
我能够编译和加载模块,但加载时没有任何反应。
中没有消息dmesg
,物理 SPI 总线上没有活动。lsmod
显示模块已加载。似乎从未调用过模块的
spi_loopback_test_probe
函数。
我想我在设备树中缺少一些“胶水”(DT 覆盖??),为模块分配一个物理 SPI 端口。
如何为这个模块分配一个 SPI 端口?
我应该创建一个 DT 覆盖以spi-loopback-test
在现有的spi0 外围节点下添加一个驱动程序节点吗?另外,我注意到在加载之前可以更改的模块参数。
compatible
这里可以设置什么值?
我的目标系统是 Raspberry Pi 4B(但我猜这个问题适用于所有 linux 系统)。
任何帮助/指针表示赞赏!
谢谢
解决方案
好的,我终于找到了一种运行spi-loopback-test
模块的方法。
这里的技巧是使用anyspi
Device-Tree 覆盖,以避免spidev
模块的依赖。
我从这个提交中得到了灵感。
- 首先,必须重新编译内核以包含测试功能“spi-loopback-test”。
我遵循本指南,从 Ubuntu VM 进行交叉编译。 - 编译前通过“menuconfig”启用SPI环回模块:
CONFIG_SPI_DEBUG=y
和CONFIG_SPI_LOOPBACK_TEST=m
- 将内核映像及其设备树加载到目标系统 (RPi4)。
- 在 RPi4 上运行以下命令:
$ sudo dmesg -n 8
$ lsmod | grep spi
$ sudo dtoverlay anyspi spi0-1 dev="linux,spi-loopback-test" speed=125000000
$ lsmod | grep spi
spi_loopback_test 28672 0
spidev 20480 0
spi_bcm2835 24576 0
$ dmesg | grep spi > spi-loopback-test.log
$ $ head spi-loopback-test.log -n 15
[ 48.170758] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /soc/spi@7e204000/spidev@1/status
[ 48.170785] OF: overlay: WARNING: memory leak will occur if overlay removed, property: /soc/spi@7e204000/status
[ 48.182921] spi-bcm2835 fe204000.spi: registered master spi0
[ 48.183056] spi spi0.1: setup: forcing CS_HIGH (use_gpio_descriptors)
[ 48.183075] spi spi0.1: setup mode 0, cs_high, 8 bits/w, 125000000 Hz max --> 0
[ 48.183187] spi-bcm2835 fe204000.spi: registered child spi0.1
[ 48.183217] spi spi0.0: setup: forcing CS_HIGH (use_gpio_descriptors)
[ 48.183232] spi spi0.0: setup mode 0, cs_high, 8 bits/w, 125000000 Hz max --> 0
[ 48.183327] spi-bcm2835 fe204000.spi: registered child spi0.0
[ 48.269732] spi-loopback-test spi0.1: Executing spi-loopback-tests
[ 48.269946] spi-loopback-test spi0.1: Running test tx/rx-transfer - start of page
[ 48.270204] spi-loopback-test spi0.1: with iteration values: len = 0, tx_off = 0, rx_off = 1
[ 48.270431] spi-loopback-test spi0.1: with iteration values: len = 0, tx_off = 0, rx_off = 2
[ 48.270657] spi-loopback-test spi0.1: with iteration values: len = 0, tx_off = 0, rx_off = 3
[ 48.270883] spi-loopback-test spi0.1: with iteration values: len = 0, tx_off = 1, rx_off = 0
$ tail spi-loopback-test.log
[ 51.878516] spi-loopback-test spi0.1: with iteration values: len = 1024, tx_off = 0, rx_off = 0
[ 51.881159] spi-loopback-test spi0.1: with iteration values: len = 1031, tx_off = 0, rx_off = 0
[ 51.883826] spi-loopback-test spi0.1: with iteration values: len = 4093, tx_off = 0, rx_off = 0
[ 51.886892] spi-loopback-test spi0.1: with iteration values: len = 4096, tx_off = 0, rx_off = 0
[ 51.889950] spi-loopback-test spi0.1: with iteration values: len = 4099, tx_off = 0, rx_off = 0
[ 51.893862] spi-loopback-test spi0.1: with iteration values: len = 65536, tx_off = 0, rx_off = 0
[ 51.905280] spi-loopback-test spi0.1: with iteration values: len = 65537, tx_off = 0, rx_off = 0
[ 51.916708] spi-loopback-test spi0.1: with iteration values: len = 131071, tx_off = 0, rx_off = 0
[ 51.937417] spi-loopback-test spi0.1: with iteration values: len = 131072, tx_off = 0, rx_off = 0
[ 52.057851] spi-loopback-test spi0.1: Finished spi-loopback-tests with return: 0
所以看起来 SPI 测试成功了,正如预期的那样。现在我知道如何将内核模块连接到硬件了。
我希望这对其他人也有用。
但是,我想知道是否有更简单的解决方案来加载和运行这个内核模块?
可以不依赖anyspi
DT叠加,只设置module的compatible
参数吗?spi-loopback-mode
推荐阅读
- mongodb - 比较两个集合并获取丢失的用户 ID 文档
- r - kmeans 中的簇面积公式
- json - 使用检查约束将 JSON 列限制为特定对象
- sql-server - Azure SQL - 表比存储的数据大很多
- angularjs - 如何自动化量角器中的拖放操作
- javascript - 如何在 javascript 中检查没有安全漏洞的用户权限?
- python - 如何调整/重新采样蒙版?
- c# - 如何组合两个字符串并按 4 个字符创建集合,两个来自一个字符串,另外两个来自另一个字符串?C#
- mysql - 如何更新具有多个值的表
- microservices - Jaeger 在 nodejs 中的微服务集成工作