Webserver+3d print

Dependents:   Nucleo

cyclone_tcp/drivers/enc28j60.h

Committer:
Sergunb
Date:
2017-02-04
Revision:
0:8918a71cdbe9

File content as of revision 0:8918a71cdbe9:

/**
 * @file enc28j60.h
 * @brief ENC28J60 Ethernet controller
 *
 * @section License
 *
 * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved.
 *
 * This file is part of CycloneTCP Open.
 *
 * This program 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
 * of the License, or (at your option) any later version.
 *
 * This program 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 this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * @author Oryx Embedded SARL (www.oryx-embedded.com)
 * @version 1.7.6
 **/

#ifndef _ENC28J60_H
#define _ENC28J60_H

//Full-duplex support
#ifndef ENC28J60_FULL_DUPLEX_SUPPORT
   #define ENC28J60_FULL_DUPLEX_SUPPORT ENABLED
#elif (ENC28J60_FULL_DUPLEX_SUPPORT != ENABLED && ENC28J60_FULL_DUPLEX_SUPPORT != DISABLED)
   #error ENC28J60_FULL_DUPLEX_SUPPORT parameter is not valid
#endif

//Silicon revision identifiers
#define ENC28J60_REV_B1 0x02
#define ENC28J60_REV_B4 0x04
#define ENC28J60_REV_B5 0x05
#define ENC28J60_REV_B7 0x06

//Receive and transmit buffers
#define ENC28J60_RX_BUFFER_START 0x0000
#define ENC28J60_RX_BUFFER_STOP  0x17FF
#define ENC28J60_TX_BUFFER_START 0x1800
#define ENC28J60_TX_BUFFER_STOP  0x1FFF

//SPI command set
#define ENC28J60_CMD_RCR 0x00
#define ENC28J60_CMD_RBM 0x3A
#define ENC28J60_CMD_WCR 0x40
#define ENC28J60_CMD_WBM 0x7A
#define ENC28J60_CMD_BFS 0x80
#define ENC28J60_CMD_BFC 0xA0
#define ENC28J60_CMD_SRC 0xFF

//ENC28J60 register types
#define ETH_REG_TYPE 0x0000
#define MAC_REG_TYPE 0x1000
#define MII_REG_TYPE 0x2000
#define PHY_REG_TYPE 0x3000

//ENC28J60 banks
#define BANK_0 0x0000
#define BANK_1 0x0100
#define BANK_2 0x0200
#define BANK_3 0x0300

//Related masks
#define REG_TYPE_MASK 0xF000
#define REG_BANK_MASK 0x0F00
#define REG_ADDR_MASK 0x001F

