У моего устройства есть opencore-i2 c, который, в свою очередь, экспортирует несколько интерфейсов i2c / smbus. У меня система x86_64, и я могу добавить устройства i2 c, которые находятся на SMB0, SMB1, так как имена SMB0 и SMB1 известны системе.
У меня возникли трудности с объявлением i2 c устройства, которые находятся за ПЛИС. ИЗ DSDT я вижу объявление SMB0 следующим образом
Device (SMB0)
{
Name (_ADR, 0x001F0004) // _ADR: Address
}
Это соответствует выходу lspci ниже, который имеет SMBus в 00: 1f.4
root# lspci | grep -i smbus
00:12.0 System peripheral: Intel Corporation DNV SMBus Contoller - Host (rev 11)
00:1f.4 SMBus: Intel Corporation DNV SMBus controller (rev 11)
root#
Однако в случае ocores, одно устройство PCI передает ядру несколько шин i2 c после загрузки драйвера. Итак, любые указания о том, как публиковать sh эту информацию через ACPI, чтобы устройства i2 c на этих шинах могли автоматически перечисляться после загрузки драйвера OCORE.
Ссылка: https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-ocores.c
В приведенном выше примере i2 c -адаптер создается для каждой pci-функции. Предполагается, что дерево устройств будет передавать адрес PCI-ресурса, а драйвер создает единственный экземпляр i2 c -адаптера.
В моем случае код изменен таким образом, что базовый -адрес, а «количество шин i2 c» на данной платформе передается как параметр.
Затем драйвер создает экземпляры шин i2 c с вызовами i2c_add_numbered_adapter на основе количества создаваемых шин.
Смещения для связи с устройством рассчитываются как смещения из регистра «BAR».