| /**************************************************************************** |
| |
| (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 |
| www.systec-electronic.com |
| |
| Project: openPOWERLINK |
| |
| Description: interface for ethernetdriver |
| "fast ethernet controller" (FEC) |
| freescale coldfire MCF528x and compatible FEC |
| |
| License: |
| |
| 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. Neither the name of SYSTEC electronic GmbH nor the names of its |
| contributors may be used to endorse or promote products derived |
| from this software without prior written permission. For written |
| permission, please contact info@systec-electronic.com. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| "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 |
| COPYRIGHT HOLDERS OR CONTRIBUTORS 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. |
| |
| Severability Clause: |
| |
| If a provision of this License is or becomes illegal, invalid or |
| unenforceable in any jurisdiction, that shall not affect: |
| 1. the validity or enforceability in that jurisdiction of any other |
| provision of this License; or |
| 2. the validity or enforceability in other jurisdictions of that or |
| any other provision of this License. |
| |
| ------------------------------------------------------------------------- |
| |
| $RCSfile: EdrvFec5282.h,v $ |
| |
| $Author: D.Krueger $ |
| |
| $Revision: 1.3 $ $Date: 2008/04/17 21:36:32 $ |
| |
| $State: Exp $ |
| |
| Build Environment: |
| Dev C++ and GNU-Compiler for m68k |
| |
| ------------------------------------------------------------------------- |
| |
| Revision History: |
| |
| 2005/08/01 m.b.: start of implementation |
| |
| ****************************************************************************/ |
| |
| #ifndef _EDRVFEC_H_ |
| #define _EDRVFEC_H_ |
| |
| //--------------------------------------------------------------------------- |
| // const defines |
| //--------------------------------------------------------------------------- |
| // base addresses |
| #define FEC0_ADDR 0x0000 |
| #define FEC1_ADDR 0x0000 //tbd |
| |
| // control / status registers |
| #define FEC_EIR 0x1004 // interrupt event register |
| #define FEC_EIMR 0x1008 // interrupt mask register |
| #define FEC_RDAR 0x1010 // receive descriptor active register |
| #define FEC_TDAR 0x1014 // transmit descriptor active register |
| #define FEC_ECR 0x1024 // ethernet control register |
| #define FEC_MMFR 0x1040 // MII data register |
| #define FEC_MSCR 0x1044 // MII speed register |
| #define FEC_MIBC 0x1064 // MIB control/status register |
| #define FEC_RCR 0x1084 // receive control register |
| #define FEC_TCR 0x10C4 // transmit control register |
| #define FEC_PALR 0x10E4 // physical address low register |
| #define FEC_PAUR 0x10E8 // physical address high + type register |
| #define FEC_OPD 0x10EC // opcode + pause register |
| #define FEC_IAUR 0x1118 // upper 32 bit of individual hash table |
| #define FEC_IALR 0x111C // lower 32 bit of individual hash table |
| #define FEC_GAUR 0x1120 // upper 32 bit of group hash table |
| #define FEC_GALR 0x1124 // lower 32 bit of group hash table |
| #define FEC_TFWR 0x1144 // transmit FIFO watermark |
| #define FEC_FRBR 0x114C // FIFO receive bound register |
| #define FEC_FRSR 0x1150 // FIFO receive FIFO start register |
| #define FEC_ERDSR 0x1180 // pointer to receive descriptor ring |
| #define FEC_ETDSR 0x1184 // pointer to transmit descriptor ring |
| #define FEC_EMRBR 0x1188 // maximum receive buffer size |
| |
| // mib block counters memory map |
| #define FEC_RMON_T_DROP 0x1200 // count of frames not counted correctly |
| #define FEC_RMON_T_PACKETS 0x1204 // RMON tx packet count |
| #define FEC_RMON_T_BC_PKT 0x1208 // RMON tx broadcast packets |
| #define FEC_RMON_T_MC_PKT 0x120C // RMON tx multicast packets |
| #define FEC_RMON_T_CRC_ALIGN 0x1210 // RMON tx packets w CRC/align error |
| #define FEC_RMON_T_UNDERSIZE 0x1214 // RMON tx packets < 64 bytes, good CRC |
| #define FEC_RMON_T_OVERSIZE 0x1218 // RMON tx packets > MAX_FL bytes, good CRC |
| #define FEC_RMON_T_FRAG 0x121C // RMON tx packets < 64 bytes, bad CRC |
| #define FEC_RMON_T_JAB 0x1220 // RMON tx packets > MAX_FL bytes, bad CRC |
| #define FEC_RMON_T_COL 0x1224 // RMON tx collision count |
| #define FEC_RMON_T_P64 0x1228 // RMON tx 64 byte packets |
| #define FEC_RMON_T_P65TO127 0x122C // RMON tx 65 to 127 byte packets |
| #define FEC_RMON_T_P128TO255 0x1230 // RMON tx 128 to 255 byte packets |
| #define FEC_RMON_T_P256TO511 0x1234 // RMON tx 256 to 511 byte packets |
| #define FEC_RMON_T_P512TO1023 0x1238 // RMON tx 512 to 1023 byte packets |
| #define FEC_RMON_T_P1024TO2047 0x123C // RMON tx 1024 to 2047 byte packets |
| #define FEC_RMON_T_P_GTE2048 0x1240 // RMON tx w > 2048 bytes |
| #define FEC_RMON_T_OCTETS 0x1244 // RMON tx octets |
| #define FEC_IEEE_T_DROP 0x1248 // count of frames not counted correctly |
| #define FEC_IEEE_T_FRAME_OK 0x124C // frames transmitted OK |
| #define FEC_IEEE_T_1COL 0x1250 // frames transmitted with single collision |
| #define FEC_IEEE_T_MCOL 0x1254 // frames transmitted with multiple collisions |
| #define FEC_IEEE_T_DEF 0x1258 // frames transmitted after deferral delay |
| #define FEC_IEEE_T_LCOL 0x125C // frames transmitted with late collisions |
| #define FEC_IEEE_T_EXCOL 0x1260 // frames transmitted with excessive collisions |
| #define FEC_IEEE_T_MACERR 0x1264 // frames transmitted with tx-FIFO underrun |
| #define FEC_IEEE_T_CSERR 0x1268 // frames transmitted with carrier sense error |
| #define FEC_IEEE_T_SQE 0x126C // frames transmitted with SQE error |
| #define FEC_IEEE_T_FDXFC 0x1270 // flow control pause frames transmitted |
| #define FEC_IEEE_T_OCTETS_OK 0x1274 // octet count for frames transmitted w/o error |
| #define FEC_RMON_R_PACKETS 0x1284 // RMON rx packet count |
| #define FEC_RMON_R_BC_PKT 0x1288 // RMON rx broadcast packets |
| #define FEC_RMON_R_MC_PKT 0x128C // RMON rx multicast packets |
| #define FEC_RMON_R_CRC_ALIGN 0x1290 // RMON rx packets w CRC/align error |
| #define FEC_RMON_R_UNDERSIZE 0x1294 // RMON rx packets < 64 bytes, good CRC |
| #define FEC_RMON_R_OVERSIZE 0x1298 // RMON rx packets > MAX_FL bytes, good CRC |
| #define FEC_RMON_R_FRAG 0x129C // RMON rx packets < 64 bytes, bad CRC |
| #define FEC_RMON_R_JAB 0x12A0 // RMON rx packets > MAX_FL bytes, bad CRC |
| #define FEC_RMON_R_RESVD_0 0x12A4 // |
| #define FEC_RMON_R_P64 0x12A8 // RMON rx 64 byte packets |
| #define FEC_RMON_R_P65T0127 0x12AC // RMON rx 65 to 127 byte packets |
| #define FEC_RMON_R_P128TO255 0x12B0 // RMON rx 128 to 255 byte packets |
| #define FEC_RMON_R_P256TO511 0x12B4 // RMON rx 256 to 511 byte packets |
| #define FEC_RMON_R_P512TO1023 0x12B8 // RMON rx 512 to 1023 byte packets |
| #define FEC_RMON_R_P1024TO2047 0x12BC // RMON rx 1024 to 2047 byte packets |
| #define FEC_RMON_R_GTE2048 0x12C0 // RMON rx w > 2048 bytes |
| #define FEC_RMON_R_OCTETS 0x12C4 // RMON rx octets |
| #define FEC_IEEE_R_DROP 0x12C8 // count of frames not counted correctly |
| #define FEC_IEEE_R_FRAME_OK 0x12CC // frames received OK |
| #define FEC_IEEE_R_CRC 0x12D0 // frames received with CRC error |
| #define FEC_IEEE_R_ALIGN 0x12D4 // frames received with alignment error |
| #define FEC_IEEE_R_MACERR 0x12D8 // receive FIFO overflow count |
| #define FEC_IEEE_R_FDXFC 0x12DC // flow control pause frames received |
| #define FEC_IEEE_R_OCTETS_OK 0x12E0 // octet count for frames rcvd w/o error |
| |
| // register bit definitions and macros |
| #define FEC_EIR_UN (0x00080000) |
| #define FEC_EIR_RL (0x00100000) |
| #define FEC_EIR_LC (0x00200000) |
| #define FEC_EIR_EBERR (0x00400000) |
| #define FEC_EIR_MII (0x00800000) |
| #define FEC_EIR_RXB (0x01000000) |
| #define FEC_EIR_RXF (0x02000000) |
| #define FEC_EIR_TXB (0x04000000) |
| #define FEC_EIR_TXF (0x08000000) |
| #define FEC_EIR_GRA (0x10000000) |
| #define FEC_EIR_BABT (0x20000000) |
| #define FEC_EIR_BABR (0x40000000) |
| #define FEC_EIR_HBERR (0x80000000) |
| |
| #define FEC_EIMR_UN (0x00080000) |
| #define FEC_EIMR_RL (0x00100000) |
| #define FEC_EIMR_LC (0x00200000) |
| #define FEC_EIMR_EBERR (0x00400000) |
| #define FEC_EIMR_MII (0x00800000) |
| #define FEC_EIMR_RXB (0x01000000) |
| #define FEC_EIMR_RXF (0x02000000) |
| #define FEC_EIMR_TXB (0x04000000) |
| #define FEC_EIMR_TXF (0x08000000) |
| #define FEC_EIMR_GRA (0x10000000) |
| #define FEC_EIMR_BABT (0x20000000) |
| #define FEC_EIMR_BABR (0x40000000) |
| #define FEC_EIMR_HBERR (0x80000000) |
| |
| #define FEC_RDAR_R_DES_ACTIVE (0x01000000) |
| |
| #define FEC_TDAR_X_DES_ACTIVE (0x01000000) |
| |
| #define FEC_ECR_RESET (0x00000001) |
| #define FEC_ECR_ETHER_EN (0x00000002) |
| |
| #define FEC_MMFR_DATA(x) (((x) & 0xFFFF)) |
| #define FEC_MMFR_TA (0x00020000) |
| #define FEC_MMFR_RA(x) (((x) & 0x1F) << 18) |
| #define FEC_MMFR_PA(x) (((x) & 0x1F) << 23) |
| #define FEC_MMFR_OP_WR (0x10000000) |
| #define FEC_MMFR_OP_RD (0x20000000) |
| #define FEC_MMFR_ST (0x40000000) |
| |
| #define FEC_MSCR_MII_SPEED(x) (((x) & 0x1F) << 1) |
| #define FEC_MSCR_DIS_PREAMBLE (0x00000008) |
| |
| #define FEC_MIBC_MIB_IDLE (0x40000000) |
| #define FEC_MIBC_MIB_DISABLE (0x80000000) |
| |
| #define FEC_RCR_LOOP (0x00000001) |
| #define FEC_RCR_DRT (0x00000002) |
| #define FEC_RCR_MII_MODE (0x00000004) |
| #define FEC_RCR_PROM (0x00000008) |
| #define FEC_RCR_BC_REJ (0x00000010) |
| #define FEC_RCR_FCE (0x00000020) |
| #define FEC_RCR_MAX_FL(x) (((x) & 0x07FF) << 16) |
| |
| #define FEC_TCR_GTS (0x00000001) |
| #define FEC_TCR_HBC (0x00000002) |
| #define FEC_TCR_FDEN (0x00000004) |
| #define FEC_TCR_TFC_PAUSE (0x00000008) |
| #define FEC_TCR_RFC_PAUSE (0x00000010) |
| |
| #define FEC_PALR_BYTE3(x) (((x) & 0xFF) << 0) |
| #define FEC_PALR_BYTE2(x) (((x) & 0xFF) << 8) |
| #define FEC_PALR_BYTE1(x) (((x) & 0xFF) << 16) |
| #define FEC_PALR_BYTE0(x) (((x) & 0xFF) << 24) |
| |
| //#define FEC_PAUR_TYPE(x) (((x) & 0xFFFF) << 0) |
| #define FEC_PAUR_BYTE5(x) (((x) & 0xFF) << 16) |
| #define FEC_PAUR_BYTE4(x) (((x) & 0xFF) << 24) |
| |
| #define FEC_OPD_PAUSE_DUR(x) (((x) & 0xFFFF)) |
| //#define FEC_OPD_OPCODE(x) (((x) & 0xFFFF) << 16) |
| |
| //m.b. |
| #define FEC_IAUR_BYTE7(x) (((x) & 0xFF) << 0) |
| #define FEC_IAUR_BYTE6(x) (((x) & 0xFF) << 8) |
| #define FEC_IAUR_BYTE5(x) (((x) & 0xFF) << 16) |
| #define FEC_IAUR_BYTE4(x) (((x) & 0xFF) << 24) |
| |
| #define FEC_IALR_BYTE3(x) (((x) & 0xFF) << 0) |
| #define FEC_IALR_BYTE2(x) (((x) & 0xFF) << 8) |
| #define FEC_IALR_BYTE1(x) (((x) & 0xFF) << 16) |
| #define FEC_IALR_BYTE0(x) (((x) & 0xFF) << 24) |
| |
| #define FEC_GAUR_BYTE7(x) (((x) & 0xFF) << 0) |
| #define FEC_GAUR_BYTE6(x) (((x) & 0xFF) << 8) |
| #define FEC_GAUR_BYTE5(x) (((x) & 0xFF) << 16) |
| #define FEC_GAUR_BYTE4(x) (((x) & 0xFF) << 24) |
| |
| #define FEC_GALR_BYTE3(x) (((x) & 0xFF) << 0) |
| #define FEC_GALR_BYTE2(x) (((x) & 0xFF) << 8) |
| #define FEC_GALR_BYTE1(x) (((x) & 0xFF) << 16) |
| #define FEC_GALR_BYTE0(x) (((x) & 0xFF) << 24) |
| // ^^^^ |
| |
| #define FEC_TFWR_X_WMRK_64 (0x00000001) |
| #define FEC_TFWR_X_WMRK_128 (0x00000002) |
| #define FEC_TFWR_X_WMRK_192 (0x00000003) |
| |
| //m.b. |
| #define FEC_FRBR_R_BOUND(x) (((x) & 0xFF) << 2) |
| |
| //m.b. |
| #define FEC_FRSR_R_FSTART(x) (((x) & 0xFF) << 2) |
| |
| //m.b. |
| #define FEC_ERDSR_R_DES_START(x) (((x) & 0x3FFFFFFF) << 2) |
| |
| //m.b. |
| #define FEC_ETSDR_X_DES_START(x) (((x) & 0x3FFFFFFF) << 2) |
| |
| #define FEC_EMRBR_R_BUF_SIZE(x) (((x) & 0x7F) << 4) |
| |
| #define FEC_RxBD_TR 0x0001 |
| #define FEC_RxBD_OV 0x0002 |
| #define FEC_RxBD_CR 0x0004 |
| #define FEC_RxBD_NO 0x0010 |
| #define FEC_RxBD_LG 0x0020 |
| #define FEC_RxBD_MC 0x0040 |
| #define FEC_RxBD_BC 0x0080 |
| #define FEC_RxBD_M 0x0100 |
| #define FEC_RxBD_L 0x0800 |
| #define FEC_RxBD_R02 0x1000 |
| #define FEC_RxBD_W 0x2000 |
| #define FEC_RxBD_R01 0x4000 |
| #define FEC_RxBD_INUSE 0x4000 |
| #define FEC_RxBD_E 0x8000 |
| |
| //m.b. |
| //#define FEC_TxBD_CSL 0x0001 |
| //#define FEC_TxBD_UN 0x0002 |
| //#define FEC_TxBD_RL 0x0040 |
| //#define FEC_TxBD_LC 0x0080 |
| //#define FEC_TxBD_HB 0x0100 |
| //#define FEC_TxBD_DEF 0x0200 |
| #define FEC_TxBD_ABC 0x0200 |
| // ^^^^ |
| #define FEC_TxBD_TC 0x0400 |
| #define FEC_TxBD_L 0x0800 |
| #define FEC_TxBD_TO2 0x1000 |
| #define FEC_TxBD_W 0x2000 |
| #define FEC_TxBD_TO1 0x4000 |
| #define FEC_TxBD_INUSE 0x4000 |
| #define FEC_TxBD_R 0x8000 |
| |
| //--------------------------------------------------------------------------- |
| // types |
| //--------------------------------------------------------------------------- |
| |
| // Rx and Tx buffer descriptor format |
| typedef struct { |
| WORD m_wStatus; // control / status --- used by edrv, do not change in application |
| WORD m_wLength; // transfer length |
| BYTE *m_pbData; // buffer address |
| } tBufferDescr; |
| |
| //--------------------------------------------------------------------------- |
| // function prototypes |
| //--------------------------------------------------------------------------- |
| |
| #if (NO_OF_INSTANCES > 1) |
| #define ECI_WRITE_DW_REG(off,val) (*(DWORD *)(void *)(&__IPSBAR[off]) = val) |
| #define ECI_READ_DW_REG(off) (*(DWORD *)(void *)(&__IPSBAR[off])) |
| #else |
| #if (EDRV_USED_ETH_CTRL == 0) |
| #define ECI_WRITE_DW_REG(off,val) (*(DWORD *)(void *)(&__IPSBAR[FEC0_ADDR+off]) = val) |
| #define ECI_READ_DW_REG(off) (*(DWORD *)(void *)(&__IPSBAR[FEC0_ADDR+off])) |
| #else |
| #define ECI_WRITE_DW_REG(off,val) (*(DWORD *)(void *)(&__IPSBAR[FEC1_ADDR+off]) = val) |
| #define ECI_READ_DW_REG(off) (*(DWORD *)(void *)(&__IPSBAR[FEC1_ADDR+off])) |
| #endif |
| #endif |
| |
| #endif // #ifndef _EDRV_FEC_H_ |