//Bank 0 registers
#define ENC28J60_REG_ERDPTL      (ETH_REG_TYPE | BANK_0 | 0x00)
#define ENC28J60_REG_ERDPTH      (ETH_REG_TYPE | BANK_0 | 0x01)
#define ENC28J60_REG_EWRPTL      (ETH_REG_TYPE | BANK_0 | 0x02)
#define ENC28J60_REG_EWRPTH      (ETH_REG_TYPE | BANK_0 | 0x03)
#define ENC28J60_REG_ETXSTL      (ETH_REG_TYPE | BANK_0 | 0x04)
#define ENC28J60_REG_ETXSTH      (ETH_REG_TYPE | BANK_0 | 0x05)
#define ENC28J60_REG_ETXNDL      (ETH_REG_TYPE | BANK_0 | 0x06)
#define ENC28J60_REG_ETXNDH      (ETH_REG_TYPE | BANK_0 | 0x07)
#define ENC28J60_REG_ERXSTL      (ETH_REG_TYPE | BANK_0 | 0x08)
#define ENC28J60_REG_ERXSTH      (ETH_REG_TYPE | BANK_0 | 0x09)
#define ENC28J60_REG_ERXNDL      (ETH_REG_TYPE | BANK_0 | 0x0A)
#define ENC28J60_REG_ERXNDH      (ETH_REG_TYPE | BANK_0 | 0x0B)
#define ENC28J60_REG_ERXRDPTL    (ETH_REG_TYPE | BANK_0 | 0x0C)
#define ENC28J60_REG_ERXRDPTH    (ETH_REG_TYPE | BANK_0 | 0x0D)
#define ENC28J60_REG_ERXWRPTL    (ETH_REG_TYPE | BANK_0 | 0x0E)
#define ENC28J60_REG_ERXWRPTH    (ETH_REG_TYPE | BANK_0 | 0x0F)
#define ENC28J60_REG_EDMASTL     (ETH_REG_TYPE | BANK_0 | 0x10)
#define ENC28J60_REG_EDMASTH     (ETH_REG_TYPE | BANK_0 | 0x11)
#define ENC28J60_REG_EDMANDL     (ETH_REG_TYPE | BANK_0 | 0x12)
#define ENC28J60_REG_EDMANDH     (ETH_REG_TYPE | BANK_0 | 0x13)
#define ENC28J60_REG_EDMADSTL    (ETH_REG_TYPE | BANK_0 | 0x14)
#define ENC28J60_REG_EDMADSTH    (ETH_REG_TYPE | BANK_0 | 0x15)
#define ENC28J60_REG_EDMACSL     (ETH_REG_TYPE | BANK_0 | 0x16)
#define ENC28J60_REG_EDMACSH     (ETH_REG_TYPE | BANK_0 | 0x17)
#define ENC28J60_REG_EIE         (ETH_REG_TYPE | BANK_0 | 0x1B)
#define ENC28J60_REG_EIR         (ETH_REG_TYPE | BANK_0 | 0x1C)
#define ENC28J60_REG_ESTAT       (ETH_REG_TYPE | BANK_0 | 0x1D)
#define ENC28J60_REG_ECON2       (ETH_REG_TYPE | BANK_0 | 0x1E)
#define ENC28J60_REG_ECON1       (ETH_REG_TYPE | BANK_0 | 0x1F)

//Bank 1 registers
#define ENC28J60_REG_EHT0        (ETH_REG_TYPE | BANK_1 | 0x00)
#define ENC28J60_REG_EHT1        (ETH_REG_TYPE | BANK_1 | 0x01)
#define ENC28J60_REG_EHT2        (ETH_REG_TYPE | BANK_1 | 0x02)
#define ENC28J60_REG_EHT3        (ETH_REG_TYPE | BANK_1 | 0x03)
#define ENC28J60_REG_EHT4        (ETH_REG_TYPE | BANK_1 | 0x04)
#define ENC28J60_REG_EHT5        (ETH_REG_TYPE | BANK_1 | 0x05)
#define ENC28J60_REG_EHT6        (ETH_REG_TYPE | BANK_1 | 0x06)
#define ENC28J60_REG_EHT7        (ETH_REG_TYPE | BANK_1 | 0x07)
#define ENC28J60_REG_EPMM0       (ETH_REG_TYPE | BANK_1 | 0x08)
#define ENC28J60_REG_EPMM1       (ETH_REG_TYPE | BANK_1 | 0x09)
#define ENC28J60_REG_EPMM2       (ETH_REG_TYPE | BANK_1 | 0x0A)
#define ENC28J60_REG_EPMM3       (ETH_REG_TYPE | BANK_1 | 0x0B)
#define ENC28J60_REG_EPMM4       (ETH_REG_TYPE | BANK_1 | 0x0C)
#define ENC28J60_REG_EPMM5       (ETH_REG_TYPE | BANK_1 | 0x0D)
#define ENC28J60_REG_EPMM6       (ETH_REG_TYPE | BANK_1 | 0x0E)
#define ENC28J60_REG_EPMM7       (ETH_REG_TYPE | BANK_1 | 0x0F)
#define ENC28J60_REG_EPMCSL      (ETH_REG_TYPE | BANK_1 | 0x10)
#define ENC28J60_REG_EPMCSH      (ETH_REG_TYPE | BANK_1 | 0x11)
#define ENC28J60_REG_EPMOL       (ETH_REG_TYPE | BANK_1 | 0x14)
#define ENC28J60_REG_EPMOH       (ETH_REG_TYPE | BANK_1 | 0x15)
#define ENC28J60_REG_EWOLIE      (ETH_REG_TYPE | BANK_1 | 0x16)
#define ENC28J60_REG_EWOLIR      (ETH_REG_TYPE | BANK_1 | 0x17)
#define ENC28J60_REG_ERXFCON     (ETH_REG_TYPE | BANK_1 | 0x18)
#define ENC28J60_REG_EPKTCNT     (ETH_REG_TYPE | BANK_1 | 0x19)

