1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * YAFFS: Yet another Flash File System . A NAND-flash specific file system. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2002-2011 Aleph One Ltd. 5*4882a593Smuzhiyun * for Toby Churchill Ltd and Brightstar Engineering 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Created by Charles Manning <charles@aleph1.co.uk> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 10*4882a593Smuzhiyun * it under the terms of the GNU Lesser General Public License version 2.1 as 11*4882a593Smuzhiyun * published by the Free Software Foundation. 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 17*4882a593Smuzhiyun * This code implements the ECC algorithm used in SmartMedia. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes. 20*4882a593Smuzhiyun * The two unused bit are set to 1. 21*4882a593Smuzhiyun * The ECC can correct single bit errors in a 256-byte page of data. 22*4882a593Smuzhiyun * Thus, two such ECC blocks are used on a 512-byte NAND page. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifndef __YAFFS_ECC_H__ 27*4882a593Smuzhiyun #define __YAFFS_ECC_H__ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct yaffs_ecc_other { 30*4882a593Smuzhiyun unsigned char col_parity; 31*4882a593Smuzhiyun unsigned line_parity; 32*4882a593Smuzhiyun unsigned line_parity_prime; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun void yaffs_ecc_calc(const unsigned char *data, unsigned char *ecc); 36*4882a593Smuzhiyun int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, 37*4882a593Smuzhiyun const unsigned char *test_ecc); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, 40*4882a593Smuzhiyun struct yaffs_ecc_other *ecc); 41*4882a593Smuzhiyun int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, 42*4882a593Smuzhiyun struct yaffs_ecc_other *read_ecc, 43*4882a593Smuzhiyun const struct yaffs_ecc_other *test_ecc); 44*4882a593Smuzhiyun #endif 45