Open main menu

DAVE Developer's Wiki β

Changes

DESK-MX8M-L/Deployment/MAC Address programming

3,361 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 ===
==== MAC address configuration in u-boot====
 
The MAC Address programming in u-boot is explained in [https://solidrun.atlassian.net/wiki/spaces/developer/pages/287178818/i.MX8M+Ethernet+MAC+Address+Fusing this guide] as per the NXP suggested link in the support forum.
If the MAC address is not already programmed in the OTPs and the <code>ethaddr</code> u-boot variable is not set, u-boot assignes a random value (different at every power on cycle):
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
u-boot=>
==== eFuse bank registers ====i.MX8M family uses the Bank9 Word0, Word1 and Word2 (if the SoC has two ethernet interfaces) for storing the MAC addresses. The MAC values should be properly divided into the three registers for correct programming. 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>
fuse prog -y 4 2 9 0 0x12345678fuse prog -y 4 3 9 1 0xABCD
</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>
<pre>
u-boot=> saveenv
</pre>
 
==== eth1 eFuse programming ====
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:a9</code> is stored in the SOC using:
 
<pre>
fuse prog -y 9 1 afa90000
fuse prog -y 9 2 0050c21e
</pre>
 
{{ImportantMessage|text='''Be Careful!!''' Register <code>bank:9 word:1</code> is shared between first and second interface, so the lowest 16-bits in the register should be set to <code>0000</code> avoiding to change the ''eth0'' MAC settings}}
 
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> peripheral and <code>eth1</code> peripherals with the correct valuevalues:
<pre class="workstation-terminal">
root@desk-mx6mx8mp:~# ifconfig eth0eth0 Link encap:Ethernet HWaddr 00:50:c2:1e:af:cda8 inet addrUP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1920 (0.1680 B) TX bytes:0 (0.0 B) eth1 Link encap:Ethernet HWaddr 00:50:c2:1e:af:a9 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.90 0 B) BcastTX bytes:0 (0.0 B) Interrupt:43 lo Link encap:192Local Loopback inet addr:127.1680.0.255 1 Mask:255.2550.2550.0 inet6 addr: fe80::fc23:36ff:fe24:aeb31/64 128 Scope:LinkHost UP BROADCAST LOOPBACK RUNNING MULTICAST MTU:1500 65536 Metric:1 RX packets:17748 82 errors:0 dropped:0 overruns:0 frame:0 TX packets:13811 82 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19833087 6220 (186.9 MiB0 KiB) TX bytes:1908941 6220 (16.8 MiB0 KiB)
root@desk-mx6mx8mp:~#
</pre>
8,221
edits