//Bank 2 registers
#define ENC28J60_REG_MACON1      (MAC_REG_TYPE | BANK_2 | 0x00)
#define ENC28J60_REG_MACON2      (MAC_REG_TYPE | BANK_2 | 0x01)
#define ENC28J60_REG_MACON3      (MAC_REG_TYPE | BANK_2 | 0x02)
#define ENC28J60_REG_MACON4      (MAC_REG_TYPE | BANK_2 | 0x03)
#define ENC28J60_REG_MABBIPG     (MAC_REG_TYPE | BANK_2 | 0x04)
#define ENC28J60_REG_MAIPGL      (MAC_REG_TYPE | BANK_2 | 0x06)
#define ENC28J60_REG_MAIPGH      (MAC_REG_TYPE | BANK_2 | 0x07)
#define ENC28J60_REG_MACLCON1    (MAC_REG_TYPE | BANK_2 | 0x08)
#define ENC28J60_REG_MACLCON2    (MAC_REG_TYPE | BANK_2 | 0x09)
#define ENC28J60_REG_MAMXFLL     (MAC_REG_TYPE | BANK_2 | 0x0A)
#define ENC28J60_REG_MAMXFLH     (MAC_REG_TYPE | BANK_2 | 0x0B)
#define ENC28J60_REG_MAPHSUP     (MAC_REG_TYPE | BANK_2 | 0x0D)
#define ENC28J60_REG_MICON       (MII_REG_TYPE | BANK_2 | 0x11)
#define ENC28J60_REG_MICMD       (MII_REG_TYPE | BANK_2 | 0x12)
#define ENC28J60_REG_MIREGADR    (MII_REG_TYPE | BANK_2 | 0x14)
#define ENC28J60_REG_MIWRL       (MII_REG_TYPE | BANK_2 | 0x16)
#define ENC28J60_REG_MIWRH       (MII_REG_TYPE | BANK_2 | 0x17)
#define ENC28J60_REG_MIRDL       (MII_REG_TYPE | BANK_2 | 0x18)
#define ENC28J60_REG_MIRDH       (MII_REG_TYPE | BANK_2 | 0x19)

//Bank 3 registers
#define ENC28J60_REG_MAADR5      (MAC_REG_TYPE | BANK_3 | 0x00)
#define ENC28J60_REG_MAADR6      (MAC_REG_TYPE | BANK_3 | 0x01)
#define ENC28J60_REG_MAADR3      (MAC_REG_TYPE | BANK_3 | 0x02)
#define ENC28J60_REG_MAADR4      (MAC_REG_TYPE | BANK_3 | 0x03)
#define ENC28J60_REG_MAADR1      (MAC_REG_TYPE | BANK_3 | 0x04)
#define ENC28J60_REG_MAADR2      (MAC_REG_TYPE | BANK_3 | 0x05)
#define ENC28J60_REG_EBSTSD      (ETH_REG_TYPE | BANK_3 | 0x06)
#define ENC28J60_REG_EBSTCON     (ETH_REG_TYPE | BANK_3 | 0x07)
#define ENC28J60_REG_EBSTCSL     (ETH_REG_TYPE | BANK_3 | 0x08)
#define ENC28J60_REG_EBSTCSH     (ETH_REG_TYPE | BANK_3 | 0x09)
#define ENC28J60_REG_MISTAT      (MII_REG_TYPE | BANK_3 | 0x0A)
#define ENC28J60_REG_EREVID      (ETH_REG_TYPE | BANK_3 | 0x12)
#define ENC28J60_REG_ECOCON      (ETH_REG_TYPE | BANK_3 | 0x15)
#define ENC28J60_REG_EFLOCON     (ETH_REG_TYPE | BANK_3 | 0x17)
#define ENC28J60_REG_EPAUSL      (ETH_REG_TYPE | BANK_3 | 0x18)
#define ENC28J60_REG_EPAUSH      (ETH_REG_TYPE | BANK_3 | 0x19)

