Browse Source

mimxrt: Refactor the reading of the machine id.

The ID is read in a single function and used for:
- machine.unique_id()
- Ethernet MAC addresses.
- ...

That facilitates use of other MCU using a different access method for
the ID (e.g. i.MX RT1176).
pull/8051/head
robert-hh 3 years ago
parent
commit
74e8db0ed1
  1. 5
      ports/mimxrt/modmachine.c
  2. 18
      ports/mimxrt/mphalport.c
  3. 1
      ports/mimxrt/mphalport.h

5
ports/mimxrt/modmachine.c

@ -37,7 +37,6 @@
#include "pin.h" #include "pin.h"
#include "modmachine.h" #include "modmachine.h"
#include "fsl_clock.h" #include "fsl_clock.h"
#include "fsl_ocotp.h"
#include "fsl_wdog.h" #include "fsl_wdog.h"
#include CPU_HEADER_H #include CPU_HEADER_H
@ -52,9 +51,7 @@ typedef enum {
STATIC mp_obj_t machine_unique_id(void) { STATIC mp_obj_t machine_unique_id(void) {
unsigned char id[8]; unsigned char id[8];
OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk)); mp_hal_get_unique_id(id);
*(uint32_t *)&id[0] = OCOTP->CFG0;
*(uint32_t *)&id[4] = OCOTP->CFG1;
return mp_obj_new_bytes(id, sizeof(id)); return mp_obj_new_bytes(id, sizeof(id));
} }
MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id); MP_DEFINE_CONST_FUN_OBJ_0(machine_unique_id_obj, machine_unique_id);

18
ports/mimxrt/mphalport.c

@ -123,13 +123,25 @@ uint64_t mp_hal_time_ns(void) {
/*******************************************************************************/ /*******************************************************************************/
// MAC address // MAC address
void mp_hal_get_unique_id(uint8_t id[]) {
OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk));
*(uint32_t *)&id[0] = OCOTP->CFG0;
*(uint32_t *)&id[4] = OCOTP->CFG1;
}
// Generate a random locally administered MAC address (LAA) // Generate a random locally administered MAC address (LAA)
void mp_hal_generate_laa_mac(int idx, uint8_t buf[6]) { void mp_hal_generate_laa_mac(int idx, uint8_t buf[6]) {
// Take the MAC addr from the OTP's Configuration and Manufacturing Info // Take the MAC addr from the OTP's Configuration and Manufacturing Info
OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk)); unsigned char id[8];
mp_hal_get_unique_id(id);
uint32_t pt1 = *(uint32_t *)&id[0];
uint32_t pt2 = *(uint32_t *)&id[4];
buf[0] = 0x02; // Locally Administered MAC buf[0] = 0x02; // Locally Administered MAC
*(uint32_t *)&buf[1] = OCOTP->CFG0 ^ (OCOTP->CFG0 >> 8); *(uint32_t *)&buf[1] = pt1 ^ (pt1 >> 8);
*(uint16_t *)&buf[4] = (uint16_t)(OCOTP->CFG1 ^ (OCOTP->CFG1 >> 16)); *(uint16_t *)&buf[4] = (uint16_t)(pt2 ^ pt2 >> 16);
buf[5] ^= (uint8_t)idx;
} }
// A board can override this if needed // A board can override this if needed

1
ports/mimxrt/mphalport.h

@ -103,5 +103,6 @@ enum {
void mp_hal_generate_laa_mac(int idx, uint8_t buf[6]); void mp_hal_generate_laa_mac(int idx, uint8_t buf[6]);
void mp_hal_get_mac(int idx, uint8_t buf[6]); void mp_hal_get_mac(int idx, uint8_t buf[6]);
void mp_hal_get_mac_ascii(int idx, size_t chr_off, size_t chr_len, char *dest); void mp_hal_get_mac_ascii(int idx, size_t chr_off, size_t chr_len, char *dest);
void mp_hal_get_unique_id(uint8_t id[]);
#endif // MICROPY_INCLUDED_MIMXRT_MPHALPORT_H #endif // MICROPY_INCLUDED_MIMXRT_MPHALPORT_H

Loading…
Cancel
Save