Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Accès aux E/S sous FreeBSD

4 réponses
Avatar
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.

4 réponses

Avatar
Patrick Lamaizière
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
Avatar
Bruno Ducrot
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 <fcntl.h>
#include <stdio.h>

#include <sys/types.h>

#include <machine/cpufunc.h>

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.
Avatar
Patrick Lamaizière
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é)
Avatar
Bruno Ducrot
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.