月別アーカイブ: 2016年12月

lwIPでsntp

DHCPがサーバーからの応答の処理部分で上手く動かないので他のUDPアプリを試してみます。
contrib-1.4.1/apps/sntpを試します。
sntpサーバアドレスを変更して(lwipopts.hに追加)

/* SNTP */
#define SNTP_SERVER_DNS			LWIP_DNS
#if SNTP_SERVER_DNS
	#define SNTP_SERVER_ADDRESS "ntp.jst.mfeed.ad.jp"
#else
	#define SNTP_SERVER_ADDRESS "210.173.160.57"
#endif
#define SNTP_DEBUG			LWIP_DBG_ON

で動かしてみます。

LPC2388 lwIP:72000000Hz
PHYInit:0
PHYInit:1
PHYInit:2
PHYInit:3
PHYInit:4
PHYInit:5 6
sntp_send_request: Sending request to server
udp_send
udp_send: not yet bound to a port, binding now
udp_bind(ipaddr = 0.0.0.0, port = 0)
udp_bind: bound to 0.0.0.0, port 49153
udp_send: added header in given pbuf 0x40000a70
udp_send: sending datagram of length 56
udp_send: UDP packet length 56
udp_send: UDP checksum 0x0ddd
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
udp_input: received datagram of length 56
UDP header:
+-------------------------------+
|       123     |     49153     | (src port, dest port)
+-------------------------------+
|        56     |     0x28fe    | (len, chksum)
+-------------------------------+
udp (192.168.11.100, 49153) <-- (210.173.160.57, 123)
pcb (0.0.0.0, 49153) --- (0.0.0.0, 0)
udp_input: calculating checksum
sntp_process: Thu Dec 29 02:17:01 2016
sntp_recv: Scheduled next time request: 3600000 ms

問題なく時刻を取得できました。
UDPの受信が駄目なわけでなくDHCPの受信側に問題が有るようです。

DNSも動きました。サーバのアドレス指定は以下で設定しました。
IP4_ADDR(&xDns, 8, 8, 8, 8);
dns_setserver(0, &xDns);

LPC2388 lwIP:72000000Hz
dns_init: initializing
udp_bind(ipaddr = 0.0.0.0, port = 0)
udp_bind: bound to 0.0.0.0, port 49153
PHYInit:0
PHYInit:1
PHYInit:2
PHYInit:3
PHYInit:4
dns_tmr: dns_check_entries
dns_tmr: dns_check_entries
PHYInit:5 6
IP:192.168.11.100
dns_enqueue: "ntp.jst.mfeed.ad.jp": use DNS entry 0
dns_send: dns_servers[0] "ntp.jst.mfeed.ad.jp": request
udp_connect: connected to 0.0.0.0,port 49153
udp_send
udp_send: added header in given pbuf 0x400010e8
udp_send: sending datagram of length 45
udp_send: UDP packet length 45
udp_send: UDP checksum 0x6630
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
sntp_request: Waiting for server address to be resolved.
udp_input: received datagram of length 93
UDP header:
+-------------------------------+
|        53     |     49153     | (src port, dest port)
+-------------------------------+
|        93     |     0x6239    | (len, chksum)
+-------------------------------+
udp (192.168.11.100, 49153) <-- (208.67.222.222, 53)
pcb (0.0.0.0, 49153) --- (208.67.222.222, 53)
udp_input: calculating checksum
dns_recv: "ntp.jst.mfeed.ad.jp": response = 210.173.160.27
sntp_dns_found: Server address resolved, sending request
sntp_send_request: Sending request to server
udp_send
udp_send: not yet bound to a port, binding now
udp_bind(ipaddr = 0.0.0.0, port = 0)
udp_bind: bound to 0.0.0.0, port 49154
udp_send: added header in given pbuf 0x400010e8
udp_send: sending datagram of length 56
udp_send: UDP packet length 56
udp_send: UDP checksum 0x2add
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
udp_input: received datagram of length 56
UDP header:
+-------------------------------+
|       123     |     49154     | (src port, dest port)
+-------------------------------+
|        56     |     0xe57f    | (len, chksum)
+-------------------------------+
udp (192.168.11.100, 49154) <-- (210.173.160.27, 123)
pcb (0.0.0.0, 49154) --- (0.0.0.0, 0)
pcb (0.0.0.0, 49153) --- (208.67.222.222, 53)
udp_input: calculating checksum
sntp_process: Thu Dec 29 05:04:22 2016
sntp_recv: Scheduled next time request: 3600000 ms

追記
DHCPも動くようになりました。
SNTPは、デバッグ出力だけでは使えないので以下の修正をしました。

lwipopts.h
#include <time.h>
#define SNTP_DEBUG			LWIP_DBG_OFF

void sntp_set_system_time_func(time_t sec);
#define SNTP_SET_SYSTEM_TIME(sec)	sntp_set_system_time_func(sec)

main.c
void sntp_set_system_time_func(time_t sec)
{
    sntp_stop();
    printf("sntp_set_system_time:%s\n",ctime(&sec));
}

sntp_set_system_time_funcからRTCを設定するようにしたいと思います。
LPC23xx_24xxSampleSoftware.r6\RTCのrtc.[ch]を使って設定するようにしました。

void sntp_set_system_time_func(time_t sec)
{
    struct tm *time_inf;
    struct tm ctm;
    time_t csec;
    RTCTime local_time, current_time;

    sntp_stop();
    sec += 9*3600;	//GMT->JST
    printf("sntp_set_system_time:%s",ctime(&sec));

    /* Initialize RTC module */
    RTCInit();

    /* set local time */
    time_inf = gmtime(&sec);
    local_time.RTC_Sec = time_inf->tm_sec;
    local_time.RTC_Min = time_inf->tm_min;
    local_time.RTC_Hour = time_inf->tm_hour;
    local_time.RTC_Mday = time_inf->tm_mday;
    local_time.RTC_Wday = time_inf->tm_wday;
    local_time.RTC_Yday = time_inf->tm_yday;
    local_time.RTC_Mon = time_inf->tm_mon;
    local_time.RTC_Year = time_inf->tm_year + 1900;
    RTCSetTime(local_time);	/* Set local time */

    /* install RTC timer handler mainly for alarm control */
    if (install_irq(RTC_INT, (void *) RTCHandler, HIGHEST_PRIORITY) == FALSE) {
	printf("install_irq error\n");		/* very bad happened */
    }

    /* mask off alarm mask, turn on IMYEAR in the counter increment interrupt register */
    RTCSetAlarmMask(AMRSEC | AMRMIN | AMRHOUR | AMRDOM | AMRDOW | AMRDOY | AMRMON | AMRYEAR);
    RTC_CIIR = IMMIN | IMYEAR;

    RTCStart();
#if 1	// check
    vTaskDelay(1000*3);
    current_time = RTCGetTime();
    ctm.tm_sec = current_time.RTC_Sec;
    ctm.tm_min = current_time.RTC_Min;
    ctm.tm_hour = current_time.RTC_Hour;
    ctm.tm_mday = current_time.RTC_Mday;
    ctm.tm_wday = current_time.RTC_Wday;
    ctm.tm_yday = current_time.RTC_Yday;
    ctm.tm_mon =  current_time.RTC_Mon;
    ctm.tm_year = current_time.RTC_Year - 1900;
    csec = mktime(&ctm);
    printf("RTCGetTime:%s",ctime(&csec));
#endif
}

