1 /*!
2 * \file utilities.h
3 *
4 * \brief Helper functions implementation
5 *
6 * \copyright Revised BSD License, see section \ref LICENSE.
7 *
8 * \code
9 * ______ _
10 * / _____) _ | |
11 * ( (____ _____ ____ _| |_ _____ ____| |__
12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
13 * _____) ) ____| | | || |_| ____( (___| | | |
14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
15 * (C)2013-2017 Semtech
16 *
17 * \endcode
18 *
19 * \author Miguel Luis ( Semtech )
20 *
21 * \author Gregory Cristian ( Semtech )
22 */
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include "utilities.h"
26
27 /*!
28 * Redefinition of rand() and srand() standard C functions.
29 * These functions are redefined in order to get the same behavior across
30 * different compiler toolchains implementations.
31 */
32 // Standard random functions redefinition start
33 #define RAND_LOCAL_MAX 2147483647L
34
35 static uint32_t next = 1;
36
rand1(void)37 int32_t rand1( void )
38 {
39 return ( ( next = next * 1103515245L + 12345L ) % RAND_LOCAL_MAX );
40 }
41
srand1(uint32_t seed)42 void srand1( uint32_t seed )
43 {
44 next = seed;
45 }
46 // Standard random functions redefinition end
47
randr(int32_t min,int32_t max)48 int32_t randr( int32_t min, int32_t max )
49 {
50 return ( int32_t )rand1( ) % ( max - min + 1 ) + min;
51 }
52
memcpy1(uint8_t * dst,const uint8_t * src,uint16_t size)53 void memcpy1( uint8_t *dst, const uint8_t *src, uint16_t size )
54 {
55 while( size-- )
56 {
57 *dst++ = *src++;
58 }
59 }
60
memcpyr(uint8_t * dst,const uint8_t * src,uint16_t size)61 void memcpyr( uint8_t *dst, const uint8_t *src, uint16_t size )
62 {
63 dst = dst + ( size - 1 );
64 while( size-- )
65 {
66 *dst-- = *src++;
67 }
68 }
69
memset1(uint8_t * dst,uint8_t value,uint16_t size)70 void memset1( uint8_t *dst, uint8_t value, uint16_t size )
71 {
72 while( size-- )
73 {
74 *dst++ = value;
75 }
76 }
77
Nibble2HexChar(uint8_t a)78 int8_t Nibble2HexChar( uint8_t a )
79 {
80 if( a < 10 )
81 {
82 return '0' + a;
83 }
84 else if( a < 16 )
85 {
86 return 'A' + ( a - 10 );
87 }
88 else
89 {
90 return '?';
91 }
92 }
93
Crc32(uint8_t * buffer,uint16_t length)94 uint32_t Crc32( uint8_t *buffer, uint16_t length )
95 {
96 // The CRC calculation follows CCITT - 0x04C11DB7
97 const uint32_t reversedPolynom = 0xEDB88320;
98
99 // CRC initial value
100 uint32_t crc = 0xFFFFFFFF;
101
102 if( buffer == NULL )
103 {
104 return 0;
105 }
106
107 for( uint16_t i = 0; i < length; ++i )
108 {
109 crc ^= ( uint32_t )buffer[i];
110 for( uint16_t j = 0; j < 8; j++ )
111 {
112 crc = ( crc >> 1 ) ^ ( reversedPolynom & ~( ( crc & 0x01 ) - 1 ) );
113 }
114 }
115
116 return ~crc;
117 }
118
Crc32Init(void)119 uint32_t Crc32Init( void )
120 {
121 return 0xFFFFFFFF;
122 }
123
Crc32Update(uint32_t crcInit,uint8_t * buffer,uint16_t length)124 uint32_t Crc32Update( uint32_t crcInit, uint8_t *buffer, uint16_t length )
125 {
126 // The CRC calculation follows CCITT - 0x04C11DB7
127 const uint32_t reversedPolynom = 0xEDB88320;
128
129 // CRC initial value
130 uint32_t crc = crcInit;
131
132 if( buffer == NULL )
133 {
134 return 0;
135 }
136
137 for( uint16_t i = 0; i < length; ++i )
138 {
139 crc ^= ( uint32_t )buffer[i];
140 for( uint16_t j = 0; j < 8; j++ )
141 {
142 crc = ( crc >> 1 ) ^ ( reversedPolynom & ~( ( crc & 0x01 ) - 1 ) );
143 }
144 }
145 return crc;
146 }
147
Crc32Finalize(uint32_t crc)148 uint32_t Crc32Finalize( uint32_t crc )
149 {
150 return ~crc;
151 }
152