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 <andyl...@proton.me.INVALID> 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 a...@novators.net 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

Reply via email to