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