📄 jnand_crc.c
字号:
/*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*
C R C S E R V I C E S
GENERAL DESCRIPTION
This module contains functions for calculating a checksum for the code
image programmed into NAND flash by JNAND utility
REFERENCES
CRC-30, CAI Section 6.7.1.2.2, 7.7.1.2.2, 7.7.2.2.2
EXTERNALIZED FUNCTIONS
crc_30_step - calculate a step-by-step 30-bit CRC over disjunct data.
INITIALIZATION AND SEQUENCING REQUIREMENTS
None
Copyright (c) 1990-1992 by QUALCOMM, Incorporated. All Rights Reserved.
Copyright (c) 1996-1999 by QUALCOMM, Incorporated. All Rights Reserved.
*====*====*====*====*====*====*====*====*====*====*====*====*====*====*====*/
/*===========================================================================
EDIT HISTORY FOR MODULE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
$Header: //depot/asic/MSMSHARED/tools/jnand/jnand_crc.c#1 $ $DateTime: 2003/02/06 15:47:46 $ $Author: pingguan $
when who what, where, why
-------- --- ----------------------------------------------------------
02/06/03 pg Moved from ASWP402 server to ASWP401 server.
07/04/02 drh Removed reference to crc_30_calc as we only use the step
06/19/02 drh Removed all 16 bit CRC functions not used in JNAND
11/29/01 lad Added step-wise CRC30 calculation.
04/09/99 ms Lint cleanup.
03/17/99 ms Changes for Virtual Boot Block.
Removed bb_ prefixes
Not includingbbjmpout.h
12/16/98 jct Removed 80186 support
09/28/98 jct Incorporate ARM changes
04/08/96 dna Added comment to each func. saying it is in the Boot Block
02/28/96 dna Merged crctab.c into this file for Boot Block because the
external references to the tables caused a problem.
Prepended bb_ to function and table names to move this
file into the Boot Block.
06/21/93 jah Fixed bug in crc_16_l_calc().
06/07/93 jah Added crc_16_l_calc().
04/20/93 jah Added the table for an LSB-first CCITT-16 CRC.
07/09/92 jah Changed crc_16_step() from bits to bytes
07/09/92 jah Removed CRC generation program
06/21/92 jah Created crc tables
06/18/92 jah Ported from brassboard and converted to table-driven.
===========================================================================*/
/*===========================================================================
INCLUDE FILES FOR MODULE
===========================================================================*/
#include "jnand_crc.h" /* CRC typedefs and definitions */
/*===========================================================================
DEFINITIONS AND DECLARATIONS FOR MODULE
This section contains definitions for constants, macros, types, variables
and other items needed by this module.
===========================================================================*/
/* The CRC table size is based on how many bits at a time we are going
** to process through the table. Given that we are processing the data
** 8 bits at a time, this gives us 2^8 (256) entries.
*/
#define CRC_TAB_SIZE 256 /* 2^CRC_TAB_BITS */
/* CRC table for 30 bit CRC, with generator polynomial 0x6030b9c7,
** calculated 8 bits at a time, MSB first.
*/
const dword crc30_table[ CRC_TAB_SIZE ] = {
0x00000000, 0x2030b9c7, 0x2051ca49, 0x0061738e,
0x20932d55, 0x00a39492, 0x00c2e71c, 0x20f25edb,
0x2116e36d, 0x01265aaa, 0x01472924, 0x217790e3,
0x0185ce38, 0x21b577ff, 0x21d40471, 0x01e4bdb6,
0x221d7f1d, 0x022dc6da, 0x024cb554, 0x227c0c93,
0x028e5248, 0x22beeb8f, 0x22df9801, 0x02ef21c6,
0x030b9c70, 0x233b25b7, 0x235a5639, 0x036aeffe,
0x2398b125, 0x03a808e2, 0x03c97b6c, 0x23f9c2ab,
0x240a47fd, 0x043afe3a, 0x045b8db4, 0x246b3473,
0x04996aa8, 0x24a9d36f, 0x24c8a0e1, 0x04f81926,
0x051ca490, 0x252c1d57, 0x254d6ed9, 0x057dd71e,
0x258f89c5, 0x05bf3002, 0x05de438c, 0x25eefa4b,
0x061738e0, 0x26278127, 0x2646f2a9, 0x06764b6e,
0x268415b5, 0x06b4ac72, 0x06d5dffc, 0x26e5663b,
0x2701db8d, 0x0731624a, 0x075011c4, 0x2760a803,
0x0792f6d8, 0x27a24f1f, 0x27c33c91, 0x07f38556,
0x2824363d, 0x08148ffa, 0x0875fc74, 0x284545b3,
0x08b71b68, 0x2887a2af, 0x28e6d121, 0x08d668e6,
0x0932d550, 0x29026c97, 0x29631f19, 0x0953a6de,
0x29a1f805, 0x099141c2, 0x09f0324c, 0x29c08b8b,
0x0a394920, 0x2a09f0e7, 0x2a688369, 0x0a583aae,
0x2aaa6475, 0x0a9addb2, 0x0afbae3c, 0x2acb17fb,
0x2b2faa4d, 0x0b1f138a, 0x0b7e6004, 0x2b4ed9c3,
0x0bbc8718, 0x2b8c3edf, 0x2bed4d51, 0x0bddf496,
0x0c2e71c0, 0x2c1ec807, 0x2c7fbb89, 0x0c4f024e,
0x2cbd5c95, 0x0c8de552, 0x0cec96dc, 0x2cdc2f1b,
0x2d3892ad, 0x0d082b6a, 0x0d6958e4, 0x2d59e123,
0x0dabbff8, 0x2d9b063f, 0x2dfa75b1, 0x0dcacc76,
0x2e330edd, 0x0e03b71a, 0x0e62c494, 0x2e527d53,
0x0ea02388, 0x2e909a4f, 0x2ef1e9c1, 0x0ec15006,
0x0f25edb0, 0x2f155477, 0x2f7427f9, 0x0f449e3e,
0x2fb6c0e5, 0x0f867922, 0x0fe70aac, 0x2fd7b36b,
0x3078d5bd, 0x10486c7a, 0x10291ff4, 0x3019a633,
0x10ebf8e8, 0x30db412f, 0x30ba32a1, 0x108a8b66,
0x116e36d0, 0x315e8f17, 0x313ffc99, 0x110f455e,
0x31fd1b85, 0x11cda242, 0x11acd1cc, 0x319c680b,
0x1265aaa0, 0x32551367, 0x323460e9, 0x1204d92e,
0x32f687f5, 0x12c63e32, 0x12a74dbc, 0x3297f47b,
0x337349cd, 0x1343f00a, 0x13228384, 0x33123a43,
0x13e06498, 0x33d0dd5f, 0x33b1aed1, 0x13811716,
0x14729240, 0x34422b87, 0x34235809, 0x1413e1ce,
0x34e1bf15, 0x14d106d2, 0x14b0755c, 0x3480cc9b,
0x3564712d, 0x1554c8ea, 0x1535bb64, 0x350502a3,
0x15f75c78, 0x35c7e5bf, 0x35a69631, 0x15962ff6,
0x366fed5d, 0x165f549a, 0x163e2714, 0x360e9ed3,
0x16fcc008, 0x36cc79cf, 0x36ad0a41, 0x169db386,
0x17790e30, 0x3749b7f7, 0x3728c479, 0x17187dbe,
0x37ea2365, 0x17da9aa2, 0x17bbe92c, 0x378b50eb,
0x185ce380, 0x386c5a47, 0x380d29c9, 0x183d900e,
0x38cfced5, 0x18ff7712, 0x189e049c, 0x38aebd5b,
0x394a00ed, 0x197ab92a, 0x191bcaa4, 0x392b7363,
0x19d92db8, 0x39e9947f, 0x3988e7f1, 0x19b85e36,
0x3a419c9d, 0x1a71255a, 0x1a1056d4, 0x3a20ef13,
0x1ad2b1c8, 0x3ae2080f, 0x3a837b81, 0x1ab3c246,
0x1b577ff0, 0x3b67c637, 0x3b06b5b9, 0x1b360c7e,
0x3bc452a5, 0x1bf4eb62, 0x1b9598ec, 0x3ba5212b,
0x3c56a47d, 0x1c661dba, 0x1c076e34, 0x3c37d7f3,
0x1cc58928, 0x3cf530ef, 0x3c944361, 0x1ca4faa6,
0x1d404710, 0x3d70fed7, 0x3d118d59, 0x1d21349e,
0x3dd36a45, 0x1de3d382, 0x1d82a00c, 0x3db219cb,
0x1e4bdb60, 0x3e7b62a7, 0x3e1a1129, 0x1e2aa8ee,
0x3ed8f635, 0x1ee84ff2, 0x1e893c7c, 0x3eb985bb,
0x3f5d380d, 0x1f6d81ca, 0x1f0cf244, 0x3f3c4b83,
0x1fce1558, 0x3ffeac9f, 0x3f9fdf11, 0x1faf66d6
};
/*===========================================================================
FUNCTION CRC_30_STEP
DESCRIPTION
This function calculates a 30-bit CRC over a specified number of data
bits. It can be used to produce a CRC and to check a CRC. The CRC value
passed in is used to continue the CRC calculation from a previous call,
this allows this routine to be used to CRC discontinuous data.
DEPENDENCIES
None
RETURN VALUE
Returns a double word holding 30 bits which are the contents of the
CRC register as calculated over the specified data bits. If this
function is being used to check a CRC, then the return value will be
equal to CRC_30_OK (defined in crc.h) if the CRC checks correctly.
NOTE: The caller is expected to mask the bottom 30 bits from the value,
SIDE EFFECTS
None
===========================================================================*/
dword crc_30_step
(
dword seed,
/* Either the result of a previous crc_30_step() or CRC_16_STEP_SEED
** the first time the routine is called. Note that the input is
** inverted prior to use, to counteract the inversion applied when
** it was returned as a result of the previous step.
*/
byte *buf_ptr,
/* Pointer to bytes containing the data to CRC. The bit stream starts
** in the MS bit of the first byte.
*/
word len
/* Number of data bits to calculate the CRC over */
)
{
dword data, crc_30;
/* Generate a CRC-30 by looking up the transformation in a table and
** XOR-ing it into the CRC, one byte at a time.
*/
for (crc_30 = ~seed & 0x3FFFFFFF; len >= 8; len -= 8, buf_ptr++) {
crc_30 = crc30_table[ ((crc_30 >> (30 - 8)) ^ *buf_ptr) & 0xff ]
^ (crc_30 << 8);
}
/* Finish calculating the CRC over the trailing data bits
**
** XOR the MS bit of data with the MS bit of the CRC.
** Shift the CRC and data left 1 bit.
** If the XOR result is 1, XOR the generating polynomial in with the CRC.
*/
if (len != 0) {
data = ((dword) (*buf_ptr)) << (30-8); /* Align data MSB with CRC MSB */
while (len-- != 0) {
if ( ((crc_30 ^ data) & (1L << 29)) != 0 ) { /* Is MSB of XOR a 1 */
crc_30 <<= 1; /* Left shift CRC */
crc_30 ^= CRC_30_POLYNOMIAL; /* XOR polynomial into CRC */
} else {
crc_30 <<= 1; /* Left shift CRC */
}
data <<= 1; /* Left shift data */
}
}
crc_30 = ~crc_30; /* 1's complement the CRC */
return( crc_30 & 0x3FFFFFFF ); /* mask the result to 30 bits */
} /* end of crc_30_calc */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -