Moin,
ich habe hier einen Hilferuf eines Kumpels. Vielleicht können die Programmierer hier da mal ein Auge draufwerfen. Danke mal schon ;-)
----- Forwarded message -----
To: kretschmer@kaufbach.delug.de Subject: Bitte um Hilfe
Hallo !
Wie dem auch sei, ich bräuchte mal deine Hilfe. Ich bin gerade dabei, einer Bekannten für ihr Heimnetz einen DSL-Gateway/Router/Firewall/Wins-/DHCP-/DNS-Server zu basteln. Soweit alles kein Problem, problematisch ist nur das DSL-Modem. Die Dame hat nämlich das Billichangebot von 1&1 wahrgenommen und ist so zu einem kostenlosen DSL-Modem gekommen. Dummerweise handelt es sich dabei um ein USB-Teil (Allied Telesyn AT-AR215), für das offensichtlich keine Linux-Treiber existieren. Zumindest keine, mit denen mit einem deutschen DSL-Anbieter eine Verbindung möglich wäre. So jedenfalls das Ergebnis meiner Google-Recherchen.
Tja, ich habe jedenfalls erstmal den Treiber runtergeladen, der existiert und nach Aussage des README zumindest in den USA unter RedHat7.2 funktionieren soll. Ich versuche nun, den an deutsche Verhältnisse anzupassen, weil meiner Meinung nach das Problem nur bei zwei oder drei Details des ATM-Protokolls liegen kann, d.h. es müßte reichen, die passende Firmware (enthalten im deutschen Windowstreiber) in das Teil hochzuladen. Eine ähnliche Lösung wurde für ein anderes USB-Modem bereits realisiert (Habe ich auf sourceforge gefunden).
Mein Problem sind nun meine mangelhaften Kenntnisse von C im Allgemeinen und des gcc im Besonderen. Weder der eine noch der andere Treiber lassen sich bei mir damit übersetzen und ich finde einfach nicht heraus, warum nicht. Meiner Meinung nach ist die Syntax des Quelltexts nämlich völlig korrekt. Ich vermute, daß nur irgendeine Option des gcc gesetzt/gelöscht werden muß, damit er den Kram akzeptiert. Ich konnte aber bis jetzt nicht herausfinden, welche das sein könnte, deswegen möchte ich dich bitten, daß du mal einen Blick darauf wirfst. Ich habe also mal die relevanten Teile des Quelltextes aussortiert und die Warnungen/Fehler des Compilers an der richtigen Stelle eingefügt und das ganze ein wenig kommentiert.
Also zuerst mal ein paar Strukturdeklarationen in einem Headerfile:
typedef struct { UInt16 SwapData; } INT_IDMA_SWAP_INFO;
typedef struct { UInt16 CmvData[kCMV_DATA_WORDS]; } INT_IDMA_CMV_INFO;
typedef struct { UInt16 Interrupt; union { INT_IDMA_SWAP_INFO SwapIntInfo; INT_IDMA_CMV_INFO CmvIntInfo; }; UInt16 DataSize; } DeviceInt;
Da wirft der gcc am Ende der unnamed union folgende Warnung:
ADIUTIL/Structs.h:89: warning: unnamed struct/union that defines no instances
Nunja, nix schlimmes. Es wird ja wirklich keine Instanz der Struktur erzeugt, sondern nur eine Struktur deklariert. Aber, im Quelltext des eigentlichen Treibers passiert dann das:
[...] DeviceInt *pInt; pInt = (DeviceInt *)(&(pHw->pInterruptData->Data[0]));
Meiner Meinung nach ok. Es wird eine Zeigervariable auf eine (oben korrekt deklarierte) DeviceInt-Stuktur deklariert und mit einem passenden Zeiger befüllt, (die die Funktion indirekt über einen ihrer Parameter empfängt).
Aber jetzt kommt das Problem. Sobald nämlich im Quelltext die Werte der Struktur über diese Zeigervariable benutzt werden sollen (Beispiel)
[...] UInt16 SwapData = HSTOLE(pInt->SwapIntInfo.SwapData);
knallt der gcc durch und behauptet:
AdiUsbAdslDriver.c:475: structure has no member named `SwapIntInfo'
Das ist doch Quatsch, oder? Was, zum Teufel, paßt dem gcc da nicht?
In der Hoffnung auf sachkundige Hilfe und mit freundlichen Grüßen
----- End forwarded message -----
vielleicht kennt jemand eine Lösung?
Andreas
Am 12. Februar 2003 schrieb Andreas Kretschmer:
ADIUTIL/Structs.h:89: warning: unnamed struct/union that defines no instances
Das scheint Microsoft-C zu sein, es gibt es aber auch in neueren gcc-Versionen:
http://gcc.gnu.org/onlinedocs/gcc-3.2.2/gcc/Unnamed-Fields.html#Unnamed%20Fi...
Ist die Adresse aus dem Betreff korrekt? Wenn nicht, dann bitte nicht verwenden.
Torsten
am Wed, dem 12.02.2003, um 17:35:55 +0100 mailte Torsten Werner folgendes:
Am 12. Februar 2003 schrieb Andreas Kretschmer:
ADIUTIL/Structs.h:89: warning: unnamed struct/union that defines no instances
Das scheint Microsoft-C zu sein, es gibt es aber auch in neueren gcc-Versionen:
,----[ meine Frage, ob damit das Problem geklärt sei ] | Nein, leider nicht. Die gcc-Doku hatte ich natürlich bereits gesichtet | und bin dabei auch über diese Seite gestolpert. | | Sie erklärt aber das Problem nicht hinreichend. `----
Latürnich dennoch Danke.
Andreas
Hallo,
Am Mittwoch, 12. Februar 2003 17:03 schrieb Andreas Kretschmer:
ich habe hier einen Hilferuf eines Kumpels. Vielleicht können die Programmierer hier da mal ein Auge draufwerfen. Danke mal schon ;-)
----- Forwarded message -----
Soweit alles kein Problem, problematisch ist nur das DSL-Modem. Die Dame hat nämlich das Billichangebot von 1&1 wahrgenommen und ist so zu einem kostenlosen DSL-Modem gekommen. Dummerweise handelt es sich dabei um ein USB-Teil (Allied Telesyn AT-AR215), für das offensichtlich keine Linux-Treiber existieren. Zumindest keine, mit denen mit einem deutschen DSL-Anbieter eine Verbindung möglich wäre. So jedenfalls das Ergebnis meiner Google-Recherchen.
Ich weiß nicht obs hilft, aber meines Wissens liefert 1und1 bei dem "Billigangebot" die AVM Fritz!Card USB aus. Dafür sind Treiber verfügbar, aber leider nicht als OpenSource. Die Treiber sind zwar primär für Suse gedacht, aber mit anderen Systemen sollte es auch gehen. Ein Howto für das Einbinden dieses Modems gibt es unter http://www.netnode.de/howto
MfG, Torsten
On Wed, Feb 12, 2003 at 05:03:16PM +0100, Andreas Kretschmer wrote:
Moin,
Hi Andreas,
<schnipp>
typedef struct { UInt16 Interrupt; union { INT_IDMA_SWAP_INFO SwapIntInfo; INT_IDMA_CMV_INFO CmvIntInfo; }; UInt16 DataSize; } DeviceInt;
Wenn der Compiler keine 'unnamed unions' möchte, muss sie benannt werden. Die Struktur würde dann so aussehen:
typedef struct { UInt16 Interrupt; union { INT_IDMA_SWAP_INFO SwapIntInfo; INT_IDMA_CMV_INFO CmvIntInfo; } m_dat; UInt16 DataSize; } DeviceInt;
Dann muss man allerdings noch überall den Strukturname vor den Membervariablennamen einfügen, also UInt16 SwapData = HSTOLE(pInt->m_dat.SwapIntInfo.SwapData);
Evtl. könnte man das mit etwas Präprozessormagie vereinfachen :)
Ciao, Tobias
Am 14. Februar 2003 schrieb Tobias Koenig:
Dann muss man allerdings noch überall den Strukturname vor den Membervariablennamen einfügen, also UInt16 SwapData = HSTOLE(pInt->m_dat.SwapIntInfo.SwapData);
Evtl. könnte man das mit etwas Präprozessormagie vereinfachen :)
Man muss einfach nur gcc-3.2 nehmen, gcc-2.95 reicht jedenfalls nicht.
Torsten
am Fri, dem 14.02.2003, um 11:31:22 +0100 mailte Tobias Koenig folgendes:
Wenn der Compiler keine 'unnamed unions' möchte, muss sie benannt werden.
Genau das hat er gemacht, nun kompiliert das ganze. Es geht also voran. Er schreibt nun weiter:
,----[ Zitat ] | Nunja. Die Dame hat mir heute nach detaillierter Anleitung erfolgreich | die Firmwaredateien des Windowstreibers gemailt. Große Überraschung: der | Windowstreiber enthält vier unterschiedliche Sätze davon und dazu eine | Datei, mit der ich überhaupt nichts anfangen kann. Vermutlich so eine | Art Master oder was für die Boottime. | | Es wird also wohl nicht langweilig werden. Scheiße, kann nichtmal | irgendwas wirklich einfach sein? :o( | | Naja, jedenfalls haben die Dateisätze ja Namen. Bei mir stellen sich da | zwar keine direkten Assoziationen ein, aber vielleicht bei irgendwem | anders. Deswegen möchte ich dich bitten, die Namen mit der passenden | Erklärung mal in der LUG zu posten. Vielleicht fällt irgendwem der | Teilnehmer eine plausible Erklärung ein. | | Also, die Firmwaredateien sind nach folgendem Muster benamst: | | rtbld(variabler Teil)(laufende Nummer im Satz).bnm | | Wobei bei den vier Sätzen der variable Teil folgendermaßen lautet: | | 1) 9i | 2) 9p | 3) ep | 4) ei | | Ich vermute folgendes: | | Die Dinger mit 9 am Anfang sind für den Windows9x-Treiber gedacht, die | mit e sind für NT. Die zweite Stelle ließe sich mit den zwei in den | Linux-Sources dokumentierten USB-Betriebsmodi für den Treiber erklären. | Dann stünde i für isochronous mode und p für bulk mode. | | Das scheint mir sehr eingängig, aber leider paßt der Name der oben | erwähnten einzelnen Datei (rtbld4.bnm) nicht in dieses Schema. Wie | gesagt, vielleicht fällt einem der LUG-Teilnehmer was Sinnvolles dazu | ein. `----
Andreas
lug-dd@mailman.schlittermann.de