/*
* Copyright 2015 Ettus Research LLC
*
* 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 3 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, see .
*/
#ifndef _NET_ENC28J60_H_
#define _NET_ENC28J60_H_
#include
#define SPI_DDR DDRB
#define SPI_PORT PORTB
#define SPI_CS 0
#define SPI_MOSI 2
#define SPI_MISO 3
#define SPI_SCK 1
// Register Masks
#define ADDR_MASK 0x1F
#define BANK_MASK 0x60
#define SPRD_MASK 0x80
// All Banks Registers
#define EIE 0x1B
#define EIR 0x1C
#define ESTAT 0x1D
#define ECON2 0x1E
#define ECON1 0x1F
// Bank 0 Registers
#define ERDPTL 0x00
#define ERDPTH 0x01
#define EWRPTL 0x02
#define EWRPTH 0x03
#define ETXSTL 0x04
#define ETXSTH 0x05
#define ETXNDL 0x06
#define ETXNDH 0x07
#define ERXSTL 0x08
#define ERXSTH 0x09
#define ERXNDL 0x0A
#define ERXNDH 0x0B
#define ERXRDPTL 0x0C
#define ERXRDPTH 0x0D
#define ERXWRPTL 0x0E
#define ERXWRPTH 0x0F
#define EDMASTL 0x10
#define EDMASTH 0x11
#define EDMANDL 0x12
#define EDMANDH 0x13
#define EDMADSTL 0x14
#define EDMADSTH 0x15
#define EDMACSL 0x16
#define EDMACSH 0x17
// Bank 1 Registers
#define EHT0 0x20
#define EHT1 0x21
#define EHT2 0x22
#define EHT3 0x23
#define EHT4 0x24
#define EHT5 0x25
#define EHT6 0x26
#define EHT7 0x27
#define EPMM0 0x28
#define EPMM1 0x29
#define EPMM2 0x2A
#define EPMM3 0x2B
#define EPMM4 0x2C
#define EPMM5 0x2D
#define EPMM6 0x2E
#define EPMM7 0x2F
#define EPMCSL 0x30
#define EPMCSH 0x31
#define EPMOL 0x34
#define EPMOH 0x35
#define EWOLIE 0x36
#define EWOLIR 0x37
#define ERXFCON 0x38
#define EPKTCNT 0x39
// Bank 2 Register
#define MACON1 0xC0
#define MACON2 0xC1
#define MACON3 0xC2
#define MACON4 0xC3
#define MABBIPG 0xC4
#define MAIPGL 0xC6
#define MAIPGH 0xC7
#define MACLCON1 0xC8
#define MACLCON2 0xC9
#define MAMXFLL 0xCA
#define MAMXFLH 0xCB
#define MAPHSUP 0xCD
#define MICON 0xD1
#define MICMD 0xD2
#define MIREGADR 0xD4
#define MIWRL 0xD6
#define MIWRH 0xD7
#define MIRDL 0xD8
#define MIRDH 0xD9
// Bank 3 Registers
#define MAADR1 0xE0
#define MAADR0 0xE1
#define MAADR3 0xE2
#define MAADR2 0xE3
#define MAADR5 0xE4
#define MAADR4 0xE5
#define EBSTSD 0x66
#define EBSTCON 0x67
#define EBSTCSL 0x68
#define EBSTCSH 0x69
#define MISTAT 0xEA
#define EREVID 0x72
#define ECOCON 0x75
#define EFLOCON 0x77
#define EPAUSL 0x78
#define EPAUSH 0x79
// PHY Registers
#define PHCON1 0x00
#define PHSTAT1 0x01
#define PHHID1 0x02
#define PHHID2 0x03
#define PHCON2 0x10
#define PHSTAT2 0x11
#define PHIE 0x12
#define PHIR 0x13
#define PHLCON 0x14
// ERXFCON bit definitions
#define UCEN 0x80
#define ANDOR 0x40
#define CRCEN 0x20
#define PMEN 0x10
#define MPEN 0x08
#define HTEN 0x04
#define MCEN 0x02
#define BCEN 0x01
// EIE bit definitions
#define INTIE 0x80
#define PKTIE 0x40
#define DMAIE 0x20
#define LINKIE 0x10
#define TXIE 0x08
#define WOLIE 0x04
#define TXERIE 0x02
#define RXERIE 0x01
// EIR bit definitions
#define PKTIF 0x40
#define DMAIF 0x20
#define LINKIF 0x10
#define TXIF 0x08
#define WOLIF 0x04
#define TXERIF 0x02
#define RXERIF 0x01
// ESTAT bit definitions
#define INT 0x80
#define LATECOL 0x10
#define RXBUSY 0x04
#define TXABRT 0x02
#define CLKRDY 0x01
// ECON2 bit definitions
#define AUTOINC 0x80
#define PKTDEC 0x40
#define PWRSV 0x20
#define VRPS 0x08
// ECON1 bit definitions
#define TXRST 0x80
#define RXRST 0x40
#define DMAST 0x20
#define CSUMEN 0x10
#define TXRTS 0x08
#define ENCRXEN 0x04
#define BSEL1 0x02
#define BSEL0 0x01
// MACON1 bit definitions
#define LOOPBK 0x10
#define TXPAUS 0x08
#define RXPAUS 0x04
#define PASSALL 0x02
#define MARXEN 0x01
// MACON2 bit definitions
#define MARST 0x80
#define RNDRST 0x40
#define MARXRST 0x08
#define RFUNRST 0x04
#define MATXRST 0x02
#define TFUNRST 0x01
// MACON3 bit definitions
#define PADCFG2 0x80
#define PADCFG1 0x40
#define PADCFG0 0x20
#define TXCRCEN 0x10
#define PHDRLEN 0x08
#define HFRMLEN 0x04
#define FRMLNEN 0x02
#define FULDPX 0x01
// MICMD bit definitions
#define MIISCAN 0x02
#define MIIRD 0x01
// MISTAT bit definitions
#define NVALID 0x04
#define SCAN 0x02
#define BUSY 0x01
// PHCON1 bit definitions
#define PRST 0x8000
#define PLOOPBK 0x4000
#define PPWRSV 0x0800
#define PDPXMD 0x0100
// PHSTAT1 bit definitions
#define PFDPX 0x1000
#define PHDPX 0x0800
#define LLSTAT 0x0004
#define JBSTAT 0x0002
// PHCON2 bit definitions
#define FRCLINK 0x4000
#define TXDIS 0x2000
#define JABBER 0x0400
#define HDLDIS 0x0100
// Packet Control bit Definitions
#define PHUGEEN 0x08
#define PPADEN 0x04
#define PCRCEN 0x02
#define POVERRIDE 0x01
// SPI Instruction Set
#define RCR 0x00 // Read Control Register
#define RBM 0x3A // Read Buffer Memory
#define WCR 0x40 // Write Control Register
#define WBM 0x7A // Write Buffer Memory
#define BFS 0x80 // Bit Field Set
#define BFC 0xA0 // Bit Field Clear
#define SC 0xFF // Soft Reset
// Buffer
#define RXSTART_INIT 0x0000
#define RXSTOP_INIT (0x1FFF-0x0600-1)
#define TXSTART_INIT (0x1FFF-0x0600)
#define TXSTOP_INIT 0x1FFF
#define MAX_FRAMELEN 1500
void enc28j60_init(uint8_t* mac_addr);
uint16_t enc28j60_recv(uint8_t* buffer, uint16_t max_len);
void enc28j60_send(uint8_t* buffer, uint16_t len);
#endif /* _NET_ENC28J60_H_ */