본문 바로가기
DSP, MCU/TMS320F2838x (C28x)

TMS320F28388D ] CM코어에 lwIP 포팅

by eteo 2023. 3. 31.

 

 

 

포팅은 아래 경로의 예제를 참고해 진행한다.

C:\ti\c2000\C2000Ware_x_xx_xx_xx\libraries\communications\Ethernet\third_party\lwip\examples\enet_lwip_udp

 

 

 

lwip 라이브러리는 아래 경로에 있다. 이 경로를 그대로 쓰진 않고 폴더를 통째로 복사해서 프로젝트안에 가져온다.

C:\ti\c2000\C2000Ware_x_xx_xx_xx\libraries\communications\Ethernet\third_party\lwip

 

 

가져온 후 #include search path에 워닝이 안뜰 때까지 다음과 같이 추가해준다.

예제 프로젝트 참고해 스택사이즈도 늘려주고.

 

 

추가로 필요한 파일이 f2838xif.c, lwiplib.c, lwipopts.h 이다. 예제파일에서 복사해 가져온다.

 

그리고 원래 lwip 하위폴더들은 참고용으로만 보고 전부 빌드제외해준다. 첨에 .lib 파일이 어디있나 찾아봤는데 lwiplib.c 파일에서 소스파일을 전부 #include 하고 있기 때문에 include search path에만 등록해주면 라이브러리를 사용할 수 있다.

 

 

 

 

설정부분에선 CM_lwip_init() 함수를 따로 만들어둔건 다른예제에서 html 페이지를 램에 올리려고 그런 거 같다. 이거 안쓰고 CM_init()쓰면된다.

lwiPInit()함수 호출이 끝나면 my_udp_init() 하고 있는데 이것도 좀 별로다. 무슨 예제 돌리면 오류가 7개인가 나온다 콜백함수 원형도 안맞고. 차라리 인터넷에서 lwip raw api implementation 문서를 찾아 시작하는게 나을 수도 있다.

아무튼 설정이 끝나고 main loop 에서는 sys_check_timeouts(); 함수만 주기적으로 호출해주면된다.

CM_lwip_init();

SYSTICK_setPeriod(systickPeriodValue);
SYSTICK_enableCounter();
SYSTICK_registerInterruptHandler(SysTickIntHandler);
SYSTICK_enableInterrupt();

// Enable processor interrupts.
Interrupt_enableInProcessor();

// Set user/company specific MAC octets
// (for this code we are using A8-63-F2-00-00-80)
// 0x00 MACOCT3 MACOCT2 MACOCT1
ulUser0 = 0x00F263A8;

// 0x00 MACOCT6 MACOCT5 MACOCT4
ulUser1 = 0x00800000;

// Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC
// address needed to program the hardware registers, then program the MAC
// address into the Ethernet Controller registers.
pucMACArray[0] = ((ulUser0 >>  0) & 0xff);
pucMACArray[1] = ((ulUser0 >>  8) & 0xff);
pucMACArray[2] = ((ulUser0 >> 16) & 0xff);
pucMACArray[3] = ((ulUser1 >>  0) & 0xff);
pucMACArray[4] = ((ulUser1 >>  8) & 0xff);
pucMACArray[5] = ((ulUser1 >> 16) & 0xff);

// Initialize ethernet module.
Ethernet_init(pucMACArray);

// Initialze the lwIP library, using DHCP.
lwIPInit(0, pucMACArray, IPAddr, NetMask, GWAddr, IPADDR_USE_STATIC);

// Initialize the UDP server
my_udp_init();