Хорошо, что вы выбрали правильный способ решения этой проблемы!Теперь к вопросу.
Прежде всего, позвольте мне описать схему того, что у вас есть, как я понимаю (поправьте меня, если я ошибаюсь).
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.