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

📄 at91rm9200_ether.c

📁 Atmel 91系列ARM的boot loader启动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	if ((stat1 & RTL8201_10BASE_T_HD)                    && (stat2 & RTL8201_10_HDX)                    && (stat3 & RTL8201_LINK10)) {		/*set Emac for 10BaseT and Half Duplex  */		p_mac->EMAC_CFG &= ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);		return TRUE;	}	return FALSE;}/* * Name: *	rtl8201_InitPhy * Description: *	MAC starts checking its link by using parallel detection and *	Autonegotiation and the same is set in the MAC configuration registers * Arguments: *	p_mac - pointer to struct AT91S_EMAC * Return value: *	TRUE - if link status set succesfully *	FALSE - if link status not set */static UCHAR rtl8201_InitPhy (AT91PS_EMAC p_mac){	UCHAR ret = TRUE;	unsigned short IntValue;	at91rm9200_EmacEnableMDIO (p_mac);	if (!rtl8201_GetLinkSpeed (p_mac)) {		/* Try another time */		ret = rtl8201_GetLinkSpeed (p_mac);	}	at91rm9200_EmacDisableMDIO (p_mac);	return (ret);}/* * Name: *	rtl8201_AutoNegotiate * Description: *	MAC Autonegotiates with the partner status of same is set in the *	MAC configuration registers * Arguments: *	dev - pointer to struct net_device * Return value: *	TRUE - if link status set successfully *	FALSE - if link status not set */static UCHAR rtl8201_AutoNegotiate (AT91PS_EMAC p_mac, int *status){	unsigned short value;	unsigned short PhyAnar;	unsigned short PhyAnalpar;	/* Set rtl8201 control register */	if (!at91rm9200_EmacReadPhy (p_mac, (1 << 5) | RTL8201_BMCR, &value))		return FALSE;	value &= ~RTL8201_AUTONEG;	/* remove autonegotiation enable */	if (!at91rm9200_EmacWritePhy (p_mac, (1 << 5) | RTL8201_BMCR, &value))		return FALSE;	/* Set the Auto_negotiation Advertisement Register */	/* MII advertising for Next page, 100BaseTxFD and HD, 10BaseTFD and HD, IEEE 802.3 */	PhyAnar = RTL8201_NP | RTL8201_TX_FDX | RTL8201_TX_HDX |		  RTL8201_10_FDX | RTL8201_10_HDX | RTL8201_AN_IEEE_802_3;	if (!at91rm9200_EmacWritePhy (p_mac, (1 << 5) | RTL8201_ANAR, &PhyAnar))		return FALSE;	/* Read the Control Register     */	if (!at91rm9200_EmacReadPhy (p_mac, (1 << 5) | RTL8201_BMCR, &value))		return FALSE;	value |= RTL8201_SPEED_SELECT | RTL8201_AUTONEG | RTL8201_DUPLEX_MODE;	if (!at91rm9200_EmacWritePhy (p_mac, (1 << 5) | RTL8201_BMCR, &value))		return FALSE;	/* Restart Auto_negotiation  */	value |= RTL8201_RESTART_AUTONEG;	if (!at91rm9200_EmacWritePhy (p_mac, (1 << 5) | RTL8201_BMCR, &value))		return FALSE;	/*check AutoNegotiate complete */	udelay (10000);	at91rm9200_EmacReadPhy (p_mac, (1 << 5) | RTL8201_BMSR, &value);	if (!(value & RTL8201_AUTONEG_COMP))		return FALSE;	/* Get the AutoNeg Link partner base page */	if (!at91rm9200_EmacReadPhy (p_mac, (1 << 5) | RTL8201_ANLPAR, &PhyAnalpar))		return FALSE;	if ((PhyAnar & RTL8201_TX_FDX) && (PhyAnalpar & RTL8201_TX_FDX)) {		/*set MII for 100BaseTX and Full Duplex  */		p_mac->EMAC_CFG |= AT91C_EMAC_SPD | AT91C_EMAC_FD;		return TRUE;	}	if ((PhyAnar & RTL8201_10_FDX) && (PhyAnalpar & RTL8201_10_FDX)) {		/*set MII for 10BaseT and Full Duplex  */		p_mac->EMAC_CFG = (p_mac->EMAC_CFG &				~(AT91C_EMAC_SPD | AT91C_EMAC_FD))				| AT91C_EMAC_FD;		return TRUE;	}	return FALSE;}#endif/*********** EMAC Phy layer Management functions *************************//* * Name: *	at91rm9200_EmacEnableMDIO * Description: *	Enables the MDIO bit in MAC control register * Arguments: *	p_mac - pointer to struct AT91S_EMAC * Return value: *	none */static void at91rm9200_EmacEnableMDIO (AT91PS_EMAC p_mac){	/* Mac CTRL reg set for MDIO enable */	p_mac->EMAC_CTL |= AT91C_EMAC_MPE;	/* Management port enable */}/* * Name: *	at91rm9200_EmacDisableMDIO * Description: *	Disables the MDIO bit in MAC control register * Arguments: *	p_mac - pointer to struct AT91S_EMAC * Return value: *	none */static void at91rm9200_EmacDisableMDIO (AT91PS_EMAC p_mac){	/* Mac CTRL reg set for MDIO disable */	p_mac->EMAC_CTL &= ~AT91C_EMAC_MPE;	/* Management port disable */}/* * Name: *	at91rm9200_EmacReadPhy * Description: *	Reads data from the PHY register * Arguments: *	dev - pointer to struct net_device *	RegisterAddress - unsigned char * 	pInput - pointer to value read from register * Return value: *	TRUE - if data read successfully */static UCHAR at91rm9200_EmacReadPhy (AT91PS_EMAC p_mac,				     unsigned char RegisterAddress,				     unsigned short *pInput){	p_mac->EMAC_MAN = (AT91C_EMAC_HIGH & ~AT91C_EMAC_LOW) |			  (AT91C_EMAC_RW_R) |			  (RegisterAddress << 18) |			  (AT91C_EMAC_CODE_802_3);	udelay (10000);	*pInput = (unsigned short) p_mac->EMAC_MAN;	return TRUE;}/* * Name: *	at91rm9200_EmacWritePhy * Description: *	Writes data to the PHY register * Arguments: *	dev - pointer to struct net_device *	RegisterAddress - unsigned char * 	pOutput - pointer to value to be written in the register * Return value: *	TRUE - if data read successfully */static UCHAR at91rm9200_EmacWritePhy (AT91PS_EMAC p_mac,				      unsigned char RegisterAddress,				      unsigned short *pOutput){	p_mac->EMAC_MAN = (AT91C_EMAC_HIGH & ~AT91C_EMAC_LOW) |			AT91C_EMAC_CODE_802_3 | AT91C_EMAC_RW_W |			(RegisterAddress << 18) | *pOutput;	udelay (10000);	return TRUE;}/* * Name: *	at91rm92000_GetPhyInterface * Description: *	Initialise the interface functions to the PHY * Arguments: *	None * Return value: *	None */void at91rm92000_GetPhyInterface (void){#ifndef CONFIG_AT91C_USE_RTL8201	AT91S_Dm9161Ops.Init = dm9161_InitPhy;	AT91S_Dm9161Ops.IsPhyConnected = dm9161_IsPhyConnected;	AT91S_Dm9161Ops.GetLinkSpeed = dm9161_GetLinkSpeed;	AT91S_Dm9161Ops.AutoNegotiate = dm9161_AutoNegotiate;	pPhyOps = (AT91PS_PhyOps) & AT91S_Dm9161Ops;#else        AT91S_Rtl8201Ops.Init = rtl8201_InitPhy;        AT91S_Rtl8201Ops.IsPhyConnected = rtl8201_IsPhyConnected;        AT91S_Rtl8201Ops.GetLinkSpeed = rtl8201_GetLinkSpeed;        AT91S_Rtl8201Ops.AutoNegotiate = rtl8201_AutoNegotiate;	pPhyOps = (AT91PS_PhyOps) & AT91S_Rtl8201Ops;#endif}rbf_t *rbfdt;rbf_t *rbfp;int eth_init (bd_t * bd){	int ret;	int i;	p_mac = AT91C_BASE_EMAC;	*AT91C_PIOA_PDR = AT91C_PA16_EMDIO | AT91C_PA15_EMDC | AT91C_PA14_ERXER | AT91C_PA13_ERX1 | AT91C_PA12_ERX0 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA10_ETX1 | AT91C_PA9_ETX0 | AT91C_PA8_ETXEN | AT91C_PA7_ETXCK_EREFCK;	/* PIO Disable Register */	*AT91C_PIOB_PDR = AT91C_PB25_EF100 |			AT91C_PB19_ERXCK | AT91C_PB18_ECOL | AT91C_PB17_ERXDV |			AT91C_PB16_ERX3 | AT91C_PB15_ERX2 | AT91C_PB14_ETXER |			AT91C_PB13_ETX3 | AT91C_PB12_ETX2;	*AT91C_PIOB_BSR = AT91C_PB25_EF100 | AT91C_PB19_ERXCK | AT91C_PB18_ECOL | AT91C_PB17_ERXDV | AT91C_PB16_ERX3 | AT91C_PB15_ERX2 | AT91C_PB14_ETXER | AT91C_PB13_ETX3 | AT91C_PB12_ETX2;	/* Select B Register */	*AT91C_PMC_PCER = 1 << AT91C_ID_EMAC;	/* Peripheral Clock Enable Register */	p_mac->EMAC_CFG |= AT91C_EMAC_CSR;	/* Clear statistics */	/* Init Ehternet buffers */	rbfdt = (rbf_t *) RBF_FRAMEBTD;	for (i = 0; i < RBF_FRAMEMAX; i++) {		rbfdt[i].addr = RBF_FRAMEBUF + RBF_FRAMELEN * i;		rbfdt[i].size = 0;	}	rbfdt[RBF_FRAMEMAX - 1].addr |= RBF_WRAP;	rbfp = &rbfdt[0];	at91rm92000_GetPhyInterface ();	if (!pPhyOps->IsPhyConnected (p_mac))		printf ("PHY not connected!!\n\r");	/* MII management start from here */	if (!(p_mac->EMAC_SR & AT91C_EMAC_LINK)) {		if (!(ret = pPhyOps->Init (p_mac))) {			printf ("MAC: error during MII initialization\n");			return 0;		}	} else {		printf ("No link\n\r");		return 0;	}	p_mac->EMAC_SA2L = (bd->bi_enetaddr[3] << 24) | (bd->bi_enetaddr[2] << 16)			 | (bd->bi_enetaddr[1] << 8) | (bd->bi_enetaddr[0]);	p_mac->EMAC_SA2H = (bd->bi_enetaddr[5] << 8) | (bd->bi_enetaddr[4]);	p_mac->EMAC_RBQP = (long) (&rbfdt[0]);	p_mac->EMAC_RSR &= ~(AT91C_EMAC_RSR_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA);	p_mac->EMAC_CFG = (p_mac->EMAC_CFG | AT91C_EMAC_CAF | AT91C_EMAC_NBC)			& ~AT91C_EMAC_CLK;#ifdef CONFIG_AT91C_USE_RMII	p_mac->EMAC_CFG |= AT91C_EMAC_RMII;#endif	p_mac->EMAC_CTL |= AT91C_EMAC_TE | AT91C_EMAC_RE;        printf("init phy\n");	return 0;}int eth_send (volatile void *packet, int length){	while (!(p_mac->EMAC_TSR & AT91C_EMAC_BNQ));	p_mac->EMAC_TAR = (long) packet;	p_mac->EMAC_TCR = length;	while (p_mac->EMAC_TCR & 0x7ff);	p_mac->EMAC_TSR |= AT91C_EMAC_COMP;	return 0;}int eth_rx (void){	int size;	if (!(rbfp->addr & RBF_OWNER))		return 0;	size = rbfp->size & RBF_SIZE;	NetReceive ((volatile uchar *) (rbfp->addr & RBF_ADDR), size);	rbfp->addr &= ~RBF_OWNER;	if (rbfp->addr & RBF_WRAP)		rbfp = &rbfdt[0];	else		rbfp++;	p_mac->EMAC_RSR |= AT91C_EMAC_REC;	return size;}void eth_halt (void){    printf("halt phy\n");};#if (CONFIG_COMMANDS & CFG_CMD_MII)int  miiphy_read(unsigned char addr, unsigned char reg, unsigned short * value){	at91rm9200_EmacEnableMDIO (p_mac);	at91rm9200_EmacReadPhy (p_mac, reg, value);	at91rm9200_EmacDisableMDIO (p_mac);	return 0;}int  miiphy_write(unsigned char addr, unsigned char reg, unsigned short value){	at91rm9200_EmacEnableMDIO (p_mac);	at91rm9200_EmacWritePhy (p_mac, reg, &value);	at91rm9200_EmacDisableMDIO (p_mac);	return 0;}#endif	/* CONFIG_COMMANDS & CFG_CMD_MII */#endif	/* CONFIG_COMMANDS & CFG_CMD_NET */#endif	/* CONFIG_DRIVER_ETHER */

⌨️ 快捷键说明

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