WIZnet Developer Forum

Uboot에서의 W5500 read/write

안녕하세요

현재 타겟보드(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상에 누락된 부분이 있는지 검토 부탁 드립니다.

감사합니다

안녕하세요.

먼저 Boot에서 MACRAW mode로 Send/Recv 전송합니다.

init_w5500()이후 MACRAW부분의 설정이 없어서 이부분확인 부탁드립니다.
아래의 부분이 적용되었는지 확인 부탁드립니다.

void macraw_open(void)
{
  uint8 sock_num;
  uint16 dummyPort = 0;
  uint8 mFlag = 0;
  sock_num = 0;


  close(sock_num); // Close the 0-th socket
  socket(sock_num, Sn_MR_MACRAW, dummyPort,mFlag);  // OPen the 0-th socket with MACRAW mode
}

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.