Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 82 | This chapter provides examples of how to use the library. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | </para> |
| 84 | <sect1> |
| 85 | <title>Initializing</title> |
| 86 | <para> |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 87 | The init function init_rs returns a pointer to an |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
| 98 | static struct rs_control *rs_decoder; |
| 99 | |
| 100 | /* Symbolsize is 10 (bits) |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 101 | * Primitive polynomial is x^10+x^3+1 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 102 | * first consecutive root is 0 |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 103 | * primitive element to generate roots = 1 |
| 104 | * generator polynomial degree (number of roots) = 6 |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 105 | */ |
| 106 | rs_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 |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 119 | providing a non-zero inversion mask. The expanded data is |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 124 | too. This prevents that reading from an erased FLASH |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 */ |
| 136 | uint16_t par[6]; |
| 137 | /* Initialize the parity buffer */ |
| 138 | memset(par, 0, sizeof(par)); |
| 139 | /* Encode 512 byte in data8. Store parity in buffer par */ |
| 140 | encode_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 */ |
| 176 | uint16_t par[6]; |
| 177 | uint8_t data[512]; |
| 178 | int numerr; |
| 179 | /* Receive data */ |
| 180 | ..... |
| 181 | /* Receive parity */ |
| 182 | ..... |
| 183 | /* Decode 512 byte in data8.*/ |
| 184 | numerr = 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 */ |
| 194 | uint16_t par[6], syn[6]; |
| 195 | uint8_t data[512]; |
| 196 | int numerr; |
| 197 | /* Receive data */ |
| 198 | ..... |
| 199 | /* Receive parity */ |
| 200 | ..... |
| 201 | /* Get syndrome from hardware decoder */ |
| 202 | ..... |
| 203 | /* Decode 512 byte in data8.*/ |
| 204 | numerr = 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 */ |
| 217 | uint16_t par[6], syn[6], corr[8]; |
| 218 | uint8_t data[512]; |
| 219 | int numerr, errpos[8]; |
| 220 | /* Receive data */ |
| 221 | ..... |
| 222 | /* Receive parity */ |
| 223 | ..... |
| 224 | /* Get syndrome from hardware decoder */ |
| 225 | ..... |
| 226 | /* Decode 512 byte in data8.*/ |
| 227 | numerr = decode_rs8 (rs_decoder, NULL, NULL, 512, syn, 0, errpos, 0, corr); |
| 228 | for (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 */ |
| 242 | free_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> |
Randy Dunlap | 5823541 | 2007-05-08 00:31:53 -0700 | [diff] [blame] | 276 | The wrapper functions and interfaces are written by Thomas Gleixner. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> |