/** * @brief This function handles Ethernet link status. * @param None * @retval None */ void Eth_Link_IT_task( void * pvParameters ) { uint32_t pcPHYAddress; pcPHYAddress = ( uint32_t ) pvParameters; for(;;) { if (xSemaphoreTake( ETH_link_xSemaphore, emacBLOCK_TIME_WAITING_ETH_LINK_IT)==pdTRUE) { /* Check whether the link interrupt has occurred or not */ if(((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != 0) { if((ETH_ReadPHYRegister((uint16_t) pcPHYAddress, PHY_SR) & 1)) { netif_set_link_up(&xnetif); } else { netif_set_link_down(&xnetif); } } } } }
/** * @brief Configure the PHY to generate an interrupt on change of link status. * @param PHYAddress: external PHY address * @retval None */ uint32_t Eth_Link_PHYITConfig(uint16_t PHYAddress) { uint16_t tmpreg = 0; /* Read MICR register */ tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_MICR); /* Enable output interrupt events to signal via the INT pin */ tmpreg |= (uint16_t)(PHY_MICR_INT_EN | PHY_MICR_INT_OE); if(!(ETH_WritePHYRegister(PHYAddress, PHY_MICR, tmpreg))) { /* Return ERROR in case of write timeout */ return ETH_ERROR; } /* Read MISR register */ tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_MISR); /* Enable Interrupt on change of link status */ tmpreg |= (uint16_t)PHY_MISR_LINK_INT_EN; if(!(ETH_WritePHYRegister(PHYAddress, PHY_MISR, tmpreg))) { /* Return ERROR in case of write timeout */ return ETH_ERROR; } /* Return SUCCESS */ return ETH_SUCCESS; }
/** * @brief This function handles Ethernet link status. * @param None * @retval None */ void Eth_Link_ITHandler(uint16_t PHYAddress) { /* Check whether the link interrupt has occurred or not */ if (((ETH_ReadPHYRegister(PHYAddress, PHY_MISR )) & PHY_LINK_STATUS )!= 0){ if ((ETH_ReadPHYRegister(PHYAddress, PHY_SR ) & 1)) { netif_set_link_up(&gnetif); } else { netif_set_link_down(&gnetif); } } }
/************************************************************************* * Function Name: eth_phy_get_addr * Parameters: * Return: * * Description: get phy address * *************************************************************************/ static unsigned int eth_phy_get_addr(void){ unsigned int PhyAddr; // read the ID for match for(PhyAddr = 1; 32 >= PhyAddr; PhyAddr++){ if((0x0022 == ETH_ReadPHYRegister(PhyAddr,2)) && (0x1619 == (ETH_ReadPHYRegister(PhyAddr,3)))) break; } // if(32 < PhyAddr){ //Ethernet Phy Not Found\n\r return 0; } // return PhyAddr; }
/** * @brief ETH_BSP_Config * @param None * @retval None */ void ETH_BSP_Config(void) { /*************************************************************************** NOTE: When using Systick to manage the delay in Ethernet driver, the Systick must be configured before Ethernet initialization and, the interrupt priority should be the highest one. *****************************************************************************/ /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); /* Get Ethernet link status*/ if (ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR ) & 1) { EthStatus |= ETH_LINK_FLAG; } /* Configure the PHY to generate an interrupt on change of link status */ Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS); /* Configure the EXTI for Ethernet link status. */ Eth_Link_EXTIConfig(); }
/** * @brief This function handles Ethernet link status. * @param None * @retval None */ void Eth_Link_ITHandler(uint16_t PHYAddress) { /* Check whether the link interrupt has occurred or not */ if(((ETH_ReadPHYRegister(PHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != 0) { EthLinkStatus = ~EthLinkStatus; #ifdef USE_LCD /* Set the LCD Text Color */ LCD_SetTextColor(Red); if(EthLinkStatus != 0) { /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" unplugged "); } else { /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" now connected "); } #endif } }
/** * @brief ETH_BSP_Config * @param None * @retval None */ void ETH_BSP_Config(void) { /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Config NVIC for Ethernet */ //ETH_NVIC_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); /* Get Ethernet link status*/ if(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR) & 1) { EthStatus |= ETH_LINK_FLAG; } /* Configure the PHY to generate an interrupt on change of link status */ Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS); /* Configure the EXTI for Ethernet link status. */ Eth_Link_EXTIConfig(); if (ETH_link_xSemaphore == NULL) { /* create binary semaphore used for ETH_link handling */ vSemaphoreCreateBinary( ETH_link_xSemaphore ); } /* create the task that handles the ETH_link */ xTaskCreate(Eth_Link_IT_task, (signed char*) "E_link", ETH_LINK_TASK_STACK_SIZE, (void *)DP83848_PHY_ADDRESS, ETH_LINK_TASK_PRIORITY,NULL); }
/** * @brief This function handles Ethernet link status. * @param None * @retval None */ void Eth_Link_ITHandler(uint16_t PHYAddress) { /* Check whether the link interrupt has occurred or not */ if(((ETH_ReadPHYRegister(PHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != 0) { EthLinkStatus = ~EthLinkStatus; } }
GT_BOOL gtBspReadMii (GT_QD_DEV* dev, unsigned int devAddr , unsigned int regAddr, unsigned int* value) { SMI_REG smiReg; unsigned int phyAddr; unsigned int timeOut = 10; /* in 100MS units */ int i; int ret; if( IS_MV88E6XX_PHY_ADDRESS(devAddr) ) { /* first check that it is not busy */ smiReg = QD_SMI_BUSY | (1 << QD_SMI_MODE_BIT) /* 0 - clause 45, 1 - clause 22 */ | (QD_SMI_READ_22 << QD_SMI_OP_BIT) | (devAddr << QD_SMI_DEV_ADDR_BIT) | (regAddr << QD_SMI_REG_ADDR_BIT); ret = ETH_WritePHYRegister(0x1C,QD_REG_SMI_PHY_CMD,smiReg); if( ret && (ETH_ReadPHYRegister(0x1C,QD_REG_SMI_PHY_CMD) & QD_SMI_BUSY)) { for(i = 0 ; i < SMI_RX_TIMEOUT ; i++); do { smiReg = ETH_ReadPHYRegister(0x1C,QD_REG_SMI_PHY_CMD); if(timeOut-- < 1 ) { return false; } } while (smiReg & QD_SMI_BUSY); } /* not busy */ *value = ETH_ReadPHYRegister(0x1C,QD_REG_SMI_PHY_DATA); }else { *value = ETH_ReadPHYRegister(devAddr,regAddr); } return true; }
//配置网卡LED灯的指示模式,在ETH_Init函数调用前使用 //DP83848实际还有更多的功能寄存器,都是通过类似的读、写方法进行的。 //这里仅仅是一个LED灯的例子 static void ETH_SetLED() { uint16_t reg_value; //0x18是强制使用LED,不写也行,默认就是0 ETH_WritePHYRegister(DP83848_PHY_ADDRESS, 0x18, 0x0000); //0x19是配置LED功能,bit5/6/7 表示灯的类型,看手册写了 reg_value = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, 0x19); reg_value &= ~0x00E0; //清除bit5/bit6 reg_value |= 0x00C0; //或者其他的数据,试试看 ETH_WritePHYRegister(DP83848_PHY_ADDRESS, 0x19, reg_value); }
/** * @brief This function handles Ethernet link status. * @param None * @retval None */ void Eth_Link_ITHandler(uint16_t PHYAddress) { /* Check whether the link interrupt has occurred or not */ if (((ETH_ReadPHYRegister(PHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != 0) { EthLinkStatus = ~EthLinkStatus; if (EthLinkStatus != 0) { printf("Cable Desconectado\n"); } else { printf("Cable Conectado\b"); } } }
/** * @brief ETH_BSP_Config * @param None * @retval None */ void ETH_BSP_Config(void) { RCC_ClocksTypeDef RCC_Clocks; /*************************************************************************** NOTE: When using Systick to manage the delay in Ethernet driver, the Systick must be configured before Ethernet initialization and, the interrupt priority should be the highest one. *****************************************************************************/ /* Configure Systick clock source as HCLK */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* SystTick configuration: an interrupt every 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Set Systick interrupt priority to 0*/ NVIC_SetPriority (SysTick_IRQn, 0); /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); /* Get Ethernet link status*/ if(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR) & 1) { //printf("link\n"); EthStatus |= ETH_LINK_FLAG; } //else //printf("unlink\n"); /* Configure the PHY to generate an interrupt on change of link status */ Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS); /* Configure the EXTI for Ethernet link status. */ Eth_Link_EXTIConfig(); }
void dp83483() { uint16_t bsr,sts, bcr, phycr; bsr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR); sts = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR); bcr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BCR); phycr = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR); rt_kprintf("BCR = 0x%X\tBSR = 0x%X\tPHY_STS = 0x%X\tPHY_CR = 0x%X\n", bcr,bsr,sts, phycr); rt_kprintf("PHY_FCSCR = 0x%X\n", ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_FCSCR ) ); rt_kprintf("PHY_MISR = 0x%X\n", ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_MISR ) ); rt_kprintf("DMASR = 0x%X\n", ETH->DMASR ); //ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_LEDCR, (uint16_t)(0x38 | led)); led = (led==7)?0:7; }
/** * @brief Link callback function, this function is called on change of link status. * @param The network interface * @retval None */ void ETH_link_callback(struct netif *netif) { __IO uint32_t timeout = 0; uint32_t tmpreg; uint16_t RegValue; struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; #ifndef USE_DHCP uint8_t iptab[4] = {0}; uint8_t iptxt[20]; #endif /* USE_DHCP */ /* Clear LCD */ // LCD_ClearLine(Line4); // LCD_ClearLine(Line5); // LCD_ClearLine(Line6); // LCD_ClearLine(Line7); // LCD_ClearLine(Line8); // LCD_ClearLine(Line9); if(netif_is_link_up(netif)) { /* Restart the auto-negotiation */ if(ETH_InitStructure.ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) { /* Reset Timeout counter */ timeout = 0; /* Enable auto-negotiation */ ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_BCR, PHY_AutoNegotiation); /* Wait until the auto-negotiation will be completed */ do { timeout++; } while (!(ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); /* Reset Timeout counter */ timeout = 0; /* Read the result of the auto-negotiation */ RegValue = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_SR); /* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */ if((RegValue & PHY_DUPLEX_STATUS) != (uint16_t)RESET) { /* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; } else { /* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_HalfDuplex; } /* Configure the MAC with the speed fixed by the auto-negotiation process */ if(RegValue & PHY_SPEED_STATUS) { /* Set Ethernet speed to 10M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_10M; } else { /* Set Ethernet speed to 100M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_100M; } /*------------------------ ETHERNET MACCR Re-Configuration --------------------*/ /* Get the ETHERNET MACCR value */ tmpreg = ETH->MACCR; /* Set the FES bit according to ETH_Speed value */ /* Set the DM bit according to ETH_Mode value */ tmpreg |= (uint32_t)(ETH_InitStructure.ETH_Speed | ETH_InitStructure.ETH_Mode); /* Write to ETHERNET MACCR */ ETH->MACCR = (uint32_t)tmpreg; _eth_delay_(ETH_REG_WRITE_DELAY); tmpreg = ETH->MACCR; ETH->MACCR = tmpreg; } /* Restart MAC interface */ ETH_Start(); #ifdef USE_DHCP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; DHCP_state = DHCP_START; #else IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); #endif /* USE_DHCP */ netif_set_addr(&gnetif, &ipaddr , &netmask, &gw); /* When the netif is fully configured this function must be called.*/ netif_set_up(&gnetif); #ifdef USE_LCD /* Set the LCD Text Color */ LCD_SetTextColor(Green); /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" now connected "); /* Set the LCD Text Color */ LCD_SetTextColor(White); #ifndef USE_DHCP /* Display static IP address */ iptab[0] = IP_ADDR3; iptab[1] = IP_ADDR2; iptab[2] = IP_ADDR1; iptab[3] = IP_ADDR0; sprintf((char*)iptxt, " %d.%d.%d.%d", iptab[3], iptab[2], iptab[1], iptab[0]); LCD_DisplayStringLine(Line8, (uint8_t*)" Static IP address "); LCD_DisplayStringLine(Line9, iptxt); /* Clear LCD */ LCD_ClearLine(Line5); LCD_ClearLine(Line6); #endif /* USE_DHCP */ #endif /* USE_LCD */ EthLinkStatus = 0; } else { ETH_Stop(); #ifdef USE_DHCP DHCP_state = DHCP_LINK_DOWN; dhcp_stop(netif); #endif /* USE_DHCP */ /* When the netif link is down this function must be called.*/ netif_set_down(&gnetif); #ifdef USE_LCD /* Set the LCD Text Color */ LCD_SetTextColor(Red); /* Display message on the LCD */ LCD_DisplayStringLine(Line5, (uint8_t*)" Network Cable is "); LCD_DisplayStringLine(Line6, (uint8_t*)" unplugged "); /* Set the LCD Text Color */ LCD_SetTextColor(White); #endif /* USE_LCD */ } }
unsigned char get_link_status(void) { if(((ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR)) & PHY_Linked_Status) == 0) return 0; return 1; }
/************************************************************************* * Function Name: eth_bsp_init * Parameters: * Return: * * Description: * *************************************************************************/ int eth_bsp_init(void) { // unsigned int PhyAddr; // GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; ETH_InitTypeDef ETH_InitStructure; /*Set default MAC Address*/ eth_stm32f4x7_info.mac_addr[0]=ETH_STM32F4X7_DEFAULT_MAC_ADDR0; eth_stm32f4x7_info.mac_addr[1]=ETH_STM32F4X7_DEFAULT_MAC_ADDR1; eth_stm32f4x7_info.mac_addr[2]=ETH_STM32F4X7_DEFAULT_MAC_ADDR2; eth_stm32f4x7_info.mac_addr[3]=ETH_STM32F4X7_DEFAULT_MAC_ADDR3; eth_stm32f4x7_info.mac_addr[4]=ETH_STM32F4X7_DEFAULT_MAC_ADDR4; eth_stm32f4x7_info.mac_addr[5]=ETH_STM32F4X7_DEFAULT_MAC_ADDR5; /* Enable ETHERNET clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); /* Enable GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /*Select RMII Interface*/ SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); /* ETHERNET pins configuration */ /* PA ETH_RMII_REF_CLK: PA1 ETH_RMII_MDIO: PA2 ETH_RMII_MDINT: PA3 ETH_RMII_CRS_DV: PA7 */ /* Configure PA1, PA2, PA3 and PA7*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect PA1, PA2, PA3 and PA7 to ethernet module*/ GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); /* PB ETH_RMII_TX_EN: PB11 */ /* Configure PB11*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Connect PB11 to ethernet module*/ GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); /* PC ETH_RMII_MDC: PC1 ETH_RMII_RXD0: PC4 ETH_RMII_RXD1: PC5 */ /* Configure PC1, PC4 and PC5*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect PC1, PC4 and PC5 to ethernet module*/ GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); /* PG ETH_RMII_TXD0: PG13 ETH_RMII_TXD1: PG14 */ /* Configure PG14 and PG15*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); /* Connect PG13 and PG15 to ethernet module*/ GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); #if 0 /* Reset ETHERNET on AHB Bus */ ETH_DeInit(); /* Software reset */ ETH_SoftwareReset(); /* Wait for software reset */ while(ETH_GetSoftwareResetStatus()==SET); /* ETHERNET Configuration ------------------------------------------------------*/ /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ ETH_StructInit(Ð_InitStructure); /* Fill ETH_InitStructure parametrs */ /*------------------------ MAC -----------------------------------*/ //ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable; //ETH_InitStructure.ETH_Speed = ETH_Speed_100M; ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; //ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_Speed = ETH_Speed_100M; // read the ID for match for(PhyAddr = 1; 32 >= PhyAddr; PhyAddr++) { if((0x0022 == ETH_ReadPHYRegister(PhyAddr,2)) && (0x1619 == (ETH_ReadPHYRegister(PhyAddr,3)))) break; } // if(32 < PhyAddr) { //printf("Ethernet Phy Not Found\n\r"); return -1; } /* Configure Ethernet */ if(0 == ETH_Init(Ð_InitStructure, PhyAddr)) { //printf("Ethernet Initialization Failed\n\r"); return -1; } #endif // if(eth_macdma_config()<0) return -1; // return 0;//no error }
/** * @brief Link callback function, this function is called on change of link status. * @param The network interface * @retval None */ void ETH_link_callback(struct netif *netif) { __IO uint32_t timeout = 0; uint32_t tmpreg,RegValue; struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; #ifndef USE_DHCP uint8_t iptab[4] = {0}; uint8_t iptxt[20]; #endif /* USE_DHCP */ if(netif_is_link_up(netif)) { /* Restart the autonegotiation */ if(ETH_InitStructure.ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) { /* Reset Timeout counter */ timeout = 0; /* Enable Auto-Negotiation */ ETH_WritePHYRegister(BOARD_PHY_ADDRESS, PHY_BCR, PHY_AutoNegotiation); /* Wait until the auto-negotiation will be completed */ do { timeout++; } while (!(ETH_ReadPHYRegister(BOARD_PHY_ADDRESS, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); /* Reset Timeout counter */ timeout = 0; /* Read the result of the auto-negotiation */ RegValue = ETH_ReadPHYRegister(BOARD_PHY_ADDRESS, PHY_SR); /* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */ if((RegValue & PHY_DUPLEX_STATUS) != (uint32_t)RESET) { /* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; } else { /* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */ ETH_InitStructure.ETH_Mode = ETH_Mode_HalfDuplex; } /* Configure the MAC with the speed fixed by the auto-negotiation process */ if(RegValue & PHY_SPEED_STATUS) { /* Set Ethernet speed to 10M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_10M; } else { /* Set Ethernet speed to 100M following the auto-negotiation */ ETH_InitStructure.ETH_Speed = ETH_Speed_100M; } /*------------------------ ETHERNET MACCR Re-Configuration --------------------*/ /* Get the ETHERNET MACCR value */ tmpreg = ETH->MACCR; /* Set the FES bit according to ETH_Speed value */ /* Set the DM bit according to ETH_Mode value */ tmpreg |= (uint32_t)(ETH_InitStructure.ETH_Speed | ETH_InitStructure.ETH_Mode); /* Write to ETHERNET MACCR */ ETH->MACCR = (uint32_t)tmpreg; _eth_delay_(ETH_REG_WRITE_DELAY); tmpreg = ETH->MACCR; ETH->MACCR = tmpreg; } /* Restart MAC interface */ ETH_Start(); #ifdef USE_DHCP ipaddr.addr = 0; netmask.addr = 0; gw.addr = 0; DHCP_state = DHCP_START; #else IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_lastOctet); IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1 , NETMASK_ADDR2, NETMASK_ADDR3); IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); #endif /* USE_DHCP */ netif_set_addr(&gnetif, &ipaddr , &netmask, &gw); /* When the netif is fully configured this function must be called.*/ netif_set_up(&gnetif); } else { ETH_Stop(); #ifdef USE_DHCP DHCP_state = DHCP_LINK_DOWN; dhcp_stop(netif); #endif /* USE_DHCP */ /* When the netif link is down this function must be called.*/ netif_set_down(&gnetif); } }
/** * @brief ETH_BSP_Config * @param None * @retval None */ void ETH_BSP_Config(void) { #if 0 RCC_ClocksTypeDef RCC_Clocks; /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); if (EthInitStatus == 0) { _printf("Ethernet Init failed\n"); while(1); } /* Configure the PHY to generate an interrupt on change of link status */ //Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS); Eth_Link_PHYITConfig(KS8721_PHY_ADDRESS); /* Configure the EXTI for Ethernet link status. */ //Eth_Link_EXTIConfig(); #else ETH_InitTypeDef ETH_InitStructure; /* Enable ETHERNET clocks */ RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /*Select RMII Interface*/ SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); /* Reset ETHERNET on AHB Bus */ ETH_DeInit(); /* Software reset */ ETH_SoftwareReset(); /* Wait for software reset */ while (ETH_GetSoftwareResetStatus() == SET); /* ETHERNET Configuration ------------------------------------------------------*/ /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ ETH_StructInit(Ð_InitStructure); /* Fill ETH_InitStructure parametrs */ /*------------------------ MAC -----------------------------------*/ ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; ETH_InitStructure.ETH_Speed = ETH_Speed_100M; ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; unsigned int PhyAddr; uint16_t reg2; uint16_t reg3; // read the ID for match for (PhyAddr = 1; 32 >= PhyAddr; PhyAddr++) { reg2 = ETH_ReadPHYRegister(PhyAddr,2); //PHY_MICR_INT_EN ? reg3 = ETH_ReadPHYRegister(PhyAddr,3); if ((reg2 == 0x0022) && (reg3 == 0x1609)) break; } if (PhyAddr > 32) { _CONSOLE(LogId, "Ethernet Phy Not Found\n\r"); return;// 1; } /* Configure Ethernet */ if (ETH_Init(Ð_InitStructure, PhyAddr) == 0) { _CONSOLE(LogId, "Ethernet Initialization Failed\n\r"); return;// 1; } _CONSOLE(LogId, "Check LAN LEDs\n\r"); #endif }
/* initialize the interface */ static rt_err_t rt_stm32_eth_init(rt_device_t dev) { int i; /* MAC address configuration */ ETH_MACAddressConfig(ETH_MAC_Address0, (u8*)&stm32_eth_device.dev_addr[0]); /* Initialize Tx Descriptors list: Chain Mode */ ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); /* Initialize Rx Descriptors list: Chain Mode */ ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); /* Enable Ethernet Rx interrrupt */ { for(i=0; i<ETH_RXBUFNB; i++) { ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE); } } #ifdef CHECKSUM_BY_HARDWARE /* Enable the checksum insertion for the Tx frames */ { for(i=0; i<ETH_TXBUFNB; i++) { ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull); } } #endif { uint16_t tmp, i=10000; tmp = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR); ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CDCTRL1, BIST_CONT_MODE ); ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CR, tmp | BIST_START );//BIST_START while(i--); //tmp = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR); if( ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CR) & BIST_STATUS == BIST_STATUS ) { rt_kprintf("BIST pass\n"); } else { uint16_t ctrl; ctrl = ETH_ReadPHYRegister(DP83848_PHY_ADDRESS, PHY_CDCTRL1); rt_kprintf("BIST faild count =%d\n", BIST_ERROR_COUNT(ctrl) ); } tmp &= ~BIST_START; //Stop BIST ETH_WritePHYRegister(DP83848_PHY_ADDRESS, PHY_CR, tmp); } /* Enable MAC and DMA transmission and reception */ ETH_Start(); //rt_kprintf("DMASR = 0x%X\n", ETH->DMASR ); // rt_kprintf("ETH Init\n"); return RT_EOK; }
/** * @brief ETH_BSP_Config * @param None * @retval None */ void ETH_BSP_Config(void) { RCC_ClocksTypeDef RCC_Clocks; /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); if (EthInitStatus == 0) { __IO uint32_t timeout = 0; //LCD_String(20,50," Ethernet Init ",RED); //LCD_String(20,80," failed ",RED); printf("\n\r Ethernet Init failed\n\r"); //while(1); while(EthInitStatus == 0) { phy_r0 = ETH_ReadPHYRegister(0, 0) ; phy_r1 = ETH_ReadPHYRegister(0, 1) ; phy_r2 = ETH_ReadPHYRegister(0, 2) ; phy_r3 = ETH_ReadPHYRegister(0, 3) ; phy_r4 = ETH_ReadPHYRegister(0, 4) ; phy_r5 = ETH_ReadPHYRegister(0, 5) ; phy_r6 = ETH_ReadPHYRegister(0, 6) ; phy_r17 = ETH_ReadPHYRegister(0, 17) ; phy_r18 = ETH_ReadPHYRegister(0, 18) ; phy_r26 = ETH_ReadPHYRegister(0, 26) ; phy_r27 = ETH_ReadPHYRegister(0, 27) ; phy_r29 = ETH_ReadPHYRegister(0, 29) ; phy_r30 = ETH_ReadPHYRegister(0, 30) ; phy_r31 = ETH_ReadPHYRegister(0, 31) ; if(!(ETH_WritePHYRegister(0, PHY_BCR, PHY_Loopback|PHY_AutoNegotiation|PHY_FullDuplex))) { /* Return ERROR in case of write timeout */ ; } do { timeout++; } while (!(ETH_ReadPHYRegister(0, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO)); } } /* Configure Systick clock source as HCLK */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* SystTick configuration: an interrupt every 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); }