1 | /*******************************************************************************
|
2 | LL Driver Interface ( LwIP stack --> ETH)
|
3 | *******************************************************************************/
|
4 | /**
|
5 | * In this function, the hardware should be initialized.
|
6 | * Called from ethernetif_init().
|
7 | *
|
8 | * @param netif the already initialized lwip network interface structure
|
9 | * for this ethernetif
|
10 | */
|
11 | static void low_level_init(struct netif *netif)
|
12 | {
|
13 | uint32_t regvalue = 0;
|
14 | HAL_StatusTypeDef hal_eth_init_status;
|
15 |
|
16 | /* Init ETH */
|
17 |
|
18 | uint8_t MACAddr[6] ;
|
19 | heth.Instance = ETH;
|
20 | heth.Init.AutoNegotiation = ETH_AUTONEGOTIATION_DISABLE;
|
21 | heth.Init.Speed = ETH_SPEED_100M;
|
22 | heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
|
23 | heth.Init.PhyAddress = DP83848_PHY_ADDRESS;
|
24 | MACAddr[0] = 0x00;
|
25 | MACAddr[1] = 0x80;
|
26 | MACAddr[2] = 0xE1;
|
27 | MACAddr[3] = 0x00;
|
28 | MACAddr[4] = 0x00;
|
29 | MACAddr[5] = 0x00;
|
30 | heth.Init.MACAddr = &MACAddr[0];
|
31 | heth.Init.RxMode = ETH_RXPOLLING_MODE;
|
32 | heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
|
33 | heth.Init.MediaInterface = ETH_MEDIA_INTERFACE_MII;
|
34 |
|
35 | /* USER CODE BEGIN MACADDRESS */
|
36 | MACAddr[0] = EEPROM_Daten.macAdresse[0];
|
37 | MACAddr[1] = EEPROM_Daten.macAdresse[1];
|
38 | MACAddr[2] = EEPROM_Daten.macAdresse[2];
|
39 | MACAddr[3] = EEPROM_Daten.macAdresse[3];
|
40 | MACAddr[4] = EEPROM_Daten.macAdresse[4];
|
41 | MACAddr[5] = EEPROM_Daten.macAdresse[5];
|
42 | /* USER CODE END MACADDRESS */
|
43 |
|
44 | hal_eth_init_status = HAL_ETH_Init(&heth);
|
45 |
|
46 | if (hal_eth_init_status == HAL_OK)
|
47 | {
|
48 | /* Set netif link flag */
|
49 | netif->flags |= NETIF_FLAG_LINK_UP;
|
50 | }
|
51 | /* Initialize Tx Descriptors list: Chain Mode */
|
52 | HAL_ETH_DMATxDescListInit(&heth, DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
|
53 |
|
54 | /* Initialize Rx Descriptors list: Chain Mode */
|
55 | HAL_ETH_DMARxDescListInit(&heth, DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
|
56 |
|
57 | #if LWIP_ARP || LWIP_ETHERNET
|
58 |
|
59 | /* set MAC hardware address length */
|
60 | netif->hwaddr_len = ETH_HWADDR_LEN;
|
61 |
|
62 | /* set MAC hardware address */
|
63 | netif->hwaddr[0] = heth.Init.MACAddr[0];
|
64 | netif->hwaddr[1] = heth.Init.MACAddr[1];
|
65 | netif->hwaddr[2] = heth.Init.MACAddr[2];
|
66 | netif->hwaddr[3] = heth.Init.MACAddr[3];
|
67 | netif->hwaddr[4] = heth.Init.MACAddr[4];
|
68 | netif->hwaddr[5] = heth.Init.MACAddr[5];
|
69 |
|
70 | /* maximum transfer unit */
|
71 | netif->mtu = 1500;
|
72 |
|
73 | /* Accept broadcast address and ARP traffic */
|
74 | /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
|
75 | #if LWIP_ARP
|
76 | netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
|
77 | #else
|
78 | netif->flags |= NETIF_FLAG_BROADCAST;
|
79 | #endif /* LWIP_ARP */
|
80 |
|
81 | /* Enable MAC and DMA transmission and reception */
|
82 | HAL_ETH_Start(&heth);
|
83 |
|
84 | /* USER CODE BEGIN PHY_PRE_CONFIG */
|
85 |
|
86 | /* USER CODE END PHY_PRE_CONFIG */
|
87 |
|
88 | /**** Configure PHY to generate an interrupt when Eth Link state changes ****/
|
89 | /* Read Register Configuration */
|
90 | HAL_ETH_ReadPHYRegister(&heth, PHY_MICR, ®value);
|
91 |
|
92 | regvalue |= (PHY_MICR_INT_EN | PHY_MICR_INT_OE);
|
93 |
|
94 | /* Enable Interrupts */
|
95 | HAL_ETH_WritePHYRegister(&heth, PHY_MICR, regvalue );
|
96 |
|
97 | /* Read Register Configuration */
|
98 | HAL_ETH_ReadPHYRegister(&heth, PHY_MISR, ®value);
|
99 |
|
100 | regvalue |= PHY_MISR_LINK_INT_EN;
|
101 |
|
102 | /* Enable Interrupt on change of link status */
|
103 | HAL_ETH_WritePHYRegister(&heth, PHY_MISR, regvalue);
|
104 |
|
105 | /* USER CODE BEGIN PHY_POST_CONFIG */
|
106 |
|
107 | /* USER CODE END PHY_POST_CONFIG */
|
108 |
|
109 | #endif /* LWIP_ARP || LWIP_ETHERNET */
|
110 |
|
111 | /* USER CODE BEGIN LOW_LEVEL_INIT */
|
112 |
|
113 | /* USER CODE END LOW_LEVEL_INIT */
|
114 | }
|