/* --------------- Eight bit word Hamming encoding ------------ */ unsigned short Hamming8(unsigned short cmd_data) { unsigned short d[8], hmg[5]; unsigned short hamming; int i; for(i=0; i<=7; i++){ // get each individual bit d[i] = cmd_data >> i; d[i] &= 0x0001u; } /* build Hamming bits */ hmg[0] = d[0]^d[1]^d[2]^d[3]; hmg[1] = d[0]^d[4]^d[5]^d[6]; hmg[2] = d[1]^d[2]^d[4]^d[5]^d[7]; hmg[3] = d[1]^d[3]^d[4]^d[6]^d[7]; hmg[4] = hmg[0]^hmg[1]^hmg[2]^hmg[3]^d[0]^d[1]^d[2]^d[3]^d[4]^d[5]^d[6]^d[7]; /* build Hamming word */ hamming = hmg[0] | (hmg[1]<<1) |(hmg[2]<<2) |(hmg[3]<<3) |(hmg[4]<<4); return hamming; } /* --------------- Thirty two bit word Hamming encoding ------------ */ unsigned short Hamming32(unsigned long addressed_data) { unsigned short d[32], hmg[7]; unsigned short hamming; int i; for(i=0; i<=31; i++){ // get each individual bit d[i] = (unsigned short) (addressed_data >> i); d[i] &= 0x0001u; } /* build Hamming bits */ hmg[0] = d[0]^d[1]^d[2]^d[3]^d[4]^d[5]; hmg[1] = d[6]^d[7]^d[8]^d[9]^d[10]^d[11]^d[12]^d[13]^d[14]^d[15]^d[16] ^d[17]^d[18]^d[19]^d[20]; hmg[2] = d[6]^d[7]^d[8]^d[9]^d[10]^d[11]^d[12]^d[13]^d[21]^d[22]^d[23] ^d[24]^d[25]^d[26]^d[27]; hmg[3] = d[0]^d[1]^d[2]^d[6]^d[7]^d[8]^d[9]^d[14]^d[15]^d[16]^d[17] ^d[21]^d[22]^d[23]^d[24]^d[28]^d[29]^d[30]; hmg[4] = d[0]^d[3]^d[4]^d[6]^d[7]^d[10]^d[11]^d[14]^d[15]^d[18]^d[19] ^d[21]^d[22]^d[25]^d[26]^d[28]^d[29]^d[31]; hmg[5] = d[1]^d[3]^d[5]^d[6]^d[8]^d[10]^d[12]^d[14]^d[16]^d[18]^d[20] ^d[21]^d[23]^d[25]^d[27]^d[28]^d[30]^d[31]; hmg[6] = hmg[0]^hmg[1]^hmg[2]^hmg[3]^hmg[4]^hmg[5]^d[0]^d[1]^d[2]^d[3] ^d[4]^d[5]^d[6]^d[7]^d[8]^d[9]^d[10]^d[11]^d[12]^d[13]^d[14] ^d[15]^d[16]^d[17]^d[18]^d[19]^d[20]^d[21]^d[22]^d[23]^d[24] ^d[25]^d[26]^d[27]^d[28]^d[29]^d[30]^d[31]; /* build Hamming word */ hamming = (hmg[0] | (hmg[1]<<1) | (hmg[2]<<2) | (hmg[3]<<3) | (hmg[4]<<4) | (hmg[5]<<5) | (hmg[6]<<6)); return hamming; }