mbed OS5

Fork of UIPEthernet by Zoltan Hudak

Committer:
hudakz
Date:
Sat Dec 20 11:10:40 2014 +0000
Revision:
3:5b17e4656dd0
Child:
4:d774541a34da
02 Name clash with "Ethernet" fixed for LPC1768

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 3:5b17e4656dd0 1 /*****************************************************************************
hudakz 3:5b17e4656dd0 2 *
hudakz 3:5b17e4656dd0 3 * Title : Microchip ENC28J60 Ethernet Interface Driver
hudakz 3:5b17e4656dd0 4 * Author : Pascal Stang (c)2005
hudakz 3:5b17e4656dd0 5 * Modified by Norbert Truchsess
hudakz 3:5b17e4656dd0 6 * Copyright: GPL V2
hudakz 3:5b17e4656dd0 7 *
hudakz 3:5b17e4656dd0 8 *This driver provides initialization and transmit/receive
hudakz 3:5b17e4656dd0 9 *functions for the Microchip ENC28J60 10Mb Ethernet Controller and PHY.
hudakz 3:5b17e4656dd0 10 *This chip is novel in that it is a full MAC+PHY interface all in a 28-pin
hudakz 3:5b17e4656dd0 11 *chip, using an SPI interface to the host processor.
hudakz 3:5b17e4656dd0 12 *
hudakz 3:5b17e4656dd0 13 *
hudakz 3:5b17e4656dd0 14 *****************************************************************************/
hudakz 3:5b17e4656dd0 15 #ifndef ENC28J60_H
hudakz 3:5b17e4656dd0 16 #define ENC28J60_H
hudakz 3:5b17e4656dd0 17 #include <inttypes.h>
hudakz 3:5b17e4656dd0 18
hudakz 3:5b17e4656dd0 19 // ENC28J60 Control Registers
hudakz 3:5b17e4656dd0 20
hudakz 3:5b17e4656dd0 21 // Control register definitions are a combination of address,
hudakz 3:5b17e4656dd0 22 // bank number, and Ethernet/MAC/PHY indicator bits.
hudakz 3:5b17e4656dd0 23 // - Register address (bits 0-4)
hudakz 3:5b17e4656dd0 24 // - Bank number (bits 5-6)
hudakz 3:5b17e4656dd0 25 // - MAC/PHY indicator (bit 7)
hudakz 3:5b17e4656dd0 26 #define ADDR_MASK 0x1F
hudakz 3:5b17e4656dd0 27 #define BANK_MASK 0x60
hudakz 3:5b17e4656dd0 28 #define SPRD_MASK 0x80
hudakz 3:5b17e4656dd0 29 // All-bank registers
hudakz 3:5b17e4656dd0 30
hudakz 3:5b17e4656dd0 31 #define EIE 0x1B
hudakz 3:5b17e4656dd0 32 #define EIR 0x1C
hudakz 3:5b17e4656dd0 33 #define ESTAT 0x1D
hudakz 3:5b17e4656dd0 34 #define ECON2 0x1E
hudakz 3:5b17e4656dd0 35 #define ECON1 0x1F
hudakz 3:5b17e4656dd0 36 // Bank 0 registers
hudakz 3:5b17e4656dd0 37
hudakz 3:5b17e4656dd0 38 #define ERDPTL (0x00 | 0x00)
hudakz 3:5b17e4656dd0 39 #define ERDPTH (0x01 | 0x00)
hudakz 3:5b17e4656dd0 40 #define EWRPTL (0x02 | 0x00)
hudakz 3:5b17e4656dd0 41 #define EWRPTH (0x03 | 0x00)
hudakz 3:5b17e4656dd0 42 #define ETXSTL (0x04 | 0x00)
hudakz 3:5b17e4656dd0 43 #define ETXSTH (0x05 | 0x00)
hudakz 3:5b17e4656dd0 44 #define ETXNDL (0x06 | 0x00)
hudakz 3:5b17e4656dd0 45 #define ETXNDH (0x07 | 0x00)
hudakz 3:5b17e4656dd0 46 #define ERXSTL (0x08 | 0x00)
hudakz 3:5b17e4656dd0 47 #define ERXSTH (0x09 | 0x00)
hudakz 3:5b17e4656dd0 48 #define ERXNDL (0x0A | 0x00)
hudakz 3:5b17e4656dd0 49 #define ERXNDH (0x0B | 0x00)
hudakz 3:5b17e4656dd0 50 #define ERXRDPTL (0x0C | 0x00)
hudakz 3:5b17e4656dd0 51 #define ERXRDPTH (0x0D | 0x00)
hudakz 3:5b17e4656dd0 52 #define ERXWRPTL (0x0E | 0x00)
hudakz 3:5b17e4656dd0 53 #define ERXWRPTH (0x0F | 0x00)
hudakz 3:5b17e4656dd0 54 #define EDMASTL (0x10 | 0x00)
hudakz 3:5b17e4656dd0 55 #define EDMASTH (0x11 | 0x00)
hudakz 3:5b17e4656dd0 56 #define EDMANDL (0x12 | 0x00)
hudakz 3:5b17e4656dd0 57 #define EDMANDH (0x13 | 0x00)
hudakz 3:5b17e4656dd0 58 #define EDMADSTL (0x14 | 0x00)
hudakz 3:5b17e4656dd0 59 #define EDMADSTH (0x15 | 0x00)
hudakz 3:5b17e4656dd0 60 #define EDMACSL (0x16 | 0x00)
hudakz 3:5b17e4656dd0 61 #define EDMACSH (0x17 | 0x00)
hudakz 3:5b17e4656dd0 62 // Bank 1 registers
hudakz 3:5b17e4656dd0 63
hudakz 3:5b17e4656dd0 64 #define EHT0 (0x00 | 0x20)
hudakz 3:5b17e4656dd0 65 #define EHT1 (0x01 | 0x20)
hudakz 3:5b17e4656dd0 66 #define EHT2 (0x02 | 0x20)
hudakz 3:5b17e4656dd0 67 #define EHT3 (0x03 | 0x20)
hudakz 3:5b17e4656dd0 68 #define EHT4 (0x04 | 0x20)
hudakz 3:5b17e4656dd0 69 #define EHT5 (0x05 | 0x20)
hudakz 3:5b17e4656dd0 70 #define EHT6 (0x06 | 0x20)
hudakz 3:5b17e4656dd0 71 #define EHT7 (0x07 | 0x20)
hudakz 3:5b17e4656dd0 72 #define EPMM0 (0x08 | 0x20)
hudakz 3:5b17e4656dd0 73 #define EPMM1 (0x09 | 0x20)
hudakz 3:5b17e4656dd0 74 #define EPMM2 (0x0A | 0x20)
hudakz 3:5b17e4656dd0 75 #define EPMM3 (0x0B | 0x20)
hudakz 3:5b17e4656dd0 76 #define EPMM4 (0x0C | 0x20)
hudakz 3:5b17e4656dd0 77 #define EPMM5 (0x0D | 0x20)
hudakz 3:5b17e4656dd0 78 #define EPMM6 (0x0E | 0x20)
hudakz 3:5b17e4656dd0 79 #define EPMM7 (0x0F | 0x20)
hudakz 3:5b17e4656dd0 80 #define EPMCSL (0x10 | 0x20)
hudakz 3:5b17e4656dd0 81 #define EPMCSH (0x11 | 0x20)
hudakz 3:5b17e4656dd0 82 #define EPMOL (0x14 | 0x20)
hudakz 3:5b17e4656dd0 83 #define EPMOH (0x15 | 0x20)
hudakz 3:5b17e4656dd0 84 #define EWOLIE (0x16 | 0x20)
hudakz 3:5b17e4656dd0 85 #define EWOLIR (0x17 | 0x20)
hudakz 3:5b17e4656dd0 86 #define ERXFCON (0x18 | 0x20)
hudakz 3:5b17e4656dd0 87 #define EPKTCNT (0x19 | 0x20)
hudakz 3:5b17e4656dd0 88 // Bank 2 registers
hudakz 3:5b17e4656dd0 89
hudakz 3:5b17e4656dd0 90 #define MACON1 (0x00 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 91 #define MACON2 (0x01 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 92 #define MACON3 (0x02 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 93 #define MACON4 (0x03 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 94 #define MABBIPG (0x04 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 95 #define MAIPGL (0x06 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 96 #define MAIPGH (0x07 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 97 #define MACLCON1 (0x08 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 98 #define MACLCON2 (0x09 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 99 #define MAMXFLL (0x0A | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 100 #define MAMXFLH (0x0B | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 101 #define MAPHSUP (0x0D | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 102 #define MICON (0x11 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 103 #define MICMD (0x12 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 104 #define MIREGADR (0x14 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 105 #define MIWRL (0x16 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 106 #define MIWRH (0x17 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 107 #define MIRDL (0x18 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 108 #define MIRDH (0x19 | 0x40 | 0x80)
hudakz 3:5b17e4656dd0 109 // Bank 3 registers
hudakz 3:5b17e4656dd0 110
hudakz 3:5b17e4656dd0 111 #define MAADR1 (0x00 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 112 #define MAADR0 (0x01 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 113 #define MAADR3 (0x02 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 114 #define MAADR2 (0x03 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 115 #define MAADR5 (0x04 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 116 #define MAADR4 (0x05 | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 117 #define EBSTSD (0x06 | 0x60)
hudakz 3:5b17e4656dd0 118 #define EBSTCON (0x07 | 0x60)
hudakz 3:5b17e4656dd0 119 #define EBSTCSL (0x08 | 0x60)
hudakz 3:5b17e4656dd0 120 #define EBSTCSH (0x09 | 0x60)
hudakz 3:5b17e4656dd0 121 #define MISTAT (0x0A | 0x60 | 0x80)
hudakz 3:5b17e4656dd0 122 #define EREVID (0x12 | 0x60)
hudakz 3:5b17e4656dd0 123 #define ECOCON (0x15 | 0x60)
hudakz 3:5b17e4656dd0 124 #define EFLOCON (0x17 | 0x60)
hudakz 3:5b17e4656dd0 125 #define EPAUSL (0x18 | 0x60)
hudakz 3:5b17e4656dd0 126 #define EPAUSH (0x19 | 0x60)
hudakz 3:5b17e4656dd0 127 // PHY registers
hudakz 3:5b17e4656dd0 128
hudakz 3:5b17e4656dd0 129 #define PHCON1 0x00
hudakz 3:5b17e4656dd0 130 #define PHSTAT1 0x01
hudakz 3:5b17e4656dd0 131 #define PHHID1 0x02
hudakz 3:5b17e4656dd0 132 #define PHHID2 0x03
hudakz 3:5b17e4656dd0 133 #define PHCON2 0x10
hudakz 3:5b17e4656dd0 134 #define PHSTAT2 0x11
hudakz 3:5b17e4656dd0 135 #define PHIE 0x12
hudakz 3:5b17e4656dd0 136 #define PHIR 0x13
hudakz 3:5b17e4656dd0 137 #define PHLCON 0x14
hudakz 3:5b17e4656dd0 138
hudakz 3:5b17e4656dd0 139 // ENC28J60 ERXFCON Register Bit Definitions
hudakz 3:5b17e4656dd0 140
hudakz 3:5b17e4656dd0 141 #define ERXFCON_UCEN 0x80
hudakz 3:5b17e4656dd0 142 #define ERXFCON_ANDOR 0x40
hudakz 3:5b17e4656dd0 143 #define ERXFCON_CRCEN 0x20
hudakz 3:5b17e4656dd0 144 #define ERXFCON_PMEN 0x10
hudakz 3:5b17e4656dd0 145 #define ERXFCON_MPEN 0x08
hudakz 3:5b17e4656dd0 146 #define ERXFCON_HTEN 0x04
hudakz 3:5b17e4656dd0 147 #define ERXFCON_MCEN 0x02
hudakz 3:5b17e4656dd0 148 #define ERXFCON_BCEN 0x01
hudakz 3:5b17e4656dd0 149 // ENC28J60 EIE Register Bit Definitions
hudakz 3:5b17e4656dd0 150
hudakz 3:5b17e4656dd0 151 #define EIE_INTIE 0x80
hudakz 3:5b17e4656dd0 152 #define EIE_PKTIE 0x40
hudakz 3:5b17e4656dd0 153 #define EIE_DMAIE 0x20
hudakz 3:5b17e4656dd0 154 #define EIE_LINKIE 0x10
hudakz 3:5b17e4656dd0 155 #define EIE_TXIE 0x08
hudakz 3:5b17e4656dd0 156 #define EIE_WOLIE 0x04
hudakz 3:5b17e4656dd0 157 #define EIE_TXERIE 0x02
hudakz 3:5b17e4656dd0 158 #define EIE_RXERIE 0x01
hudakz 3:5b17e4656dd0 159 // ENC28J60 EIR Register Bit Definitions
hudakz 3:5b17e4656dd0 160
hudakz 3:5b17e4656dd0 161 #define EIR_PKTIF 0x40
hudakz 3:5b17e4656dd0 162 #define EIR_DMAIF 0x20
hudakz 3:5b17e4656dd0 163 #define EIR_LINKIF 0x10
hudakz 3:5b17e4656dd0 164 #define EIR_TXIF 0x08
hudakz 3:5b17e4656dd0 165 #define EIR_WOLIF 0x04
hudakz 3:5b17e4656dd0 166 #define EIR_TXERIF 0x02
hudakz 3:5b17e4656dd0 167 #define EIR_RXERIF 0x01
hudakz 3:5b17e4656dd0 168 // ENC28J60 ESTAT Register Bit Definitions
hudakz 3:5b17e4656dd0 169
hudakz 3:5b17e4656dd0 170 #define ESTAT_INT 0x80
hudakz 3:5b17e4656dd0 171 #define ESTAT_LATECOL 0x10
hudakz 3:5b17e4656dd0 172 #define ESTAT_RXBUSY 0x04
hudakz 3:5b17e4656dd0 173 #define ESTAT_TXABRT 0x02
hudakz 3:5b17e4656dd0 174 #define ESTAT_CLKRDY 0x01
hudakz 3:5b17e4656dd0 175 // ENC28J60 ECON2 Register Bit Definitions
hudakz 3:5b17e4656dd0 176
hudakz 3:5b17e4656dd0 177 #define ECON2_AUTOINC 0x80
hudakz 3:5b17e4656dd0 178 #define ECON2_PKTDEC 0x40
hudakz 3:5b17e4656dd0 179 #define ECON2_PWRSV 0x20
hudakz 3:5b17e4656dd0 180 #define ECON2_VRPS 0x08
hudakz 3:5b17e4656dd0 181 // ENC28J60 ECON1 Register Bit Definitions
hudakz 3:5b17e4656dd0 182
hudakz 3:5b17e4656dd0 183 #define ECON1_TXRST 0x80
hudakz 3:5b17e4656dd0 184 #define ECON1_RXRST 0x40
hudakz 3:5b17e4656dd0 185 #define ECON1_DMAST 0x20
hudakz 3:5b17e4656dd0 186 #define ECON1_CSUMEN 0x10
hudakz 3:5b17e4656dd0 187 #define ECON1_TXRTS 0x08
hudakz 3:5b17e4656dd0 188 #define ECON1_RXEN 0x04
hudakz 3:5b17e4656dd0 189 #define ECON1_BSEL1 0x02
hudakz 3:5b17e4656dd0 190 #define ECON1_BSEL0 0x01
hudakz 3:5b17e4656dd0 191 // ENC28J60 MACON1 Register Bit Definitions
hudakz 3:5b17e4656dd0 192
hudakz 3:5b17e4656dd0 193 #define MACON1_LOOPBK 0x10
hudakz 3:5b17e4656dd0 194 #define MACON1_TXPAUS 0x08
hudakz 3:5b17e4656dd0 195 #define MACON1_RXPAUS 0x04
hudakz 3:5b17e4656dd0 196 #define MACON1_PASSALL 0x02
hudakz 3:5b17e4656dd0 197 #define MACON1_MARXEN 0x01
hudakz 3:5b17e4656dd0 198 // ENC28J60 MACON2 Register Bit Definitions
hudakz 3:5b17e4656dd0 199
hudakz 3:5b17e4656dd0 200 #define MACON2_MARST 0x80
hudakz 3:5b17e4656dd0 201 #define MACON2_RNDRST 0x40
hudakz 3:5b17e4656dd0 202 #define MACON2_MARXRST 0x08
hudakz 3:5b17e4656dd0 203 #define MACON2_RFUNRST 0x04
hudakz 3:5b17e4656dd0 204 #define MACON2_MATXRST 0x02
hudakz 3:5b17e4656dd0 205 #define MACON2_TFUNRST 0x01
hudakz 3:5b17e4656dd0 206 // ENC28J60 MACON3 Register Bit Definitions
hudakz 3:5b17e4656dd0 207
hudakz 3:5b17e4656dd0 208 #define MACON3_PADCFG2 0x80
hudakz 3:5b17e4656dd0 209 #define MACON3_PADCFG1 0x40
hudakz 3:5b17e4656dd0 210 #define MACON3_PADCFG0 0x20
hudakz 3:5b17e4656dd0 211 #define MACON3_TXCRCEN 0x10
hudakz 3:5b17e4656dd0 212 #define MACON3_PHDRLEN 0x08
hudakz 3:5b17e4656dd0 213 #define MACON3_HFRMLEN 0x04
hudakz 3:5b17e4656dd0 214 #define MACON3_FRMLNEN 0x02
hudakz 3:5b17e4656dd0 215 #define MACON3_FULDPX 0x01
hudakz 3:5b17e4656dd0 216 // ENC28J60 MICMD Register Bit Definitions
hudakz 3:5b17e4656dd0 217
hudakz 3:5b17e4656dd0 218 #define MICMD_MIISCAN 0x02
hudakz 3:5b17e4656dd0 219 #define MICMD_MIIRD 0x01
hudakz 3:5b17e4656dd0 220 // ENC28J60 MISTAT Register Bit Definitions
hudakz 3:5b17e4656dd0 221
hudakz 3:5b17e4656dd0 222 #define MISTAT_NVALID 0x04
hudakz 3:5b17e4656dd0 223 #define MISTAT_SCAN 0x02
hudakz 3:5b17e4656dd0 224 #define MISTAT_BUSY 0x01
hudakz 3:5b17e4656dd0 225 // ENC28J60 PHY PHCON1 Register Bit Definitions
hudakz 3:5b17e4656dd0 226
hudakz 3:5b17e4656dd0 227 #define PHCON1_PRST 0x8000
hudakz 3:5b17e4656dd0 228 #define PHCON1_PLOOPBK 0x4000
hudakz 3:5b17e4656dd0 229 #define PHCON1_PPWRSV 0x0800
hudakz 3:5b17e4656dd0 230 #define PHCON1_PDPXMD 0x0100
hudakz 3:5b17e4656dd0 231 // ENC28J60 PHY PHSTAT1 Register Bit Definitions
hudakz 3:5b17e4656dd0 232
hudakz 3:5b17e4656dd0 233 #define PHSTAT1_PFDPX 0x1000
hudakz 3:5b17e4656dd0 234 #define PHSTAT1_PHDPX 0x0800
hudakz 3:5b17e4656dd0 235 #define PHSTAT1_LLSTAT 0x0004
hudakz 3:5b17e4656dd0 236 #define PHSTAT1_JBSTAT 0x0002
hudakz 3:5b17e4656dd0 237 // ENC28J60 PHY PHCON2 Register Bit Definitions
hudakz 3:5b17e4656dd0 238
hudakz 3:5b17e4656dd0 239 #define PHCON2_FRCLINK 0x4000
hudakz 3:5b17e4656dd0 240 #define PHCON2_TXDIS 0x2000
hudakz 3:5b17e4656dd0 241 #define PHCON2_JABBER 0x0400
hudakz 3:5b17e4656dd0 242 #define PHCON2_HDLDIS 0x0100
hudakz 3:5b17e4656dd0 243
hudakz 3:5b17e4656dd0 244 // ENC28J60 Packet Control Byte Bit Definitions
hudakz 3:5b17e4656dd0 245
hudakz 3:5b17e4656dd0 246 #define PKTCTRL_PHUGEEN 0x08
hudakz 3:5b17e4656dd0 247 #define PKTCTRL_PPADEN 0x04
hudakz 3:5b17e4656dd0 248 #define PKTCTRL_PCRCEN 0x02
hudakz 3:5b17e4656dd0 249 #define PKTCTRL_POVERRIDE 0x01
hudakz 3:5b17e4656dd0 250
hudakz 3:5b17e4656dd0 251 // SPI operation codes
hudakz 3:5b17e4656dd0 252
hudakz 3:5b17e4656dd0 253 #define ENC28J60_READ_CTRL_REG 0x00
hudakz 3:5b17e4656dd0 254 #define ENC28J60_READ_BUF_MEM 0x3A
hudakz 3:5b17e4656dd0 255 #define ENC28J60_WRITE_CTRL_REG 0x40
hudakz 3:5b17e4656dd0 256 #define ENC28J60_WRITE_BUF_MEM 0x7A
hudakz 3:5b17e4656dd0 257 #define ENC28J60_BIT_FIELD_SET 0x80
hudakz 3:5b17e4656dd0 258 #define ENC28J60_BIT_FIELD_CLR 0xA0
hudakz 3:5b17e4656dd0 259 #define ENC28J60_SOFT_RESET 0xFF
hudakz 3:5b17e4656dd0 260
hudakz 3:5b17e4656dd0 261 // The RXSTART_INIT should be zero. See Rev. B4 Silicon Errata
hudakz 3:5b17e4656dd0 262
hudakz 3:5b17e4656dd0 263 // buffer boundaries applied to internal 8K ram
hudakz 3:5b17e4656dd0 264 // the entire available packet buffer space is allocated
hudakz 3:5b17e4656dd0 265 //
hudakz 3:5b17e4656dd0 266 // start with recbuf at 0/
hudakz 3:5b17e4656dd0 267 #define RXSTART_INIT 0x0
hudakz 3:5b17e4656dd0 268 // receive buffer end. make sure this is an odd value ( See Rev. B1,B4,B5,B7 Silicon Errata 'Memory (Ethernet Buffer)')
hudakz 3:5b17e4656dd0 269
hudakz 3:5b17e4656dd0 270 #define RXSTOP_INIT (0x1FFF - 0x1800)
hudakz 3:5b17e4656dd0 271 // start TX buffer RXSTOP_INIT+1
hudakz 3:5b17e4656dd0 272
hudakz 3:5b17e4656dd0 273 #define TXSTART_INIT (RXSTOP_INIT + 1)
hudakz 3:5b17e4656dd0 274 // stp TX buffer at end of mem
hudakz 3:5b17e4656dd0 275
hudakz 3:5b17e4656dd0 276 #define TXSTOP_INIT 0x1FFF
hudakz 3:5b17e4656dd0 277 //
hudakz 3:5b17e4656dd0 278
hudakz 3:5b17e4656dd0 279 // max frame length which the conroller will accept:
hudakz 3:5b17e4656dd0 280 #define MAX_FRAMELEN 1500 // (note: maximum ethernet frame length would be 1518)
hudakz 3:5b17e4656dd0 281
hudakz 3:5b17e4656dd0 282 //#define MAX_FRAMELEN 600
hudakz 3:5b17e4656dd0 283 #endif