📄 genecc.c
字号:
/*=============================================================================
**
** <Name> genEcc.c
**
** <Function> Generate ECC code from 512byte data
**
** VV-RR date
** 01-00 00/07/02
** 01-00 00/07/25
** 01-01 00/10/20
** 01-02 00/10/25
**
** Hitachi ULSI Systems Confidential.
** All Rights Reserved,Copyright (C) 2000
** Hitachi ULSI Systems Co.,LTD.
**
**============================================================================*/
#include "genEcc.h"
void genEcc512(unsigned char *pData, unsigned char *pEcc)
{
int i ;
unsigned char *eccPtr ;
unsigned char *datPtr ;
unsigned char bData ;
eccPtr = pEcc ;
for (i = 0 ; i < ECC_CODE_SIZE ; i++) {
*eccPtr++ = 0 ;
}
/* Generate ECC code */
datPtr = pData ;
for (i = 0 ; i < DATA_UNIT_SIZE ; i++) {
bData = *datPtr++ ;
/* C0 */
pEcc[0] ^= bData ;
/* C1 */
if ((i & ECC_MASK_C1) != 0) {
pEcc[1] ^= bData ;
}
/* C2 */
if ((i & ECC_MASK_C2) != 0) {
pEcc[2] ^= bData ;
}
/* C3 */
if ((i & ECC_MASK_C3) != 0) {
pEcc[3] ^= bData ;
}
/* C4 */
if ((i & ECC_MASK_C4) != 0) {
pEcc[4] ^= bData ;
}
/* C5 */
if ((i & ECC_MASK_C5) != 0) {
pEcc[5] ^= bData ;
}
/* C6 */
if ((i & ECC_MASK_C6) != 0) {
pEcc[6] ^= bData ;
}
/* C7 */
if ((i & ECC_MASK_C7) != 0) {
pEcc[7] ^= bData ;
}
/* C8 */
if ((i & ECC_MASK_C8) != 0) {
pEcc[8] ^= bData ;
}
/* C9 */
if ((i & ECC_MASK_C9) != 0) {
pEcc[9] ^= bData ;
}
}
/* %%001025 */
/* C10 */
pEcc[10] = 0 ;
for (i = 0 ; i < (ECC_CODE_SIZE-1) ; i++) {
pEcc[10] ^= pEcc[i] ;
}
}
/*===========================================================================*/
int chkCorEcc512(unsigned char *pData, unsigned char *pEcc)
{
int i ;
int rtn ;
unsigned char newEcc[ECC_CODE_SIZE] ;
unsigned char xorEcc[ECC_CODE_SIZE] ;
unsigned char *orgEccPtr,*newEccPtr ;
unsigned char *xorEccPtr ;
unsigned char andXor,orXor ;
unsigned char ecc_parity ;
int errFlg ;
int Y16 ;
int bytePos ;
rtn = ECC_CHECK_OK ;
/* %%001025 */
ecc_parity = 0 ;
for (i = 0 ; i < (ECC_CODE_SIZE-1) ; i++) {
ecc_parity ^= pEcc[i] ;
}
if (ecc_parity == pEcc[10]) {
genEcc512(pData, newEcc) ;
errFlg = FALSE ;
orgEccPtr = pEcc ;
newEccPtr = newEcc ;
xorEccPtr = xorEcc ;
for (i = 0 ; i < (ECC_CODE_SIZE-1) ; i++) {
*xorEccPtr = (unsigned char)((*orgEccPtr++) ^ (*newEccPtr++)) ;
if (*xorEccPtr != 0) {
errFlg = TRUE ;
}
xorEccPtr++ ;
}
if (errFlg) {
Y16 = 0 ;
xorEccPtr = xorEcc ;
for (i = 0 ; i < (ECC_CODE_SIZE-1) ; i++) {
Y16 <<= 1 ;
if (*xorEccPtr++ != 0) {
Y16 |= 0x01 ;
}
}
if (Y16 >= 0x200) {
andXor = 0xFF ;
orXor = 0x00 ;
xorEccPtr = xorEcc ;
for (i = 0 ; i < (ECC_CODE_SIZE-1) ; i++) {
if (*xorEccPtr != 0) {
andXor &= *xorEccPtr ;
orXor |= *xorEccPtr ;
}
xorEccPtr++ ;
}
if ((andXor ^ orXor) == 0) {
bytePos = Y16 & 0x1FF ;
pData[bytePos] ^= andXor ;
rtn = ECC_CORRECTION_OK ;
}
else {
rtn = ECC_CHECK_NG ;
}
}
else {
rtn = ECC_CHECK_NG ;
}
}
}
else {
rtn = ECC_ECC_ERROR ;
}
return(rtn) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -