Accès aux E/S sous FreeBSD

Le
Thierry
Sous Linux, le pseudo fichier /dev/port est un mappage mémoire des
adresses d'E/S.
Je l'utilise pour contrôler le port parallèle d'une machine sous Linux.
Je cherche son équivalent FreeBSD, afin de faire la même chose sur une
autre machine sous FreeBSD.
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Lamaizière
Le #19951151
Thierry :

Sous Linux, le pseudo fichier /dev/port est un mappage mémoire des
adresses d'E/S.
Je l'utilise pour contrôler le port parallèle d'une machine sous Linux.
Je cherche son équivalent FreeBSD, afin de faire la même chose sur une
autre machine sous FreeBSD.



/dev/io je pense
Bruno Ducrot
Le #19958071
On 2009-08-19, Patrick Lamaizière wrote:
Thierry :

Sous Linux, le pseudo fichier /dev/port est un mappage mémoire des
adresses d'E/S.
Je l'utilise pour contrôler le port parallèle d'une machine sous Linux.
Je cherche son équivalent FreeBSD, afin de faire la même chose sur une
autre machine sous FreeBSD.



/dev/io je pense



Euh, non. Cela ne sert qu'a avoir l'access aux io. Ce n'est pas tout a
fait comme sous Linux. Disons que /dev/io est l'equivalent de la
fonction iopl() sous Linux.

Je ne pense pas qu'il existe un /dev/port equivalent a celui de Linux
sous FreeBSD.


Perso, j'ecris des trucs de ce genre, facilement adaptable pour l'OP.

#include #include
#include
#include
char rtc_desc[][100] = {
"RTC_SECONDS",
"RTC_SECONDS_ALARM",
"RTC_MINUTES",
"RTC_MINUTES_ALARM",
"RTC_HOURS",
"RTC_HOURS_ALARM",
"RTC_DAY_OF_WEEK",
"RTC_DAY_OF_MONTH",
"RTC_MONTH",
"RTC_YEAR",
"RTC_REG_A",
"RTC_REG_B",
"RTC_REG_C",
"RTC_REG_D",
};

int
main(void)
{
int iofd;
unsigned char addr, val;

if ((iofd = open("/dev/io", 000)) == -1)
err(1, NULL);

for (addr = 0; addr < 14; ++addr) {
__asm __volatile ("cli");
outb(0x70, addr);
inb(0x80);
val = inb(0x71);
__asm __volatile ("sti");
printf("%.2hhd: 0x%.2hhxn", addr, val);
}

close(iofd);

return 0;
}


--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Patrick Lamaizière
Le #19980621
Bruno Ducrot :

/dev/io je pense



Euh, non. Cela ne sert qu'a avoir l'access aux io. Ce n'est pas tout a
fait comme sous Linux. Disons que /dev/io est l'equivalent de la
fonction iopl() sous Linux.



Ah bon...

if ((iofd = open("/dev/io", 000)) == -1)
err(1, NULL);

for (addr = 0; addr < 14; ++addr) {
__asm __volatile ("cli");
outb(0x70, addr);
inb(0x80);
val = inb(0x71);
__asm __volatile ("sti");
printf("%.2hhd: 0x%.2hhxn", addr, val);
}

close(iofd);



Il doit manquer un truc parce que à vue de nez iofd n'est pas utilisé ?
(juste par curiosité)
Bruno Ducrot
Le #19982341
Bonjour,

On 2009-08-24, Patrick Lamaizière wrote:
Il doit manquer un truc parce que à vue de nez iofd n'est pas utilisé ?
(juste par curiosité)



Si tu lis la page de man, tu verra :

"Any process that holds a file descriptor on /dev/io open will get
its IOPL bits in the flag register set, thus allowing it to perform
direct I/O operations."

Par contre, tu ne pourra pas manipuler les ports, comme sous Linux,
a travers un pseudo-peripherique. Il te faut les coder soit en
assembleur, soit a travers des fonctions (ou bien des macros)
defini dans machine/cpufunc.h (pour les archi 386, pour les autres,
je n'ai pas ete voir).

A plus,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Publicité
Poster une réponse
Anonyme