Hallo,
da bin ich grade dabei auf dem MIPS TTL Rechner die Lankarte in Betrieb
zu nehmen.
Aber noch nicht in echter Hardware, sondern im Emulator und auf dem
FPGA.
So weit funktioniert das auch schon: es ARPed zurück per LWIP und auch
Pings über ICMP kommen zurück.
Nur senden von TCP Paketen geht garnicht.
Weil ARP und ICMP (UDP) funktionieren gehe ich jetzt nicht von einem
Fehler in der Eigenbau LANkarte aus, denn selbst der Treiber bekommt vom
LWIP keinen call mal zu senden.
Der LWIP läuft grade mit NO_SYS = 1 und daher der callback API.
Ich hab hier einen TCP Listener erstellt:
1
structtcp_pcb*testpcb;
2
3
voidtcp_echo_init(void){
4
5
uprintf(1,"creating tcp echo test\r\n");
6
testpcb=tcp_new();
7
uprintf(1,"testpcb: %08X\r\n",(uint32_t)testpcb);
8
9
tcp_err(testpcb,tcpErrorHandler);
10
tcp_recv(testpcb,tcpRecvCallback);
11
tcp_sent(testpcb,tcpSentCallback);
12
13
staticip4_addr_tip;
14
IP4_ADDR(&ip,192,168,178,220);
15
16
err_terr;
17
err=tcp_bind(testpcb,&ip,666);
18
uprintf(1,"TCP Bind Err: %i\r\n",err);
19
20
if(ERR_OK!=err){
21
return;
22
}
23
24
// The tcp_listen() function returns a new connection identifier,
25
// and the one passed as an argument to the function will be deallocated.
Die Init läuft ohne Fehler durch und der LWIP erkennt auch ein
einkommendes SYN Paket auf dem passenden Port.
Nur wird kein SYN+ACK Paket zurückgeschickt.
Logausgabe:
Am Ende gibts immer ein "tcp_slowtmr: removing pcb stuck in SYN-RCVD"
Aber wieso das da höngen bleibt kann ich jetzt nicht erahnen.
Hat da wer eine Idee?
Einen Hinweis auf ein Problem gibts wenn ich direkt tcp_connect()
aufrufe um was zu senden:
1
init lancard err = 0
2
init lwip
3
done
4
netif status changed 192.168.178.220
5
testpcb: 004097A8
6
tcp_connect to port 80
7
connect err: -4
Laut err_t gilt: ERR_RTE = -4 -> Routing problem
Ja aber was denn fürn Routing problem?
Seine eigene IP+Subnetz+Gateway hat er.
Er soll direkt zu einer IP Verbinden.
Keine Route möglich klingt ja erstmal nach "kein netif anwesend"
Ist es aber, sonst würd ja ICMP nicht gehen:
Danke fürs ausprobiere!
Aber jetzt hab ichs gefunden:
Der Eigenbau MIPS Emulator hat ja einen GDB Server.
Nur kann keine GDB GUI so wirklich mit dem MIPS GDB umgehen, weil dieser
die Registerausgabe völlig anders Formatiert als zB x86 und ARM GDB.
-> Beitrag "Re: Space Age 2 der 32Bit MIPS Rechner in TTL"
Also auf der Konsole selber rumgetrommelt und mal nachgesehen was in
tcp_connect() so passiert.
Er will dort zuerst ein netif suchen, aber bekommt NULL.
Wieso bekommt er NULL? Der links ist nicht up.
Also mal in den Init Code gucken.
Da fehlt doch echt ein netif_set_link_up(&netif);
Kopf -> Tisch.
Die TTL Lankarte hat nämlich keine Link Erkennung, also muss ich den
immer up setzen.
Denn blöderweise habe ich keinen PHY gefunden bei der ich bei 10MBit
eine der LEDs auf LINK setzen kann.
Die 100mbit LED kann ich ja nicht auswerten.
Per STM32L0 eine config per MDIO reinschieben sehe ich schon als
geschummelt an. Vor allem weil das dann mal eben die Rechenleistung des
TTL MIPS ver x-facht.
Aber komisch, dass damit ARP und ICMP/Ping gingen.
gut, das habe ich mir bei dem Test einfach gemacht: das Init des netif
hat das OS schon gemacht, ich habe deinen Code nur zusätzlich
reingepackt. Ziemlich dirty, aber selbst das funktioniert :)
ICMP ist ja eine Etage tiefer, da fragt lwip wohl garnicht ob das if up
ist? Aber korrekterweise sollte es ja nicht antworten.
Bei meinen ARM Projekten ist der link up/down Aufruf im Handler vom PHY
IRQ.
Per MDIO lässt sich son PHY so einstellen, dass ern IRQ Pin auf low
zieht und dann kann man per MDIO nachgucken warum.
Das wird mbed dann auch so machen.
Ich überlege echt ob ich Bitbang MDIO mache, das wären nur 4 zusätzliche
ICs.
Nur die bidirektionaöität über die 3,3V <-> 5V Grenze wird dann etwas
nervig.