SMBus / I2C em um barramento PCIe

2

Isenção de responsabilidade, estou longe, muito longe de um especialista do CentOS / Linux e tenho tido dificuldade em descobrir nada disso por conta própria, usando o Google fu. Eu estou trabalhando em um produto que entra em um slot PCIe em um PC rodando o CentOS. No canal lateral da interconexão PCIe, há um SMBus (ou seja, I2C) que é usado para reunir a tabela VPD (Vital Product Data). Eu estou tentando encontrar uma maneira de testar essa interface, mas falhei miseravelmente até agora. Eu sei que existem algumas ferramentas para tentar ler o dispositivo VPD e I2C, que são:

LM-Tools (I2C), instaladas usando sudo yum install i2c-tools dmidecode, instalado usando sudo yum install dmidecode

As ferramentas no dmidecode tem um "vpddecode" que não retorna nada e eu suspeito que esteja procurando algo na memória, mas eu realmente não sei. o LM-Tools tem o i2cdetect, mas tentar executar "sudo i2cdetect -y 0" não funciona e reporta:

Error: Could not open file /dev/i2c-2 or /dev/i2c/2: No such file or directory

Se eu olhar em /dev , não há itens com i2c nele. Então, estou pensando em carregar um módulo ou algo assim?

Então, minhas perguntas são:

  1. Essas ferramentas poderão se comunicar com meu dispositivo que está no SMBus PCIe?
  2. Se esses utilitários funcionarem com meu dispositivo no SMBus PCIe, quais ações eu preciso realizar para que funcionem?
  3. Se esses utilitários não funcionarem com meu dispositivo no SMBus PCIe, quais utilitários funcionarão?

Qualquer ajuda é muito apreciada. Eu tenho google, mas o meu google fu traz principalmente informações para módulos LM para ler temps e itens como esse, mesmo se eu tentar filtrá-los.

Obrigado Mark

    
por lordhog 27.05.2014 / 21:21

2 respostas

2

Até onde eu sei, os controladores SMBus são representados como dispositivos I²C no Linux. (Como o SMBus é um subconjunto do I²C, esses dispositivos não suportarão todos os comandos I²C, mas somente aqueles relacionados ao SMBus.) Assim, ter o controlador SMBus de sua placa-mãe visível como /dev/i2c-X device é necessário para qualquer programa userspace comunicar-se com o seu Dispositivo PCIe SMBus.

Para ter /dev/i2c-X dispositivos, você precisa carregar o módulo i2c-dev . Você pode fazer isso manualmente executando modprobe i2c-dev no shell ou adicionando uma linha contendo apenas o nome do módulo ao arquivo /etc/modules . Este último carregará o módulo automaticamente em cada inicialização do sistema.

Além disso, você precisa carregar um driver para o controlador SMBus específico em sua placa-mãe (se não for carregado automaticamente). Eu não sei qual mainboard (chipset) você tem. O controlador SMBus da maioria dos chipsets Intel é suportado pelo módulo do kernel i2c-i801 Linux.

Se você carregou os dois módulos, deve haver um ou mais barramentos I²C disponíveis para o seu sistema. Para cada barramento, há um dispositivo /dev/i2c-X e uma entrada em /sys/bus/i2c/devices/ com o mesmo nome.

Para restringir qual é o seu dispositivo PCIe, você pode tentar:

$ grep . /sys/bus/i2c/devices/i2c-*/name

Isso lhe dará uma lista de todos os ônibus e imprimirá o nome do driver para cada barramento. Como você tem o i2c-tools instalado, você também pode usar i2cdetect -l para obter uma lista semelhante.

Editar: Parece haver um problema com os chipsets i2c-i801 e Intel C220 em algumas placas principais tornando o módulo SMBus inutilizável.

    
por 28.06.2014 / 21:41
0

Passar acpi_enforce_resources = lax na linha de comando resolverá o conflito de recursos da ACPI.

i2c /dev entries driver
ACPI Warning: SystemIO range 0x0000000000003000-0x000000000000301F conflicts with OpRegion 0x0000000000003000-0x000000000000300F (_SB_.PCI0.SBUS.SMBI) (20150930/utaddress-254)
ACPI: This conflict may cause random problems and system instability
ACPI: If an ACPI driver is available for this device, you should use it instead of the native driver i801_smbus 0000:00:1f.3: SMBus using PCI interrupt

Verificação de interferência de recursos entre drivers nativos e ACPI OperationRegions (somente SystemIO e System Memory). As portas IO e a memória declarada na ACPI podem ser usadas pelo subsistema ACPI  em código AML arbitrário e pode interferir nos drivers legados.  acpi_enforce_resources = pode ser definido como:

  • strict (padrão) (2)  - > outro driver tentando acessar os recursos não carregará
  • lax (1)  - > Um outro driver que tente acessar os recursos será carregado, mas você  receba uma mensagem do sistema dizendo que algo pode dar errado ...

  • não (0)  - > Os recursos da região de operação da ACPI não serão registrados

por 10.08.2016 / 16:40