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