Autor Thema: Problem mit Cmos  (Gelesen 7892 mal)

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« am: 10. October 2004, 15:13 »
Also, folgendes Problem:
Ich habe eine Funktion (in C) geschrieben mit der ich das Fehlerregister des CMOS-Speichers testen kann und, falls einen Fehler gibt, eine Nachricht ausgibt, in der die Fehlerursace beschrieben wird. Wenn ich das ganze kompiliere und dann in Bochs testen möchte, macht er sobald der Computer das CMOS-Register überprüft hat einen, mir völlig unerklärlichen,  reboot.
Was mach ich da falsch? Hier mal der code:
cmos.c:

void check_cmos(void)
{
    unsigned char value;
    print("Checking CMOS for errors...");
    out(0x70, 0x0E);                        
    value = in(0x71);
    if (value == 0)    /* If 0 -> everything is all-right. */
    {
        print("CMOS [OK]");
    }
    else                /* If not -> there MUST be an error. */
    {
        print("CMOS ERROR:");
        switch(test_bit(value, 2))
        {
            case 0: break;
            case 1: print("Invalid time or data."); break;
        }
        switch(test_bit(value, 3))
        {
            case 0: break;  
            case 1: print("Disk or controller error."); break;
        }
        switch(test_bit(value, 4))
        {
            case 0: break;
            case 1: print("Memory size compare error."); break;
        }
        switch(test_bit(value, 5))
        {
            case 0: break;
            case 1: print("Invalid POST-configuration."); break;
        }
        switch(test_bit(value, 6))
        {
            case 0: break;
            case 1: print("CMOS - Bad checksum."); break;
        }
        switch(test_bit(value, 7))
        {
            case 0: break;
            case 1: print("Clock lost power."); break;
        }                  
    }
}

-------------

Die in / out (für die Ports) funktionieren, ebenso die print-Funktion. Bei der Funktion test_bit bin ich mir nicht sicher, vielleicht liegt der Fehler auch da. Deswegen hier noch der Code der test_bit-Funktion:


bitops.c:

int test_bit(char val, char bit)
{
   char test_val = 0x01;    
   /* push bit to position */
   test_val = (test_val << bit);
   /* 0 = Bit setted 1 = Bit not setted */
   if ((val & test_val) == 0)
      return 0;                  /* not setted */
   else
      return 1;                  /* setted */
}

-----------

Danke schon mal im vorraus! :)

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 10. October 2004, 19:47 »
Das Problem hat sich erledigt, ich Döspaddel hab einfach nur vergessen dem Bootloader zu sagen, dass er ein paar mehr Sektoren der Diskette einlesen soll, da das System ja größer geworden ist...
Ein sehr, sehr dummer Fehler wie ich finde, aber jetzt ist ja alles gut! :)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 11. October 2004, 13:47 »
tipp: lade eine bestimmte anzahl an sectoren, auch, wenn dein OS noch kleiner ist! dann muss du net immer alles verändern!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #3 am: 11. October 2004, 13:57 »
warum ueberhaupt eine bestimmte anzahl an sektoren? kann man nicht irgendeinen indikator fuer ende der datei o.ä. einsetzen und bis dahin lesen?

lg, hannibal
\\o
o//
\o/

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 11. October 2004, 14:11 »
Einfach eine bestimmte Anzahl an Sektoren zu laden ist allerdings recht ineffizient, da ist es zwar schwieriger aber effizienter den Weg von hannibal zu gehen.
Aber wird das Problem mit den Sektoren nicht dadurch behoben, dass man als Dateisystem einfach FAT12 verwendet und sich so (fast) gar nicht mehr um die Sektoren kümmern muss?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 12. October 2004, 15:38 »
jup, wenn du ein FS hast, dann geht das, aber davor arbeite ich immer damit, eine bestimmte anzahl an sectoren zu lesen, weil man sich dann net darum kümmern muss, immer das auch noch zu aktualisieren!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #6 am: 12. October 2004, 16:03 »
@vish

Das Problem bei deiner Funktion ist das man auf Port 70h niemals die oberen 3 Bits ändern darf. BIT 7 steuert z.B. den NMI. Du musst Port 70h erst auslesen, dann mit e0h and verknüpfen, dann mit or die gewünschte Adresse verknüpfen und das dann wieder zu Port 70h schicken.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 12. October 2004, 16:58 »
1. Wieviele Bits hat denn Port 70h? Ich vermute 32, bin mir da aber nicht sicher.
2. Was ist und wozu brauche ich den NMI?
3. Warum mit 0xE0 UND-Verknüpfen und dann die gewünschte Adresse ODER-verknüpfen?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #8 am: 12. October 2004, 17:17 »
Also meist haben Ports nur 8 bit. Selten auch 16.

Von 32 Bit Ports hab ICH zumindest noch nicht gehört oder gelesen.
----------------------
Redakteur bei LowLevel

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 12. October 2004, 17:34 »
Ah, gut, also das was ich in Punkt 1 geschrieben habe ist völliger quatsch... Am besten gar nicht beachten! :)

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #10 am: 12. October 2004, 18:53 »
Port 70h is 8 Bit breit!

e0h entspricht 11100000b, also werden die oberen 3 Bits nicht verändert und mit or wird das ganze halt einfach nur mit der adresse erweitert.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 13. October 2004, 14:04 »
Ahja, alles klar, danke schön!

 

Einloggen