blob: 9f9f76fae6b7368f9aee9e8567f7222d78d2f1c4 [file] [log] [blame]
/*
* Copyright (c) 2016 Nordic Semiconductor ASA
* Copyright (c) 2016 Vinayak Kariappa Chettimada
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/types.h>
#include <drivers/entropy.h>
#include "util.h"
/**
* @brief Population count: Count the number of bits set to 1
* @details
* TODO: Faster methods available at [1].
* [1] http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
*
* @param octets Data to count over
* @param octets_len Must not be bigger than 255/8 = 31 bytes
*
* @return popcnt of 'octets'
*/
u8_t util_ones_count_get(u8_t *octets, u8_t octets_len)
{
u8_t one_count = 0U;
while (octets_len--) {
u8_t bite;
bite = *octets;
while (bite) {
bite &= (bite - 1);
one_count++;
}
octets++;
}
return one_count;
}
int util_rand(void *buf, size_t len)
{
static struct device *dev;
if (unlikely(!dev)) {
/* Only one entropy device exists, so this is safe even
* if the whole operation isn't atomic.
*/
dev = device_get_binding(CONFIG_ENTROPY_NAME);
__ASSERT((dev != NULL),
"Device driver for %s (CONFIG_ENTROPY_NAME) not found. "
"Check your build configuration!",
CONFIG_ENTROPY_NAME);
}
return entropy_get_entropy(dev, (u8_t *)buf, len);
}