gpt4 book ai didi

ubuntu - 构建一个 i2c 设备 Controller

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:40 25 4
gpt4 key购买 nike

我正在构建一个 PCB,它将通过 i2c 总线与 UDOO x86 进行通信使用两个可访问的 i2c 总线和多个 GPIO 运行 ubuntu 18.04

设备上有 3 个 i2c 芯片 i2c-mux-pca954x

  • PCA9543 - 电平转换总线开关
  • SC18IS602B - i2c 到 SPI 总线主机
  • SC16IS741A - i2c 到 uart

每个都有内核驱动模块(i2c-mux-pca954x,spi-sc18is602,sc16is7xx)

SC18IS602B和SC16IS741A都连接到PCA9543的一个 channel 和相应的中断。尚未指定的其他设备的第二个 channel 。

SPI 总线连接到 4 个 TPS92518HV-Q1(可编程双电流驱动器)UART 连接到 8 个 TPS92662-Q1(Led 矩阵 Controller )(它使用一种寻址形式的 uart,看起来类似于 RS-485,但我不太熟悉,无法确定)

UDOO x86 最初只是标准的 Ubuntu 服务器 18.04.2,没有设备树。

我对此不是很熟悉,不知道从哪里开始。

我现在需要以某种方式指定 3 个芯片的 i2c 地址和连接 PCA9543 中断的 GPIO。

然后我想我需要为封装单个 i2c 芯片驱动程序加上电流驱动程序和 LED 矩阵 Controller 的组合生成一个组合“驱动程序”。

我相信理论上我可以使用 acpi 来做到这一点 (https://www.kernel.org/doc/Documentation/acpi/enumeration.txt)

谁能给我一个粗略的轮廓和/或如何解决这个问题的例子

--

使用组合

我有以下粗略的模板

DefinitionBlock ("fbsLedCon.aml", "SSDT", 5, "", "FBLEDC01", 1)
{
External (_SB_.PCI0.I2C0, DeviceObj) // Define Correct I2C controller

Scope (\_SB.PCI0.I2C0)
{
Device (SMB1)
{
Name (_HID, "FBLEDC01")
Device (MUX0)
{
Name (_HID, "PCA9542A")
Name (_DDN, "NXP PCA9542A I2C bus switch")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x70, // I2C Address
ControllerInitiated,
I2C_SPEED, // Bus Speed
AddressingMode7Bit,
"^SMB1",
0x00,
ResourceConsumer,,)
}
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,pca9542"},
}
})

Device (CH00)
{
Name (_ADR, 0)


}

Device (CH01)
{
Name (_ADR, 1)

Device (CLI1A)
{
Name (_HID, "SC18IS602B")
Name (_DDN, "NXP SC18IS602B i2c to SPI Bus master")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x50, //I2C Address
ControllerInitiated,
I2C_SPEED, //Bus Speed
AddressingMode7Bit,
"^CH01",
0x00,
ResourceConsumer,,)
}
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,sc18is602b"},
}
})
}

Device (CLI1B)
{
Name (_HID, "SC16IS741A")
Name (_DDN, "NXP SC16IS741A I2C to UART")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x50, //I2C Address
ControllerInitiated,
I2C_SPEED, //Bus Speed
AddressingMode7Bit,
"^CH01",
0x00,
ResourceConsumer,,)
}
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,sc16is741"},
}
})
}
}
}
}
}
}

虽然我认为这不完全正确并且缺少来自 PCA9543 的 GPIO 中断,并且我不确定如何定义 SC18IS602B 和 SC16IS741A(或 TPS92518HV-Q1 和 TPS92662)提供的 SPI 和 UART 总线-Q1 假设他们有司机)

最佳答案

很高兴您选择了正确的解决方法!现在,回答这个问题。

首先,让我描述一下我所理解的原理图(如果我错了请纠正我)。

                                         I2C
