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>
This commit is contained in:
parent
8eac618cba
commit
c54f7ec1fc
4 changed files with 31 additions and 6 deletions
|
@ -21,6 +21,19 @@ No security vulnerabilities received.
|
|||
API Changes
|
||||
***********
|
||||
|
||||
* HWINFO
|
||||
|
||||
* The identifier data structure for hwinfo drivers is clarified. Drivers are
|
||||
responsible for ensuring that the identifier data structure is a sequence
|
||||
of bytes. The returned ID value is not supposed to be interpreted based on
|
||||
vendor-specific assumptions of byte order and should express the identifier
|
||||
as a raw byte sequence.
|
||||
The changes have an impact on users that use the hwinfo API to identify
|
||||
their devices.
|
||||
The sam0 driver byte swaps each 32 bit word of the 128 bit identifier to
|
||||
big endian.
|
||||
The nordic driver byte swaps the entire 64 bit word to big endian.
|
||||
|
||||
Deprecated in this release
|
||||
==========================
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include <drivers/hwinfo.h>
|
||||
#include <string.h>
|
||||
#include <hal/nrf_ficr.h>
|
||||
#include <sys/byteorder.h>
|
||||
|
||||
struct nrf_uid {
|
||||
u32_t id[2];
|
||||
|
@ -17,8 +18,8 @@ ssize_t z_impl_hwinfo_get_device_id(u8_t *buffer, size_t length)
|
|||
{
|
||||
struct nrf_uid dev_id;
|
||||
|
||||
dev_id.id[0] = nrf_ficr_deviceid_get(NRF_FICR, 0);
|
||||
dev_id.id[1] = nrf_ficr_deviceid_get(NRF_FICR, 1);
|
||||
dev_id.id[0] = sys_cpu_to_be32(nrf_ficr_deviceid_get(NRF_FICR, 1));
|
||||
dev_id.id[1] = sys_cpu_to_be32(nrf_ficr_deviceid_get(NRF_FICR, 0));
|
||||
|
||||
if (length > sizeof(dev_id.id)) {
|
||||
length = sizeof(dev_id.id);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <soc.h>
|
||||
#include <drivers/hwinfo.h>
|
||||
#include <string.h>
|
||||
#include <sys/byteorder.h>
|
||||
|
||||
struct sam0_uid {
|
||||
u32_t id[4];
|
||||
|
@ -18,10 +19,14 @@ ssize_t z_impl_hwinfo_get_device_id(u8_t *buffer, size_t length)
|
|||
{
|
||||
struct sam0_uid dev_id;
|
||||
|
||||
dev_id.id[0] = *(const u32_t *) DT_INST_REG_ADDR_BY_IDX(0, 0);
|
||||
dev_id.id[1] = *(const u32_t *) DT_INST_REG_ADDR_BY_IDX(0, 1);
|
||||
dev_id.id[2] = *(const u32_t *) DT_INST_REG_ADDR_BY_IDX(0, 2);
|
||||
dev_id.id[3] = *(const u32_t *) DT_INST_REG_ADDR_BY_IDX(0, 3);
|
||||
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);
|
||||
|
|
|
@ -37,6 +37,12 @@ extern "C" {
|
|||
* If the device ID is smaller then length, the rest of the buffer is left unchanged.
|
||||
* The ID depends on the hardware and is not guaranteed unique.
|
||||
*
|
||||
* Drivers are responsible for ensuring that the ID data structure is a
|
||||
* sequence of bytes. The returned ID value is not supposed to be interpreted
|
||||
* based on vendor-specific assumptions of byte order. It should express the
|
||||
* identifier as a raw byte sequence, doing any endian conversion necessary so
|
||||
* that a hex representation of the bytes produces the intended serial number.
|
||||
*
|
||||
* @param buffer Buffer to write the ID to.
|
||||
* @param length Max length of the buffer.
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue