Autor Thema: Maustreiber schreiben.  (Gelesen 22637 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 11. October 2005, 22:54 »
Hallo. Ich programmiere seit einiger Zeit ein eigenes OS. Schaut euch es mal auf meiner Webseite unter http://www.osm-page.de an. Wie ihr dort seht ist es erst in der Alpha-Version. Aber die Beta-Version ist so gut wie fertig. Also könnte ich sie auf meiner Webseite setzten. Würde mir nicht der Maustreiber den ich unbedingt haben will ein Problem bereiten. Ich möchte nämlich einen Maustreiber für Seriell und PS/2 schreiben. Aber mein Problem ist das ich so gut wie keine Daten über die Maustreiber-entwicklung habe. Ich weis dass der IRQ für COM1 vier, für COM2 drei und für PS/2 zwölf ist. Ich habe auch herausgefunden, dass der IRQ12 der int 74h ist. Wenn ich jetzt den int 74h meinen eigenen Code zuweise müsste dieser doch ausgeführt werden sobald ich etwas mit der PS/2-Maus mache (sie z.B. bewege). Tut er aber nicht. Dann habe ich herausgefunden dass ich die PS/2-Maus erst aktivieren muss. Aber meine Frage ist wie. Wie muss ich die PS/2-Maus aktivieren. Wenn ich dies getan habe führt sie dann automatisch den IRQ12 also int 74h aus? Welche Ports muss ich für den Datenaustausch (Daten der Maus empfangen und durch z.B. drücken senden) ansprechen? Die PS/2 nutzt doch auch den Tastaturcontroller oder? Aber wie weise ich der Maus meinen IRQ-Handler zu? Was muss in den IRQ-Handler rein und wie teste ich ob es sich um eine PS/2-Maus oder einer seriellen handelt. Ich finde einfach keine Infos darüber. Hoffentlich könnt Ihr mir helfen. Ich bitte so um Hilfe.

Danke!!!
In the Future everyone will need OS-64!!!

Kyoko12

  • Beiträge: 59
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. October 2005, 15:43 »
Wießt du das Beta test version und Alpha endgültige version heißt??????

mfg,
Kyoko12

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. October 2005, 15:52 »
Öhm Kyoko, wo haste denn den stuss her? Alpha kommt grundsätzlich vor Beta...  und ist damit definitiv keine fertige Version
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 12. October 2005, 16:31 »
@Topic:
Es gab mal das OS StormOS (Wird im nächsten Lowlevel vorgestellt), wo es auch einen Maustreiber gab. Da die Website inzwischen verschwunden ist, poste ich einfach mal den kompletten Code (inkl. russischer Kommentare). Interssant sind hier erstmal die Funktionen CheckPS2 und InitMouse.

typedef struct {
unsigned char LButton;
unsigned char RButton;

short X;
short Y;

unsigned char Moved;
unsigned char Pressed;
} TMouse;

TMouse Mouse;

#define KEYB_CTRL 0x64
#define KEYB_BUF 0x60

// naudojami ekrano dydio nustatymai, kad nereik� kviesti ekrano objekto
unsigned short sWidth, sHeight;

/**
 * �ungiama PS2 pel�
 * @param Width  ekrano ilgis
 * @param Height ekrano auk�is
 */
void InitMouse(unsigned short Width, unsigned short Height) {
CheckPS2();
outportb(KEYB_CTRL, 0xA8); //�ungiame PS2 pel� bendravim�

CheckPS2();
outportb(KEYB_CTRL, 0xD4);

CheckPS2();
outportb(KEYB_BUF, 0xF4); // �ungiame duomen siuntim�
CheckPS2();

sWidth = Width;
sHeight = Height;

// nustatome koordinates ties ekrano viduriu
Mouse.X = sWidth / 2;
Mouse.Y = sHeight / 2;

Mouse.Moved = 0;
Mouse.Pressed = 0;
}

/**
 * I�augomas ekrano buferis pelei ir nupie�ama pati pel�
 */
void InitMouseGFX() {
GetMouseBuffer(Mouse.X, Mouse.Y);
DrawMouse(Mouse.X, Mouse.Y);
}

/**
 * Patikriname Input Buffer Flag, Output Buffer Flag ir MOBF
 */
void CheckPS2() {
unsigned long i = 0xFFFF;

while((inportb(KEYB_CTRL) & 0x3) && i) {
inportb(KEYB_BUF);
i--;
}
}

/**
 * Klaviatros jungties skaitymas
 * @return pel� "Scan" kodas
 */
char ReadMouse() {
unsigned long i;
char Status, Byte = 0;

for(i = 0; i < 0xFFFF; i++) {
Status = inportb(KEYB_CTRL);

if(Status & 0x01) {
Byte = inportb(KEYB_BUF);

if(!(Status & 0xC0))
return Byte;
}
}
return Byte;
}


void IRQ12() {
Mouse.Pressed = 0;
Mouse.Moved = 0;

char Buf[3];
// skaitome tris pel� siun�amus baitus
Buf[0] = ReadMouse();
Buf[1] = ReadMouse();
Buf[2] = ReadMouse();

// ar buvo paspaustas pel�, kuris nors vienas mygtukas
// �a�me tada status�
if(Buf[0] & 1) {
Mouse.LButton = 1;
Mouse.Pressed = 1;
}

if((Buf[0] & 2) >> 1) {
Mouse.RButton = 1;
Mouse.Pressed = 1;
}


if(Buf[1] + Buf[2]) {
PutMouseBuffer(Mouse.X, Mouse.Y);

Mouse.X += Buf[1];
Mouse.Y -= Buf[2];

Mouse.Moved = 1;
// tikriname ar po naujo pel� pajudinimo nebuvo perengtos ekrano ribos
// X a�je
if(Mouse.X >= sWidth)
Mouse.X = sWidth - 1;
if(Mouse.X < 0)
Mouse.X = 0;

// Y a�je
if(Mouse.Y >= sHeight) Mouse.Y = sHeight - 1;
if(Mouse.Y < 0) Mouse.Y = 0;

GetMouseBuffer(Mouse.X, Mouse.Y);
DrawMouse(Mouse.X, Mouse.Y);
}
}

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 12. October 2005, 18:51 »
Kyoko12: Stuss

N00B: genau

DarkThing: Danke, aber ich kann kein russisch. Kannst du den Code erkähren? C ist auch nicht so meine Stärke. Wäre schön wenn das Assembler wäre. Aber ich versuche es mal in Assembler zu übersetzen. Vielen Dank!
In the Future everyone will need OS-64!!!

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 12. October 2005, 19:04 »
Das ist allerdings auch kein Russisch^^ Russisch wird zu allermeist in Kyrillischen Buchstaben geschrieben. Und selbst wenn man es in Lateinischen Buchstaben umschreibt ist Russisch anders
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 12. October 2005, 19:08 »
InitMouse proc near
call CheckPS2
mov al,0A8h
out 64h,al
call CheckPS2
mov al,0D4h
out 64h,al
call CheckPS2
mov al,0F4h
out 60h,al
call CheckPS2
?
InitMouse endp


So, den rest habe ich nicht verstanden bzw. kann ich nicht übersetzten. Kannst du (könnt ihr) mir helfen? Hast du (habt ihr) eine Doku wo erklährt wird was z.B. A8h, D4h und F4h bewirken? Ich wäre sehr dankbar. Danke!!!
In the Future everyone will need OS-64!!!

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. October 2005, 13:36 »
Die Funktion ReadMouse liefert (denk ich) ein Byte Daten von der Maus - Ähnlich wie beim Keyboardtreiber "in 0x60". Die Funktion IRQ12 ist einfach der IRQ-Handler, der in der IDT eingetragen werden muss. Dort werden 3 Bytes mit Hilfe von ReadMouse geholt und die neue Position errechnet.

Ansonsten gibts noch hier ein paar Tuts über Maustreiber:
http://www.nondot.org/sabre/os/articles/HumanInterfaceDevices/

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 13. October 2005, 19:06 »
Danke. Aber jetzt weis ich auch nicht mehr wie vorher. In dem Link wird nur der int 33h beschrieben. Der ist aber kein Treiber sondern ein int der den vorhandenen Treiber nutzt. Ich muss so einen aber selber schreiben. Also meine Frage ist erst einmal: Wie bringe ich die Maus dazu (wenn ich sie z.B. bewege, drücke) den IRQ12-Handler (int 74h) anzuspringen? Mehr möchte ich erst mal gar nicht wissen. Wie aktiviere ich die Maus und mache ihr klar das sie den int 74h anspringen soll? Dann könnte ich ja einfach eine Adresse den IRQ12 (int 74h) zuweise die z.B. eine Meldung ausgibt und den EOI (end of interrupt) also mov al,20h out A0,al out 20,al sendet. Dann würde ich doch immer wenn ich die Maus benutze eine Meldung bekommen. Somit könnte ich erst einmal testen ob das bis dahin funktioniert und dann später die richtigen Sachen den IRQ12 zuweisen. Kann doch so gemacht werden oder? Also wie bringe ich die Maus dazu den IRQ12 anzuspringen? Danke!!!

edit: Ach ja, alles in Assembler bitte. Danke
In the Future everyone will need OS-64!!!

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 14. October 2005, 14:38 »
Du musst die Adresse des Handlers genau wie bei allen anderen Interrupt-Handlern (Exceptions, Timer, Keyboard, ...) an der richtigen Position in die IDT eintragen. Anschließend kannst du die Maus initialisieren (mit InitMouse). Das ist eigentlich schon alles.

Tutorials zur IDT gibts in Lowlevel, auf www.osdever.net , usw.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 14. October 2005, 14:44 »
bitmasters OS arbeitet im Realmode, daher verwendet er keine IDT, sondern die IVT.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 14. October 2005, 16:33 »
Ja genau ich arbeite im Real-Mode und nutze deswegen die IVT. Aber wenn ich die Maus mit initmouse initialisiere und in der IVT an Adresse 74h*4 meine routine schicke führt der PC sie nicht aus wenn ich die Maus beispielsweise bewege. Warum? Ist das initmouse überhaubt richtig wie ich das weiter oben in ASM übersetzt habe? Sagen wir mal es würde funktionieren, hat keine eine Doku die dies erklährt? Ich möchte auch wissen was das bedeutet und nicht einfach Code kopieren und sagen ja es funst. Bitte um Hilfe. Ich weis nicht mehr weiter.  :cry:
In the Future everyone will need OS-64!!!

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 14. October 2005, 18:05 »
Ich wusste doch das ich was dazu schon mal gesehen habe

http://www.osdever.net/documents.php?cat=8&sort=1

vielleicht hilfts. Schickes os mal so am rande. In welchem Grafik Modus arbeitest du?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 14. October 2005, 22:28 »
Zitat von: matthieuriolo
Ich wusste doch das ich was dazu schon mal gesehen habe

http://www.osdever.net/documents.php?cat=8&sort=1

vielleicht hilfts.
danke, aber dort wird nicht beschrieben wie ich die PS/2-Maus aktiviere und sie somit zum IRQ12 zwinge.
Zitat von: matthieuriolo
Schickes os mal so am rande. In welchem Grafik Modus arbeitest du?
Machst du dich lustig oder ist das ernst? Ich arbeite nicht im Grafikmodus sondern im Textmodus. Modus 3 heißt er.
In the Future everyone will need OS-64!!!

matthieuriolo

  • Beiträge: 226
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 15. October 2005, 13:40 »
Zitat von: bitmaster
Machst du dich lustig oder ist das ernst? Ich arbeite nicht im Grafikmodus sondern im Textmodus. Modus 3 heißt er.


Nein mach ich nicht, aber ich frage weil ich gerne wüsste wie du den Hintergrund färbst.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 15. October 2005, 14:32 »
Zum Färben des Hintergrundes gibts ein paar Bits im Attribut Byte im Textmodus. Ich glaube das wird auch in einem Magazin hier auf der Seite erklärt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #16 am: 15. October 2005, 22:27 »
Zitat von: matthieuriolo
Zitat von: bitmaster
Machst du dich lustig oder ist das ernst? Ich arbeite nicht im Grafikmodus sondern im Textmodus. Modus 3 heißt er.


Nein mach ich nicht, aber ich frage weil ich gerne wüsste wie du den Hintergrund färbst.
Mach ein neues Thema darüber auf und ich werde dir zeigen wie ich das mache. Hier möchte ich dir das nicht erklären, weil es dann vielleicht nur noch darum geht und nicht um die Maus. Bitte um Verständnis.
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 22. October 2005, 21:12 »
hi,
C++ ist zwar nicht mein Spezialgebiet (Pascal und asm sind besser  :D ), aber so ungefähr müsste es stimmen:


Loop:
  mov dx,KEYB_CTRL       ; wenn KEYB_CTRL ne Variable ist, dann [KEYB_CTRL] schreiben
  in al,dx
  and al,0x03
  and eax,[i]                    ; zwecks verständlichkeit drin, könnte man weglassen
  cmp eax,0                     ; könnte man ebenfalls weglassen
  jz Ende:
  mov dx,KEYB_BUF
  in al,dx
  dec [i]
  jmp Loop

Ende:
  ...

i dd 0


Aber ich bin mir nicht sicher, wie man einmal das "&" und dann das "&&" übersetzt, in meinen Augen ist in diesem Fall das beides ein AND (wobei ich && bei Vergleichen kenne).
probiers einfach mal aus.

cu,
stefan2005

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 22. October 2005, 21:13 »
EDIT: Argh, hatte einen kleinen Fehler

[global checkPS2]
checkPS2:
push ecx
push edx

mov ecx, 0xFFFF
mov dx, KEYB_CTRL

check:
in al, dx
and al, 0x3
cmp al, 0
jnz check_ok
loop check

jmp check_failed

check_ok:
mov dx, KEYB_BUF
in al, dx

check_failed:
pop edx
pop ecx
ret


Ich habe den Code nicht getestet, sollte aber funktionieren.
Kompilier doch einfach den Code mit "gcc -S -o ps2.asm ps2.c" und sieh dir das Ergebniss an^^

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 23. October 2005, 13:22 »
Zitat von: stefan2005
Aber ich bin mir nicht sicher, wie man einmal das "&" und dann das "&&" übersetzt, in meinen Augen ist in diesem Fall das beides ein AND (wobei ich && bei Vergleichen kenne).

Ein && ist ein boolesches and. Das heißt, dass es nur true liefert wenn zwei Variablen/Werte auch true sind.
Ein normales & bedeutet bitweises and. Da werden also die zwei Werte/Vars binär geandet.

 

Einloggen