Eu só posso dar uma resposta genérica, mas espero que você aponte na direção certa.
Você não disse qual placa x86 você usa, mas em sistemas não antigos, o barramento ISA estará atrás de uma ponte PCI-para-ISA. Você pode usar lspci
para encontrar essa ponte. A ponte fornecerá um mapeamento da memória principal e do espaço de E / S para a memória do barramento ISA e o espaço de E / S. Isso é configurado pelo kernel na inicialização de acordo com as informações fornecidas no BIOS, ou seja, ACPI, incluindo o PNP herdado. Você pode ver informações sobre esse processo em dmesg
após a inicialização.
Mesmo no sistema moderno, ainda existem dispositivos ISA legados, embora estejam agora no barramento LPC e não em um barramento ISA real. Os drivers de kernel do Linux para tal dispositivo, ou seja, o driver de teclado / mouse 8042 PS / 2 (consulte drivers/input/serio
), reservam as portas que precisam ( request_region
) no init ( i8042_platform_init
in i8042-io.h
), libere-os sair e para a porta E / S ( inb
, outb
etc.) para se comunicar com ela. Eu não sei como funciona para o acesso à memória, mas provavelmente semelhante. As portas reservadas aparecem em /proc/ioports
.
A ponte deve aparecer em /sys/bus/pci/devices
, talvez você possa encontrar informações adicionais lá. Há também /sys/bus/isa
, mas não tenho certeza sob quais circunstâncias o kernel preencherá isso com informações.
Primeiro, tentei ver se a placa reage a algumas portas de E / S. Além disso, tente o procedimento de enumeração PNP (ou verifique dmesg
se isso não for feito na inicialização), se ele responder a isso, o resto será muito mais fácil.
Finalmente, tentarei descobrir como a ponte PCI-to-ISA mapeia o espaço de memória, quais operações de kernel você precisa para reservar esse espaço de memória e, em seguida, novamente investigá-lo e ver se algo acontece.
Editar :
O livro Drivers de dispositivos do Linux, 3ª edição tem algumas informações sobre como acessar a memória ISA na seção 9.4.5 .
Editar :
Coisas para experimentar:
1) Inicialize com lilo
em vez de grub
, ative "hole" (ISA-mapping) no BIOS, veja se ele inicializa. Sim, lilo
ainda funciona.
2) Google para VIA VT82C686A South Bridge
data sheet. No espaço de configuração PCI, se a ponte PCI-para-ISA, existe o seguinte registro:
Offset 43 - ROM Decode Control
Setting these bits enables the indicated address range to be
included in the ROMCS# decode:
7 FFFE0000h-FFFEFFFFh
6 FFF80000h-FFFDFFFFh
5 000E8000h-000EFFFFh
4 000E0000h-000E7FFFh
3 000D8000h-000DFFFFh
2 000D0000h-000D7FFFh
1 000C8000h-000CFFFFh
0 000C0000h-000C7FFFh
Então eu acho que você pode tentar habilitar o "buraco" (mapeamento ISA) após a inicialização, e verificar com o logicanalyser se ele funciona. Usar FFFE0000h
em vez de 000E0000h
também vale a pena tentar se a placa não decodificar bits altos.
Eu não sei como fazer isso corretamente e informar o kernel do Linux do mapeamento alterado. Talvez haja também opções de inicialização para isso.
Eu sei que você pode acessar o espaço de configuração PCI através do pseudo-arquivo /sys/bus/pci/devices/0000:00:07.0/config
, então você pode até tentar isso fora de um driver de kernel.
3) Verifique definitivamente dmesg
e /sys/bus/pnp
para ver se sua carta já está enumerada. Se você não conseguir entender a dmesg
output, coloque-a em um pastebin e poste um link; Eu posso dar uma olhada.