Moved remotely
git-svn-id: file:///srv/dev-disk-by-uuid-17e88007-4d0c-45e0-8757-cacfcc458630/repositories/svn/Diplomarbeit@113 9fe90eed-be63-e94b-8204-d34ff4c2ff93
This commit is contained in:
@@ -0,0 +1,349 @@
|
||||
/*************************************************************************
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user