USB AVR Buffer Alignment

Gast #434982
Lesenswert?
• ▲
▼
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
#435013
Lesenswert?
• ▲
▼
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"."
#435427
Lesenswert?
• ▲
▼
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
Gast #436118
Lesenswert?
• ▲
▼
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?
Gast #436160
Lesenswert?
• ▲
▼
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.
#436169
Lesenswert?
• ▲
▼
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 :)
Gast #436930
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren