32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #if defined(AT32F407RGT7) || defined(AT32F407VGT7) || defined(AT32F407RCT7) || \
36 defined(AT32F407VCT7) || defined(AT32F407VET7) || defined(AT32F407RET7) || \
37 defined(AT32F407AVCT7) || defined(AT32F407AVGT7)
38 #include "at32f403a_407.h"
39 #elif defined(AT32F437RCT7) || defined(AT32F437RGT7) || defined(AT32F437RMT7) || \
40 defined(AT32F437VCT7) || defined(AT32F437VGT7) || defined(AT32F437VMT7) || \
41 defined(AT32F437ZCT7) || defined(AT32F437ZGT7) || defined(AT32F437ZMT7)
42 #include "at32f435_437.h"
54 #if defined(__ICCARM__)
57 #pragma data_alignment = 4
60 #pragma data_alignment = 4
63 #pragma data_alignment = 4
66 #pragma data_alignment = 4
74 __attribute__((aligned(4)));
77 __attribute__((aligned(4)));
80 __attribute__((aligned(4)));
83 __attribute__((aligned(4)));
129 TRACE_INFO(
"Initializing AT32F4 Ethernet MAC...\r\n");
132 nicDriverInterface = interface;
138 crm_periph_clock_enable(CRM_EMAC_PERIPH_CLOCK,
TRUE);
139 crm_periph_clock_enable(CRM_EMACTX_PERIPH_CLOCK,
TRUE);
140 crm_periph_clock_enable(CRM_EMACRX_PERIPH_CLOCK,
TRUE);
143 crm_periph_reset(CRM_EMAC_PERIPH_RESET,
TRUE);
144 crm_periph_reset(CRM_EMAC_PERIPH_RESET,
FALSE);
157 if(interface->phyDriver != NULL)
160 error = interface->phyDriver->init(interface);
162 else if(interface->switchDriver != NULL)
165 error = interface->switchDriver->init(interface);
183 EMAC->a0l = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
255 #if defined(AT_START_F407_V1)
256 gpio_init_type gpio_init_struct;
259 crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK,
TRUE);
262 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK,
TRUE);
263 crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK,
TRUE);
264 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK,
TRUE);
265 crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK,
TRUE);
268 gpio_pin_remap_config(EMAC_MUX,
TRUE);
271 gpio_pin_remap_config(MII_RMII_SEL_GMUX,
TRUE);
274 gpio_default_para_init(&gpio_init_struct);
277 gpio_init_struct.gpio_pins = GPIO_PINS_8;
278 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
279 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
280 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
281 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
282 gpio_init(GPIOA, &gpio_init_struct);
285 crm_clock_out_set(CRM_CLKOUT_SCLK);
286 crm_clkout_div_set(CRM_CLKOUT_DIV_8);
289 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
290 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
291 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
292 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
295 gpio_init_struct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_2;
296 gpio_init(GPIOA, &gpio_init_struct);
300 gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_12 | GPIO_PINS_13;
301 gpio_init(GPIOB, &gpio_init_struct);
304 gpio_init_struct.gpio_pins = GPIO_PINS_1;
305 gpio_init(GPIOC, &gpio_init_struct);
309 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9 | GPIO_PINS_10;
310 gpio_init(GPIOD, &gpio_init_struct);
313 gpio_init_struct.gpio_pins = GPIO_PINS_8;
314 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
315 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
316 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
317 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
318 gpio_init(GPIOC, &gpio_init_struct);
321 gpio_bits_write(GPIOC, GPIO_PINS_8,
FALSE);
323 gpio_bits_write(GPIOC, GPIO_PINS_8,
TRUE);
327 #elif defined(AT_START_F437_V1)
328 gpio_init_type gpio_init_struct;
331 crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK,
TRUE);
334 crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK,
TRUE);
335 crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK,
TRUE);
336 crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK,
TRUE);
337 crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK,
TRUE);
338 crm_periph_clock_enable(CRM_GPIOG_PERIPH_CLOCK,
TRUE);
341 scfg_emac_interface_set(SCFG_EMAC_SELECT_RMII);
344 gpio_default_para_init(&gpio_init_struct);
347 gpio_init_struct.gpio_pins = GPIO_PINS_8;
348 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
349 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
350 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
351 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
352 gpio_init(GPIOA, &gpio_init_struct);
355 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE8, GPIO_MUX_0);
358 crm_clock_out1_set(CRM_CLKOUT1_PLL);
359 crm_clkout_div_set(CRM_CLKOUT_INDEX_1, CRM_CLKOUT_DIV1_5, CRM_CLKOUT_DIV2_2);
362 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
363 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
364 gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
365 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
368 gpio_init_struct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_2;
369 gpio_init(GPIOA, &gpio_init_struct);
372 gpio_init_struct.gpio_pins = GPIO_PINS_1;
373 gpio_init(GPIOC, &gpio_init_struct);
377 gpio_init_struct.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9 | GPIO_PINS_10;
378 gpio_init(GPIOD, &gpio_init_struct);
382 gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_13 | GPIO_PINS_14;
383 gpio_init(GPIOG, &gpio_init_struct);
386 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_11);
387 gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_11);
388 gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE1, GPIO_MUX_11);
389 gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE8, GPIO_MUX_11);
390 gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE9, GPIO_MUX_11);
391 gpio_pin_mux_config(GPIOD, GPIO_PINS_SOURCE10, GPIO_MUX_11);
392 gpio_pin_mux_config(GPIOG, GPIO_PINS_SOURCE11, GPIO_MUX_11);
393 gpio_pin_mux_config(GPIOG, GPIO_PINS_SOURCE13, GPIO_MUX_11);
394 gpio_pin_mux_config(GPIOG, GPIO_PINS_SOURCE14, GPIO_MUX_11);
397 gpio_init_struct.gpio_pins = GPIO_PINS_15;
398 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
399 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
400 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
401 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
402 gpio_init(GPIOE, &gpio_init_struct);
405 gpio_init_struct.gpio_pins = GPIO_PINS_15;
406 gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
407 gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
408 gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
409 gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
410 gpio_init(GPIOG, &gpio_init_struct);
413 gpio_bits_write(GPIOG, GPIO_PINS_15,
FALSE);
416 gpio_bits_write(GPIOE, GPIO_PINS_15,
FALSE);
418 gpio_bits_write(GPIOE, GPIO_PINS_15,
TRUE);
470 EMAC_DMA->tdladdr = (uint32_t)
txDmaDesc;
472 EMAC_DMA->rdladdr = (uint32_t)
rxDmaDesc;
488 if(interface->phyDriver != NULL)
491 interface->phyDriver->tick(interface);
493 else if(interface->switchDriver != NULL)
496 interface->switchDriver->tick(interface);
513 NVIC_EnableIRQ(EMAC_IRQn);
516 if(interface->phyDriver != NULL)
519 interface->phyDriver->enableIrq(interface);
521 else if(interface->switchDriver != NULL)
524 interface->switchDriver->enableIrq(interface);
541 NVIC_DisableIRQ(EMAC_IRQn);
544 if(interface->phyDriver != NULL)
547 interface->phyDriver->disableIrq(interface);
549 else if(interface->switchDriver != NULL)
552 interface->switchDriver->disableIrq(interface);
577 status = EMAC_DMA->sts;
600 nicDriverInterface->nicEvent =
TRUE;
778 uint32_t hashTable[2];
786 EMAC->a0l = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
803 entry = &interface->macAddrFilter[i];
816 k = (crc >> 26) & 0x3F;
819 hashTable[k / 32] |= (1 << (k % 32));
827 unicastMacAddr[j++] = entry->
addr;
837 EMAC->a1l = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
851 EMAC->a2l = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
865 EMAC->a3l = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
876 EMAC->htl = hashTable[0];
877 EMAC->hth = hashTable[1];
880 TRACE_DEBUG(
" EMAC->htl = %08" PRIX32
"\r\n", EMAC->htl);
881 TRACE_DEBUG(
" EMAC->hth = %08" PRIX32
"\r\n", EMAC->hth);
958 EMAC->miiaddr = temp;
998 EMAC->miiaddr = temp;
1033 p = (uint8_t *)
data;
1038 for(i = 0; i <
length; i++)
1041 for(j = 0; j < 8; j++)
1044 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
1046 crc = (crc << 1) ^ 0x04C11DB7;