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;
 | 
						|
}
 |