267 lines
5.1 KiB
C
267 lines
5.1 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
/* os shim includes */
|
|
#include "os_types.h"
|
|
#include "os_mem.h"
|
|
|
|
/* common includes */
|
|
#include "iot_bitops.h"
|
|
|
|
uint32_t iot_bitmap_ffs(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret = iot_bitops_ffs(bm[i]);
|
|
if (ret)
|
|
break;
|
|
}
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_fls(uint8_t *bm, uint16_t size)
|
|
{
|
|
int32_t i;
|
|
uint32_t ret = 0;
|
|
|
|
for (i = size - 1; i >= 0; i--) {
|
|
ret = iot_bitops_fls(bm[i]);
|
|
if (ret)
|
|
break;
|
|
}
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_ffs_and_c(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret = iot_bitops_ffs(bm[i]);
|
|
if (ret) {
|
|
/* clear the bit to 0 */
|
|
bm[i] &= ~(1 << (ret - 1));
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_ffs_from(uint8_t *bm, uint16_t size, uint32_t sp)
|
|
{
|
|
uint32_t i, sp_byte, sp_bit, ret = 0;
|
|
|
|
sp--;
|
|
sp_byte = sp >> 3;
|
|
sp_bit = sp & 0x7;
|
|
if (sp_byte >= size) {
|
|
sp_byte = 0;
|
|
sp_bit = 0;
|
|
}
|
|
if (sp_bit) {
|
|
for (i = sp_bit; i < 8; i++) {
|
|
if (bm[sp_byte] & (1 << i)) {
|
|
ret = i + 1;
|
|
i = sp_byte;
|
|
goto done;
|
|
}
|
|
}
|
|
sp_byte++;
|
|
sp_bit = 0;
|
|
}
|
|
|
|
for (i = sp_byte; i < size; i++) {
|
|
ret = iot_bitops_ffs(bm[i]);
|
|
if (ret) {
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
/* wrap around and start from 0 again */
|
|
for (i = 0; i < sp_byte; i++) {
|
|
ret = iot_bitops_ffs(bm[i]);
|
|
if (ret) {
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
done:
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_ffz(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret = iot_bitops_ffz(bm[i]);
|
|
if (ret)
|
|
break;
|
|
}
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_ffz_from(uint8_t *bm, uint16_t size, uint32_t sp)
|
|
{
|
|
uint32_t i, sp_byte, sp_bit, ret = 0;
|
|
|
|
sp--;
|
|
sp_byte = sp >> 3;
|
|
sp_bit = sp & 0x7;
|
|
if (sp_byte >= size) {
|
|
sp_byte = 0;
|
|
sp_bit = 0;
|
|
}
|
|
if (sp_bit) {
|
|
for (i = sp_bit; i < 8; i++) {
|
|
if (!(bm[sp_byte] & (1 << i))) {
|
|
ret = i + 1;
|
|
i = sp_byte;
|
|
goto done;
|
|
}
|
|
}
|
|
sp_byte++;
|
|
sp_bit = 0;
|
|
}
|
|
|
|
for (i = sp_byte; i < size; i++) {
|
|
ret = iot_bitops_ffz(bm[i]);
|
|
if (ret) {
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
/* wrap around and start from 0 again */
|
|
for (i = 0; i < sp_byte; i++) {
|
|
ret = iot_bitops_ffz(bm[i]);
|
|
if (ret) {
|
|
goto done;
|
|
}
|
|
}
|
|
|
|
done:
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_ffz_and_s(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret = iot_bitops_ffz(bm[i]);
|
|
if (ret) {
|
|
/* set the bit to 1 */
|
|
bm[i] |= (1 << (ret - 1));
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (ret)
|
|
ret += i << 3;
|
|
|
|
return ret;
|
|
}
|
|
|
|
void iot_bitmap_set(uint8_t *bm, uint16_t size, uint32_t bit)
|
|
{
|
|
uint32_t idx;
|
|
|
|
bit--;
|
|
idx = bit >> 3;
|
|
if (idx < size) {
|
|
bm[idx] |= (1 << (bit & 0x7));
|
|
}
|
|
}
|
|
|
|
bool_t iot_bitmap_is_set(uint8_t *bm, uint16_t size, uint32_t bit)
|
|
{
|
|
uint32_t idx;
|
|
|
|
bit--;
|
|
idx = bit >> 3;
|
|
if (idx < size) {
|
|
return !!(bm[idx] & (1 << (bit & 0x7)));
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void iot_bitmap_clear(uint8_t *bm, uint16_t size, uint32_t bit)
|
|
{
|
|
uint32_t idx;
|
|
|
|
bit--;
|
|
idx = bit >> 3;
|
|
if (idx < size) {
|
|
bm[idx] &= ~(1 << (bit & 0x7));
|
|
}
|
|
}
|
|
|
|
void iot_bitmap_reverse(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
bm[i] = ~bm[i];
|
|
}
|
|
}
|
|
|
|
uint32_t iot_bitmap_cbs(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret += iot_bitops_cbs(bm[i]);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t iot_bitmap_cbz(uint8_t *bm, uint16_t size)
|
|
{
|
|
uint32_t i, ret = 0;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
ret += iot_bitops_cbz(bm[i]);
|
|
}
|
|
|
|
return ret;
|
|
}
|