11/*
2- * Copyright (c) 2018 Nuvoton Technology Corp.
2+ * Copyright (c) 2018 Nuvoton Technology Corp.
33 * Copyright (c) 2018 ARM Limited
44 *
55 * Licensed under the Apache License, Version 2.0 (the "License");
2828#define ETH_ENABLE_RX () do{EMAC->CTL |= EMAC_CTL_RXON_Msk;}while(0)
2929#define ETH_DISABLE_TX () do{EMAC->CTL &= ~EMAC_CTL_TXON;}while(0)
3030#define ETH_DISABLE_RX () do{EMAC->CTL &= ~EMAC_CTL_RXON_Msk;}while(0)
31-
31+
3232#define EMAC_ENABLE_INT (emac , u32eIntSel ) ((emac)->INTEN |= (u32eIntSel))
33- #define EMAC_DISABLE_INT (emac , u32eIntSel ) ((emac)->INTEN &= ~ (u32eIntSel))
33+ #define EMAC_DISABLE_INT (emac , u32eIntSel ) ((emac)->INTEN &= ~ (u32eIntSel))
3434
3535MBED_ALIGN (4 ) struct eth_descriptor rx_desc [RX_DESCRIPTOR_NUM ];
3636MBED_ALIGN (4 ) struct eth_descriptor tx_desc [TX_DESCRIPTOR_NUM ];
3737
3838struct eth_descriptor volatile * cur_tx_desc_ptr , * cur_rx_desc_ptr , * fin_tx_desc_ptr ;
3939
40- __attribute__ ((section ("EMAC_RAM" )))
40+ __attribute__((section ("EMAC_RAM" )))
4141MBED_ALIGN (4 ) uint8_t rx_buf [RX_DESCRIPTOR_NUM ][PACKET_BUFFER_SIZE ];
42- __attribute__ ((section ("EMAC_RAM" )))
42+ __attribute__((section ("EMAC_RAM" )))
4343MBED_ALIGN (4 ) uint8_t tx_buf [TX_DESCRIPTOR_NUM ][PACKET_BUFFER_SIZE ];
4444
4545eth_callback_t nu_eth_txrx_cb = NULL ;
@@ -74,7 +74,7 @@ static uint16_t mdio_read(uint8_t addr, uint8_t reg)
7474 EMAC -> MIIMCTL = (addr << EMAC_MIIMCTL_PHYADDR_Pos ) | reg | EMAC_MIIMCTL_BUSY_Msk | EMAC_MIIMCTL_MDCON_Msk ;
7575 while (EMAC -> MIIMCTL & EMAC_MIIMCTL_BUSY_Msk );
7676
77- return (EMAC -> MIIMDAT );
77+ return (EMAC -> MIIMDAT );
7878}
7979
8080static int reset_phy (void )
@@ -87,16 +87,17 @@ static int reset_phy(void)
8787 mdio_write (CONFIG_PHY_ADDR , MII_BMCR , BMCR_RESET );
8888
8989 delayCnt = 2000 ;
90- while (delayCnt > 0 ) {
90+ while (delayCnt > 0 ) {
9191 delayCnt -- ;
92- if ((mdio_read (CONFIG_PHY_ADDR , MII_BMCR ) & BMCR_RESET ) == 0 )
92+ if ((mdio_read (CONFIG_PHY_ADDR , MII_BMCR ) & BMCR_RESET ) == 0 ) {
9393 break ;
94+ }
9495
9596 }
9697
97- if (delayCnt == 0 ) {
98+ if (delayCnt == 0 ) {
9899 NU_DEBUGF (("Reset phy failed\n" ));
99- return (-1 );
100+ return (-1 );
100101 }
101102
102103 mdio_write (CONFIG_PHY_ADDR , MII_ADVERTISE , ADVERTISE_CSMA |
@@ -109,39 +110,40 @@ static int reset_phy(void)
109110 mdio_write (CONFIG_PHY_ADDR , MII_BMCR , reg | BMCR_ANRESTART );
110111
111112 delayCnt = 200000 ;
112- while (delayCnt > 0 ) {
113+ while (delayCnt > 0 ) {
113114 delayCnt -- ;
114- if ((mdio_read (CONFIG_PHY_ADDR , MII_BMSR ) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS ))
115- == (BMSR_ANEGCOMPLETE | BMSR_LSTATUS ))
115+ if ((mdio_read (CONFIG_PHY_ADDR , MII_BMSR ) & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS ))
116+ == (BMSR_ANEGCOMPLETE | BMSR_LSTATUS )) {
116117 break ;
118+ }
117119 }
118120
119- if (delayCnt == 0 ) {
121+ if (delayCnt == 0 ) {
120122 NU_DEBUGF (("AN failed. Set to 100 FULL\n" ));
121123 EMAC -> CTL |= (EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk );
122- return (-1 );
124+ return (-1 );
123125 } else {
124126 reg = mdio_read (CONFIG_PHY_ADDR , MII_LPA );
125127 phyLPAval = reg ;
126128
127- if (reg & ADVERTISE_100FULL ) {
129+ if (reg & ADVERTISE_100FULL ) {
128130 NU_DEBUGF (("100 full\n" ));
129131 EMAC -> CTL |= (EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk );
130- } else if (reg & ADVERTISE_100HALF ) {
132+ } else if (reg & ADVERTISE_100HALF ) {
131133 NU_DEBUGF (("100 half\n" ));
132134 EMAC -> CTL = (EMAC -> CTL & ~EMAC_CTL_FUDUP_Msk ) | EMAC_CTL_OPMODE_Msk ;
133- } else if (reg & ADVERTISE_10FULL ) {
135+ } else if (reg & ADVERTISE_10FULL ) {
134136 NU_DEBUGF (("10 full\n" ));
135137 EMAC -> CTL = (EMAC -> CTL & ~EMAC_CTL_OPMODE_Msk ) | EMAC_CTL_FUDUP_Msk ;
136138 } else {
137139 NU_DEBUGF (("10 half\n" ));
138140 EMAC -> CTL &= ~(EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk );
139141 }
140142 }
141- printf ("PHY ID 1:0x%x\r\n" , mdio_read (CONFIG_PHY_ADDR , MII_PHYSID1 ));
142- printf ("PHY ID 2:0x%x\r\n" , mdio_read (CONFIG_PHY_ADDR , MII_PHYSID2 ));
143+ printf ("PHY ID 1:0x%x\r\n" , mdio_read (CONFIG_PHY_ADDR , MII_PHYSID1 ));
144+ printf ("PHY ID 2:0x%x\r\n" , mdio_read (CONFIG_PHY_ADDR , MII_PHYSID2 ));
143145
144- return (0 );
146+ return (0 );
145147}
146148
147149
@@ -152,7 +154,7 @@ static void init_tx_desc(void)
152154
153155 cur_tx_desc_ptr = fin_tx_desc_ptr = & tx_desc [0 ];
154156
155- for (i = 0 ; i < TX_DESCRIPTOR_NUM ; i ++ ) {
157+ for (i = 0 ; i < TX_DESCRIPTOR_NUM ; i ++ ) {
156158 tx_desc [i ].status1 = TXFD_PADEN | TXFD_CRCAPP | TXFD_INTEN ;
157159 tx_desc [i ].buf = & tx_buf [i ][0 ];
158160 tx_desc [i ].status2 = 0 ;
@@ -170,7 +172,7 @@ static void init_rx_desc(void)
170172
171173 cur_rx_desc_ptr = & rx_desc [0 ];
172174
173- for (i = 0 ; i < RX_DESCRIPTOR_NUM ; i ++ ) {
175+ for (i = 0 ; i < RX_DESCRIPTOR_NUM ; i ++ ) {
174176 rx_desc [i ].status1 = OWNERSHIP_EMAC ;
175177 rx_desc [i ].buf = & rx_buf [i ][0 ];
176178 rx_desc [i ].status2 = 0 ;
@@ -201,13 +203,13 @@ static void __eth_clk_pin_init()
201203
202204 /* Enable IP clock */
203205 CLK_EnableModuleClock (EMAC_MODULE );
204-
206+
205207 // Configure MDC clock rate to HCLK / (127 + 1) = 1.25 MHz if system is running at 160 MH
206208 CLK_SetModuleClock (EMAC_MODULE , 0 , CLK_CLKDIV3_EMAC (127 ));
207-
209+
208210 /* Update System Core Clock */
209211 SystemCoreClockUpdate ();
210-
212+
211213 /*---------------------------------------------------------------------------------------------------------*/
212214 /* Init I/O Multi-function */
213215 /*---------------------------------------------------------------------------------------------------------*/
@@ -221,10 +223,10 @@ static void __eth_clk_pin_init()
221223 SYS -> GPE_MFPH &= ~(SYS_GPE_MFPH_PE8MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk |
222224 SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk );
223225 SYS -> GPE_MFPH |= SYS_GPE_MFPH_PE8MFP_EMAC_RMII_MDC |
224- SYS_GPE_MFPH_PE9MFP_EMAC_RMII_MDIO |
225- SYS_GPE_MFPH_PE10MFP_EMAC_RMII_TXD0 |
226- SYS_GPE_MFPH_PE11MFP_EMAC_RMII_TXD1 |
227- SYS_GPE_MFPH_PE12MFP_EMAC_RMII_TXEN ;
226+ SYS_GPE_MFPH_PE9MFP_EMAC_RMII_MDIO |
227+ SYS_GPE_MFPH_PE10MFP_EMAC_RMII_TXD0 |
228+ SYS_GPE_MFPH_PE11MFP_EMAC_RMII_TXD1 |
229+ SYS_GPE_MFPH_PE12MFP_EMAC_RMII_TXEN ;
228230
229231 // Enable high slew rate on all RMII TX output pins
230232 PE -> SLEWCTL = (GPIO_SLEWCTL_HIGH << GPIO_SLEWCTL_HSREN10_Pos ) |
@@ -240,13 +242,13 @@ static void __eth_clk_pin_init()
240242
241243void numaker_eth_init (uint8_t * mac_addr )
242244{
243-
244- // init CLK & pins
245- __eth_clk_pin_init ();
246-
245+
246+ // init CLK & pins
247+ __eth_clk_pin_init ();
248+
247249 // Reset MAC
248250 EMAC -> CTL = EMAC_CTL_RST_Msk ;
249- while (EMAC -> CTL & EMAC_CTL_RST_Msk ) {}
251+ while (EMAC -> CTL & EMAC_CTL_RST_Msk ) {}
250252
251253 init_tx_desc ();
252254 init_rx_desc ();
@@ -272,17 +274,15 @@ void numaker_eth_init(uint8_t *mac_addr)
272274 EMAC -> CAMCTL = EMAC_CAMCTL_CMPEN_Msk |
273275 EMAC_CAMCTL_AMP_Msk |
274276 EMAC_CAMCTL_ABP_Msk ;
275- EMAC -> CAMEN = 1 ; // Enable CAM entry 0
277+ EMAC -> CAMEN = 1 ; // Enable CAM entry 0
276278 /* Limit the max receive frame length to 1514 + 4 */
277279 EMAC -> MRFL = NU_ETH_MAX_FLEN ;
278-
280+
279281 /* Set RX FIFO threshold as 8 words */
280282 EMAC -> FIFOCTL = 0x00200100 ;
281-
282- if (isPhyReset != true)
283- {
284- if (!reset_phy ())
285- {
283+
284+ if (isPhyReset != true) {
285+ if (!reset_phy ()) {
286286 isPhyReset = true;
287287 }
288288 } else {
@@ -298,9 +298,9 @@ void numaker_eth_init(uint8_t *mac_addr)
298298 } else {
299299 NU_DEBUGF (("10 half\n" ));
300300 EMAC -> CTL &= ~(EMAC_CTL_OPMODE_Msk | EMAC_CTL_FUDUP_Msk );
301- }
301+ }
302302 }
303-
303+
304304 EMAC_ENABLE_RX ();
305305 EMAC_ENABLE_TX ();
306306
@@ -323,11 +323,15 @@ void EMAC_RX_IRQHandler(void)
323323 if (m_status & EMAC_INTSTS_RXBEIF_Msk ) {
324324 // Shouldn't goes here, unless descriptor corrupted
325325 mbed_error_printf ("### RX Bus error [0x%x]\r\n" , m_status );
326- if (nu_eth_txrx_cb != NULL ) nu_eth_txrx_cb ('B' , nu_userData );
326+ if (nu_eth_txrx_cb != NULL ) {
327+ nu_eth_txrx_cb ('B' , nu_userData );
328+ }
327329 return ;
328330 }
329331 EMAC_DISABLE_INT (EMAC , (EMAC_INTEN_RDUIEN_Msk | EMAC_INTEN_RXGDIEN_Msk ));
330- if (nu_eth_txrx_cb != NULL ) nu_eth_txrx_cb ('R' , nu_userData );
332+ if (nu_eth_txrx_cb != NULL ) {
333+ nu_eth_txrx_cb ('R' , nu_userData );
334+ }
331335}
332336
333337
@@ -342,42 +346,48 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
342346 unsigned int cur_entry , status ;
343347
344348 cur_entry = EMAC -> CRXDSA ;
345- if ((cur_entry == (uint32_t )cur_rx_desc_ptr ) && (!(m_status & EMAC_INTSTS_RDUIF_Msk ))) // cur_entry may equal to cur_rx_desc_ptr if RDU occures
346- return -1 ;
349+ if ((cur_entry == (uint32_t )cur_rx_desc_ptr ) && (!(m_status & EMAC_INTSTS_RDUIF_Msk ))) { // cur_entry may equal to cur_rx_desc_ptr if RDU occures
350+ return -1 ;
351+ }
347352 status = cur_rx_desc_ptr -> status1 ;
348353
349- if (status & OWNERSHIP_EMAC )
350- return -1 ;
354+ if (status & OWNERSHIP_EMAC ) {
355+ return -1 ;
356+ }
351357
352358 if (status & RXFD_RXGD ) {
353359 * buf = cur_rx_desc_ptr -> buf ;
354360 * len = status & 0xFFFF ;
355361 // length of payload should be <= 1514
356- if ( * len > (NU_ETH_MAX_FLEN - 4 ) ) {
362+ if (* len > (NU_ETH_MAX_FLEN - 4 )) {
357363 NU_DEBUGF (("%s... unexpected long packet length=%d, buf=0x%x\r\n" , __FUNCTION__ , * len , * buf ));
358364 * len = 0 ; // Skip this unexpected long packet
359365 }
360- if (* len == (NU_ETH_MAX_FLEN - 4 )) NU_DEBUGF (("%s... length=%d, buf=0x%x\r\n" , __FUNCTION__ , * len , * buf ));
366+ if (* len == (NU_ETH_MAX_FLEN - 4 )) {
367+ NU_DEBUGF (("%s... length=%d, buf=0x%x\r\n" , __FUNCTION__ , * len , * buf ));
368+ }
361369 }
362370 return 0 ;
363- }
371+ }
364372
365373void numaker_eth_rx_next (void )
366374{
367375 cur_rx_desc_ptr -> status1 = OWNERSHIP_EMAC ;
368- cur_rx_desc_ptr = cur_rx_desc_ptr -> next ;
369- }
376+ cur_rx_desc_ptr = cur_rx_desc_ptr -> next ;
377+ }
370378
371379void EMAC_TX_IRQHandler (void )
372380{
373381 unsigned int cur_entry , status ;
374382
375383 status = EMAC -> INTSTS & 0xFFFF0000 ;
376384 EMAC -> INTSTS = status ;
377- if (status & EMAC_INTSTS_TXBEIF_Msk ) {
385+ if (status & EMAC_INTSTS_TXBEIF_Msk ) {
378386 // Shouldn't goes here, unless descriptor corrupted
379387 mbed_error_printf ("### TX Bus error [0x%x]\r\n" , status );
380- if (nu_eth_txrx_cb != NULL ) nu_eth_txrx_cb ('B' , nu_userData );
388+ if (nu_eth_txrx_cb != NULL ) {
389+ nu_eth_txrx_cb ('B' , nu_userData );
390+ }
381391 return ;
382392 }
383393
@@ -387,16 +397,19 @@ void EMAC_TX_IRQHandler(void)
387397
388398 fin_tx_desc_ptr = fin_tx_desc_ptr -> next ;
389399 }
390-
391- if (nu_eth_txrx_cb != NULL ) nu_eth_txrx_cb ('T' , nu_userData );
400+
401+ if (nu_eth_txrx_cb != NULL ) {
402+ nu_eth_txrx_cb ('T' , nu_userData );
403+ }
392404}
393405
394406uint8_t * numaker_eth_get_tx_buf (void )
395407{
396- if (cur_tx_desc_ptr -> status1 & OWNERSHIP_EMAC )
397- return (NULL );
398- else
399- return (cur_tx_desc_ptr -> buf );
408+ if (cur_tx_desc_ptr -> status1 & OWNERSHIP_EMAC ) {
409+ return (NULL );
410+ } else {
411+ return (cur_tx_desc_ptr -> buf );
412+ }
400413}
401414
402415void numaker_eth_trigger_tx (uint16_t length , void * p )
@@ -413,11 +426,12 @@ void numaker_eth_trigger_tx(uint16_t length, void *p)
413426
414427int numaker_eth_link_ok (void )
415428{
416- /* first, a dummy read to latch */
417- mdio_read (CONFIG_PHY_ADDR , MII_BMSR );
418- if (mdio_read (CONFIG_PHY_ADDR , MII_BMSR ) & BMSR_LSTATUS )
419- return 1 ;
420- return 0 ;
429+ /* first, a dummy read to latch */
430+ mdio_read (CONFIG_PHY_ADDR , MII_BMSR );
431+ if (mdio_read (CONFIG_PHY_ADDR , MII_BMSR ) & BMSR_LSTATUS ) {
432+ return 1 ;
433+ }
434+ return 0 ;
421435}
422436
423437void numaker_eth_set_cb (eth_callback_t eth_cb , void * userData )
@@ -439,43 +453,44 @@ void mbed_mac_address(char *mac)
439453 // http://en.wikipedia.org/wiki/MAC_address
440454 uint32_t word1 = * (uint32_t * )0x7F800 ; // 2KB Data Flash at 0x7F800
441455
442- if ( word0 == 0xFFFFFFFF ) // Not burn any mac address at 1st 2 words of Data Flash
443- {
456+ if (word0 == 0xFFFFFFFF ) { // Not burn any mac address at 1st 2 words of Data Flash
444457 // with a semi-unique MAC address from the UUID
445458 /* Enable FMC ISP function */
446459 SYS_UnlockReg ();
447460 FMC_Open ();
448461 // = FMC_ReadUID(0);
449462 uID1 = FMC_ReadUID (1 );
450463 word1 = (uID1 & 0x003FFFFF ) | ((uID1 & 0x030000 ) << 6 ) >> 8 ;
451- word0 = ((FMC_ReadUID (0 ) >> 4 ) << 20 ) | ((uID1 & 0xFF )<< 12 ) | (FMC_ReadUID (2 ) & 0xFFF );
464+ word0 = ((FMC_ReadUID (0 ) >> 4 ) << 20 ) | ((uID1 & 0xFF ) << 12 ) | (FMC_ReadUID (2 ) & 0xFFF );
452465 /* Disable FMC ISP function */
453466 FMC_Close ();
454467 /* Lock protected registers */
455468 SYS_LockReg ();
456- }
469+ }
457470
458471 word1 |= 0x00000200 ;
459472 word1 &= 0x0000FEFF ;
460473
461- mac [0 ] = (word1 & 0x0000ff00 ) >> 8 ;
474+ mac [0 ] = (word1 & 0x0000ff00 ) >> 8 ;
462475 mac [1 ] = (word1 & 0x000000ff );
463476 mac [2 ] = (word0 & 0xff000000 ) >> 24 ;
464477 mac [3 ] = (word0 & 0x00ff0000 ) >> 16 ;
465478 mac [4 ] = (word0 & 0x0000ff00 ) >> 8 ;
466479 mac [5 ] = (word0 & 0x000000ff );
467-
468- NU_DEBUGF (("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n" , mac [0 ], mac [1 ],mac [2 ],mac [3 ],mac [4 ],mac [5 ]));
480+
481+ NU_DEBUGF (("mac address %02x-%02x-%02x-%02x-%02x-%02x \r\n" , mac [0 ], mac [1 ], mac [2 ], mac [3 ], mac [4 ], mac [5 ]));
469482}
470483
471- void numaker_eth_enable_interrupts (void ) {
484+ void numaker_eth_enable_interrupts (void )
485+ {
472486 EMAC -> INTEN |= EMAC_INTEN_RXIEN_Msk |
473487 EMAC_INTEN_TXIEN_Msk ;
474- NVIC_EnableIRQ (EMAC_RX_IRQn );
475- NVIC_EnableIRQ (EMAC_TX_IRQn );
488+ NVIC_EnableIRQ (EMAC_RX_IRQn );
489+ NVIC_EnableIRQ (EMAC_TX_IRQn );
476490}
477491
478- void numaker_eth_disable_interrupts (void ) {
479- NVIC_DisableIRQ (EMAC_RX_IRQn );
480- NVIC_DisableIRQ (EMAC_TX_IRQn );
492+ void numaker_eth_disable_interrupts (void )
493+ {
494+ NVIC_DisableIRQ (EMAC_RX_IRQn );
495+ NVIC_DisableIRQ (EMAC_TX_IRQn );
481496}
0 commit comments