Hi,
The unique id solution for the Raspberry Pi by Adam and his team works very
well. However, I suggest a slight modification of the code. In short, if the
number of bytes of the NuttX unique id is configured equal to the actual number
of bytes of the id in the Pico flash hardware system (8 bytes), the hardware id
is just copied and not used as a PRNG seed. If the configured size of the NuttX
unique id is larger than the flash hardware, the PRNG code is used to return a
unique id with more (non-zero) bytes. The advantage of having the function
returning the actual hardware id, is that this is easily compared to the id
returned by the Pico SDK function. Remember that the number of bytes (bits) in
the flash hardware id sets a limit on how many unique ids there are, even if
those are embedded (distributed) in a larger number of bytes (bits), as is the
result of the PRNG function.
The suggested code (from the boards/arm/rp2040/common/src/rp2040_uniqueid.c):
void rp2040_uniqueid_initialize(void)
{
uint8_t txbuf[RP2040_FLASH_ID_BUFFER_SIZE];
uint8_t rxbuf[RP2040_FLASH_ID_BUFFER_SIZE];
memset(g_uniqueid, 0xac, CONFIG_BOARDCTL_UNIQUEID_SIZE);
memset(txbuf, 0, RP2040_FLASH_ID_BUFFER_SIZE);
memset(rxbuf, 0, RP2040_FLASH_ID_BUFFER_SIZE);
txbuf[0] = RP2040_FLASH_RUID_CMD;
rp2040_flash_cmd(txbuf, rxbuf, RP2040_FLASH_ID_BUFFER_SIZE);
#if CONFIG_BOARDCTL_UNIQUEID_SIZE == RP2040_FLASH_ID_SIZE
for (int i = 0; i < CONFIG_BOARDCTL_UNIQUEID_SIZE; i++)
{
g_uniqueid[i] = rxbuf[i + RP2040_FLASH_ID_BUFFER_OFFSET];
}
#else
/* xorshift PRNG: */
uint64_t x;
x = *(uint64_t *)(rxbuf + RP2040_FLASH_ID_BUFFER_OFFSET);
for (int i = 0; i < CONFIG_BOARDCTL_UNIQUEID_SIZE; i++)
{
x ^= x >> 12;
x ^= x << 25;
x ^= x >> 27;
g_uniqueid[i] = (uint8_t)((x * 0x2545f4914f6cdd1dull) >> 32);
}
#endif
}
Any comments?
Anders
On Monday, 18 March 2024 at 06:51, Anders <[email protected]> wrote:
> Hello Adam
>
> Excellent! Precisely what I was looking for. I'll check it out.
>
> Thanks,
> Anders
>
> On Sunday, 17 March 2024 at 12:54, Adam Comley [email protected] wrote:
>
> > Hi Anders,
> >
> > I recently had a need for this feature as well, and put together a PR
> > based on the pico-sdk implementation. See:
> >
> > https://github.com/apache/nuttx/pull/11927
> >
> > Hope this helps.
> >
> > -- Adam