1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 3 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> 4 5<book id="Reed-Solomon-Library-Guide"> 6 <bookinfo> 7 <title>Reed-Solomon Library Programming Interface</title> 8 9 <authorgroup> 10 <author> 11 <firstname>Thomas</firstname> 12 <surname>Gleixner</surname> 13 <affiliation> 14 <address> 15 <email>tglx@linutronix.de</email> 16 </address> 17 </affiliation> 18 </author> 19 </authorgroup> 20 21 <copyright> 22 <year>2004</year> 23 <holder>Thomas Gleixner</holder> 24 </copyright> 25 26 <legalnotice> 27 <para> 28 This documentation is free software; you can redistribute 29 it and/or modify it under the terms of the GNU General Public 30 License version 2 as published by the Free Software Foundation. 31 </para> 32 33 <para> 34 This program is distributed in the hope that it will be 35 useful, but WITHOUT ANY WARRANTY; without even the implied 36 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 37 See the GNU General Public License for more details. 38 </para> 39 40 <para> 41 You should have received a copy of the GNU General Public 42 License along with this program; if not, write to the Free 43 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 44 MA 02111-1307 USA 45 </para> 46 47 <para> 48 For more details see the file COPYING in the source 49 distribution of Linux. 50 </para> 51 </legalnotice> 52 </bookinfo> 53 54<toc></toc> 55 56 <chapter id="intro"> 57 <title>Introduction</title> 58 <para> 59 The generic Reed-Solomon Library provides encoding, decoding 60 and error correction functions. 61 </para> 62 <para> 63 Reed-Solomon codes are used in communication and storage 64 applications to ensure data integrity. 65 </para> 66 <para> 67 This documentation is provided for developers who want to utilize 68 the functions provided by the library. 69 </para> 70 </chapter> 71 72 <chapter id="bugs"> 73 <title>Known Bugs And Assumptions</title> 74 <para> 75 None. 76 </para> 77 </chapter> 78 79 <chapter id="usage"> 80 <title>Usage</title> 81 <para> 82 This chapter provides examples of how to use the library. 83 </para> 84 <sect1> 85 <title>Initializing</title> 86 <para> 87 The init function init_rs returns a pointer to an 88 rs decoder structure, which holds the necessary 89 information for encoding, decoding and error correction 90 with the given polynomial. It either uses an existing 91 matching decoder or creates a new one. On creation all 92 the lookup tables for fast en/decoding are created. 93 The function may take a while, so make sure not to 94 call it in critical code paths. 95 </para> 96 <programlisting> 97/* the Reed Solomon control structure */ 98static struct rs_control *rs_decoder; 99 100/* Symbolsize is 10 (bits) 101 * Primitive polynomial is x^10+x^3+1 102 * first consecutive root is 0 103 * primitive element to generate roots = 1 104 * generator polynomial degree (number of roots) = 6 105 */ 106rs_decoder = init_rs (10, 0x409, 0, 1, 6); 107 </programlisting> 108 </sect1> 109 <sect1> 110 <title>Encoding</title> 111 <para> 112 The encoder calculates the Reed-Solomon code over 113 the given data length and stores the result in 114 the parity buffer. Note that the parity buffer must 115 be initialized before calling the encoder. 116 </para> 117 <para> 118 The expanded data can be inverted on the fly by 119 providing a non-zero inversion mask. The expanded data is 120 XOR'ed with the mask. This is used e.g. for FLASH 121 ECC, where the all 0xFF is inverted to an all 0x00. 122 The Reed-Solomon code for all 0x00 is all 0x00. The 123 code is inverted before storing to FLASH so it is 0xFF 124 too. This prevents that reading from an erased FLASH 125 results in ECC errors. 126 </para> 127 <para> 128 The databytes are expanded to the given symbol size 129 on the fly. There is no support for encoding continuous 130 bitstreams with a symbol size != 8 at the moment. If 131 it is necessary it should be not a big deal to implement 132 such functionality. 133 </para> 134 <programlisting> 135/* Parity buffer. Size = number of roots */ 136uint16_t par[6]; 137/* Initialize the parity buffer */ 138memset(par, 0, sizeof(par)); 139/* Encode 512 byte in data8. Store parity in buffer par */ 140encode_rs8 (rs_decoder, data8, 512, par, 0); 141 </programlisting> 142 </sect1> 143 <sect1> 144 <title>Decoding</title> 145 <para> 146 The decoder calculates the syndrome over 147 the given data length and the received parity symbols 148 and corrects errors in the data. 149 </para> 150 <para> 151 If a syndrome is available from a hardware decoder 152 then the syndrome calculation is skipped. 153 </para> 154 <para> 155 The correction of the data buffer can be suppressed 156 by providing a correction pattern buffer and an error 157 location buffer to the decoder. The decoder stores the 158 calculated error location and the correction bitmask 159 in the given buffers. This is useful for hardware 160 decoders which use a weird bit ordering scheme. 161 </para> 162 <para> 163 The databytes are expanded to the given symbol size 164 on the fly. There is no support for decoding continuous 165 bitstreams with a symbolsize != 8 at the moment. If 166 it is necessary it should be not a big deal to implement 167 such functionality. 168 </para> 169 170 <sect2> 171 <title> 172 Decoding with syndrome calculation, direct data correction 173 </title> 174 <programlisting> 175/* Parity buffer. Size = number of roots */ 176uint16_t par[6]; 177uint8_t data[512]; 178int numerr; 179/* Receive data */ 180..... 181/* Receive parity */ 182..... 183/* Decode 512 byte in data8.*/ 184numerr = decode_rs8 (rs_decoder, data8, par, 512, NULL, 0, NULL, 0, NULL); 185 </programlisting> 186 </sect2> 187 188 <sect2> 189 <title> 190 Decoding with syndrome given by hardware decoder, direct data correction 191 </title> 192 <programlisting> 193/* Parity buffer. Size = number of roots */ 194uint16_t par[6], syn[6]; 195uint8_t data[512]; 196int numerr; 197/* Receive data */ 198..... 199/* Receive parity */ 200..... 201/* Get syndrome from hardware decoder */ 202..... 203/* Decode 512 byte in data8.*/ 204numerr = decode_rs8 (rs_decoder, data8, par, 512, syn, 0, NULL, 0, NULL); 205 </programlisting> 206 </sect2> 207 208 <sect2> 209 <title> 210 Decoding with syndrome given by hardware decoder, no direct data correction. 211 </title> 212 <para> 213 Note: It's not necessary to give data and received parity to the decoder. 214 </para> 215 <programlisting> 216/* Parity buffer. Size = number of roots */ 217uint16_t par[6], syn[6], corr[8]; 218uint8_t data[512]; 219int numerr, errpos[8]; 220/* Receive data */ 221..... 222/* Receive parity */ 223..... 224/* Get syndrome from hardware decoder */ 225..... 226/* Decode 512 byte in data8.*/ 227numerr = decode_rs8 (rs_decoder, NULL, NULL, 512, syn, 0, errpos, 0, corr); 228for (i = 0; i < numerr; i++) { 229 do_error_correction_in_your_buffer(errpos[i], corr[i]); 230} 231 </programlisting> 232 </sect2> 233 </sect1> 234 <sect1> 235 <title>Cleanup</title> 236 <para> 237 The function free_rs frees the allocated resources, 238 if the caller is the last user of the decoder. 239 </para> 240 <programlisting> 241/* Release resources */ 242free_rs(rs_decoder); 243 </programlisting> 244 </sect1> 245 246 </chapter> 247 248 <chapter id="structs"> 249 <title>Structures</title> 250 <para> 251 This chapter contains the autogenerated documentation of the structures which are 252 used in the Reed-Solomon Library and are relevant for a developer. 253 </para> 254!Iinclude/linux/rslib.h 255 </chapter> 256 257 <chapter id="pubfunctions"> 258 <title>Public Functions Provided</title> 259 <para> 260 This chapter contains the autogenerated documentation of the Reed-Solomon functions 261 which are exported. 262 </para> 263!Elib/reed_solomon/reed_solomon.c 264 </chapter> 265 266 <chapter id="credits"> 267 <title>Credits</title> 268 <para> 269 The library code for encoding and decoding was written by Phil Karn. 270 </para> 271 <programlisting> 272 Copyright 2002, Phil Karn, KA9Q 273 May be used under the terms of the GNU General Public License (GPL) 274 </programlisting> 275 <para> 276 The wrapper functions and interfaces are written by Thomas Gleixner. 277 </para> 278 <para> 279 Many users have provided bugfixes, improvements and helping hands for testing. 280 Thanks a lot. 281 </para> 282 <para> 283 The following people have contributed to this document: 284 </para> 285 <para> 286 Thomas Gleixner<email>tglx@linutronix.de</email> 287 </para> 288 </chapter> 289</book> 290