Part Number: AM2634
Tool/software:
Hi,
I am looking for a way to pull a unique TI number - be it serial number or anything else - that is unique between processors and exists between power cycles.
I found this blog post answered a couple years ago - https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1330894/am2634-reading-processor-version-and-identification-information
But when I read out the numbers between two different dev kits, both dev kits reported the same numbers.
I tried the following from "Table 2-929. TOP_CTRL Registers, Base Address=50D8 0000h, Length=4096" of https://www.ti.com/lit/ug/spruj42e/spruj42e.pdf?ts=1756786931208
10h 32 TOP_CTRL_EFUSE_DIEID0 50D8 0010h
14h 32 TOP_CTRL_EFUSE_DIEID1 50D8 0014h
18h 32 TOP_CTRL_EFUSE_DIEID2 50D8 0018h
1Ch 32 TOP_CTRL_EFUSE_DIEID3 50D8 001Ch
20h 32 TOP_CTRL_EFUSE_UID0 50D8 0020h
24h 32 TOP_CTRL_EFUSE_UID1 50D8 0024h
28h 32 TOP_CTRL_EFUSE_UID2 50D8 0028h
2Ch 32 TOP_CTRL_EFUSE_UID3 50D8 002Ch
30h 32 TOP_CTRL_EFUSE_DEVICE_TYPE 50D8 0030h
34h 32 TOP_CTRL_EFUSE_FROM0_CHECKSUM 50D8 0034h
38h 32 TOP_CTRL_EFUSE_JTAG_USERCODE_ID 50D8 0038h
14h 32 TOP_CTRL_EFUSE_DIEID1 50D8 0014h
18h 32 TOP_CTRL_EFUSE_DIEID2 50D8 0018h
1Ch 32 TOP_CTRL_EFUSE_DIEID3 50D8 001Ch
20h 32 TOP_CTRL_EFUSE_UID0 50D8 0020h
24h 32 TOP_CTRL_EFUSE_UID1 50D8 0024h
28h 32 TOP_CTRL_EFUSE_UID2 50D8 0028h
2Ch 32 TOP_CTRL_EFUSE_UID3 50D8 002Ch
30h 32 TOP_CTRL_EFUSE_DEVICE_TYPE 50D8 0030h
34h 32 TOP_CTRL_EFUSE_FROM0_CHECKSUM 50D8 0034h
38h 32 TOP_CTRL_EFUSE_JTAG_USERCODE_ID 50D8 0038h
I also tried to read out the MAC ID with the following, but it's reading back all 0s for the two control card I'm using.
std::array<uint8_t, 8> get_hardware_id() {
uint32_t mac_id0 = HW_RD_REG32_RAW(CSL_TOP_CTRL_MAC_ID0);
uint32_t mac_id1 = HW_RD_REG32_RAW(CSL_TOP_CTRL_MAC_ID1);
return { (uint8_t)(mac_id0 >> 0), (uint8_t)(mac_id0 >> 8), (uint8_t)(mac_id0 >> 16), (uint8_t)(mac_id0 >> 24),
(uint8_t)(mac_id1 >> 0), (uint8_t)(mac_id1 >> 8), (uint8_t)(mac_id1 >> 16), (uint8_t)(mac_id1 >> 24),
};
}
It returns all 0s on both control cards under test: 0000000000000000
Where if I do the same thing on EFUSE_UID
std::array<uint8_t, 16> get_hardware_id() {uint32_t uid0 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_UID0);uint32_t uid1 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_UID1);uint32_t uid2 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_UID2);uint32_t uid3 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_UID3);return { (uint8_t)(uid0 >> 0), (uint8_t)(uid0 >> 8), (uint8_t)(uid0 >> 16), (uint8_t)(uid0 >> 24),(uint8_t)(uid1 >> 0), (uint8_t)(uid1 >> 8), (uint8_t)(uid1 >> 16), (uint8_t)(uid1 >> 24),(uint8_t)(uid2 >> 0), (uint8_t)(uid2 >> 8), (uint8_t)(uid2 >> 16), (uint8_t)(uid2 >> 24),(uint8_t)(uid3 >> 0), (uint8_t)(uid3 >> 8), (uint8_t)(uid3 >> 16), (uint8_t)(uid3 >> 24) };}
Both control cards return non zero values, but the same number between the two control cards.
Same with EFUSE_DIEID
std::array<uint8_t, 16> get_hardware_id() {uint32_t uid0 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_DIEID0);uint32_t uid1 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_DIEID1);uint32_t uid2 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_DIEID2);uint32_t uid3 = HW_RD_REG32_RAW(CSL_TOP_CTRL_EFUSE_DIEID3);return { (uint8_t)(uid0 >> 0), (uint8_t)(uid0 >> 8), (uint8_t)(uid0 >> 16), (uint8_t)(uid0 >> 24),(uint8_t)(uid1 >> 0), (uint8_t)(uid1 >> 8), (uint8_t)(uid1 >> 16), (uint8_t)(uid1 >> 24),(uint8_t)(uid2 >> 0), (uint8_t)(uid2 >> 8), (uint8_t)(uid2 >> 16), (uint8_t)(uid2 >> 24),(uint8_t)(uid3 >> 0), (uint8_t)(uid3 >> 8), (uint8_t)(uid3 >> 16), (uint8_t)(uid3 >> 24) };}
Both control cards return non zero values, but the same number between the two control cards.
Do you know what register I can pull, or better yet what API function I can use, to get a unique id from chip to chip that is consistent through power cycles?
