Open main menu

DAVE Developer's Wiki β

Changes

DESK-MX8M-L/Deployment/MAC Address programming

1,772 bytes added, 18:21, 27 December 2023
no edit summary
!colspan="4" style="width:100%; text-align:left"; border-bottom:solid 2px #ededed"|History
|-
!style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#73B2C7; padding:5px; color:white"|Version
!style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#73B2C7; padding:5px; color:white"|Issue Date
!style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#73B2C7; padding:5px; color:white"|Notes
|-
|style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#edf8fb; padding:5px; color:#000000"|1.0.0{{oldid|style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#edf8fb; padding:5px; color:#000000"16739|Jun 2022/07/01}}|style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#edf8fb; padding:5px; color:#000000"|First DESK-MX8M-L release
|-
! style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#ededed; padding:5px; color:#000000" |2023/08/24
! style="border-left:solid 2px #73B2C7; border-right:solid 2px #73B2C7;border-top:solid 2px #73B2C7; border-bottom:solid 2px #73B2C7; background-color:#ededed; padding:5px; color:#000000" |DESK-MX8M-L-4.0.0 release
|}
<section end=History/>
__FORCETOC__
__FORCETOC__
<section begin=Body/>
The MAC address is a six-pair set of hexadecimal numbers, for example <code>a1-c2-e3-44-5f-6d</code>. Specifically, in Ethernet, the MAC address is known as the Ethernet Address, which is the unique ID serial number of the Ethernet device in one's computer. MAC Addresses are used in a Local Area Network (LAN) by computers to communicate with each other. Every adapter has a unique MAC address.
=== Platform supported===In this Application Note, we will describe how to use the i.MX eFuses MX8M eFuse for programming and using the MAC address(es)and it applies to the following DAVE <code>i.MX8M family</code> products:* [[ORCA SOM | ORCA]]* [[MITO 8M SOM | MITO8M]]* [[MITO 8M Mini SOM| MITO 8M Mini]] {{ImportantMessage|text=This Application Note has been validated in the [[ORCA SOM | ORCA SOM]]. The commands used have been not validated in the other platform yet.}}
=== Obtaining a MAC address ===
Some SOCs provide programmable OTPs for security, MAC address, boot modes, etc. Usually, some of these are general-purpose registers and can be managed by the user.
In other cases, an external permanent storage device can be used for storing permanent settings like the MAC address: for the i.MX SoC MX8M product family, DAVE proposes to use the ''General Purposes eFuses'' (OTP blocks) on SoC itself for storing permanently the MAC address(es).
=== MAC address programming on i.MX8M family ===
eth0: ethernet@30be0000
If the <code>ethaddr</code> is set and saved in the u-boot environment, it's its value is used as the MAC Address:
u-boot=> setenv ethaddr 00:50:C2c2:1E1e:AFaf:CBa8
u-boot=> saveenv
Saving Environment to MMC... Writing to MMC(1)... OK
The related HW_OCOTP_MAC_ADDR0, HW_OCOTP_MAC_ADDR1, HW_OCOTP_MAC_ADDR2 OTP registers will be used for the purposes illustrated in this AN.
 
{{ImportantMessage|text='''Warning!!''' eFuse programming is a permanent and non reversible action. Pay attention to the values and commands used during MAC programming.}}
==== eth0 eFuse programming ====
 
U-Boot uses the <code>fuse prog</code> command for writing the MAC address into the eFuse. The MAC address should be divided in high 16 bit and low 32 bits, for example MAC address <code>AB:CD:12:34:56:78</code> for eth0 is then divided into :
</pre>
In the following example the MAC address <code>00:50:c2:1e:af:cda8</code> is stored in the i.MX SOMSOC:
* (in case of presence) clear the <code>ethaddr</code> u-boot variable
<pre class="workstation-terminal">
* program the MAC address in the OPTs with the following commands:
<pre class="workstation-terminal">
u-boot=> fuse prog 9 0 c21eafcdc21eafa8Programming bank 9 word 0x00000000 to 0xc21eafcd0xc21eafa8...
Warning: Programming fuses is an irreversible operation!
This may brick your system.
<pre>
u-boot=> fuse prog -y 9 0 c21eafcdc21eafa8
u-boot=> fuse prog -y 9 1 0050
</pre>
Hit any key to stop autoboot: 0
u-boot=> print ethaddr
ethaddr=00:50:c2:1e:af:cda8
u-boot=>
</pre>
For the second ethernet interface, the above procedure should be repeated in a similar way, except of ''the correct ''eFuse register should be used'':
The MAC address should be divided in ''low'' 16 bit and ''high'' 32 bits, for example MAC address <code>00:50:c2:1e:af:cea9</code> is stored in the i.MX8M SOM SOC using:
<pre>
fuse prog -y 9 1 afce0000afa90000
fuse prog -y 9 2 0050c21e
</pre>
The <code>eth1addr</code> U-Boot variable is then used for the second ethernet interface MAC address management.
 
==== eFuse locking ====
The OTP eFuse registers should be locked in order to avoid unwanted registers (and then MAC addresses) modifications. OTP lock grants the MAC values cannot be modified anymore.
 
{{ImportantMessage|text=If not locked yet, OTP bits can be set to ''''1'''' but not reversed to ''''0'''' value, so some modifications can be applied if the eFuse registers are not locked.
 
For more information see, for example, the [https://www.nxp.com/webapp/Download?colCode=IMX6SDLRM i.MX6 Dual Lite Reference Manual chap. 47.3.1.3] }}
 
The two MAC addresses - even if sharing register <code>bank:9 word:1</code> - can be programmed at different times.
 
At the opposite, eFuse lock should be performed for both simultaneously. The registers lock can be forced using the following command:
 
<pre>
fuse prog -y 0 0 c000
</pre>
 
==== eFuse reading ====
The eFuse registers can be read - after programming - for checking the written values:
 
<pre class="workstation-terminal">
u-boot=> fuse read 9 0
Reading bank 9:
 
Word 0x00000000: c21eafa8
u-boot=> fuse read 9 1
Reading bank 9:
 
Word 0x00000001: afa90050
u-boot=> fuse read 9 2
Reading bank 9:
 
Word 0x00000002: 0050c21e
u-boot=>
</pre>
=== Linux kernel MAC address ===
The MAC Address configured in u-boot is passed to the kernel which configures the <code>eth0</code> and <code>eth1</code> peripheral peripherals with the correct values:
<pre class="workstation-terminal">
root@desk-mx8mp:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:c2:1e:af:cda8
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
eth1 Link encap:Ethernet HWaddr 00:50:c2:1e:af:cea9
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
8,221
edits