6cc948eef8
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@113 9fe90eed-be63-e94b-8204-d34ff4c2ff93
350 lines
9.8 KiB
C
350 lines
9.8 KiB
C
/*************************************************************************
|
|
*
|
|
* 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();
|
|
}
|
|
}
|
|
}
|
|
}
|