#include "includes.h" #include "Lan8720.h" #include "gd32f4xx.h" //#include "gd32f4xx_gpio.h" #include "pdebug.h" #include "bsp_os.h" //#include "gd32f4xx_enet.h" #include "gd32f4xx_it.h" #include "lwip/tcpip.h" #include "lwip/raw.h" #include "lwip/icmp.h" #include "lwip/dhcp.h" #include "lwip/netif.h" #include "lwip/sys.h" #include "lwip/timers.h" #include "lwip/inet_chksum.h" #include "lwip/init.h" #include "netif/etharp.h" unsigned char g_local_ip[4] = {192,168,8,200}; //����Ĭ��ip unsigned char g_local_mac[] = {0x42, 0x00, 0x00, 0x00, 0x00, 0x01}; //Ĭ��mac��ַ42:00:00:00:00:01 unsigned char g_netmask[4] = {255,255,255,0}; //�������� unsigned char g_gateway[4] = {172,16,19,254}; //���� //unsigned char gCfgLoca_MAC[] = {0x02, 0x0A, 0x0D, 0x0E, 0x0F, 0x06}; unsigned char gCfgLoca_MAC[] = {0x42, 0x00, 0x00, 0x00, 0x00, 0x01}; uint8_t gCfgLoca_MAC[]; __IO uint32_t enet_init_status = 0;//������̫����ʼ��״̬�ж� char Enet_init_status; struct netif fsl_netif0; extern err_t ethernetif_init(struct netif *netif); extern err_t ethernetif_input(struct netif *netif); //��ʼ�������� static void Lan8720_gpio_Init(void) { //IO����ʱ��ʹ�� rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_GPIOG); rcu_periph_clock_enable(RCU_GPIOH); rcu_periph_clock_enable(RCU_GPIOI); //ʹ��ϵͳʱ�� rcu_periph_clock_enable(RCU_SYSCFG); //ѡ��RMIIģʽ syscfg_enet_phy_interface_config(SYSCFG_ENET_PHY_RMII); //PA1��REF_CLK ʱ�����ţ��ⲿPHY�ṩ50M gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1); //PA2: ETH_MDIO gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2); //PA7: ETH_RMII_CRS_DV gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7); //���Ÿ��� gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7); //PB11: ETH_RMII_TX_EN gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_11); //PB12: ETH_RMII_TXD0 gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12); //PB13: ETH_RMII_TXD1 gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_11); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_13); //PC1: ETH_MDC gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1); //PC4: ETH_RMII_RXD0 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4); //PC5: ETH_RMII_RXD1 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5); } //��ʼ��MAC/DMA static void Enet_MAC_DMA_config(void) { ErrStatus reval_state = ERROR; rcu_periph_clock_enable(RCU_ENET);//ʹ����̫������ʱ�� rcu_periph_clock_enable(RCU_ENETTX);//ʹ�ܷ���ʱ�� rcu_periph_clock_enable(RCU_ENETRX);//ʹ�ܽ���ʱ�� enet_deinit();//��λ����ʱ��AHB reval_state = enet_software_reset();//�ȴ�ʱ�Ӹ�λ��� if(ERROR == reval_state){//��λʧ�� while(1){ } } //��̫���豸��ʼ�� #ifdef CHECKSUM_BY_HARDWARE//������ enet_init_status = enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS); #else //PHY�Զ�Э�̡�����IP֡У�鹦�ܡ���ַ������ͨ�����н��յ��Ĺ㲥֡ ENET_100M_FULLDUPLEX/ENET_AUTO_NEGOTIATION enet_init_status = enet_init(ENET_AUTO_NEGOTIATION, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS); #endif /* CHECKSUM_BY_HARDWARE */ /*ע����ǰʹ�õ�LAN8720PHYоƬֻ��ʹ���Զ�Э��ģʽ���ֶ�ģʽ�޷�ͨ�ţ�LAN8720����bug��*/ } //�ж�Ƕ���������� static void Nvic_configuration(void) { //�����ж�Ƕ�׻���ַ,,,ʹ��Flash base address����ַ��ƫ����λӦ�ó���ƫ��������bootʹ�ú�ʹ�ܣ� // nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x0); //ʹ����̫���ж����� // nvic_irq_enable(ENET_IRQn, 2, 3); nvic_irq_enable(ENET_IRQn, 1, 0); } void Lan8720_Init(void) { // �ж�Ƕ���������� Nvic_configuration(); // RMIIģʽ��ʱ�ӡ��������� Lan8720_gpio_Init(); //MAC/DMA���� Enet_MAC_DMA_config(); if(0 == enet_init_status){//��ʼ��DMAʧ�� Enet_init_status = 0; term_printf("\n Lan8720 Init fail 0 \r\n\r\n"); }else{ term_printf("\n Lan8720 Init success 1 \r\n\r\n"); Enet_init_status = 1; } //��̫�������ж����� enet_interrupt_enable(ENET_DMA_INT_NIE); //�����ж�ʹ�� enet_interrupt_enable(ENET_DMA_INT_RIE); BSP_IntVectSet(77,ENET_IRQHandler); BSP_IntEn(77); } unsigned int Lwip_init(void) { ip_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw; pdebug(DEBUG_LEVEL_INFO,"tcp ip init begin!\r\n"); tcpip_init(NULL, NULL); OSTimeDlyHMSM(0, 0, 0, 100); pdebug(DEBUG_LEVEL_INFO,"tcp ip init ok!\r\n"); #if LWIP_DHCP fsl_netif0_ipaddr.addr=0; fsl_netif0_netmask.addr=0; fsl_netif0_gw.addr=0; #else IP4_ADDR(&fsl_netif0_ipaddr, g_local_ip[0],g_local_ip[1],g_local_ip[2],g_local_ip[3]); IP4_ADDR(&fsl_netif0_netmask, g_netmask[0],g_netmask[1],g_netmask[2],g_netmask[3]); IP4_ADDR(&fsl_netif0_gw, g_gateway[0],g_gateway[1],g_gateway[2],g_gateway[3]); u8_t *ip = (u8_t*)&fsl_netif0_ipaddr.addr; pdebug(DEBUG_LEVEL_INFO,"set net ip: %u.%u.%u.%u \r\n",ip[0], ip[1],ip[2], ip[3]); ip = (u8_t*)&fsl_netif0_netmask.addr; pdebug(DEBUG_LEVEL_INFO,"set net mask: %u.%u.%u.%u \r\n",ip[0], ip[1],ip[2], ip[3]); ip = (u8_t*)&fsl_netif0_gw.addr; pdebug(DEBUG_LEVEL_INFO,"set net gw: %u.%u.%u.%u \r\n",ip[0], ip[1],ip[2], ip[3]); #endif netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init, ethernet_input); netif_set_default(&fsl_netif0); netif_set_up(&fsl_netif0); #if LWIP_DHCP dhcp_start(&fsl_netif0); int i = sys_now(); int time = 0; while((fsl_netif0.dhcp->offered_ip_addr.addr == 0) || (fsl_netif0.dhcp->offered_gw_addr.addr == 0) || (fsl_netif0.dhcp->offered_sn_mask.addr == 0)) { if(sys_now()- i > 8000) { i = sys_now(); dhcp_start(&fsl_netif0); // ��ʱ3�� time++; if (time > 3) { break; } } OSTimeDlyHMSM(0, 0, 0, 100); } dhcp_fine_tmr(); netif_set_addr(&fsl_netif0, &(fsl_netif0.dhcp->offered_ip_addr), &(fsl_netif0.dhcp->offered_sn_mask), &(fsl_netif0.dhcp->offered_gw_addr)); netif_set_default(&fsl_netif0); netif_set_up(&fsl_netif0); u8_t *ip = (u8_t*)&fsl_netif0.ip_addr.addr; ip = (u8_t*)&fsl_netif0.dhcp->offered_sn_mask; ip = (u8_t*)&fsl_netif0.dhcp->offered_gw_addr; #endif term_printf("\n Lwip Init success \r\n\r\n"); return 0; } /// ��̫��ģ���ʼ�� /// /// ��ʼ���ײ�mac��������phyоƬ��OSLwip,�������� /// @param none /// @param none /// @return none /// @note �޸���־ /// gkl��2017-05-26���� /// LH��2022-05-12�޸� void init_enet_module() { // ��ʼ��mac��������phyоƬ Lan8720_Init(); // ��ʼ��Lwip_Init��ع���ģ�� Lwip_init(); }