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