⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_emac.h

📁 基于AT91SAM7x256的硬件平台的WEB服务器源码(A&shy DS版本, ucOS_II+LWIP+自己编写的DNS查询工具)
💻 H
字号:
//*------------------------------------------------------------------------------------------------
//* 文件名				: lib_emac.h
//* 功能描述			: EMAC外设的函数库头文件
//* 作者    			: 焦海波
//* 版本				: 0.1
//* 建立日期、时间		: 2006/06/07 10:40
//* 最近修改日期、时间	: 
//* 修改原因			: 
//*------------------------------------------------------------------------------------------------

#ifndef	__lib_emac_h
#define	__lib_emac_h

//*---------------------------------------- 结构体及宏定义 -----------------------------------------
//* PHY芯片RTL8201的ID号
#define		PHY_ID_RTL8201		0x82010000

//* PHY芯片地址
#define		PHY_ADDR			0x01

//* PHY芯片内部寄存器地址
#define		PHY_REG_BMCR		0x00		//* 基本模式控制寄存器
#define		PHY_REG_BMSR		0x01		//* 基本模式状态寄存器
#define		PHY_REG_ID1			0x02		//* PHY标识寄存器1
#define		PHY_REG_ID2			0x03		//* PHY标识寄存器2
#define		PHY_REG_ANLPAR		0x05		//* 自动协商连接方能力寄存器

//* PHY寄存器位定义
#define		PHY_BMSR_LINKESTABLISHED	((UWORD)(1 << 2))		//* 已经建立了有效连接(基本模式状态寄存器)
#define		PHY_BMSR_AUTONEGEND			((UWORD)(1 << 5))		//* 自动协商已经结束(基本模式状态寄存器)
#define		PHY_BMCR_ENAUTONEG			((UWORD)(1 << 12))		//* 自动协商使能(基本模式控制寄存器)
#define		PHY_ANLPAR_100TXFD			((UWORD)(1 << 8))		//* 连接方支持100Base-TX全双工
#define		PHY_ANLPAR_100TX			((UWORD)(1 << 7))		//* 连接方支持100Base-TX
#define		PHY_ANLPAR_10TFD			((UWORD)(1 << 6))		//* 连接方支持10Base-T全双工
#define		PHY_ANLPAR_10T				((UWORD)(1 << 5))		//* 连接方支持10Base-T

//* 网络配置寄存器的速度和双工位掩码
#define		EMAC_NCFGR_SPD_FD_MASK		0xFFFFFFFC

#define		EMAC_INT_PRIOR		7		//* 指定EMAC中断优先级为7

//* MAC地址
#define		MAC_ADDR_0			0xBC
#define		MAC_ADDR_1			0x20
#define		MAC_ADDR_2			0x06
#define		MAC_ADDR_3			0x06
#define		MAC_ADDR_4			0x07
#define		MAC_ADDR_5			0x10

//* IP地址
#define 	IP_ADDR_0			192
#define 	IP_ADDR_1			168
#define 	IP_ADDR_2			10
#define 	IP_ADDR_3			72

//* 网关地址
#define		GATEWAY_ADDR_0 		192
#define		GATEWAY_ADDR_1 		168
#define		GATEWAY_ADDR_2 		10
#define		GATEWAY_ADDR_3 		1

//* 掩码地址
#define		NET_MASK0			255
#define		NET_MASK1			255
#define		NET_MASK2			255
#define		NET_MASK3			0

#define 	NB_TX_BUFS			(MEMP_NUM_PBUF/2)				//* 发送缓冲区个数
#define 	ETH_TX_BUF_SIZE		(PBUF_POOL_BUFSIZE)				//* 发送缓冲区大小

#define		NB_RX_BUFS			32								//* 接收缓冲区个数
#define		ETH_RX_BUF_SIZE		128								//* EMAC数据手册规定接收缓冲区古128字节大小,128 * 32接收缓冲区共4096字节

/* 接收缓冲区描述符标志位及状态位宏定义 */
#define		RxDESC_FLAG_WARP			0x00000002				//* 标记接收缓冲区描述符列表中的最后一个描述符
#define		RxDESC_FLAG_OWNSHIP			0x00000001				//* 标记接收缓冲区为程序所有

/* 发送缓冲区描述状态信息宏定义 */
#define 	TxDESC_STATUS_BUF_SIZE		((ULONG)0x000007FF)		//* 缓冲区长度
#define 	TxDESC_STATUS_LAST_BUF		((ULONG)(1 << 15))		//* 帧的最后一个缓冲区
#define		TxDESC_STATUS_NO_CRC		((ULONG)(1 << 16))		//* 没有CRC被附加到当前帧	
#define		TxDESC_STATUS_BUF_EXHAUSTED	((ULONG)(1 << 27))		//* 发送中途缓冲区就被用光
#define		TxDESC_STATUS_Tx_UNDERRUN	((ULONG)(1 << 28))		//* 发送欠速
#define		TxDESC_STATUS_Tx_ERROR		((ULONG)(1 << 29))		//* 发送错误
#define		TxDESC_STATUS_WRAP			((ULONG)(1 << 30))		//* 最后一个缓冲区
#define		TxDESC_STATUS_USED			((ULONG)(1 << 31))		//* 如果成功发送,缓冲区描述符队列的第一个缓冲区描述符的USED状态位被EMAC置位

#define		EMAC_MII_PINS				(AT91C_PB8_EMDC         | \
										AT91C_PB9_EMDIO         | \
										AT91C_PB2_ETX0          | \
										AT91C_PB3_ETX1          | \
										AT91C_PB10_ETX2         | \
										AT91C_PB11_ETX3         | \
										AT91C_PB1_ETXEN         | \
										AT91C_PB0_ETXCK_EREFCK  | \
										AT91C_PB15_ERXDV_ECRSDV | \
										AT91C_PB5_ERX0			| \
										AT91C_PB6_ERX1			| \
										AT91C_PB13_ERX2			| \
										AT91C_PB14_ERX3			| \
										AT91C_PB17_ERXCK		| \
										AT91C_PB16_ECOL			| \
										AT91C_PB4_ECRS			| \
										AT91C_PB7_ERXER)

//* 接收缓冲区描述符结构,参见AT91SAM7X256数据手册(完整版)
#define		EMAC_RxB_ADDR_MASK			0xFFFFFFFC
typedef struct{
	ULONG ulRxBAddrAndFlag;
	union
	{
		ULONG ulStatus;
		struct {
			ULONG bitLen					:12;
			ULONG bitRxBOffset				:2;
			ULONG bitStartOfFrm				:1;
			ULONG bitEndOfFrm				:1;
			ULONG bitCFI					:1;
			ULONG bitVLANPrio				:3;
			ULONG bitPrioTag				:1;
			ULONG bitVLANTag				:1;
			ULONG bitTypeID					:1;
			ULONG bitSA4Match				:1;
			ULONG bitSA3Match				:1;
			ULONG bitSA2Match				:1;
			ULONG bitSA1Match				:1;
			ULONG bitRsrved0				:1;
			ULONG bitExtAddrMatch			:1;
			ULONG bitUniCastHashMatch		:1;
			ULONG bitMultiCastHashMatch		:1;
			ULONG bitIsBroadCastAddr		:1;
		}bstStatus;		
	}uStatus;
}AT91S_RxBDescriptor, *AT91PS_RxBDescriptor;

//* 发送缓冲区描述符结构,按照EMAC数据手册的描述建立,参见AT91SAM7X256数据手册(完整版)EMAC部分 
typedef struct{
	ULONG ulTxBAddr;
	union
	{
		ULONG ulStatus;
		struct {
			ULONG bitLen			:11;
			ULONG bitRsrved0		:4;
			ULONG bitIsLastBuf		:1;
			ULONG bitIsNoCRC		:1;
			ULONG bitRsrved1		:10;
			ULONG bitIsBExhausted	:1;
			ULONG bitIsTxUnderrun	:1;
			ULONG bitTxError		:1;
			ULONG bitIsWrap			:1;
			ULONG bitIsUsed			:1;
		}bstStatus;		
	}uStatus;
}AT91S_TxBDescriptor, *AT91PS_TxBDescriptor;
	
//* 使能EMAC管理数据接口
#define		EnableMDI()										\
{															\
	AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE;			\
}

//* 禁止EMAC管理数据接口
#define		DisableMDI()							\
{													\
	AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE;	\
}
//*-------------------------------------- 函数原型声明 ---------------------------------------------
extern BOOLEAN EMACSendPacket(BYTE *pbFrom, ULONG ulLength, BOOLEAN blIsEndOfFrame);
extern void EMACReadPacket(BYTE *pbTo, UWORD uwSegmentLen, BOOLEAN blIsLastPbuf);
extern void EMACInit(void);
extern UWORD GetInputPacketLen(void);

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -