안녕하세요
현재 타겟보드(mips 계열 cpu 코어)의 uboot에 w5500을 포팅하고 있는 중입니다.
w5500 자체로 TCP/IP를 구동하지는 않으며, uboot에 있는 network stack을 사용하려 합니다.
하지만 현재 send 부분을 확인 하고 있는데, 데이터가 전송되지 않는 것으로 보여서 문의 드립니다.
common register는 다음과 같이 읽을 수 있습니다.
(이는 init 이후의 값이며, 기본 레지스터에 mac, ip, gateway, subnetmask만 설정)
u-boot# w5500 init
WIZCHIP W5500 Initialized
u-boot# w5500_rd 0 0 3a
00.c0.a8.64.fe.ff.ff.ff.00.00.00.e1.e2.e3.d4.c0.
a8.64.6c.00.00.00.00.00.00.07.d0.08.28.00.00.00.
00.00.00.00.00.00.ff.ff.00.00.00.00.00.00.bf.00.
00.00.00.00.00.00.00.78.25.04.
여기에 사용된 init code는 다음과 같습니다
1049 static int w5500_init(struct eth_device *dev, bd_t *bd)
1050 {
1051 uint8_t memsize[2][8] = { { 2, 2, 2, 2, 2, 2, 2, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2 } };
1052
1053 if (ctlwizchip(CW_INIT_WIZCHIP, (void*) memsize) == -1) {
1054 printf("WIZCHIP W5500 Initialized fail.\r\n");
1055 while (1);
1056 }
1057
1058 printf("WIZCHIP W5500 Initialized \n");
1059
1060 return 0;
1061 }
레지스터에서 보시다시피 common register의 phycfg는 정상적으로 반응 하는 것을 확인 하였습니다(link의 on/off로 확인)
그리고 SPI의 read/write는 register의 read/write로 확인이 된 상태입니다.
그리고 별도의 interrupt 세팅은 하지 않았습니다.(실제로는 GPIO에 intr pin이 연결 되어 있으나, 데이터 send 이므로 신경쓰지 않고 있습니다)
그리고 send 함수는 다음과 같습니다 (ARP broadcast를 전송하며, 테스트를 위한 pseudo code 입니다)
1111 static int w5500_send(struct eth_device *dev, volatile void *packet, int len)
1112 {
1113 u32 freesize = 0, totalbuf;
1114 uint8_t sn=0;
1115
1116 totalbuf = getSn_TxMAX(sn);
1117
1118 freesize = getSn_TX_FSR(sn);
1119
1120 wiz_send_data(sn, packet, len);
1121
1122 setSn_CR(sn, Sn_CR_SEND);
1123 /* wait to process the command... */
1124 while(getSn_CR(sn));
1125
1126 while(1)
1127 {
1128 u8 tmp = getSn_IR(sn);
1129 if(tmp & Sn_IR_SENDOK)
1130 {
1131 setSn_IR(sn, Sn_IR_SENDOK);
1132 break;
1133 }
1134 }
1135 return 0;
1136 }
현재 상황으로는 ARP broadcast를 전송 하려 하지만 getSn_IR(sn)에서 IR_SEND_OK가 나오지 않아 무한 루프를 돌고 있습니다. 물론, 전송 받는 반대측 계측기에는 데이터가 들어오지 않고 있습니다.
제 생각에는 어차피 network stack을 uboot에서 사용할 것이기 때문에 device init 이후에 send만 한다면 데이터가 전송되어야 할 것 같습니다. 혹시 software code상에 누락된 부분이 있는지 검토 부탁 드립니다.
감사합니다