3 Kwi 2000, 03:00
Lukasz Komsta

Witam,

libc6), który by na chwilę ( powiedzmy 1 s ) zmieniał stany linii DTR i
DSR na danym RS232 (np. com2)? Tzn. żeby zmieniał na przeciwny od tego,
w którym się znajdują ot tak surowo (chyba z niskiego na wysoki). Chcę
mieć możliwość zdalnego wejścia na serwer i włączenia-wyłączenia pewnego
urządzenia. I prosiłbym o komentarz gdzie się ustawia czy DTR czy DSR, i
adres portu. Dalej to sobie poradzę :-)

Dziękuję niezmiernie z góry

Pozdrawiam,

Luke




3 Kwi 2000, 03:00
Lukasz Komsta


adres portu. Dalej to sobie poradzę :-)



Ewentualnie linie na LPT tak jak się do Covoxa robiło w Pascalu
port[$378]:=cośtam :-)

Luke


4 Kwi 2000, 03:00
Cezary H. Noweta

Witam,


libc6), który by na chwilę ( powiedzmy 1 s ) zmieniał stany linii DTR i
DSR na danym RS232 (np. com2)? Tzn. żeby zmieniał na przeciwny od tego,
w którym się znajdują ot tak surowo (chyba z niskiego na wysoki).



DTR:

void invert_dtr(int fd)
{
  int control_modem;

  ioctl(fd, TIOCMGET, &control_modem);
  control_modem ^= TIOCM_DTR;
  ioctl(fd, TIOCMGET, &control_modem);

}



DSR sie nie da, bo jest to sygnal _wejsciowy_ - mozna go tylko odczytac.
Musisz miec jednak otwarty port ("/dev/ttyS#"). Jesli chcesz bezposrednio
przez porty, to:

man ioperm (lub iopl)
man outb

dadza informacje jak korzystac bezposrednio z portow (musisz byc rootem)
oraz

DTR to bit 0 rejestru Modem Control Register (O - offset 4)
DSR to bit 5 rejestru Modem Status Register (I - offset 6).

Modem Control Register jest portem tylko do zapisu - nie mozna odczytywac
stanu. IOCTL TIOCMGET zwraca status z wewnetrznego bufora a nie portu I/O.
Dlatego, w przypadku bezposredniego dostepu do portow trzeba wiedziec co
zapisac - 0 lub 1 - nie mozna odwrocic. Byc moze jednak odczyt zwraca
ostatnio zapisana wartosc (na pewno nie stan linii), wiec moze warto
potestowac.

Modem Status Register jest portem tylko do odczytu.

  -- pozdrawiam


4 Kwi 2000, 03:00
Andrzej M. Ostruszka