LPC2388のemac.cを72MHz対応

今まで動かしていたuIP、lwIPのCPUクロックは48MHzです。
インターフェース誌のネットワーク・・テスト用サンプルプログラムやリアルタイムOSの
プログラムは72MHzで動いています。せっかくなので対応させてみました。

FreeRTOSConfig.h
#ifdef USE_CLK72
	#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 72000000 )
#endif
#ifdef USE_CLK60
	#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 60000000 )
#endif
#ifdef USE_CLK48
	#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 48000000 )
#endif

main.c
#ifdef USE_CLK72
	// 2*12MH*12/1/4=72MHz
	#define mainPLL_MUL		( ( unsigned portLONG ) ( 12 - 1 ) )
	#define mainPLL_DIV		( ( unsigned portLONG ) ( 1 - 1 ) )
	#define mainCPU_CLK_DIV		( ( unsigned portLONG ) ( 4 - 1 ) )
#endif
#ifdef USE_CLK60
	// 2*12MH*15/1/6=60MHz
	#define mainPLL_MUL		( ( unsigned portLONG ) ( 15 - 1 ) )
	#define mainPLL_DIV		( ( unsigned portLONG ) ( 1 - 1 ) )
	#define mainCPU_CLK_DIV		( ( unsigned portLONG ) ( 6 - 1 ) )
#endif
#ifdef USE_CLK48
	// 2*12MH*8/1/4=48MHz
	#define mainPLL_MUL		( ( unsigned portLONG ) ( 8 - 1 ) )
	#define mainPLL_DIV		( ( unsigned portLONG ) ( 1 - 1 ) )
	#define mainCPU_CLK_DIV		( ( unsigned portLONG ) ( 4 - 1 ) )
#endif

これでFreeRTOSが72MHzで動きます。しかしPHYinitが正常に終了しません。
emac.cのInit_EMAC(void)の/* Enable Reduced MII interface. */の直前に追加します。

    /* MIIインターフェースの設定:
	div4	(0<<4)|(0<<3)|(0<<2) reset 48MH/4=12
	div6	(0<<4)|(1<<3)|(0<<2)
	div8	(0<<4)|(1<<3)|(1<<2)
	div10	(1<<4)|(0<<3)|(0<<2)
	div14	(1<<4)|(0<<3)|(1<<2)
	div20	(1<<4)|(1<<3)|(0<<2)
	div28	(1<<4)|(1<<3)|(1<<2)
       CCLK = 72 MHz, MII clock = CCLK/28 = 2.5 MHz */
#ifdef USE_CLK72
    //MAC_MCFG = (1<<4)|(1<<3)|(1<<2);	//72MHz div28 = 2.57MHz
    MAC_MCFG = (0<<4)|(1<<3)|(0<<2);	//72MHz div6 = 12MHz
#endif
#ifdef USE_CLK60
    //MAC_MCFG = (1<<4)|(1<<3)|(0<<2);	//60MHz div20 = 3MHz
    MAC_MCFG = (0<<4)|(1<<3)|(0<<2);	//60MHz div6 = 10MHz
#endif
#ifdef USE_CLK48
    //MAC_MCFG = (1<<4)|(1<<3)|(0<<2);	//40MHz div20 = 2.4MHz
    MAC_MCFG = (0<<4)|(0<<3)|(0<<2);	//48MHz div4 = 12MHz
#endif

この変更で無事動きました。

追記
USBコネクタに刺すタイプの電流計で消費電流を調べてみました。
ISPモード 0.15~0.20A
48MHz動作時 0.34A
72MHz動作時 0.36A
クロックの差による電流の変化は大きくないようです。

LPC2388でFreeRTOS

今までFreeRTOSを動かしていましたがARM7_LPC23xxをそのもま使うのは問題が有るようです。
FreeRTOS 9.0.0, 6.0.3, 5.4.2, 5.0.2で確認しましたがport.cがLPC2388で使うと
TM0の割り込み周期が期待値と一致しません。

FreeRTOS\Source_v502\portable\GCC\ARM7_LPC23x\port.c
static void prvSetupTimerInterrupt( void )
	PCLKSEL0 = (PCLKSEL0 & (~(0x3<<2))) | (0x01 << 2);

になっています。UM10211 Rev4.1_LPC23XX User manual P.64では、
PCLKSEL0=bit[3:2] PCLK_TIMER0
00 1/4 CCLK
01 For PCLK_RTC only, the value ’01’ is illegal.
Do not write ’01’ to the PCLK_RTC. Attempting to write ’01’results in the previous value being unchanged
10 1/2 CCLK
11 1/8 CCLK
なので01を書いても変わりません。01でPCLK=PCLKになれば次の項目は問題さりません。

MDK-ARMのスタートアップルーチンも

;//        PCLK_TIMER0: Peripheral Clock Selection for TIMER0
;//                     <0=> Pclk = Cclk / 4
;//                     <1=> Pclk = Cclk
;//                     <2=> Pclk = Cclk / 2
;//                     <3=> Pclk = Hclk / 8

でPCLK=CCLKが選べます。またIF誌2009.5 P.90でもPCLK=CCLKが使えると書かれています。

チップの違いかと思いLPC2368,LPC2378のデータシートを探しましたが確認できませんでした。
ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;
T0MR1 = ulCompareMatch;
configCPU_CLOCK_HZの部分がPCLKの周波数になるべきです。

FreeRTOSConfug.h
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 48000000 )	/* =12.0MHz xtal multiplied by 5 using the PLL. */
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )

なのでulCompareMatchをPCLKSEL0の設定で割る必要があると思います。

FreeRTOS LPC2388で検索しましたが上記問題を指摘しているものは見つかりませんでした。

