blob: 94f21361e0edaa2778cfa4e8b1e4b5ab2cc0d1cf [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001<?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 Dunlap58235412007-05-08 00:31:53 -070082 This chapter provides examples of how to use the library.
Linus Torvalds1da177e2005-04-16 15:20:36 -070083 </para>
84 <sect1>
85 <title>Initializing</title>
86 <para>
Randy Dunlap58235412007-05-08 00:31:53 -070087 The init function init_rs returns a pointer to an
Linus Torvalds1da177e2005-04-16 15:20:36 -070088 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)
Randy Dunlap58235412007-05-08 00:31:53 -0700101 * Primitive polynomial is x^10+x^3+1
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102 * first consecutive root is 0
Randy Dunlap58235412007-05-08 00:31:53 -0700103 * primitive element to generate roots = 1
104 * generator polynomial degree (number of roots) = 6
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105 */
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
Randy Dunlap58235412007-05-08 00:31:53 -0700119 providing a non-zero inversion mask. The expanded data is
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 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 Dunlap58235412007-05-08 00:31:53 -0700124 too. This prevents that reading from an erased FLASH
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125 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 &lt; 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>
Randy Dunlap58235412007-05-08 00:31:53 -0700276 The wrapper functions and interfaces are written by Thomas Gleixner.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700277 </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>