Uboot에서의 W5500 Receive

#1

덕분에 data send는 확인 하였습니다. 감사합니다.

데이터 리시브 함수는 다음과 같습니다.
중간의 recv_data_processing(sn, …) 함수는 W5500_CortexM3_Firmware_for_legacy/Work/App/source/W5500/w5500.c에 있는 것이며, 다음과 같습니다

459 void recv_data_processing(SOCKET s, uint8 *data, uint16 len)
460 {
461   uint16 ptr = 0;
462   uint32 addrbsb = 0;
463
464   if(len == 0)
465   {
466     printf("CH: %d Unexpected2 length 0\r\n", s);
467     return;
468   }
469
470   ptr = IINCHIP_READ( Sn_RX_RD0(s) );
471   ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ( Sn_RX_RD1(s) );
472
473   addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18;
474   wiz_read_buf(addrbsb, data, len);
475   ptr += len;
476
477   IINCHIP_WRITE( Sn_RX_RD0(s), (uint8)((ptr & 0xff00) >> 8));
478   IINCHIP_WRITE( Sn_RX_RD1(s), (uint8)(ptr & 0x00ff));
479 }
1205 static int w5500_raw_recv(struct eth_device *dev)
1206 {
1207     uint8_t sn;
1208     uint16_t data_len=0;
1209     uint16_t dummyPort = 0;
1210     uint16_t ptr = 0;
1211     uint8_t mFlag = 0;
1212     uint16_t pktlen;
1213     int debug = 1;
1214
1215     sn = 0;
1216     pktlen = getSn_RX_RSR(sn);
1217
1218     if(!pktlen) return pktlen;
1219     data_len = 0;
1220     recv_data_processing(sn, (uint8_t *)&NetRxPackets[0], pktlen);
1221     setSn_CR(sn,Sn_CR_RECV);
1222     while(getSn_CR(sn));
1223
1224     if(debug){
1225         char *c = NetRxPackets[0];
1226         int i;
1227         for(i=0;i<pktlen;i++){
1228             if(i && !(i%16))    printf("\n");
1229             printf("%02x.", c[i]);
1230         }
1231         printf("\n");
1232     }
1233     NetReceive(NetRxPackets[0], pktlen);
1234
1235     return pktlen;
1236 }

테스트를 하면 ARP Request를 받는 상황에서 pktlen이 62가 나오고 있습니다

그 중에 앞에 data length의 2byte 값과(전체 길이에서 헤더 2byte를 뺀 값) getSn_RX_RSR(sn);를 통해서 받은 데이터(헤더 포함 길이)는 일치 합니다(60byte, 62byte)
그리고 Sn_RX_RD에 써주게 되는 read byte(ptr) 역시 62로 확인 하였습니다.

데이터는 정상적인 것으로 보이고, uboot network stack에서도 이를 정상으로 인식하고 다음 단계로 넘어 갑니다.

그 다음 단계에서는 ping data를 send 하는 것인데, 특이하게도 data send 함수 자체는 정상적으로 종료 되었으나 상대 장비에서는 데이터를 받지 못하고 있습니다.

추가로 다음과 같은 테스트를 진행 하였습니다.
각각의 명령어를 통해 패킷을 전송하는 방법으로, 모든 로직은 똑같고 다만 데이터가 하나는 ARP(len:60) 이고 다른 하나는 ping(len:74) 입니다.
모두 MAC_RAW 모드에서 동작 하며, ARP 데이터는 전송이 되지만 Ping 데이터는 전송이 되지 않고 있습니다.
(대상 장비에서 wireshark로 캡쳐, ARP를 보내고 난 이후 ARP response를 받고 나서 ping 전송 시도)
혹시 어떠한 이유에서인지 알 수 있을까요?

이 부분에 대한 검토 부탁 드립니다.

감사합니다.

#2

Macraw용 코드 테스트 하여 드립니다.
첨부한 코드 참고 부탁드립니다.
감사합니다.
W5500 (3).zip (7.64 KB)

#3

잘 해결 되었습니다.

패킷을 받는 상대 장비에 문제가 있었던 것으로 보입니다.

지원에 감사드립니다.

감사합니다.