Hallo, ich bin gerade dabei die USB Firmware von http://www.obdev.at/products/avrusb/index.html zum laufen zu bringen. Soweit funktioniert es auch ganz gut. Allerdings wenn ich jetzt versuche weiteren SourceCode zum laufen zu bringen, erkennt der Host das Gerät nicht mehr. In der Dokumentation steht: You should link the usbdrv.o module first because it has special alignment requirements for the receive buffer (the buffer must not cross a 256 byte page boundary, it must not even touch it at the end). If you can't link it first, you must use other measures to ensure alignment. Wie kann ich erreichen das der Treiber zuerst gelinkt wird? Ich benutze als Controller den ATMega8 und als Entwicklungsumgebung WinAvr. Marten
hallo, das problem ist nicht, dass zuerst gelinkt werden muss, sondern dass der receive-buffer keine page-boundary berührt. nach dem von dir zitierten text steht doch die lösung schon dort: "You can choose a memory section for the receive buffer with the configuration option "USB_BUFFER_SECTION". This option defaults to ".bss". If you use your own section, you can place it at an arbitrary location with a linker option similar to "-Wl,--section-start=.mybuffer=0x800060"."
Danke für deine Antwort! Ich nutze MFile um mir ein Makefile zu erzeugen. Wo genau muss ich da diese Linkeroption einfügen?
kein plan, verwende MFile nicht. hab' eben mal reingeschaut. die LDFLAGS werden da so lustig zusammengesetzt. vorschlag meinerseits: EXTMEMOPTS = -Wl,--section-start=.mybuffer=0x800060 die section kannst ja nennen wie du willst, und bei der adresse musst du halt aufpassen, einer page boundary nicht zu nahe zu kommen. aber das steht ja in dem usbdrv.h schön erklärt. vll hilfts bye kosmo
also habs mal mit extmemopts probierts .. compiliert wirds. allerdings hab ich nicht so richtig die ahnung wie ich die richtige adresse bekomme. avr-nm -n main.cof zeigt mir das usbRxBuf bei 00000294 liegt .. wie kann ich mir da jetzt eine korrekte adresse basteln? nur mal zum Verständnis: damit will man erreichen das der Buffer nicht in 2 Pages liegt wegen geschwindigkeits problem?
Kannst du nicht einfach das USB-Teil als erstes in der Liste der C-Dateien angeben? Dann wird es auch als erstes gelinkt.
das hab ich auch schon probiert. funktioniert leider nicht .. in der doku des usbtreibers steht dazu: Note: gcc does not always assign variable addresses in the order as the modules are linked or the variables are declared.
vll ist das der way-to-go. schön ist was anderes, imho :) also nochmal zu dem, was in der usbdrv.h steht: "You should link the usbdrv.o module first because it has special alignment requirements for the receive buffer (the buffer must not cross a 256 byte page boundary, it must not even touch it at the end). " [...] "Use "avr-nm -ng" on the binary and search for "usbRxBuf" to find tbe base address of the 22 bytes rx buffer." das hast du offensichtlich gemacht. und 22 byte in einer 256er page, da ist viel platz links und rechts. such' dir irgendwas aus, meinethalben bei 0x80 oder 0x180 oder 0x280 usw. so um die mitte rum. die gewünschte section darauf setzen (-Wl,--section-start=.mybuffer=0x80 für das beispiel) btw, wenn mit '00000294' hexa gemeint ist, also 0x00000294, sollte es schon passen, denke ich. wozu das gemacht wird? keine ahnung, ich lese nur das, was da steht. ob's funktioniert, musst du beurteilen (ach ja, das lesen sollte eigentlich auch dein job sein :)
also danke Joe .... ich habs hinbekommen :) myBuf@0x0000080 scheint zu funktionieren .. nun kann ich auch eignen code hinzufügen ohne das es denn buffer verschiebt!
schön schön :) die frage nach dem warum beantwortet glaube ich die datei usbdrv.S im prinzip wird ein char für einen index in den usbRxBuf benutzt, und zugleich für das niedere byte der bufferadresse. dann macht es sich schlecht, wenn beim holen der daten zwischendurch das obere byte der adresse wechselt, dann funktioniert der index nicht mehr. jdf. soweit ich das verstanden habe. aber anyway, hauptsache es funzt.
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.