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