zephyr/drivers/hwinfo/hwinfo_sam0.c
Steven Slupsky c54f7ec1fc drivers: hwinfo: fix endianness for sam0 and nrf
HWINFO drivers should be responsible for ensuring that
the data structure is a sequence of bytes. That is not
what the current sam0 and nordic drivers do. The drivers
read the data as u32_t and then memcpy the data to a
buffer. This ensures the data has the endianness of the
underlying MCU, which in this case is Cortex M0 which
is little endian.

This commit fixes the endianness so the data can be
interpreted as a "left to right sequence of bytes".

This commit updates the API doc to provide clarification
of the data structure.
Add to 2.3 release notes.

Fixes #23444, #24103

Signed-off-by: Steven Slupsky <sslupsky@gmail.com>
2020-04-09 19:30:32 +02:00

39 lines
846 B
C

/*
* Copyright (c) 2019 ML!PA Consulting GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#define DT_DRV_COMPAT atmel_sam0_id
#include <soc.h>
#include <drivers/hwinfo.h>
#include <string.h>
#include <sys/byteorder.h>
struct sam0_uid {
u32_t id[4];
};
ssize_t z_impl_hwinfo_get_device_id(u8_t *buffer, size_t length)
{
struct sam0_uid dev_id;
dev_id.id[0] = sys_cpu_to_be32(*(const u32_t *)
DT_INST_REG_ADDR_BY_IDX(0, 0));
dev_id.id[1] = sys_cpu_to_be32(*(const u32_t *)
DT_INST_REG_ADDR_BY_IDX(0, 1));
dev_id.id[2] = sys_cpu_to_be32(*(const u32_t *)
DT_INST_REG_ADDR_BY_IDX(0, 2));
dev_id.id[3] = sys_cpu_to_be32(*(const u32_t *)
DT_INST_REG_ADDR_BY_IDX(0, 3));
if (length > sizeof(dev_id.id)) {
length = sizeof(dev_id.id);
}
memcpy(buffer, dev_id.id, length);
return length;
}