diff packages/devs/eth/arm/cerfpda/current/include/devs_eth_arm_cerfpda.inl @ 208:e0c0827131d1 ecos

Merge from eCos master repository on 2002-05-20-20:11:54-BST
author jlarmour
date Mon, 20 May 2002 22:19:26 +0000
parents
children d2c90368aeef
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/devs/eth/arm/cerfpda/current/include/devs_eth_arm_cerfpda.inl
@@ -0,0 +1,208 @@
+//==========================================================================
+//
+//      devs_eth_arm_cerfpda.inl
+//
+//      CERFPDA 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.
+//
+// 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.
+//
+// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+// at http://sources.redhat.com/ecos/ecos-license
+// -------------------------------------------
+//####ECOSGPLCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   jskov
+// Contributors:jskov
+// Date:        2001-11-14
+// Purpose:     CERFPDA ethernet defintions
+//
+//####DESCRIPTIONEND####
+//==========================================================================
+
+#include <cyg/hal/hal_intr.h> 
+#include <cyg/hal/hal_if.h>
+#include <cyg/hal/cerfpda.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 CS8900A_step 2
+#endif
+
+#ifdef __WANT_DEVS
+
+#ifdef CYGPKG_DEVS_ETH_ARM_CERFPDA_ETH0
+
+#ifndef CYGSEM_DEVS_ETH_ARM_CERFPDA_ETH0_SET_ESA
+# if defined(CYGPKG_REDBOOT) && defined(CYGSEM_REDBOOT_FLASH_CONFIG)
+RedBoot_config_option("Set " CYGDAT_DEVS_ETH_ARM_CERFPDA_ETH0_NAME " network hardware address [MAC]",
+                      eth0_esa,
+                      ALWAYS_ENABLED, true,
+                      CONFIG_BOOL, false
+    );
+RedBoot_config_option(CYGDAT_DEVS_ETH_ARM_CERFPDA_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
+_cerfpda_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_CERFPDA_ETH0_SET_ESA
+
+// ------------------------------------------------------------------------
+// EEPROM access functions
+// 
+#define PP_ECR          0x0040
+#define PP_EE_READ_CMD  0x0200
+#define PP_EE_WRITE_CMD 0x0100
+#define PP_EE_DATA		0x0042
+#define PP_EE_ADDR_W0   0x001C
+#define PP_EE_ADDR_W1   0x001D
+#define PP_EE_ADDR_W2   0x001E
+
+static __inline__ cyg_uint16 
+read_eeprom(cyg_addrword_t base, cyg_uint16 offset)
+{
+    while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
+        ;
+
+    put_reg(base, PP_ECR, (offset | PP_EE_READ_CMD));
+
+    while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
+        ;
+
+    return get_reg(base, PP_EE_DATA);
+}
+
+static __inline__ void 
+copy_eeprom(cyg_addrword_t base)
+{
+    cyg_uint16 esa_word;
+    int i;
+    for (i = 0;  i < 6;  i += 2)
+    {
+         esa_word = read_eeprom(base, PP_EE_ADDR_W0 + (i/2));
+         put_reg(base, PP_IA+(i/2), esa_word);
+    }
+}
+
+static __inline__ void 
+post_reset(cyg_addrword_t base)
+{
+    // Toggle A0 connected to the SBHE line on the Crystal chip.
+    *(char*)(0x20000000) = 1;
+    *(char*)(0x20000001) = 2;
+    *(char*)(0x20000000) = 3;
+    *(char*)(0x20000001) = 0;
+}
+
+#undef  CYGHWR_CL_CS8900A_PLF_POST_RESET
+#define CYGHWR_CL_CS8900A_PLF_POST_RESET(base) post_reset(base)
+
+#undef  CYGHWR_CL_CS8900A_PLF_RESET
+#define CYGHWR_CL_CS8900A_PLF_RESET(base) copy_eeprom(base)
+ 
+static cs8900a_priv_data_t cs8900a_eth0_priv_data = { 
+    base : (cyg_addrword_t) 0xf0000300,
+    interrupt:SA1110_IRQ_GPIO_ETH, 
+#ifdef CYGSEM_DEVS_ETH_ARM_CERFPDA_ETH0_SET_ESA
+    esa : CYGDAT_DEVS_ETH_ARM_CERFPDA_ETH0_ESA,
+    hardwired_esa : true,
+#else
+    hardwired_esa : false,
+# ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
+    provide_esa : &_cerfpda_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_CERFPDA_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_CERFPDA_ETH0_NAME,
+           cs8900a_init, 
+           &cs8900a_sc);
+
+#endif // CYGPKG_DEVS_ETH_ARM_CERFPDA_ETH0
+
+#endif // __WANT_DEVS
+
+// EOF devs_eth_arm_cerfpda.inl