Сборка контроллера устройства i2c - PullRequest
0 голосов
/ 19 февраля 2019

Я строю печатную плату, которая будет взаимодействовать через шину i2c с UDOO x86 под управлением Ubuntu 18.04 с двумя доступными шинами i2c и несколькими GPIO

. Устройство имеет 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 (светодиодные матричные контроллеры) (используетсяадресная форма uart, похожая на RS-485, но я не достаточно знаком, чтобы быть уверенным)

UDOO x86 изначально является просто стандартным сервером Ubuntu 18.04.2 и не имеет дерева устройств.

Я не очень знаком с этим и не уверен, с чего начать.

Теперь мне нужно как-то указать адреса i2c 3 чипов и GPIO, к которому подключено прерывание от PCA9543.

Тогда я думаю, что мне нужно создать комбинированный «драйвер» для комбинации, которая включает в себя отдельные драйверы микросхем i2c, а также текущие драйверы и светодиодные матричные контроллеры.

Я считаю, что теоретически я могу использовать acpi для выполненияэто (https://www.kernel.org/doc/Documentation/acpi/enumeration.txt)

может кто-нибудь дать мне приблизительный план и / или примеры того, как это сделать

-

using комбинация

У меня есть следующий примерный шаблон

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"},
                            }
                        })
                    }
                }
            }
        }
    }
}

Хотя я не думаю, что это совершенно правильно и отсутствует прерывание GPIO от PCA9543,и я не уверен, как определить шину SPI и UART, предоставляемую SC18IS602B и SC16IS741A (или TPS92518HV-Q1 и TPS92662-Q1, при условии, что у них были драйверы)

1 Ответ

0 голосов
/ 03 марта 2019

Хорошо, что вы выбрали правильный способ решения этой проблемы!Теперь к вопросу.

Прежде всего, позвольте мне описать схему того, что у вас есть, как я понимаю (поправьте меня, если я ошибаюсь).

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

Этонемного сложнее, чем в обычном случае, когда все устройства находятся на одной шине, но давайте пойдем с этим.

Рассмотрим ваш ACPI, отрывок ошибок, которые я вижу:

  • Идентификаторы вДлина ACPI составляет всего 4 символа: CLI1A, CLI1B и т. Д. Имеют неправильные имена
  • Устройство SMB1 не требуется.Что вы пытались вставить туда?
  • _HID для устройств, которые еще не имеют правильно назначенных идентификаторов ACPI, должен быть PRP0001 (Примечание 1 , а также)
  • Микросхема MUX совместима с pca9543, как вы указали
  • Ссылочные объекты ASL, либо патчи, либо ссылки (в формате, где - точное количество символов '^', до которого вы хотите перейти на уровень, за которым следует объект из 4 символов),Это описано в главе 5.3 спецификации.Хотя для ресурсов типа I2cSerialBusV2() поле ResourceSource должно быть строкой со ссылкой
  • UPDATE Только что заметил, что у вас есть два устройства ната же шина с тем же адресом, она не будет работать, поэтому я установил адрес преобразованного I2C в 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 mux PCA954x.К сожалению, драйвер ориентирован на OF и должен быть слегка исправлен, чтобы он работал в средах на основе ACPI.

В качестве примера вы можете посмотреть этот патч .Обратите внимание, что вам нужно заменить почти каждый of_property_*() вызов API соответствующими device_property_*().

Аналогичное относится к остальным драйверам, которые вам нужны.

К счастью для вас, кто-то ранее имелинтерес к поддержке преобразователя I2C в Serial, поэтому серия исправлений ( еще не применено скоро станет частью нового ядра) было опубликовано с соответствующим отрывком ASL.

В последнем коде приведен пример устройства с использованием GPIO IRQ.

...