追記 User manualもLPC23XXシリーズになっているのでLPC2388固有の問題では無いです。

lwIP-1.4.1でDHCP

DHCPを試してみます。

lwipopts.h
LWIP_DHCP 1
LWIP_AUTOIP 1
LWIP_DHCP_AUTOIP_COO 1
MEMP_NUM_SYS_TIMEOUT (3+2+1)  //3+DHCP=2+AUTOIP=1
DHCP_DEBUG           LWIP_DBG_ON

webserver.c
#ifdef USE_DHCP
#include "lwip/dhcp.h"
#endif

void vBasicWEBServer(void *pvParameters)
#ifdef USE_DHCP
    static struct dhcp st_dhcp;
#endif

#ifndef USE_DHCP
    IP4_ADDR(&xIpAddr, 192, 168, 11, 100);
    IP4_ADDR(&xNetMast, 0xFF, 0xFF, 0xFF, 0x00);
    IP4_ADDR(&xGateway, 192, 168, 11, 1);
#endif
    netif_add(&EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init, tcpip_input);

    /* make it the default interface */
    netif_set_default(&EMAC_if);
#ifdef USE_DHCP
    dhcp_set_struct(&EMAC_if, &st_dhcp);
    err = dhcp_start(&EMAC_if);
    if(err){
    	printf("dhcp_start:%d\n", err);
    }
    /* wait for an IP Address */
    while(!netif_is_up(&EMAC_if)){
	vTaskDelay(webSHORT_DELAY);
    }
    printf("IP:%d.%d.%d.%d\n",
	(EMAC_if.ip_addr.addr>> 0)&0xff,
	(EMAC_if.ip_addr.addr>> 8)&0xff,
	(EMAC_if.ip_addr.addr>>16)&0xff,
	(EMAC_if.ip_addr.addr>>24)&0xff);
#else
    /* bring it up */
    netif_set_up(&EMAC_if);
#endif

動かしてみます。

LPC2388 lwIP:48000000MHz
dhcp_start(netif=0x40000970) en0
dhcp_start(): starting new DHCP client
dhcp_start(): allocated dhcpdhcp_start(): starting DHCP configuration
dhcp_discover()
transaction id xid(abcd0001)
dhcp_discover: making request
dhcp_discover: realloc()ing
dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)
dhcp_discover: deleting()ing
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 2000 msecs
dhcp_fine_tmr(): request timeout
dhcp_timeout()
dhcp_timeout(): restarting discovery
dhcp_discover()

DHCPサーバが応答してないみたいです。

追記
#define UDP_DEBUG LWIP_DBG_ON
にして、実行してみます。

dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)
udp_send: added header in given pbuf 0x40000a60
udp_send: sending datagram of length 316
udp_send: UDP packet length 316
udp_send: UDP checksum 0x54c0
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
dhcp_discover: deleting()ing
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 16000 msecs
udp_input: received datagram of length 140
UDP header:
+-------------------------------+
|     17500     |     17500     | (src port, dest port)
+-------------------------------+
|       140     |     0xf8d8    | (len, chksum)
+-------------------------------+
udp (255.255.255.255, 17500) <-- (192.168.11.19, 17500)
pcb (0.0.0.0, 68) --- (0.0.0.0, 67)
dhcp_fine_tmr(): request timeout
dhcp_timeout()
dhcp_timeout(): restarting discovery
dhcp_discover()

応答パケットを受信しているようです。

#ifdef USE_DHCP
    IP4_ADDR(&xIpAddr, 0, 0, 0, 0);
    IP4_ADDR(&xNetMast, 0, 0, 0, 0);
    IP4_ADDR(&xGateway, 0, 0, 0, 0);
#else
    IP4_ADDR(&xIpAddr, 192, 168, 11, 100);
    IP4_ADDR(&xNetMast, 0xFF, 0xFF, 0xFF, 0x00);
    IP4_ADDR(&xGateway, 192, 168, 11, 1);
#endif

にして、DHCPサーバ側で見るとアドレスが割り当てられていました。
でも ping しても応答をかえしません。

追記
DHCPサーバが送信するブロードキャストを受信処理していないようななで修正してみました。

lwipopts.h
#define IP_SOF_BROADCAST_RECV	1
#define IP_SOF_BROADCAST	1

webserver.c
    static struct udp_pcb st_pcb;

    dhcp_set_struct(&EMAC_if, &st_dhcp);
    memset(&st_pcb, 0, sizeof(struct udp_pcb));
    memset(&st_dhcp_msg, 0, sizeof(struct dhcp_msg));
    st_dhcp.pcb = &st_pcb;
    st_pcb.so_options = SOF_BROADCAST;
    err = dhcp_start(&EMAC_if);

これでIPが設定されるようになりました。

LPC2388 lwIP:72000000Hz
udp_bind(ipaddr = 0.0.0.0, port = 0)
udp_bind: bound to 0.0.0.0, port 49153
PHYInit:0
PHYInit:1
PHYInit:2
PHYInit:3
PHYInit:4
PHYInit:5 6
dhcp_start(netif=0x40001048) en0
dhcp_start(): restarting DHCP configuration
udp_bind(ipaddr = 0.0.0.0, port = 68)
udp_bind: bound to 0.0.0.0, port 68
udp_connect: connected to 0.0.0.0,port 68
dhcp_start(): starting DHCP configuration
dhcp_discover()
transaction id xid(abcd0001)
dhcp_discover: making request
dhcp_discover: realloc()ing
dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)
udp_send: added header in given pbuf 0x40001184
udp_send: sending datagram of length 316
udp_send: UDP packet length 316
udp_send: UDP checksum 0x74e0
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
dhcp_discover: deleting()ing
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 2000 msecs
udp_input: received datagram of length 308
UDP header:
+-------------------------------+
|        67     |        68     | (src port, dest port)
+-------------------------------+
|       308     |     0xff48    | (len, chksum)
+-------------------------------+
udp (255.255.255.255, 68) <-- (192.168.11.1, 67)
udp_input: calculating checksum
dhcp_recv(pbuf = 0x7fe028a0) from DHCP server 192.168.11.1 port 67
pbuf->len = 300
pbuf->tot_len = 300
searching DHCP_OPTION_MESSAGE_TYPE
DHCP_OFFER received in DHCP_SELECTING state
dhcp_handle_offer(netif=0x40001048) en0
dhcp_handle_offer(): server 0x010ba8c0
dhcp_handle_offer(): offer for 0x0a0ba8c0
dhcp_select(netif=0x40001048) en0
transaction id xid(abcd0002)
udp_send: added header in given pbuf 0x40001184
udp_send: sending datagram of length 316
udp_send: UDP packet length 316
udp_send: UDP checksum 0x7479
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
dhcp_select: REQUESTING
dhcp_select(): set request timeout 2000 msecs
udp_input: received datagram of length 308
UDP header:
+-------------------------------+
|        67     |        68     | (src port, dest port)
+-------------------------------+
|       308     |     0xfc47    | (len, chksum)
+-------------------------------+
udp (255.255.255.255, 68) <-- (192.168.11.1, 67)
udp_input: calculating checksum
dhcp_recv(pbuf = 0x7fe028a0) from DHCP server 192.168.11.1 port 67
pbuf->len = 300
pbuf->tot_len = 300
searching DHCP_OPTION_MESSAGE_TYPE
DHCP_ACK received
dhcp_check(netif=0x40001048) en
dhcp_check(): set request timeout 500 msecs
dhcp_fine_tmr(): request timeout
dhcp_timeout()
dhcp_timeout(): CHECKING, ARP request timed out
dhcp_check(netif=0x40001048) en
dhcp_check(): set request timeout 500 msecs
dhcp_fine_tmr(): request timeout
dhcp_timeout()
dhcp_timeout(): CHECKING, ARP request timed out
dhcp_bind(netif=0x40001048) en0
dhcp_bind(): t1 renewal timer 86400 secs
dhcp_bind(): set request timeout 86400000 msecs
dhcp_bind(): t2 rebind timer 172800 secs
dhcp_bind(): set request timeout 172800000 msecs
dhcp_bind(): IP: 0x0a0ba8c0
dhcp_bind(): SN: 0x00ffffff
dhcp_bind(): GW: 0x010ba8c0
IP:192.168.11.10

