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.
targets/hal/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_MCU_K64F/TARGET_FRDM/crc.c@584:7c5a5136e412, 2015-07-08 (annotated)
- 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?
User | Revision | Line number | New 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 |