mbed RPC Library porting guide for WIZwiki-W7500

2015. 10. 8. 14:422018년 이전 관심사/mbed

반응형

mbed RPC Library porting guide for WIZwiki-W7500

Used library in this project

Modified Point

mbed rpc를 사용하기 위한 Interface는 RPC over Serial과 RPC over HTTP로 나눌 수 있다. 본 예제에서는 HTTP를 이용하여 RPC를 사용하며, mbed platform 에는 HTTPServer가 구동되고 있다. mbed rpc를 위한 Interface에 대한 자세한 정보는 Link를 참고 하기 바란다.

WIZnetInterface

HTTPServer Library에서 아래와 같은 코드를 사용하는데, WIZnetInterface에는 init()함수가 없음 —> WIZnetLibrary에 init() 함수 추가

HTTPServer/HTTPServer.cpp ( Line 50~56 )

INFO("Initializing network\n");
if (m_pEthernet->init() != 0) {
    ERR("Failed to initialize the ethernet interface !");
    delete m_pEthernet;
    m_pEthernet = NULL;
    return false;
}

mbed-rpc

공식 mbed-rpc Library에서 WIZwiki-W7500의 Pin들을 사용할 수 있도록 아래와 같이 코드를 추가 하였다.

mbed-rpc/parse_pins.cpp

#elif defined(TARGET_WIZwiki_W7500)
    if (str[0] == 'P' && str[2] == '_') {   // Px_n
        uint32_t port = str[1] - 'A';
        uint32_t pin  = str[3] - '0';       // Px_n
        uint32_t pin2 = str[4] - '0';       // Px_nn

        if (pin2 <= 9) {
            pin = pin * 10 + pin2;
        }
        return port_pin((PortName)port, pin);
#endif

WIZwiki-W7500의 Port와 Pin들은 아래와 같은 규칙으로 정의 되어 있으므로, parse_pins.cpp 에서는 PA_0와 같은 String Data를 받아 0x000과 같은 Int Data로 변환하는 동작을 수행한다.

// In PinNames.h

// W7500x PORT[5:4] + PIN[3:0])
PA_0  = 0x000,
PA_1  = 0x001,
PA_2  = 0x002,
...
PB_9  = 0x019,
PB_10 = 0x01A,
PB_11 = 0x01B,
...
PC_0  = 0x020,
PC_1  = 0x021,
PC_2  = 0x022,
...
// In PortNames.h

typedef enum {
    PortA = 0,
    PortB = 1,
    PortC = 2,
    PortD = 3,
} PortName;

mbed rpc library에 WIZwiki-W7500을 위한 코드를 추가한 후, mbed official repository에 pull request를 보내서 코드 업데이트를 요청 하였다.

Run Simple Example

#include "mbed.h"
#include "EthernetInterface.h"
#include "HTTPServer.h"
#include "mbed_rpc.h"

RpcDigitalOut led1(LED1,"led1");

EthernetInterface eth;  
HTTPServer svr;

int main() {
  //Turn the LEDs off
  uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x00, 0x00}; 
  led1.write(1);

  RPC::add_rpc_class<RpcDigitalOut>();

  printf("Setting up...\n");
  eth.init(mac_addr);
  int ethErr = eth.connect();
  if(ethErr < 0)
  {
    printf("Error %d in setup.\n", ethErr);
    return -1;
  }

  svr.addHandler<HTTPRpcRequestHandler>("/rpc");

  //attach server to port 80
  svr.start(80, &eth);

  printf("Listening...\n");

  Timer tm;
  tm.start();
  //Listen indefinitely
  while(true)
  {
    svr.poll();
    if(tm.read()>.5)
    {
      tm.start();
    }
  }
}
  • 6 : 제어를 원하는 GPIO의 RPC Name 지정
  • 19~20 : ethernet interface 초기화 및 DHCP 수행
  • 27 : HTTPRpcRequestHandler 등록
  • 30 : HTTP Server Start ( TCP Server로 80포트 리슨)


반응형

'2018년 이전 관심사 > mbed' 카테고리의 다른 글

W7500 mbed porting Guide ( 1/6 )  (0) 2015.10.08
mbed rpc interfacing with Python  (0) 2015.10.08
mbed RPC  (0) 2015.10.08
[FRDM-KL25Z]WIZ550 ioShield-A Porting Guide  (0) 2014.08.20
Eclipse에서 mbed repository 연동 하기  (0) 2014.06.15