diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /Documentation/DocBook/librs.tmpl |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'Documentation/DocBook/librs.tmpl')
-rw-r--r-- | Documentation/DocBook/librs.tmpl | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/Documentation/DocBook/librs.tmpl b/Documentation/DocBook/librs.tmpl new file mode 100644 index 000000000000..3ff39bafc00e --- /dev/null +++ b/Documentation/DocBook/librs.tmpl | |||
@@ -0,0 +1,289 @@ | |||
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 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 a | ||
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) | ||
101 | * Primitve polynomial is x^10+x^3+1 | ||
102 | * first consecutive root is 0 | ||
103 | * primitve element to generate roots = 1 | ||
104 | * generator polinomial degree (number of roots) = 6 | ||
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 | ||
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 prevent's 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 */ | ||
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> | ||
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> | ||