Esempio n. 1
0
/* 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;
}
Esempio n. 2
0
/*
 * 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;
}