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