使用GPIO作为SPI ACPI覆盖的芯片选择



我想使用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主页。

最新更新