Kann mir das jemand mal genauer erklären?
Der Unterschied zu vielen anderen Produkten war bei der Pandora angeblich ja, dass Wifi über SDIO und nicht GPIO angebunden ist. Und zwar, weil TI das in ihren Specs so empfiehlt . Soweit, so gut...
SDIO, so dachte ich bisher, wäre ein zu SD-Karten kompatibler Anschluss, bei dem man über eine Erweiterung des SD-Karten-Protokolls eben auch andere Geräte wie GPS oder WLAN anbinden kann. Ursprünglich für Erweiterungskarten für den SD-Slot gedacht, wird das offenbar inzwischen auch verwendet, um interne Peripherie anzubinden. Hab ich das soweit richtig verstanden?
GPIO ist das hier:
http://en.wikipedia.org/wiki/General_Purpose_Input/Output
Irgendwelche 8 Pins, welche sich relativ frei programmieren lassen.
MWeston hat sich also dafür entschieden, WLAN über SDIO anzubinden, weil TI das so als Standard vorsieht. Der Wifi-Chip scheint grundsätzlich beide Schnittstellen zu haben?! Jetzt scheint es aber einen generellen Bug beim OMAP zu geben, dass Interrupts über SDIO nicht funktionieren.
Interrupts sind dafür da, dass ein Peripheriegerät dem Prozessor sagt, dass es neue Daten hat. Das Gerät aktiviert dazu eine Meldeleitung. Der Prozessor unterbricht seine bisherige Arbeit, behandelt die Daten, und kehrt dann zu seinen anderen Aufgaben zurück.
Demgegenüber steht das Polling. Hier gibt es keine Meldeleitung. In einer Programm- oder Betriebssystemschleife werden die entsprechenden Eingangsports einfach immer wieder abgefragt. Das ist natürlich weniger Effizient, und wenn in der Programmschleife andere schwierigerer Code steht, wird der Port einfach seltener abgefragt. Ein klassisches Polling-Beispiel ist der Standard-PC-Gameport. Der läuft über Port 201h, der vom Spiel ständig abgefragt wird.
Jetzt hat der OMAP also einen bekannten Hardwarefehler, bei dem SDIO-Geräte über diese Schnittstelle keinen Interrupt auslösen können. Das heißt, der W-LAN-Chip kann sich über SDIO nicht melden, wenn ein neues Paket eingetroffen ist.
Die Lösung von MWeston war wohl, parallel zur SDIO-Anbindung die Interruptleitung über GPIO zu realisieren.
Wenn ich das richtig verstanden hab ist das so ähnlich, wie wenn ich eine externe Festplatte habe, die Firewire und USB kann. Der Hersteller empfiehlt den Betrieb über USB. Jetzt kann mein PC aber nicht genug Strom über USB für die Festplatte liefern. Also sorge ich dafür, dass die Platte Strom über die Firewireschnittstelle bekommt und wickle den Datentransfer weiter über USB ab.
So ähnlich hat es nach meinem Verständnis MWeston gemacht, indem er den reinen Datentransfer über SDIO laufen lässt, und die Interruptmeldung über die gesonderte GPIO-leitung abläuft.
??
Das Verhalten könnte beim WLAN also tatsächlich damit zusammenhängen, das was mit den Interrupts nicht funktioniert und der Chip über Polling läuft. So kommen nur die Pakete durch, die gerade im Puffer liegen, wenn der Prozessor diesen gerade abfragt. In der Zwischenzeit, wenn der Prozessor anderweitig beschäftigt ist, kommen tausende weitere Pakete an, die verworfen werden, sobald der Puffer voll ist.
Der wird vielleicht ein paar kB groß sein. Was darüber hinaus reinkommt wird verworfen. Beim richtigen Pandora-GIT kommt der Prozessor dank zahlreicher weiterer Threads des Betriebssystems dann seltener dazu, diese paar KB abzuholen und den Puffer für neue Pakete freizumachen.
Allerdings verstehe ich noch nicht, wie die Pandora dann mit 300kB/s Senden kann. Dürfte sie die Daten einfach fröhlich in die Welt blasen, würde das mit der Interrupt-Theorie ja noch zusammenpassen. Aber AFAIK gibts bei Netzwerken ja Kollisionserkennung. D.h. wenn jemand gerade Sendet, wird eine zufällige Zeit gewartet, bis die Leitung frei ist. Dann wird der Puffer der Netzwerkkarte gesendet und dem Computer über Interrupt mitgeteilt, dass er weitere Daten in den Puffer schreiben kann. So ähnlich sollte das doch mit den W-LAN-Kanälen funktionieren.
Eventuell könnte hier ein Versuchsaufbau was bringen:
Pandora1 sendet über W-LAN an Basisstation kontinuierlich Daten. Wenn jetzt eine weitere Pandora2 auch anfängt, an Basisstation Daten zu senden (gleicher Kanal), sollten mit der Zeit beide Pandoras Datenraten um 150 +/- 20 kb/s erreichen. Bei einem Interruptproblem könnten hier dagegen drastische Einbrüche auftreten, oder?
Interessant wär von allem ingesamt die Frage, ob dieser W-LAN-Chip überhaupt die Betriebsmodi SDIO und GPIO gleichzeitig unterstützt. Gibt er überhaupt eine Interruptmeldung über GPIO raus, wenn sämtliche sonstige Kommunikation über SDIO abläuft?
EDIT: Anscheinend schon.
Hier ist ein Blog von jemandem, der wohl exakt den WL1251 am beagleboard verwendet über SDIO und GPIO Interrupt handling:
http://greekclaud.blogspot.com/2009_08_01_archive.html
(Achtung, teilweise experimentiert er auch mit dem 1271)
Siehe letzter Eintrag:
Environment :
Host : Beagleboard B4
Kernel : 2.6.29-omap1
WiFi modile : Muruta WL1251 module
driver WL1251 from linux wireless 2009/09/18
Modification : Add GPIO interrupt handling at SDIO
root@beagleboard:/modules/objs# uname -a
Linux beagleboard 2.6.29-omap1 #35 Wed Aug 19 14:43:34 CST 2009 armv7l unknown
root@beagleboard:/modules/objs#
root@beagleboard:/modules/objs# cat load.sh
insmod rfkill_backport.ko
insmod cfg80211.ko
insmod lib80211.ko
insmod lib80211_crypt_ccmp.ko
insmod lib80211_crypt_tkip.ko
insmod lib80211_crypt_wep.ko
insmod mac80211.ko
insmod wl1251.ko
insmod wl1251_sdio.ko
Performance :
root@beagleboard:/modules/objs# ping 192.168.168.254
PING 192.168.168.254 (192.168.168.254): 56 data bytes
64 bytes from 192.168.168.254: seq=0 ttl=64 time=2.288 ms
64 bytes from 192.168.168.254: seq=1 ttl=64 time=3.144 ms
64 bytes from 192.168.168.254: seq=2 ttl=64 time=3.052 ms
64 bytes from 192.168.168.254: seq=3 ttl=64 time=3.144 ms
64 bytes from 192.168.168.254: seq=4 ttl=64 time=3.387 ms
64 bytes from 192.168.168.254: seq=5 ttl=64 time=4.669 ms
64 bytes from 192.168.168.254: seq=6 ttl=64 time=3.052 ms
64 bytes from 192.168.168.254: seq=7 ttl=64 time=3.052 ms
64 bytes from 192.168.168.254: seq=8 ttl=64 time=3.113 ms
64 bytes from 192.168.168.254: seq=9 ttl=64 time=3.327 ms
Power consumption : 190~200mA.
claud@claud-desktop:~/src/beagleboard/kernel29/compat-wireless$ iperf -c 192.168.168.77 -i 1 -t 10
------------------------------------------------------------
Client connecting to 192.168.168.77, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.168.25 port 53616 connected with 192.168.168.77 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 776 KBytes 6.36 Mbits/sec
[ 3] 1.0- 2.0 sec 792 KBytes 6.49 Mbits/sec
[ 3] 2.0- 3.0 sec 888 KBytes 7.27 Mbits/sec
[ 3] 3.0- 4.0 sec 760 KBytes 6.23 Mbits/sec
[ 3] 4.0- 5.0 sec 888 KBytes 7.27 Mbits/sec
[ 3] 5.0- 6.0 sec 896 KBytes 7.34 Mbits/sec
[ 3] 6.0- 7.0 sec 792 KBytes 6.49 Mbits/sec
[ 3] 7.0- 8.0 sec 824 KBytes 6.75 Mbits/sec
[ 3] 8.0- 9.0 sec 888 KBytes 7.27 Mbits/sec
[ 3] 9.0-10.0 sec 808 KBytes 6.62 Mbits/sec
[ 3] 0.0-10.0 sec 8.12 MBytes 6.80 Mbits/sec
Power consumption : 190~200mA.
Vergleicht man die Einträge sieht man, dass die Interruptleitung sich wohl hauptsächlich auf die Pingzeit auswirkt. Der erste 1251er-Eintrag könnte in etwa dem entsprechen, was wir derzeit haben.