追記
取得したアドレスにpingすると応答します。
webserverに接続するとコネクションは成立しますがメッセージが出ません。
調べると

State: SYN_RCVD
TCP connection established 58704 -> 80.
accept_function: newpcb->tate: ESTABLISHED
>>>>> ok
tcp_receive: ACK for 6511, unacked->seqno 6510:6511
tcp_receive: removing 6510:6511 from pcb->unacked
State: ESTABLISHED
>>>>> ng
memp_malloc: out of memory in pool NETCONN
tcp_pcb_purge
tcp_pcb_purge: data left on ->unacked

でメモリが不足していました。
lwipopts.hを
#define MEMP_NUM_NETCONN 6
に変更したところ無事表示出来るようになりました。

LPC2388のETHERメモリを試す

LPC2388 にモニタを移植
を見るとETHERメモリ(16Kbyte SRAM)も普通にアクセス出来るようです。
uIP,lwIPを動かしてみましたがどちらもETHERメモリを利用していません。
折角有るのだから使ってみます。モニタのソースを見ると

// 3行追加。これが無いと、処理がかなり遅い。
    *MAM_MAMCR = 0;		//       Stop MAM
    *MAM_MAMTIM = 4;		// over 60MHz
    *MAM_MAMCR = 2;		//       Start MAM
// 簡易モニタに移行する。

と有ります。lwIP,uIPとも設定していない(コメントになっています。)ので有効にします。

main.c 
static void prvSetupHardware(void)
    if (20 * 1000 * 1000 > configCPU_CLOCK_HZ) {
	tmp = 1;		// <20MHz
    } else if (40 * 1000 * 1000 > configCPU_CLOCK_HZ) {
	tmp = 2;		// 20-40MHz
    } else if (60 * 1000 * 1000 > configCPU_CLOCK_HZ) {
	tmp = 3;		// 40-60Mhz
    } else {
	tmp = 4;		// >60MHz
    }
    MAMCR = 0;
    MAMTIM = tmp;		//mainMAM_TIM_3;
    MAMCR = mainMAM_MODE_FULL;

CPUクロックの設定に対応しておきます。
lwIPでメモリを確保している分部にメモリセクションの指定を追加します。

