/************************************************************************* * * Used with ICCARM and AARM. * * (c) Copyright IAR Systems 2007 * * File name : main.c * Description : Main module * * History : * 1. Date : February 3, 2007 * Author : Stanimir Bonev * Description : Create * * This example project shows how to use the IAR Embedded Workbench for ARM * to develop code for the IAR LPC-2378-SK board. * It implements WEB server. * The default IP address is: * 192.168.0.100 * The physical MAC address is (defined in uipopt.h): * 00-ff-ff-ff-ff-ff * * Jumpers: * PWR_SEL - depending of power source * RST_E - unfilled * ISP_E - unfilled * * Note: * After power-up the controller get clock from internal RC oscillator that * is unstable and may fail with J-Link auto detect, therefore adaptive clocking * should always be used. The adaptive clock can be select from menu: * Project->Options..., section Debugger->J-Link/J-Trace JTAG Speed - Adaptive. * ************************************************************************** * Copyright (c) 2001-2003, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * This file is part of the uIP TCP/IP stack. * ************************************************************************** * * $Revision: 1.0 $ * **************************************************************************/ #include "LPC23xx.h" #include "types.h" #include "includes.h" #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) /************************************************************************* * Function Name: VIC_SetVectoredIRQ * Parameters: void(*pIRQSub)() * unsigned int VicIrqSlot * unsigned int VicIntSouce * * Return: void * * Description: Init vectored interrupts * *************************************************************************/ void VIC_SetVectoredIRQ(void(*pIRQSub)(), unsigned int Priority, unsigned int VicIntSource) { unsigned long volatile *pReg; // load base address of vectored address registers pReg = &VICVectAddr0; // Set Address of callback function to corresponding Slot *(pReg+VicIntSource) = (unsigned long)pIRQSub; // load base address of ctrl registers pReg = &VICVectCntl0; // Set source channel and enable the slot *(pReg+VicIntSource) = Priority; // Clear FIQ select bit VICIntSelect &= ~(1 << VicIntSource); } /************************************************************************* * Function Name: GpioInit * Parameters: void * Return: void * * Description: Reset all GPIO pins to default: primary function * *************************************************************************/ void GpioInit(void) { // Set to inputs IODIR0 = \ IODIR1 = \ FIO0DIR = \ FIO1DIR = \ FIO2DIR = \ FIO3DIR = \ FIO4DIR = 0; // Enable Fast GPIO0,1 // SCS_bit.GPIOM = 1; SCS |= (1 << 0); // clear mask registers FIO0MASK =\ FIO1MASK =\ FIO2MASK =\ FIO3MASK =\ FIO4MASK = 0; // Reset all GPIO pins to default primary function PINSEL0 =\ PINSEL1 =\ PINSEL2 =\ PINSEL3 =\ PINSEL4 =\ PINSEL5 =\ PINSEL6 =\ PINSEL7 =\ PINSEL8 =\ PINSEL9 =\ PINSEL10= 0; } /************************************************************************* * Function Name: SYS_GetFsclk * Parameters: none * Return: Int32U * * Description: return Sclk [Hz] * *************************************************************************/ Int32U SYS_GetFsclk(void) { Int32U Mul = 1, Div = 1, Osc, Fsclk; // if(PLLSTAT_bit.PLLC) if (PLLSTAT & (1 << 25)) // \TODO is this working?? { // when PLL is connected // Mul = PLLSTAT_bit.MSEL + 1; Mul = (PLLSTAT & 0x00007FFF) + 1; // \TODO is this working?? // Div = PLLSTAT_bit.NSEL + 1; Div = (PLLSTAT & 0x00FF0000) + 1; // \TODO is this working?? } // Find clk source // switch(CLKSRCSEL_bit.CLKSRC) switch (CLKSRCSEL | 0x00000003) // \TODO is this working?? { case 0: Osc = I_RC_OSC_FREQ; break; case 1: Osc = MAIN_OSC_FREQ; break; case 2: Osc = RTC_OSC_FREQ; break; default: Osc = 0; } // Calculate system frequency Fsclk = Osc*Mul*2; Fsclk /= Div*(CCLKCFG+1); return(Fsclk); } /************************************************************************* * Function Name: SYS_GetFpclk * Parameters: Int32U Periphery * Return: Int32U * * Description: return Pclk [Hz] * *************************************************************************/ Int32U SYS_GetFpclk(Int32U Periphery) { Int32U Fpclk; pInt32U pReg = (pInt32U)((Periphery < 32)?&PCLKSEL0:&PCLKSEL1); Periphery &= 0x1F; // %32 Fpclk = SYS_GetFsclk(); // find peripheral appropriate periphery divider switch((*pReg >> Periphery) & 3) { case 0: Fpclk /= 4; break; case 1: break; case 2: Fpclk /= 2; break; default: Fpclk /= 8; } return(Fpclk); } /************************************************************************* * Function Name: Dly100us * Parameters: void *arg * Return: void * * Description: Delay [100us] * *************************************************************************/ //void Dly100us(void *arg) //{ //volatile Int32U Dly = (Int32U)arg, Dly100; // for(;Dly;Dly--) // for(Dly100 = 350; Dly100; Dly100--); //} /************************************************************************* * Function Name: main * Parameters: none * * Return: none * * Description: main * *************************************************************************/ void ethInit(void) { unsigned int i; uip_ipaddr_t ipaddr; struct timer periodic_timer, arp_timer; // Init GPIO GpioInit(); timer_set(&periodic_timer, CLOCK_SECOND / 2); timer_set(&arp_timer, CLOCK_SECOND * 10); // Initialize the ethernet device driver while(!tapdev_init()); ENABLE_INTERRUPTS(); // uIP web server // Initialize the uIP TCP/IP stack. uip_init(); uip_ipaddr(ipaddr, 192,168,1,82); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr, 192,168,1,2); uip_setdraddr(ipaddr); uip_ipaddr(ipaddr, 255,255,255,0); uip_setnetmask(ipaddr); // Initialize the HTTP server. httpd_init(); while(1) { uip_len = tapdev_read(uip_buf); if(uip_len > 0) { if(BUF->type == htons(UIP_ETHTYPE_IP)) { uip_arp_ipin(); uip_input(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(uip_buf,uip_len); } } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { tapdev_send(uip_buf,uip_len); } } } else if(timer_expired(&periodic_timer)) { timer_reset(&periodic_timer); for(i = 0; i < UIP_CONNS; i++) { uip_periodic(i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(uip_buf,uip_len); } } #if UIP_UDP for(i = 0; i < UIP_UDP_CONNS; i++) { uip_udp_periodic(i); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if(uip_len > 0) { uip_arp_out(); tapdev_send(); } } #endif /* UIP_UDP */ /* Call the ARP timer function every 10 seconds. */ if(timer_expired(&arp_timer)) { timer_reset(&arp_timer); uip_arp_timer(); } } } }