📄 ethernet.h
字号:
#ifndef __ETHERNET_H__
#define __ETHERNET_H__
#include "71x_lib.h"
#define NET_BASE_ADDR 0x66400000
extern u16 local_eth_addr[3];
void NIC_Init(void);
int NIC_RecvPack(u16 *buf);
int NIC_SendPack(u16 *buf, int len);
#define RUNT 60
//smallest legal size packet, no fcs
#define GIANT 1514
//largest legal size packet, no fcs
#define ETHER_ADDR_LEN 6
//Ethernet address length.
#define TX_PAGES 6
#define NE_START_PG 0X40
//First page of TX buffer
#define NE_STOP_PG 0X60
//Last page + 1 of RX Ring
#define RX_START_PG NE_START_PG + TX_PAGES
#define RX_CURR_PG RX_START_PG + 1
#define EN_CMD 0x00
//The command register (for all pages)
#define EN_DATA 0x10
//remote DMA Port (for all pages)
#define EN_RESET 0x1F
//Reset Port (for all pages)
//Register accessed at EN_CMD, the RTL8019 base addr
#define EN_STOP 0X01
//Stop and reset the chip
#define EN_START 0X02
//Start the chip, clear reset
#define EN_TRANS 0X04
//Transmit a frame
#define EN_RREAD 0X08
//Remote read
#define EN_RWRITE 0X10
//Remote write
#define EN_NODMA 0X20
//Remote DMA
#define EN_PAGE0 0X00
//Select page chip registers
#define EN_PAGE1 0X40
//using the two high-order bits
#define EN_PAGE2 0X80
#define EN_PAGE3 0XC0
//Page 0 register offsets
#define EN0_CLDALO 0X01
//RD Low byte of current local dma addr
#define EN0_STARTPG 0X01
//WR Starting page of ring buffer
#define EN0_CLDAHI 0X02
//RD High byte of current local dma addr
#define EN0_STOPPG 0X02
//WR Ending page +1 of ring buffer
#define EN0_BOUNDARY 0X03
//RD/WR Boundary page of ring buffer
#define EN0_TSR 0X04
//RD Transmit status reg
#define EN0_TPSR 0X04
//WR Transmit starting page
#define EN0_NCR 0X05
//RD Number of collision reg
#define EN0_TCNTLO 0X05
//WR Low byte of tx byte count
#define EN0_FIFO 0X06
//RD FIFO
#define EN0_TCNTHI 0X06
//WR High byte of tx byte count
#define EN0_ISR 0X07
//RD/WR Interrupt status reg
#define EN0_CRDALO 0X08
//RD low byte of current remote dma address
#define EN0_RSARLO 0X08
//WR Remote start address reg 0
#define EN0_CRDAHI 0X09
//RD high byte, current remote dma address
#define EN0_RSARHI 0X09
//WR Remote start address reg 1
#define EN0_8019ID0 0X0A
#define EN0_RCNTLO 0X0a
//WR Remote byte count reg
#define EN0_8019ID1 0X0B
#define EN0_RCNTHI 0X0b
//WR Remote byte count reg
#define EN0_RSR 0X0c
//RD RX status reg
#define EN0_RXCR 0X0c
//WR RX configuration reg
#define EN0_TXCR 0X0d
//WR TX configuration reg
#define EN0_COUNTER0 0X0d
//RD Rcv alignment error counter
#define EN0_DCFG 0X0e
//WR Data configuration reg
#define EN0_COUNTER1 0X0e
//RD Rcv CRC error counter
#define EN0_IMR 0X0f
//WR Interrupt mask reg
#define EN0_COUNTER2 0X0f
//RD Rcv missed frame error counter
//Bits in EN0_TSR - Transmitted packet status
#define ENTSR_PTX 0X01
//Packet transmitted without error
#define ENTSR_ND 0X02
//The transmit wasn't deferred.
#define ENTSR_COL 0X04
//The transmit collided at least once.
#define ENTSR_ABT 0X08
//The transmit collided 16 times, and was deferred.
#define ENTSR_CRS 0X10
//The carrier sense was lost.
#define ENTSR_FU 0X20
//The collision detect "heartbeat" signal was lost.
#define ENTSR_OWC 0X80
//Bits in EN0_ISR - Interrupt status register
#define ENISR_RX 0X01
//Receiver, no error
#define ENISR_TX 0X02
//Transmitter, no error
#define ENISR_RX_ERR 0X04
//Receiver, with error
#define ENISR_TX_ERR 0X08
//Transmitter, with error
#define ENISR_OVER 0X10
//Receiver overwrote the ring
#define ENISR_COUNTERS 0X20
//Counters need emptying
#define ENISR_RDC 0X40
//remote dma complete
#define ENISR_RESET 0X80
//Reset completed
#define ENISR_ALL 0X3f
//Interrupts we will enable
//Bits in EN0_RSR and received packet status byte
#define ENRSR_RXOK 0X01
//Received a good packet
#define ENRSR_CRC 0X02
//CRC error
#define ENRSR_FAE 0X04
//frame alignment error
#define ENRSR_FO 0X08
//FIFO overrun
#define ENRSR_MPA 0X10
//missed pkt
#define ENRSR_PHY 0X20
//physical/multicase address
#define ENRSR_DIS 0X40
//receiver disable. set in monitor mode
#define ENRSR_DEF 0X80
//Bits in EN0_RXCR - RX configuration reg
#define ENRXCR_CRC 0X01
//Save error pkts
#define ENRXCR_RUNT 0X02
//Accept runt pkt
#define ENRXCR_BCST 0X04
//Accept broadcasts
#define ENRXCR_MULTI 0X08
//Multicast (if pass filter)
#define ENRXCR_PROMP 0X10
//Promiscuous physical addresses
#define ENRXCR_MON 0X20
//Monitor mode (no packets rcvd)
//Bits in EN0_TXCR - TX configuration reg
#define ENTXCR_CRC 0X01
//inhibit CRC, do not append crc
#define ENTXCR_LOOP 0X02
//set internal loopback mode
#define ENTXCR_LB01 0X06
//encoded loopback control
#define ENTXCR_ATD 0X08
//auto tx disable
#define ENTXCR_OFST 0X10
//collision offset enable
//Bits in EN0_DCFG - Data config register
#define ENDCFG_WTS 0X00
//byte transfer mode selection
#define ENDCFG_BOS 0X02
//byte order selection
//0: MD15-8, LSB on MD7-0
//1: MSB on MD7-0, LSB on MD15-8
#define ENDCFG_LAS 0X04
//long addr selection (must be set to zero)
#define ENDCFG_BMS 0X08
//loopback select
//0: Loopback mode select. Bits 1 and 2 of the
//EN0_TXCR must also be programmed for Loopback
//1: Normal operation
#define ENDCFG_ARM 0X10
//autoinitialize remote
#define ENDCFG_FT00 0X00
//fifo treshold
#define ENDCFG_FT01 0X20
#define ENDCFG_FT10 0X40
#define ENDCFG_FT11 0X60
//Page 1 register offsets
#define EN1_PHYS 0X01
//RD/WR This board's physical enet addr
#define EN1_CURPAG 0X07
//RD/WR Current memory page
#define EN1_MULT 0X8008
//RD/WR Multicast filter mask array (8 bytes)
#define EN_RBUF_STAT 0
//Received frame status
#define EN_RBUF_NXT_PG 1
//Page after this frame
#define EN_RBUF_SIZE_LO 2
//Length of this frame
#define EN_RBUF_SIZE_HI 3
//Length of this frame
#define SIZE_OF_8019_HDR 4
//size of 8019 specific packet header
#define PKT_DEST 0
#define PKT_SRC 6
#define PKT_TYPE 12
#define SIZE_OF_ETH_PKT_HDR 14
#define BITISR_RX 0x01
#define BITRSR_RXOK 0x01
void delayms(u16 len);
void dmaread(u8 bc_h,u8 bc_l,u8 st_h,u8 st_l,u8 *saveaddr);//from inram to dmaport
void dmawrite(u8 bc_h,u8 bc_l,u8 st_h,u8 st_l,u8 *writeaddr);//from dmaport to inram
void sendpacket(u8 ct_h,u8 ct_l);//ct_h:msb of count,ct_l:lsb of count
void tx_wait(void);//wait to tx
int recvpacket(u8 *rcv_hdr);
u8 readpacketheader(void);//return if the packet header
u8 packet_come(void); //if any packet come
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -