Quando accedo alle porte ottengo "segmentation faults".
Il tuo programma non ha i privilegi di root, oppure la chiamata
ioperm()
è fallita per qualche altro motivo. Controlla il
valore restituito da ioperm()
. Inoltre, assicurati di stare
accedendo proprio alle porte che hai abilitato con ioperm()
(vedi
D3). Se stai usando le macro di ritardo (inb_p()
, outb_p()
, e
via dicendo), ricordati di effettuare una chiamata a ioperm()
per
ottenere l'accesso anche alla porta 0x80.
Non riesco a trovare le funzioni in*()
e out*()
definite ovunque, e gcc si lamenta per dei riferimenti non definiti
(undefined references).
Non hai compilato con l'ottimizzazione abilitata (-O
)
e quindi gcc non riesce a risolvere le macro contenute in asm/io.h
.
Oppure hai dimenticato di mettere #include <asm/io.h>
out*()
non fà nulla, o fà qualcosa di strano.
Controlla l'ordine dei parametri; deve essere
outb(valore, porta)
e non outportb(porta, valore)
come è
in MS-DOS.
Voglio controllare un dispositivo standard RS-232/una stampante parallela/un joystick...
Probabilmente ti conviene usare i driver esistenti (nel kernel di Linux, o in un server X, o da qualche altra parte). I driver generalmente sono abbastanza versatili, tanto da far funzionare anche i dispositivi non standard, di solito. Vedere le informazioni precedentemente date riguardo le porte standard per indicazioni sulla documentazione.