90 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.7 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. | ||
|  | 
 | ||
|  | ****************************************************************************/ | ||
|  | 
 | ||
|  | #include "os_types.h"
 | ||
|  | 
 | ||
|  | #define BIG_LITTLE_ENDIAN_SWAP16(a)  ((((uint16_t)(a) & 0xff00) >> 8) | \
 | ||
|  |                                       (((uint16_t)(a) & 0x00ff) << 8)) | ||
|  | 
 | ||
|  | #define BIG_LITTLE_ENDIAN_SWAP32(a)  ((((uint32_t)(a) & 0xff000000) >> 24)| \
 | ||
|  |                                       (((uint32_t)(a) & 0x00ff0000) >> 8) | \ | ||
|  |                                       (((uint32_t)(a) & 0x0000ff00) << 8) | \ | ||
|  |                                       (((uint32_t)(a) & 0x000000ff) << 24)) | ||
|  | 
 | ||
|  | #define LITTLE_ENDIAN              0
 | ||
|  | #define BIG_ENDIAN                 1
 | ||
|  | #define UNKNOWN_ENDIAN             0xffffffff
 | ||
|  | 
 | ||
|  | static uint32_t g_cpu_endian = UNKNOWN_ENDIAN; | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * check_cpu_endian() - check cpu's endianess | ||
|  |  * return: | ||
|  |         - 1 bigendian | ||
|  |         - 0 little endian | ||
|  |  */ | ||
|  | static uint32_t inline check_cpu_endian() | ||
|  | { | ||
|  |     union{ | ||
|  |         uint32_t i; | ||
|  |         uint8_t s[4]; | ||
|  |     }c; | ||
|  | 
 | ||
|  |     c.i = 0x12345678; | ||
|  |     return (0x12 == c.s[0]); | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_htonl(uint32_t h) | ||
|  | { | ||
|  |     if(g_cpu_endian == UNKNOWN_ENDIAN){ | ||
|  |         g_cpu_endian = check_cpu_endian(); | ||
|  |     } | ||
|  |     return (g_cpu_endian == BIG_ENDIAN)? h : BIG_LITTLE_ENDIAN_SWAP32(h); | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t iot_ntohl(uint32_t n) | ||
|  | { | ||
|  |     if(g_cpu_endian == UNKNOWN_ENDIAN){ | ||
|  |         g_cpu_endian = check_cpu_endian(); | ||
|  |     } | ||
|  |     return (g_cpu_endian == BIG_ENDIAN) ? n : BIG_LITTLE_ENDIAN_SWAP32(n); | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t iot_htons(uint16_t h) | ||
|  | { | ||
|  |     if(g_cpu_endian == UNKNOWN_ENDIAN){ | ||
|  |         g_cpu_endian = check_cpu_endian(); | ||
|  |     } | ||
|  |     return (g_cpu_endian == BIG_ENDIAN) ? h : BIG_LITTLE_ENDIAN_SWAP16(h); | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t iot_ntohs(uint16_t n) | ||
|  | { | ||
|  |     if(g_cpu_endian == UNKNOWN_ENDIAN){ | ||
|  |         g_cpu_endian = check_cpu_endian(); | ||
|  |     } | ||
|  |     return (g_cpu_endian == BIG_ENDIAN) ? n : BIG_LITTLE_ENDIAN_SWAP16(n); | ||
|  | } | ||
|  | 
 | ||
|  | uint64_t iot_htonll(uint64_t h) | ||
|  | { | ||
|  |     return (((uint64_t) iot_htonl((uint32_t)h)) << 32) + iot_htonl(h >> 32); | ||
|  | } | ||
|  | 
 | ||
|  | uint64_t iot_ntohll(uint64_t n) | ||
|  | { | ||
|  |     return (((uint64_t) iot_ntohl((uint32_t)n)) << 32) + iot_ntohl(n >> 32); | ||
|  | } |