forked from Imagelibrary/rtems
2007-04-25 Ray Xu <xr@trasin.net>
* Makefile.am, README, bsp_specs, configure.ac, console/lpc22xx_uart.h, console/uart.c, include/bsp.h, network/network.c: New (Initial submission).
This commit is contained in:
5
c/src/lib/libbsp/arm/rtl22xx/ChangeLog
Normal file
5
c/src/lib/libbsp/arm/rtl22xx/ChangeLog
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
2007-04-25 Ray Xu <xr@trasin.net>
|
||||||
|
|
||||||
|
* Makefile.am, README, bsp_specs, configure.ac,
|
||||||
|
console/lpc22xx_uart.h, console/uart.c, include/bsp.h,
|
||||||
|
network/network.c: New (Initial submission).
|
||||||
116
c/src/lib/libbsp/arm/rtl22xx/Makefile.am
Normal file
116
c/src/lib/libbsp/arm/rtl22xx/Makefile.am
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
##
|
||||||
|
## $Id$
|
||||||
|
##
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I ../../../../aclocal
|
||||||
|
|
||||||
|
include $(top_srcdir)/../../../../automake/compile.am
|
||||||
|
include $(top_srcdir)/../../bsp.am
|
||||||
|
|
||||||
|
dist_project_lib_DATA = bsp_specs
|
||||||
|
|
||||||
|
include_HEADERS = include/bsp.h
|
||||||
|
include_HEADERS += include/tm27.h
|
||||||
|
|
||||||
|
nodist_include_HEADERS = include/bspopts.h
|
||||||
|
DISTCLEANFILES = include/bspopts.h
|
||||||
|
|
||||||
|
noinst_PROGRAMS =
|
||||||
|
|
||||||
|
nodist_include_HEADERS += ../../shared/include/coverhd.h
|
||||||
|
|
||||||
|
EXTRA_DIST = start/start.S
|
||||||
|
start.$(OBJEXT): start/start.S
|
||||||
|
$(CPPASCOMPILE) -DASM -o $@ -c $<
|
||||||
|
project_lib_DATA = start.$(OBJEXT)
|
||||||
|
|
||||||
|
dist_project_lib_DATA += startup/linkcmds
|
||||||
|
|
||||||
|
noinst_PROGRAMS += startup.rel
|
||||||
|
include_HEADERS += ../../arm/shared/comm/uart.h
|
||||||
|
startup_rel_SOURCES = ../../shared/bsplibc.c ../../shared/bsppost.c \
|
||||||
|
startup/bspstart.c startup/exit.c ../../shared/bootcard.c \
|
||||||
|
../../shared/main.c ../../shared/sbrk.c \
|
||||||
|
../../shared/gnatinstallhandler.c
|
||||||
|
startup_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
startup_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
noinst_PROGRAMS += console.rel
|
||||||
|
console_rel_SOURCES = console/uart.c ../../shared/console.c
|
||||||
|
console_rel_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
console_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if HAS_NETWORKING
|
||||||
|
network_CPPFLAGS = -D__INSIDE_RTEMS_BSD_TCPIP_STACK__
|
||||||
|
noinst_PROGRAMS += network.rel
|
||||||
|
network_rel_SOURCES = network/network.c
|
||||||
|
network_rel_CPPFLAGS = $(AM_CPPFLAGS) $(network_CPPFLAGS)
|
||||||
|
network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
noinst_LIBRARIES = libbsp.a
|
||||||
|
libbsp_a_SOURCES =
|
||||||
|
libbsp_a_LIBADD = startup.rel console.rel
|
||||||
|
if HAS_NETWORKING
|
||||||
|
libbsp_a_LIBADD += network.rel
|
||||||
|
endif
|
||||||
|
|
||||||
|
libbsp_a_LIBADD += \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/clock.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/timer.rel \
|
||||||
|
../../../libcpu/@RTEMS_CPU@/@RTEMS_CPU_MODEL@/irq.rel
|
||||||
|
|
||||||
|
all-local: $(PREINSTALL_FILES) $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
PREINSTALL_DIRS =
|
||||||
|
PREINSTALL_FILES =
|
||||||
|
TMPINSTALL_FILES =
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/$(dirstamp):
|
||||||
|
@$(mkdir_p) $(PROJECT_INCLUDE)
|
||||||
|
@: > $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/$(dirstamp):
|
||||||
|
@$(mkdir_p) $(PROJECT_LIB)
|
||||||
|
@: > $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/tm27.h: include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h
|
||||||
|
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT)
|
||||||
|
TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT)
|
||||||
|
|
||||||
|
$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds
|
||||||
|
PREINSTALL_FILES += $(PROJECT_LIB)/linkcmds
|
||||||
|
|
||||||
|
|
||||||
|
CLEANFILES = $(PREINSTALL_FILES)
|
||||||
|
DISTCLEANFILES += $(PREINSTALL_DIRS)
|
||||||
|
CLEANFILES += $(TMPINSTALL_FILES)
|
||||||
|
|
||||||
|
include $(top_srcdir)/../../../../automake/local.am
|
||||||
6
c/src/lib/libbsp/arm/rtl22xx/README
Normal file
6
c/src/lib/libbsp/arm/rtl22xx/README
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
RTEMS bsp for Philips's ARM processor
|
||||||
|
This BSP is design for Philips's LPC2210/LPC2212/LPC2214/LPC2290/LPC2294 (LPC22xx) serial ARM processor.
|
||||||
|
Philphs's LPC22xx ARM processor got an ARM7TDMI-S core, and can run at 60MHz. It has an external memory bus, and peripherals like UART, I2C, SPI, ADC and etc. Some of them got on chip flash (256k) and CAN.
|
||||||
|
The board used to develop the board is compatible with LPC-E2214/LPC-E2294 boards from http://www.olimex.com. The board got a 256K SDRAM and two serial ports.
|
||||||
|
The license and distribution terms for this file may be found in the file LICENSE in this distribution or at http://www.rtems.com/license/LICENSE
|
||||||
12
c/src/lib/libbsp/arm/rtl22xx/bsp_specs
Normal file
12
c/src/lib/libbsp/arm/rtl22xx/bsp_specs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
%rename endfile old_endfile
|
||||||
|
%rename startfile old_startfile
|
||||||
|
%rename link old_link
|
||||||
|
|
||||||
|
*startfile:
|
||||||
|
%{!qrtems: %(old_startfile)} %{qrtems: \
|
||||||
|
%{!qrtems_debug: start.o%s crtbegin.o%s} \
|
||||||
|
%{qrtems_debug: start_g.o%s crtbegin.o%s}}
|
||||||
|
|
||||||
|
*link:
|
||||||
|
%{!qrtems: %(old_link)} %{qrtems: -Qy -dp -Bstatic -N -e _start}
|
||||||
|
|
||||||
23
c/src/lib/libbsp/arm/rtl22xx/configure.ac
Normal file
23
c/src/lib/libbsp/arm/rtl22xx/configure.ac
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
## Process this file with autoconf to produce a configure script.
|
||||||
|
##
|
||||||
|
## $Id$
|
||||||
|
|
||||||
|
AC_PREREQ(2.59)
|
||||||
|
AC_INIT([rtems-c-src-lib-libbsp-arm-rtl22xx],[_RTEMS_VERSION],[rtems-bugs@rtems.com])
|
||||||
|
AC_CONFIG_SRCDIR([bsp_specs])
|
||||||
|
RTEMS_TOP(../../../../../..)
|
||||||
|
|
||||||
|
RTEMS_CANONICAL_TARGET_CPU
|
||||||
|
AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.9])
|
||||||
|
RTEMS_BSP_CONFIGURE
|
||||||
|
|
||||||
|
RTEMS_PROG_CC_FOR_TARGET([-fasm])
|
||||||
|
RTEMS_CANONICALIZE_TOOLS
|
||||||
|
RTEMS_PROG_CCAS
|
||||||
|
|
||||||
|
RTEMS_CHECK_NETWORKING
|
||||||
|
AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes")
|
||||||
|
|
||||||
|
# Explicitly list all Makefiles here
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_OUTPUT
|
||||||
88
c/src/lib/libbsp/arm/rtl22xx/console/lpc22xx_uart.h
Normal file
88
c/src/lib/libbsp/arm/rtl22xx/console/lpc22xx_uart.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*Define for LPC22xx*/
|
||||||
|
#ifndef UART_H
|
||||||
|
#define UART_H
|
||||||
|
|
||||||
|
#define FIFODEEP 16
|
||||||
|
|
||||||
|
#define BD115200 115200
|
||||||
|
#define BD38400 38400
|
||||||
|
#define BD9600 9600
|
||||||
|
|
||||||
|
#define CR 0x0D
|
||||||
|
#define LF 0x0A
|
||||||
|
#define U0_PINSEL (0x00000005) /* PINSEL0 Value for UART0 */
|
||||||
|
#define U0_PINMASK (0x0000000F) /* PINSEL0 Mask for UART0 */
|
||||||
|
#define U1_PINSEL (0x00050000) /* PINSEL0 Value for UART1 */
|
||||||
|
#define U1_PINMASK (0x000F0000) /* PINSEL0 Mask for UART1 */
|
||||||
|
|
||||||
|
/* Uart line control register bit descriptions */
|
||||||
|
#define LCR_WORDLENTH_BIT 0
|
||||||
|
#define LCR_STOPBITSEL_BIT 2
|
||||||
|
#define LCR_PARITYENBALE_BIT 3
|
||||||
|
#define LCR_PARITYSEL_BIT 4
|
||||||
|
#define LCR_BREAKCONTROL_BIT 6
|
||||||
|
#define LCR_DLAB_BIT 7
|
||||||
|
// Line Control Register bit definitions
|
||||||
|
#define ULCR_CHAR_5 (0 << 0) // 5-bit character length
|
||||||
|
#define ULCR_CHAR_6 (1 << 0) // 6-bit character length
|
||||||
|
#define ULCR_CHAR_7 (2 << 0) // 7-bit character length
|
||||||
|
#define ULCR_CHAR_8 (3 << 0) // 8-bit character length
|
||||||
|
#define ULCR_STOP_0 (0 << 2) // no stop bits
|
||||||
|
#define ULCR_STOP_1 (1 << 2) // 1 stop bit
|
||||||
|
#define ULCR_PAR_NO (0 << 3) // No Parity
|
||||||
|
#define ULCR_PAR_ODD (1 << 3) // Odd Parity
|
||||||
|
#define ULCR_PAR_EVEN (3 << 3) // Even Parity
|
||||||
|
#define ULCR_PAR_MARK (5 << 3) // MARK "1" Parity
|
||||||
|
#define ULCR_PAR_SPACE (7 << 3) // SPACE "0" Paruty
|
||||||
|
#define ULCR_BREAK_ENABLE (1 << 6) // Output BREAK line condition
|
||||||
|
#define ULCR_DLAB_ENABLE (1 << 7) // Enable Divisor Latch Access
|
||||||
|
// Modem Control Register bit definitions
|
||||||
|
#define UMCR_DTR (1 << 0) // Data Terminal Ready
|
||||||
|
#define UMCR_RTS (1 << 1) // Request To Send
|
||||||
|
#define UMCR_LB (1 << 4) // Loopback
|
||||||
|
|
||||||
|
// Line Status Register bit definitions
|
||||||
|
#define ULSR_RDR (1 << 0) // Receive Data Ready
|
||||||
|
#define ULSR_OE (1 << 1) // Overrun Error
|
||||||
|
#define ULSR_PE (1 << 2) // Parity Error
|
||||||
|
#define ULSR_FE (1 << 3) // Framing Error
|
||||||
|
#define ULSR_BI (1 << 4) // Break Interrupt
|
||||||
|
#define ULSR_THRE (1 << 5) // Transmit Holding Register Empty
|
||||||
|
#define ULSR_TEMT (1 << 6) // Transmitter Empty
|
||||||
|
#define ULSR_RXFE (1 << 7) // Error in Receive FIFO
|
||||||
|
#define ULSR_ERR_MASK 0x1E
|
||||||
|
|
||||||
|
// Modem Status Register bit definitions
|
||||||
|
#define UMSR_DCTS (1 << 0) // Delta Clear To Send
|
||||||
|
#define UMSR_DDSR (1 << 1) // Delta Data Set Ready
|
||||||
|
#define UMSR_TERI (1 << 2) // Trailing Edge Ring Indicator
|
||||||
|
#define UMSR_DDCD (1 << 3) // Delta Data Carrier Detect
|
||||||
|
#define UMSR_CTS (1 << 4) // Clear To Send
|
||||||
|
#define UMSR_DSR (1 << 5) // Data Set Ready
|
||||||
|
#define UMSR_RI (1 << 6) // Ring Indicator
|
||||||
|
#define UMSR_DCD (1 << 7) // Data Carrier Detect
|
||||||
|
|
||||||
|
/* Uart Interrupt Identification */
|
||||||
|
#define IIR_RSL 0x3
|
||||||
|
#define IIR_RDA 0x2
|
||||||
|
#define IIR_CTI 0x6
|
||||||
|
#define IIR_THRE 0x1
|
||||||
|
|
||||||
|
/* Uart Interrupt Enable Type*/
|
||||||
|
#define IER_RBR 0x1
|
||||||
|
#define IER_THRE 0x2
|
||||||
|
#define IER_RLS 0x4
|
||||||
|
|
||||||
|
/* Uart Receiver Errors*/
|
||||||
|
#define RC_FIFO_OVERRUN_ERR 0x1
|
||||||
|
#define RC_OVERRUN_ERR 0x2
|
||||||
|
#define RC_PARITY_ERR 0x4
|
||||||
|
#define RC_FRAMING_ERR 0x8
|
||||||
|
#define RC_BREAK_IND 0x10
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UART0 = 0,
|
||||||
|
UART1
|
||||||
|
} LPC_UartChanel_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
374
c/src/lib/libbsp/arm/rtl22xx/console/uart.c
Normal file
374
c/src/lib/libbsp/arm/rtl22xx/console/uart.c
Normal file
@@ -0,0 +1,374 @@
|
|||||||
|
/*
|
||||||
|
* console driver for RTL22xx UARTs
|
||||||
|
*
|
||||||
|
* This driver uses the shared console driver in
|
||||||
|
* ...../libbsp/shared/console.c
|
||||||
|
*
|
||||||
|
* If you want the driver to be interrupt driven, you
|
||||||
|
* need to write the ISR, and in the ISR insert the
|
||||||
|
* chars into termios's queue.
|
||||||
|
* Copyright (c) By ray
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
*
|
||||||
|
* http://www.OARcorp.com/rtems/license.html.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <bsp.h> /* Must be before libio.h */
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <rtems/bspIo.h>
|
||||||
|
|
||||||
|
/* Put the CPU (or UART) specific header file #include here */
|
||||||
|
#include <lpc22xx.h>
|
||||||
|
#include "lpc22xx_uart.h"
|
||||||
|
|
||||||
|
#include <libchip/serial.h>
|
||||||
|
#include <libchip/sersupp.h>
|
||||||
|
|
||||||
|
/* How many serial ports? */
|
||||||
|
#define NUM_DEVS 1
|
||||||
|
|
||||||
|
int uart_poll_read(int minor);
|
||||||
|
|
||||||
|
int dbg_dly;
|
||||||
|
|
||||||
|
/* static function prototypes */
|
||||||
|
static int uart_first_open(int major, int minor, void *arg);
|
||||||
|
static int uart_last_close(int major, int minor, void *arg);
|
||||||
|
static int uart_read(int minor);
|
||||||
|
static int uart_write(int minor, const char *buf, int len);
|
||||||
|
static void uart_init(int minor);
|
||||||
|
static void uart_write_polled(int minor, char c);
|
||||||
|
static int uart_set_attributes(int minor, const struct termios *t);
|
||||||
|
|
||||||
|
/* These are used by code in console.c */
|
||||||
|
unsigned long Console_Port_Count = NUM_DEVS;
|
||||||
|
console_data Console_Port_Data[NUM_DEVS];
|
||||||
|
|
||||||
|
/* rtems console uses the following minor number */
|
||||||
|
rtems_device_minor_number Console_Port_Minor = 0;
|
||||||
|
|
||||||
|
/* Pointers to functions for handling the UART. */
|
||||||
|
console_fns uart_fns =
|
||||||
|
{
|
||||||
|
libchip_serial_default_probe,
|
||||||
|
uart_first_open,
|
||||||
|
uart_last_close,
|
||||||
|
uart_read,
|
||||||
|
uart_write,
|
||||||
|
uart_init,
|
||||||
|
uart_write_polled, /* not used in this driver */
|
||||||
|
uart_set_attributes,
|
||||||
|
FALSE /* TRUE if interrupt driven, FALSE if not. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There's one item in array for each UART.
|
||||||
|
*
|
||||||
|
* Some of these fields are marked "NOT USED". They are not used
|
||||||
|
* by console.c, but may be used by drivers in libchip
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
console_tbl Console_Port_Tbl[] = {
|
||||||
|
{
|
||||||
|
"/dev/console", /* sDeviceName */
|
||||||
|
SERIAL_CUSTOM, /* deviceType */
|
||||||
|
&uart_fns, /* pDeviceFns */
|
||||||
|
NULL, /* deviceProbe */
|
||||||
|
NULL, /* pDeviceFlow */
|
||||||
|
0, /* ulMargin - NOT USED */
|
||||||
|
0, /* ulHysteresis - NOT USED */
|
||||||
|
NULL, /* pDeviceParams */
|
||||||
|
0, /* ulCtrlPort1 - NOT USED */
|
||||||
|
0, /* ulCtrlPort2 - NOT USED */
|
||||||
|
0, /* ulDataPort - NOT USED */
|
||||||
|
NULL, /* getRegister - NOT USED */
|
||||||
|
NULL, /* setRegister - NOT USED */
|
||||||
|
NULL, /* getData - NOT USED */
|
||||||
|
NULL, /* setData - NOT USED */
|
||||||
|
0, /* ulClock - NOT USED */
|
||||||
|
0 /* ulIntVector - NOT USED */
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
"/dev/com1", /* sDeviceName */
|
||||||
|
SERIAL_CUSTOM, /* deviceType */
|
||||||
|
&uart_fns, /* pDeviceFns */
|
||||||
|
NULL, /* deviceProbe */
|
||||||
|
NULL, /* pDeviceFlow */
|
||||||
|
0, /* ulMargin - NOT USED */
|
||||||
|
0, /* ulHysteresis - NOT USED */
|
||||||
|
NULL, /* pDeviceParams */
|
||||||
|
0, /* ulCtrlPort1 - NOT USED */
|
||||||
|
0, /* ulCtrlPort2 - NOT USED */
|
||||||
|
0, /* ulDataPort - NOT USED */
|
||||||
|
NULL, /* getRegister - NOT USED */
|
||||||
|
NULL, /* setRegister - NOT USED */
|
||||||
|
NULL, /* getData - NOT USED */
|
||||||
|
NULL, /* setData - NOT USED */
|
||||||
|
0, /* ulClock - NOT USED */
|
||||||
|
0 /* ulIntVector - NOT USED */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
/* Functions called via termios callbacks (i.e. the ones in uart_fns */
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is called the first time each device is opened. If the driver
|
||||||
|
* is interrupt driven, you should enable interrupts here. Otherwise,
|
||||||
|
* it's probably safe to do nothing.
|
||||||
|
*
|
||||||
|
* Since micromonitor already set up the UART, we do nothing.
|
||||||
|
*/
|
||||||
|
static int uart_first_open(int major, int minor, void *arg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is called the last time each device is closed. If the driver
|
||||||
|
* is interrupt driven, you should disable interrupts here. Otherwise,
|
||||||
|
* it's probably safe to do nothing.
|
||||||
|
*/
|
||||||
|
static int uart_last_close(int major, int minor, void *arg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read one character from UART.
|
||||||
|
*
|
||||||
|
* Return -1 if there's no data, otherwise return
|
||||||
|
* the character in lowest 8 bits of returned int.
|
||||||
|
*/
|
||||||
|
static int uart_read(int minor)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
|
||||||
|
if (minor == 0) {
|
||||||
|
if(U0LSR & ULSR_RDR) {
|
||||||
|
c = U0RBR;
|
||||||
|
return c;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (minor == 1) {
|
||||||
|
if (U1LSR & ULSR_RDR) {
|
||||||
|
c = U1RBR;
|
||||||
|
return c;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printk("Unknown console minor number: %d\n", minor);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write buffer to UART
|
||||||
|
*
|
||||||
|
* return 1 on success, -1 on error
|
||||||
|
*/
|
||||||
|
static int uart_write(int minor, const char *buf, int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (minor == 0) {
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
while(!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/
|
||||||
|
continue; /* also either WDOG() or swap()*/
|
||||||
|
U0THR = (char) buf[i];
|
||||||
|
}
|
||||||
|
} else if (minor == 1) {
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
while(!(U0LSR & ULSR_THRE)) /* wait for TX buffer to empty*/
|
||||||
|
continue; /* also either WDOG() or swap()*/
|
||||||
|
U0THR = (char) buf[i];
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
printk("Unknown console minor number: %d\n", minor);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Set up the UART. */
|
||||||
|
static void uart_init(int minor)
|
||||||
|
{
|
||||||
|
#if 0 //init will be done in bspstart.c
|
||||||
|
int baud=6;
|
||||||
|
int mode =0x03;
|
||||||
|
if(minor==0){
|
||||||
|
// set port pins for UART0
|
||||||
|
PINSEL0 = (PINSEL0 & ~U0_PINMASK) | U0_PINSEL;
|
||||||
|
|
||||||
|
U0IER = 0x00; // disable all interrupts
|
||||||
|
|
||||||
|
// set the baudrate
|
||||||
|
U0LCR = 1<<7; // select divisor latches
|
||||||
|
U0DLL = (uint8_t)baud; // set for baud low byte
|
||||||
|
U0DLM = (uint8_t)(baud >> 8); // set for baud high byte
|
||||||
|
|
||||||
|
// set the number of characters and other
|
||||||
|
// user specified operating parameters
|
||||||
|
U0LCR = (mode & ~ULCR_DLAB_ENABLE);
|
||||||
|
U0FCR = mode>>8; /*fifo mode*/
|
||||||
|
|
||||||
|
// set port pins for UART1
|
||||||
|
PINSEL0 = (PINSEL0 & ~U1_PINMASK) | U1_PINSEL;
|
||||||
|
|
||||||
|
U1IER = 0x00; // disable all interrupts
|
||||||
|
}else if(minor==1){
|
||||||
|
// set the baudrate
|
||||||
|
U1LCR = ULCR_DLAB_ENABLE; // select divisor latches
|
||||||
|
U1DLL = (uint8_t)baud; // set for baud low byte
|
||||||
|
U1DLM = (uint8_t)(baud >> 8); // set for baud high byte
|
||||||
|
|
||||||
|
// set the number of characters and other
|
||||||
|
// user specified operating parameters
|
||||||
|
U1LCR = (mode & ~ULCR_DLAB_ENABLE);
|
||||||
|
U1FCR = mode>>8;/*fifo mode*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* I'm not sure this is needed for the shared console driver. */
|
||||||
|
static void uart_write_polled(int minor, char c)
|
||||||
|
{
|
||||||
|
uart_write(minor, &c, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is for setting baud rate, bits, etc. */
|
||||||
|
static int uart_set_attributes(int minor, const struct termios *t)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************/
|
||||||
|
/*
|
||||||
|
* The following functions are not used by TERMIOS, but other RTEMS
|
||||||
|
* functions use them instead.
|
||||||
|
*/
|
||||||
|
/***********************************************************************/
|
||||||
|
/*
|
||||||
|
* Read from UART. This is used in the exit code, and can't
|
||||||
|
* rely on interrupts.
|
||||||
|
*/
|
||||||
|
int uart_poll_read(int minor)
|
||||||
|
{
|
||||||
|
return uart_read(minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write a character to the console. This is used by printk() and
|
||||||
|
* maybe other low level functions. It should not use interrupts or any
|
||||||
|
* RTEMS system calls. It needs to be very simple
|
||||||
|
*/
|
||||||
|
static void _BSP_put_char( char c ) {
|
||||||
|
uart_write_polled(0, c);
|
||||||
|
if (c == '\n') {
|
||||||
|
uart_write_polled(0, '\r');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BSP_output_char_function_type BSP_output_char = _BSP_put_char;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* init USART 0<><30>8 bit, 1 Stop,No checkout, BPS115200
|
||||||
|
****************************************************************************/
|
||||||
|
void UART0_Ini(void)
|
||||||
|
{
|
||||||
|
long Fdiv;
|
||||||
|
int i;
|
||||||
|
PINSEL0 = 0x00000005; // I/O to UART0
|
||||||
|
U0LCR = 0x83; // DLAB = 1
|
||||||
|
Fdiv = (Fpclk >>4) / UART_BPS; // configure BPS
|
||||||
|
U0DLM = Fdiv/256;
|
||||||
|
U0DLL = Fdiv%256;
|
||||||
|
U0LCR = 0x03;
|
||||||
|
|
||||||
|
for(i=0;i<10;i++){
|
||||||
|
U0THR = 67; //send a C to see if is OK
|
||||||
|
while( (U0LSR&0x40)==0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*Send a Byte
|
||||||
|
****************************************************************************/
|
||||||
|
void UART0_SendByte(char data)
|
||||||
|
{
|
||||||
|
U0THR = data;
|
||||||
|
|
||||||
|
while( (U0LSR&0x40)==0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
*Send a string
|
||||||
|
****************************************************************************/
|
||||||
|
void UART0_SendStr(char const *str)
|
||||||
|
{ while(1)
|
||||||
|
{ if( *str == '\0' ) break;
|
||||||
|
UART0_SendByte(*str++); // Send the char
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_printk(char *dg_str)
|
||||||
|
{
|
||||||
|
UART0_SendStr(dg_str);
|
||||||
|
UART0_SendStr("\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void printi(unsigned long value)
|
||||||
|
{
|
||||||
|
static char istring[9]={0,0,0,0,0,0,0,0,0};
|
||||||
|
static char tmp[9]={0,0,0,0,0,0,0,0,0};
|
||||||
|
char *sp;
|
||||||
|
char *tp = tmp;
|
||||||
|
|
||||||
|
long i;
|
||||||
|
unsigned long v = value;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
for(index=0;index<9;index++)
|
||||||
|
istring[index]=tmp[index]=0x0;
|
||||||
|
|
||||||
|
while (v || tp == tmp)
|
||||||
|
{
|
||||||
|
i = v % 16;
|
||||||
|
v = v / 16;
|
||||||
|
if (i < 10)
|
||||||
|
*tp++ = i+'0';
|
||||||
|
else
|
||||||
|
*tp++ = i + 'a' - 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
sp = istring;
|
||||||
|
while (tp > tmp)
|
||||||
|
*sp++ = *--tp;
|
||||||
|
|
||||||
|
tp=tmp;
|
||||||
|
sp=istring;
|
||||||
|
debug_printk(istring);
|
||||||
|
|
||||||
|
}
|
||||||
152
c/src/lib/libbsp/arm/rtl22xx/include/bsp.h
Normal file
152
c/src/lib/libbsp/arm/rtl22xx/include/bsp.h
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* Philips LPC22XX BSP header file
|
||||||
|
*
|
||||||
|
* by Ray,Xu
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
*
|
||||||
|
* http://www.rtems.com/license/LICENSE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
#ifndef _BSP_H
|
||||||
|
#define _BSP_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <bspopts.h>
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/iosupp.h>
|
||||||
|
#include <rtems/console.h>
|
||||||
|
#include <rtems/clockdrv.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define CONFIG_ARM_CLK 60000000L
|
||||||
|
/* cclk=cco/(2*P) */
|
||||||
|
/* cco = cclk*2*P */
|
||||||
|
|
||||||
|
#define LPC22xx_Fcclk CONFIG_ARM_CLK /* system clk frequecy,<=60Mhz, defined in system configuration */
|
||||||
|
|
||||||
|
/* Fcco 156M~320Mhz*/
|
||||||
|
#define LPC22xx_Fcclk CONFIG_ARM_CLK /* system clk frequecy,<=60Mhz, defined in system configuration */
|
||||||
|
#define LPC22xx_Fcco LPC22xx_Fcclk * 4
|
||||||
|
#define LPC22xx_Fpclk (LPC22xx_Fcclk /4) *1 /*VPB clk frequency,1,1/2,1/4 times of Fcclk */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Fcclk range: 10MHz ~ MCU allowed frequency */
|
||||||
|
#define Fcclk_MIN 10000000L
|
||||||
|
#define Fcclk_MAX 60000000L
|
||||||
|
|
||||||
|
/* Fcco range: 156MHz ~ 320MHz */
|
||||||
|
#define Fcco_MIN 156000000L
|
||||||
|
#define Fcco_MAX 320000000L
|
||||||
|
|
||||||
|
#define PLLFEED_DATA1 0xAA
|
||||||
|
#define PLLFEED_DATA2 0x55
|
||||||
|
|
||||||
|
/* PLL PLLCON register bit descriptions */
|
||||||
|
#define PLLCON_ENABLE_BIT 0
|
||||||
|
#define PLLCON_CONNECT_BIT 1
|
||||||
|
|
||||||
|
/* PLL PLLSTAT register bit descriptions */
|
||||||
|
#define PLLSTAT_ENABLE_BIT 8
|
||||||
|
#define PLLSTAT_CONNECT_BIT 9
|
||||||
|
#define PLLSTAT_LOCK_BIT 10
|
||||||
|
|
||||||
|
/* PM Peripheral Type */
|
||||||
|
#define PC_TIMER0 0x2
|
||||||
|
#define PC_TIMER1 0x4
|
||||||
|
#define PC_UART0 0x8
|
||||||
|
#define PC_UART1 0x10
|
||||||
|
#define PC_PWM0 0x20
|
||||||
|
#define PC_I2C 0x80
|
||||||
|
#define PC_SPI0 0x100
|
||||||
|
#define PC_RTC 0x200
|
||||||
|
|
||||||
|
// OSC [Hz]
|
||||||
|
#define FOSC 11059200
|
||||||
|
// Core clk [Hz]
|
||||||
|
#define FCCLK FOSC<<2
|
||||||
|
/**
|
||||||
|
* help file
|
||||||
|
*/
|
||||||
|
/* ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>, Fosc<73><63>Fcclk<6C><6B>Fcco<63><6F>Fpclk<6C><6B><EFBFBD>붨<EFBFBD><EBB6A8>*/
|
||||||
|
#define Fosc 11059200 //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,10MHz~25MHz<48><7A>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>һ<EFBFBD><D2BB>
|
||||||
|
#define Fcclk (Fosc << 2) //ϵͳƵ<CDB3>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ΪFosc<73><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1~32)<29><><EFBFBD><EFBFBD><=60MHZ
|
||||||
|
#define Fcco (Fcclk <<2) //CCOƵ<4F>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ΪFcclk<6C><6B>2<EFBFBD><32>4<EFBFBD><34>8<EFBFBD><38>16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΧΪ156MHz~320MHz
|
||||||
|
#define Fpclk (Fcclk >>2) * 1 //VPBʱ<42><CAB1>Ƶ<EFBFBD>ʣ<EFBFBD>ֻ<EFBFBD><D6BB>Ϊ(Fcclk / 4)<29><>1 ~ 4<><34>
|
||||||
|
#define M Fcclk / Fosc;
|
||||||
|
#define P_min Fcco_MIN / (2*Fcclk) + 1;
|
||||||
|
#define P_max Fcco_MAX / (2*Fcclk);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define UART_BPS 115200
|
||||||
|
|
||||||
|
// Time Precision time [us]
|
||||||
|
#define TIMER_PRECISION 10
|
||||||
|
|
||||||
|
// I2C Speed [bit/s]
|
||||||
|
#define I2CSPEED 20000 // 20 Kbit/s
|
||||||
|
|
||||||
|
// Uarts buffers size
|
||||||
|
#define RXBUFSIZE 32
|
||||||
|
#define TXBUFSIZE 32
|
||||||
|
|
||||||
|
// SPI Speed [bit/s]
|
||||||
|
#define SPISPEED 1500000 // 1.5 Mbit/s
|
||||||
|
// SPI EEPROM CS pin (SSEL is not suitable for CS, because is used by SPI module for multi master SPI interface)
|
||||||
|
#define SPI_CS_PIN P0_13
|
||||||
|
#define SPI_CS_PIN_FUNC PINSEL0_bit.SPI_CS_PIN
|
||||||
|
|
||||||
|
// Flash definition
|
||||||
|
//#define FLASH_SIZE (0x200000-FLASH_BOOT) // Total area of Flash region in words 8 bit
|
||||||
|
#define FLASH_SIZE (0x80000-FLASH_BOOT) // Total area of Flash region in words 8 bit
|
||||||
|
//#define FLASH_SIZE (0x80000-FLASH_BOOT) // Total area of Flash region in words 8 bit
|
||||||
|
#define FLASH_BEGIN 0x80000000
|
||||||
|
#define FLASH_BASE (FLASH_BEGIN+FLASH_BOOT) //First 0x8000 bytes reserved for boot loader etc.
|
||||||
|
|
||||||
|
// SRAM definition
|
||||||
|
#define SRAM_SIZE 0x100000 // Total area of Flash region in words 8 bit
|
||||||
|
#define SRAM_BASE 0x81000000 //First 0x8000 bytes reserved for boot loader etc.
|
||||||
|
|
||||||
|
// CS8900A definition
|
||||||
|
#define CS8900A_BASE 0x82000000 //
|
||||||
|
// RTL8019AS definition
|
||||||
|
#define RTL8019AS_BASE 0x82000000 //
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define the interrupt mechanism for Time Test 27
|
||||||
|
*
|
||||||
|
* NOTE: Following are not defined and are board independent
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct rtems_bsdnet_ifconfig;
|
||||||
|
int cs8900_driver_attach (struct rtems_bsdnet_ifconfig *config,
|
||||||
|
int attaching);
|
||||||
|
|
||||||
|
#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 2
|
||||||
|
#define CONFIGURE_INTERRUPT_STACK_MEMORY (1 * 1024)
|
||||||
|
|
||||||
|
extern rtems_configuration_table BSP_Configuration;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Network driver configuration
|
||||||
|
*/
|
||||||
|
#define RTEMS_BSP_NETWORK_DRIVER_NAME "eth0"
|
||||||
|
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH cs8900_driver_attach
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _BSP_H */
|
||||||
126
c/src/lib/libbsp/arm/rtl22xx/network/network.c
Normal file
126
c/src/lib/libbsp/arm/rtl22xx/network/network.c
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*Note: this file is copy from 7312 BSP, and untested yet*/
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <sys/mbuf.h>
|
||||||
|
#include <irq.h>
|
||||||
|
#include <libchip/cs8900.h>
|
||||||
|
|
||||||
|
#define CS8900_BASE 0x20000300
|
||||||
|
unsigned int bsp_cs8900_io_base = 0;
|
||||||
|
unsigned int bsp_cs8900_memory_base = 0;
|
||||||
|
cs8900_device *g_cs;
|
||||||
|
rtems_isr cs8900_isr(rtems_vector_number v);
|
||||||
|
rtems_irq_connect_data cs8900_isr_data = {LPC22xx_INTERRUPT_EINT2,
|
||||||
|
(rtems_irq_hdl)cs8900_isr,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
0 };
|
||||||
|
|
||||||
|
char g_enetbuf[1520];
|
||||||
|
|
||||||
|
rtems_isr cs8900_isr(rtems_vector_number v)
|
||||||
|
{
|
||||||
|
cs8900_interrupt(v, g_cs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cs8900_io_set_reg - set one of the I/O addressed registers */
|
||||||
|
void cs8900_io_set_reg (cs8900_device *cs, unsigned short reg, unsigned short data)
|
||||||
|
{
|
||||||
|
/* works the same for all values of dev */
|
||||||
|
/*
|
||||||
|
printf("cs8900_io_set_reg: reg: %#6x, val %#6x\n",
|
||||||
|
CS8900_BASE + reg,
|
||||||
|
data);
|
||||||
|
*/
|
||||||
|
*(unsigned short *)(CS8900_BASE + reg) = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cs8900_io_get_reg - reads one of the I/O addressed registers */
|
||||||
|
unsigned short cs8900_io_get_reg (cs8900_device *cs, unsigned short reg)
|
||||||
|
{
|
||||||
|
unsigned short val;
|
||||||
|
/* works the same for all values of dev */
|
||||||
|
val = *(unsigned short *)(CS8900_BASE + reg);
|
||||||
|
/*
|
||||||
|
printf("cs8900_io_get_reg: reg: %#6x, val %#6x\n", reg, val);
|
||||||
|
*/
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cs8900_mem_set_reg - sets one of the registers mapped through
|
||||||
|
* PacketPage
|
||||||
|
*/
|
||||||
|
void cs8900_mem_set_reg (cs8900_device *cs, unsigned long reg, unsigned short data)
|
||||||
|
{
|
||||||
|
/* works the same for all values of dev */
|
||||||
|
cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
|
||||||
|
cs8900_io_set_reg(cs, CS8900_IO_PP_DATA_PORT0, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cs8900_mem_get_reg - reads one of the registers mapped through
|
||||||
|
* PacketPage
|
||||||
|
*/
|
||||||
|
unsigned short cs8900_mem_get_reg (cs8900_device *cs, unsigned long reg)
|
||||||
|
{
|
||||||
|
/* works the same for all values of dev */
|
||||||
|
cs8900_io_set_reg(cs, CS8900_IO_PACKET_PAGE_PTR, reg);
|
||||||
|
return cs8900_io_get_reg(cs, CS8900_IO_PP_DATA_PORT0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cs8900_get_mac_addr (cs8900_device *cs, unsigned char *mac_address)
|
||||||
|
{
|
||||||
|
mac_address[0] = 0x08;
|
||||||
|
mac_address[1] = 0x00;
|
||||||
|
mac_address[2] = 0x3e;
|
||||||
|
mac_address[3] = 0x21;
|
||||||
|
mac_address[4] = 0xc7;
|
||||||
|
mac_address[5] = 0xf7;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cs8900_attach_interrupt (cs8900_device *cs)
|
||||||
|
{
|
||||||
|
g_cs = cs;
|
||||||
|
BSP_install_rtems_irq_handler(&cs8900_isr_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cs8900_detach_interrupt (cs8900_device *cs)
|
||||||
|
{
|
||||||
|
BSP_remove_rtems_irq_handler(&cs8900_isr_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned short cs8900_get_data_block (cs8900_device *cs, unsigned char *data)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
len = cs8900_mem_get_reg(cs, CS8900_PP_RxLength);
|
||||||
|
|
||||||
|
for (i = 0; i < ((len + 1) / 2); i++) {
|
||||||
|
((short *)data)[i] = cs8900_io_get_reg(cs,
|
||||||
|
CS8900_IO_RX_TX_DATA_PORT0);
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cs8900_tx_load (cs8900_device *cs, struct mbuf *m)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
unsigned short *data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
memcpy(&g_enetbuf[len], mtod(m, const void *), m->m_len);
|
||||||
|
len += m->m_len;
|
||||||
|
m = m->m_next;
|
||||||
|
} while (m != 0);
|
||||||
|
|
||||||
|
data = (unsigned short *) &g_enetbuf[0];
|
||||||
|
for (i = 0; i < ((len + 1) / 2); i++) {
|
||||||
|
cs8900_io_set_reg(cs,
|
||||||
|
CS8900_IO_RX_TX_DATA_PORT0,
|
||||||
|
data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user