Announcement

Collapse
No announcement yet.

Register der Grafikkarte auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Register der Grafikkarte auslesen

    Hi, ich habe ein sehr spezielles Problem. Und zwar muss ich die Register einer Grafikkarte (Ati m9 (radeon) angeschlossen über PCI) auslesen und später dann auch verändern (also Sachen die eigentlich der Treiber macht per Hand vornehmen). Beschreibung und Adressen der Register habe ich. Mein Problem ist nur wie ich darauf in C zugreife. Die Adressen der Register sind (soweit ich das verstanden habe) relativ zur Startadresse der PCI - Verbindung?!? - Dokumentiert.
    Nur leider hab ich keine Ahnung wo der PCI anfängt und wie man sihc einen Zugriff über PCI auf die Grafikkarten-Register überhaupt vorstellen kann. Googeln half mir auch bisher nicht wirklich weiter. Ich hoffe mir kann hier jemand helfen.

  • #2
    Angenommen, dass dein Programm auf einem moderneren Betriebssystem wie Linux, Mac OS X oder Windows laufen soll (und nicht unter MS-DOS):
    Ein normales Programm kann nicht direkt auf die Hardware zugreifen. Das kann nur der Betriebssystemkernel und von diesem geladene Treiber. Unter einem solchen System musst du also einen Treiber schreiben, mit dem deine Anwendung dann kommuniziert. Wie das genau geht, hängt vom Betriebssystem ab und ist oft eine Wissenschaft für sich.

    Unter MS-DOS kannst du direkt mit einem Zeiger auf die entsprechende Adresse arbeiten. Das gilt glaube ich auch für DOS-Programme die in der DOS-Box von Windows 9x/ME laufen, nicht aber auf NT-basierten Systemen.

    Comment


    • #3
      Hi, danke für deinen Post hatte das hier ganz vergessen. Ich habe in der Tat einen Weg gefunden über XP direkt auf die Register der Grafikkarte zuzugreifen. Und zwar gibt es einen bestimmten Adress-Offset ab dem die Grafikhardware anfängt. Wenn man jetzt die Registerdokumentation hat muss man die jeweilige Adresse einfach zum jeweiligen AGP oder PCI- Offset des Systems addieren und kann auf das Register zugreifen (ein Treiber macht das ganz genauso).
      Ach ja den AGP bzw. PCI - Offset kann man mit einem Debugger herausfinden.

      Comment


      • #4
        HI

        ich habe so ein ähnliches Problem. Ich möchte aus einer PCI-Karte den Memorybereich auslesen. Die Adressen der Register kenne ich.

        Wie finde ich nun den PCI-Offset heraus?

        Comment


        • #5
          Ich habe mir in einem Debugger (Vision Click) die globalen Ressourcen anzeigen lassen. Dort fand sich unter anderem auch ein Eintrag der pRadeonReg oder so ähnlich hieß. Dort konnte man die Startadresse der PCI- Karte ablesen.

          Comment


          • #6
            Danke für die Antwort.

            Wo bekomme ich den Debugger her?

            Und hast du dann die Adresse mit einer c-Routine ausgelesen oder wie hast du es gemacht?

            Hab es mit einem Zeiger versucht allerdings kein Erfolg damit gehabt.

            Comment


            • #7
              Der Debugger ist soweit ich weiß leider kostenpflichtig und war schon auf dem Rechner bereits installiert. Die Register habe ich dann direkt in einer C-Funktion per Pointer manipuliert..wenn du den Offset herausbekommen hast kannst du dem Pointer direkt die Adresse des Registers zuweisen. Die Adresse alleine ohne den entsprechenden PCI-Offset greift einfach auf irgendeinen Speicherbereich zu also kann das nicht funktionieren.

              Comment


              • #8
                Ok dann versuche ich mal die Startadresse herauszufinden.
                Was mich aber wundert die Adresse des Memoryregister ist EC000000, da kann ich ja nicht mehr viel drauf addieren.

                Aber egal ich versuchs mal.

                kannst du grad mal schnell auf den von mir geschriebenen Code sehen.
                Ob das passt . Bin nämlich nicht sicher ob das mit der Typwandlung so funktioniert. Wenn ich das aber nicht mache bringt der Compiler einen Fehler.

                int *Zeiger;
                int Wert;
                int Adresse;

                Adresse = 0xEC000000;

                Zeiger = (int*)Adresse;
                Wert = * Zeiger;

                Comment


                • #9
                  hier mal ein Ausschnitt von mir:

                  unsigned long int* registerAdress = NULL;
                  int testValue = 1;

                  (unsigned long) registerAdress = 0xAdresse des Registers;

                  (unsigned long) *registerAdress = testValue; //set Value

                  Comment

                  Working...
                  X