mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Generated v2 prefixes
This commit is contained in:
		
							
								
								
									
										220
									
								
								lfs2_util.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								lfs2_util.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,220 @@ | ||||
| /* | ||||
|  * lfs2 utility functions | ||||
|  * | ||||
|  * Copyright (c) 2017, Arm Limited. All rights reserved. | ||||
|  * SPDX-License-Identifier: BSD-3-Clause | ||||
|  */ | ||||
| #ifndef LFS2_UTIL_H | ||||
| #define LFS2_UTIL_H | ||||
|  | ||||
| // Users can override lfs2_util.h with their own configuration by defining | ||||
| // LFS2_CONFIG as a header file to include (-DLFS2_CONFIG=lfs2_config.h). | ||||
| // | ||||
| // If LFS2_CONFIG is used, none of the default utils will be emitted and must be | ||||
| // provided by the config file. To start, I would suggest copying lfs2_util.h | ||||
| // and modifying as needed. | ||||
| #ifdef LFS2_CONFIG | ||||
| #define LFS2_STRINGIZE(x) LFS2_STRINGIZE2(x) | ||||
| #define LFS2_STRINGIZE2(x) #x | ||||
| #include LFS2_STRINGIZE(LFS2_CONFIG) | ||||
| #else | ||||
|  | ||||
| // System includes | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include <string.h> | ||||
| #include <inttypes.h> | ||||
|  | ||||
| #ifndef LFS2_NO_MALLOC | ||||
| #include <stdlib.h> | ||||
| #endif | ||||
| #ifndef LFS2_NO_ASSERT | ||||
| #include <assert.h> | ||||
| #endif | ||||
| #if !defined(LFS2_NO_DEBUG) || !defined(LFS2_NO_WARN) || !defined(LFS2_NO_ERROR) | ||||
| #include <stdio.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| // Macros, may be replaced by system specific wrappers. Arguments to these | ||||
| // macros must not have side-effects as the macros can be removed for a smaller | ||||
| // code footprint | ||||
|  | ||||
| // Logging functions | ||||
| #ifndef LFS2_NO_DEBUG | ||||
| #define LFS2_DEBUG(fmt, ...) \ | ||||
|     printf("lfs2 debug:%d: " fmt "\n", __LINE__, __VA_ARGS__) | ||||
| #else | ||||
| #define LFS2_DEBUG(fmt, ...) | ||||
| #endif | ||||
|  | ||||
| #ifndef LFS2_NO_WARN | ||||
| #define LFS2_WARN(fmt, ...) \ | ||||
|     printf("lfs2 warn:%d: " fmt "\n", __LINE__, __VA_ARGS__) | ||||
| #else | ||||
| #define LFS2_WARN(fmt, ...) | ||||
| #endif | ||||
|  | ||||
| #ifndef LFS2_NO_ERROR | ||||
| #define LFS2_ERROR(fmt, ...) \ | ||||
|     printf("lfs2 error:%d: " fmt "\n", __LINE__, __VA_ARGS__) | ||||
| #else | ||||
| #define LFS2_ERROR(fmt, ...) | ||||
| #endif | ||||
|  | ||||
| // Runtime assertions | ||||
| #ifndef LFS2_NO_ASSERT | ||||
| #define LFS2_ASSERT(test) assert(test) | ||||
| #else | ||||
| #define LFS2_ASSERT(test) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| // Builtin functions, these may be replaced by more efficient | ||||
| // toolchain-specific implementations. LFS2_NO_INTRINSICS falls back to a more | ||||
| // expensive basic C implementation for debugging purposes | ||||
|  | ||||
| // Min/max functions for unsigned 32-bit numbers | ||||
| static inline uint32_t lfs2_max(uint32_t a, uint32_t b) { | ||||
|     return (a > b) ? a : b; | ||||
| } | ||||
|  | ||||
| static inline uint32_t lfs2_min(uint32_t a, uint32_t b) { | ||||
|     return (a < b) ? a : b; | ||||
| } | ||||
|  | ||||
| // Align to nearest multiple of a size | ||||
| static inline uint32_t lfs2_aligndown(uint32_t a, uint32_t alignment) { | ||||
|     return a - (a % alignment); | ||||
| } | ||||
|  | ||||
| static inline uint32_t lfs2_alignup(uint32_t a, uint32_t alignment) { | ||||
|     return lfs2_aligndown(a + alignment-1, alignment); | ||||
| } | ||||
|  | ||||
| // Find the next smallest power of 2 less than or equal to a | ||||
| static inline uint32_t lfs2_npw2(uint32_t a) { | ||||
| #if !defined(LFS2_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) | ||||
|     return 32 - __builtin_clz(a-1); | ||||
| #else | ||||
|     uint32_t r = 0; | ||||
|     uint32_t s; | ||||
|     a -= 1; | ||||
|     s = (a > 0xffff) << 4; a >>= s; r |= s; | ||||
|     s = (a > 0xff  ) << 3; a >>= s; r |= s; | ||||
|     s = (a > 0xf   ) << 2; a >>= s; r |= s; | ||||
|     s = (a > 0x3   ) << 1; a >>= s; r |= s; | ||||
|     return (r | (a >> 1)) + 1; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Count the number of trailing binary zeros in a | ||||
| // lfs2_ctz(0) may be undefined | ||||
| static inline uint32_t lfs2_ctz(uint32_t a) { | ||||
| #if !defined(LFS2_NO_INTRINSICS) && defined(__GNUC__) | ||||
|     return __builtin_ctz(a); | ||||
| #else | ||||
|     return lfs2_npw2((a & -a) + 1) - 1; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Count the number of binary ones in a | ||||
| static inline uint32_t lfs2_popc(uint32_t a) { | ||||
| #if !defined(LFS2_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) | ||||
|     return __builtin_popcount(a); | ||||
| #else | ||||
|     a = a - ((a >> 1) & 0x55555555); | ||||
|     a = (a & 0x33333333) + ((a >> 2) & 0x33333333); | ||||
|     return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Find the sequence comparison of a and b, this is the distance | ||||
| // between a and b ignoring overflow | ||||
| static inline int lfs2_scmp(uint32_t a, uint32_t b) { | ||||
|     return (int)(unsigned)(a - b); | ||||
| } | ||||
|  | ||||
| // Convert between 32-bit little-endian and native order | ||||
| static inline uint32_t lfs2_fromle32(uint32_t a) { | ||||
| #if !defined(LFS2_NO_INTRINSICS) && ( \ | ||||
|     (defined(  BYTE_ORDER  ) &&   BYTE_ORDER   ==   ORDER_LITTLE_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER  ) && __BYTE_ORDER   == __ORDER_LITTLE_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) | ||||
|     return a; | ||||
| #elif !defined(LFS2_NO_INTRINSICS) && ( \ | ||||
|     (defined(  BYTE_ORDER  ) &&   BYTE_ORDER   ==   ORDER_BIG_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER  ) && __BYTE_ORDER   == __ORDER_BIG_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) | ||||
|     return __builtin_bswap32(a); | ||||
| #else | ||||
|     return (((uint8_t*)&a)[0] <<  0) | | ||||
|            (((uint8_t*)&a)[1] <<  8) | | ||||
|            (((uint8_t*)&a)[2] << 16) | | ||||
|            (((uint8_t*)&a)[3] << 24); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline uint32_t lfs2_tole32(uint32_t a) { | ||||
|     return lfs2_fromle32(a); | ||||
| } | ||||
|  | ||||
| // Convert between 32-bit big-endian and native order | ||||
| static inline uint32_t lfs2_frombe32(uint32_t a) { | ||||
| #if !defined(LFS2_NO_INTRINSICS) && ( \ | ||||
|     (defined(  BYTE_ORDER  ) &&   BYTE_ORDER   ==   ORDER_LITTLE_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER  ) && __BYTE_ORDER   == __ORDER_LITTLE_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) | ||||
|     return __builtin_bswap32(a); | ||||
| #elif !defined(LFS2_NO_INTRINSICS) && ( \ | ||||
|     (defined(  BYTE_ORDER  ) &&   BYTE_ORDER   ==   ORDER_BIG_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER  ) && __BYTE_ORDER   == __ORDER_BIG_ENDIAN  ) || \ | ||||
|     (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) | ||||
|     return a; | ||||
| #else | ||||
|     return (((uint8_t*)&a)[0] << 24) | | ||||
|            (((uint8_t*)&a)[1] << 16) | | ||||
|            (((uint8_t*)&a)[2] <<  8) | | ||||
|            (((uint8_t*)&a)[3] <<  0); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| static inline uint32_t lfs2_tobe32(uint32_t a) { | ||||
|     return lfs2_frombe32(a); | ||||
| } | ||||
|  | ||||
| // Calculate CRC-32 with polynomial = 0x04c11db7 | ||||
| uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size); | ||||
|  | ||||
| // Allocate memory, only used if buffers are not provided to littlefs | ||||
| // Note, memory must be 64-bit aligned | ||||
| static inline void *lfs2_malloc(size_t size) { | ||||
| #ifndef LFS2_NO_MALLOC | ||||
|     return malloc(size); | ||||
| #else | ||||
|     (void)size; | ||||
|     return NULL; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // Deallocate memory, only used if buffers are not provided to littlefs | ||||
| static inline void lfs2_free(void *p) { | ||||
| #ifndef LFS2_NO_MALLOC | ||||
|     free(p); | ||||
| #else | ||||
|     (void)p; | ||||
| #endif | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user