1*638691a0SAndroid Build Coastguard Worker /* The guts of the Reed-Solomon encoder, meant to be #included 2*638691a0SAndroid Build Coastguard Worker * into a function body with the following typedefs, macros and variables supplied 3*638691a0SAndroid Build Coastguard Worker * according to the code parameters: 4*638691a0SAndroid Build Coastguard Worker 5*638691a0SAndroid Build Coastguard Worker * data_t - a typedef for the data symbol 6*638691a0SAndroid Build Coastguard Worker * data_t data[] - array of NN-NROOTS-PAD and type data_t to be encoded 7*638691a0SAndroid Build Coastguard Worker * data_t parity[] - an array of NROOTS and type data_t to be written with parity symbols 8*638691a0SAndroid Build Coastguard Worker * NROOTS - the number of roots in the RS code generator polynomial, 9*638691a0SAndroid Build Coastguard Worker * which is the same as the number of parity symbols in a block. 10*638691a0SAndroid Build Coastguard Worker Integer variable or literal. 11*638691a0SAndroid Build Coastguard Worker * 12*638691a0SAndroid Build Coastguard Worker * NN - the total number of symbols in a RS block. Integer variable or literal. 13*638691a0SAndroid Build Coastguard Worker * PAD - the number of pad symbols in a block. Integer variable or literal. 14*638691a0SAndroid Build Coastguard Worker * ALPHA_TO - The address of an array of NN elements to convert Galois field 15*638691a0SAndroid Build Coastguard Worker * elements in index (log) form to polynomial form. Read only. 16*638691a0SAndroid Build Coastguard Worker * INDEX_OF - The address of an array of NN elements to convert Galois field 17*638691a0SAndroid Build Coastguard Worker * elements in polynomial form to index (log) form. Read only. 18*638691a0SAndroid Build Coastguard Worker * MODNN - a function to reduce its argument modulo NN. May be inline or a macro. 19*638691a0SAndroid Build Coastguard Worker * GENPOLY - an array of NROOTS+1 elements containing the generator polynomial in index form 20*638691a0SAndroid Build Coastguard Worker 21*638691a0SAndroid Build Coastguard Worker * The memset() and memmove() functions are used. The appropriate header 22*638691a0SAndroid Build Coastguard Worker * file declaring these functions (usually <string.h>) must be included by the calling 23*638691a0SAndroid Build Coastguard Worker * program. 24*638691a0SAndroid Build Coastguard Worker 25*638691a0SAndroid Build Coastguard Worker * Copyright 2004, Phil Karn, KA9Q 26*638691a0SAndroid Build Coastguard Worker * May be used under the terms of the GNU Lesser General Public License (LGPL) 27*638691a0SAndroid Build Coastguard Worker */ 28*638691a0SAndroid Build Coastguard Worker 29*638691a0SAndroid Build Coastguard Worker 30*638691a0SAndroid Build Coastguard Worker #undef A0 31*638691a0SAndroid Build Coastguard Worker #define A0 (NN) /* Special reserved value encoding zero in index form */ 32*638691a0SAndroid Build Coastguard Worker 33*638691a0SAndroid Build Coastguard Worker { 34*638691a0SAndroid Build Coastguard Worker int i, j; 35*638691a0SAndroid Build Coastguard Worker data_t feedback; 36*638691a0SAndroid Build Coastguard Worker 37*638691a0SAndroid Build Coastguard Worker memset(parity,0,NROOTS*sizeof(data_t)); 38*638691a0SAndroid Build Coastguard Worker 39*638691a0SAndroid Build Coastguard Worker for(i=0;i<NN-NROOTS-PAD;i++){ 40*638691a0SAndroid Build Coastguard Worker feedback = INDEX_OF[data[i] ^ parity[0]]; 41*638691a0SAndroid Build Coastguard Worker if(feedback != A0){ /* feedback term is non-zero */ 42*638691a0SAndroid Build Coastguard Worker #ifdef UNNORMALIZED 43*638691a0SAndroid Build Coastguard Worker /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must 44*638691a0SAndroid Build Coastguard Worker * always be for the polynomials constructed by init_rs() 45*638691a0SAndroid Build Coastguard Worker */ 46*638691a0SAndroid Build Coastguard Worker feedback = MODNN(NN - GENPOLY[NROOTS] + feedback); 47*638691a0SAndroid Build Coastguard Worker #endif 48*638691a0SAndroid Build Coastguard Worker for(j=1;j<NROOTS;j++) 49*638691a0SAndroid Build Coastguard Worker parity[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])]; 50*638691a0SAndroid Build Coastguard Worker } 51*638691a0SAndroid Build Coastguard Worker /* Shift */ 52*638691a0SAndroid Build Coastguard Worker memmove(&parity[0],&parity[1],sizeof(data_t)*(NROOTS-1)); 53*638691a0SAndroid Build Coastguard Worker if(feedback != A0) 54*638691a0SAndroid Build Coastguard Worker parity[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])]; 55*638691a0SAndroid Build Coastguard Worker else 56*638691a0SAndroid Build Coastguard Worker parity[NROOTS-1] = 0; 57*638691a0SAndroid Build Coastguard Worker } 58*638691a0SAndroid Build Coastguard Worker } 59