summaryrefslogtreecommitdiff
path: root/usr/src/lib/libfru/libfruraw/crcmodel.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libfru/libfruraw/crcmodel.h')
-rw-r--r--usr/src/lib/libfru/libfruraw/crcmodel.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/usr/src/lib/libfru/libfruraw/crcmodel.h b/usr/src/lib/libfru/libfruraw/crcmodel.h
new file mode 100644
index 0000000000..9c30c19061
--- /dev/null
+++ b/usr/src/lib/libfru/libfruraw/crcmodel.h
@@ -0,0 +1,181 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _CRCMODEL_H
+#define _CRCMODEL_H
+
+#ifdef SOLARIS_UNIX
+#include <sys/types.h>
+#else
+typedef long uint32_t;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *
+ * Start of crcmodel.h
+ *
+ *
+ * Author : Ross Williams (ross@guest.adelaide.edu.au.).
+ * Date : 3 June 1993.
+ * Status : Public domain.
+ *
+ * Description : This is the header (.h) file for the reference
+ * implementation of the Rocksoft^tm Model CRC Algorithm. For more
+ * information on the Rocksoft^tm Model CRC Algorithm, see the document
+ * titled "A Painless Guide to CRC Error Detection Algorithms" by Ross
+ * Williams (ross@guest.adelaide.edu.au.). This document is likely to be in
+ * "ftp.adelaide.edu.au/pub/rocksoft".
+ *
+ * Note: Rocksoft is a trademark of Rocksoft Pty Ltd, Adelaide, Australia.
+ *
+ *
+ *
+ * How to Use This Package
+ * -----------------------
+ * Step 1: Declare a variable of type cm_t. Declare another variable
+ * (p_cm say) of type p_cm_t and initialize it to point to the first
+ * variable (e.g. p_cm_t p_cm = &cm_t).
+ *
+ * Step 2: Assign values to the parameter fields of the structure.
+ * If you don't know what to assign, see the document cited earlier.
+ * For example:
+ * p_cm->cm_width = 16;
+ * p_cm->cm_poly = 0x8005L;
+ * p_cm->cm_init = 0L;
+ * p_cm->cm_refin = TRUE;
+ * p_cm->cm_refot = TRUE;
+ * p_cm->cm_xorot = 0L;
+ * Note: Poly is specified without its top bit (18005 becomes 8005).
+ * Note: Width is one bit less than the raw poly width.
+ *
+ * Step 3: Initialize the instance with a call cm_ini(p_cm);
+ *
+ * Step 4: Process zero or more message bytes by placing zero or more
+ * successive calls to cm_nxt. Example: cm_nxt(p_cm,ch);
+ *
+ * Step 5: Extract the CRC value at any time by calling crc = cm_crc(p_cm);
+ * If the CRC is a 16-bit value, it will be in the bottom 16 bits.
+ *
+ *
+ *
+ * Design Notes
+ * ------------
+ * PORTABILITY: This package has been coded very conservatively so that
+ * it will run on as many machines as possible. For example, all external
+ * identifiers have been restricted to 6 characters and all internal ones to
+ * 8 characters. The prefix cm (for Crc Model) is used as an attempt to avoid
+ * namespace collisions. This package is endian independent.
+ *
+ * EFFICIENCY: This package (and its interface) is not designed for
+ * speed. The purpose of this package is to act as a well-defined reference
+ * model for the specification of CRC algorithms. If you want speed, cook up
+ * a specific table-driven implementation as described in the document cited
+ * above. This package is designed for validation only; if you have found or
+ * implemented a CRC algorithm and wish to describe it as a set of parameters
+ * to the Rocksoft^tm Model CRC Algorithm, your CRC algorithm implementation
+ * should behave identically to this package under those parameters.
+ *
+ */
+
+
+/* The following definitions are extracted from my style header file which */
+/* would be cumbersome to distribute with this package. The DONE_STYLE is the */
+/* idempotence symbol used in my style header file. */
+
+#ifndef DONE_STYLE
+
+typedef unsigned bool;
+typedef unsigned char *p_ubyte_;
+
+#ifndef TRUE
+#define FALSE 0
+#define TRUE 1
+#endif
+
+/* Change to the second definition if you don't have prototypes. */
+#define P_(A) A
+/* #define P_(A) () */
+
+/* Uncomment this definition if you don't have void. */
+/* typedef int void; */
+
+#endif
+
+/* CRC Model Abstract Type */
+/* ----------------------- */
+/* The following type stores the context of an executing instance of the */
+/* model algorithm. Most of the fields are model parameters which must be */
+/* set before the first initializing call to cm_ini. */
+typedef struct
+{
+ int cm_width; /* Parameter: Width in bits [8,32]. */
+ uint32_t cm_poly; /* Parameter: The algorithm's polynomial. */
+ uint32_t cm_init; /* Parameter: Initial register value. */
+ bool cm_refin; /* Parameter: Reflect input bytes? */
+ bool cm_refot; /* Parameter: Reflect output CRC? */
+ uint32_t cm_xorot; /* Parameter: XOR this to output CRC. */
+
+ uint32_t cm_reg; /* Context: Context during execution. */
+} cm_t;
+typedef cm_t *p_cm_t;
+
+/* Functions That Implement The Model */
+/* ---------------------------------- */
+/* The following functions animate the cm_t abstraction. */
+
+void cm_ini P_((p_cm_t p_cm));
+/* Initializes the argument CRC model instance. */
+/* All parameter fields must be set before calling this. */
+
+void cm_nxt P_((p_cm_t p_cm, int ch));
+/* Processes a single message byte [0,255]. */
+
+void cm_blk P_((p_cm_t p_cm, p_ubyte_ blk_adr, uint32_t blk_len));
+/* Processes a block of message bytes. */
+
+uint32_t cm_crc P_((p_cm_t p_cm));
+/* Returns the CRC value for the message bytes processed so far. */
+
+/* Functions For Table Calculation */
+/* ------------------------------- */
+/* The following function can be used to calculate a CRC lookup table. */
+/* It can also be used at run-time to create or check static tables. */
+
+uint32_t cm_tab P_((p_cm_t p_cm, int index));
+/* Returns the i'th entry for the lookup table for the specified algorithm. */
+/* The function examines the fields cm_width, cm_poly, cm_refin, and the */
+/* argument table index in the range [0,255] and returns the table entry in */
+/* the bottom cm_width bytes of the return value. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CRCMODEL_H */