|
@@ -1,289 +0,0 @@
|
|
|
-<?xml version="1.0" encoding="UTF-8"?>
|
|
|
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
|
- "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
|
-
|
|
|
-<book id="Reed-Solomon-Library-Guide">
|
|
|
- <bookinfo>
|
|
|
- <title>Reed-Solomon Library Programming Interface</title>
|
|
|
-
|
|
|
- <authorgroup>
|
|
|
- <author>
|
|
|
- <firstname>Thomas</firstname>
|
|
|
- <surname>Gleixner</surname>
|
|
|
- <affiliation>
|
|
|
- <address>
|
|
|
- <email>tglx@linutronix.de</email>
|
|
|
- </address>
|
|
|
- </affiliation>
|
|
|
- </author>
|
|
|
- </authorgroup>
|
|
|
-
|
|
|
- <copyright>
|
|
|
- <year>2004</year>
|
|
|
- <holder>Thomas Gleixner</holder>
|
|
|
- </copyright>
|
|
|
-
|
|
|
- <legalnotice>
|
|
|
- <para>
|
|
|
- This documentation is free software; you can redistribute
|
|
|
- it and/or modify it under the terms of the GNU General Public
|
|
|
- License version 2 as published by the Free Software Foundation.
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- This program is distributed in the hope that it will be
|
|
|
- useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
|
- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
- See the GNU General Public License for more details.
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- You should have received a copy of the GNU General Public
|
|
|
- License along with this program; if not, write to the Free
|
|
|
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
- MA 02111-1307 USA
|
|
|
- </para>
|
|
|
-
|
|
|
- <para>
|
|
|
- For more details see the file COPYING in the source
|
|
|
- distribution of Linux.
|
|
|
- </para>
|
|
|
- </legalnotice>
|
|
|
- </bookinfo>
|
|
|
-
|
|
|
-<toc></toc>
|
|
|
-
|
|
|
- <chapter id="intro">
|
|
|
- <title>Introduction</title>
|
|
|
- <para>
|
|
|
- The generic Reed-Solomon Library provides encoding, decoding
|
|
|
- and error correction functions.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Reed-Solomon codes are used in communication and storage
|
|
|
- applications to ensure data integrity.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- This documentation is provided for developers who want to utilize
|
|
|
- the functions provided by the library.
|
|
|
- </para>
|
|
|
- </chapter>
|
|
|
-
|
|
|
- <chapter id="bugs">
|
|
|
- <title>Known Bugs And Assumptions</title>
|
|
|
- <para>
|
|
|
- None.
|
|
|
- </para>
|
|
|
- </chapter>
|
|
|
-
|
|
|
- <chapter id="usage">
|
|
|
- <title>Usage</title>
|
|
|
- <para>
|
|
|
- This chapter provides examples of how to use the library.
|
|
|
- </para>
|
|
|
- <sect1>
|
|
|
- <title>Initializing</title>
|
|
|
- <para>
|
|
|
- The init function init_rs returns a pointer to an
|
|
|
- rs decoder structure, which holds the necessary
|
|
|
- information for encoding, decoding and error correction
|
|
|
- with the given polynomial. It either uses an existing
|
|
|
- matching decoder or creates a new one. On creation all
|
|
|
- the lookup tables for fast en/decoding are created.
|
|
|
- The function may take a while, so make sure not to
|
|
|
- call it in critical code paths.
|
|
|
- </para>
|
|
|
- <programlisting>
|
|
|
-/* the Reed Solomon control structure */
|
|
|
-static struct rs_control *rs_decoder;
|
|
|
-
|
|
|
-/* Symbolsize is 10 (bits)
|
|
|
- * Primitive polynomial is x^10+x^3+1
|
|
|
- * first consecutive root is 0
|
|
|
- * primitive element to generate roots = 1
|
|
|
- * generator polynomial degree (number of roots) = 6
|
|
|
- */
|
|
|
-rs_decoder = init_rs (10, 0x409, 0, 1, 6);
|
|
|
- </programlisting>
|
|
|
- </sect1>
|
|
|
- <sect1>
|
|
|
- <title>Encoding</title>
|
|
|
- <para>
|
|
|
- The encoder calculates the Reed-Solomon code over
|
|
|
- the given data length and stores the result in
|
|
|
- the parity buffer. Note that the parity buffer must
|
|
|
- be initialized before calling the encoder.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- The expanded data can be inverted on the fly by
|
|
|
- providing a non-zero inversion mask. The expanded data is
|
|
|
- XOR'ed with the mask. This is used e.g. for FLASH
|
|
|
- ECC, where the all 0xFF is inverted to an all 0x00.
|
|
|
- The Reed-Solomon code for all 0x00 is all 0x00. The
|
|
|
- code is inverted before storing to FLASH so it is 0xFF
|
|
|
- too. This prevents that reading from an erased FLASH
|
|
|
- results in ECC errors.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- The databytes are expanded to the given symbol size
|
|
|
- on the fly. There is no support for encoding continuous
|
|
|
- bitstreams with a symbol size != 8 at the moment. If
|
|
|
- it is necessary it should be not a big deal to implement
|
|
|
- such functionality.
|
|
|
- </para>
|
|
|
- <programlisting>
|
|
|
-/* Parity buffer. Size = number of roots */
|
|
|
-uint16_t par[6];
|
|
|
-/* Initialize the parity buffer */
|
|
|
-memset(par, 0, sizeof(par));
|
|
|
-/* Encode 512 byte in data8. Store parity in buffer par */
|
|
|
-encode_rs8 (rs_decoder, data8, 512, par, 0);
|
|
|
- </programlisting>
|
|
|
- </sect1>
|
|
|
- <sect1>
|
|
|
- <title>Decoding</title>
|
|
|
- <para>
|
|
|
- The decoder calculates the syndrome over
|
|
|
- the given data length and the received parity symbols
|
|
|
- and corrects errors in the data.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- If a syndrome is available from a hardware decoder
|
|
|
- then the syndrome calculation is skipped.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- The correction of the data buffer can be suppressed
|
|
|
- by providing a correction pattern buffer and an error
|
|
|
- location buffer to the decoder. The decoder stores the
|
|
|
- calculated error location and the correction bitmask
|
|
|
- in the given buffers. This is useful for hardware
|
|
|
- decoders which use a weird bit ordering scheme.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- The databytes are expanded to the given symbol size
|
|
|
- on the fly. There is no support for decoding continuous
|
|
|
- bitstreams with a symbolsize != 8 at the moment. If
|
|
|
- it is necessary it should be not a big deal to implement
|
|
|
- such functionality.
|
|
|
- </para>
|
|
|
-
|
|
|
- <sect2>
|
|
|
- <title>
|
|
|
- Decoding with syndrome calculation, direct data correction
|
|
|
- </title>
|
|
|
- <programlisting>
|
|
|
-/* Parity buffer. Size = number of roots */
|
|
|
-uint16_t par[6];
|
|
|
-uint8_t data[512];
|
|
|
-int numerr;
|
|
|
-/* Receive data */
|
|
|
-.....
|
|
|
-/* Receive parity */
|
|
|
-.....
|
|
|
-/* Decode 512 byte in data8.*/
|
|
|
-numerr = decode_rs8 (rs_decoder, data8, par, 512, NULL, 0, NULL, 0, NULL);
|
|
|
- </programlisting>
|
|
|
- </sect2>
|
|
|
-
|
|
|
- <sect2>
|
|
|
- <title>
|
|
|
- Decoding with syndrome given by hardware decoder, direct data correction
|
|
|
- </title>
|
|
|
- <programlisting>
|
|
|
-/* Parity buffer. Size = number of roots */
|
|
|
-uint16_t par[6], syn[6];
|
|
|
-uint8_t data[512];
|
|
|
-int numerr;
|
|
|
-/* Receive data */
|
|
|
-.....
|
|
|
-/* Receive parity */
|
|
|
-.....
|
|
|
-/* Get syndrome from hardware decoder */
|
|
|
-.....
|
|
|
-/* Decode 512 byte in data8.*/
|
|
|
-numerr = decode_rs8 (rs_decoder, data8, par, 512, syn, 0, NULL, 0, NULL);
|
|
|
- </programlisting>
|
|
|
- </sect2>
|
|
|
-
|
|
|
- <sect2>
|
|
|
- <title>
|
|
|
- Decoding with syndrome given by hardware decoder, no direct data correction.
|
|
|
- </title>
|
|
|
- <para>
|
|
|
- Note: It's not necessary to give data and received parity to the decoder.
|
|
|
- </para>
|
|
|
- <programlisting>
|
|
|
-/* Parity buffer. Size = number of roots */
|
|
|
-uint16_t par[6], syn[6], corr[8];
|
|
|
-uint8_t data[512];
|
|
|
-int numerr, errpos[8];
|
|
|
-/* Receive data */
|
|
|
-.....
|
|
|
-/* Receive parity */
|
|
|
-.....
|
|
|
-/* Get syndrome from hardware decoder */
|
|
|
-.....
|
|
|
-/* Decode 512 byte in data8.*/
|
|
|
-numerr = decode_rs8 (rs_decoder, NULL, NULL, 512, syn, 0, errpos, 0, corr);
|
|
|
-for (i = 0; i < numerr; i++) {
|
|
|
- do_error_correction_in_your_buffer(errpos[i], corr[i]);
|
|
|
-}
|
|
|
- </programlisting>
|
|
|
- </sect2>
|
|
|
- </sect1>
|
|
|
- <sect1>
|
|
|
- <title>Cleanup</title>
|
|
|
- <para>
|
|
|
- The function free_rs frees the allocated resources,
|
|
|
- if the caller is the last user of the decoder.
|
|
|
- </para>
|
|
|
- <programlisting>
|
|
|
-/* Release resources */
|
|
|
-free_rs(rs_decoder);
|
|
|
- </programlisting>
|
|
|
- </sect1>
|
|
|
-
|
|
|
- </chapter>
|
|
|
-
|
|
|
- <chapter id="structs">
|
|
|
- <title>Structures</title>
|
|
|
- <para>
|
|
|
- This chapter contains the autogenerated documentation of the structures which are
|
|
|
- used in the Reed-Solomon Library and are relevant for a developer.
|
|
|
- </para>
|
|
|
-!Iinclude/linux/rslib.h
|
|
|
- </chapter>
|
|
|
-
|
|
|
- <chapter id="pubfunctions">
|
|
|
- <title>Public Functions Provided</title>
|
|
|
- <para>
|
|
|
- This chapter contains the autogenerated documentation of the Reed-Solomon functions
|
|
|
- which are exported.
|
|
|
- </para>
|
|
|
-!Elib/reed_solomon/reed_solomon.c
|
|
|
- </chapter>
|
|
|
-
|
|
|
- <chapter id="credits">
|
|
|
- <title>Credits</title>
|
|
|
- <para>
|
|
|
- The library code for encoding and decoding was written by Phil Karn.
|
|
|
- </para>
|
|
|
- <programlisting>
|
|
|
- Copyright 2002, Phil Karn, KA9Q
|
|
|
- May be used under the terms of the GNU General Public License (GPL)
|
|
|
- </programlisting>
|
|
|
- <para>
|
|
|
- The wrapper functions and interfaces are written by Thomas Gleixner.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Many users have provided bugfixes, improvements and helping hands for testing.
|
|
|
- Thanks a lot.
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- The following people have contributed to this document:
|
|
|
- </para>
|
|
|
- <para>
|
|
|
- Thomas Gleixner<email>tglx@linutronix.de</email>
|
|
|
- </para>
|
|
|
- </chapter>
|
|
|
-</book>
|