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