summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhathach <[email protected]>2026-07-16 14:11:24 +0700
committerhathach <[email protected]>2026-07-17 16:48:02 +0700
commit6173d87ef13db5af42889700e5f3885b5cbc6985 (patch)
treee1b551edb6a7a21bc4f093ad7ea5f617a9faeb34
parenta3ee0b4ff12615552de50bd2a61287fdb0b11bd9 (diff)
lpc15, lpc40: board_get_unique_id via IAP ReadUID
Real 128-bit chip UID as the board serial (IAP cmd 58, status checked against IAP_CMD_SUCCESS), replacing the shared placeholder — required for HIL board identification by serial. lpc40's lpcopen Chip_IAP_ReadUID() returns only the first UID word, hence the direct iap_entry() call. Verified on ea4088_quickstart and lpcxpresso1549: both enumerate with their chip UID and are selected by it in the HIL configs.
-rw-r--r--hw/bsp/lpc15/family.c13
-rw-r--r--hw/bsp/lpc40/family.c13
2 files changed, 26 insertions, 0 deletions
diff --git a/hw/bsp/lpc15/family.c b/hw/bsp/lpc15/family.c
index bbfee1b51..5178ad68b 100644
--- a/hw/bsp/lpc15/family.c
+++ b/hw/bsp/lpc15/family.c
@@ -122,6 +122,19 @@ uint32_t board_button_read(void)
return Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN) ? 0 : 1;
}
+size_t board_get_unique_id(uint8_t id[], size_t max_len)
+{
+ // IAP ReadUID (cmd 58) returns status + 4 words = full 128-bit UID
+ unsigned int command[5] = { IAP_READ_UID_CMD, 0, 0, 0, 0 };
+ unsigned int result[5];
+ iap_entry(command, result);
+ TU_ASSERT(result[0] == IAP_CMD_SUCCESS, 0);
+
+ size_t const len = tu_min32(max_len, 16);
+ memcpy(id, &result[1], len);
+ return len;
+}
+
int board_uart_read(uint8_t* buf, int len)
{
(void) buf; (void) len;
diff --git a/hw/bsp/lpc40/family.c b/hw/bsp/lpc40/family.c
index d8a63576b..750bd2660 100644
--- a/hw/bsp/lpc40/family.c
+++ b/hw/bsp/lpc40/family.c
@@ -135,6 +135,19 @@ uint32_t board_button_read(void) {
return BUTTON_ACTIV_STATE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);
}
+size_t board_get_unique_id(uint8_t id[], size_t max_len) {
+ // IAP ReadUID (cmd 58) returns status + 4 words = full 128-bit UID
+ // (lpcopen's Chip_IAP_ReadUID() only returns the first word)
+ unsigned int command[5] = { IAP_READ_UID_CMD, 0, 0, 0, 0 };
+ unsigned int result[5];
+ iap_entry(command, result);
+ TU_ASSERT(result[0] == IAP_CMD_SUCCESS, 0);
+
+ size_t const len = tu_min32(max_len, 16);
+ memcpy(id, &result[1], len);
+ return len;
+}
+
int board_uart_read(uint8_t *buf, int len) {
//return UART_ReceiveByte(BOARD_UART_PORT);
(void) buf;