New Demo files for Tern E-Engine controller port.
parent
215d93aa3d
commit
5411f64bff
Binary file not shown.
@ -0,0 +1,77 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_IDLE_HOOK 1
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 80000000 )
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 256 ) /* This can be made smaller if required. */
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 1
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
@ -0,0 +1,289 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Very simple task that responds with a single WEB page to http requests.
|
||||
*
|
||||
* The WEB page displays task and system status. A semaphore is used to
|
||||
* wake the task when there is processing to perform as determined by the
|
||||
* interrupts generated by the Ethernet interface.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* Tern includes. */
|
||||
#include "utils\system_common.h"
|
||||
#include "i2chip_hw.h"
|
||||
#include "socket.h"
|
||||
|
||||
/* FreeRTOS.org includes. */
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
#include <semphr.h>
|
||||
|
||||
/* The standard http port on which we are going to listen. */
|
||||
#define httpPORT 80
|
||||
|
||||
#define httpTX_WAIT 2
|
||||
|
||||
/* Network address configuration. */
|
||||
const unsigned portCHAR ucMacAddress[] = { 12, 128, 12, 34, 56, 78 };
|
||||
const unsigned portCHAR ucGatewayAddress[] = { 192, 168, 2, 1 };
|
||||
const unsigned portCHAR ucIPAddress[] = { 172, 25, 218, 210 };
|
||||
const unsigned portCHAR ucSubnetMask[] = { 255, 255, 255, 0 };
|
||||
|
||||
/* The number of sockets this task is going to handle. */
|
||||
#define httpSOCKET_NUM 3
|
||||
unsigned portCHAR ucConnection[ httpSOCKET_NUM ];
|
||||
|
||||
/* The maximum data buffer size we can handle. */
|
||||
#define httpSOCKET_BUFFER_SIZE 2048
|
||||
|
||||
/* Standard HTTP response. */
|
||||
#define httpOUTPUT_OK "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
|
||||
|
||||
/* Hard coded HTML components. Other data is generated dynamically. */
|
||||
#define HTML_OUTPUT_BEGIN "\
|
||||
<HTML><head><meta http-equiv=\"Refresh\" content=\"1\;url=index.htm\"></head>\
|
||||
<BODY bgcolor=\"#CCCCFF\"><font face=\"arial\"><H2>FreeRTOS.org<sup>tm</sup> + Tern E-Engine<sup>tm</sup></H2>\
|
||||
<a href=\"http:\/\/www.FreeRTOS.org\">FreeRTOS.org Homepage</a><P>\
|
||||
<HR>Task status table:\r\n\
|
||||
<p><font face=\"courier\"><pre>Task State Priority Stack #<br>\
|
||||
************************************************<br>"
|
||||
|
||||
#define HTML_OUTPUT_END "\
|
||||
</font></BODY></HTML>"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Initialise the data structures used to hold the socket status.
|
||||
*/
|
||||
static void prvHTTPInit( void );
|
||||
|
||||
/*
|
||||
* Setup the Ethernet interface with the network addressing information.
|
||||
*/
|
||||
static void prvNetifInit( void );
|
||||
|
||||
/*
|
||||
* Generate the dynamic components of the served WEB page and transmit the
|
||||
* entire page through the socket.
|
||||
*/
|
||||
static void prvTransmitHTTP( unsigned portCHAR socket );
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* This variable is simply incremented by the idle task hook so the number of
|
||||
iterations the idle task has performed can be displayed as part of the served
|
||||
page. */
|
||||
unsigned portLONG ulIdleLoops = 0UL;
|
||||
|
||||
/* Data buffer shared by sockets. */
|
||||
unsigned portCHAR ucSocketBuffer[ httpSOCKET_BUFFER_SIZE ];
|
||||
|
||||
/* The semaphore used by the Ethernet ISR to signal that the task should wake
|
||||
and process whatever caused the interrupt. */
|
||||
xSemaphoreHandle xTCPSemaphore = NULL;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
void vHTTPTask( void * pvParameters )
|
||||
{
|
||||
portSHORT i, sLen;
|
||||
unsigned portCHAR ucState;
|
||||
|
||||
( void ) pvParameters;
|
||||
|
||||
/* Create the semaphore used to communicate between this task and the
|
||||
WIZnet ISR. */
|
||||
vSemaphoreCreateBinary( xTCPSemaphore );
|
||||
|
||||
/* Make sure everything is setup before we start. */
|
||||
prvNetifInit();
|
||||
prvHTTPInit();
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Wait until the ISR tells us there is something to do. */
|
||||
xSemaphoreTake( xTCPSemaphore, portMAX_DELAY );
|
||||
|
||||
/* Check each socket. */
|
||||
for( i = 0; i < httpSOCKET_NUM; i++ )
|
||||
{
|
||||
ucState = select( i, SEL_CONTROL );
|
||||
|
||||
switch (ucState)
|
||||
{
|
||||
case SOCK_ESTABLISHED : /* new connection established. */
|
||||
|
||||
if( ( sLen = select( i, SEL_RECV ) ) > 0 )
|
||||
{
|
||||
if( sLen > httpSOCKET_BUFFER_SIZE )
|
||||
{
|
||||
sLen = httpSOCKET_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
disable();
|
||||
|
||||
sLen = recv( i, ucSocketBuffer, sLen );
|
||||
|
||||
if( ucConnection[ i ] == 1 )
|
||||
{
|
||||
/* This is our first time processing a HTTP
|
||||
request on this connection. */
|
||||
prvTransmitHTTP( i );
|
||||
ucConnection[i] = 0;
|
||||
}
|
||||
enable();
|
||||
}
|
||||
break;
|
||||
|
||||
case SOCK_CLOSE_WAIT :
|
||||
|
||||
close(i);
|
||||
break;
|
||||
|
||||
case SOCK_CLOSED :
|
||||
|
||||
ucConnection[i] = 1;
|
||||
socket( i, SOCK_STREAM, 80, 0x00 );
|
||||
NBlisten( i ); /* reinitialize socket. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvHTTPInit( void )
|
||||
{
|
||||
unsigned portCHAR ucIndex;
|
||||
|
||||
/* There are 4 total sockets available; we will claim 3 for HTTP. */
|
||||
for(ucIndex = 0; ucIndex < httpSOCKET_NUM; ucIndex++)
|
||||
{
|
||||
socket( ucIndex, SOCK_STREAM, httpPORT, 0x00 );
|
||||
NBlisten( ucIndex );
|
||||
ucConnection[ ucIndex ] = 1;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvNetifInit( void )
|
||||
{
|
||||
i2chip_init();
|
||||
initW3100A();
|
||||
|
||||
setMACAddr( ( unsigned portCHAR * ) ucMacAddress );
|
||||
setgateway( ( unsigned portCHAR * ) ucGatewayAddress );
|
||||
setsubmask( ( unsigned portCHAR * ) ucSubnetMask );
|
||||
setIP( ( unsigned portCHAR * ) ucIPAddress );
|
||||
|
||||
/* See definition of 'sysinit' in socket.c
|
||||
- 8 KB transmit buffer, and 8 KB receive buffer available. These buffers
|
||||
are shared by all 4 channels.
|
||||
- (0x55, 0x55) configures the send and receive buffers at
|
||||
httpSOCKET_BUFFER_SIZE bytes for each of the 4 channels. */
|
||||
sysinit( 0x55, 0x55 );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvTransmitHTTP(unsigned portCHAR socket)
|
||||
{
|
||||
extern portSHORT usCheckStatus;
|
||||
|
||||
/* Send the http and html headers. */
|
||||
send( socket, ( unsigned portCHAR * ) httpOUTPUT_OK, strlen( httpOUTPUT_OK ) );
|
||||
send( socket, ( unsigned portCHAR * ) HTML_OUTPUT_BEGIN, strlen( HTML_OUTPUT_BEGIN ) );
|
||||
|
||||
/* Generate then send the table showing the status of each task. */
|
||||
vTaskList( ucSocketBuffer );
|
||||
send( socket, ( unsigned portCHAR * ) ucSocketBuffer, strlen( ucSocketBuffer ) );
|
||||
|
||||
/* Send the number of times the idle task has looped. */
|
||||
sprintf( ucSocketBuffer, "</pre></font><p><br>The idle task has looped 0x%08lx times<br>", ulIdleLoops );
|
||||
send( socket, ( unsigned portCHAR * ) ucSocketBuffer, strlen( ucSocketBuffer ) );
|
||||
|
||||
/* Send the tick count. */
|
||||
sprintf( ucSocketBuffer, "The tick count is 0x%08lx<br>", xTaskGetTickCount() );
|
||||
send( socket, ( unsigned portCHAR * ) ucSocketBuffer, strlen( ucSocketBuffer ) );
|
||||
|
||||
/* Show a message indicating whether or not the check task has discovered
|
||||
an error in any of the standard demo tasks. */
|
||||
if( usCheckStatus == 0 )
|
||||
{
|
||||
sprintf( ucSocketBuffer, "No errors detected." );
|
||||
send( socket, ( unsigned portCHAR * ) ucSocketBuffer, strlen( ucSocketBuffer ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf( ucSocketBuffer, "<font color=\"red\">An error has been detected in at least one task %x.</font><p>", usCheckStatus );
|
||||
send( socket, ( unsigned portCHAR * ) ucSocketBuffer, strlen( ucSocketBuffer ) );
|
||||
}
|
||||
|
||||
/* Finish the page off. */
|
||||
send( socket, (unsigned portCHAR*)HTML_OUTPUT_END, strlen(HTML_OUTPUT_END));
|
||||
|
||||
/* Must make sure the data is gone before closing the socket. */
|
||||
while( !tx_empty( socket ) )
|
||||
{
|
||||
vTaskDelay( httpTX_WAIT );
|
||||
}
|
||||
close(socket);
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ulIdleLoops++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,39 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef HTTP_TASK_H
|
||||
#define HTTP_TASK_H
|
||||
|
||||
void vHTTPTask( void *pvParameters );
|
||||
|
||||
#endif
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,239 @@
|
||||
/*
|
||||
********************************************************************************
|
||||
* TERN, Inc.
|
||||
* (c) Copyright 2005, http://www.tern.com
|
||||
*
|
||||
* - Created to support i2chip module on a variety of TERN hardware platforms.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#include <embedded.h>
|
||||
#include "i2chip_hw.h"
|
||||
|
||||
#ifdef I2CHIP_MMC
|
||||
#include "mmc.h"
|
||||
#endif
|
||||
|
||||
void i2chip_init(void)
|
||||
{
|
||||
|
||||
#ifdef TERN_586
|
||||
/*
|
||||
poke(MMCR,_BOOTCSCTL_,peek(MMCR,_BOOTCSCTL_)&0xffc9); // ROM 1 wait
|
||||
poke(MMCR,_ROMCS2CTL_,peek(MMCR,_ROMCS2CTL_)&0xffc8); // SRAM 0 wait
|
||||
|
||||
pokeb(MMCR, _GPCSRT_, 24); // set the GP CS recovery time, 12 works
|
||||
pokeb(MMCR, _GPCSPW_, 128); // set the GP CS width, 64 works
|
||||
pokeb(MMCR, _GPCSOFF_, 16); // set the GP CS offset, 8 works
|
||||
pokeb(MMCR, _GPRDW_, 80); // set the GP RD pulse width, 50 works
|
||||
pokeb(MMCR, _GPRDOFF_, 30); // set the GP RD offset, 15 works
|
||||
pokeb(MMCR, _GPWRW_, 80); // set the GP WR pulse width, 50
|
||||
pokeb(MMCR, _GPWROFF_, 30); // set the GP WR offset, 15
|
||||
*/
|
||||
|
||||
#ifdef TERN_5E
|
||||
pokeb(MMCR, _GPCSDW_, peekb(MMCR, _GPCSDW_)&0xf7); // set /CS3-/CSM Data Width=8
|
||||
pokeb(MMCR, _CSPFS_, peekb(MMCR, _CSPFS_)|0x08); // set the GP CS3 PIN Function
|
||||
poke(MMCR, _PAR15_, 0x2000); // set CS3 I/O region
|
||||
poke(MMCR, _PAR15_+2, 0x2dff); // set CS3 I/O region, 512 bytes
|
||||
|
||||
pokeb(MMCR, _GPCSDW_, peekb(MMCR, _GPCSDW_)&0x7f); // CS7=J4.3 Data Width=8, /CSI
|
||||
// pokeb(MMCR, _GPCSDW_, peekb(MMCR, _GPCSDW_)|0x80); // CS7=J4.3 Data Width=16
|
||||
pokeb(MMCR, _CSPFS_, peekb(MMCR, _CSPFS_)|0x80); // set the GP CS7 PIN Function
|
||||
poke(MMCR, _PAR7_, 0x4000); // set CS7 I/O region
|
||||
poke(MMCR, _PAR7_+2, 0x3dff); // set CS7 I/O region, 512 bytes
|
||||
#else
|
||||
// If it's not 5E, then it must be 5P... in which case, we use PCS0 and
|
||||
// PCS1 as the chip-selects.
|
||||
pokeb(MMCR, _GPCSDW_, peekb(MMCR, _GPCSDW_)&0xfe); // CS0 Data Width=8
|
||||
poke(MMCR, _PIOPFS31_16_, peek(MMCR,_PIOPFS31_16_)|0x0800); // P27=/CS0
|
||||
poke(MMCR, _PAR13_, 0x1800); // CS0 I/O region
|
||||
poke(MMCR, _PAR13_+2, 0x21ff); // CS0 I/O RW, 512 bytes, start 0x1800
|
||||
#endif
|
||||
|
||||
a HLPRsetvect(0x47, (void far *) spu_m_isr);
|
||||
HLPRsetvect(0x4f, (void far *) spu_1_isr);
|
||||
HLPRsetvect(0x57, (void far *) spu_2_isr);
|
||||
#endif // 186, or RE
|
||||
|
||||
#ifdef TERN_186
|
||||
pio_init(18, 0); // P18=CTS1 for /PCS2
|
||||
|
||||
#ifdef TERN_16_BIT
|
||||
outport(0xfff2, 2); // AUXCON, MCS, Bus 16-bit
|
||||
#endif
|
||||
|
||||
#ifdef I2CHIP_MCS_DIRECT
|
||||
outport(0xffa0,0xc0bf); // UMCS, 256K ROM, disable AD15-0
|
||||
outport(0xfff0,inport(0xfff0)|0x4000 ); // SYSCON, MCS0 0x80000-0xbffff
|
||||
outport(0xffa8,0xa0bf ); // MPCS, MCS0=P14, 64KB, PCS I/O,
|
||||
outport(0xffa6,0x81ff); // MMCS, base 0x80000,
|
||||
outport(0xffa2,0x7fbf); // 512K RAM,
|
||||
outport(0xffa4,0x007d); // PACS, base 0,
|
||||
|
||||
#else
|
||||
|
||||
outport( 0xffa0,0xc0bf); // UMCS, 256K ROM, 3 wait, disable AD15-0
|
||||
outport( 0xfff0,inport(0xfff0)|0x4000 ); // SYSCON, MCS0 0x80000-0xbffff
|
||||
// outport( 0xffa8,0xa0bc ); // MPCS, MCS0=P14, 64KB, PCS I/O 0 wait
|
||||
// outport( 0xffa8,0xa0bd ); // MPCS, MCS0=P14, 64KB, PCS I/O 1 wait
|
||||
outport( 0xffa8,0xa0bf ); // MPCS, MCS0=P14, 64KB, PCS I/O 1 wait
|
||||
#endif // I2CHIP_MCS_DIRECT
|
||||
|
||||
#ifndef TERN_RE // 80 MHz R- boards can't tolerate zero wait state.
|
||||
outport( 0xffa6,0x81ff ); // MMCS, base 0x80000
|
||||
outport(0xffa2,0x7fbe); // 512K RAM, 0 wait states
|
||||
outport(0xffa4,0x007d); // PACS, base 0, 0 wait
|
||||
#endif
|
||||
pio_init(14,0); // Enable /MCS0
|
||||
|
||||
#endif // TERN_186
|
||||
|
||||
|
||||
#ifdef I2CHIP_WINDOW
|
||||
#ifdef I2CHIP_SHIFTED_ADDRESS
|
||||
pio_init(12, 2); // Configure P12 as A7, an output we'll be using.
|
||||
pio_wr(12, 0); // Set A7 low, initially.
|
||||
#endif
|
||||
WINDOW_RESTORE_BASE; // Equivalent to calling mmc_window(7, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef I2CHIP_WINDOW
|
||||
|
||||
void i2chip_set_page(u_int page)
|
||||
{
|
||||
u_int new_page = page;
|
||||
|
||||
#ifdef I2CHIP_SHIFTED_ADDRESS
|
||||
if (page & 0x01) // ... we're checking the right-most bit in the page.
|
||||
outport(0xff74, inport(0xff74) | 0x1000 ); // Using P12 as A7...
|
||||
else
|
||||
outport(0xff74, inport(0xff74) & 0xefff );
|
||||
|
||||
new_page = page >> 1;
|
||||
#endif
|
||||
|
||||
#ifdef I2CHIP_MMC
|
||||
mmc_window(7, new_page); // See mmc.c
|
||||
#endif
|
||||
#ifdef I2CHIP_P51
|
||||
p51_window(new_page);
|
||||
#endif
|
||||
}
|
||||
|
||||
static u_int s_addr = 0xffff;
|
||||
u_char far* i2chip_mkptr(u_int addr)
|
||||
{
|
||||
if ((s_addr & 0xff00) == (addr & 0xff00)) // No point... no point...
|
||||
return MK_FP(WINDOW_BASE_SEGM, addr & 0xff);
|
||||
|
||||
s_addr = addr ;
|
||||
|
||||
// So the argument to this function is... what again?
|
||||
// I think it should be the highest 16-bits... or, in other words,
|
||||
// FP_SEG of a huge ptr.
|
||||
// Ok, and the *return* value should be a UINT value for the new
|
||||
// segment address to be used, if it's at all needed. TODO
|
||||
I2CHIP_SET_PAGE(s_addr >> 8); // Portable version
|
||||
// outportb(0x00, addr>>8); // quicker version
|
||||
|
||||
return MK_FP(WINDOW_BASE_SEGM, addr & 0xff);
|
||||
}
|
||||
|
||||
void i2chip_set_window(u_int window_addr)
|
||||
{
|
||||
s_addr = window_addr;
|
||||
I2CHIP_SET_PAGE(s_addr >> 8);
|
||||
}
|
||||
|
||||
// Still inside #define I2CHIP_WINDOW ...
|
||||
|
||||
u_int i2chip_get_window(void)
|
||||
{
|
||||
return s_addr & 0xff00;
|
||||
}
|
||||
|
||||
void i2chip_push_window(u_int addr)
|
||||
{
|
||||
I2CHIP_SET_PAGE(addr>>8);
|
||||
}
|
||||
|
||||
void i2chip_pop_window(void)
|
||||
{
|
||||
I2CHIP_SET_PAGE(s_addr >> 8);
|
||||
}
|
||||
|
||||
#ifdef I2CHIP_WINDOW_IO
|
||||
u_char io_read_value(u_char far* addr)
|
||||
{
|
||||
// return value ... we assume the page is already set. So, instead,
|
||||
// we just go ahead and output valeu.
|
||||
return inportb(I2CHIP_BASE_SEG + (FP_OFF(addr) & 0xff));
|
||||
}
|
||||
|
||||
void io_write_value(u_char far* addr, u_char value)
|
||||
{
|
||||
// Get the last whatever bytes... and write value.
|
||||
outportb(I2CHIP_BASE_SEG + (FP_OFF(addr) & 0xff), value);
|
||||
}
|
||||
|
||||
#endif // I2CHIP_WINDOW_IO
|
||||
|
||||
|
||||
#ifdef I2CHIP_P51
|
||||
void p51_window(unsigned int page)
|
||||
{
|
||||
asm xor ax, ax
|
||||
asm mov ax, page
|
||||
#ifdef I2CHIP_WINDOW_IO
|
||||
asm mov dx, 1040h
|
||||
asm out dx, al
|
||||
#else
|
||||
asm out 040h, al
|
||||
#endif
|
||||
// use J1.19=/CS6
|
||||
}
|
||||
#endif // I2CHIP_P51
|
||||
|
||||
#endif // I2CHIP_WINDOW
|
||||
|
||||
#ifdef TERN_586
|
||||
/*
|
||||
// Function: spu_m_isr
|
||||
// P22=Master PIC IR7, interrupt vector=0x47, /INTA
|
||||
*/
|
||||
void interrupt far spu_m_isr(void)
|
||||
{
|
||||
disable();
|
||||
// Issue the EOI to interrupt controller
|
||||
outportb(_MPICOCW2_IO,0x67); // Specific EQI for master IR7
|
||||
enable();
|
||||
}
|
||||
|
||||
/*
|
||||
// Function: spu_1_isr
|
||||
// P10=slave1 PIC IR7, Master IR2, interrupt vector=0x4f, /INTC
|
||||
*/
|
||||
void interrupt far spu_1_isr(void)
|
||||
{
|
||||
disable();
|
||||
// Issue the EOI to interrupt controller
|
||||
outportb(_S1PICOCW2_IO,0x67); // Specific EOI for slave 1 IR7
|
||||
outportb(_MPICOCW2_IO,0x62); // Specific EQI for master IR2
|
||||
enable();
|
||||
}
|
||||
|
||||
/*
|
||||
// Function: spu_2_isr
|
||||
// P20=Slave2 PIC IR7, Master IR5, interrupt vector=0x57, GPIRQ7=PIO16 GP timer1
|
||||
*/
|
||||
void interrupt far spu_2_isr(void)
|
||||
{
|
||||
disable();
|
||||
// Issue the EOI to interrupt controller
|
||||
outportb(_S2PICOCW2_IO,0x67); // Specific EOI for slave 1 IR7
|
||||
outportb(_MPICOCW2_IO,0x65); // Specific EQI for master IR5
|
||||
enable();
|
||||
}
|
||||
#endif
|
@ -0,0 +1,247 @@
|
||||
/*
|
||||
********************************************************************************
|
||||
* TERN, Inc.
|
||||
* (c) Copyright 2005, http://www.tern.com
|
||||
*
|
||||
* - Derived based on development version provided by Wiznet.
|
||||
*
|
||||
* Filename : socket.h
|
||||
* Programmer(s):
|
||||
* Created : 2002/06/20
|
||||
* Modified :
|
||||
* 2002/09/27 : - Renaming
|
||||
* INT_STATUS --> INT_REG
|
||||
* STATUS(i) --> INT_STATUS(i)
|
||||
* C_STATUS(i) --> SOCK_STATUS(i)
|
||||
* 2003/11/06 : Ported for use with TERN controller. Note all byte access is at even addresses
|
||||
* 2005/10/8 : Modified constants for easier initialization.
|
||||
*
|
||||
* Description : Header file of W3100A for TERN embedded controller
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifndef __SOCKET_H__
|
||||
#define __SOCKET_H__
|
||||
|
||||
#include "types.h"
|
||||
#include "i2chip_hw.h"
|
||||
#include <dos.h>
|
||||
|
||||
/*******************************************************************/
|
||||
#define MAX_SOCK_NUM 4 // Concurrent maxmium number of socket
|
||||
|
||||
#define I2CHIP_C0_CR 0x00
|
||||
#define I2CHIP_C1_CR 0x01
|
||||
#define I2CHIP_C2_CR 0x02
|
||||
#define I2CHIP_C3_CR 0x03
|
||||
#define I2CHIP_C0_ISR 0x04
|
||||
#define I2CHIP_C1_ISR 0x05
|
||||
#define I2CHIP_C2_ISR 0x06
|
||||
#define I2CHIP_C3_ISR 0x07
|
||||
#define I2CHIP_IR 0x08
|
||||
#define I2CHIP_IMR 0x09
|
||||
|
||||
#define I2CHIP_IDM_OR 0x0C
|
||||
#define I2CHIP_IDM_AR0 0x0D
|
||||
#define I2CHIP_IDM_AR1 0x0E
|
||||
#define I2CHIP_IDM_DR 0x0F
|
||||
#define I2CHIP_C0_RW_PR 0x10
|
||||
#define I2CHIP_C0_RR_PR 0x14
|
||||
#define I2CHIP_C0_TA_PR 0x18
|
||||
#define I2CHIP_C1_RW_PR 0x1C
|
||||
#define I2CHIP_C1_RR_PR 0x20
|
||||
#define I2CHIP_C1_TA_PR 0x24
|
||||
#define I2CHIP_C2_RW_PR 0x28
|
||||
#define I2CHIP_C2_RR_PR 0x2C
|
||||
#define I2CHIP_C2_TA_PR 0x30
|
||||
#define I2CHIP_C3_RW_PR 0x34
|
||||
#define I2CHIP_C3_RR_PR 0x38
|
||||
#define I2CHIP_C3_TA_PR 0x3C
|
||||
#define I2CHIP_C0_TW_PR 0x40
|
||||
#define I2CHIP_C0_TR_PR 0x44
|
||||
#define I2CHIP_C1_TW_PR 0x4C
|
||||
#define I2CHIP_C1_TR_PR 0x50
|
||||
#define I2CHIP_C2_TW_PR 0x58
|
||||
#define I2CHIP_C2_TR_PR 0x5C
|
||||
#define I2CHIP_C3_TW_PR 0x64
|
||||
#define I2CHIP_C3_TR_PR 0x68
|
||||
#define I2CHIP_GAR 0x80
|
||||
#define I2CHIP_SMR 0x84
|
||||
#define I2CHIP_SHAR 0x88
|
||||
#define I2CHIP_SIPR 0x8E
|
||||
#define I2CHIP_IRTR 0x92
|
||||
#define I2CHIP_RCR 0x94
|
||||
#define I2CHIP_RMSR 0x95
|
||||
#define I2CHIP_TMSR 0x96
|
||||
#define I2CHIP_C0_SSR 0xA0
|
||||
#define I2CHIP_C0_SOPR 0xA1
|
||||
#define I2CHIP_C0_DIR 0xA8
|
||||
#define I2CHIP_CO_DPR 0xAC
|
||||
#define I2CHIP_C0_SPR 0xAE
|
||||
#define I2CHIP_C0_IPR 0xB0
|
||||
#define I2CHIP_C0_TOSR 0xB1
|
||||
#define I2CHIP_C0_MSSR 0xB2
|
||||
|
||||
#define I2CHIP_C1_SSR 0xB8
|
||||
#define I2CHIP_C1_SOPR 0xB9
|
||||
#define I2CHIP_C1_DIR 0xC0
|
||||
#define I2CHIP_C1_DPR 0xC4
|
||||
#define I2CHIP_C1_SPR 0xC6
|
||||
#define I2CHIP_C1_IPR 0xC8
|
||||
#define I2CHIP_C1_TOSR 0xC9
|
||||
#define I2CHIP_C1_MSSR 0xCA
|
||||
|
||||
#define I2CHIP_C2_SSR 0xD0
|
||||
#define I2CHIP_C2_SOPR 0xD1
|
||||
#define I2CHIP_C2_DIR 0xD8
|
||||
#define I2CHIP_C2_DPR 0xDC
|
||||
#define I2CHIP_C2_SPR 0xDE
|
||||
#define I2CHIP_C2_IPR 0xE0
|
||||
#define I2CHIP_C2_TOSR 0xE1
|
||||
#define I2CHIP_C2_MSSR 0xE2
|
||||
|
||||
#define I2CHIP_C3_SSR 0xE8
|
||||
#define I2CHIP_C3_SOPR 0xE9
|
||||
#define I2CHIP_C3_DIR 0xF0
|
||||
#define I2CHIP_C3_DPR 0xF4
|
||||
#define I2CHIP_C3_SPR 0xF6
|
||||
#define I2CHIP_C3_IPR 0xF8
|
||||
#define I2CHIP_C3_TOSR 0xF9
|
||||
#define I2CHIP_C3_MSSR 0xFA
|
||||
|
||||
#define MAX_SEGMENT_SIZE 1460 // Maximum TCP transmission packet size
|
||||
#define MAX_BUF_SIZE1 0
|
||||
|
||||
|
||||
/* SOCKET OPTION(Settting OPT_PROTOCOL REG.) */
|
||||
#define SOCKOPT_BROADCAST 0x80 // Transmission, Reception of broadcasting data
|
||||
#define SOCKOPT_NDTIMEOUT 0x40 // Setting timeout
|
||||
#define SOCKOPT_NDACK 0x20 // Setting No Delayed Ack(TCP)
|
||||
#define SOCKOPT_SWS 0x10 // Setting Silly Window Syndrome(TCP)
|
||||
|
||||
/* OPTION(Setting OPT_PROTOCOL REG.) for MAC LAYER RAW MODE */
|
||||
#define MACLOPT_RXERR 0x80 // Setting reception of error packet
|
||||
#define MACLOPT_BROADCAST 0x40 // Setting reception of broadcast packet
|
||||
#define MACLOPT_PROMISC 0x20 // Setting reception of promiscuous packet
|
||||
|
||||
/* Distinguish TCP / UDP / IP RAW / MAC RAW (Setting OPT_PROTOCOL REG.) */
|
||||
#define SOCK_CLOSEDM 0x00 // unused socket
|
||||
#define SOCK_STREAM 0x01 // TCP
|
||||
#define SOCK_DGRAM 0x02 // UDP
|
||||
#define SOCK_IPL_RAW 0x03 // IP LAYER RAW SOCK
|
||||
#define SOCK_MACL_RAW 0x04 // MAC LAYER RAW SOCK
|
||||
|
||||
/* Setting IP PROTOCOL */
|
||||
#define IPPROTO_IP 0 // dummy for IP
|
||||
#define IPPROTO_ICMP 1 // control message protocol
|
||||
#define IPPROTO_IGMP 2 // internet group management protocol
|
||||
#define IPPROTO_GGP 3 // gateway^2 (deprecated)
|
||||
#define IPPROTO_TCP 6 // tcp
|
||||
#define IPPROTO_PUP 12 // pup
|
||||
#define IPPROTO_UDP 17 // user datagram protocol
|
||||
#define IPPROTO_IDP 22 // xns idp
|
||||
#define IPPROTO_ND 77 // UNOFFICIAL net disk proto
|
||||
#define IPPROTO_RAW 255 // raw IP packet
|
||||
|
||||
/* Select parameter to use */
|
||||
#define SEL_CONTROL 0 //Confirm socket status
|
||||
#define SEL_SEND 1 // Confirm Tx free buffer size
|
||||
#define SEL_RECV 2 // Confirm Rx data size
|
||||
|
||||
/* Command variables */
|
||||
#define CSYS_INIT 0x01 // To set up network information(mac address, gateway address,
|
||||
// subnet mask, source ip)
|
||||
#define CSOCK_INIT 0x02 // To initialize socket
|
||||
#define CCONNECT 0x04 // To establish connection as tcp client mode
|
||||
#define CLISTEN 0x08 // To wait for connection request as tcp server mode
|
||||
#define CCLOSE 0x10 // To terminate connection
|
||||
#define CSEND 0x20 // To send data
|
||||
#define CRECV 0x40 // To receive data
|
||||
#define CSW_RESET 0x80 // To do software reset
|
||||
|
||||
#define CSET_MEMORY_TEST 0x80 // To set the memory test bit
|
||||
#define CRESET_MEMORY_TEST 0x00 // To clear the memory test bit
|
||||
|
||||
/* Status Variables */
|
||||
#define SSYS_INIT_OK 0x01 // Completion of CSYS_INIT command
|
||||
#define SSOCK_INIT_OK 0x02 // Completion of CSOCK_INIT command
|
||||
#define SESTABLISHED 0x04 // Completion of connection setup
|
||||
#define SCLOSED 0x08 // Completion of CCLOSED command
|
||||
#define SSEND_OK 0x20 // Completion of sending data
|
||||
#define SRECV_OK 0x40 // Completion of receiving data
|
||||
|
||||
/* Socket Status Vabiables */
|
||||
#define SOCK_CLOSED 0x00 // Status of connection closed
|
||||
#define SOCK_ARP 0x01 // Status of ARP
|
||||
#define SOCK_LISTEN 0x02 // Status of waiting for TCP connection setup
|
||||
#define SOCK_SYNSENT 0x03 // Status of setting up TCP connection
|
||||
#define SOCK_SYNSENT_ACK 0x04 // Status of setting up TCP connection
|
||||
#define SOCK_SYNRECV 0x05 // Status of setting up TCP connection
|
||||
#define SOCK_ESTABLISHED 0x06 // Status of TCP connection established
|
||||
#define SOCK_CLOSE_WAIT 0x07 // Status of closing TCP connection
|
||||
#define SOCK_LAST_ACK 0x08 // Status of closing TCP connection
|
||||
#define SOCK_FIN_WAIT1 0x09 // Status of closing TCP connection
|
||||
#define SOCK_FIN_WAIT2 0x0A // Status of closing TCP connection
|
||||
#define SOCK_CLOSING 0x0B // Status of closing TCP connection
|
||||
#define SOCK_TIME_WAIT 0x0C // Status of closing TCP connection
|
||||
#define SOCK_RESET 0x0D // Status of closing TCP connection
|
||||
#define SOCK_INIT 0x0E // Status of socket initialization
|
||||
#define SOCK_UDP 0x0F // Status of UDP
|
||||
#define SOCK_RAW 0x10 // Status of IP RAW
|
||||
|
||||
/* TERN Behavior Parameters */
|
||||
#define TERN_TDMA_THRES 10000 // Use DMA for transmits if data > thres bytes.
|
||||
#define TERN_RDMA_THRES 10000 // Use DMA for receives if data > thres bytes.
|
||||
// High thres value effectively disables DMA
|
||||
|
||||
void far interrupt in4_isr_i2chip(void);
|
||||
|
||||
//void ISR_ESTABLISHED(SOCKET s);
|
||||
//void ISR_CLOSED(SOCKET s);
|
||||
//void ISR_RX(SOCKET s);
|
||||
|
||||
void initW3100A(void);
|
||||
void sysinit(u_char sbufsize, u_char rbufsize);
|
||||
void setsubmask(u_char * addr);
|
||||
void setgateway(u_char * addr);
|
||||
void setMACAddr(u_char * addr);
|
||||
void setIP(u_char * addr);
|
||||
|
||||
char socket(SOCKET s, u_char protocol, u_int port, u_char flag);
|
||||
|
||||
void setIPprotocol(SOCKET s, u_char ipprotocol);
|
||||
|
||||
void setINTMask(u_char mask);
|
||||
void settimeout(u_char * val);
|
||||
void setTOS(SOCKET s, u_char tos);
|
||||
|
||||
void GetDestAddr(SOCKET s, u_char* addr);
|
||||
|
||||
//void setbroadcast(SOCKET s);
|
||||
|
||||
char connect(SOCKET s, u_char far * addr, u_int port);
|
||||
char NBconnect(SOCKET s, u_char far * addr, u_int port);
|
||||
|
||||
//char listen(SOCKET s, u_char far * addr, u_int far * port);
|
||||
char NBlisten(SOCKET s);
|
||||
|
||||
void initseqnum(SOCKET s);
|
||||
|
||||
int send(SOCKET s, u_char far * buf, u_int len);
|
||||
int send_in(SOCKET s, u_char far * buf, u_int len);
|
||||
int recv(SOCKET s, u_char far * buf, u_int len);
|
||||
|
||||
u_int sendto(SOCKET , u_char far * buf, u_int, u_char * addr, u_int);
|
||||
u_int sendto_in(SOCKET , u_char far *, u_int);
|
||||
u_int recvfrom(SOCKET , u_char far * buf, u_int, u_char * addr, u_int *);
|
||||
|
||||
u_int read_data(SOCKET s, u_int src_offset, u_char far * dst, u_int len);
|
||||
u_int write_data(SOCKET s, u_char far * src, u_int dst_offset, u_int len);
|
||||
|
||||
void close(SOCKET s);
|
||||
char reset_sock(SOCKET s);
|
||||
|
||||
u_int select(SOCKET s, u_char func);
|
||||
void recv_clear(SOCKET s);
|
||||
u_char tx_empty(SOCKET s);
|
||||
|
||||
#endif // __SOCKET_H__
|
@ -0,0 +1,64 @@
|
||||
/*
|
||||
********************************************************************************
|
||||
* Wiznet.
|
||||
* 5F Simmtech Bldg., 228-3, Nonhyun-dong, Kangnam-gu,
|
||||
* Seoul, Korea
|
||||
*
|
||||
* (c) Copyright 2002, Wiznet, Seoul, Korea
|
||||
*
|
||||
* Filename : types.h
|
||||
* Programmer(s):
|
||||
* Created : 2002/01/
|
||||
* Modified :
|
||||
* Description : Define of data type.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _TYPES_H_
|
||||
#define _TYPES_H_
|
||||
|
||||
#ifndef NULL
|
||||
# define NULL ((void *) 0)
|
||||
#endif
|
||||
|
||||
typedef enum { false, true } bool;
|
||||
|
||||
#ifndef _SIZE_T
|
||||
#define _SIZE_T
|
||||
typedef unsigned int size_t;
|
||||
#endif
|
||||
|
||||
typedef unsigned char BYTE; // 8-bit value
|
||||
typedef unsigned char UCHAR; // 8-bit value
|
||||
typedef int INT; // 16-bit value
|
||||
typedef unsigned int UINT; // 16-bit value
|
||||
typedef unsigned short USHORT; // 16-bit value
|
||||
typedef unsigned short WORD; // 16-bit value
|
||||
typedef unsigned long ULONG; // 32-bit value
|
||||
typedef unsigned long DWORD; // 32-bit value
|
||||
|
||||
// bsd
|
||||
typedef unsigned char u_char; // 8-bit value
|
||||
typedef unsigned short u_short; // 16-bit value
|
||||
typedef unsigned int u_int; // 16-bit value
|
||||
typedef unsigned long u_long; // 32-bit value
|
||||
|
||||
typedef UCHAR SOCKET;
|
||||
|
||||
|
||||
/* Type for treating 4 byte variables with byte by byte */
|
||||
typedef union un_l2cval
|
||||
{
|
||||
u_long lVal;
|
||||
u_char cVal[4];
|
||||
};
|
||||
|
||||
/* Type for treating 2 byte variables with byte by byte */
|
||||
typedef union un_i2cval
|
||||
{
|
||||
u_int iVal;
|
||||
u_char cVal[2];
|
||||
};
|
||||
|
||||
#endif // _TYPES_H_
|
||||
|
@ -0,0 +1,309 @@
|
||||
/*
|
||||
********************************************************************************
|
||||
* TERN, Inc.
|
||||
* (c) Copyright 2005, http://www.tern.com
|
||||
*
|
||||
* - Created to support i2chip module on a variety of TERN hardware platforms.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _I2CHIP_HW_H_
|
||||
#define _I2CHIP_HW_H_
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef TERN_SC // SensorCore controller, has mapping identical to the RL
|
||||
#define TERN_RL
|
||||
#endif
|
||||
|
||||
#ifdef TERN_RL // R-Engine-L controller, with mapping at MCS0.
|
||||
#define I2CHIP_MCS_DIRECT
|
||||
#define I2CHIP_INT4
|
||||
#define TERN_RE
|
||||
#endif // TERN_RL
|
||||
|
||||
#ifdef TERN_5E
|
||||
#define TERN_586
|
||||
#endif
|
||||
|
||||
#ifdef TERN_RD
|
||||
#define TERN_RE
|
||||
#endif // TERN_RD
|
||||
|
||||
#ifdef TERN_RE
|
||||
#define TERN_186
|
||||
#endif
|
||||
|
||||
#ifdef TERN_P51
|
||||
void p51_window(unsigned int page);
|
||||
#define I2CHIP_WINDOW
|
||||
#define I2CHIP_P51
|
||||
#ifdef TERN_186
|
||||
#define I2CHIP_INT4
|
||||
#define TERN_16_BIT
|
||||
#endif // TERN_186
|
||||
#ifdef TERN_586
|
||||
#define I2CHIP_INT0
|
||||
#define I2CHIP_WINDOW_IO
|
||||
#endif // TERN_586
|
||||
#endif // TERN_P51
|
||||
|
||||
#ifdef TERN_CEYE
|
||||
#define TERN_EE // C-Eye configured with onboard i2chip, same as EE
|
||||
#endif
|
||||
|
||||
#ifdef TERN_EE
|
||||
#define TERN_186
|
||||
#define I2CHIP_MCS_DIRECT
|
||||
#define I2CHIP_INT4
|
||||
#define TERN_16_BIT
|
||||
#endif // TERN_EE
|
||||
|
||||
#ifdef TERN_MMC
|
||||
#define I2CHIP_WINDOW
|
||||
#define I2CHIP_MMC
|
||||
#ifdef TERN_RD
|
||||
#define I2CHIP_INT3
|
||||
#else
|
||||
#ifdef TERN_186
|
||||
#define I2CHIP_INT4
|
||||
#endif // TERN_186
|
||||
#endif // TERN_RD
|
||||
#ifdef TERN_586
|
||||
#define I2CHIP_INT0
|
||||
#define I2CHIP_WINDOW_IO
|
||||
#endif // TERN_586
|
||||
#endif // TERN_MMC
|
||||
|
||||
#ifdef TERN_586
|
||||
#include "586.h"
|
||||
void interrupt far int0_isr(void);
|
||||
void interrupt far spu_m_isr(void);
|
||||
void interrupt far spu_1_isr(void);
|
||||
void interrupt far spu_2_isr(void);
|
||||
#define MMCR 0xdf00
|
||||
#endif // TERN_586
|
||||
|
||||
#ifdef TERN_186
|
||||
#ifndef TERN_RE
|
||||
#include "ae.h"
|
||||
#else
|
||||
#include "re.h"
|
||||
#define I2CHIP_SHIFTED_ADDRESS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef I2CHIP_MCS_DIRECT
|
||||
#ifndef I2CHIP_WINDOW
|
||||
#ifndef I2CHIP_WINDOW_IO
|
||||
#error You must define the TERN address mapping used to drive the I2CHIP module!
|
||||
#endif // I2CHIP_WINDOW_IO
|
||||
#endif // I2CHIP_MMC_WINDOW
|
||||
#endif // I2CHIP_MCS_DIRECT
|
||||
|
||||
#ifndef I2CHIP_INT0
|
||||
#ifndef I2CHIP_INT3
|
||||
#ifndef I2CHIP_INT4
|
||||
#ifndef I2CHIP_POLL
|
||||
#error You must specify an interrupt/polling mechanism for the I2CHIP module!
|
||||
#endif // I2CHIP_POLL
|
||||
#endif // I2CHIP_INT3
|
||||
#endif // I2CHIP_INT4
|
||||
#endif // I2CHIP_INT0
|
||||
|
||||
#ifdef I2CHIP_POLL
|
||||
#define I2CHIP_POLL_ISR(a) { delay_ms(20); disable(); a(); enable(); }
|
||||
#define INT_INIT(isr)
|
||||
#define INT_EOI
|
||||
#endif // I2CHIP_POLL
|
||||
|
||||
#ifdef I2CHIP_INT4
|
||||
#define INT_INIT(isr) int4_init(1, isr)
|
||||
#define INT_EOI outport(0xff22,0x0010)
|
||||
#define I2CHIP_POLL_ISR(a)
|
||||
#endif
|
||||
|
||||
#ifdef I2CHIP_INT3
|
||||
#define INT_INIT(isr) int3_init(1, isr)
|
||||
#define INT_EOI outport(0xff22,0x000f)
|
||||
#define I2CHIP_POLL_ISR(a)
|
||||
#endif
|
||||
|
||||
#ifdef I2CHIP_INT0
|
||||
#define INT_INIT(isr) int0_init(1, isr)
|
||||
#define INT_EOI outportb(_MPICOCW2_IO,0x61); // 586 only EOI
|
||||
#define I2CHIP_POLL_ISR(a)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef I2CHIP_SHIFTED_ADDRESS
|
||||
#define SA_OFFSET(a) ((a) << 1)
|
||||
#else
|
||||
#define SA_OFFSET(a) a
|
||||
#endif // I2CHIP_SHIFTED_ADDRESS ... *if*
|
||||
|
||||
|
||||
// -------------------- WINDOW-RELATED DEFINES ----------------------
|
||||
#ifdef I2CHIP_WINDOW
|
||||
void i2chip_set_page(u_int addr);
|
||||
#define I2CHIP_SET_PAGE(p) i2chip_set_page(p)
|
||||
|
||||
u_char far* i2chip_mkptr(u_int addr);
|
||||
void i2chip_push_window(u_int addr);
|
||||
void i2chip_pop_window(void);
|
||||
u_int i2chip_get_window(void);
|
||||
void i2chip_set_window(u_int window_addr);
|
||||
|
||||
// Set to command window.
|
||||
// Note that if you're using other MMC chips within your application, you will
|
||||
// need to call this function regularly, if you've changed the MMC chip/page
|
||||
// selection via mmc_window(). The driver code otherwise assume that you never
|
||||
// change away from chip 7, page 0.
|
||||
#define WINDOW_RESTORE_BASE i2chip_mkptr(0)
|
||||
|
||||
// ----------------------- I2CHIP_WINDOW_IO ----------------------------
|
||||
#ifdef I2CHIP_WINDOW_IO
|
||||
|
||||
#ifdef TERN_5E
|
||||
#define I2CHIP_BASE_SEG 0x2000 // Address offset for W3100A
|
||||
#else
|
||||
#define I2CHIP_BASE_SEG 0x1800 // Address offset for W3100A
|
||||
#endif
|
||||
|
||||
#define COMMAND_BASE_SEG 0x0000
|
||||
#define SEND_DATA_BUF 0x4000 // Internal Tx buffer address of W3100A
|
||||
#define RECV_DATA_BUF 0x6000 // Internal Rx buffer address of W3100A
|
||||
#define WINDOW_BASE_SEGM COMMAND_BASE_SEG
|
||||
|
||||
#define MK_FP_WINDOW(a, b) i2chip_mkptr(a+SA_OFFSET(b))
|
||||
#define MK_FP_SA MK_FP_WINDOW
|
||||
|
||||
u_char io_read_value(u_char far* addr);
|
||||
void io_write_value(u_char far* addr, u_char value);
|
||||
#define READ_VALUE(a) io_read_value(a)
|
||||
#define WRITE_VALUE(a, v) io_write_value(a, v)
|
||||
|
||||
#define WINDOW_PTR_INC(a) \
|
||||
if ((FP_OFF(a) & 0xff) == 0xff) \
|
||||
a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \
|
||||
else \
|
||||
a++;
|
||||
|
||||
#endif // I2CHIP_WINDOW_IO
|
||||
|
||||
// -------------------- !NOT! I2CHIP_WINDOW_IO ----------------------------
|
||||
#ifndef I2CHIP_WINDOW_IO
|
||||
|
||||
#define READ_VALUE(a) *(a)
|
||||
#define WRITE_VALUE(a, v) *(a) = v
|
||||
|
||||
#define WINDOW_BASE_SEGM 0x8000
|
||||
#define MK_FP_WINDOW(a, b) i2chip_mkptr(a+SA_OFFSET(b))
|
||||
#define MK_FP_SA MK_FP_WINDOW
|
||||
|
||||
#ifdef I2CHIP_SHIFTED_ADDRESS
|
||||
#define COMMAND_BASE_SEG 0x0000
|
||||
#define SEND_DATA_BUF 0x8000
|
||||
#define RECV_DATA_BUF 0xC000
|
||||
#define WINDOW_PTR_INC(a) \
|
||||
if ((FP_OFF(a) & 0xff) == 0xfe) \
|
||||
a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \
|
||||
else \
|
||||
a+=2;
|
||||
#else
|
||||
#define COMMAND_BASE_SEG 0x0000
|
||||
#define SEND_DATA_BUF 0x4000
|
||||
#define RECV_DATA_BUF 0x6000
|
||||
#define WINDOW_PTR_INC(a) \
|
||||
if ((FP_OFF(a) & 0xff) == 0xff) \
|
||||
a = MK_FP_WINDOW(i2chip_get_window() + 0x100, 0); \
|
||||
else \
|
||||
a++;
|
||||
#endif // I2CHIP_SHIFTED_ADDRESS
|
||||
#endif // NOT I2CHIP_WINDOW_IO
|
||||
|
||||
#endif // I2CHIP_WINDOW
|
||||
|
||||
// -------------------- I2CHIP_DIRECT ----------------------------
|
||||
#ifdef I2CHIP_MCS_DIRECT
|
||||
|
||||
#define READ_VALUE(a) *(a)
|
||||
#define WRITE_VALUE(a, v) *(a) = v
|
||||
|
||||
#define I2CHIP_BASE_SEG 0x8000
|
||||
#define MK_FP_SA(a, b) MK_FP(a, SA_OFFSET(b))
|
||||
#define WINDOW_PTR_INC(a) a+=SA_OFFSET(1);
|
||||
#define WINDOW_RESTORE_BASE
|
||||
#define MK_FP_WINDOW MK_FP_SA
|
||||
#define WINDOW_BASE_SEG I2CHIP_BASE_SEG
|
||||
#define COMMAND_BASE_SEG I2CHIP_BASE_SEG
|
||||
|
||||
#ifdef I2CHIP_SHIFTED_ADDRESS
|
||||
#define SEND_DATA_BUF 0x8800 // Internal Tx buffer address of W3100A
|
||||
#define RECV_DATA_BUF 0x8C00 // Internal Rx buffer address of W3100A
|
||||
#else
|
||||
#define SEND_DATA_BUF 0x8400 // Internal Tx buffer address of W3100A
|
||||
#define RECV_DATA_BUF 0x8600 // Internal Rx buffer address of W3100A
|
||||
#endif // I2CHIP_SHIFTED_ADDRESS
|
||||
|
||||
#endif // I2CHIP_MCS_DIRECT
|
||||
|
||||
/* Internal register set of W3100A */
|
||||
#define COMMAND(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, i)))
|
||||
#define INT_STATUS(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_C0_ISR + i)))
|
||||
#define INT_REG ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_IR)))
|
||||
#define INTMASK ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, I2CHIP_IMR)))
|
||||
#define RESETSOCK ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x0A)))
|
||||
|
||||
#define RX_PTR_BASE I2CHIP_C0_RW_PR
|
||||
#define RX_PTR_SIZE (I2CHIP_C1_RW_PR - I2CHIP_C0_RW_PR)
|
||||
|
||||
#define RX_WR_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i)))
|
||||
#define RX_RD_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i + 0x04)))
|
||||
#define RX_ACK_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i + 0x08)))
|
||||
|
||||
#define TX_PTR_BASE I2CHIP_C0_TW_PR
|
||||
#define TX_PTR_SIZE (I2CHIP_C1_TW_PR - I2CHIP_C0_TW_PR)
|
||||
|
||||
#define TX_WR_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i)))
|
||||
#define TX_RD_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, TX_PTR_BASE + TX_PTR_SIZE * i + 0x04)))
|
||||
#define TX_ACK_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, RX_PTR_BASE + RX_PTR_SIZE * i + 0x08)))
|
||||
|
||||
/* Shadow Register Pointer Define */
|
||||
/* For windowing purposes, these are definitely outside the first 256-byte Window...
|
||||
therefore, use the MK_FP_WINDOW macros instead. */
|
||||
#define SHADOW_RXWR_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E0 + 3*i)))
|
||||
#define SHADOW_RXRD_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E1 + 3*i)))
|
||||
#define SHADOW_TXACK_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1E2 + 3*i)))
|
||||
#define SHADOW_TXWR_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1F0 + 3*i)))
|
||||
#define SHADOW_TXRD_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, 0x1F1 + 3*i)))
|
||||
|
||||
#define SOCK_BASE I2CHIP_C0_SSR
|
||||
#define SOCK_SIZE (I2CHIP_C1_SSR - I2CHIP_C0_SSR)
|
||||
|
||||
#define SOCK_STATUS(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i)))
|
||||
#define OPT_PROTOCOL(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x01)))
|
||||
#define DST_HA_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x02)))
|
||||
#define DST_IP_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x08)))
|
||||
#define DST_PORT_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x0C)))
|
||||
#define SRC_PORT_PTR(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x0E)))
|
||||
#define IP_PROTOCOL(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x10)))
|
||||
#define TOS(i) ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,SOCK_BASE + SOCK_SIZE * i + 0x11)))
|
||||
#define MSS(i) ((u_int far *)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x12)))
|
||||
#define P_WINDOW(i) ((u_int far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,SOCK_BASE + SOCK_SIZE * i + 0x14)))
|
||||
#define WINDOW(i) ((u_int far*)(MK_FP_WINDOW(COMMAND_BASE_SEG, SOCK_BASE + SOCK_SIZE * i + 0x16)))
|
||||
|
||||
#define GATEWAY_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_GAR)))
|
||||
#define SUBNET_MASK_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SMR)))
|
||||
|
||||
#define SRC_HA_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SHAR)))
|
||||
#define SRC_IP_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_SIPR)))
|
||||
#define TIMEOUT_PTR ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_IRTR)))
|
||||
|
||||
#define RX_DMEM_SIZE ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_RMSR)))
|
||||
#define TX_DMEM_SIZE ((u_char far *)(MK_FP_WINDOW(COMMAND_BASE_SEG,I2CHIP_TMSR)))
|
||||
|
||||
void i2chip_init(void);
|
||||
|
||||
#endif // _irchip_hw_h
|
@ -0,0 +1,12 @@
|
||||
#ifndef _SYSTEM_COMMON_H_
|
||||
#define _SYSTEM_COMMON_H_
|
||||
|
||||
typedef unsigned char UCHAR8;
|
||||
typedef unsigned int UINT16;
|
||||
|
||||
#define RETURN_OK 0 // Non-zero return values are always
|
||||
// error values.
|
||||
#define RETURN_ILLEGAL 1 // Some sort of illegal argument.
|
||||
#define RETURN_MEM 2 // Out of memory space.
|
||||
|
||||
#endif // _SYSTEM_COMMON_H_
|
@ -0,0 +1,196 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Creates all the demo application tasks then starts the scheduler. In
|
||||
* addition to the standard demo application tasks main() creates the
|
||||
* HTTPServer task, and a "Check" task. The Check task periodically inspects
|
||||
* all the other tasks in the system to see if any errors have been reported.
|
||||
* The error status is then displayed on the served WEB page.
|
||||
*/
|
||||
|
||||
/* Tern includes. */
|
||||
#include <ae.h>
|
||||
#include <embedded.h>
|
||||
|
||||
/* FreeRTOS.org includes. */
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "HTTPTask.h"
|
||||
#include "integer.h"
|
||||
#include "PollQ.h"
|
||||
#include "semtest.h"
|
||||
#include "dynamic.h"
|
||||
#include "BlockQ.h"
|
||||
#include "Death.h"
|
||||
#include "serial.h"
|
||||
#include "comtest.h"
|
||||
|
||||
/* How often should the "check" task execute? */
|
||||
#define mainCHECK_DELAY ( 3000 / portTICK_RATE_MS )
|
||||
|
||||
/* Priorities allocated to the various tasks. */
|
||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainHTTP_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
||||
#define mainSUICIDE_TASKS_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
|
||||
/* Used to indicate the error status. A value of 0 means that an error has not
|
||||
been detected in any task. A non zero value indicates which group of demo
|
||||
tasks has reported an error. See prvCheckTask() for bit definitions. */
|
||||
unsigned portSHORT usCheckStatus = 0;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Setup any hardware required by the demo - other than the RTOS tick which
|
||||
* is configured when the scheduler is started.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*
|
||||
* Periodically inspect all the other tasks, updating usCheckStatus should an
|
||||
* error be discovered in any task.
|
||||
*/
|
||||
static void prvCheckTask( void *pvParameters );
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main(void)
|
||||
{
|
||||
prvSetupHardware();
|
||||
|
||||
/* Start the HTTP server task. */
|
||||
xTaskCreate( vHTTPTask, "WizNet", configMINIMAL_STACK_SIZE, NULL, mainHTTP_TASK_PRIORITY, NULL );
|
||||
|
||||
/* Start the demo/test application tasks. See the demo application
|
||||
section of the FreeRTOS.org WEB site for more information. */
|
||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
||||
vStartDynamicPriorityTasks();
|
||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
||||
vStartComTestTasks( mainCOM_TEST_PRIORITY, serCOM2, ser57600 );
|
||||
|
||||
/* Start the task that checks the other demo tasks for errors. */
|
||||
xTaskCreate( prvCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
||||
|
||||
/* The suicide tasks must be created last as they monitor the number of
|
||||
tasks in the system to ensure there are no more or fewer than expected
|
||||
compared to the number that were executing when the task started. */
|
||||
vCreateSuicidalTasks( mainSUICIDE_TASKS_PRIORITY );
|
||||
|
||||
/* Finally start the scheduler. */
|
||||
vTaskStartScheduler();
|
||||
|
||||
/* Should not get here! */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
ae_init();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvCheckTask( void *pvParameters )
|
||||
{
|
||||
( void ) pvParameters;
|
||||
|
||||
/* Check all the demo tasks to ensure that they are all still running, and
|
||||
that none of them have detected an error. */
|
||||
for( ;; )
|
||||
{
|
||||
/* Block until it is time to check again. */
|
||||
vTaskDelay( mainCHECK_DELAY );
|
||||
|
||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x01;
|
||||
}
|
||||
|
||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x02;
|
||||
}
|
||||
|
||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x04;
|
||||
}
|
||||
|
||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x08;
|
||||
}
|
||||
|
||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x10;
|
||||
}
|
||||
|
||||
if( xIsCreateTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x20;
|
||||
}
|
||||
|
||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
usCheckStatus |= 0x40;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* This is included to prevent link errors - allowing the 'full' version of
|
||||
the comtest tasks to be used. It can be ignored. */
|
||||
void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend )
|
||||
{
|
||||
( void ) ppcMessageToSend;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,442 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <embedded.h>
|
||||
#include "FreeRTOS.h"
|
||||
#include "portasm.h"
|
||||
#include "queue.h"
|
||||
#include "task.h"
|
||||
#include "semphr.h"
|
||||
|
||||
#define serMAX_PORTS ( ( unsigned portSHORT ) 2 )
|
||||
|
||||
#define serPORT_0_INT_REG ( 0xff44 )
|
||||
#define serPORT_0_BAUD_REG ( 0xff88 )
|
||||
#define serPORT_0_RX_REG ( 0xff86 )
|
||||
#define serPORT_0_TX_REG ( 0xff84 )
|
||||
#define serPORT_0_STATUS_REG ( 0xff82 )
|
||||
#define serPORT_0_CTRL_REG ( 0xff80 )
|
||||
#define serPORT_0_IRQ ( 0x14 )
|
||||
|
||||
#define serPORT_1_INT_REG ( 0xff42 )
|
||||
#define serPORT_1_BAUD_REG ( 0xff18 )
|
||||
#define serPORT_1_RX_REG ( 0xff16 )
|
||||
#define serPORT_1_TX_REG ( 0xff14 )
|
||||
#define serPORT_1_STATUS_REG ( 0xff12 )
|
||||
#define serPORT_1_CTRL_REG ( 0xff10 )
|
||||
#define serPORT_1_IRQ ( 0x11 )
|
||||
|
||||
#define serTX_EMPTY ( ( unsigned portSHORT ) 0x40 )
|
||||
#define serRX_READY ( ( unsigned portSHORT ) 0x80 )
|
||||
|
||||
#define serRESET_PIC( usEOI_TYPE ) portOUTPUT_WORD( ( unsigned portSHORT ) 0xff22, usEOI_TYPE )
|
||||
#define serTX_HOLD_EMPTY_INT ( ( unsigned portSHORT ) 0x100 )
|
||||
|
||||
#define serENABLE_INTERRUPTS ( ( unsigned portSHORT ) 0x80 )
|
||||
#define serMODE ( ( unsigned portSHORT ) 0x01 )
|
||||
#define serENABLE_TX_MACHINES ( ( unsigned portSHORT ) 0x40 )
|
||||
#define serENABLE_RX_MACHINES ( ( unsigned portSHORT ) 0x20 )
|
||||
#define serINTERRUPT_MASK ( ( unsigned portSHORT ) 0x08 )
|
||||
#define serCLEAR_ALL_STATUS_BITS ( ( unsigned portSHORT ) 0x00 )
|
||||
#define serINTERRUPT_PRIORITY ( ( unsigned portSHORT ) 0x01 ) /*< Just below the scheduler priority. */
|
||||
|
||||
#define serDONT_BLOCK ( ( portTickType ) 0 )
|
||||
|
||||
typedef enum
|
||||
{
|
||||
serCOM1 = 0,
|
||||
serCOM2,
|
||||
serCOM3,
|
||||
serCOM4,
|
||||
serCOM5,
|
||||
serCOM6,
|
||||
serCOM7,
|
||||
serCOM8
|
||||
} eCOMPort;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
serNO_PARITY,
|
||||
serODD_PARITY,
|
||||
serEVEN_PARITY,
|
||||
serMARK_PARITY,
|
||||
serSPACE_PARITY
|
||||
} eParity;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
serSTOP_1,
|
||||
serSTOP_2
|
||||
} eStopBits;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
serBITS_5,
|
||||
serBITS_6,
|
||||
serBITS_7,
|
||||
serBITS_8
|
||||
} eDataBits;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ser50 = 0,
|
||||
ser75,
|
||||
ser110,
|
||||
ser134,
|
||||
ser150,
|
||||
ser200,
|
||||
ser300,
|
||||
ser600,
|
||||
ser1200,
|
||||
ser1800,
|
||||
ser2400,
|
||||
ser4800,
|
||||
ser9600,
|
||||
ser19200,
|
||||
ser38400,
|
||||
ser57600,
|
||||
ser115200
|
||||
} eBaud;
|
||||
|
||||
typedef struct xCOM_PORT
|
||||
{
|
||||
/* Hardware parameters for this port. */
|
||||
portSHORT sTxInterruptOn;
|
||||
unsigned portSHORT usIntReg;
|
||||
unsigned portSHORT usBaudReg;
|
||||
unsigned portSHORT usRxReg;
|
||||
unsigned portSHORT usTxReg;
|
||||
unsigned portSHORT usStatusReg;
|
||||
unsigned portSHORT usCtrlReg;
|
||||
|
||||
unsigned portSHORT usIRQVector;
|
||||
|
||||
/* Queues used for communications with com test task. */
|
||||
xQueueHandle xRxedChars;
|
||||
xQueueHandle xCharsForTx;
|
||||
|
||||
/* This semaphore does nothing useful except test a feature of the
|
||||
scheduler. */
|
||||
xSemaphoreHandle xTestSem;
|
||||
|
||||
} xComPort;
|
||||
|
||||
static xComPort xPorts[ serMAX_PORTS ] =
|
||||
{
|
||||
{ pdFALSE, serPORT_0_INT_REG, serPORT_0_BAUD_REG, serPORT_0_RX_REG, serPORT_0_TX_REG, serPORT_0_STATUS_REG, serPORT_0_CTRL_REG, serPORT_0_IRQ, NULL, NULL, NULL },
|
||||
{ pdFALSE, serPORT_1_INT_REG, serPORT_1_BAUD_REG, serPORT_1_RX_REG, serPORT_1_TX_REG, serPORT_1_STATUS_REG, serPORT_1_CTRL_REG, serPORT_1_IRQ, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
typedef xComPort * xComPortHandle;
|
||||
|
||||
/**
|
||||
* Lookup the baud rate from the enum.
|
||||
*/
|
||||
static unsigned portLONG prvBaud( eBaud eWantedBaud );
|
||||
|
||||
/* These prototypes are repeated here so we don't have to include the serial header. This allows
|
||||
the xComPortHandle structure details to be private to this file. */
|
||||
xComPortHandle xSerialPortInit( eCOMPort ePort, eBaud eWantedBaud, eParity eWantedParity, eDataBits eWantedDataBits, eStopBits eWantedStopBits, unsigned portBASE_TYPE uxBufferLength );
|
||||
portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, portCHAR *pcRxedChar, portTickType xBlockTime );
|
||||
portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, portCHAR cOutChar, portTickType xBlockTime );
|
||||
void vSerialClose( xComPortHandle xPort );
|
||||
portSHORT sSerialWaitForSemaphore( xComPortHandle xPort );
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static portSHORT xComPortISR( xComPort * const pxPort );
|
||||
|
||||
#define vInterruptOn( pxPort, usInterrupt ) \
|
||||
{ \
|
||||
unsigned portSHORT usIn; \
|
||||
\
|
||||
portENTER_CRITICAL(); \
|
||||
{ \
|
||||
if( pxPort->sTxInterruptOn == pdFALSE ) \
|
||||
{ \
|
||||
usIn = portINPUT_WORD( pxPort->usCtrlReg ); \
|
||||
portOUTPUT_WORD( pxPort->usCtrlReg, usIn | usInterrupt ); \
|
||||
\
|
||||
pxPort->sTxInterruptOn = pdTRUE; \
|
||||
} \
|
||||
} \
|
||||
portEXIT_CRITICAL(); \
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#define vInterruptOff( pxPort, usInterrupt ) \
|
||||
{ \
|
||||
unsigned portSHORT usIn = portINPUT_WORD( pxPort->usCtrlReg ); \
|
||||
if( usIn & usInterrupt ) \
|
||||
{ \
|
||||
portOUTPUT_WORD( pxPort->usCtrlReg, usIn & ~usInterrupt); \
|
||||
pxPort->sTxInterruptOn = pdFALSE; \
|
||||
} \
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
||||
/* Define an interrupt handler for each port */
|
||||
#define COM_IRQ_WRAPPER(N) \
|
||||
static void __interrupt COM_IRQ##N##_WRAPPER( void ) \
|
||||
{ \
|
||||
if( xComPortISR( &( xPorts[##N##] ) ) ) \
|
||||
{ \
|
||||
portEND_SWITCHING_ISR(); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
|
||||
COM_IRQ_WRAPPER( 0 )
|
||||
COM_IRQ_WRAPPER( 1 )
|
||||
|
||||
static pxISR xISRs[ serMAX_PORTS ] =
|
||||
{
|
||||
COM_IRQ0_WRAPPER,
|
||||
COM_IRQ1_WRAPPER
|
||||
};
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static unsigned portLONG prvBaud( eBaud eWantedBaud )
|
||||
{
|
||||
switch( eWantedBaud )
|
||||
{
|
||||
case ser50 : return 50UL;
|
||||
case ser75 : return 75UL;
|
||||
case ser110 : return 110UL;
|
||||
case ser134 : return 134UL;
|
||||
case ser150 : return 150UL;
|
||||
case ser200 : return 200UL;
|
||||
case ser300 : return 300UL;
|
||||
case ser600 : return 600UL;
|
||||
case ser1200 : return 1200UL;
|
||||
case ser1800 : return 1800UL;
|
||||
case ser2400 : return 2400UL;
|
||||
case ser4800 : return 4800UL;
|
||||
case ser19200 : return 19200UL;
|
||||
case ser38400 : return 38400UL;
|
||||
case ser57600 : return 57600UL;
|
||||
case ser115200 : return 115200UL;
|
||||
default : return 9600UL;
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
xComPortHandle xSerialPortInit( eCOMPort ePort, eBaud eWantedBaud, eParity eWantedParity, eDataBits eWantedDataBits, eStopBits eWantedStopBits, unsigned portBASE_TYPE uxBufferLength )
|
||||
{
|
||||
unsigned portSHORT usPort;
|
||||
xComPortHandle pxPort = NULL;
|
||||
unsigned portLONG ulBaudDiv;
|
||||
|
||||
/* BAUDDIV = ( Microprocessor Clock / Baud Rate ) / 16 */
|
||||
ulBaudDiv = ( configCPU_CLOCK_HZ / prvBaud( eWantedBaud ) ) / 16UL;
|
||||
|
||||
/* Only n, 8, 1 is supported so these parameters are not required for this
|
||||
port. */
|
||||
( void ) eWantedParity;
|
||||
( void ) eWantedDataBits;
|
||||
( void ) eWantedStopBits;
|
||||
|
||||
/* Currently only n,8,1 is supported. */
|
||||
|
||||
usPort = ( unsigned portSHORT ) ePort;
|
||||
|
||||
if( usPort < serMAX_PORTS )
|
||||
{
|
||||
pxPort = &( xPorts[ usPort ] );
|
||||
|
||||
portENTER_CRITICAL();
|
||||
{
|
||||
unsigned portSHORT usInWord;
|
||||
|
||||
/* Create the queues used by the com test task. */
|
||||
pxPort->xRxedChars = xQueueCreate( uxBufferLength, ( unsigned portBASE_TYPE ) sizeof( portCHAR ) );
|
||||
pxPort->xCharsForTx = xQueueCreate( uxBufferLength, ( unsigned portBASE_TYPE ) sizeof( portCHAR ) );
|
||||
|
||||
/* Create the test semaphore. This does nothing useful except test a feature of the scheduler. */
|
||||
vSemaphoreCreateBinary( pxPort->xTestSem );
|
||||
|
||||
/* There is no ISR here already to restore later. */
|
||||
setvect( ( portSHORT ) pxPort->usIRQVector, xISRs[ usPort ] );
|
||||
|
||||
usInWord = portINPUT_WORD( pxPort->usIntReg );
|
||||
usInWord &= ~serINTERRUPT_MASK;
|
||||
usInWord |= serINTERRUPT_PRIORITY;
|
||||
portOUTPUT_WORD( pxPort->usIntReg, usInWord );
|
||||
|
||||
portOUTPUT_WORD( pxPort->usBaudReg, ( unsigned portSHORT ) ulBaudDiv );
|
||||
portOUTPUT_WORD( pxPort->usCtrlReg, serENABLE_INTERRUPTS | serMODE | serENABLE_TX_MACHINES | serENABLE_RX_MACHINES );
|
||||
|
||||
portOUTPUT_WORD( pxPort->usStatusReg, serCLEAR_ALL_STATUS_BITS );
|
||||
}
|
||||
portEXIT_CRITICAL();
|
||||
}
|
||||
|
||||
return pxPort;
|
||||
} /*lint !e715 Some parameters are not used as only a subset of the serial port functionality is currently implemented. */
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialPutString( xComPortHandle pxPort, const portCHAR * const pcString, unsigned portSHORT usStringLength )
|
||||
{
|
||||
unsigned portSHORT usByte;
|
||||
portCHAR *pcNextChar;
|
||||
|
||||
pcNextChar = ( portCHAR * ) pcString;
|
||||
|
||||
for( usByte = 0; usByte < usStringLength; usByte++ )
|
||||
{
|
||||
xQueueSend( pxPort->xCharsForTx, pcNextChar, serDONT_BLOCK );
|
||||
pcNextChar++;
|
||||
}
|
||||
|
||||
vInterruptOn( pxPort, serTX_HOLD_EMPTY_INT );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, portCHAR *pcRxedChar, portTickType xBlockTime )
|
||||
{
|
||||
/* Get the next character from the buffer, note that this routine is only
|
||||
called having checked that the is (at least) one to get */
|
||||
if( xQueueReceive( pxPort->xRxedChars, pcRxedChar, xBlockTime ) )
|
||||
{
|
||||
return pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pdFALSE;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, portCHAR cOutChar, portTickType xBlockTime )
|
||||
{
|
||||
if( xQueueSend( pxPort->xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
||||
{
|
||||
return pdFAIL;
|
||||
}
|
||||
|
||||
vInterruptOn( pxPort, serTX_HOLD_EMPTY_INT );
|
||||
|
||||
return pdPASS;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
portBASE_TYPE xSerialWaitForSemaphore( xComPortHandle xPort )
|
||||
{
|
||||
const portTickType xBlockTime = ( portTickType ) 0xffff;
|
||||
|
||||
/* This function does nothing interesting, but test the
|
||||
semaphore from ISR mechanism. */
|
||||
return xSemaphoreTake( xPort->xTestSem, xBlockTime );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialClose( xComPortHandle xPort )
|
||||
{
|
||||
unsigned portSHORT usOutput;
|
||||
|
||||
/* Turn off the interrupts. We may also want to delete the queues and/or
|
||||
re-install the original ISR. */
|
||||
|
||||
portENTER_CRITICAL();
|
||||
{
|
||||
usOutput = portINPUT_WORD( xPort->usCtrlReg );
|
||||
|
||||
usOutput &= ~serENABLE_INTERRUPTS;
|
||||
usOutput &= ~serENABLE_TX_MACHINES;
|
||||
usOutput &= ~serENABLE_RX_MACHINES;
|
||||
portOUTPUT_WORD( xPort->usCtrlReg, usOutput );
|
||||
|
||||
usOutput = portINPUT_WORD( xPort->usIntReg );
|
||||
usOutput |= serINTERRUPT_MASK;
|
||||
portOUTPUT_WORD( xPort->usIntReg, usOutput );
|
||||
}
|
||||
portEXIT_CRITICAL();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
unsigned short usStatus;
|
||||
static portBASE_TYPE xComPortISR( xComPort * const pxPort )
|
||||
{
|
||||
unsigned portSHORT usStatusRegister;
|
||||
portCHAR cChar;
|
||||
portBASE_TYPE xTaskWokenByPost = pdFALSE, xAnotherTaskWokenByPost = pdFALSE, xTaskWokenByTx = pdFALSE;
|
||||
|
||||
/* NOTE: THIS IS NOT AN EFFICIENT ISR AS IT IS DESIGNED SOLELY TO TEST
|
||||
THE SCHEDULER FUNCTIONALITY. REAL APPLICATIONS SHOULD NOT USE THIS
|
||||
FUNCTION. */
|
||||
|
||||
usStatusRegister = portINPUT_WORD( pxPort->usStatusReg );
|
||||
|
||||
if( usStatusRegister & serRX_READY )
|
||||
{
|
||||
cChar = ( portCHAR ) portINPUT_WORD( pxPort->usRxReg );
|
||||
xTaskWokenByPost = xQueueSendFromISR( pxPort->xRxedChars, &cChar, xTaskWokenByPost );
|
||||
|
||||
/* Also release the semaphore - this does nothing interesting and is just a test. */
|
||||
xAnotherTaskWokenByPost = xSemaphoreGiveFromISR( pxPort->xTestSem, xAnotherTaskWokenByPost );
|
||||
}
|
||||
else if( pxPort->sTxInterruptOn && ( usStatusRegister & serTX_EMPTY ) )
|
||||
{
|
||||
if( xQueueReceiveFromISR( pxPort->xCharsForTx, &cChar, &xTaskWokenByTx ) == pdTRUE )
|
||||
{
|
||||
portOUTPUT_WORD( pxPort->usTxReg, ( unsigned portSHORT ) cChar );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Queue empty, nothing to send */
|
||||
vInterruptOff( pxPort, serTX_HOLD_EMPTY_INT );
|
||||
}
|
||||
}
|
||||
|
||||
serRESET_PIC( pxPort->usIRQVector );
|
||||
|
||||
/* If posting to the queue woke a task that was blocked on the queue we may
|
||||
want to switch to the woken task - depending on its priority relative to
|
||||
the task interrupted by this ISR. */
|
||||
if( xTaskWokenByPost || xAnotherTaskWokenByPost || xTaskWokenByTx)
|
||||
{
|
||||
return pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pdFALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue