⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smilecc.c

📁 ertfs文件系统里面既有完整ucos程序
💻 C
字号:
/*********************************************************************** 
 * $Workfile:   smilecc.c  $ 
 * $Revision: 1.1.1.1 $ 
 * $Author: meterchen $ 
 * $Date: 2003/11/10 17:00:55 $ 
 * 
 * Project:     NAND FLASH MANAGEMENT
 * 
 * Description: 
 *        
 *
 * Revision History: 
 * 
 *********************************************************************** 
 * 
 *  Copyright (c) 2003 CHENMENG
 * 
 *  All rights reserved 
 * 
 **********************************************************************/
 
/******************************************************************************
ecctable.c
Making CP0-CP5 code table of ECC
March 1996
TOSHIBA Corp.
******************************************************************************/
/* CP0-CP5 code table */
static unsigned char ecctable[256] = {
	0x00,0x55,0x56,0x03,0x59,0x0C,0x0F,0x5A,0x5A,0x0F,0x0C,0x59,0x03,0x56,0x55,0x00,
	0x65,0x30,0x33,0x66,0x3C,0x69,0x6A,0x3F,0x3F,0x6A,0x69,0x3C,0x66,0x33,0x30,0x65,
	0x66,0x33,0x30,0x65,0x3F,0x6A,0x69,0x3C,0x3C,0x69,0x6A,0x3F,0x65,0x30,0x33,0x66,
	0x03,0x56,0x55,0x00,0x5A,0x0F,0x0C,0x59,0x59,0x0C,0x0F,0x5A,0x00,0x55,0x56,0x03,
	0x69,0x3C,0x3F,0x6A,0x30,0x65,0x66,0x33,0x33,0x66,0x65,0x30,0x6A,0x3F,0x3C,0x69,
	0x0C,0x59,0x5A,0x0F,0x55,0x00,0x03,0x56,0x56,0x03,0x00,0x55,0x0F,0x5A,0x59,0x0C,
	0x0F,0x5A,0x59,0x0C,0x56,0x03,0x00,0x55,0x55,0x00,0x03,0x56,0x0C,0x59,0x5A,0x0F,
	0x6A,0x3F,0x3C,0x69,0x33,0x66,0x65,0x30,0x30,0x65,0x66,0x33,0x69,0x3C,0x3F,0x6A,
	0x6A,0x3F,0x3C,0x69,0x33,0x66,0x65,0x30,0x30,0x65,0x66,0x33,0x69,0x3C,0x3F,0x6A,
	0x0F,0x5A,0x59,0x0C,0x56,0x03,0x00,0x55,0x55,0x00,0x03,0x56,0x0C,0x59,0x5A,0x0F,
	0x0C,0x59,0x5A,0x0F,0x55,0x00,0x03,0x56,0x56,0x03,0x00,0x55,0x0F,0x5A,0x59,0x0C,
	0x69,0x3C,0x3F,0x6A,0x30,0x65,0x66,0x33,0x33,0x66,0x65,0x30,0x6A,0x3F,0x3C,0x69,
	0x03,0x56,0x55,0x00,0x5A,0x0F,0x0C,0x59,0x59,0x0C,0x0F,0x5A,0x00,0x55,0x56,0x03,
	0x66,0x33,0x30,0x65,0x3F,0x6A,0x69,0x3C,0x3C,0x69,0x6A,0x3F,0x65,0x30,0x33,0x66,
	0x65,0x30,0x33,0x66,0x3C,0x69,0x6A,0x3F,0x3F,0x6A,0x69,0x3C,0x66,0x33,0x30,0x65,
	0x00,0x55,0x56,0x03,0x59,0x0C,0x0F,0x5A,0x5A,0x0F,0x0C,0x59,0x03,0x56,0x55,0x00
};
/******************************************************************************
ecccor.c
Correcting by ECC code
March 1996
TOSHIBA Corp.
******************************************************************************/
static void trans_result \
(unsigned char,unsigned char,unsigned char *,unsigned char *);
static void calculate_ecc \
(unsigned char *,unsigned char *,unsigned char *,unsigned char *,unsigned char *);
static unsigned char correct_data \
(unsigned char *,unsigned char *,unsigned char,unsigned char,unsigned char);
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01
#define BIT1BIT0 0x03
#define BIT23 0x00800000L
#define MASK_CPS 0x3f
#define CORRECTABLE 0x00555554L
/*
Transfer result
LP14,12,10,... & LP15,13,11,... -> LP15,14,13,... & LP7,6,5,..
*/
static void trans_result(
unsigned char reg2, /* LP14,LP12,LP10,... */
unsigned char reg3, /* LP15,LP13,LP11,... */
unsigned char *ecc1, /* LP15,LP14,LP13,... */
unsigned char *ecc2 /* LP07,LP06,LP05,... */
)
{
	unsigned char a; /* Working for reg2,reg3 */
	unsigned char b; /* Working for ecc1,ecc2 */
	unsigned char i; /* For counting */
	a=BIT7; b=BIT7; /* 80h=10000000b */
	*ecc1=*ecc2=0; /* Clear ecc1,ecc2 */
	for(i=0; i<4; ++i) {
		if ((reg3&a)!=0) *ecc1|=b; /* LP15,13,11,9 -> ecc1 */
		b=b>>1; /* Right shift */
		if ((reg2&a)!=0) *ecc1|=b; /* LP14,12,10,8 -> ecc1 */
		b=b>>1; /* Right shift */
		a=a>>1; /* Right shift */
	}
	b=BIT7; /* 80h=10000000b */
	for(i=0; i<4; ++i) {
		if ((reg3&a)!=0) *ecc2|=b; /* LP7,5,3,1 -> ecc2 */
		b=b>>1; /* Right shift */
		if ((reg2&a)!=0) *ecc2|=b; /* LP6,4,2,0 -> ecc2 */
		b=b>>1; /* Right shift */
		a=a>>1; /* Right shift */
	}
}
/*
Calculating ECC
data[0-255] -> ecc1,ecc2,ecc3 using CP0-CP5 code table[0-255]
*/
static void calculate_ecc(table,data,ecc1,ecc2,ecc3)
unsigned char *table; /* CP0-CP5 code table */
unsigned char *data; /* DATA */
unsigned char *ecc1; /* LP15,LP14,LP13,... */
unsigned char *ecc2; /* LP07,LP06,LP05,... */
unsigned char *ecc3; /* CP5,CP4,CP3,...,"1","1" */
{
	unsigned int i; /* For counting */
	unsigned char a; /* Working for table */
	unsigned char reg1; /* D-all,CP5,CP4,CP3,... */
	unsigned char reg2; /* LP14,LP12,L10,... */
	unsigned char reg3; /* LP15,LP13,L11,... */
	reg1=reg2=reg3=0; /* Clear parameter */
	for(i=0; i<256; ++i) {
		a=table[data[i]]; /* Get CP0-CP5 code from table */
		reg1^=(a&MASK_CPS); /* XOR with a */
		if ((a&BIT6)!=0) { /* If D_all(all bit XOR) = 1 */
			reg3^=(unsigned char)i; /* XOR with counter */
			reg2^=~((unsigned char)i); /* XOR with inv. of counter */
		}
	}
	/* Trans LP14,12,10,... & LP15,13,11,... -> LP15,14,13,... & LP7,6,5,.. */
	trans_result(reg2,reg3,ecc1,ecc2);
	*ecc1=~(*ecc1); *ecc2=~(*ecc2); /* Inv. ecc2 & ecc3 */
	*ecc3=((~reg1)<<2)|BIT1BIT0; /* Make TEL format */
}
/***** "ecccor.c" correct_data() modified *****/
/* data[256-258] --> eccdata[0-2] */
static unsigned char correct_data(
unsigned char *data, /* DATA */
unsigned char *eccdata, /* ECC DATA */
unsigned char ecc1, /* LP15,LP14,LP13,... */
unsigned char ecc2, /* LP07,LP06,LP05,... */
unsigned char ecc3 /* CP5,CP4,CP3,...,"1","1" */
)
{
	unsigned long l; /* Working to check d */
	unsigned long d; /* Result of comparison */
	unsigned int i; /* For counting */
	unsigned char d1,d2,d3; /* Result of comparison */
	unsigned char a; /* Working for add */
	unsigned char add; /* Byte address of cor. DATA */
	unsigned char b; /* Working for bit */
	unsigned char bit; /* Bit address of cor. DATA */
	d1=ecc1^eccdata[1]; d2=ecc2^eccdata[0]; /* Compare LP's */
	d3=ecc3^eccdata[2]; /* Comapre CP's */
	d=((unsigned long)d1<<16) /* Result of comparison */
		+((unsigned long)d2<<8)
		+(unsigned long)d3;
	if (d==0) return(0); /* If No error, return */
	if (((d^(d>>1))&CORRECTABLE)==CORRECTABLE) { /* If correctable */
		l=BIT23;
		add=0; /* Clear parameter */
		a=BIT7;
		for(i=0; i<8; ++i) { /* Checking 8 bit */
			if ((d&l)!=0) add|=a; /* Make byte address from LP's */
			l>>=2; a>>=1; /* Right Shift */
		}
		bit=0; /* Clear parameter */
		b=BIT2;
		for(i=0; i<3; ++i) { /* Checking 3 bit */
			if ((d&l)!=0) bit|=b; /* Make bit address from CP's */
			l>>=2; b>>=1; /* Right shift */
		}
		b=BIT0;
		data[add]^=(b<<bit); /* Put corrected data */
		return(1);
	}
	i=0; /* Clear count */
	d&=0x00ffffffL; /* Masking */
	while(d) { /* If d=0 finish counting */
		if (d&BIT0) ++i; /* Count number of 1 bit */
		d>>=1; /* Right shift */
	}
	if (i==1) { /* If ECC error */
		eccdata[1]=ecc1; eccdata[0]=ecc2; /* Put right ECC code */
		eccdata[2]=ecc3;
		return(2);
	}
	return(3); /* Uncorrectable error */
}
/******************************************************************************
##### End of 'ecctable.c' and 'ecccor.c' ###################################
******************************************************************************/
/****************************************************************************
* Software ECC Data Calculate and Error Correction for SMIL *
****************************************************************************/
int _Correct$SwECC(unsigned char *,unsigned char *,unsigned char *);
void _Calculate$SwECC(unsigned char *,unsigned char *);
extern void StringCopy(char *, char *, int);
/****************************************************************************/
int _Correct$SwECC(buf,redundant_ecc,calculate_ecc)
unsigned char *buf;
unsigned char *redundant_ecc;
unsigned char *calculate_ecc;
{
	unsigned int err;
	err=correct_data(buf,redundant_ecc,*(calculate_ecc+1),*(calculate_ecc),*(calculate_ecc+2));
	if(err==1) StringCopy((char*)calculate_ecc,(char*)redundant_ecc,3);
	if(err==0 || err==1 || err==2) return(0);
	return(-1);
}
/****************************************************************************/
void _Calculate$SwECC(buf,ecc)
unsigned char *buf;
unsigned char *ecc;
{
	calculate_ecc(ecctable,buf,ecc+1,ecc+0,ecc+2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -