Ethernet driver for CS8900? by PN
PN
Fri Aug 29 06:56:16 CDT 2003
Maybe you can use this.
-----------------------------------------------------
/** @file
/*
* Copyright (c) 2001, 2002 Leon Woestenberg
<leon.woestenberg@axon.tv>
* Copyright (c) 2001, 2002 Axon Digital Design B.V., The
Netherlands.
* 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 lwIP TCP/IP stack.
*
* Author: Leon Woestenberg <leon.woestenberg@axon.tv>
*
* This is a device driver for the Crystal Semiconductor
CS8900
* chip in combination with the lwIP stack.
*
* This is work under development. Please coordinate
changes
* and requests with Leon Woestenberg
<leon.woestenberg@axon.tv>
*
* The Swedish Institute of Computer Science and Adam
Dunkels
* are specifically granted permission to redistribute this
* source code under any conditions they seem fit.
*
* A quick function roadmap:
*
* cs8900_*() are low level, cs8900 hardware specific
functions.
* These are declared static in the device driver source
and
* SHOULD NOT need to be called from outside this source.
*
* cs8900if_*() are the lwIP network interface functions.
*
* cs8900_interrupt() is an early interrupt service
routine (ISR).
* It merely sets a flag to indicate the cs8900 needs
servicing.
* (This function MAY be tied to an interrupt vector, IF
present).
*
* cs8900_service() is the actual interrupt event service
routine.
* It must be called whenever the cs8900 needs servicing.
It MAY
* be polled safely (so, you do NOT NEED interrupt
support.)
*
* cs8900_init() sets up the cs8900, using its register
set. When
* using the driver on your particular hardware platform,
make sure
* the register setups match.
* Function is called from cs8900if_init().
*
* cs8900_input() transfers a received packet from the
chip.
* Function is called from cs8900if_input().
*
* cs8900_output() transfers a packet to the chip for
transmission.
* Function is called from cs8900if_output().
*
* cs8900if_init() initializes the lwIP network interface,
and
* calls cs8900_init() to initialize the hardware.
* Function is called from lwIP.
*
* cs8900if_service() is the service routine, which must
be called
* upon the need for service, or on a regular basis, in
order to
* service the Ethernet chip.
*
* cs8900if_input() calls cs8900_input() to get a received
packet
* and then forwards the packet to protocol(s) handler(s).
* Function is called from cs8900_service().
*
* cs8900if_output() resolves the hardware address, then
* calls cs8900_output() to transfer the packet.
* Function is called from lwIP.
*
* Future development:
*
* Split the generic Ethernet functionality (a lot of the
* cs8900if_*() functions) and the actual cs8900a
dependencies.
*
* Enhance the interrupt handler to service the Ethernet
* chip (to decrease latency); support early packet
* inspection (during reception) to early drop unwanted
* packets, minimize chip buffer use and maximize
throughput.
*
* Statistics gathering, currently under development.
* SNMP support, currently under development.
*
*/
#include "lwip/debug.h"
#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/mem.h"
#include "lwip/pbuf.h"
#include "lwip/stats.h"
#include "lwip/sys.h"
#include "netif/etharp.h"
#if 0
// include some debugging help
# define DBG_LEVEL 1
# include "leds.h"
# include "display.h"
//# include "page.h"
# define LED_NEED_SERVICE LED_FP1
#else
// no debugging
# define leds_on()
# define leds_off()
#endif
#include "cs8900if.h"
#if LWIP_SNMP > 0
# include "snmp.h"
#endif
// Define those to better describe your network interface
#define IFNAME0 'e'
#define IFNAME1 'n'
static const struct eth_addr ethbroadcast =
{{0xffU,0xffU,0xffU,0xffU,0xffU,0xffU}};
// Forward declarations
static err_t cs8900_output(struct netif *netif, struct
pbuf *p);
static struct pbuf *cs8900_input(struct netif *netif);
static void cs8900_service(struct netif *netif);
static u32_t cs8900_chksum(void *dataptr, int len);
// Define these to match your hardware setup
#define MEM_BASE 0x00E000
#define IO_BASE 0x800
#define INT_NR 0x00
#define RXTXREG *((volatile u16_t *)(MEM_BASE + IO_BASE))
#define TXCMD *((volatile u16_t *)(MEM_BASE + IO_BASE +
0x04))
#define TXLENGTH *((volatile u16_t *)(MEM_BASE + IO_BASE +
0x06))
#define ISQ *((volatile u16_t *)(MEM_BASE + IO_BASE +
0x08))
#define PACKETPP *((volatile u16_t *)(MEM_BASE + IO_BASE +
0x0A))
#define PPDATA *((volatile u16_t *)(MEM_BASE + IO_BASE +
0x0C))
// CS8900 PacketPage register offsets
#define CS_PP_EISA 0x0000 // EISA
Registration number of CS8900
#define CS_PP_PRODID 0x0002 // Product ID
Number
#define CS_PP_IOBASE 0x0020 // I/O Base
Address
#define CS_PP_INTNUM 0x0022 // Interrupt
number (0,1,2, or 3)
#define CS_PP_RXCFG 0x0102 // Receiver
Configuration
#define CS_PP_RXCTL 0x0104 // Receiver
Control
#define CS_PP_TXCFG 0x0106 // Transmit
Configuration
#define CS_PP_BUFCFG 0x010A // Buffer
Configuration
#define CS_PP_LINECTL 0x0112 // Line Control
Register offset
#define CS_PP_SELFCTL 0x0114 // Self Control
#define CS_PP_BUSCTL 0x0116 // Bus Control
#define CS_PP_TESTCTL 0x0118 // Test Control
#define CS_PP_ISQ 0x0120 // Interrupt
status queue
#define CS_PP_RXEVENT 0x0124 // Receiver
Event
#define CS_PP_TX_EVENT 0x0128 // Transmitter
Event
#define CS_PP_BUF_EVENT 0x012C // Buffer Event
#define CS_PP_RXMISS 0x0130 // Receiver
Miss Counter
#define CS_PP_TXCOL 0x0132 // Transmit
Collision Counter
#define CS_PP_LINESTATUS 0x0134 // Line Status
#define CS_PP_SELFTEST 0x0136 // Self Status
#define CS_PP_BUSSTATUS 0x0138 // Bus Status
#define CS_PP_TXCMD 0x0144 // Transmit
Command Request
#define CS_PP_TXLEN 0x0146 // Transmit
Length
#define CS_PP_IA1 0x0158 // Individual
Address (IA)
#define CS_PP_IA2 0x015A // Individual
Address (IA)
#define CS_PP_IA3 0x015C // Individual
Address (IA)
#define CS_PP_RXSTATUS 0x0400 // Receive
Status
#define CS_PP_RXLEN 0x0402 // Receive
Length
#define CS_PP_RXFRAME 0x0404 // Receive
Frame Location
#define CS_PP_TXFRAME 0x0A00 // Transmit
Frame Location
// removed interrupt from library
#if 0
// hardware interrupt vector handler
_interrupt(0x18) void cs8900_interrupt(void)
{
struct cs8900if *cs8900if = cs8900if_netif->state;
// network interface is configured?
if (cs8900if != NULL)
{
// chip needs service
cs8900if->needs_service = 1;
#if (CS8900_STATS > 0)
cs8900if->interrupts++;
#endif
}
#ifdef LED_NEED_SERVICE
leds_on(LED_NEED_SERVICE);
#endif
}
#endif
// cs8900_init()
//
// initializes the CS8900A chip
//
static void cs8900_init(struct netif *netif)
{