[...]
void invert_dtr(int fd)
{
 int control_modem;

 ioctl(fd, TIOCMGET, &control_modem);
 control_modem ^= TIOCM_DTR;
 ioctl(fd, TIOCMGET, &control_modem);



                  ^
Chyba:            S

                                        Pozdrawiam




4 Kwi 2000, 03:00
Cezary H. Noweta

Witam,


[...]
| void invert_dtr(int fd)
| {
|  int control_modem;

|  ioctl(fd, TIOCMGET, &control_modem);
|  control_modem ^= TIOCM_DTR;
|  ioctl(fd, TIOCMGET, &control_modem);
                  ^
Chyba:            S



Jasne - dzieki.

  -- pozdrawiam


6 Kwi 2000, 03:00
Lukasz Komsta


man ioperm (lub iopl)
man outb



Dziękuję za wyczerpującą odpowiedź, jednak man outb odwołuje się do
outb(9) którego nie ma nigdzie (nawet na stronach z manualami w html.
ioperm też jest lakoniczny i nie bardzo wiadomo jak go wywołać.

Czy można poprosić o 2 proste funkcje, które beda odpowiednikiem
pascalowych

procedure send( a : byte );
begin
        port[$0378]:=a;
end;

function receive : byte;
begin
        result:=port[$0378];
end;

z włączeniem tego ioperm

Co do tego sterowania liniami RS232 to znalazłem stosowne informacje.
Gdzie i jak trzeba wywołać to ioperms. I oczywiście wiem że program
będzie nieprzenośny pomiędzy platformami :-) i trzeba mieć roota -takie
założenia są oczywiście poczynione.

Dziękuję bardzo!

LK


6 Kwi 2000, 03:00
Cezary H. Noweta

Witam,

[...] man outb odwołuje się do
outb(9) którego nie ma nigdzie (nawet na stronach z manualami w html.
ioperm też jest lakoniczny i nie bardzo wiadomo jak go wywołać.

Czy można poprosić o 2 proste funkcje, które beda odpowiednikiem
pascalowych

procedure send( a : byte );
begin
        port[$0378]:=a;
end;



void send(char a)
{
  if ( ioperm(0x0378, 1, 1) < 0 )
    return;

  outb(a, 0x0378);

  ioperm(0x0378, 1, 0);

}
function receive : byte;
begin
        result:=port[$0378];
end;



char receive(void)
{
  char res;

  if ( ioperm(0x0378, 1, 1) < 0 )
    return(-1); /* cos trzeba zwrocic - moze zamienic na int receive() ? */

  res = inb(0x0378);

  ioperm(0x0378, 1, 0);

  return(res);

}
z włączeniem tego ioperm



ioperm() sluzy do nadania/odebrania sobie dostepow do portow I/O,
poniewaz kazdy proces (nawet root-a) jest uruchamiany w tzw. 'user-space'
z IOPL == 0. Pierwszy parametr to poczatkowy port, drugi, to ilosc portow,
a trzeci, to 0 == zabierasz dostep, 1 == nadajesz dostep. Np. chcac nadac
sobie dostep do portow 0x0200-0x0204, wywolujesz:

ioperm(0x0200, 5, 1);

Nie zmienia Ci to IOPL lecz ustawia odpowiednie bity w masce. Jadro
nadal dostaje wyjatek o nieuprawnionym dostepie do portow I/O, ale,
gdy masz wlaczony dostep do danego portu, to jadro wysyla/odczytuje
odpowiednie wartosc.

Innym sposobem uprawniajacym do bezposredniego dostepu I/O jest
funkcja iopl(), ktora juz zmienia Ci IOPL (np. iopl(3) powoduje
nadanie uprawnien, iopl(0) - odebranie upranien do wszystkich portow I/O).
Jest to metoda efektywniejsza (dostep do portow jest natychmiastowy,
a nie przez obsluge wyjatkow jadra), ale mniej bezpieczna. iopl()
jest konieczna w przyadku numerow portow 0x03FF, bo maska
ustawiana przez ioperm() ma 128 bajtow (* 8 = 1024 bitow i tylez portow).

W ktoryms z poprzednich postow Wojciech Borczyk pisal, ze iopl() jest
dostepna rowniez na FreeBSD - wiec bardziej przenosna.

Jesli bedziesz kilkakrotnie przesylal/czytal dane, to chyba najlepiej:

ioperm(0x0378, 1, 1); /* lub iopl(3); */

outb(v1, 0x0378);
outb(v2, 0x0378);
v3 = inb(0x0378);
v4 = inb(0x0378);
outb(v5, 0x0378);
/* ......... itd. */

ioperm(0x0378, 1, 0); /* lub iopl(0); */

outb, inb sa typu extern inline, wiec musisz kompilowac z optymalizacja
(-O, -O2, itd.). Naglowek dla inb/outb to #include <asm/io.h

  -- pozdrawiam


6 Kwi 2000, 03:00
Maciej W. Rozycki





[Niezwykle przenosny program wyciety -- ciekawe jak dziala dla kart PCI?]

Nie zmienia Ci to IOPL lecz ustawia odpowiednie bity w masce. Jadro
nadal dostaje wyjatek o nieuprawnionym dostepie do portow I/O, ale,
gdy masz wlaczony dostep do danego portu, to jadro wysyla/odczytuje
odpowiednie wartosc.



 Nie ma zadnych wyjatkow -- ustawiane sa odpowiednie bity w mapie zezwolen
we/wy w segmencie TSS.

Jest to metoda efektywniejsza (dostep do portow jest natychmiastowy,
a nie przez obsluge wyjatkow jadra), ale mniej bezpieczna. iopl()
jest konieczna w przyadku numerow portow 0x03FF, bo maska
ustawiana przez ioperm() ma 128 bajtow (* 8 = 1024 bitow i tylez portow).



 Roznica w efektywnosci jest zadna.

W ktoryms z poprzednich postow Wojciech Borczyk pisal, ze iopl() jest
dostepna rowniez na FreeBSD - wiec bardziej przenosna.



 Jest rowniez na Alpha/Linux i pewnie dla innych architektur, w
implementacjach ktorych spotyka sie PCI.  Co nie zmienia faktu, ze trudna
nazwac ja przenosna.

outb, inb sa typu extern inline, wiec musisz kompilowac z optymalizacja
(-O, -O2, itd.). Naglowek dla inb/outb to #include <asm/io.h



 A czasem sa implementowane jako funkcje libc -- ostroznie z takimi
zalozeniami.

 W praktyce, w zaleznosci od zastosowania, najlepiej wykorzystac


6 Kwi 2000, 03:00
Cezary H. Noweta

Witam,


[Niezwykle przenosny program wyciety -- ciekawe jak dziala dla kart PCI?]



?????
Co to ma wspolnego z RSem/LPTem?? A jak ma dzialac dla kart PCI?
Dziala normalnie. RS/LPT sa na interfejsie SuperIO. Co ma PCI do I/O??
Bezposrednio za komunikacje IO pomiedzy procesorem a ukladami odpowiedzialny
jest glownie chipset a nie procesor (nawet do pamieci ma dostep przez chipset).
A juz napewno nie zaden software (chyba, ze "software" w chipsecie).
out dx, al zadziala tak samo dla karty ISA, PCI, AGP i in.

 Nie ma zadnych wyjatkow -- ustawiane sa odpowiednie bity w mapie zezwolen
we/wy w segmencie TSS.



Racja.

 Roznica w efektywnosci jest zadna.



Nadal jest, choc mniejsza (i nie przy kazdym wykonaniu in/out przez
procesor), na korzysc IOPL.

| W ktoryms z poprzednich postow Wojciech Borczyk pisal, ze iopl() jest
| dostepna rowniez na FreeBSD - wiec bardziej przenosna.

 Jest rowniez na Alpha/Linux i pewnie dla innych architektur, w
implementacjach ktorych spotyka sie PCI.  Co nie zmienia faktu, ze trudna
nazwac ja przenosna.



Linux generalnie ma tam gdzie moze, czyli tylko Intel ;). Alpha akurat nie ma.
Jesli gdzies jest iopl lub ioperm to zwraca EIO. Jaki zwiazek ma PCI
z iopl/ioperm?

| outb, inb sa typu extern inline, wiec musisz kompilowac z optymalizacja
| (-O, -O2, itd.). Naglowek dla inb/outb to #include <asm/io.h

 A czasem sa implementowane jako funkcje libc -- ostroznie z takimi
zalozeniami.



Twoja ostroznosc jest duza nieostroznoscia ;) Program skompilowany z -O
zlinkujesz zarowno z extern inline jak i ze "zwykla" extern, bez -O juz tylko
druga wersje, bo ta pierwsza jest tylko w naglowkach.

 W praktyce, w zaleznosci od zastosowania, najlepiej wykorzystac



Tylko, ze trzeba otworzyc urzadzenie, co powoduje nie zawsze porzadana
inicjalizacje, a chodzilo tylko o zmiane stanu jednej linii. I po to pisac
sterownik?! A propos przenosnosci, to pisanie programow wymagajacych
wlasnego jadra lub wlasnych modulow jadra, lekko ogranicza przenosnosc.

  -- pozdrawiam


7 Kwi 2000, 03:00
Lukasz Komsta


Witam,

void send(char a)
{
[...]
}



O!!! Teraz wszystko jasne, dziękuję bardzo!

LK


13 Kwi 2000, 03:00
Maciej W. Rozycki


Co to ma wspolnego z RSem/LPTem?? A jak ma dzialac dla kart PCI?
Dziala normalnie. RS/LPT sa na interfejsie SuperIO. Co ma PCI do I/O??



 Mam na mysli porty szeregowe na karcie PCI.  Zwykle sa zgodne z 16550A,
ale adresy we/wy sa ustalane dynamicznie -- moga byc inne przy kazdym
starcie maszyny.

|  Roznica w efektywnosci jest zadna.

Nadal jest, choc mniejsza (i nie przy kazdym wykonaniu in/out przez
procesor), na korzysc IOPL.



 Tylko jesli zostanie zgloszony wyjatek.  Przypadki typu wyjatek braku
strony przy dostepie do bitmapy w TSS wykluczam -- w Linuxie nie
wystepuja.

|  Jest rowniez na Alpha/Linux i pewnie dla innych architektur, w
| implementacjach ktorych spotyka sie PCI.  Co nie zmienia faktu, ze trudna
| nazwac ja przenosna.

Linux generalnie ma tam gdzie moze, czyli tylko Intel ;). Alpha akurat nie ma.



 Funkcje inb(), outb() i pokrewne sa dla Alfy wspierane.  W rozny sposob
dla jadra i programow uzytkowych.  Polecam studium zrodel.

Jesli gdzies jest iopl lub ioperm to zwraca EIO. Jaki zwiazek ma PCI



 Ostatnio gdy sprawdzalem zrodla glibc, dzialo sie inaczej.  Funkcje
iopl() i ioperm() dzialaly zgodnie z definicja.  Wykorzystuja je m.in.
serwery X i program SVGATextMode.  Mam na mysle platforme Alpha.  Co do
innych -- nie sprawdzalem.

 Naprawde polecam studium glibc -- implementacja iopl() i ioperm() na Alfe
jest bardzo pomyslowa.

z iopl/ioperm?



 Jesli z poziomu uzytkowego chcesz miec dostep do odwzorowanych w
przestrzen we/wy zasobow urzadzen PCI, to sila rzeczy musisz wykorzystac
jedna z tych funkcji.  Niezaleznie od platformy.

Twoja ostroznosc jest duza nieostroznoscia ;) Program skompilowany z -O
zlinkujesz zarowno z extern inline jak i ze "zwykla" extern, bez -O juz tylko
druga wersje, bo ta pierwsza jest tylko w naglowkach.



 Mialem na mysli jedynie fakt deklaracji jako "extern inline".  Oczywiscie
jest to czasami prawdziwe i jako takie rzeczywiscie wymaga wlaczenia
optymalizacji.

 BTW, wlasciwy naglowek to <sys/io.h-- <asm/io.hmoze nie odpowiadac
