This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] How to update IDs (USB & PCIe PID/VID, MAC ID) by programming extended OTP on AM6x

There are default ID values for the ID registers of USB, PCIe, MAC as listed in the TRM:
- PCIe
CTRLMMR_PCI_DEVICE_ID0, CTRLMMR_PCI_DEVICE_ID1
- USB
CTRLMMR_USB_DEVICE_ID0, CTRLMMR_USB_DEVICE_ID1
- MAC
CTRLMMR_MAC_ID0, CTRLMMR_MAC_ID1

The default ID values can be optionally updated by programming the extended OTP efuse. If the ID update magic word is programmed by user and found from the extended OTP area by ROM then ROM process and update the ID register values with the programed ID values from the extended OTP area.

The FAQ describes how to update the default IDs (USB & PCIe PID/VID, MAC ID) by programming extended OTP efuse.The ID value update by programming the extended OTP area is supported by either OTP keywriter or SYSFW. The test in the FAQ is using SYSFW on AM62A SoC HS-FS, and this would work on HS-SE. The same feature is also supported on AM64x, AM62x.

It is recommended to read this related FAQ first on "How to program the extended OTP efuse on AM6x SoC"
e2e.ti.com/.../faq-how-to-program-the-extended-otp-efuse-on-am6x-soc

  • Below diagram shows ROM's interpretation of extended OTP region for IDs. Upon SoC RESET, ROM reads extended OTP array from the end to determine if various device IDs (USB VID/PID, PCIe VID/PID, MAC ID) are programmed into the extended OTP efuse. If the extended OTP data matches the ID update magic word then ROM will process the values from the extended OTP efuse, and updates these values into control MMRs (See TRM for control MMRs for USB, PCIe, MAC ID).

    Fig.1 AM62x/AM62A with 1024 bits extended OTP efuse

    Fig.2 AM64x with 384 bits extended OTP efuse

    I tested programming USB VID/PID to extended OTP area with AM62A MCU+SDK 8.6 on AM62A HS-FS, and captured the relevant logs showing USB VID/PID updated by ROM based on the USB VID/PID programmed to extended OTP area.
    - am62a_fs#3_extotp_test#1_rd.log: the extended OTP MMR read after USB VID/PID programmed
    OTP MMR 30: 0x45a0e047
    OTP MMR 31: 0xebc80021
    USB VID: 0x45a0
    USB PID: 0xe047
    - am62a_fs#3_usb_vid_pid_post.log: the USB-DFU boot log on HS-FS with USB VID/PID programmed
    Found DFU: [45a0:e047] ver=0200, devnum=67, cfg=1, intf=0, alt=1, name="SocId", serial="01.00.00.00"
    Found DFU: [45a0:e047] ver=0200, devnum=67, cfg=1, intf=0, alt=0, name="bootloader", serial="01.00.00.00"
    - am62a_fs#3_ID_MMR_rd.log: CTRLMMR_USB_DEVICE_ID0/CTRLMMR_USB_DEVICE_ID1 read @u-boot. where the ID0="e04745a0" is the programmed USB VID/PID , and the ID1="61650451" is the default value.
    => md.l 0x43000220 2
    43000220: e04745a0 61650451

    am62a_fs#3_extotp_test#1_rd.log
    AM62A EXT_OTP_MMR read
    OTP MMR 0: 0x4 
    OTP MMR 1: 0x0 
    OTP MMR 2: 0x0 
    OTP MMR 3: 0x0 
    OTP MMR 4: 0x0 
    OTP MMR 5: 0x0 
    OTP MMR 6: 0x0 
    OTP MMR 7: 0x0 
    OTP MMR 8: 0x0 
    OTP MMR 9: 0x0 
    OTP MMR 10: 0x0 
    OTP MMR 11: 0x0 
    OTP MMR 12: 0x0 
    OTP MMR 13: 0x0 
    OTP MMR 14: 0x0 
    OTP MMR 15: 0x0 
    OTP MMR 16: 0x0 
    OTP MMR 17: 0x0 
    OTP MMR 18: 0x0 
    OTP MMR 19: 0x0 
    OTP MMR 20: 0x0 
    OTP MMR 21: 0x0 
    OTP MMR 22: 0x0 
    OTP MMR 23: 0x0 
    OTP MMR 24: 0x0 
    OTP MMR 25: 0x0 
    OTP MMR 26: 0x0 
    OTP MMR 27: 0x0 
    OTP MMR 28: 0x0 
    OTP MMR 29: 0x0 
    OTP MMR 30: 0x45a0e047 
    OTP MMR 31: 0xebc80021 
    USB VID: 0x45a0 
    USB PID: 0xe047 
    EXT_OTP_MMR read done
    

    am62a_fs#3_usb_vid_pid_post.log
    sitara@sitara-Latitude-E6410:~/am6/am62x_sdk8.6$ sudo dfu-util -l
    dfu-util 0.8
    
    Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
    Copyright 2010-2014 Tormod Volden and Stefan Schmidt
    This program is Free Software and has ABSOLUTELY NO WARRANTY
    Please report bugs to dfu-util@lists.gnumonks.org
    
    Found DFU: [45a0:e047] ver=0200, devnum=67, cfg=1, intf=0, alt=1, name="SocId", serial="01.00.00.00"
    Found DFU: [45a0:e047] ver=0200, devnum=67, cfg=1, intf=0, alt=0, name="bootloader", serial="01.00.00.00"
    sitara@sitara-Latitude-E6410:~/am6/am62x_sdk8.6$
    

    am62a_fs#3_ID_MMR_rd.log
    U-Boot SPL 2021.01-g2ee8efd654 (Feb 27 2023 - 11:47:43 +0000)
    SYSFW ABI: 3.1 (firmware rev 0x0008 '8.6.4--v08.06.04 (Chill Capybar')
    am62a_init: board_init_f done
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Trying to boot from MMC2
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Starting ATF on ARM64 core...
    
    NOTICE:  BL31: v2.8(release):v2.8-226-g2fcd408bb3-dirty
    NOTICE:  BL31: Built : 11:09:43, Feb 27 2023
    
    U-Boot SPL 2021.01-g2ee8efd654 (Feb 27 2023 - 11:13:07 +0000)
    SYSFW ABI: 3.1 (firmware rev 0x0008 '8.6.4--v08.06.04 (Chill Capybar')
    am62a_init: board_init_f done
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Trying to boot from MMC2
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    am62a_init: spl_boot_device: devstat = 0x243 bootmedia = 0x8 bootindex = 0
    Authentication passed
    
    
    U-Boot 2021.01-g2ee8efd654 (Feb 27 2023 - 11:13:07 +0000)
    
    SoC:   AM62AX SR1.0 HS-FS
    Model: Texas Instruments AM62A7 SK
    EEPROM not available at 0x50, trying to read at 0x51
    Board: AM62A-SKEVM rev E1
    DRAM:  4 GiB
    MMC:   mmc@fa10000: 0, mmc@fa00000: 1
    Loading Environment from MMC... OK
    In:    serial@2800000
    Out:   serial@2800000
    Err:   serial@2800000
    Net:   eth0: ethernet@8000000port@1
    Hit any key to stop autoboot:  2  0 
    => md.l 0x43000220 2
    43000220: e04745a0 61650451                      .EG.Q.ea
    =>