1
+ #include <string.h>
1
2
#include "stm32f4xx_hal.h"
2
3
4
+ #define C029_OTP_START_ADDRESS (0x1FFF7800U)
5
+ #define C029_OTP_END_ADDRESS (C029_OTP_START_ADDRESS + (16*32))
6
+ #define C029_MAC_ETHERNET_ID (3)
7
+
8
+ typedef struct C029_OTP_Header {
9
+ uint8_t id ;
10
+ uint8_t len ;
11
+ uint8_t data [];
12
+ } __attribute__((__packed__ )) C029_OTP_Header ;
13
+
14
+ static int _macRetrieved = 0 ;
15
+ static char _macAddr [6 ] = { 0x02 , 0x02 , 0xF7 , 0xF0 , 0x00 , 0x00 };
16
+
17
+ static C029_OTP_Header * increment (C029_OTP_Header * pTemp )
18
+ {
19
+ uint8_t len = 0 ;
20
+ uint8_t id = 0 ;
21
+ uint8_t * p = (uint8_t * )pTemp ;
22
+
23
+ memcpy ((void * )& id , (void * )pTemp , 1 );
24
+
25
+ if (id == 0xFF ){
26
+ p ++ ;
27
+ }
28
+ else {
29
+ p ++ ;
30
+ memcpy ((void * )& len , (void * )p ++ , 1 );
31
+ p += len ;
32
+ }
33
+ return (C029_OTP_Header * )p ;
34
+ }
35
+
3
36
/**
4
37
* Override HAL Eth Init function
5
38
*/
@@ -83,4 +116,27 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth)
83
116
/* Disable the Ethernet global Interrupt */
84
117
NVIC_DisableIRQ (ETH_IRQn );
85
118
}
119
+ }
120
+
121
+ void mbed_mac_address (char * mac )
122
+ {
123
+ C029_OTP_Header * pFound = NULL ;
124
+ C029_OTP_Header * pTemp = (C029_OTP_Header * )C029_OTP_START_ADDRESS ;
125
+ C029_OTP_Header temp ;
126
+
127
+ if (_macRetrieved == 0 ) {
128
+ while ((pTemp >= (C029_OTP_Header * )C029_OTP_START_ADDRESS ) && (pTemp < (C029_OTP_Header * )C029_OTP_END_ADDRESS )){
129
+ memcpy ((void * )& temp , (void * )pTemp , sizeof (temp ));
130
+ if (temp .id == C029_MAC_ETHERNET_ID ){
131
+ pFound = pTemp ;
132
+ break ;
133
+ }
134
+ pTemp = increment (pTemp );
135
+ }
136
+ if (pFound != NULL ) {
137
+ memcpy (_macAddr , pFound -> data , 6 );
138
+ _macRetrieved = 1 ;
139
+ }
140
+ }
141
+ memcpy (mac , _macAddr , 6 );
86
142
}
0 commit comments