definicjom funkcji glibc.

Tylko, ze trzeba otworzyc urzadzenie, co powoduje nie zawsze porzadana
inicjalizacje, a chodzilo tylko o zmiane stanu jednej linii. I po to pisac



 Zalezy od stopnia uniwersalnosci.  Dla pojedynczego zastosowania byc moze
nie warto tracic czasu na wyrafinowane rozwiazanie.

sterownik?! A propos przenosnosci, to pisanie programow wymagajacych
wlasnego jadra lub wlasnych modulow jadra, lekko ogranicza przenosnosc.



 Hmm, "serial" jest w miare standardowy...


13 Kwi 2000, 03:00
Cezary H. Noweta

Witam,


| Co to ma wspolnego z RSem/LPTem?? A jak ma dzialac dla kart PCI?
| Dziala normalnie. RS/LPT sa na interfejsie SuperIO. Co ma PCI do I/O??

 Mam na mysli porty szeregowe na karcie PCI.  Zwykle sa zgodne z 16550A,
ale adresy we/wy sa ustalane dynamicznie -- moga byc inne przy kazdym
starcie maszyny.



Zgoda, tylko, ze chodzilo o funkcje zapisujace/czytajace port 0x378, a nie
obsluge portow szeregowych w ogolnosci. BTW, 0x378 to jeden z adresow
bazowych LPTa.

