Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ubuntu 构建i2c设备控制器_Ubuntu_Linux Device Driver_I2c_Acpi - Fatal编程技术网

Ubuntu 构建i2c设备控制器

Ubuntu 构建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和相应中断的一个通道。尚未指

我正在构建一个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和相应中断的一个通道。尚未指定其他设备的第二个通道

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

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

我不是很熟悉这一点,也不知道从哪里开始

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

然后我认为我需要为组合生成一个组合“驱动器”,该组合封装单个i2c芯片驱动器加上当前驱动器和led矩阵控制器

我相信理论上我可以用acpi来做这个()

有谁能给我一个大概的轮廓和/或如何进行这方面的例子吗

--

结合使用

  • ()
  • ()
  • ()
  • ()
我有以下粗略的模板

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|
                                               |           |
                                               +-----------+