| <?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> |