我想使用GPIO引脚作为Up Squared板上SPI的新芯片选择。上平方使用英特尔奔腾N4200,所以它是一台x86机器。我已经通过使用设备树覆盖在树莓派上做到了这一点,但由于这是一台x86机器,我可能不得不使用ACPI覆盖。
上平方有两个spi可用,他们在这里建议使用ACPI覆盖,这种回购,实际上效果很好。在其中一个asl
文件下面,他们使用
/*
* This ASL can be used to declare a spidev device on SPI0 CS0
*/
DefinitionBlock ("", "SSDT", 5, "INTEL", "SPIDEV0", 1)
{
External (_SB_.PCI0.SPI1, DeviceObj)
Scope (_SB.PCI0.SPI1)
{
Device (TP0) {
Name (_HID, "SPT0001")
Name (_DDN, "SPI test device connected to CS0")
Name (_CRS, ResourceTemplate () {
SpiSerialBus (
0, // Chip select
PolarityLow, // Chip select is active low
FourWireMode, // Full duplex
8, // Bits per word is 8 (byte)
ControllerInitiated, // Don't care
1000000, // 10 MHz
ClockPolarityLow, // SPI mode 0
ClockPhaseFirst, // SPI mode 0
"\_SB.PCI0.SPI1", // SPI host controller
0 // Must be 0
)
})
}
}
}
我使用编译了这个文件
$ sudo iasl spidev1.0.asl > /dev/null
$ sudo mv spidev1.0.asl /lib/firmware/acpi-upgrades
$ sudo update-initramfs -u -k all
然后我重新启动一个我可以看到一个设备并通过它进行通信
up@up:~$ ls /dev/spi*
/dev/spidev1.0
因此,我决定根据来自英特尔的themeta-acpi样本编写自己的覆盖图,并写下了以下内容:
/*
* This ASL can be used to declare a spidev device on SPI0 CS2
*/
DefinitionBlock ("", "SSDT", 5, "INTEL", "SPIDEV2", 1)
{
External (_SB_.PCI0.SPI1, DeviceObj)
External (_SB_.PCI0.GIP0.GPO, DeviceObj)
Scope (_SB.PCI0.SPI1)
{
Name (_CRS, ResourceTemplate () {
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
"\_SB.PCI0.GIP0.GPO", 0) {
22 // pin 22 is BCM25 or 402 in linux
}
})
Name (_DSD, Package() {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () { "compatible", "spidev" }, // not sure if this is needed
Package () {
"cs-gpios", Package () {
0,
0,
^SPI1, 0, 0, 0, // index 0 in _CRS -> pin 22
}
},
}
})
Device (TP2) {
Name (_HID, "SPT0001")
Name (_DDN, "SPI test device connected to CS2")
Name (_CRS, ResourceTemplate () {
SpiSerialBus (
2, // Chip select
PolarityLow, // Chip select is active low
FourWireMode, // Full duplex
8, // Bits per word is 8 (byte)
ControllerInitiated, // Don't care
1000000, // 10 MHz
ClockPolarityLow, // SPI mode 0
ClockPhaseFirst, // SPI mode 0
"\_SB.PCI0.SPI1", // SPI host controller
0 // Must be 0
)
})
}
}
}
但我看不到新设备。我错过了什么?
编辑:我用一个实际有效的代码修改了代码。我现在可以在/dev/spidev1.2
上看到一个设备。
然而,引脚22上的CS一直很低,这不应该是这种情况。针的号码正确吗?我正在使用这里的引脚编号
编辑2:
这是我的内核版本的输出
Linux up 5.4.65-rt38+ #1 SMP PREEMPT_RT Mon Feb 28 13:42:31 CET 2022 x86_64 x86_64 x86_64 GNU/Linux
我为正确的内核版本编译了这个带有RT补丁的linux存储库。
我还安装了upboard-extras
软件包,实际上我能够通过设备/dev/spidev1.0
和/dev/spidev1.1
的spi进行通信。所以我认为我已经正确地配置了平方。
/sys/class/gpio
下没有ngpio
文件
up@up:~/aru$ ls /sys/class/gpio
export gpiochip0 gpiochip267 gpiochip310 gpiochip357 gpiochip434 unexport
我可以将GPIO设置为1或0,并且我可以在万用表上看到输出,所以我认为我对GPIO有正确的权限。
编辑3:
请在此链接中找到acpidump -o up2-tables.dat
的.dat
结果
我假设您正在使用此板。为了能够使用I/O引脚(i2c、spi等(,您需要首先启用它们。检查您是否已启用它们的简单方法是在终端中键入:
uname -a
输出将看起来像:
Linux upxtreme-UP-WHL01 5.4.0-1-generic #2~upboard2-Ubuntu SMP Thu Jul 25 13:35:27 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
在这里#2~upboard2 Ubuntu部分可以根据您的板类型进行更改。然而,如果你没有看到类似的结果,那么你还没有配置你的电路板。另一种方法是,转到文件夹:/sys/class/gpio并检查ngpio文件。里面应该写着28。
要使用任何I/O引脚(i2c、spi等(,您不需要更改BIOS端的任何内容,因为它是默认启用的。
请查看维基百科页面,并在安装linux后更新您的板内核。然后将启用您的I/O配置。向上wiki主页。