LKP Ethernet Card SW 사용설명서 Version Information Tornado 2.0, 2.2
알 림 여기에실린내용은제품의성능향상과신뢰도의증대를위하여예고없이변경될수도있습니다. 여기에실린내용의일부라도엘케이일레븐의사전허락없이어떠한유형의매체에복사되거나저장될수없으며전기적, 기계적, 광학적, 화학적인어떤방법으로도전송될수없습니다. 엘케이일레븐경기도성남시중원구상대원동 191-1 SKn 테크노파크메가동 1306 호 LKP-400, LKP-401 는 엘케이일레븐의등록상표입니다. 2009-02-02 2/14
목차 알림... 2 1. Introduction... 4 1.1. LKP 의소개... 4 1.2. 본문서의내용... 4 2. LKP Ethernet Card... 5 2.1. IP 설정방법... 5 3. TCP/UDP Program Examples... 8 3.1. TCP 통신 Server Client Program Examples... 8 그림목차 그림 1. LKV-080A Board Booting 완료 Image... 5 그림 2. LKP Card IP 설정후 ifshow 출력결과... 6 2009-02-02 3/14
1. Introduction 1.1. LKP 의소개 LKP(PCI Mezzanine Card) 는 LKV-080A 보드의 Ethernet Port 확장용 Card 이다. LKP 에서지원되는 Ethernet Port 는 2Port 이다. 1.2. 본문서의내용 2 장에서는 LKP 의 Setting 방법과 IP 설정방법에대해간단히설명되며, IP 설정후확인할수있는 VxWorks Function 과, TCP/UDP 프로그램의예를설명한다. 2009-02-02 4/14
2. LKP Ethernet Card 2.1. IP 설정방법 LKP Card 는 Card 를 LKV-080A 보드에장착후별도의 Device Driver install 이필요없이사용가능하다. Software 에서사용시 EnetAttach 함수를이용하여, IP Setting 을해주게되며, ifshow Function 을이용하여확인할수있다. 그림 1. LKV-080A Board Booting 완료 Image 2009-02-02 5/14
[ 그림 1] 과같이 booting 이완료된상태에서 EnetAttach 함수를이용하여 LKP Ethernet Port 의 IP 를등록한다. IP 설정시각 Port 당반드시다른 Network 로설정되어야하며, 사용예는다음과같다. EX) EnetAttach Function 사용예 EnetAttach(arg1, arg2, arg3) Arg1 : Ethernet Device Number Arg2 : Ethernet IP Arg3 : NetMask value -> EnetAttach(2,"100.0.0.1",0xffffff00) value = 0 = 0x0 -> EnetAttach(3,"100.0.1.1",0xffffff00) value = 0 = 0x0 그림 2. LKP Card IP 설정후 ifshow 출력결과 2009-02-02 6/14
[ 그림 2] 와같이 ifshow 실행결과로확인사항은다음과같다. fei (unit number 2): Flags: (0x8063) UP BROADCAST MULTICAST ARP RUNNING Type: ETHERNET_CSMACD Internet address: 100.0.0.1 Broadcast address: 100.0.0.255 Netmask 0xff000000 Subnetmask 0xffffff00 Ethernet address is 00:0b:bb:ff:00:15 Metric is 0 Maximum Transfer Unit size is 1500 0 packets received; 1 packets sent 0 multicast packets received 0 multicast packets sent 0 input errors; 0 output errors 0 collisions; 0 dropped fei (unit number 3): Flags: (0x8063) UP BROADCAST MULTICAST ARP RUNNING Type: ETHERNET_CSMACD Internet address: 100.0.1.1 Broadcast address: 100.0.1.255 Netmask 0xff000000 Subnetmask 0xffffff00 Ethernet address is 00:0b:bb:ff:00:16 Metric is 0 Maximum Transfer Unit size is 1500 0 packets received; 1 packets sent 0 multicast packets received 0 multicast packets sent 0 input errors; 0 output errors 0 collisions; 0 dropped Unit number 가각각순차적으로설정이되어야하며, Internet address 가 EnetAttach Function 을통해등록된 Unit Number 와 IP 와같아야한다. NetMask 는 IP Class 에따라결정되며, A Class, B Class, C Class 에따라, 0xff000000, 0xffff0000, 0xffffff00 이된다. 2009-02-02 7/14
3. TCP/UDP Program Examples 3.1. TCP 통신 Server Client Program Examples VxWorks TCP/UDP Socket 설정관련 Header File #include <vxworks.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <types.h> #include <socket.h> #include "in.h" #include "inetlib.h" #include "socklib.h" #define ED_SIZE 0x100 TCP Server Client Program 예는다음과같다. int tcpserver(int port) struct sockaddr_in servaddr; struct sockaddr_in clntaddr; int sfd; int cfd; int recvlen; int i; unsigned char data; int clnt_addr_size; if( (sfd = socket(pf_inet, SOCK_STREAM, 0)) == ERROR) printf("socket() Error!! n"); close(sfd); return ERROR; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family=af_inet; servaddr.sin_addr.s_addr=htonl(inaddr_any); servaddr.sin_port=htons(port); if( bind(sfd, (struct sockaddr*)&servaddr, sizeof(servaddr))!= OK) printf("bind() Error!! n"); close(sfd); return ERROR; 2009-02-02 8/14
if( listen(sfd, 5)==ERROR) printf("listen() Error!! n"); clnt_addr_size = sizeof(clntaddr); if( (cfd = accept(sfd, (struct sockaddr*)&clntaddr, &clnt_addr_size)) == ERROR ) printf("accept() Error!! n"); FOREVER if ( (recvlen = recv(cfd, recvbuf, sizeof(recvbuf), 0))!= ERROR) if(dflag == 1)printf(" nrecvlen = %d n", recvlen); for(i=0; i<recvlen; i++) if(!(i%16)) if(dflag == 1)printf(" n"); else if(dflag == 1)printf("[%3d]",recvBuf[i]); printf("recv() Error!! n"); int tcpclient(char *adrs, int port) struct sockaddr_in servaddr; struct sockaddr_in clntaddr; int i,j,k; int sfdc; int sendlen; unsigned char data; data=0; if( (sfdc=socket(pf_inet, SOCK_STREAM, 0))==ERROR) printf("socket() Error!! n"); close(sfdc); return ERROR; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family=af_inet; servaddr.sin_addr.s_addr=inet_addr(adrs); servaddr.sin_port = port; for(i=0; i<sizeof(sendbuf); i++) sendbuf[i] = (unsigned char)data++; 2009-02-02 9/14
if( connect(sfdc, (struct sockaddr*)&servaddr, sizeof(servaddr)) == ERROR ) printf("connect() Error!! n"); FOREVER sendlen = write(sfdc, sendbuf, sizeof(sendbuf)); taskdelay(5); /* for(k=0; k<5000;k++)j++; */ if(dflag == 1)printf(" n send Length = %d n", sendlen); UDP Server Client Program 예는다음과같다. int server(int port) struct sockaddr_in servaddr; struct sockaddr_in clntaddr; int sfd; int recvlen; int i; unsigned char data; int clnt_addr_size; if( (sfd = socket(pf_inet, SOCK_DGRAM, 0)) == ERROR) printf("socket() Error!! n"); close(sfd); return ERROR; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family=af_inet; servaddr.sin_addr.s_addr=htonl(inaddr_any); servaddr.sin_port=htons(port); if( bind(sfd, (SOCKADDR*)&servAddr, sizeof(servaddr))!= OK) printf("bind() Error!! n"); close(sfd); return ERROR; FOREVER if ( (recvlen = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&clntaddr, &clnt_addr_size))!= ERROR) 2009-02-02 10/14
if(dflag == 1)printf(" nrecvlen = %d n", recvlen); for(i=0; i<recvlen; i++) if(!(i%16)) if(dflag == 1)printf(" n"); if(dflag == 1)printf("[%3d]",recvBuf[i]); int client(char *adrs, int port) struct sockaddr_in servaddr; struct sockaddr_in clntaddr; int i,j,k; int sfdc; int sendlen; unsigned char data; data=0; if( (sfdc=socket(pf_inet, SOCK_DGRAM, 0))==ERROR) printf("socket() Error!! n"); close(sfdc); return ERROR; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family=af_inet; servaddr.sin_addr.s_addr=inet_addr(adrs); servaddr.sin_port = port; for(i=0; i<sizeof(sendbuf); i++) sendbuf[i] = (unsigned char)data++; FOREVER sendlen = sendto(sfdc, sendbuf, sizeof(sendbuf), 0, (struct sockaddr*)&servaddr, sizeof(servaddr)); taskdelay(1); /* for(k=0; k<5000;k++)j++; if(dflag == 2)printf(" n send Length = %d n", sendlen); */ 2009-02-02 11/14
TCP/UDP Program 은위와같다. 위의프로그램을이용하여, [ 그림 3] 과같이환경 Setting 후시험할수있다. [ 그림 3] LKP Network Test 환경 2009-02-02 12/14
[ 그림 3] 과같이구성된 Network 시험환경에서, LKV-080A 보드를 booting 후 Network 시험 Object 를 LAN1 을통해다운로드한다. 다운로드후 Server Task 와 Client Task 를실행하면, 각각의 LAN Port 를 TCP 통신이된다. 080 Master 에서실행되는 Task void servertaska() EnetAttach(1,"220.76.46.99",0xffffff00); EnetAttach(2,"192.168.200.100",0xffffff00); EnetAttach(3,"192.168.201.100",0xffffff00); sp((funcptr)tcpserver,50000); sp((funcptr)tcpserver,60000); sp((funcptr)tcpserver,70000); sp((funcptr)tcpserver,80000); void clienttaska() sp((funcptr)tcpclient,"220.76.45.98",10000); sp((funcptr)tcpclient,"220.76.46.100",20000); sp((funcptr)tcpclient,"192.168.200.101",30000); sp((funcptr)tcpclient,"192.168.201.101",40000); 080 Slave 에서실행되는 Task void servertaskb() EnetAttach(1,"220.76.46.100",0xffffff00); EnetAttach(2,"192.168.200.101",0xffffff00); EnetAttach(3,"192.168.201.101",0xffffff00); sp((funcptr)tcpserver,10000); sp((funcptr)tcpserver,20000); sp((funcptr)tcpserver,30000); 2009-02-02 13/14
sp((funcptr)tcpserver,40000); void clienttaskb() sp((funcptr)tcpclient,"220.76.45.97",50000); sp((funcptr)tcpclient,"220.76.46.99",60000); sp((funcptr)tcpclient,"192.168.200.100",70000); sp((funcptr)tcpclient,"192.168.201.100",80000); Program 을동작실행하기전각 LAN2, LAN3, LAN4 가각각 Cross Cable 로확인후다음과같은순서에의해실행한다. [ 순서 1] 080 master Board 에서 servertaska 을실행한다. servertaska 를실행하면, LKV-080A Master 의 LAN2, LAN3, LAN4 의 IP 가설정된다. [ 순서 2] 080 slave Board 에서 servertaskb 를실행한다. servertaskb 를실행하면, LKV-080A Slave 의 LAN2, LAN3, LAN4 의 IP 가설정된다. [ 순서 3] 080 master Board 에서 clienttaska 을실행한다. [ 순서 4] 080 slave Board 에서 clienttaskb 을실행한다. 실행순서는위와같으며, clienttask 에서 servertask 로 256byte 를연속적으로 Write 하게된다. 2009-02-02 14/14