A simple CRC library used to verify configuration data
Fork of CRC by
crc.cpp@1:ec8513f94d23, 2013-05-14 (annotated)
- Committer:
- sam_grove
- Date:
- Tue May 14 22:14:09 2013 +0000
- Revision:
- 1:ec8513f94d23
- Parent:
- 0:28e16d33040f
- Child:
- 2:53b7db1f47ea
untested but just formatted
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove | 0:28e16d33040f | 1 | |
sam_grove | 0:28e16d33040f | 2 | #define CRC32_POLYNOMIAL 0xEDB88320L |
sam_grove | 0:28e16d33040f | 3 | |
sam_grove | 0:28e16d33040f | 4 | void CRC32Value(unsigned long &CRC, unsigned char c) |
sam_grove | 0:28e16d33040f | 5 | { |
sam_grove | 0:28e16d33040f | 6 | ///////////////////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 7 | //CRC must be initialized as zero |
sam_grove | 0:28e16d33040f | 8 | //c is a character from the sequence that is used to form the CRC |
sam_grove | 0:28e16d33040f | 9 | //this code is a modification of the code from the Novatel OEM615 specification |
sam_grove | 0:28e16d33040f | 10 | ///////////////////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 11 | unsigned long ulTemp1 = ( CRC >> 8 ) & 0x00FFFFFFL; |
sam_grove | 0:28e16d33040f | 12 | unsigned long ulCRC = ((int) CRC ^ c ) & 0xff ; |
sam_grove | 0:28e16d33040f | 13 | for (int j = 8 ; j > 0; j-- ) |
sam_grove | 0:28e16d33040f | 14 | { |
sam_grove | 0:28e16d33040f | 15 | if ( ulCRC & 1 ) |
sam_grove | 1:ec8513f94d23 | 16 | { |
sam_grove | 0:28e16d33040f | 17 | ulCRC = ( ulCRC >> 1 ) ^ CRC32_POLYNOMIAL; |
sam_grove | 1:ec8513f94d23 | 18 | } |
sam_grove | 0:28e16d33040f | 19 | else |
sam_grove | 1:ec8513f94d23 | 20 | { |
sam_grove | 0:28e16d33040f | 21 | ulCRC >>= 1; |
sam_grove | 1:ec8513f94d23 | 22 | } |
sam_grove | 0:28e16d33040f | 23 | } |
sam_grove | 0:28e16d33040f | 24 | CRC = ulTemp1 ^ ulCRC; |
sam_grove | 0:28e16d33040f | 25 | } |
sam_grove | 0:28e16d33040f | 26 | |
sam_grove | 0:28e16d33040f | 27 | /* -------------------------------------------------------------------------- |
sam_grove | 0:28e16d33040f | 28 | Calculates the CRC-32 of a block of data all at once |
sam_grove | 0:28e16d33040f | 29 | //the CRC is from the complete message (header plus data) |
sam_grove | 0:28e16d33040f | 30 | //but excluding (of course) the CRC at the end |
sam_grove | 0:28e16d33040f | 31 | -------------------------------------------------------------------------- */ |
sam_grove | 0:28e16d33040f | 32 | unsigned long CalculateBlockCRC32( |
sam_grove | 0:28e16d33040f | 33 | unsigned long ulCount, /* Number of bytes in the data block */ |
sam_grove | 0:28e16d33040f | 34 | unsigned char *ucBuffer ) /* Data block */ |
sam_grove | 0:28e16d33040f | 35 | { |
sam_grove | 0:28e16d33040f | 36 | ////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 37 | //the below code tests the CRC32Value procedure used in a markov form |
sam_grove | 0:28e16d33040f | 38 | ////////////////////////////////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 39 | unsigned long CRC = 0; |
sam_grove | 1:ec8513f94d23 | 40 | for (int i = 0; i<ulCount; i++) |
sam_grove | 1:ec8513f94d23 | 41 | { |
sam_grove | 1:ec8513f94d23 | 42 | CRC32Value( CRC, *ucBuffer++ ); |
sam_grove | 1:ec8513f94d23 | 43 | } |
sam_grove | 0:28e16d33040f | 44 | return CRC; |
sam_grove | 0:28e16d33040f | 45 | } |
sam_grove | 0:28e16d33040f | 46 | |
sam_grove | 0:28e16d33040f | 47 | /* |
sam_grove | 0:28e16d33040f | 48 | unsigned long CalculateBlockCRC32( |
sam_grove | 0:28e16d33040f | 49 | unsigned long ulCount, |
sam_grove | 0:28e16d33040f | 50 | unsigned char *ucBuffer ) |
sam_grove | 0:28e16d33040f | 51 | { |
sam_grove | 0:28e16d33040f | 52 | //////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 53 | //original code from the OEM615 manual |
sam_grove | 0:28e16d33040f | 54 | //////////////////////////////////////////// |
sam_grove | 0:28e16d33040f | 55 | unsigned long ulTemp1; |
sam_grove | 0:28e16d33040f | 56 | unsigned long ulTemp2; |
sam_grove | 0:28e16d33040f | 57 | unsigned long ulCRC = 0; |
sam_grove | 0:28e16d33040f | 58 | while ( ulCount-- != 0 ) |
sam_grove | 0:28e16d33040f | 59 | { |
sam_grove | 0:28e16d33040f | 60 | ulTemp1 = ( ulCRC >> 8 ) & 0x00FFFFFFL; |
sam_grove | 0:28e16d33040f | 61 | ulTemp2 = CRC32Value( ((int) ulCRC ^ *ucBuffer++ ) & 0xff ); |
sam_grove | 0:28e16d33040f | 62 | ulCRC = ulTemp1 ^ ulTemp2; |
sam_grove | 0:28e16d33040f | 63 | } |
sam_grove | 0:28e16d33040f | 64 | return( ulCRC ); |
sam_grove | 0:28e16d33040f | 65 | } |
sam_grove | 0:28e16d33040f | 66 | */ |