/* Based on Texas Instrument's C# GenECC application (sourceforge.net/projects/dvflashutils) */ unsigned int nand_calculate_ecc(unsigned char *buf) { unsigned short odd_result = 0, even_result = 0; unsigned char bit_parities = 0; unsigned char byte_parities[SECTOR_SIZE]; int i; unsigned char val; for (i = 0; i < SECTOR_SIZE; i++) bit_parities ^= buf[i]; even_result |= ((calc_bitwise_parity(bit_parities, EVEN_HALF) << 2) | (calc_bitwise_parity(bit_parities, EVEN_FOURTH) << 1) | (calc_bitwise_parity(bit_parities, EVEN_EIGHTH) << 0)); odd_result |= ((calc_bitwise_parity(bit_parities, ODD_HALF) << 2) | (calc_bitwise_parity(bit_parities, ODD_FOURTH) << 1) | (calc_bitwise_parity(bit_parities, ODD_EIGHTH) << 0)); for (i = 0; i < SECTOR_SIZE; i++) byte_parities[i] = calc_bitwise_parity(buf[i], EVEN_WHOLE); for (i = 0; i < LOG2(SECTOR_SIZE); i++) { val = 0; val = calc_row_parity_bits(byte_parities, 1, 1 << i); even_result |= (val << (3 + i)); val = calc_row_parity_bits(byte_parities, 0, 1 << i); odd_result |= (val << (3 + i)); } return (odd_result << 16) | even_result; }
/* * Based on Texas Instrument's C# GenECC application * (sourceforge.net/projects/dvflashutils) */ static unsigned int nand_calculate_ecc(unsigned char *buf, unsigned int sector_size) { unsigned short odd_result = 0, even_result = 0; unsigned char bit_parities = 0; int i; unsigned char val; unsigned char *byte_parities = malloc(sector_size); if (!byte_parities) return -ENOMEM; for (i = 0; i < sector_size; i++) bit_parities ^= buf[i]; even_result |= ((calc_bitwise_parity(bit_parities, EVEN_HALF) << 2) | (calc_bitwise_parity(bit_parities, EVEN_FOURTH) << 1) | (calc_bitwise_parity(bit_parities, EVEN_EIGHTH) << 0)); odd_result |= ((calc_bitwise_parity(bit_parities, ODD_HALF) << 2) | (calc_bitwise_parity(bit_parities, ODD_FOURTH) << 1) | (calc_bitwise_parity(bit_parities, ODD_EIGHTH) << 0)); for (i = 0; i < sector_size; i++) byte_parities[i] = calc_bitwise_parity(buf[i], EVEN_WHOLE); for (i = 0; i < LOG2(sector_size); i++) { val = 0; val = calc_row_parity_bits(byte_parities, 1, 1 << i, sector_size); even_result |= (val << (3 + i)); val = calc_row_parity_bits(byte_parities, 0, 1 << i, sector_size); odd_result |= (val << (3 + i)); } free(byte_parities); return (odd_result << 16) | even_result; }