]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/devs/eth/arm/mxc30030evb/v2_0/include/devs_eth_arm_board.inl
Initial revision
[karo-tx-redboot.git] / packages / devs / eth / arm / mxc30030evb / v2_0 / include / devs_eth_arm_board.inl
1 //==========================================================================
2 //
3 //      devs_eth_arm_board.inl
4 //
5 //      Board ethernet I/O definitions.
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //===========================================================================
41
42 #include <cyg/hal/hal_intr.h>           // CYGNUM_HAL_INTERRUPT_ETHR
43 #include <cyg/hal/hal_if.h>
44
45 #ifdef CYGPKG_REDBOOT
46 #include <pkgconf/redboot.h>
47 #ifdef CYGSEM_REDBOOT_FLASH_CONFIG
48 #include <redboot.h>
49 #include <flash_config.h>
50 #endif
51 #endif
52
53 #ifdef __WANT_DEVS
54
55 #ifdef CYGPKG_DEVS_ETH_ARM_MXCBOARD_ETH0
56
57 #if defined(CYGPKG_REDBOOT) && defined(CYGSEM_REDBOOT_FLASH_CONFIG)
58 RedBoot_config_option("Set " CYGDAT_DEVS_ETH_ARM_MXCBOARD_ETH0_NAME " network hardware address [MAC]",
59                       eth0_esa,
60                       ALWAYS_ENABLED, true,
61                       CONFIG_BOOL, false
62                      );
63 RedBoot_config_option(CYGDAT_DEVS_ETH_ARM_MXCBOARD_ETH0_NAME " network hardware address [MAC]",
64                       eth0_esa_data,
65                       "eth0_esa", true,
66                       CONFIG_ESA, 0
67                      );
68 #endif // CYGPKG_REDBOOT && CYGSEM_REDBOOT_FLASH_CONFIG
69
70 #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
71 // Note that this section *is* active in an application, outside RedBoot,
72 // where the above section is not included.
73
74 #include <cyg/hal/hal_if.h>
75
76 #ifndef CONFIG_ESA
77 #define CONFIG_ESA (6)
78 #endif
79 #ifndef CONFIG_BOOL
80 #define CONFIG_BOOL (1)
81 #endif
82
83 cyg_bool _board_provide_eth0_esa(struct cs8900a_priv_data* cpd)
84 {
85     cyg_bool set_esa;
86     int ok;
87     ok = CYGACC_CALL_IF_FLASH_CFG_OP( CYGNUM_CALL_IF_FLASH_CFG_GET,
88                                       "eth0_esa", &set_esa, CONFIG_BOOL);
89     if (ok && set_esa) {
90         ok = CYGACC_CALL_IF_FLASH_CFG_OP( CYGNUM_CALL_IF_FLASH_CFG_GET,
91                                           "eth0_esa_data", cpd->esa, CONFIG_ESA);
92     }
93
94     return ok && set_esa;
95 }
96
97 #endif // CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
98
99
100 // ------------------------------------------------------------------------
101 // EEPROM access functions
102 // 
103 #define PP_ECR                  0x0040
104 #define PP_EE_READ_CMD          0x0200
105 #define PP_EE_WRITE_CMD         0x0100
106 #define PP_EE_EWEN_CMD          0x00F0
107 #define PP_EE_EWDS_CMD          0x0000
108 #define PP_EE_ERASE_CMD         0x0300
109
110 #define PP_EE_DATA              0x0042
111 #define PP_EE_ADDR_W0           0x001C
112 #define PP_EE_ADDR_W1           0x001D
113 #define PP_EE_ADDR_W2           0x001E
114
115 #define EE_TIMEOUT              50000
116 __inline__ cyg_uint16 read_eeprom(cyg_addrword_t base, cyg_uint16 offset)
117 {
118     unsigned long timeout = EE_TIMEOUT;
119     if (get_reg(base, PP_SelfStat) & PP_SelfStat_EEPROM) {
120 #if 0
121         diag_printf("EEPROM PP_SelfStat=0x%x\n", get_reg(base, PP_SelfStat));
122 #endif
123     } else {
124         diag_printf("Error: NO EEPROM present\n");
125         return 0;
126     }
127
128     while ((timeout -- > 0) && (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY))
129         ;
130     if (timeout == 0) {
131         diag_printf("read_eeprom() timeout\n");
132         return 0;
133     }
134     timeout = EE_TIMEOUT;
135     put_reg(base, PP_ECR, (offset | PP_EE_READ_CMD));
136     while ((timeout -- > 0) && (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY))
137         ;
138     if (timeout == 0) {
139         diag_printf("read_eeprom() timeout\n");
140         return 0;
141     }
142     return get_reg(base, PP_EE_DATA);
143 }
144
145 /*
146  * Write a word to an EEPROM location
147  * base: package page base (IO base)
148  * offset: the EEPROM word offset starting from 0. So for word 1, should pass in 1
149  * data: 16 bit data to be written into EEPRM
150  */
151 __inline__ void write_eeprom(cyg_addrword_t base, cyg_uint16 offset, cyg_uint16 data)
152 {
153     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
154         ;
155     put_reg(base, PP_ECR, PP_EE_EWEN_CMD);
156     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
157         ;
158     put_reg(base, PP_ECR, PP_EE_ERASE_CMD|offset);
159     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
160         ;
161     put_reg(base, PP_EE_DATA, data);
162     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
163         ;
164     put_reg(base, PP_ECR, (PP_EE_WRITE_CMD|offset));
165     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
166         ;
167     put_reg(base, PP_ECR, PP_EE_EWDS_CMD);
168     while (get_reg(base, PP_SelfStat) & PP_SelfStat_SIBSY)
169         ;
170 }
171
172 #define CS8900A_RESET_BYPASS /* define it when reset is done early */
173
174 static __inline__ void copy_eeprom(cyg_addrword_t base)
175 {
176     cyg_uint16 esa_word;     
177     int i;
178     for (i = 0;  i < 6;  i += 2) {
179         esa_word = read_eeprom(base, PP_EE_ADDR_W0 + (i/2));
180         put_reg(base, (PP_IA+i), esa_word);
181 //         diag_printf("base=0x%x, copy_eeprom (0x%04x)\n", base, esa_word);
182     }
183 }
184
185 #undef  CYGHWR_CL_CS8900A_PLF_RESET
186 #define CYGHWR_CL_CS8900A_PLF_RESET(base) copy_eeprom(base)
187
188 static cs8900a_priv_data_t cs8900a_eth0_priv_data = {
189     base : (cyg_addrword_t) BOARD_CS_LAN_BASE,
190     interrupt: CYGNUM_HAL_INTERRUPT_ETH,
191 #ifdef CYGSEM_DEVS_ETH_ARM_MXCBOARD_ETH0_SET_ESA
192     esa : CYGDAT_DEVS_ETH_ARM_MXCBOARD_ETH0_ESA,
193     hardwired_esa : true,
194 #else
195     hardwired_esa : false,
196 #endif
197 #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
198     provide_esa : &_board_provide_eth0_esa,
199 #else
200     provide_esa : NULL,
201 #endif
202 };
203
204 ETH_DRV_SC(cs8900a_sc,
205            &cs8900a_eth0_priv_data, // Driver specific data
206            CYGDAT_DEVS_ETH_ARM_MXCBOARD_ETH0_NAME,
207            cs8900a_start,
208            cs8900a_stop,
209            cs8900a_control,
210            cs8900a_can_send,
211            cs8900a_send,
212            cs8900a_recv,
213            cs8900a_deliver,     // "pseudoDSR" called from fast net thread
214            cs8900a_poll,        // poll function, encapsulates ISR and DSR
215            cs8900a_int_vector);
216
217 NETDEVTAB_ENTRY(cs8900a_netdev,
218                 "cs8900a_" CYGDAT_DEVS_ETH_ARM_MXCBOARD_ETH0_NAME,
219                 cs8900a_init,
220                 &cs8900a_sc);
221
222 #endif // CYGPKG_DEVS_ETH_ARM_MXCBOARD_ETH0
223
224 #endif // __WANT_DEVS