 58235413b2
			
		
	
	
	58235413b2
	
	
	
		
			
			librs docbook typo fixes. Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			289 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
	
		
			8 KiB
			
		
	
	
	
		
			XML
		
	
	
	
	
	
| <?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>
 |