10e8cc8bdSWilliam Juul /* 20e8cc8bdSWilliam Juul * YAFFS: Yet another Flash File System . A NAND-flash specific file system. 30e8cc8bdSWilliam Juul * 4*753ac610SCharles Manning * Copyright (C) 2002-2011 Aleph One Ltd. 50e8cc8bdSWilliam Juul * for Toby Churchill Ltd and Brightstar Engineering 60e8cc8bdSWilliam Juul * 70e8cc8bdSWilliam Juul * Created by Charles Manning <charles@aleph1.co.uk> 80e8cc8bdSWilliam Juul * 90e8cc8bdSWilliam Juul * This program is free software; you can redistribute it and/or modify 100e8cc8bdSWilliam Juul * it under the terms of the GNU Lesser General Public License version 2.1 as 110e8cc8bdSWilliam Juul * published by the Free Software Foundation. 120e8cc8bdSWilliam Juul * 130e8cc8bdSWilliam Juul * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. 140e8cc8bdSWilliam Juul */ 150e8cc8bdSWilliam Juul 160e8cc8bdSWilliam Juul /* 170e8cc8bdSWilliam Juul * This code implements the ECC algorithm used in SmartMedia. 180e8cc8bdSWilliam Juul * 190e8cc8bdSWilliam Juul * The ECC comprises 22 bits of parity information and is stuffed into 3 bytes. 200e8cc8bdSWilliam Juul * The two unused bit are set to 1. 21*753ac610SCharles Manning * The ECC can correct single bit errors in a 256-byte page of data. 22*753ac610SCharles Manning * Thus, two such ECC blocks are used on a 512-byte NAND page. 230e8cc8bdSWilliam Juul * 240e8cc8bdSWilliam Juul */ 250e8cc8bdSWilliam Juul 260e8cc8bdSWilliam Juul #ifndef __YAFFS_ECC_H__ 270e8cc8bdSWilliam Juul #define __YAFFS_ECC_H__ 280e8cc8bdSWilliam Juul 29*753ac610SCharles Manning struct yaffs_ecc_other { 30*753ac610SCharles Manning unsigned char col_parity; 31*753ac610SCharles Manning unsigned line_parity; 32*753ac610SCharles Manning unsigned line_parity_prime; 33*753ac610SCharles Manning }; 340e8cc8bdSWilliam Juul 35*753ac610SCharles Manning void yaffs_ecc_calc(const unsigned char *data, unsigned char *ecc); 36*753ac610SCharles Manning int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, 370e8cc8bdSWilliam Juul const unsigned char *test_ecc); 380e8cc8bdSWilliam Juul 39*753ac610SCharles Manning void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, 40*753ac610SCharles Manning struct yaffs_ecc_other *ecc); 41*753ac610SCharles Manning int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, 42*753ac610SCharles Manning struct yaffs_ecc_other *read_ecc, 43*753ac610SCharles Manning const struct yaffs_ecc_other *test_ecc); 440e8cc8bdSWilliam Juul #endif 45