+-------------+ +------------+ bus +-----------+
| | | +--------> |
| | | <--------+ Some chip |
| | I2C | | | |
| HOST | bus | | +-----------+
| UDOO X86 +----------> PCA9543 |
| <----------+ I2C | I2C
| | | switch | bus +-----------+
| | | +-----+--> |
| GPIO IRQ +<---------+ <--+-----+ SC16IS741A|
| | | | | | | |
+-------------+ +------------+ | | +-----------+
| |
| | +-----------+
| +--> |
+-----+ SC18IS602B|
| |
+-----------+

当所有设备都位于同一条总线上时,这比通常情况要复杂一些,但让我们继续吧。

考虑您的 ACPI 摘录我看到的错误:

  • ACPI 中的标识符只有 4 个字符长:CLI1A、CLI1B 等都是错误的名称
  • 不需要设备 SMB1。你试图把什么放在那里?
  • 尚未正确分配 ACPI ID 的设备的 _HID 必须是 PRP0001(也请注意 Revert "Add ACPI support for pca954x")
  • 兼容的MUX芯片是你说的pca9543
  • ASL 引用对象要么是路径,要么是引用(格式为 ,其中 是您希望上升到的级别的“^”字符的确切数量,后跟 4 个字符的对象)。这在规范的第 5.3 章中有描述。不过,对于 I2cSerialBusV2() 类型的资源, ResourceSource 字段应该是带有引用的字符串
  • 更新 刚注意到您有两个设备在同一总线上且地址相同,这是行不通的,因此,我将 I2C-to-Serial 的地址固定为相同的正如我在下面提到的摘录中那样。

现在让我们在解决问题后看看它。

#define I2C_SPEED 100000
DefinitionBlock ("fbsLedCon.aml", "SSDT", 5, "", "FBLEDC01", 1)
{
External (_SB_.PCI0.I2C0, DeviceObj) // Define Correct I2C controller
Scope (\_SB.PCI0.I2C0)
{
Device (MUX0)
{
Name (_HID, "PRP0001")
Name (_DDN, "NXP PCA9542A I2C bus switch")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x70, // I2C Address
ControllerInitiated,
I2C_SPEED, // Bus Speed
AddressingMode7Bit,
"\\_SB.PCI0.I2C0",
0x00,
ResourceConsumer,,)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,pca9543"},
}
})

Device (CH00)
{
Name (_ADR, 0)
}

Device (CH01)
{
Name (_ADR, 1)

Device (I2SM)
{
Name (_HID, "PRP0001")
Name (_DDN, "NXP SC18IS602B i2c to SPI Bus master")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x50, // I2C Address
ControllerInitiated,
I2C_SPEED, // Bus Speed
AddressingMode7Bit,
"^CH01",
0x00,
ResourceConsumer,,)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,sc18is602b"},
}
})
}

Device (I2UM)
{
Name (_HID, "PRP0001")
Name (_DDN, "NXP SC16IS741A I2C to UART")
Name (_CRS, ResourceTemplate () {
I2cSerialBus (
0x4d, // I2C Address
ControllerInitiated,
I2C_SPEED, // Bus Speed
AddressingMode7Bit,
"^CH01",
0x00,
ResourceConsumer,,)
})
Name (_DSD, Package () {
ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package () {
Package () {"compatible", "nxp,sc16is741"},
}
})
}
}
}
}
}

免责声明:我一生中从未处理过 I2C 多路复用器,因此,以上内容仍可能包含不确定性。

现在根据 Elixir 考虑各个驱动程序的代码.

I2C 多路复用器 PCA954x。不幸的是,该驱动程序是以 OF 为中心的,应该稍微打补丁以使其在基于 ACPI 的环境中工作。

例如,您可以查看 Make use of device properties现在是上游内核的一部分。

同样适用于您需要的其他驱动程序。

幸运的是,之前有人对 I2C 到串行转换器支持感兴趣,因此 the patch series (not yet applied will be part of new kernel soon) had been published with a corresponding ASL excerpt .

后面的代码有一个使用 GPIO IRQ 的设备示例。

关于ubuntu - 构建一个 i2c 设备 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54768841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com