mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Jul 08 07:45:08 2015 +0100
Revision:
584:7c5a5136e412
Synchronized with git revision a15892332f7dfbf7685582956fd7fa377aaddb51

Full URL: https://github.com/mbedmicro/mbed/commit/a15892332f7dfbf7685582956fd7fa377aaddb51/

Update mbed_overrides.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 584:7c5a5136e412 1 /**********************************************************************
mbed_official 584:7c5a5136e412 2 *
mbed_official 584:7c5a5136e412 3 * Filename: crc.c
mbed_official 584:7c5a5136e412 4 *
mbed_official 584:7c5a5136e412 5 * Description: Slow and fast implementations of the CRC standards.
mbed_official 584:7c5a5136e412 6 *
mbed_official 584:7c5a5136e412 7 * Notes: The parameters for each supported CRC standard are
mbed_official 584:7c5a5136e412 8 * defined in the header file crc.h. The implementations
mbed_official 584:7c5a5136e412 9 * here should stand up to further additions to that list.
mbed_official 584:7c5a5136e412 10 *
mbed_official 584:7c5a5136e412 11 *
mbed_official 584:7c5a5136e412 12 * Copyright (c) 2000 by Michael Barr. This software is placed into
mbed_official 584:7c5a5136e412 13 * the public domain and may be used for any purpose. However, this
mbed_official 584:7c5a5136e412 14 * notice must not be changed or removed and no warranty is either
mbed_official 584:7c5a5136e412 15 * expressed or implied by its publication or distribution.
mbed_official 584:7c5a5136e412 16 **********************************************************************/
mbed_official 584:7c5a5136e412 17
mbed_official 584:7c5a5136e412 18 #include "crc.h"
mbed_official 584:7c5a5136e412 19
mbed_official 584:7c5a5136e412 20
mbed_official 584:7c5a5136e412 21 /*
mbed_official 584:7c5a5136e412 22 * Derive parameters from the standard-specific parameters in crc.h.
mbed_official 584:7c5a5136e412 23 */
mbed_official 584:7c5a5136e412 24 #define WIDTH (8 * sizeof(crc))
mbed_official 584:7c5a5136e412 25 #define TOPBIT (1 << (WIDTH - 1))
mbed_official 584:7c5a5136e412 26
mbed_official 584:7c5a5136e412 27 #if (REFLECT_DATA == TRUE)
mbed_official 584:7c5a5136e412 28 #undef REFLECT_DATA
mbed_official 584:7c5a5136e412 29 #define REFLECT_DATA(X) ((unsigned char) reflect((X), 8))
mbed_official 584:7c5a5136e412 30 #else
mbed_official 584:7c5a5136e412 31 #undef REFLECT_DATA
mbed_official 584:7c5a5136e412 32 #define REFLECT_DATA(X) (X)
mbed_official 584:7c5a5136e412 33 #endif
mbed_official 584:7c5a5136e412 34
mbed_official 584:7c5a5136e412 35 #if (REFLECT_REMAINDER == TRUE)
mbed_official 584:7c5a5136e412 36 #undef REFLECT_REMAINDER
mbed_official 584:7c5a5136e412 37 #define REFLECT_REMAINDER(X) ((crc) reflect((X), WIDTH))
mbed_official 584:7c5a5136e412 38 #else
mbed_official 584:7c5a5136e412 39 #undef REFLECT_REMAINDER
mbed_official 584:7c5a5136e412 40 #define REFLECT_REMAINDER(X) (X)
mbed_official 584:7c5a5136e412 41 #endif
mbed_official 584:7c5a5136e412 42
mbed_official 584:7c5a5136e412 43
mbed_official 584:7c5a5136e412 44 /*********************************************************************
mbed_official 584:7c5a5136e412 45 *
mbed_official 584:7c5a5136e412 46 * Function: reflect()
mbed_official 584:7c5a5136e412 47 *
mbed_official 584:7c5a5136e412 48 * Description: Reorder the bits of a binary sequence, by reflecting
mbed_official 584:7c5a5136e412 49 * them about the middle position.
mbed_official 584:7c5a5136e412 50 *
mbed_official 584:7c5a5136e412 51 * Notes: No checking is done that nBits <= 32.
mbed_official 584:7c5a5136e412 52 *
mbed_official 584:7c5a5136e412 53 * Returns: The reflection of the original data.
mbed_official 584:7c5a5136e412 54 *
mbed_official 584:7c5a5136e412 55 *********************************************************************/
mbed_official 584:7c5a5136e412 56 static unsigned long
mbed_official 584:7c5a5136e412 57 reflect(unsigned long data, unsigned char nBits)
mbed_official 584:7c5a5136e412 58 {
mbed_official 584:7c5a5136e412 59 unsigned long reflection = 0x00000000;
mbed_official 584:7c5a5136e412 60 unsigned char bit;
mbed_official 584:7c5a5136e412 61
mbed_official 584:7c5a5136e412 62 /*
mbed_official 584:7c5a5136e412 63 * Reflect the data about the center bit.
mbed_official 584:7c5a5136e412 64 */
mbed_official 584:7c5a5136e412 65 for (bit = 0; bit < nBits; ++bit)
mbed_official 584:7c5a5136e412 66 {
mbed_official 584:7c5a5136e412 67 /*
mbed_official 584:7c5a5136e412 68 * If the LSB bit is set, set the reflection of it.
mbed_official 584:7c5a5136e412 69 */
mbed_official 584:7c5a5136e412 70 if (data & 0x01)
mbed_official 584:7c5a5136e412 71 {
mbed_official 584:7c5a5136e412 72 reflection |= (1 << ((nBits - 1) - bit));
mbed_official 584:7c5a5136e412 73 }
mbed_official 584:7c5a5136e412 74
mbed_official 584:7c5a5136e412 75 data = (data >> 1);
mbed_official 584:7c5a5136e412 76 }
mbed_official 584:7c5a5136e412 77
mbed_official 584:7c5a5136e412 78 return (reflection);
mbed_official 584:7c5a5136e412 79
mbed_official 584:7c5a5136e412 80 } /* reflect() */
mbed_official 584:7c5a5136e412 81
mbed_official 584:7c5a5136e412 82
mbed_official 584:7c5a5136e412 83 /*********************************************************************
mbed_official 584:7c5a5136e412 84 *
mbed_official 584:7c5a5136e412 85 * Function: crcSlow()
mbed_official 584:7c5a5136e412 86 *
mbed_official 584:7c5a5136e412 87 * Description: Compute the CRC of a given message.
mbed_official 584:7c5a5136e412 88 *
mbed_official 584:7c5a5136e412 89 * Notes:
mbed_official 584:7c5a5136e412 90 *
mbed_official 584:7c5a5136e412 91 * Returns: The CRC of the message.
mbed_official 584:7c5a5136e412 92 *
mbed_official 584:7c5a5136e412 93 *********************************************************************/
mbed_official 584:7c5a5136e412 94 crc
mbed_official 584:7c5a5136e412 95 crcSlow(unsigned char const message[], int nBytes)
mbed_official 584:7c5a5136e412 96 {
mbed_official 584:7c5a5136e412 97 crc remainder = INITIAL_REMAINDER;
mbed_official 584:7c5a5136e412 98 int byte;
mbed_official 584:7c5a5136e412 99 unsigned char bit;
mbed_official 584:7c5a5136e412 100
mbed_official 584:7c5a5136e412 101
mbed_official 584:7c5a5136e412 102 /*
mbed_official 584:7c5a5136e412 103 * Perform modulo-2 division, a byte at a time.
mbed_official 584:7c5a5136e412 104 */
mbed_official 584:7c5a5136e412 105 for (byte = 0; byte < nBytes; ++byte)
mbed_official 584:7c5a5136e412 106 {
mbed_official 584:7c5a5136e412 107 /*
mbed_official 584:7c5a5136e412 108 * Bring the next byte into the remainder.
mbed_official 584:7c5a5136e412 109 */
mbed_official 584:7c5a5136e412 110 remainder ^= (REFLECT_DATA(message[byte]) << (WIDTH - 8));
mbed_official 584:7c5a5136e412 111
mbed_official 584:7c5a5136e412 112 /*
mbed_official 584:7c5a5136e412 113 * Perform modulo-2 division, a bit at a time.
mbed_official 584:7c5a5136e412 114 */
mbed_official 584:7c5a5136e412 115 for (bit = 8; bit > 0; --bit)
mbed_official 584:7c5a5136e412 116 {
mbed_official 584:7c5a5136e412 117 /*
mbed_official 584:7c5a5136e412 118 * Try to divide the current data bit.
mbed_official 584:7c5a5136e412 119 */
mbed_official 584:7c5a5136e412 120 if (remainder & TOPBIT)
mbed_official 584:7c5a5136e412 121 {
mbed_official 584:7c5a5136e412 122 remainder = (remainder << 1) ^ POLYNOMIAL;
mbed_official 584:7c5a5136e412 123 }
mbed_official 584:7c5a5136e412 124 else
mbed_official 584:7c5a5136e412 125 {
mbed_official 584:7c5a5136e412 126 remainder = (remainder << 1);
mbed_official 584:7c5a5136e412 127 }
mbed_official 584:7c5a5136e412 128 }
mbed_official 584:7c5a5136e412 129 }
mbed_official 584:7c5a5136e412 130
mbed_official 584:7c5a5136e412 131 /*
mbed_official 584:7c5a5136e412 132 * The final remainder is the CRC result.
mbed_official 584:7c5a5136e412 133 */
mbed_official 584:7c5a5136e412 134 return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE);
mbed_official 584:7c5a5136e412 135
mbed_official 584:7c5a5136e412 136 } /* crcSlow() */
mbed_official 584:7c5a5136e412 137
mbed_official 584:7c5a5136e412 138
mbed_official 584:7c5a5136e412 139 crc crcTable[256];
mbed_official 584:7c5a5136e412 140
mbed_official 584:7c5a5136e412 141
mbed_official 584:7c5a5136e412 142 /*********************************************************************
mbed_official 584:7c5a5136e412 143 *
mbed_official 584:7c5a5136e412 144 * Function: crcInit()
mbed_official 584:7c5a5136e412 145 *
mbed_official 584:7c5a5136e412 146 * Description: Populate the partial CRC lookup table.
mbed_official 584:7c5a5136e412 147 *
mbed_official 584:7c5a5136e412 148 * Notes: This function must be rerun any time the CRC standard
mbed_official 584:7c5a5136e412 149 * is changed. If desired, it can be run "offline" and
mbed_official 584:7c5a5136e412 150 * the table results stored in an embedded system's ROM.
mbed_official 584:7c5a5136e412 151 *
mbed_official 584:7c5a5136e412 152 * Returns: None defined.
mbed_official 584:7c5a5136e412 153 *
mbed_official 584:7c5a5136e412 154 *********************************************************************/
mbed_official 584:7c5a5136e412 155 void
mbed_official 584:7c5a5136e412 156 crcInit(void)
mbed_official 584:7c5a5136e412 157 {
mbed_official 584:7c5a5136e412 158 crc remainder;
mbed_official 584:7c5a5136e412 159 int dividend;
mbed_official 584:7c5a5136e412 160 unsigned char bit;
mbed_official 584:7c5a5136e412 161
mbed_official 584:7c5a5136e412 162
mbed_official 584:7c5a5136e412 163 /*
mbed_official 584:7c5a5136e412 164 * Compute the remainder of each possible dividend.
mbed_official 584:7c5a5136e412 165 */
mbed_official 584:7c5a5136e412 166 for (dividend = 0; dividend < 256; ++dividend)
mbed_official 584:7c5a5136e412 167 {
mbed_official 584:7c5a5136e412 168 /*
mbed_official 584:7c5a5136e412 169 * Start with the dividend followed by zeros.
mbed_official 584:7c5a5136e412 170 */
mbed_official 584:7c5a5136e412 171 remainder = dividend << (WIDTH - 8);
mbed_official 584:7c5a5136e412 172
mbed_official 584:7c5a5136e412 173 /*
mbed_official 584:7c5a5136e412 174 * Perform modulo-2 division, a bit at a time.
mbed_official 584:7c5a5136e412 175 */
mbed_official 584:7c5a5136e412 176 for (bit = 8; bit > 0; --bit)
mbed_official 584:7c5a5136e412 177 {
mbed_official 584:7c5a5136e412 178 /*
mbed_official 584:7c5a5136e412 179 * Try to divide the current data bit.
mbed_official 584:7c5a5136e412 180 */
mbed_official 584:7c5a5136e412 181 if (remainder & TOPBIT)
mbed_official 584:7c5a5136e412 182 {
mbed_official 584:7c5a5136e412 183 remainder = (remainder << 1) ^ POLYNOMIAL;
mbed_official 584:7c5a5136e412 184 }
mbed_official 584:7c5a5136e412 185 else
mbed_official 584:7c5a5136e412 186 {
mbed_official 584:7c5a5136e412 187 remainder = (remainder << 1);
mbed_official 584:7c5a5136e412 188 }
mbed_official 584:7c5a5136e412 189 }
mbed_official 584:7c5a5136e412 190
mbed_official 584:7c5a5136e412 191 /*
mbed_official 584:7c5a5136e412 192 * Store the result into the table.
mbed_official 584:7c5a5136e412 193 */
mbed_official 584:7c5a5136e412 194 crcTable[dividend] = remainder;
mbed_official 584:7c5a5136e412 195 }
mbed_official 584:7c5a5136e412 196
mbed_official 584:7c5a5136e412 197 } /* crcInit() */
mbed_official 584:7c5a5136e412 198
mbed_official 584:7c5a5136e412 199
mbed_official 584:7c5a5136e412 200 /*********************************************************************
mbed_official 584:7c5a5136e412 201 *
mbed_official 584:7c5a5136e412 202 * Function: crcFast()
mbed_official 584:7c5a5136e412 203 *
mbed_official 584:7c5a5136e412 204 * Description: Compute the CRC of a given message.
mbed_official 584:7c5a5136e412 205 *
mbed_official 584:7c5a5136e412 206 * Notes: crcInit() must be called first.
mbed_official 584:7c5a5136e412 207 *
mbed_official 584:7c5a5136e412 208 * Returns: The CRC of the message.
mbed_official 584:7c5a5136e412 209 *
mbed_official 584:7c5a5136e412 210 *********************************************************************/
mbed_official 584:7c5a5136e412 211 crc
mbed_official 584:7c5a5136e412 212 crcFast(unsigned char const message[], int nBytes)
mbed_official 584:7c5a5136e412 213 {
mbed_official 584:7c5a5136e412 214 crc remainder = INITIAL_REMAINDER;
mbed_official 584:7c5a5136e412 215 unsigned char data;
mbed_official 584:7c5a5136e412 216 int byte;
mbed_official 584:7c5a5136e412 217
mbed_official 584:7c5a5136e412 218
mbed_official 584:7c5a5136e412 219 /*
mbed_official 584:7c5a5136e412 220 * Divide the message by the polynomial, a byte at a time.
mbed_official 584:7c5a5136e412 221 */
mbed_official 584:7c5a5136e412 222 for (byte = 0; byte < nBytes; ++byte)
mbed_official 584:7c5a5136e412 223 {
mbed_official 584:7c5a5136e412 224 data = REFLECT_DATA(message[byte]) ^ (remainder >> (WIDTH - 8));
mbed_official 584:7c5a5136e412 225 remainder = crcTable[data] ^ (remainder << 8);
mbed_official 584:7c5a5136e412 226 }
mbed_official 584:7c5a5136e412 227
mbed_official 584:7c5a5136e412 228 /*
mbed_official 584:7c5a5136e412 229 * The final remainder is the CRC.
mbed_official 584:7c5a5136e412 230 */
mbed_official 584:7c5a5136e412 231 return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE);
mbed_official 584:7c5a5136e412 232
mbed_official 584:7c5a5136e412 233 } /* crcFast() */
mbed_official 584:7c5a5136e412 234