Ich lese mich gerade erst in ganz vieles ein und verstehe leider noch nicht alles. Per EDK habe ich eine IP Komponente entworfen, die per PLB Kommuniziert und ein Register besitzt. Auf dem FPGA läuft Linux. Ich verstehe noch nicht ganz, wie ich dann von Linux aus auf das Register zugreife. Woher weiß ich überhaupt an welcher Adresse die Komponente zu finden ist und woher weiß ich, wo das Register zu finden ist?
Auf dem FPGA läuft Linux ? Oder meinst du, du entwickelst unter Linux ? Der Titel deines Posts "...FGPA..." ist ebenso sorgfältig formuliert wie deine Frage, welche in die Rubrik "Programmierbare Logik" gehört. Wenn du genauso präzise entwickelst wie du fragst, wirst du wohl viel Spass haben...
Ja,ja Sorry. Habe ich wohl versehentlich nicht aufgepasst. Eigentlich sollte der Beitrag auch in der Rubrik "Programmierbare Logik" landen. Okey, dann jetzt nochmal etwas ausführlicher: Es handelt sich um einen Virtex FPGA mit PPC. Es sind soweit alle Komponenten vorhanden, dass Linux auf dem FPGA/PPC läuft. Entwickelt wird unter Windows.
Normalerweise kannst du im EDK bei deiner Komponenten angeben, welchen Adressbereich sie belegt. Wenn du rausgefunden wo sie ist, kannst du das einfach hardcoden ála #define MYADRESS 0x12345678 int* ptr = (int*) MYADRESS; und mit *ptr = 5; dann drauf zugreifen. Mfg Gargamel
Hey, danke Gargamel. Die Adresse der Komponente habe ich. Ich verstehe nur noch nicht wie ich auf die Register zugreifen kann. Angenommen ich habe 2 Register und einen Adressbereich von 0x80410000 bis 0x804101ff. Wie kann ich dann auf Reg1 und Reg2 zugreifen?
C meets hardware: "Zeiger enthalten die Adresse eines Objektes eines bestimmten Datentyps." -- Aus "Programmieren mit C" von Clauß Fischer. -- Also im banalsten Fall kannst du einen Pointer deklarieren und ihm die Adresse deines Registers zuordnen. Dann kannst du über den Pointer auf das Register zugreifen. Aber normal hat das EDK für seine Peripherie doch Treiber. Dann liefert der Treiber eine Funktion um darauf zu zugreifen.
Hey, danke Alban! Das hat mir wirklich weitergeholfen. Ich wußte bisher garnicht, dass das EDK auch direkt rudimentäre Treiber zur Verfügung stellt. (Wie gesagt, ich arbeite mich gerade ein). Ich habe mir die Treiber jetzt mal angesehen, aber immernoch eine Frage.
1 | #define PLB_MEINE_KOMPONENTE_USER_SLAVE_SPACE_OFFSET (0x00000000)
|
2 | #define PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET (PLB_COMMUNICATION_USER_SLAVE_SPACE_OFFSET + 0x00000000)
|
3 | |
4 | XIo_Out32(baseaddr+PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET, data->Upper); |
5 | XIo_Out32(baseaddr+PLB_MEINE_KOMPONENTE_SLAVE_REG0_OFFSET+0x4, data->Lower); |
Wieso kommt das mit den Adressen so zustande? Weshalb ist das Register 0x4 breit?
baseaddr wird eine "Basisadresse" eines bestimmten Adressbereichs sein. PLB_BLABLA_OFFSET ist eine relative Adresse bezogen zur Basisadresse. 0x4 kommt daher, weil die Adressen in Bytes gezählt werden, ein 32Bit Register aber dann 4 Byte hat. Das nächste Register fängt dann 0x4-Bytes weiter hinten an. Mfg Thomas Pototschnig
eine Frage die du mir wahrscheinlich Beantworten könntest: ich versuche grad auch Linux für denn ppc hinzukriegen (Virtex 5 ml507 Board), leider ohne Erfolg, vielleicht kannst du mir ja sagen auf welche Seiten du dich Informiert hast, welchesn Linux du benutzt und was deine Entwicklungsschritte waren?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.