mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	Use pandoc to convert documentation to ReST by calling Documentation/sphinx/tmplcvt script. Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
		
			
				
	
	
		
			212 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
==========================================
 | 
						|
Reed-Solomon Library Programming Interface
 | 
						|
==========================================
 | 
						|
 | 
						|
:Author: Thomas Gleixner
 | 
						|
 | 
						|
Introduction
 | 
						|
============
 | 
						|
 | 
						|
The generic Reed-Solomon Library provides encoding, decoding and error
 | 
						|
correction functions.
 | 
						|
 | 
						|
Reed-Solomon codes are used in communication and storage applications to
 | 
						|
ensure data integrity.
 | 
						|
 | 
						|
This documentation is provided for developers who want to utilize the
 | 
						|
functions provided by the library.
 | 
						|
 | 
						|
Known Bugs And Assumptions
 | 
						|
==========================
 | 
						|
 | 
						|
None.
 | 
						|
 | 
						|
Usage
 | 
						|
=====
 | 
						|
 | 
						|
This chapter provides examples of how to use the library.
 | 
						|
 | 
						|
Initializing
 | 
						|
------------
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* 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);
 | 
						|
 | 
						|
 | 
						|
Encoding
 | 
						|
--------
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* 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);
 | 
						|
 | 
						|
 | 
						|
Decoding
 | 
						|
--------
 | 
						|
 | 
						|
The decoder calculates the syndrome over the given data length and the
 | 
						|
received parity symbols and corrects errors in the data.
 | 
						|
 | 
						|
If a syndrome is available from a hardware decoder then the syndrome
 | 
						|
calculation is skipped.
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
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.
 | 
						|
 | 
						|
Decoding with syndrome calculation, direct data correction
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* 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);
 | 
						|
 | 
						|
 | 
						|
Decoding with syndrome given by hardware decoder, direct data correction
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* 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);
 | 
						|
 | 
						|
 | 
						|
Decoding with syndrome given by hardware decoder, no direct data correction.
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Note: It's not necessary to give data and received parity to the
 | 
						|
decoder.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* 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]);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
Cleanup
 | 
						|
-------
 | 
						|
 | 
						|
The function free_rs frees the allocated resources, if the caller is
 | 
						|
the last user of the decoder.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    /* Release resources */
 | 
						|
    free_rs(rs_decoder);
 | 
						|
 | 
						|
 | 
						|
Structures
 | 
						|
==========
 | 
						|
 | 
						|
This chapter contains the autogenerated documentation of the structures
 | 
						|
which are used in the Reed-Solomon Library and are relevant for a
 | 
						|
developer.
 | 
						|
 | 
						|
.. kernel-doc:: include/linux/rslib.h
 | 
						|
   :internal:
 | 
						|
 | 
						|
Public Functions Provided
 | 
						|
=========================
 | 
						|
 | 
						|
This chapter contains the autogenerated documentation of the
 | 
						|
Reed-Solomon functions which are exported.
 | 
						|
 | 
						|
.. kernel-doc:: lib/reed_solomon/reed_solomon.c
 | 
						|
   :export:
 | 
						|
 | 
						|
Credits
 | 
						|
=======
 | 
						|
 | 
						|
The library code for encoding and decoding was written by Phil Karn.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
            Copyright 2002, Phil Karn, KA9Q
 | 
						|
            May be used under the terms of the GNU General Public License (GPL)
 | 
						|
 | 
						|
 | 
						|
The wrapper functions and interfaces are written by Thomas Gleixner.
 | 
						|
 | 
						|
Many users have provided bugfixes, improvements and helping hands for
 | 
						|
testing. Thanks a lot.
 | 
						|
 | 
						|
The following people have contributed to this document:
 | 
						|
 | 
						|
Thomas Gleixner\ tglx@linutronix.de
 |