13
#include <kernel/irq.h>
15
#include <net/netdevice.h>
16
#include <net/inetdevice.h>
17
#include <net/l0/net_entry.h>
18
#include <net/l2/ethernet.h>
19
#include <net/l3/arp.h>
20
#include <net/util/show_packet.h>
21
#include <drivers/net/stm32cube_eth.h>
23
#include <embox/unit.h>
24
#include <arm/cpu_cache.h>
26
EMBOX_UNIT_INIT(stm32eth_init);
28
#define STM32ETH_IRQ OPTION_GET(NUMBER, irq)
30
static ETH_HandleTypeDef stm32_eth_handler;
32
static ETH_DMADescTypeDef DMARxDscrTab[ETH_RXBUFNB] \
33
__attribute__ ((aligned (4))) SRAM_DEVICE_MEM_SECTION;
35
static uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE] \
36
__attribute__ ((aligned (4))) SRAM_NOCACHE_SECTION;
50
static uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE] \
51
__attribute__ ((aligned (4))) SRAM_NOCACHE_SECTION;
55
static ETH_DMADescTypeDef DMATxDscrTab[ETH_TXBUFNB] \
56
__attribute__ ((aligned (4))) SRAM_DEVICE_MEM_SECTION;
58
static void low_level_init(unsigned char mac[6]) {
59
memset(&stm32_eth_handler, 0, sizeof(stm32_eth_handler));
61
stm32_eth_handler.Instance = (ETH_TypeDef *) ETH_BASE;
63
stm32_eth_handler.Init.MACAddr = mac;
64
stm32_eth_handler.Init.AutoNegotiation = ETH_AUTONEGOTIATION_DISABLE;
65
stm32_eth_handler.Init.Speed = ETH_SPEED_100M;
66
stm32_eth_handler.Init.DuplexMode = ETH_MODE_FULLDUPLEX;
67
stm32_eth_handler.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
68
stm32_eth_handler.Init.ChecksumMode = ETH_CHECKSUM_BY_SOFTWARE;
69
stm32_eth_handler.Init.PhyAddress = PHY_ADDRESS;
70
stm32_eth_handler.Init.RxMode = ETH_RXINTERRUPT_MODE;
73
if (HAL_OK != HAL_ETH_Init(&stm32_eth_handler)) {
74
log_error("HAL_ETH_Init error\n");
77
if (stm32_eth_handler.State == HAL_ETH_STATE_READY) {
78
log_info("STATE_READY sp %d duplex %d\n",
79
stm32_eth_handler.Init.Speed, stm32_eth_handler.Init.DuplexMode);
83
HAL_ETH_DMATxDescListInit(&stm32_eth_handler, DMATxDscrTab, &Tx_Buff[0][0],
85
if (HAL_OK != HAL_ETH_DMARxDescListInit(&stm32_eth_handler,
86
DMARxDscrTab, &Rx_Buff[0][0],
88
log_error("HAL_ETH_DMARxDescListInit error\n");
92
HAL_ETH_Start(&stm32_eth_handler);
96
static struct sk_buff *low_level_input(void) {
102
if (HAL_ETH_GetReceivedFrame_IT(&stm32_eth_handler) != HAL_OK) {
107
len = stm32_eth_handler.RxFrameInfos.length;
108
buffer = (uint8_t *) stm32_eth_handler.RxFrameInfos.buffer;
113
skb = skb_alloc(len);
117
memcpy(skb->mac.raw, buffer, len);
119
log_error("skb_alloc failed\n");
124
__IO ETH_DMADescTypeDef *dmarxdesc;
127
dmarxdesc = stm32_eth_handler.RxFrameInfos.FSRxDesc;
130
for (i = 0; i < stm32_eth_handler.RxFrameInfos.SegCount; i++) {
131
dmarxdesc->Status |= ETH_DMARXDESC_OWN;
132
dmarxdesc = (ETH_DMADescTypeDef *)(dmarxdesc->Buffer2NextDescAddr);
136
stm32_eth_handler.RxFrameInfos.SegCount = 0;
139
if ((stm32_eth_handler.Instance->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) {
141
stm32_eth_handler.Instance->DMASR = ETH_DMASR_RBUS;
143
stm32_eth_handler.Instance->DMARPDR = 0;
151
static int stm32eth_xmit(struct net_device *dev, struct sk_buff *skb);
152
static int stm32eth_open(struct net_device *dev);
153
static int stm32eth_set_mac(struct net_device *dev, const void *addr);
154
static const struct net_driver stm32eth_ops = {
155
.xmit = stm32eth_xmit,
156
.start = stm32eth_open,
157
.set_macaddr = stm32eth_set_mac,
160
static int stm32eth_open(struct net_device *dev) {
161
low_level_init(dev->dev_addr);
166
static int stm32eth_set_mac(struct net_device *dev, const void *addr) {
167
ETH_TypeDef *regs = (ETH_TypeDef *) ETH_BASE;
169
memcpy(dev->dev_addr, addr, ETH_ALEN);
171
regs->MACA0HR = ((uint32_t) dev->dev_addr[5] << 8) |
172
((uint32_t) dev->dev_addr[4] << 0);
174
regs->MACA0LR = ((uint32_t) dev->dev_addr[3] << 24) |
175
((uint32_t) dev->dev_addr[2] << 16) |
176
((uint32_t) dev->dev_addr[1] << 8) |
177
((uint32_t) dev->dev_addr[0] << 0);
183
#if defined (TX_NO_BUFF) && TX_NO_BUFF == 0
184
static int stm32eth_xmit(struct net_device *dev, struct sk_buff *skb) {
185
__IO ETH_DMADescTypeDef *dma_tx_desc;
187
dma_tx_desc = stm32_eth_handler.TxDesc;
189
dma_tx_desc->Buffer1Addr = (uint32_t) skb->mac.raw;
192
if (0 != HAL_ETH_TransmitFrame(&stm32_eth_handler, skb->len)) {
193
log_error("HAL_ETH_TransmitFrame failed\n");
197
while (dma_tx_desc->Status & ETH_DMATXDESC_OWN)
204
static int stm32eth_xmit(struct net_device *dev, struct sk_buff *skb) {
205
__IO ETH_DMADescTypeDef *dma_tx_desc;
207
dma_tx_desc = stm32_eth_handler.TxDesc;
208
memcpy((void *)dma_tx_desc->Buffer1Addr, skb->mac.raw, skb->len);
211
if (0 != HAL_ETH_TransmitFrame(&stm32_eth_handler, skb->len)) {
212
log_error("HAL_ETH_TransmitFrame failed\n");
221
static irq_return_t stm32eth_interrupt(unsigned int irq_num, void *dev_id) {
222
struct net_device *nic_p = dev_id;
224
ETH_HandleTypeDef *heth = &stm32_eth_handler;
230
if (heth->Instance->DMASR & ETH_DMA_FLAG_FBE) {
231
log_error("DMA error: DMASR = 0x%08x\n", heth->Instance->DMASR);
235
if (__HAL_ETH_DMA_GET_FLAG(heth, ETH_DMA_FLAG_R)) {
237
while (NULL != (skb = low_level_input())) {
240
show_packet(skb->mac.raw, skb->len, "rx");
245
__HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMA_IT_R);
247
__HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMA_IT_NIS);
252
static struct net_device *stm32eth_netdev;
253
static int stm32eth_init(void) {
255
struct net_device *nic;
257
nic = (struct net_device *) etherdev_alloc(0);
262
nic->drv_ops = &stm32eth_ops;
263
nic->irq = STM32ETH_IRQ;
264
nic->base_addr = ETH_BASE;
266
stm32eth_netdev = nic;
268
res = irq_attach(nic->irq, stm32eth_interrupt, 0, stm32eth_netdev, "");
273
return inetdev_register_dev(nic);
276
STATIC_IRQ_ATTACH(STM32ETH_IRQ, stm32eth_interrupt, stm32eth_netdev);