//PHY registers
#define ENC28J60_PHY_REG_PHCON1  (PHY_REG_TYPE | 0x00)
#define ENC28J60_PHY_REG_PHSTAT1 (PHY_REG_TYPE | 0x01)
#define ENC28J60_PHY_REG_PHID1   (PHY_REG_TYPE | 0x02)
#define ENC28J60_PHY_REG_PHID2   (PHY_REG_TYPE | 0x03)
#define ENC28J60_PHY_REG_PHCON2  (PHY_REG_TYPE | 0x10)
#define ENC28J60_PHY_REG_PHSTAT2 (PHY_REG_TYPE | 0x11)
#define ENC28J60_PHY_REG_PHIE    (PHY_REG_TYPE | 0x12)
#define ENC28J60_PHY_REG_PHIR    (PHY_REG_TYPE | 0x13)
#define ENC28J60_PHY_REG_PHLCON  (PHY_REG_TYPE | 0x14)

//EIE register
#define EIE_INTIE         (1 << 7)
#define EIE_PKTIE         (1 << 6)
#define EIE_DMAIE         (1 << 5)
#define EIE_LINKIE        (1 << 4)
#define EIE_TXIE          (1 << 3)
#define EIE_WOLIE         (1 << 2)
#define EIE_TXERIE        (1 << 1)
#define EIE_RXERIE        (1 << 0)

//EIR register
#define EIR_PKTIF         (1 << 6)
#define EIR_DMAIF         (1 << 5)
#define EIR_LINKIF        (1 << 4)
#define EIR_TXIF          (1 << 3)
#define EIR_WOLIF         (1 << 2)
#define EIR_TXERIF        (1 << 1)
#define EIR_RXERIF        (1 << 0)

//ESTAT register
#define ESTAT_INT         (1 << 7)
#define ESTAT_LATECOL     (1 << 4)
#define ESTAT_RXBUSY      (1 << 2)
#define ESTAT_TXABRT      (1 << 1)
#define ESTAT_CLKRDY      (1 << 0)

//ECON2 register
#define ECON2_AUTOINC     (1 << 7)
#define ECON2_PKTDEC      (1 << 6)
#define ECON2_PWRSV       (1 << 5)
#define ECON2_VRPS        (1 << 3)

//ECON1 register
#define ECON1_TXRST       (1 << 7)
#define ECON1_RXRST       (1 << 6)
#define ECON1_DMAST       (1 << 5)
#define ECON1_CSUMEN      (1 << 4)
#define ECON1_TXRTS       (1 << 3)
#define ECON1_RXEN        (1 << 2)
#define ECON1_BSEL1       (1 << 1)
#define ECON1_BSEL0       (1 << 0)

//ERXFCON register
#define ERXFCON_UCEN      (1 << 7)
#define ERXFCON_ANDOR     (1 << 6)
#define ERXFCON_CRCEN     (1 << 5)
#define ERXFCON_PMEN      (1 << 4)
#define ERXFCON_MPEN      (1 << 3)
#define ERXFCON_HTEN      (1 << 2)
#define ERXFCON_MCEN      (1 << 1)
#define ERXFCON_BCEN      (1 << 0)

//MACON1 register
#define MACON1_LOOPBK     (1 << 4)
#define MACON1_TXPAUS     (1 << 3)
#define MACON1_RXPAUS     (1 << 2)
#define MACON1_PASSALL    (1 << 1)
#define MACON1_MARXEN     (1 << 0)

