Portál AbcLinuxu, 8. května 2025 22:22
Ahoj všem,
potřeboval bych přistupovat na zařízení na PCI sběrnici přes userspace. Konkrétně se jedná o nastavování GPIO pinů na základní desce. Píšu to v C.
Moc toho o sběrnici PCI z programátorského hlediska nevím a nějak nemohu najít ten pravý zdroj informací. Poradil byste někdo nějaký s nějakými příklady?
Jinak k dispozici mám: Bus 0, device 17, function 0, offset 0x95 a to pro každý GPIO pin. Dočet jsem se že jsou dvě možnosti jak přistupovat na PCI zažízení. Přes mmap() anebo out(). Tedy paměťově nebo přes registry. Ve spoustě zdrojáků jsem viděl zápisy a čtení z registrů 0x0CF8 a 0x0CFC, jen jsem k tomu nikde nenašel tu správnou teorii.
Díky za jakékoliv popostrčení...
S ioperm(), iopl(), inb(), outb()
nebo /dev/port
by jsi si snad měl vystačit:
2. Using I/O ports in C programs
BLEK: Na I/O porty můžeš lézt z userspace ...
Podrobnější popis sběrnice PCI
7. Programové řízení paralelního portu (ioperm(), inb(), outb())
Díky za odkazy.
Z posledních dvou jsem v podstatě na začátku čerpal. Mezitím jsem problém již vyřešil, všechno už mi běhá. Nakonec jsem si sehnal referenční příručku k PCI sběrnici a potřebnou teorii jsem si našel, resp. ověřil co jsem už věděl. Pes byl zakopaný v tom, že jsem ke dvoum registrům přistupoval 16 bitově a oni jsou 8 bitové... chyba v manuálu.
Jinak s iopl()
a variacemi in*()
a out*()
jsem si opravdu vystačil.
Zdravim,
muzes vyuzit balicku pciutils, kde je utilita setpci s kterou muzes cist/zapisovat registry PCI karty nebo cipu na desce. Pokud ti to pojede, tak potom muzes vykrast tu utilitu.
Také díky,
setpci
jsem nakonec objevil a postupným zápisem do registrů PCI chipu zjistil, že ke dvoum registrům přistupuji 16 bitově namísto 8 bitově a na tom celém to ztroskotalo. Nicméně, teď už to běhá...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.