6
6
* @version 1.0
7
7
* @date 20. Nov. 2011
8
8
* @author NXP MCU SW Application Team
9
- *
9
+ *
10
10
* Copyright(C) 2011, NXP Semiconductor
11
11
* All rights reserved.
12
12
*
62
62
63
63
#if NO_SYS == 0
64
64
/** \brief Driver transmit and receive thread priorities
65
- *
65
+ *
66
66
* Thread priorities for receive thread and TX cleanup thread. Alter
67
67
* to prioritize receive or transmit bandwidth. In a heavily loaded
68
68
* system or with LEIP_DEBUG enabled, the priorities might be better
71
71
#define TX_PRIORITY (osPriorityNormal)
72
72
73
73
/** \brief Debug output formatter lock define
74
- *
74
+ *
75
75
* When using FreeRTOS and with LWIP_DEBUG enabled, enabling this
76
76
* define will allow RX debug messages to not interleave with the
77
77
* TX messages (so they are actually readable). Not enabling this
@@ -144,7 +144,7 @@ struct lpc_enetdata {
144
144
145
145
/** \brief LPC EMAC driver work data
146
146
*/
147
- ETHMEM_SECTION struct lpc_enetdata lpc_enetdata ;
147
+ ETHMEM_SECTION struct lpc_enetdata lpc_enetdata ;
148
148
149
149
/* Write a value via the MII link (non-blocking) */
150
150
void lpc_mii_write_noblock (u32_t PhyReg , u32_t Value )
@@ -196,15 +196,15 @@ u32_t lpc_mii_read_data(void)
196
196
}
197
197
198
198
/* Starts a read operation via the MII link (non-blocking) */
199
- void lpc_mii_read_noblock (u32_t PhyReg )
199
+ void lpc_mii_read_noblock (u32_t PhyReg )
200
200
{
201
201
/* Read value at PHY address and register */
202
202
LPC_EMAC -> MADR = (LPC_PHYDEF_PHYADDR << 8 ) | PhyReg ;
203
203
LPC_EMAC -> MCMD = EMAC_MCMD_READ ;
204
204
}
205
205
206
206
/* Read a value via the MII link (blocking) */
207
- err_t lpc_mii_read (u32_t PhyReg , u32_t * data )
207
+ err_t lpc_mii_read (u32_t PhyReg , u32_t * data )
208
208
{
209
209
u32_t mst = 250 ;
210
210
err_t sts = ERR_OK ;
@@ -307,7 +307,7 @@ s32_t lpc_rx_queue(struct netif *netif)
307
307
}
308
308
309
309
/** \brief Sets up the RX descriptor ring buffers.
310
- *
310
+ *
311
311
* This function sets up the descriptor list used for receive packets.
312
312
*
313
313
* \param[in] lpc_enetif Pointer to driver data structure
@@ -414,7 +414,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
414
414
LWIP_DEBUGF (UDP_LPC_EMAC | LWIP_DBG_TRACE ,
415
415
("lpc_low_level_input: Packet dropped with errors (0x%x)\n" ,
416
416
lpc_enetif -> prxs [idx ].statusinfo ));
417
-
417
+
418
418
p = NULL ;
419
419
} else {
420
420
/* A packet is waiting, get length */
@@ -447,7 +447,7 @@ static struct pbuf *lpc_low_level_input(struct netif *netif)
447
447
#endif
448
448
#endif
449
449
450
- return p ;
450
+ return p ;
451
451
}
452
452
453
453
/** \brief Attempt to read a packet from the EMAC interface.
@@ -497,11 +497,11 @@ void lpc_enetif_input(struct netif *netif)
497
497
*/
498
498
static s32_t lpc_packet_addr_notsafe (void * addr ) {
499
499
/* Check for legal address ranges */
500
- #if defined(TARGET_LPC1768 )
500
+ #if defined(TARGET_LPC1768 )
501
501
if ((((u32_t ) addr >= 0x2007C000 ) && ((u32_t ) addr < 0x20083FFF ))) {
502
502
#elif defined(TARGET_LPC4088)
503
503
if ((((u32_t ) addr >= 0x20000000 ) && ((u32_t ) addr < 0x20007FFF ))) {
504
- #endif
504
+ #endif
505
505
return 0 ;
506
506
}
507
507
return 1 ;
@@ -641,7 +641,7 @@ static err_t lpc_low_level_output(struct netif *netif, struct pbuf *p)
641
641
/* Allocate a pbuf in DMA memory */
642
642
np = pbuf_alloc (PBUF_RAW , p -> tot_len , PBUF_RAM );
643
643
if (np == NULL )
644
- return ERR_MEM ;
644
+ return ERR_MEM ;
645
645
646
646
/* This buffer better be contiguous! */
647
647
LWIP_ASSERT ("lpc_low_level_output: New transmit pbuf is chained" ,
@@ -654,7 +654,7 @@ static err_t lpc_low_level_output(struct netif *netif, struct pbuf *p)
654
654
MEMCPY (dst , (u8_t * ) q -> payload , q -> len );
655
655
dst += q -> len ;
656
656
}
657
- np -> len = p -> tot_len ;
657
+ np -> len = p -> tot_len ;
658
658
659
659
LWIP_DEBUGF (UDP_LPC_EMAC | LWIP_DBG_TRACE ,
660
660
("lpc_low_level_output: Switched to DMA safe buffer, old=%p, new=%p\n" ,
@@ -759,12 +759,12 @@ void ENET_IRQHandler(void)
759
759
/* RX group interrupt(s): Give semaphore to wakeup RX receive task.*/
760
760
sys_sem_signal (& lpc_enetdata .RxSem );
761
761
}
762
-
762
+
763
763
if (ints & TXINTGROUP ) {
764
764
/* TX group interrupt(s): Give semaphore to wakeup TX cleanup task. */
765
765
sys_sem_signal (& lpc_enetdata .TxCleanSem );
766
766
}
767
-
767
+
768
768
/* Clear pending interrupts */
769
769
LPC_EMAC -> IntClear = ints ;
770
770
#endif
@@ -780,11 +780,11 @@ void ENET_IRQHandler(void)
780
780
*/
781
781
static void packet_rx (void * pvParameters ) {
782
782
struct lpc_enetdata * lpc_enetif = pvParameters ;
783
-
783
+
784
784
while (1 ) {
785
785
/* Wait for receive task to wakeup */
786
786
sys_arch_sem_wait (& lpc_enetif -> RxSem , 0 );
787
-
787
+
788
788
/* Process packets until all empty */
789
789
while (LPC_EMAC -> RxConsumeIndex != LPC_EMAC -> RxProduceIndex )
790
790
lpc_enetif_input (lpc_enetif -> netif );
@@ -802,34 +802,34 @@ static void packet_rx(void* pvParameters) {
802
802
static void packet_tx (void * pvParameters ) {
803
803
struct lpc_enetdata * lpc_enetif = pvParameters ;
804
804
s32_t idx ;
805
-
805
+
806
806
while (1 ) {
807
807
/* Wait for transmit cleanup task to wakeup */
808
808
sys_arch_sem_wait (& lpc_enetif -> TxCleanSem , 0 );
809
-
809
+
810
810
/* Error handling for TX underruns. This should never happen unless
811
811
something is holding the bus or the clocks are going too slow. It
812
812
can probably be safely removed. */
813
813
if (LPC_EMAC -> IntStatus & EMAC_INT_TX_UNDERRUN ) {
814
814
LINK_STATS_INC (link .err );
815
815
LINK_STATS_INC (link .drop );
816
-
816
+
817
817
#if NO_SYS == 0
818
818
/* Get exclusive access */
819
819
sys_mutex_lock (& lpc_enetif -> TXLockMutex );
820
820
#endif
821
821
/* Reset the TX side */
822
822
LPC_EMAC -> MAC1 |= EMAC_MAC1_RES_TX ;
823
823
LPC_EMAC -> IntClear = EMAC_INT_TX_UNDERRUN ;
824
-
824
+
825
825
/* De-allocate all queued TX pbufs */
826
826
for (idx = 0 ; idx < LPC_NUM_BUFF_TXDESCS ; idx ++ ) {
827
827
if (lpc_enetif -> txb [idx ] != NULL ) {
828
828
pbuf_free (lpc_enetif -> txb [idx ]);
829
829
lpc_enetif -> txb [idx ] = NULL ;
830
830
}
831
831
}
832
-
832
+
833
833
#if NO_SYS == 0
834
834
/* Restore access */
835
835
sys_mutex_unlock (& lpc_enetif -> TXLockMutex );
@@ -855,8 +855,8 @@ static err_t low_level_init(struct netif *netif)
855
855
856
856
/* Enable MII clocking */
857
857
LPC_SC -> PCONP |= CLKPWR_PCONP_PCENET ;
858
-
859
- #if defined(TARGET_LPC1768 )
858
+
859
+ #if defined(TARGET_LPC1768 )
860
860
LPC_PINCON -> PINSEL2 = 0x50150105 ; /* Enable P1 Ethernet Pins. */
861
861
LPC_PINCON -> PINSEL3 = (LPC_PINCON -> PINSEL3 & ~0x0000000F ) | 0x00000005 ;
862
862
#elif defined(TARGET_LPC4088 )
@@ -880,16 +880,16 @@ static err_t low_level_init(struct netif *netif)
880
880
LPC_IOCON -> P1_16 |= 0x01 ; /* ENET_MDC */
881
881
LPC_IOCON -> P1_17 &= ~0x07 ;
882
882
LPC_IOCON -> P1_17 |= 0x01 ; /* ENET_MDIO */
883
- #endif
884
-
883
+ #endif
884
+
885
885
/* Reset all MAC logic */
886
886
LPC_EMAC -> MAC1 = EMAC_MAC1_RES_TX | EMAC_MAC1_RES_MCS_TX |
887
887
EMAC_MAC1_RES_RX | EMAC_MAC1_RES_MCS_RX | EMAC_MAC1_SIM_RES |
888
888
EMAC_MAC1_SOFT_RES ;
889
889
LPC_EMAC -> Command = EMAC_CR_REG_RES | EMAC_CR_TX_RES | EMAC_CR_RX_RES |
890
890
EMAC_CR_PASS_RUNT_FRM ;
891
891
osDelay (10 );
892
-
892
+
893
893
/* Initial MAC initialization */
894
894
LPC_EMAC -> MAC1 = EMAC_MAC1_PASS_ALL ;
895
895
LPC_EMAC -> MAC2 = EMAC_MAC2_CRC_EN | EMAC_MAC2_PAD_EN |
@@ -980,7 +980,7 @@ void lpc_emac_set_speed(int mbs_100)
980
980
*
981
981
* \param[in] netif the lwip network interface structure for this lpc_enetif
982
982
* \param[in] q Pointer to pbug to send
983
- * \param[in] ipaddr IP address
983
+ * \param[in] ipaddr IP address
984
984
* \return ERR_OK or error code
985
985
*/
986
986
err_t lpc_etharp_output (struct netif * netif , struct pbuf * q ,
@@ -1017,11 +1017,20 @@ err_t lpc_enetif_init(struct netif *netif)
1017
1017
err_t err ;
1018
1018
1019
1019
LWIP_ASSERT ("netif != NULL" , (netif != NULL ));
1020
-
1020
+
1021
1021
lpc_enetdata .netif = netif ;
1022
1022
1023
1023
/* set MAC hardware address */
1024
+ #if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE )
1025
+ netif -> hwaddr [0 ] = MBED_MAC_ADDR_0 ;
1026
+ netif -> hwaddr [1 ] = MBED_MAC_ADDR_1 ;
1027
+ netif -> hwaddr [2 ] = MBED_MAC_ADDR_2 ;
1028
+ netif -> hwaddr [3 ] = MBED_MAC_ADDR_3 ;
1029
+ netif -> hwaddr [4 ] = MBED_MAC_ADDR_4 ;
1030
+ netif -> hwaddr [5 ] = MBED_MAC_ADDR_5 ;
1031
+ #else
1024
1032
mbed_mac_address ((char * )netif -> hwaddr );
1033
+ #endif
1025
1034
netif -> hwaddr_len = ETHARP_HWADDR_LEN ;
1026
1035
1027
1036
/* maximum transfer unit */
@@ -1068,12 +1077,12 @@ err_t lpc_enetif_init(struct netif *netif)
1068
1077
err = sys_sem_new (& lpc_enetdata .TxCleanSem , 0 );
1069
1078
LWIP_ASSERT ("TxCleanSem creation error" , (err == ERR_OK ));
1070
1079
sys_thread_new ("txclean_thread" , packet_tx , netif -> state , DEFAULT_THREAD_STACKSIZE , TX_PRIORITY );
1071
-
1080
+
1072
1081
/* periodic PHY status update */
1073
1082
osTimerId phy_timer = osTimerCreate (osTimer (phy_update ), osTimerPeriodic , (void * )netif );
1074
1083
osTimerStart (phy_timer , 250 );
1075
1084
#endif
1076
-
1085
+
1077
1086
return ERR_OK ;
1078
1087
}
1079
1088
0 commit comments