//MACON2 register
#define MACON2_MARST      (1 << 7)
#define MACON2_RNDRST     (1 << 6)
#define MACON2_MARXRST    (1 << 3)
#define MACON2_RFUNRST    (1 << 2)
#define MACON2_MATXRST    (1 << 1)
#define MACON2_TFUNRST    (1 << 0)

//MACON3 register
#define MACON3_PADCFG2    (1 << 7)
#define MACON3_PADCFG1    (1 << 6)
#define MACON3_PADCFG0    (1 << 5)
#define MACON3_TXCRCEN    (1 << 4)
#define MACON3_PHDRLEN    (1 << 3)
#define MACON3_HFRMLEN    (1 << 2)
#define MACON3_FRMLNEN    (1 << 1)
#define MACON3_FULDPX     (1 << 0)

#define MACON3_PADCFG(x) ((x) << 5)

//MACON4 register
#define MACON4_DEFER      (1 << 6)
#define MACON4_BPEN       (1 << 5)
#define MACON4_NOBKOFF    (1 << 4)
#define MACON4_LONGPRE    (1 << 1)
#define MACON4_PUREPRE    (1 << 0)

//MAPHSUP register
#define MAPHSUP_RSTINTFC  (1 << 7)
#define MAPHSUP_RSTRMII   (1 << 3)

//MICON register
#define MICON_RSTMII      (1 << 7)

//MICMD register
#define MICMD_MIISCAN     (1 << 1)
#define MICMD_MIIRD       (1 << 0)

//EBSTCON register
#define EBSTCON_PSV2      (1 << 7)
#define EBSTCON_PSV1      (1 << 6)
#define EBSTCON_PSV0      (1 << 5)
#define EBSTCON_PSEL      (1 << 4)
#define EBSTCON_TMSEL1    (1 << 3)
#define EBSTCON_TMSEL0    (1 << 2)
#define EBSTCON_TME       (1 << 1)
#define EBSTCON_BISTST    (1 << 0)

//MISTAT register
#define MISTAT_NVALID     (1 << 2)
#define MISTAT_SCAN       (1 << 1)
#define MISTAT_BUSY       (1 << 0)

//ECOCON register
#define ECOCON_COCON2     (1 << 2)
#define ECOCON_COCON1     (1 << 1)
#define ECOCON_COCON0     (1 << 0)

//EFLOCON register
#define EFLOCON_FULDPXS   (1 << 2)
#define EFLOCON_FCEN1     (1 << 1)
#define EFLOCON_FCEN0     (1 << 0)

//PHCON1 register
#define PHCON1_PRST       (1 << 15)
#define PHCON1_PLOOPBK    (1 << 14)
#define PHCON1_PPWRSV     (1 << 11)
#define PHCON1_PDPXMD     (1 << 8)

//PHSTAT1 register
#define PHSTAT1_PFDPX     (1 << 12)
#define PHSTAT1_PHDPX     (1 << 11)
#define PHSTAT1_LLSTAT    (1 << 2)
#define PHSTAT1_JBSTAT    (1 << 1)

//PHCON2 register
#define PHCON2_FRCLINK    (1 << 14)
#define PHCON2_TXDIS      (1 << 13)
#define PHCON2_JABBER     (1 << 10)
#define PHCON2_HDLDIS     (1 << 8)

//PHSTAT2 register
#define PHSTAT2_TXSTAT    (1 << 13)
#define PHSTAT2_RXSTAT    (1 << 12)
#define PHSTAT2_COLSTAT   (1 << 11)
#define PHSTAT2_LSTAT     (1 << 10)
#define PHSTAT2_DPXSTAT   (1 << 9)
#define PHSTAT2_PLRITY    (1 << 4)

//PHIE register
#define PHIE_PLNKIE       (1 << 4)
#define PHIE_PGEIE        (1 << 1)

//PHIR register
#define PHIR_PLNKIF       (1 << 4)
#define PHIR_PGIF         (1 << 2)