|  Jest rowniez na Alpha/Linux i pewnie dla innych architektur, w
| implementacjach ktorych spotyka sie PCI.  Co nie zmienia faktu, ze trudna
| nazwac ja przenosna.

| Linux generalnie ma tam gdzie moze, czyli tylko Intel ;). Alpha akurat nie ma.

 Funkcje inb(), outb() i pokrewne sa dla Alfy wspierane.  W rozny sposob
dla jadra i programow uzytkowych.  Polecam studium zrodel.

| Jesli gdzies jest iopl lub ioperm to zwraca EIO. Jaki zwiazek ma PCI

 Ostatnio gdy sprawdzalem zrodla glibc, dzialo sie inaczej.  Funkcje
iopl() i ioperm() dzialaly zgodnie z definicja.  Wykorzystuja je m.in.
serwery X i program SVGATextMode.  Mam na mysle platforme Alpha.  Co do
innych -- nie sprawdzalem.

 Naprawde polecam studium glibc -- implementacja iopl() i ioperm() na Alfe
jest bardzo pomyslowa.



inb/outb jest wszedzie - mowa byla o ioperm/iopl, ktore w _jadrze_ sa tylko
na Intela 80x86.

| z iopl/ioperm?

 Jesli z poziomu uzytkowego chcesz miec dostep do odwzorowanych w
przestrzen we/wy zasobow urzadzen PCI, to sila rzeczy musisz wykorzystac
jedna z tych funkcji.  Niezaleznie od platformy.



To na Alphie. GLIBCowe ioperm sluzy wlasnie do mapowania adresow I/O.
Gwoli scislosci, na Intelu przestrzen I/O jest niezalezna od przestrzeni adresowej
pamieci. Koniecznosc uzycia tutaj ioperm/iopl wynika ze stosowanych
mechanizmow ochrony I/O (charakterystycznych dla Intela) i nie ma zadnego
zwiazku z rodzajem szyny - trzeba stosowac przy kazdym inb/outb. inb/outb
rozwijaja sie odpowiednio w instrukcje in/out procesora.

Na Alphie GLIBCowe inb/outb/ioperm sa emulacja intelowskich odpowiednikow -
- iopl jest wrapperem dla ioperm mapujacym wszystkie porty 0-65535.

Jesli chodzi o mapowanie rejestrow urzadzen na przestrzen adresowa pamieci,
to dla Intela nie ma roznicy w porownaniu z dostepem do normalnej pamieci -
- system operacyjny musi zadbac tylko o wylaczenie cache-owania zamapowanych
obszarow. Dostep do takich portow odbywa sie tak samo
jak do pamieci (np. MOV) i stosowane sa te same mechanizmy ochrony co do
pamieci (segmenty, stronicowanie) wiec ioperm/iopl nie ma tutaj zastosowania.

 BTW, wlasciwy naglowek to <sys/io.h-- <asm/io.hmoze nie odpowiadac
definicjom funkcji glibc.



Np. na Alphie ;)

  -- pozdrawiam


serwer bez stacji dyskietek, jak załadować sterownik z płytki CD do kontrolera sata?
Pisanie sterownikow dla Linuxa-problemy z plikami naglowkowymi jadra.
Sterowniki do 3CSOHO100B-TX (Red Hat 8.0)
Sterownik piszę - szukam pomocy
  • 2197 results
  • actor network theory
  • zagraj w gta 2 30
  • superancki prezent dla 5 latka
  • btt fiat 127 by b marthez
  • kpp tarnowskie gory
  • index 9400
  • owczarek podhalaF1ski forum
  • uzdrwisko cieplice
  • Zestaw wiadomości z for internetowych - Indeks