在 BeagleBone Black 上绑定 SPI 驱动程序时遇到问题。有问题的驱动程序ltc2947-spi
位于 Linux 主线中,但不在 beaglebone 内核树中。当我开始工作时,我会提交一个 PR 来添加它。
我使用以下命令将 ltc2947 驱动程序编译为树外模块这个仓库(也于github)。
% sudo apt-get install linux-headers-$(uname -r)
% find /lib/modules/$(uname -r) -iname "*ltc29*"
% make
该模块编译良好,并modinfo
产生预期的输出:
% sudo modinfo ltc2947-spi.ko
filename: /home/lily/kmod-ltc2947/ltc2947-spi.ko
license: GPL
description: LTC2947 SPI power and energy monitor driver
author: Nuno Sa <[email protected]>
alias: spi:ltc2947
depends: ltc2947-core
name: ltc2947_spi
vermagic: 5.4.70-ti-r19 SMP preempt mod_unload modversions ARMv7 p2v8
并且insmod
似乎正确插入了模块(请注意,有两个模块,因为该芯片的 SPI 和 I2C 驱动程序共享一个公共核心):
% sudo insmod ./ltc2947-core.ko && sudo insmod ./ltc2947-spi.ko
% grep ltc2947 /proc/modules
ltc2947_spi 16384 0 - Live 0x00000000 (O)
ltc2947_core 24576 1 ltc2947_spi, Live 0x00000000 (O)
% tree /sys/bus/spi/drivers/ltc2947
/sys/bus/spi/drivers/ltc2947
├── bind
├── module -> ../../../../module/ltc2947_spi
├── uevent
└── unbind
1 directory, 3 files
从这里,我需要将驱动程序绑定到 SPI 总线上的设备。我正在使用通过 mikroBus Cape 连接到 SPI 的 Mikroe VCP Monitor 3 Click。该板现在位于插槽 1 中,因此引脚连接为:
- P9_28:CS
- P9_29:味噌
- P9_30:莫西
- P9_31:SCK
我还不清楚在哪里指定片选引脚,或者如何确定要回显的字符串/sys/bus/usb/drivers/ltc2947/bind
。
spi1
根据下图, 海角的引脚对应于,
我注意到spi1
已经绑定到spidev
,所以我取消绑定它:
% echo "spi1.0" | sudo tee -a /sys/bus/spi/drivers/spidev/unbind
spi1.0
% echo "spi1.1" | sudo tee -a /sys/bus/spi/drivers/spidev/unbind
spi1.1
% tree /sys/bus/spi/drivers/spidev
/sys/bus/spi/drivers/spidev
├── bind
├── module -> ../../../../module/spidev
├── spi0.0 -> ../../../../devices/platform/ocp/48000000.interconnect/48000000.interconnect:segment@0/48030000.target-module/48030000.spi/spi_master/spi0/spi0.0
├── spi0.1 -> ../../../../devices/platform/ocp/48000000.interconnect/48000000.interconnect:segment@0/48030000.target-module/48030000.spi/spi_master/spi0/spi0.1
├── uevent
└── unbind
3 directories, 3 files
但是当我尝试将其绑定到驱动程序时ltc2947
,它给出了错误"/sys/bus/spi/drivers/ltc2947/bind: No such device"
:
% echo "spi1" | sudo tee -a /sys/bus/spi/drivers/ltc2947/bind
spi1
tee: /sys/bus/spi/drivers/ltc2947/bind: No such device
% echo "spi1.0" | sudo tee -a /sys/bus/spi/drivers/ltc2947/bind
spi1.0
tee: /sys/bus/spi/drivers/ltc2947/bind: No such device
% echo "spi1.1" | sudo tee -a /sys/bus/spi/drivers/ltc2947/bind
spi1.1
tee: /sys/bus/spi/drivers/ltc2947/bind: No such device
向bind
下方回显/sys/module
会产生相同的结果:
% echo "spi1" | sudo tee -a /sys/module/ltc2947_spi/drivers/spi:ltc2947/bind
spi1
tee: '/sys/module/ltc2947_spi/drivers/spi:ltc2947/bind': No such device
答案1
成立Analog Devices Wiki 上的页面这为我指明了正确的方向。
目前,设备只能通过设备树实例化。
因此,对于 Beaglebone Black,我起草了一个设备树覆盖并发送拉取请求到 bb.org-overlays。
我已经用 LED + 电阻器作为 VCP Monitor 3 点击负载进行了测试,并且可以成功从 下的文件中读取电压、电流、功率和能量/sys/class/hwmon/hwmon0
,例如:
lily@beaglebone /sys/class/hwmon/hwmon0
% cat name
ltc2947
lily@beaglebone /sys/class/hwmon/hwmon0
% echo 1 > in0_reset_history
lily@beaglebone /sys/class/hwmon/hwmon0
% cat in0_label
VP-VM
lily@beaglebone /sys/class/hwmon/hwmon0
% cat in0_input
0
# Here I turned on 5V @ 12 mA to light an LED
lily@beaglebone /sys/class/hwmon/hwmon0
% cat in0_input
5054