//PHLCON register
#define PHLCON_LACFG3     (1 << 11)
#define PHLCON_LACFG2     (1 << 10)
#define PHLCON_LACFG1     (1 << 9)
#define PHLCON_LACFG0     (1 << 8)
#define PHLCON_LBCFG3     (1 << 7)
#define PHLCON_LBCFG2     (1 << 6)
#define PHLCON_LBCFG1     (1 << 5)
#define PHLCON_LBCFG0     (1 << 4)
#define PHLCON_LFRQ1      (1 << 3)
#define PHLCON_LFRQ0      (1 << 2)
#define PHLCON_STRCH      (1 << 1)

#define PHLCON_LACFG(x)  ((x) << 8)
#define PHLCON_LBCFG(x)  ((x) << 4)
#define PHLCON_LFRQ(x)   ((x) << 2)

//Per-packet control byte
#define TX_CTRL_PHUGEEN   (1 << 3)
#define TX_CTRL_PPADEN    (1 << 2)
#define TX_CTRL_PCRCEN    (1 << 1)
#define TX_CTRL_POVERRIDE (1 << 0)

//Receive status vector
#define RSV_VLAN_TYPE           0x4000
#define RSV_UNKNOWN_OPCODE      0x2000
#define RSV_PAUSE_CONTROL_FRAME 0x1000
#define RSV_CONTROL_FRAME       0x0800
#define RSV_DRIBBLE_NIBBLE      0x0400
#define RSV_BROADCAST_PACKET    0x0200
#define RSV_MULTICAST_PACKET    0x0100
#define RSV_RECEIVED_OK         0x0080
#define RSV_LENGTH_OUT_OF_RANGE 0x0040
#define RSV_LENGTH_CHECK_ERROR  0x0020
#define RSV_CRC_ERROR           0x0010
#define RSV_CARRIER_EVENT       0x0004
#define RSV_DROP_EVENT          0x0001


/**
 * @brief ENC28J60 driver context
 **/

typedef struct
{
   uint16_t currentBank; ///<Current bank
   uint16_t nextPacket;  ///<Next packet in the receive buffer
   uint8_t *rxBuffer;    ///<Receive buffer
} Enc28j60Context;


//ENC28J60 driver
extern const NicDriver enc28j60Driver;

//ENC28J60 related functions
error_t enc28j60Init(NetInterface *interface);

void enc28j60Tick(NetInterface *interface);

void enc28j60EnableIrq(NetInterface *interface);
void enc28j60DisableIrq(NetInterface *interface);
bool_t enc28j60IrqHandler(NetInterface *interface);
void enc28j60EventHandler(NetInterface *interface);

error_t enc28j60SendPacket(NetInterface *interface,
   const NetBuffer *buffer, size_t offset);

error_t enc28j60ReceivePacket(NetInterface *interface);

error_t enc28j60SetMulticastFilter(NetInterface *interface);

void enc28j60SoftReset(NetInterface *interface);
void enc28j60SelectBank(NetInterface *interface, uint16_t address);

void enc28j60WriteReg(NetInterface *interface, uint16_t address, uint8_t data);
uint8_t enc28j60ReadReg(NetInterface *interface, uint16_t address);

void enc28j60WritePhyReg(NetInterface *interface, uint16_t address, uint16_t data);
uint16_t enc28j60ReadPhyReg(NetInterface *interface, uint16_t address);

void enc28j60WriteBuffer(NetInterface *interface,
   const NetBuffer *buffer, size_t offset);

void enc28j60ReadBuffer(NetInterface *interface,
   uint8_t *data, size_t length);

void enc28j60SetBit(NetInterface *interface, uint16_t address, uint16_t mask);
void enc28j60ClearBit(NetInterface *interface, uint16_t address, uint16_t mask);

uint32_t enc28j60CalcCrc(const void *data, size_t length);

void enc28j60DumpReg(NetInterface *interface);
void enc28j60DumpPhyReg(NetInterface *interface);

#endif