memp.c
#ifdef __GNUC__
__attribute__ ((section(".etherram")))
#endif
static u8_t memp_memory[MEM_ALIGNMENT - 1 

makeしてmapファイルを確認します。

 *(.etherram)
 .etherram      0x7fe00000     0x1014 memp.o
                0x7fe00000                memp_memory
                0x7fe01018                . = ALIGN (0x8)
 *fill*         0x7fe01014        0x4 

指定通り使われています。
動かしてみるとpingにも応答しません。
メインメモリと同様に使えないのかな?

追記
uIPでは使えました。

uip-conf.h
#define UIP_CONF_EXTERNAL_BUFFER

を追加して

main.c
#include "uip-conf.h"

#ifdef UIP_CONF_EXTERNAL_BUFFER
#ifdef __GNUC__
	__attribute__ ((section(".etherram")))
#endif
	u8_t uip_buf[UIP_BUFSIZE + 2];
#endif	//UIP_CONF_EXTERNAL_BUFFER

追加します。UIP_CONF_EXTERNAL_BUFFERを定義するとuip.cで確保する部分が無効になります。
念のためmain.c prvSetupHardware(void)の中でethernet SRAM 0-clearを追加しました。

#include <string.h>
    memset((char *)0x7fe00000,0,16*1024);

mapファイルは下記になっています。

 *(.etherram)
 .etherram      0x7fe00000      0x5f2 main.o
                0x7fe00000                uip_buf
                0x7fe005f8                . = ALIGN (0x8)
 *fill*         0x7fe005f2        0x6 

追加2
lwIPでも動きました。

cc.h
#define MEMP_SEPARATE_POOLS	1

memp.c
//#define LWIP_MEMPOOL(name,num,size,desc) u8_t memp_memory_ ## name ## _base \

#define LWIP_MEMPOOL(name,num,size,desc) __attribute__((section(".etherram"))) u8_t memp_memory_ ## name ## _base \

でOKでした。やはり小手先でメモリの格納アドレスの指定を変えるだけでは駄目でソースを読まないと駄目ですね。
mapファイルは

 *(.etherram)
 .etherram      0x7fe00000     0x2cb8 memp.o
                0x7fe00000                memp_memory_RAW_PCB_base
                0x7fe00070                memp_memory_UDP_PCB_base
                0x7fe000f0                memp_memory_TCP_PCB_base
                0x7fe003e8                memp_memory_TCP_PCB_LISTEN_base
                0x7fe004c8                memp_memory_TCP_SEG_base
                0x7fe00608                memp_memory_REASSDATA_base
                0x7fe006a8                memp_memory_NETBUF_base
                0x7fe006c8                memp_memory_NETCONN_base
                0x7fe00768                memp_memory_TCPIP_MSG_API_base
                0x7fe007b8                memp_memory_TCPIP_MSG_INPKT_base
                0x7fe00858                memp_memory_ARP_QUEUE_base
                0x7fe00948                memp_memory_SYS_TIMEOUT_base
                0x7fe00978                memp_memory_PBUF_base
                0x7fe00a78                memp_memory_PBUF_POOL_base
                0x7fe02cb8                . = ALIGN (0x8)

LPC2388でlwIP1.4.0を動かす

FreeRTOS 9.0.0でlwIP 1.3.2が動いたので1.4.0を動かしてみました。
変更箇所が多かったです。
sys_arch.[ch] www.lpcware.comのlwip_lpc-v1.10.zipの置き換えました。

Makefileにlwip_timers.o def.oを追加します。

webserver.c
void http_server_serve(struct netconn *conn)
#ifdef LWIP14
    err_t err;
#endif
略
#ifdef LWIP14
    err = netconn_recv(conn, &inbuf);
    if (err == ERR_OK) {
#else
    inbuf = netconn_recv(conn);
    if (netconn_err(conn) == ERR_OK) {
#endif

void vBasicWEBServer( void *pvParameters )
#ifdef LWIP14
    err_t err;
#endif
略
#ifdef LWIP14
    err = netconn_accept(conn, &newconn);
    if (err == ERR_OK) {
#else
    newconn = netconn_accept(conn);
    if(newconn != NULL){
#endif

関数のインタフェースが変更になっているので合わせます。

でコンパイルすると2か所エラーになります。
sys_arch.o: In function `sys_mutex_new’:
sys_arch.c:(.text+0x474): undefined reference to `xQueueCreateMutex’
MUTEXESを使えるようにします。
FreeRTOSconfig.h
#define configUSE_MUTEXES 1

sys_arch.cに#include “FreeRTOS.h”追加します。

ethernetif.o: In function `ethernetif_input’:
ethernetif.c:(.text+0x518): undefined reference to `etharp_arp_input’
Demo/Common/ethernet/lwip-1.4.0/src/netif/etharp.c
static void
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
1.3.2ではstaticが付いませんが1.4.0ではついているのでエラーなっています。
とりあえずstaticをコメントアウトして動くようになりました。

追記
1.4.1も動きました。Makefileを下記に変更しました。
#lwip_timers.o: $(LWIP)/core/lwip_timers.c #1.4.0
lwip_timers.o: $(LWIP)/core/timers.c #1.4.1

etharp_arp_inputは、変更ありませんでした。
staticでも動くようにするには

ethernetif.c
static void ethernetif_input( void * pvParameters )
for ( ;; ){
 do{
  略
  }while ( p == NULL );
#ifdef LWIP14
  ethernet_input(p, xNetIf);//etharp_arp_inputを使っています。
#else
  略 etharp_arp_inputを使っています。
#endif
 }

のような変更が必要です。まだ修正中です。

#ifdef LWIP14
    netif->flags = (NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP);
#else
    netif->flags = NETIF_FLAG_BROADCAST;
#endif

を追加してOKになりました。
デバッグ用の設定をして動かすと次のようになりました。

lwipopts.h
#define LWIP_DEBUG
#define LWIP_DBG_MIN_LEVEL    LWIP_DBG_LEVEL_ALL //LWIP_DBG_LEVEL_OFF
#define LWIP_DBG_TYPES_ON     LWIP_DBG_ON
すべてLWIP_DBG_ONにしています。
----------------------- ok
LPC2388 lwIP
netif_set_ipaddr: netif address being changed
netif: IP address of interface  set to 192.168.11.100
netif: netmask of interface  set to 255.255.255.0
netif: GW address of interface  set to 192.168.11.1
netif: added interface en IP addr 192.168.11.100 netmask 255.255.255.0 gw 192.168.11.1
netif: setting default interface en
// webserver start
tcpip_thread: API message 0x4000612c
tcpip_thread: API message 0x40006124
tcp_bind: bind to port 80
tcpip_thread: API message 0x4000612c
// ARP
pbuf_alloc(length=64)
pbuf_alloc: allocated pbuf 0x400030a0
pbuf_alloc(length=64) == 0x400030a0
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:00:11:24:7d:3e:e6, type:806
etharp_update_arp_entry: 192.168.11.5 - 00:11:24:7d:3e:e6
etharp_find_entry: found empty entry 0
etharp_find_entry: selecting empty entry 0
etharp_update_arp_entry: updating stable entry 0
etharp_arp_input: incoming ARP request
etharp_arp_input: replying to ARP request for our IP address
pbuf_free(0x400030a0)
pbuf_free: deallocating 0x400030a0
// ping
pbuf_alloc(length=102)
pbuf_alloc: allocated pbuf 0x400030a0
pbuf_alloc(length=102) == 0x400030a0
pbuf_header: old 0x400030b0 new 0x400030be (-14)
tcpip_thread: PACKET 0x40001068
ip_input: iphdr->dest 0x640ba8c0 netif->ip_addr 0x640ba8c0 (0xba8c0, 0xba8c0, 0x64000000)
ip_input: packet accepted on interface en
ip_input:
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        84     | (v, hl, tos, len)
+-------------------------------+
|    32101      |000|       0   | (id, flags, offset)
+-------------------------------+
|   64  |    1  |    0x658a     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   11  |    5  | (src)
+-------------------------------+
|  192  |  168  |   11  |  100  | (dest)
+-------------------------------+
ip_input: p->len 84 p->tot_len 84
pbuf_header: old 0x400030be new 0x400030d2 (-20)
icmp_input: ping
pbuf_header: old 0x400030d2 new 0x400030b0 (34)
pbuf_header: old 0x400030b0 new 0x400030d2 (-34)
pbuf_header: old 0x400030d2 new 0x400030be (20)
ip_output_if: en0
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        84     | (v, hl, tos, len)
+-------------------------------+
|    32101      |000|       0   | (id, flags, offset)
+-------------------------------+
|  255  |    1  |    0xa689     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   11  |  100  | (src)
+-------------------------------+
|  192  |  168  |   11  |    5  | (dest)
+-------------------------------+
netif->output()pbuf_header: old 0x400030be new 0x400030b0 (14)
etharp_send_ip: sending packet 0x400030a0
pbuf_free(0x400030a0)
pbuf_free: deallocating 0x400030a0

LPC2388でFreeRTOS+uIP

ネットでLPC2388を検索するとFreeRTOS+uIPで動かしてる人が多いようです。
FreeRTOS V5.4.2のARM7_LPC2368_Eclipseから修正してみます。
同じ環境でlwIP V1.3.2にして動きました。元はFreeRTOS V5.0.2+IwIP V1.3.0でした。
OS無しでuIPが動きましたし、FreeRTOS+lwIPも動きましたから簡単だろうと思いましたがこれが動かないです。
PHY分部を修正して、HUBのLinkLEDは点灯するようになりました。

pingをかけても応答がありません。仕方がないのでデバッグ用のコードを追加します。
無限ループで受信データ数をチェックして0でなければ処理するコードになっています。

OSなしは、main.c	
  while (1) {
    uip_len = tapdev_read(uip_buf);
    if (uip_len > 0) {
      if (BUF->type == htons(UIP_ETHTYPE_IP)) {
        printf("UIP_ETHTYPE_IP:%d\n",uip_len);

FreeRTOSは、uIP_Task.c
void vuIP_Task( void *pvParameters )
  for( ;; ){
    uip_len = uiGetEMACRxData( uip_buf );
    if (uip_len > 0) {
      if (xHeader->type == htons(UIP_ETHTYPE_IP)) {
        printf("UIP_ETHTYPE_IP:%d\n", uip_len);

で動かしてみます。
OSなし
uart0 init
tapdev_init
100 BASE TX Full-duplex
UIP_ETHTYPE_ARP:64
UIP_ETHTYPE_IP:102
uip_process:1
uip_ipchksum: sum 0xffff これはuip.cのDEBUG_PRINTFの出力です。
Sending packet with length 84 (84)
UIP_ETHTYPE_IP:102
uip_process:1
uip_ipchksum: sum 0xffff
Sending packet with length 84 (84)

FreeRTOS
LPC2388 uIP
PHY_ADDR=6
Configure Full/Half Duplex mode=6
LCD:[1]PASS
UIP_ETHTYPE_ARP:60
UIP_ETHTYPE_IP:98
uip_process:1
UIP_ETHTYPE_ARP:60
UIP_ETHTYPE_IP:98

FreeRTOS版でも受信できているようです。しかし受信数が違います。
ソースを確認すると
OSなし
emac.c
UNS_32 tapdev_read(void *pPacket)
  in_size = (RX_STAT_INFO(RxConsumeIndex) & 0x7ff) + 1;

FreeRTOS
emac.c
unsigned short StartReadFrame(void)
  RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) – 3;
+1して-3で4バイト差が発生しているのはこの部分のようです。

続きは明日以降に追記します。
arpに対して応答を返していないことが問題なので調べてみます。
uip_arp.c
void uip_arp_arpin(void)
printf(“%x,%x:”,((u16_t *)BUF->dipaddr)[0],((u16_t *)BUF->dipaddr)[1]);
printf(“%x,%x:\\n”,((u16_t *)uip_hostaddr)[0],((u16_t *)uip_hostaddr)[1]);
動かしてみるとバイトオーダが逆になっています。
uIP_Task.cのIPアドレスの指定部分で逆にしてみます。
if 0
#define uipIP_ADDR0 192
#define uipIP_ADDR1 168
#define uipIP_ADDR2 11
#define uipIP_ADDR3 100
#else
#define uipIP_ADDR1 192
#define uipIP_ADDR0 168
#define uipIP_ADDR3 11
#define uipIP_ADDR2 100
#endif
これで無事動きました。結局uip_conf.hの
#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN

#define UIP_CONF_BYTE_ORDER UIP_LITTLE_ENDIAN
にすることでOKになりました。

LPC2388でlwIP+FreeRTOS

uIPは、AN10799でOS無しで動かしてみました。
雑誌に載っていたuC3/uNet3もMDK-ARMとgccで動きました。

次はlwIPということで、探してみるとRealView(MDK-ARM)でFreeRTOS+lwIPのファイルが見つかりました。
MDK-ARMでビルドすると
.\FreeRTOS.axf: error: L6050U: The code size of this image (61192 bytes)
exceeds the maximum allowed for this version of the linker.
でビルド出来ません。

しかたがないのでgcc(LPCXpresso_8.2.2_650)で試します。
link errorが出るので
Demo/ARM7_LPC2378_RealView/arch/LPC2xxx/configs/FreeRTOSConfig.h:
#define configUSE_TRACE_FACILITY 0
にしました。

emac.cはID変更のみでステータスは0x1fを読んでいるのでそのままでOKでした。

OSが起動しないので悩みましたがスタートアップルーチンでユーザモードにしていたのが原因で
mainを実行するときにSVCにしたら動きました。
// Start in supervisor mode 追加
MSR CPSR_c, #MODE_SVC|I_BIT|F_BIT

後は、MDK-ARMのスタートアップルーチンで初期化しているクロックなどを
Demo/ARM7_LPC2378_RealView/apps/main.c
static void prvSetupHardware( void )
にDemo/ARM7_LPC2378_RealView/arch/LPC2xxx/hardware/LPC2300.sのクロック設定を追加しました。

他はネットワークアドレスを
Demo/ARM7_LPC2378_RealView/apps/WebServer/webserver.c
/* Create and configure the EMAC interface. */
IP4_ADDR(&xIpAddr,192,168,11,100);
IP4_ADDR(&xNetMast,0xFF,0xFF,0xFF,0x00);
IP4_ADDR(&xGateway,192,168,11,1);
で設定しました。

uIPより高機能のようなので表示されるwebページを楽しみにしていましたが単純な表示でした。

追記
#define configUSE_TRACE_FACILITY 1
にしてMakefileを以下にしてビルドできました。

LIB = -lcr_eabihelpers \
	-lgcc -lc_nano -lcr_newlib_nohost \
	-lcr_eabihelpers
LIBPATH = -LC:/nxp/LPCXpresso_8.2.2_650/lpcxpresso/tools/arm-none-eabi/lib \
	-LC:/nxp/LPCXpresso_8.2.2_650/lpcxpresso/tools/lib/gcc/arm-none-eabi/5.4.1 
LIBS	= $(LIBPATH) $(LIB)

LPCXpressoのライブラリはどれを使えばいいか良く解らなかったので名前から適当に指定しています。
Newlib(nohost) make ok 実行中に止まる
NewlibNano(nohost) make ok
Redlib(nohost) make ng `__sys_flen’が無くてエラー。syscallsの追加が必要なようです。
printfは、Retarget.c(lpcware.comのlwip_lpc-v1.10.zipのもの)でuart1に出しています。

追記2
REALVIEW_ARM7で動かしましたがFreeRTOSのバージョンを上げるごと修正が必要になるので
ROWLEY_LPC23xxに変更して、FreeRTOS 9.0.0でも動きました。
lwIPは、1.3.2まではOKで、1.4.0では修正が必要なようで動いていません。

追記3
asm.sは、共通分をマクロ定義しました。

///////////////////////////////////////////////////////////
//	マクロ定義
///////////////////////////////////////////////////////////
    	 .extern 	pxCurrentTCB
    	 .extern 	ulCriticalNesting

//*************************portRESTORE_CONTEXT**********************************
	.macro	portRESTORE_CONTEXT
// Set the LR to the task stack.  The location was ...
	LDR	R1, =pxCurrentTCB

// ... stored in pxCurrentTCB.	
	LDR	R0, [R1]
	LDR	LR, [R0]

// The critical nesting depth is the first item on ...
	LDR	R0, =ulCriticalNesting

// ... the stack.  Load it into the ulCriticalNesting var.
	LDMFD	LR!, {R1 }
	STR	R1, [R0]

// Get the SPSR from the stack. */
	LDMFD	LR!, {R0}
	MSR	SPSR_cxsf, R0

// Restore all system mode registers for the task.
	LDMFD	LR, {R0-R14}^	
	NOP

// Restore the return address. */
	LDR	LR, [LR, #+60]

// And return - correcting the offset in the LR to obtain ... */
// ... the correct address. */
	SUBS	PC, LR, #4
	.endm

//****************************portSAVE_CONTEXT*****************
	.macro	portSAVE_CONTEXT
// Store R0 first as we need to use it.
	 STMDB 	SP!, {R0}

// Set R0 to point to the task stack pointer.
	 STMDB	SP,{SP}^
	 NOP
	 SUB	SP, SP, #4
	 LDMIA	SP!,{R0}

// Push the return address onto the stack.
	 STMDB	R0!, {LR}

// Now we have saved LR we can use it instead of R0.
	 MOV	LR, R0

// Pop R0 so we can save it onto the system mode stack.
	 LDMIA	SP!, {R0}

// Push all the system mode registers onto the task stack.
	 STMDB	LR,{R0-LR}^
	 NOP
	 SUB	LR, LR, #60

// Push the SPSR onto the task stack.
	MRS	R0, SPSR
   	STMDB	LR!, {R0}
	 	
	LDR	R0, =ulCriticalNesting
	LDR	R0, [R0]	
	STMDB	LR!, {R0}

// Store the new top of stack for the task.
	LDR	R0, =pxCurrentTCB
	LDR	R1, [R0]
	STR	LR, [R1]
	.endm
/* *********************************************************/
//	FreeRTOS_v502\Source\portable\RealView\ARM7\asm.s
/* ******************************************************* */

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// Starting the first task is just a matter of restoring the context that
// was created by pxPortInitialiseStack().
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	.global	vPortStartFirstTask

	.balign 8
vPortStartFirstTask:
	portRESTORE_CONTEXT

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// Manual context switch function.  This is the SWI hander.
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	.extern vTaskSwitchContext

	.balign 8
vPortYieldProcessor:
	 ADD	LR, LR, #4	// Add 4 to the LR to make the LR appear exactly
				// as if the context was saved during and IRQ
				// handler.
	portSAVE_CONTEXT

// before selecting the next task to execute.
	LDR R0, =vTaskSwitchContext
	MOV     lr, pc
	BX      R0

	portRESTORE_CONTEXT

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
// Preemptive context switch function.  This will only ever get installed if
// portUSE_PREEMPTION is set to 1 in portmacro.h.
//
//Source/portable/RealView/ARM7/port.c:
//            install_irq(TIMER0_INT, (void*)vPortPreemptiveTickEntry, 1 );
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	.global	vPortPreemptiveTickEntry
	.extern vPortPreemptiveTick

	.balign 8
vPortPreemptiveTickEntry:
	portSAVE_CONTEXT

	 LDR R0, =vPortPreemptiveTick	// before selecting the next task to execute.
	 MOV     LR, PC
	 BX 	 R0

	portRESTORE_CONTEXT

///////////////////////////////////////////////////////////////////////
//	Demo/ARM7_LPC2378_RealView/arch/LPC2xxx/hardware/emac.c:
//		install_irq( EMAC_INT, (void *)vEMACISR_Wrapper, 2 );
///////////////////////////////////////////////////////////////////////
	.global	vEMACISR_Wrapper
	.extern vEMACISR_Handler

	.balign	8
vEMACISR_Wrapper:
	portSAVE_CONTEXT

	 LDR R0, =vEMACISR_Handler	// before selecting the next task to execute.
	 MOV     LR, PC
	 BX 	 R0

	portRESTORE_CONTEXT

///////////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////////
	.global		disable_IRQ
	.balign 8
disable_IRQ:
  	STMDB	SP!, {R0}	;	/* Push R0.			*/
  	MRS	R0, CPSR	;	/* Get CPSR.			*/
  	ORR	R0, R0, #0xC0	;	/* Disable IRQ, FIQ.		*/
  	MSR	CPSR_cxsf, R0	;	/* Write back modified value.	*/
  	LDMIA	SP!, {R0}	;	/* Pop R0.			*/
  	BX LR

	.global		enable_IRQ
	.balign 8
enable_IRQ:
  	STMDB	SP!, {R0}	;	/* Push R0.			*/
  	MRS	R0, CPSR	;	/* Get CPSR.			*/
  	BIC	R0, R0, #0xC0	;	/* Enable IRQ, FIQ.		*/
  	MSR	CPSR_cxsf, R0	;	/* Write back modified value.	*/
  	LDMIA	SP!, {R0}	;	/* Pop R0. */
  	BX LR

///////////////////////////////////////////////////////////////////////

MDK-ARMでLPC2388 RTOSを試す

IF誌2009.06の6章のRTOSを動かしてみます。
RTOS自体はライブラリで提供されているのでlinkerオプションに追加すると
error: L3921U: Option ‘–library’ not available with your license.
で駄目ですがプロジェクトにライブラリをを登録してファイルオプションでライブラリにすると使えます。
ライブラリで追加しようとすると拡張子がlibでないので表示されないので
すべてのファイルにして追加後にタイプをライブラリにします。

config toolで生成されるファイルの修正をします。

IAR				MDK-ARM	
prstlpc2.s79(スタートアップ)	LPC2300.s(keil1の標準)
excplpc2.s79(例外)		excplpc2.s(割り込みのみ)
vectlpc2.s79(ベクタ)		vectlpc2.s		

アセンブラはラベルの後ろにコロンが付くとか付かないとかや疑似命令の違いを修正します。
LPC2388_flash.icfのスタックサイズは、LPC2300.sを開くと設定ツールが使えるので合わせます。
buildすると
.\sample.axf: Error: L6238E: uC3dsp.o(.text) contains invalid call from
‘~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)’
function to ‘REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)’
function _kernel_gettskid.
になるので
linker misc command: –diag_suppress 6238
を追加するとbuildできました。実機に書き込むと動きません。
シミュレータで動かすと問題なくuartのメッセージもエコーバックも動きます。
ロジアナでport1をみるとパルス幅が変化しているが確認できました。
例外発生時に7segLEDにコードを表示させるように追加したところプリフェッチアボートが発生していました。
gccでコンパイルして、CSTACKが確保されていないことが分かったので追加します。
LPC2300.Sに追加

;--------------	uC3 add --------------------------
CSTACK_Size	EQU	0x00000400
CSTACK 		SPACE	CSTACK_Size

CSTACK__Limit
;CSTACK$$Limit
		export	CSTACK
		export	CSTACK__Limit
;		export	CSTACK$$Limit
;--------------	uC3 add	end ----------------------

CSTACK$$Limitのラベル名がエラーになるのでCSTACK__Limitにしています。
armar -x uC3thm4tl.a
バイナリエディタでuC3dsp.oのCSTACK$$LimitをCSTACK__Limitに書き換えます。
armar -r uC3thm4tl.lib *.o
でラベルを合わせたライブラリを作ります。
これで無事実機で動作しました。
強引な方法でScatter-Loading Description FileにCSTACKを書き加えた方が良いと思います。
gccではリンクスクリプトに

	/* uC3 add */
	. = ALIGN(0x8);
	CSTACK = .;
	. += 0x400;
	CSTACK$$Limit = .;
	/* uC3 add end */

を追加で動いていますし、IARは生成されたicfに

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
place in RAM_region   { readwrite,
                        block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK,
                        block UND_STACK, block ABT_STACK, block HEAP };

になっています。

ネットワークは__iar_Stoulが未定義になるので作成してwebサーバが動作しました。

MDK-ARMでLPC2388

今度はインターフェイス付録のLPC2388です。
NXPから提供されているサンプルはMDK-ARMの旧バージョンのものが多いので更新します。
更新するとデバイスが選べなくなるので.uvprojファイルを開くて
NXP (founded by Philips)
から
NXP
に変更することで、Deviceで選択できるようになります。

NXPのサンプル LPC23xx_24xxSampleSoftware.r6 のUSBデバイスはポート1になっているのと
D+のプルアップの制御のポートが違うので以下の変更がひつようでした。

usbhw.c
void USB_Init(void)
{
    変数宣言
#if 1				// CQ-FRK-NXPARM
    PINSEL0 &= ~0x3C000000;	/* P0.13 GoodLink, P0.14 SoftConnect */
    PINSEL0 |= 0x24000000;	/* PINSEL0 26.27, 28.29              */       
    PINSEL1 &= ~0xC0000000;	/* P0.30 D+, dedicated pin D-        */
    PINSEL1 |= 0x40000000;	/* PINSEL1 30.31                     */
    FIO0DIR |= (1 << 14);	/* Set pin to output */
    FIO0CLR = (1 << 14);	/* Set output low to connect */

    PCONP |= 0x80000000;	/* USB PCLK -> enable USB Per.  */

    USBClkCtrl = (1 << 1) | (1 << 3) | (1 << 4);	/* Enable the clocks */
    while (!(USBClkSt & ((1 << 1) | (1 << 3) | (1 << 4))));
    USBPortSel = 0x3;		/* Set LPC to use USB Port B pins */

    USBClkCtrl |= 0x08;		/* Set PORTSEL_CLK_EN   */
    while ((OTG_CLK_STAT & 0x08) != 0x08);

    OTG_STAT_CTRL = 2;		//PORTSEL;

    USBClkCtrl &= ~0x08;	/* Reset PORTSEL_CLK_EN  */
    while ((OTG_CLK_STAT & 0x08) != 0x00);
#else
元の処理
#endif
    install_irq(USB_INT, (void *) USB_ISR, HIGHEST_PRIORITY);

この修正でPCに接続してデバイスとして無事認識されました。

./keil/NXP/LPC23xx_24xxSampleSoftware.r6/USBAudio/Obj/usbaudio.hex
idVendor:           0x0471 (Philips)
idProduct:          0x114A
./keil/NXP/LPC23xx_24xxSampleSoftware.r6/USBDev/Obj/usbdev.hex
idVendor:           0x0471 (Philips)
idProduct:          0x114A
./keil/NXP/LPC23xx_24xxSampleSoftware.r6/USBMem/Obj/Memory.hex
idVendor:           0xC251
idProduct:          0x1703
./keil/NXP/LPC23xx_24xxSampleSoftware.r6/USBCDC/Obj/VirtualCOM.hex
idVendor:           0xC251
idProduct:          0x1705
./keil/NXP/LPC23xx_24xxSampleSoftware.r6/USBUVC/Obj/usbuvc.hex
idVendor:           0xC251
idProduct:          0x1706

USBホストは、IF誌2009.06のUSBhostのプログラムのポート選択部分に置き換えて動作しました。
LANはPHYチップが違うのでIDを変更しましたがそれだけでは駄目でPHYチップ依存部分を作成しないとダメなようです、

追記 動くようになりました。
PHY Status Register (PHYSTS), Address 0x10がなくて
16:Silicon Revision Registerになっているので、PHYSTSを判定している分部をかきかえました。
PHY_SCS(0x1f)のbit[4:2」で判定できるようです。

ネットワークアドレス指定は以下でしています。

lpc23xx_port/emac.h
//#define DP83848C_DEF_ADR    0x0100      /* Default PHY device address */
#define DP83848C_DEF_ADR    0x0600      /* LAN8187 PHY device address */
#define EMAC_ADDR0          0x10
#define EMAC_ADDR1          0x1F
#define EMAC_ADDR2          0xE0
#define EMAC_ADDR3          0x12
#define EMAC_ADDR4          0x1D
#define EMAC_ADDR5          0x0C

    uip_ipaddr(ipaddr, 192, 168, 11, 100);
    uip_sethostaddr(ipaddr);
uIPスクリーンキャプチャ

uIPスクリーンキャプチャ