Hallo Leute
Ich habe ein PCI Express Board mit einem ALTERA ArriaGX gemacht. Die
Karte wird in einen PC gesteckt und während des Bootvorgangs des
Computers wird das FPGA-Programm durch einen uC ins FPGA geladen. Nun
habe ich das Problem, dass ich das Programm mit dem uC zuwenig schnell
aus dem Flash lesen und anschliessend ins FPGA kopieren kann. Es
funktioniert zwar, aber leider erkennt Windows das PCI Device nicht, da
der Scan Vorgang des PCI Busses bereits abgeschlossen ist. Wenn ich den
PC nur neu starte ohne die Speisung auszuschalten, wird das PCI Device
von Windows korrekt erkannt.
Der C-Code auf dem uC wurde bereits optimiert, so dass ich das FPGA (ca.
3.2MB) in etwa 4 sec laden kann. Offenbar ist dies immer noch zu lang.
Deshalb dachte ich mir, der nächste Schritt ist den PC am scannen des
PCI zu "stören". Also irgendwie den Scan zu verzögern. Kennt jemand eine
Möglichkeit, wie ich das bewerkstelligen könnte?
Für jegwelche Infos oder Tipps bin ich sehr dankbar.
Grüsse cee
Hoi Läubi
Merci für deine schnelle Antwort. Leider bringt das nichts. Ich habe
zwar ein unerkanntes "Other PCI Bridge Device" im Gerätemanager, aber
mit dem Programm welches sonst meine Karte erkennt, sehe ich nichts.
Auch ein erneutes scannen hilft nicht. Ich habe ebenfalls probiert den
PCI Bus mit "devcon.exe" neu zu scannen. aber auch das bringt nichts.
Bin weiterhin an allen Lösungsvorschlägen interessiert. Der bisher beste
ist das schreiben eines eigenen BIOS ;-)
PCI Express ist doch hotplug. Kannst du nicht erst die Karte "anmelden"
wenn das laden abgeschlossen ist? Oder zur not noch einmal die Karte
abmelden und wieder neu anmelden.
Ich denke das Problem ist Folgendes:
Die Leiterplatte an sich ist ja wohl kein PCI Express Device obschon sie
natürlich den Direktstecker dazu beinhaltet. Das PCIe Device macht das
FPGA aus. Das heisst, wenn das FPGA nicht geladen ist, Gibt es kein PCIe
Gerät, welches Windows später durch erneutes scannen finden könnte. In
wie weit unsere PCIe Karte hotplug fähig ist kann ich nicht mehr zu 100%
sagen, aber ich glaube irgendwo gelesen zu haben, dass dies in meinem
Fall nicht geht. Ja ich weiss ist ziemlich schwammig, aber genaueres
weiss ich dazu im Moment nicht, muss die Altera Specs noch mal
durchgehen. Fakt ist jedenfalls, dass ich es weder mit dem Hardware
Manager noch mit devcon unter Windows sehen kann, wenn ich den PC nicht
in der zwischnzeit neu boote.
Aber wie gesagt, bringt alle Vorschläge die euch einfallen. Ich probiere
sie gerne alle aus, bis der richtige darunter ist...
Danke und Gruss
cee
Cee Dee schrieb:
> Hoi Läubi>> Merci für deine schnelle Antwort. Leider bringt das nichts. Ich habe> zwar ein unerkanntes "Other PCI Bridge Device" im Gerätemanager, aber
Brauchst du keinen Treiber für deine Karte?
> mit dem Programm welches sonst meine Karte erkennt, sehe ich nichts.
Lösch mal das "Other PCI Bridge Device", und dann einmal aktualisieren
(also PnP HW Erkennung starten)
> Bin weiterhin an allen Lösungsvorschlägen interessiert. Der bisher beste> ist das schreiben eines eigenen BIOS ;-)
Das beste wäre wohl wenn du entweder:
- Eine schnellere Konfiguration ermöglichst (manche FPGAs können auch
von parrallen Medien gebootet werden)
- "irgenwie" eine Art busy signalisierst (kenn mich nicht aus ob sowas
auf dem Bus möglich ist)
- eine Art "mini Image" auf den FPGA brennst das die Karte erkannt wird,
und dann den rest nachlädst. (keine Ahnung wie komplex sowas ist...)
- Du verpackst das Baord und sendest es mir zu und bist alle Sorgen los
weil keine Karte-> kein Problem :P
Wenn ich mich recht entsinne muss die PCI Karte 500 oder 1000ms nach
POWER ON auf den PCI Bus reagieren. Ich habe vor eine paar Jahren eine
PCI Karte entwickelt, die ebenfalls mit einem Altera FPGA (Cyclone II)
bestückt war.
Wir hatten damals auch Schwierigkeiten, den Code rechtzeitig in den FPGA
zu laden.
Es wurde sogar ein spezielles Flashdevice eingesetzt, das wahrscheinlich
von Natur aus schon schneller ist als ein µC. Ich vermute daß du mit
deinem µC also eher nicht glücklich wirst.
Der Flash-Chip heißt EPCS16, vielleicht kannst du ja so einen noch auf
deinem Board unterbringen.
@Läubi:
Den Windows-Teil schreibe nicht ich. Aber schlussendlich, soll es
möglich sein, mit einem GUI über PCIe mit der Karte zu kommunizieren. Ob
mit Treiber oder direkte Ansteuerung entscheide nicht ich.
Den zweiten Tipp habe ich bereits getestet. Das "Other PCI Bridge
Device" ist gar nicht meine Karte. Denn das habe ich auch, wenn meine
Karte nicht im PC steckt.
Das laden des FPGAs erfolgt bereits parallel über 8 Datenleitungen.
Leider hat sich ein Fehler ins Design eingeschlichen, weshalb ich nur
NICHT komprimierte Files übertragen kann. Deshalb ist es auch 3.2MB
gross. Ich denke sonst hätte ich das Prolem nicht, da die Datei auf rund
die Hälfte geschrumpft werden könnte. Hardware ändern ist nicht möglich
(resp. erst im Redesign, aber solange will ich nicht warten!).
Busy Signal weiss ich eben auch nicht, ob es sowas gibt, und wie ich das
ansprechen und darauf reagieren könnte.
Das mit dem Mini-Image geht glaube ich vom FPGA her nicht, ist aber
bestimmt noch weiter zu bedenken falls es sonst nichts gibt.
Ich habe zwei Prototypen-Boards für den richtigen Preis kannste wohl
eins haben :-)
@Knochen Kotzer
habe schon bisschen rumgespielt im BIOS, aber keine Einstellung hat
bisher das gewollte bewirkt.
Als nächstes werde ich die PCIe von Auto-Detect auf Enabled setzen.
Vielleicht kann ich die Karte dann unter Windows scannen.
Hmmm, einen Versuch ist es wert, ich kann dir zur not ne kaputte IDE
Platte geben bei der die meißten boards ein paar Sekunden brauchen bis
sie raffen das da nix kommt, in der Zeit ist sicher alles an Daten im
FPGA. Wäre aber nur ne Lösung für eine Kotzkrücke :-)
@peterguy
WOW 500ms wären ja arg kurz. Weisst du noch wie gross dein FPGA Prog
damals war? Hattest du denn sogar mit dem EPCS16 noch Schwierigkeiten in
der Zeit zu bleiben? Dann wird es mit dem uC wohl schon fast unmöglic,
ausser ich lasse dem PCI Scan eben auf irgendeine Art noch mehr Zeit.
Im Redesign werde ich es mir auf jeden Fall überlegen den EPCS16
einzusetzen, aber momentan geht es nicht.
Danke jedenfalls für alle Tipps bisher.
BTW: warum verlängerst du nicht die Erfassungszeiten im Bios?
OK, schon klar da braucht man ein wenig Kenntnis aber soooo schwer ist
das auch nicht.
PS: Aktiviere mal die Funktion das er von Lan booten soll, kommt zwar
nach der PCI Abfrage aber was solls?
Es braucht halt nen haufen Zeit, also genau das was du willst.
BIOS ist bisher nicht mein Spezialgebiet. Aber ich bin offen für neues.
Aber dann wäre ich wieder beim schreiben meines eigenen BIOS. Oder
kennst du einen Disassembler für Award-BIOS?
Momment soll das nur für einen PC sein oder soll das später auch mal was
solides werden?
> Aber dann wäre ich wieder beim schreiben meines eigenen BIOS.> Oder kennst du einen Disassembler für Award-BIOS?
Das würd ich ehrlich nicht machen im zweifel machste dir das Board
kaputt.
Was für ein Board ist das denn? Schau mal ob es sowas wie "Fast Boot"
oder Memmory Test o.ä. gibt.
Und probier mal aus ob es reicht am Anfang einfach ins Bios zu gehen
oder ggf mal wenn das Bios erscheint die "PAUSE" Taste drücken (mit
Enter gehts dann weiter)
> Hmmm, einen Versuch ist es wert, ich kann dir zur not ne kaputte IDE> Platte geben bei der die meißten boards ein paar Sekunden brauchen bis
Mit nem AVR geht das aber schöner ;)
Maximale Verzögerungszeit laut ATA Spezifikation: 31 Sekunden.
1
If Drive 1 is present, then Drive 0 shall wait for up to 31 seconds from power-on reset,
2
software reset or RESET- for Drive 1 to assert PDIAG-.
Wenn du also eh ein IDE Laufwerk dranhängen hast reicht ggf. schon ein
starker Pulldown nach GND, du solltest dann nur im BIOS wenns geklappt
hat das nicht vorhandene Laufwerk von AUTO auf NONE ändern und schauen
ob es dann immer noch läuft.
Die Widerstandsvariante hat aber halt den Nachteil das dann das Bios
imschlimstenfall 31 Sekunden wartet weiß nicht ob dir das zu lange ist?
Ach mir fällt gerade ein, du hast ja eh schon nen uC dabei! Dann mach
das doch so das er auf einem Pin GND ausgibt solange er beschäftig mit
Konfigurieren ist, dann einen Pulllup dran, eine IDE Platte als Master
(oder CD/DVD) und an den PDIAG- Pin da wo der Slave eigentlich rankommt
dann dieser Pin.
Zu Anfang auf GND setzen (ich glaub 1 ms nach dem IDE reset hast du
Zeit) und wenn du fertig bist auf High/Eingang.
Die Karte ist bereits jetzt im Zielsystem eingebaut. Also ich mache alle
Tests in der Umgebung, die auch später verwendet werden soll. Und so wie
du meinst, wird das wohl nichts solides...
Das mit dem schreiben des eigenen BIOS ist nicht ganz ernst. Ich will ja
nicht die grossen konkurieren. :-) Aber vielleicht lässt sich ja mit
AWDBedit was bewerkstelligen.
Das mit dem verzögern des IDE ist ja gut und recht. Aber ich vermute
stark, dass der PCI zuerst gescannt wird. Die CPU ist nämlich ebenfalls
über PCIe auf dem Mainboard eingesteckt. Ist irgend so ein Industrie PC.
Nur das CD-Rom Laufwerk ist am IDE angeschlossen. die HDDs sind über
SATA angeschlossen.
Naja deshalb würd ich mal schauen obs daran liegt, dass das Bios die
Karte "ausperrt" oder ob nur Windows die Karte Ignoriert.
Deshalb die Frage ob es klappt wenn du vorher etwas Zeit vertrödelst (ob
im Bios oder mittels "Pause".
Welchem Scan? vom Bios oder von Windows, das ist ja die Frage! Weil
(theoretisch) sollte PCIe Hotplugfähig sein und dürfte demnach auch
später hinzukommen.
Probier doch mal aus das du das Win Bootmenü anzeigen läßt mit Timeout
10sek.
Wie erkennt dein uC den ob es sich um einen Warm oder Kaltstart handelt?
Vieleicht kannst du dich ja in die Resetleitung einschleusen, solange
der FPGA noch nicht fertig konfiguriert ist hält der AVR den Resetpin
über einen Optokoppler geschlossen bis er fertig ist, das Netzteil
dürfte davon unbeeindruckt bleiben nur der User darf sich nicht wundern
das nach dem einschalten es 3sek dauert bsi das BIOS kommt.
Die PCI Slots an denen sich kein PCI(e) Gerät befindet werden doch
"disabled", was es Windows unmöglich macht ein später hinzugekommenes
Gerät zu finden. Und da das FPGA noch nicht programmiert ist, ist auch
kein PCIe Gerät am Bus.
Das Bootmenu zu verzögern bringt nichts, da ja dann die Slots schon
ausgeschalten sind. (Habe ich probiert)
Dem uC (kein AVR sondern ST10) ist es egal, ob der PC rebootet wird,
oder ganz abgeschalten wird. Solange der uC gespiesen ist (über PCIe)
läuft der. bei einem Reset (oder Strom aus - ein) wird als erstes das
FPGA Programm geladen. Sobald die Karte keinen Strom mehr hat, muss das
FPGA natürlich neu programmiert werden.
Das mit dem Resetpin war auch eine meiner ersten Ideen, beinhaltet aber
das draufbasteln zusätzlicher Hardware was natürlich nicht sehr schön
ist, wenn's aber nicht anders geht sicherliche eine mögliche Lösung.
Den Resetpin könnte man doch sogar relativ elegant abgreifen.
Auf die Karte kommt eine Stiftleiste mit 4 Pins. Auf zwei davon kommt
die Buchse vom originalen Schalter, auf die übrigen kommt eine
"Verlängerung" mit zwei solchen Buchsen, die dann aufs Mainboard geht.
Das müsstest du nur vorher ausprobieren, es kann sein das du damit das
BIOS komplett zurücksetzt.
Es gibt inzwischen recht viele PCs, bei denen man durch längeres
Reset-Drücken diesen Reset auslöst. Das ist recht praktisch, wenn man
was verstellt hat und die Kiste nicht mehr will, dann muss man nicht das
Gehäuse öffnen und den Clear-CMOS Jumper suchen.
Eine Idee hätte ich noch: Es gab (gibt?) doch immer im BIOS die Option
"Int 19 Capture", wodurch die Karten ihr eigenes Menü anbieten konnten.
Ich weiß nur nicht genau, wann und ob dieser Interrupt aufgerufen wird.
Damit könntest du aber evtl. dein Problem lösen. Beim 1. Start wird in
den FPGA ein Mini-Image reingeladen, was den Int 19 auslöst und eine
"Bitte warte, Karte xyz lädt" einblendet. Du müsstest dir dann eine
Anzeige basteln, die den PC 5 Sekunden "festhält", ohne das irgendwas
auf dem Bus passiert.
In der Zeit räumst du den FPGA aus und lädst das richtige Image. Danach
wird der PC vom Programm zurückgesetzt und die Karte sollte erkannt
werden.
Schon mal nachgeschaut was die "Hot plug presence detect"-Leitung im
PCIe-Stecker so macht?
(Nein, ich weiß es auch nicht aber die ist mir "ins Gesicht gesprungen")
gruss
f
Ich wusste auch nicht genau für was das ist und dachte das brauch ich
bestimmt nicht. Will ja nicht, dass meine Karte währen dem Betrieb ein-
ausgesteckt wird. Deshalb hab ich den auch nicht angeschlossen.
>@peterguy>WOW 500ms wären ja arg kurz. Weisst du noch wie gross dein FPGA Prog>damals war? Hattest du denn sogar mit dem EPCS16 noch Schwierigkeiten in>der Zeit zu bleiben? Dann wird es mit dem uC wohl schon fast unmöglic,>ausser ich lasse dem PCI Scan eben auf irgendeine Art noch mehr Zeit.>>Im Redesign werde ich es mir auf jeden Fall überlegen den EPCS16>einzusetzen, aber momentan geht es nicht.
Unser FPGA war ein Cyclone II EP2C70 mit roundabout 70.000 LEs.
Ich meine der war zum Schluss zu 80% voll, weswegen wir die Flashdaten
gepackt auf den EPCS16 gespielt haben.
Leider war ein Kollege mit der FPGA Entwicklung vertraut, deswegen kann
ich keine Detailinformationen liefern.
Es war auch eine Standard-PCI Karte (32bit/33MHz BUS), keine PCIe. Gut
möglich daß da andere Werte gelten.
Ansonsten kann ich dir nur empfehlen, die PCI Spec zu lesen. Bekommst du
unter www.pcisig.org, kostenpflichtige Anmeldung vorausgesetzt.Eine
Anmeldung empfiehlt sich in jedem Fall (falls nicht bereits geschehen),
denn nur so kommt ihr meines Wissens nach an eine eigene Vendor ID und
damit die Genehmigung PCI Geräte zu Vertreiben!
Frank Lorenzen schrieb:
> Schon mal nachgeschaut was die "Hot plug presence detect"-Leitung im> PCIe-Stecker so macht?> (Nein, ich weiß es auch nicht aber die ist mir "ins Gesicht gesprungen")
Wird mit Masse verbunden. Auf dem Mainboard ist da ein Pullup. Jetzt
stellt sich die Frage ob Hotplug bei diesem Slot funktioniert (Steht
zwar in der spec, wird aber bei Mainboards nicht unbedingt
initialisiert)
Einen Versuch ists allemal Wert. Einfach nach dem Laden der FW mit Masse
kurzschließen, Pinzette tuts auch. Ansonsten halt den Reset solange auf
Masse halten bis die FW geladen ist. Ist aber uneleganter.