1 /* Based on "File Verification Using CRC" by Mark R. Nelson in Dr. Dobbs'
2 * Journal, May 1992, pp. 64-67. This algorithm generates the same CRC
3 * values as ZMODEM and PKZIP
5 * Copyright (C) 2002-2005 SBE, Inc.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #include <linux/types.h>
19 #include "pmcc4_sysdep.h"
20 #include "sbecom_inline_linux.h"
21 #include "sbe_promformat.h"
24 #define CRC32_POLYNOMIAL 0xEDB88320L
25 #define CRC_TABLE_ENTRIES 256
29 static u_int32_t crcTableInit
;
31 #ifdef STATIC_CRC_TABLE
32 static u_int32_t CRCTable
[CRC_TABLE_ENTRIES
];
37 /***************************************************************************
39 * genCrcTable - fills in CRCTable, as used by sbeCrc()
44 ***************************************************************************/
47 genCrcTable(u_int32_t
*CRCTable
)
52 for (ii
= 0; ii
< CRC_TABLE_ENTRIES
; ii
++) {
54 for (jj
= 8; jj
> 0; jj
--) {
56 crc
= (crc
>> 1) ^ CRC32_POLYNOMIAL
;
67 /***************************************************************************
69 * sbeCrc - generates a CRC on a given buffer, and initial CRC
71 * This routine calculates the CRC for a buffer of data using the
72 * table lookup method. It accepts an original value for the crc,
73 * and returns the updated value. This permits "catenation" of
74 * discontiguous buffers. An original value of 0 for the "first"
77 * Based on "File Verification Using CRC" by Mark R. Nelson in Dr. Dobb's
78 * Journal, May 1992, pp. 64-67. This algorithm generates the same CRC
79 * values as ZMODEM and PKZIP.
81 * RETURNS: calculated crc of block
86 sbeCrc(u_int8_t
*buffer
, /* data buffer to crc */
87 u_int32_t count
, /* length of block in bytes */
88 u_int32_t initialCrc
, /* starting CRC */
91 u_int32_t
*tbl
= NULL
;
92 u_int32_t temp1
, temp2
, crc
;
95 * if table not yet created, do so. Don't care about "extra" time
96 * checking this every time sbeCrc() is called, since CRC calculations
97 * are already time consuming
100 #ifdef STATIC_CRC_TABLE
104 tbl
= (u_int32_t
*) OS_kmalloc(CRC_TABLE_ENTRIES
* sizeof(u_int32_t
));
106 *result
= 0; /* dummy up return value due to malloc
113 /* inverting bits makes ZMODEM & PKZIP compatible */
114 crc
= initialCrc
^ 0xFFFFFFFFL
;
116 while (count
-- != 0) {
117 temp1
= (crc
>> 8) & 0x00FFFFFFL
;
118 temp2
= tbl
[((int) crc
^ *buffer
++) & 0xff];
126 #ifndef STATIC_CRC_TABLE
132 /*** End-of-File ***/