Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » WEGA Abschusstreiber » Themenansicht

Autor Thread - Seiten: -1-
000
14.05.2011, 22:20 Uhr
kaiOr

Avatar von kaiOr

Hallo,

falls hier noch andere Nutzer via Konsolenserver und Laptop fern der RESET-Taste sitzen. Mein erstes kleines Treibermodul für Rücksprung zum 8Bit-Teil (MON8 o. UDOS): udev1.o

Installation:
Datei an P8000 senden (nicht umbenennen!), am besten direkt in den Ordner /usr/sys/conf

Kernel neu bauen...

Quellcode:
#1 cd /usr/sys/conf
#2 sysgen

Do you want to change system constants ? : n
Do you want to change file system layout ? : n
Do you want to change version parameters ? :n
Do you want to add new driver to the system ? : y
Enter the name of the driver object : udev1.o

#3 mv wega /wega
#4 mv boot /usr/boot
#5 chmod 400 /wega /usr/boot

Device anlegen...

Quellcode:
#6 mknod /dev/jump8 c 10 0
#7 chmod 600 /dev/jump8

und Kiste noch einmal sauber neustarten.

Ab sofort führt jeder Zugriff (vom Administrator) auf /dev/jump8, egal ob lesend oder schreibend zum Rücksprung (z.B. "echo 'ByeBye' >/dev/jump8"). Wer ohne Diskette gestartet hatte landet wieder im 8Bit-Monitor, ansonsten ist man in UDOS, was sich mit "D" beenden lässt.

Achso und immer vorher ans 'sync'en denken, sonst gibt's Datenverlust.

MfG

Dieser Beitrag wurde am 14.05.2011 um 23:59 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
16.05.2011, 19:16 Uhr
kaiOr

Avatar von kaiOr

Mh, noch keine Buhrufe und keine zerstörten Kernel? Fein, dann setze ich noch einen drauf.

Der Treiber wurde nochmal abgeändert. Jetzt kann man noch ein 2tes Device anlegen (Name beliebig nur die Parameter müssen stimmen):
mknod /dev/visit8 c 10 1
chmod 600 /dev/visit8

Mit dem Effekt:
echo >/dev/jump8 --> 16Bit-Teil geht auf RESET
echo >/dev/visit8 --> Wega läuft im Hintergrund weiter

Bei letzterem kann man unter UDOS mit dem Befehl "X" oder "WEGA" (von der Startdisk) auch wieder zurück ins laufende UNIX hopsen. Evtl. praktisch wenn man die Wega-Startdisk duplizieren möchte bzw. selbige fix unter UDOS vorformatieren möchte (geht ja in Wega nicht).

Das ganze ist allerdings mit Vorsicht zu genießen. Wega wird seine Bildschirmausgaben nicht mehr los und der Puffer entlädt sich dann beim Rücksprung und verursacht möglicherweise fehlerhafte Aus- u. Eingaben. Wer ohne laufendes UDOS in ein Wega zurückkehrt was mit laufendem UDOS gestartet wurde bringt selbiges bei Floppyzugriff zum Aufhängen...

MfG

Dieser Beitrag wurde am 16.05.2011 um 19:34 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
17.05.2011, 11:28 Uhr
holm

Avatar von holm

Naja, einen Buh Ruf kannst Du haben:

Laß Dir was einfallen das Ding zu entschärfen, z.B. nur bei jedem Schreibzugriff auf die Devices reagieren..
So wäre mit das einfach zu riskant.

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
17.05.2011, 11:36 Uhr
kaiOr

Avatar von kaiOr

EDIT2: Habe den Treiber jetzt angepasst (Link bleibt der alte), danke für den Hinweis.

EDIT: Ups, da war ich voreilig, 'chmod 200' scheint nicht zu greifen.
Muss ich wohl doch nochmal ran.


Zitat:
kaiOr schrieb Dann machst Du einfach 'chmod 200 /dev/...' anstatt '600'.

Das Praktische ist ja, dass man als Admin sogar '000' setzen kann ohne sich selbst das Recht zu nehmen mit chmod die Rechte danch auch wieder hoch zu setzen.

Naja, vielleicht kann Olli irgendwann auch einmal drüber schauen ob es besser geht, ich habe letztlich nur versucht ein Assembler-Schnipsel in C umzuwandeln. Ist alles noch Neuland für mich.

MfG
Kai

Dieser Beitrag wurde am 17.05.2011 um 12:35 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
18.05.2011, 12:46 Uhr
holm

Avatar von holm

:-)

Das war mit klar...

So wie das jetzt ist, müßte ein tar oder cpio das die Devices sichert den Rechner zuverlässig abstürzen lassen. Das ist echt nicht ganz das Gelbe vom Ei.

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}

Dieser Beitrag wurde am 18.05.2011 um 12:46 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
18.05.2011, 12:52 Uhr
kaiOr

Avatar von kaiOr

Das hätte ich nun nicht gedacht, der 16Bit-Teil geht förmlich auf HALT solange man weg ist. Nichtmal die Softwareuhr tickt weiter, die Echtzeituhr dagegen schon, aber die wird ja nur beim Booten eingelesen.
Da müsste man sich irgendwann noch den Koppeltreiber von Wega anschauen, ob man den partiell schlafen schicken kann, damit Prozesszeit frei wird.

@holm: Ja, im Moment tu ich nur auslösen und beobachten was passiert.
Das was du ansprichst gehört schon nichtmehr in einen Treiber, wir wollen den Kernel ja nicht unnötig aufblasen, da bräucht es schon ein Hilfsprogram.

Dieser Beitrag wurde am 18.05.2011 um 12:58 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
18.05.2011, 13:10 Uhr
holm

Avatar von holm

...doch gehört.. und zwar in die strategy routine.
Der Treiber sollte auf ein definiertes Kommando reagieren, speziell dieser hier.

Ein 'echo "reboot8" > /dev/rigendwas währe IMHO sauber.

Gruß,

Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
18.05.2011, 13:24 Uhr
kaiOr

Avatar von kaiOr

Ach sowas meinst Du, ja das könnte ich noch machen.

Ich dachte da eher an einen Ersatz für den "init 1" oder "halt"-Befehl...Prozesse killen, Logs schreiben oder im Falle dieses Hin- und Zurücksprunges die Terminalausgaben abfangen, damit kein Kauderwelsch kommt.

PS: Muss aber noch etwas warten, singe morgen bei einem neuen Brötchengeber vor....

MfG
Kai
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
18.05.2011, 14:04 Uhr
Olli

Avatar von Olli

magst du denn mal den Quellcode verlinken?
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
18.05.2011, 14:59 Uhr
kaiOr

Avatar von kaiOr

Im Moment ist der Code noch gar keinen Link wert.
Alle Funktionen sind leer bis auf eine:


Quellcode:
#include <sys/param.h>

u1write (dev)
register dev_t dev;
{
    /* Adressen der Koppel-PIO zum 8Bit-Teil */
    unsigned int PIO0A = 0xff91;    /* Kanal A: Datenport */
    unsigned int PIO0B = 0xff93;    /* Kanal B: Steuerport */

    int STAT8E = 0x1e;    /* EXIT-Status */
    int STAT8Q = 0x51;    /* 'Q' - QUIT ohne Reset */
    int STAT8R = 0x52;    /* 'R' - QUIT mit Reset */

    int STATUS;
    do {
        STATUS = inb(PIO0B);
    }while (STATUS != (STATUS & 0xbf));    /* Bit6=1? -> PIO beschaeftigt  */

    switch (minor(dev))
    {
    case 0:        outb(PIO0A, STAT8R);    /* 'R' ausgeben */
                break;
    default:    outb(PIO0A, STAT8Q);    /* 'Q' ausgeben */
    }

    outb(PIO0B, STAT8E);    /* EXIT anmelden */
    STAT8E = STAT8E | 0x01;    /* Bit0=1, INT8-Bit auf 1 setzen */
    outb(PIO0B, STAT8E);    /* INT8 ausgeben */

    switch (minor(dev))
    {
    case 0:        STAT8R = STAT8R | 0x40;    /* Bit6=1 für Acknowledge */
                outb(PIO0A, STAT8R);    /* Acknowledge asenden */
                break;
    dafault:    STAT8Q = STAT8Q | 0x40;
                outb(PIO0A, STAT8Q);
    }
}

MfG

Dieser Beitrag wurde am 19.05.2011 um 13:21 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
19.05.2011, 00:12 Uhr
tp




Zitat:
kaiOr schrieb

Quellcode:
switch (minor(dev))
    {
    case 0:        outb(PIO0A, STAT8R);    /* 'R' ausgeben */
    default:    outb(PIO0A, STAT8Q);    /* 'Q' ausgeben */
    }


Hmm, dass er im Fall von minor(dev) == 0 alle beide out Befehle ausführt ist Absicht?
--
Die Zeit ist auch nicht mehr, was sie mal war! (Albert Einstein)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
19.05.2011, 08:11 Uhr
kaiOr

Avatar von kaiOr


Zitat:
tp schrieb
Hmm, dass er im Fall von minor(dev) == 0 alle beide out Befehle ausführt ist Absicht?

In "default" fällt nur rein was nicht mit "case" abgedeckt ist.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
19.05.2011, 10:13 Uhr
lux-O-mat




Zitat:
kaiOr schrieb

Zitat:
tp schrieb
Hmm, dass er im Fall von minor(dev) == 0 alle beide out Befehle ausführt ist Absicht?

In "default" fällt nur rein was nicht mit "case" abgedeckt ist.

Soweit mich meine C-Kenntnisse nicht täuschen, hat tp da aber Recht.
Du brichst das case nicht mit break ab. Wenn minor(dev) == 0 eintritt, wird zwar "case 0" abgearbeitet, die switch-Anweisung aber nicht verlassen. Daher auch noch der "default" abgearbeitet.

MfG, Jan.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
19.05.2011, 12:50 Uhr
kaiOr

Avatar von kaiOr

Irgendwie habt ihr ja Recht,

nur dürfte von der Logik her so kein RESET der 16Bit-Platine zu Stande kommen und trotzdem funktionierts. Dies wiederum erweckt den Gedanken, dass die betreffenden Out-Befehle überflüssig sind, doch lösch ich Sie weg geht gleich garnichts mehr.

...also setz ich wohl besser den break und Schwamm drüber.

Dieser Beitrag wurde am 19.05.2011 um 12:50 Uhr von kaiOr editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek