Ubuntu 构建i2c设备控制器
我正在构建一个PCB,它将通过i2c总线与 使用两条可访问的i2c总线和多个GPIO运行Ubuntu18.04 该设备上有3个i2c芯片i2c-mux-pca954xUbuntu 构建i2c设备控制器,ubuntu,linux-device-driver,i2c,acpi,Ubuntu,Linux Device Driver,I2c,Acpi,我正在构建一个PCB,它将通过i2c总线与 使用两条可访问的i2c总线和多个GPIO运行Ubuntu18.04 该设备上有3个i2c芯片i2c-mux-pca954x PCA9543-水平移动总线开关 SC18IS602B-i2c至SPI总线主机 SC16IS741A-i2c至uart 每个模块都有一个内核驱动程序模块(i2c-mux-pca954x、spi-sc18is602、sc16is7xx) SC18IS602B和SC16IS741A都连接到PCA9543和相应中断的一个通道。尚未指
- PCA9543-水平移动总线开关
- SC18IS602B-i2c至SPI总线主机
- SC16IS741A-i2c至uart
- ()
- ()
- ()
- ()
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-Q1,假设它们有驱动程序)提供的SPI和UART总线。很好,您选择了正确的解决方法! 现在,我来回答这个问题 首先,让我描述一下你们的原理图,我是如何理解的(如果我错了,请纠正我) 免责声明:我一生中从未处理过I2C多路复用器,因此,上面可能仍然包含不确定性
现在考虑每个司机的代码,按
I2C多路复用器PCA954x。不幸的是,驱动程序是以中心为中心的,应该稍加修补,以使其在基于ACPI的环境中工作 作为一个例子,您可以看看现在哪个是上游内核的一部分 类似的情况也适用于您需要的其他驱动程序 幸运的是,之前有人对I2C到串行转换器的支持感兴趣,因此(尚未应用的将很快成为新内核的一部分)已经发布了相应的版本后一段代码有一个使用GPIO IRQ的设备示例。我认为您可以通过加载的软件来实现这一点,这在概念上类似于用于在Raspberry Pi等上添加插件Hats支持的设备树覆盖层。@IanAbbott,是的,他们可以,但是Linux中的驱动程序和驱动程序开发人员也太过以中心为中心,因此,它仍然需要修补一些驱动程序(有关详细信息,请参阅我的答案)。SMB1设备来自i2c多路复用器示例(),我不确定为什么会出现它,可能是为了将子组件包装到一个设备中。我不确定这是否必须以某种方式反映出来,但两者都有,但PCA9543具有来自SC16IS741A和的中断输入SC18IS602B@fireblade,
SMB1
是I2C总线控制器的名称,在您的案例中,它被定义为PCI0总线上的I2C0。所以,这是不必要的。然而,我现在怀疑如何正确地从从属设备放置对MUX的引用。它应该一直是字符串吗?(需要检查规格)。@allsey87,谢谢!我已经更新(并实际编译测试)了摘录。此外,我还更新了上游内核中ACPI支持的状态(现在就在那里!)@allsey87,I2C MUX是通过\u ADR
实现的,没有任何图形。因此,AFAICS不需要具有层次结构属性。
I2C
+-------------+ +------------+ bus +-----------+
| | | +--------> |
| | | <--------+ Some chip |
| | I2C | | | |
| HOST | bus | | +-----------+
| UDOO X86 +----------> PCA9543 |
| <----------+ I2C | I2C
| | | switch | bus +-----------+
| | | +-----+--> |
| GPIO IRQ +<---------+ <--+-----+ SC16IS741A|
| | | | | | | |
+-------------+ +------------+ | | +-----------+
| |
| | +-----------+
| +--> |
+-----+ SC18IS602B|
| |
+-----------+