changeset 2662:a3b3f7d5019f

* Ethernet driver for LPC-E2294 development board * cdl/olpce2294_eth_drivers.cdl * include/devs_eth_arm_olpce2294.h * include/devs_eth_arm_olpce2294.inl
author asl
date Sun, 23 Nov 2008 12:55:04 +0000
parents 20ca46d1ed4b
children 5e816776379b
files packages/devs/eth/arm/olpce2294/current/ChangeLog packages/devs/eth/arm/olpce2294/current/cdl/olpce2294_eth_drivers.cdl packages/devs/eth/arm/olpce2294/current/doc/README packages/devs/eth/arm/olpce2294/current/include/devs_eth_arm_olpce2294.h packages/devs/eth/arm/olpce2294/current/include/devs_eth_arm_olpce2294.inl
diffstat 5 files changed, 405 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/olpce2294/current/ChangeLog
@@ -0,0 +1,38 @@
+2008-08-31  Sergei Gavrikov <sergei.gavrikov@gmail.com>
+
+	* Ethernet driver for LPC-E2294 development board
+	* cdl/olpce2294_eth_drivers.cdl
+	* include/devs_eth_arm_olpce2294.h
+	* include/devs_eth_arm_olpce2294.inl
+
+//===========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2008 eCosCentric Limited 
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/olpce2294/current/cdl/olpce2294_eth_drivers.cdl
@@ -0,0 +1,123 @@
+# ====================================================================
+#
+#      olpce2294_eth_drivers.cdl
+#
+#      Ethernet drivers - platform dependent support for OLPCE2294
+#
+# ====================================================================
+#####ECOSGPLCOPYRIGHTBEGIN####
+## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+## Copyright (C) 2008 eCosCentric Limited
+##
+## eCos 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 or (at your option) any later version.
+##
+## eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+##
+## As a special exception, if other files instantiate templates or use macros
+## or inline functions from this file, or you compile this file and link it
+## with other works to produce a work based on this file, this file does not
+## by itself cause the resulting work to be covered by the GNU General Public
+## License. However the source code for this file must still be made available
+## in accordance with section (3) of the GNU General Public License.
+##
+## This exception does not invalidate any other reasons why a work based on
+## this file might be covered by the GNU General Public License.
+## -------------------------------------------
+#####ECOSGPLCOPYRIGHTEND####
+# ====================================================================
+######DESCRIPTIONBEGIN####
+#
+# Author(s):      Sergei Gavrikov
+# Contributors:   Sergei Gavrikov
+# Date:           2008-08-31
+#
+#####DESCRIPTIONEND####
+#
+# ====================================================================
+
+cdl_package CYGPKG_DEVS_ETH_ARM_OLPCE2294 {
+    display       "LAN ethernet driver for Olimex LPC-E2294"
+
+    parent        CYGPKG_IO_ETH_DRIVERS
+    active_if     CYGPKG_IO_ETH_DRIVERS
+    active_if     CYGPKG_HAL_ARM_LPC2XXX_OLPCE2294
+
+    implements    CYGINT_DEVS_ETH_CL_CS8900A_REQUIRED
+
+    requires      CYGPKG_DEVS_ETH_CL_CS8900A
+
+    # Olimex LPC-E2294 development board has Cirrus Logic CS8900A ethernet
+    # controller had been wired in a dumb 8-bit mode.
+    requires      CYGIMP_DEVS_ETH_CL_CS8900A_DATABUS_8BIT
+
+    include_dir   cyg/io
+
+    description   "
+        Ethernet driver for Olimex LPC-E2294 board."
+
+    cdl_interface CYGINT_DEVS_ETH_CL_CS8900A_REQUIRED {
+        display   "CL CS8900A ethernet driver required"
+    }
+
+    define_proc {
+        puts $::cdl_system_header "/***** ethernet driver proc output start *****/"
+        puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_CL_CS8900A_INL <cyg/io/devs_eth_arm_olpce2294.inl>"
+        puts $::cdl_system_header "#define CYGDAT_DEVS_ETH_CL_CS8900A_CFG <pkgconf/devs_eth_arm_olpce2294.h>"
+        puts $::cdl_system_header "/*****  ethernet driver proc output end  *****/"
+    }
+
+    cdl_component CYGSEM_DEVS_ETH_CL_CS8900A_NOINTS {
+        display       "Interrupts are not supported"
+        calculated    1
+        description   "
+            Interrups are not supported in 8-bit mode. Polled mode must
+            be used."
+    }
+
+   cdl_component CYGPKG_DEVS_ETH_ARM_OLPCE2294_ETH0 {
+        display       "OLPCE2294 ethernet port driver"
+        flavor        bool
+        default_value 1
+        description   "
+            This option includes the ethernet device driver for the
+            OLPCE2294 port."
+
+        implements CYGHWR_NET_DRIVER_ETH0
+        implements CYGINT_DEVS_ETH_CL_CS8900A_REQUIRED
+        implements CYGINT_DEVS_ETH_CL_CS8900A_DATABUS_8BIT
+
+        cdl_option CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_NAME {
+            display       "Device name for the ETH0 ethernet driver"
+            flavor        data
+            default_value {"\"eth0\""}
+            description   "
+                This option sets the name of the ethernet device."
+        }
+
+	cdl_component CYGSEM_DEVS_ETH_ARM_OLPCE2294_ETH0_SET_ESA {
+	    display       "Set the ethernet station address"
+	    flavor        bool
+	    calculated    1
+	    description   "Enabling this option will allow the ethernet
+	    station address to be forced to the value set by the
+	    configuration."
+
+	    cdl_option CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_ESA {
+	        display       "The ethernet station address"
+	        flavor        data
+	        default_value {"{0x08, 0x88, 0x12, 0x34, 0x56, 0x78}"}
+	        description   "The ethernet station address"
+	    }
+	}
+    }
+}
+
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/olpce2294/current/doc/README
@@ -0,0 +1,14 @@
+Olimex LPC-E2294 development board has a Cirrus Logic CS8900A ethernet
+controller had been wired to MPU in 8-bit mode. This mode does have a
+few limitations:
+
+        Interrupts are not supported. Polled mode must be used;
+
+        The DMA engine only uses 16 bit memory access and does not
+        support 8 bit transfers;
+
+        The packet page pointer has an auto increment feature that
+        cannot be used in 8-bit mode;
+
+        EEPROM is not supported.
+
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/olpce2294/current/include/devs_eth_arm_olpce2294.h
@@ -0,0 +1,56 @@
+#ifndef _CYGONCE_DEVS_ETH_ARM_OLPCE2294_H
+#define _CYGONCE_DEVS_ETH_ARM_OLPCE2294_H
+//==========================================================================
+//
+//      devs_eth_arm_olpce2294.h
+//
+//      OLPCE2294 ethernet configuration
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2008 eCosCentric Limited
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     Sergei Gavrikov
+// Contributors:  Sergei Gavrikov
+// Date:          2008-08-31
+// Purpose:       OLPCE2294 ethernet configuration
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+
+#endif // _CYGONCE_DEVS_ETH_ARM_OLPCE2294_H
+//--------------------------------------------------------------------------
+// EOF devs_eth_arm_olpce2294.h
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/olpce2294/current/include/devs_eth_arm_olpce2294.inl
@@ -0,0 +1,174 @@
+//==========================================================================
+//
+//      devs_eth_arm_olpce2294.inl
+//
+//      OLPCE2294 ethernet I/O definitions
+//
+//==========================================================================
+//####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2008 eCosCentric Limited
+//
+// eCos 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 or (at your option) any later version.
+//
+// eCos 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 eCos; if not, write to the Free Software Foundation, Inc.,
+// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+//
+// As a special exception, if other files instantiate templates or use macros
+// or inline functions from this file, or you compile this file and link it
+// with other works to produce a work based on this file, this file does not
+// by itself cause the resulting work to be covered by the GNU General Public
+// License. However the source code for this file must still be made available
+// in accordance with section (3) of the GNU General Public License.
+//
+// This exception does not invalidate any other reasons why a work based on
+// this file might be covered by the GNU General Public License.
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     Sergei Gavrikov
+// Contributors:  Sergei Gavrikov
+// Date:          2008-08-31
+// Purpose:       OLPCE2294 ethernet definitions
+// Description:
+//
+//####DESCRIPTIONEND####
+//
+//========================================================================*/
+
+#include <cyg/hal/hal_intr.h>
+#include <cyg/hal/hal_if.h>
+
+#ifdef CYGPKG_REDBOOT
+# include <pkgconf/redboot.h>
+# ifdef CYGSEM_REDBOOT_FLASH_CONFIG
+#  include <redboot.h>
+#  include <flash_config.h>
+# endif
+#endif
+
+#ifdef __WANT_CONFIG
+//#define DEBUG 0xf
+
+// This is done by reading the low order byte first
+#define CS_IN( _b_, _o_, _d_)                                   \
+    CYG_MACRO_START                                             \
+    cyg_uint8 x, y;                                             \
+    HAL_READ_UINT8 ((cyg_addrword_t)(_b_)+(_o_), x);            \
+    _d_ = x;                                                    \
+    HAL_READ_UINT8 ((cyg_addrword_t)(_b_)+(_o_)+1, y);          \
+    _d_ |= y << 8;                                              \
+    CYG_MACRO_END
+
+// This is done by writing the low order byte first
+#define CS_OUT( _b_, _o_, _d_)                                  \
+    CYG_MACRO_START                                             \
+    HAL_WRITE_UINT8 ((cyg_addrword_t)(_b_)+(_o_), _d_);         \
+    HAL_WRITE_UINT8 ((cyg_addrword_t)(_b_)+(_o_)+1, (_d_) >> 8);\
+    CYG_MACRO_END
+
+#endif // __WANT_CONFIG
+
+#ifdef __WANT_DEVS
+
+#ifdef CYGPKG_DEVS_ETH_ARM_OLPCE2294_ETH0
+
+#ifndef CYGSEM_DEVS_ETH_ARM_OLPCE2294_ETH0_SET_ESA
+#if defined(CYGPKG_REDBOOT) && defined(CYGSEM_REDBOOT_FLASH_CONFIG)
+RedBoot_config_option("Set " CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_NAME " network hardware address [MAC]",
+                      eth0_esa,
+                      ALWAYS_ENABLED, true,
+                      CONFIG_BOOL, false
+    );
+RedBoot_config_option(CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_NAME " network hardware address [MAC]",
+                      eth0_esa_data,
+                      "eth0_esa", true,
+                      CONFIG_ESA, 0
+    );
+#endif // CYGPKG_REDBOOT && CYGSEM_REDBOOT_FLASH_CONFIG
+
+# ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+// Note that this section *is* active in an application, outside RedBoot,
+// where the above section is not included.
+
+#  include <cyg/hal/hal_if.h>
+
+#  ifndef CONFIG_ESA
+#   define CONFIG_ESA (6)
+#  endif
+#  ifndef CONFIG_BOOL
+#   define CONFIG_BOOL (1)
+#  endif
+
+cyg_bool
+_olpce2294_provide_eth0_esa(struct cs8900a_priv_data* cpd)
+{
+    cyg_bool set_esa;
+    int ok;
+    ok = CYGACC_CALL_IF_FLASH_CFG_OP( CYGNUM_CALL_IF_FLASH_CFG_GET,
+                                      "eth0_esa", &set_esa, CONFIG_BOOL);
+    if (ok && set_esa) {
+        ok = CYGACC_CALL_IF_FLASH_CFG_OP( CYGNUM_CALL_IF_FLASH_CFG_GET,
+                                          "eth0_esa_data", 
+                                          cpd->esa, CONFIG_ESA);
+    }
+    return ok && set_esa;
+}
+
+# endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+#endif // ! CYGSEM_DEVS_ETH_ARM_OLPCE2294_ETH0_SET_ESA
+
+static cs8900a_priv_data_t cs8900a_eth0_priv_data = {
+    base : (cyg_addrword_t) 0x82000000,
+    interrupt : CYGNUM_HAL_INTERRUPT_NONE,
+#ifdef CYGSEM_DEVS_ETH_ARM_OLPCE2294_ETH0_SET_ESA
+    esa : CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_ESA,
+    hardwired_esa : true,
+#else
+    hardwired_esa : false,
+# ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+    provide_esa : &_olpce2294_provide_eth0_esa,
+# else
+    provide_esa : NULL,
+# endif
+#endif
+};
+
+ETH_DRV_SC(cs8900a_sc,
+           &cs8900a_eth0_priv_data, // Driver specific data
+           CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_NAME,
+           cs8900a_start,
+           cs8900a_stop,
+           cs8900a_control,
+           cs8900a_can_send,
+           cs8900a_send,
+           cs8900a_recv,
+           cs8900a_deliver,     // "pseudoDSR" called from fast net thread
+           cs8900a_poll,        // poll function, encapsulates ISR and DSR
+           cs8900a_int_vector);
+
+NETDEVTAB_ENTRY(cs8900a_netdev,
+                "cs8900a_" CYGDAT_DEVS_ETH_ARM_OLPCE2294_ETH0_NAME,
+                cs8900a_init,
+                &cs8900a_sc);
+
+#endif // CYGPKG_DEVS_ETH_ARM_OLPCE2294_ETH0
+
+#endif // __WANT_DEVS
+
+// indent: --indent-level4 -br -nut; vim: expandtab tabstop=4 shiftwidth=4
+//--------------------------------------------------------------------------
+// EOF devs_eth_arm_olpce2294.inl
+