W5300과 w5100 동시 사용시 문의


#1

W5100과는 SPI로… W5300은 ADDRESS/DATA BUS로 1개의 MCU에서 사용할 예정입니다.
물론 IP가 2개가 필요한 시스템이라서요…
이럴때 소스 .C, .H파일을 공용으로 사용못하는 것으로 알고있는데 일일이 함수/변수명 변경작업을 해 줘야하나요?
send( …)등과 같은 같은 이름들이 너무 많아서… 효율적인 방법이 있는지에 대해 조언 부탁드립니다.


#2

Socket API는 동일하게 사용할수 있습니다.
물론 현재 제공되고 있는 Socket API는 없습니다만,

socket()과 같은 함수에서 id를 파라미터로 받아서 처리하는 방법이 있으며, 아니면 별도의 전용함수를 구현하여 사용하는 방법이 있습니다. 후자는 말씀하신대로 관리하기 불편하고 파일수도 많이 늘어나 코드량도 증가할 수 있습니다.

죄송하지만, 전자는 현재로서로 제공이 불가합니다.


#3

만약에 둘다 w5300을 사용한다면 거의 모든 소스를 공용으로 사용할 수 있을까요??


#4

현재 제공되고 있는 소스를 그대로 사용할 수는 없습니다.
일단 칩이 두개이므로, 해당 칩에 대한 Memory map을 별도로 정의하고,
각 API 호출시 이를 구분할 수 있도록 수정해야 합니다.

W5300의 경우 Direct나 Indirect Mode와 같은 Bus Interface를 지원하고 있으며 예로, Indirect Mode 라고 가정하면,
1번째 W5300을 System Memory 0x0000으로 할당, 2번째를 0x1000으로 할당했다고 할때,
W5300 Driver 및 Socket API에 칩아이디를 받을수 있도록 Parameter를 추가 정의 하시고 해당 칩아이디에 맞는 Register Map을 사용할 수 있도록 수정하셔야 합니다.

// 기존 Driver code
uint16   IINCHIP_READ(uint32 addr)
{
  #if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)   
       return (*((vuint16*)addr));
  #else
       vuint16  data;  
       IINCHIP_CRITICAL_SECTION_ENTER(); 
       *((vuint16*)IDM_AR) = (uint16)addr;
       data = *((vuint16*)IDM_DR);   
       IINCHIP_CRITICAL_SECTION_EXIT();
       return data;
  #endif
}

uint16   getIR(void)
{
   return IINCHIP_READ(IR);
}
//
//
////////////////////////////////////////////////////////
// Chip ID를 가지도록 수정한 코드 예 : id 0 - 1번째, id 1 - 2번째
//
uint16   IINCHIP_READ(uint8 id, uint32 addr)
{
  #if (__DEF_IINCHIP_ADDRESS_MODE__ == __DEF_IINCHIP_DIRECT_MODE__)   
       return ( *((vuint16*)((id*0x1000)+addr)) );
  #else
       vuint16  data;  
       IINCHIP_CRITICAL_SECTION_ENTER(); 
       *((vuint16*)((id*0x1000)IDM_AR)) = (uint16)addr;
       data = *((vuint16*)((id*0x1000)+IDM_DR));   
       IINCHIP_CRITICAL_SECTION_EXIT();
       return data;
  #endif
}

uint16   getIR(uint8 id)
{
   return IINCHIP_READ(id, IR);
}

Socket API도 동일한 방법으로 수정할 수 있습니다. 꼭 이방법이 좋은 것은 아닙니다. 같은 기능을 하는 함수를 다른이름으로 정의하시는 방법도 있으니 편하신 방법으로 구현할수 있습니다.

주의사항은 Register Memory Map 정의 Offset을 잘 이해하시고 서로 중복되지 않도록 설정하는 것입니다.