?? ecc sample source code for 512 byte.txt
字號:
#if (XMODE == 8)
tmp = parityColTot & 0xF0F0F0F0 ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp << 2) ^ tmp;
ecc |= ((tmp << 1) ^ tmp) & 0x800000; // p4
#else
tmp = parityColTot & 0xF0F0F0F0 ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp >> 2) ^ tmp;
ecc |= ((tmp << 1) ^ tmp) & 0x200000; // p4
#endif
#if (XMODE == 8)
tmp = parityColTot & 0xCCCCCCCC ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp << 4) ^ tmp;
tmp = (tmp >> 2);
ecc |= ((tmp << 1) ^ tmp) & 0x200000; // p2
#else
tmp = parityColTot & 0xCCCCCCCC ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp >> 4) ^ tmp;
ecc |= ((tmp << 1) ^ tmp) & 0x80000; // p2
#endif
#if (XMODE == 8)
tmp = parityColTot & 0xAAAAAAAA ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp >> 4) ^ tmp;
tmp = (tmp << 2) ^ tmp;
ecc |= (tmp & 0x80000); // p1
#else
tmp = parityColTot & 0xAAAAAAAA ;
tmp = (tmp << 16) ^ tmp;
tmp = (tmp >> 8) ^ tmp;
tmp = (tmp >> 4) ^ tmp;
tmp = (tmp >> 2) ^ tmp;
ecc |= (tmp & 0x20000); // p1
#endif
#if (XMODE == 8)
ecc |= (uiparity & 0x01) <<11;
ecc |= (uiparity & 0x02) <<12;
ecc |= (uiparity & 0x04) <<13;
ecc |= (uiparity & 0x08) <<14;
#else
ecc |= (uiparity & 0x01) <<9;
ecc |= (uiparity & 0x02) <<10;
ecc |= (uiparity & 0x04) <<11;
ecc |= (uiparity & 0x08) <<12;
#endif
if (Xorbit)
{
ecc |= (ecc ^ 0x00AAAAAA)>>1;
}
else
{
ecc |= (ecc >> 1);
}
#if (XMODE == 8)
ecc = ~ecc;
*(ecc_buf + 2) = (uint8_t) (ecc >> 16);
*(ecc_buf + 1) = (uint8_t) (ecc >> 8);
*(ecc_buf + 0) = (uint8_t) (ecc);
#else // X16
ecc = ( ~ecc ) | 0xFF000000;
*(ecc_buf + 1) = (uint16_t) (ecc >> 16);
*(ecc_buf + 0) = (uint16_t) (ecc);
#endif
}
/*****************************************************************************/
/* */
/* NAME */
/* compare_ecc_512 */
/* DESCRIPTION */
/* This function compares two ECCs and indicates if there is an error. */
/* PARAMETERS */
/* ecc_data1 one ECC to be compared */
/* ecc_data2 the other ECC to be compared */
/* page_data content of data page */
/* offset where the error occurred */
/* corrected correct data */
/* RETURN VALUES */
/* Upon successful completion, compare_ecc returns SSR_SUCCESS. */
/* Otherwise, corresponding error code is returned. */
/* */
/*****************************************************************************/
#if (XMODE == 8)
eccdiff_t compare_ecc_512(uint8_t *iEccdata1, uint8_t *iEccdata2,
uint8_t *pPagedata, int32_t pOffset, uint8_t pCorrected)
#else // X16
eccdiff_t compare_ecc_512(uint16_t *iEccdata1, uint16_t *iEccdata2,
uint16_t *pPagedata, int32_t pOffset, uint16_t pCorrected)
#endif
{
uint32_t iCompecc = 0, iEccsum = 0;
uint32_t iFindbyte = 0;
uint32_t iIndex;
uint32_t nT1 = 0, nT2 =0;
#if (XMODE == 8)
uint8_t iNewvalue;
uint8_t iFindbit = 0;
uint8_t *pEcc1 = (uint8_t *)iEccdata1;
uint8_t *pEcc2 = (uint8_t *)iEccdata2;
for ( iIndex = 0; iIndex <2; iIndex++)
{
nT1 ^= (((*pEcc1) >> iIndex) & 0x01);
nT2 ^= (((*pEcc2) >> iIndex) & 0x01);
}
for (iIndex = 0; iIndex < 3; iIndex++)
iCompecc |= ((~(*pEcc1++) ^ ~(*pEcc2++)) << iIndex * 8);
for(iIndex = 0; iIndex < 24; iIndex++) {
iEccsum += ((iCompecc >> iIndex) & 0x01);
}
#else // X16
uint16_t iNewvalue;
uint16_t iFindbit = 0;
uint16_t *pEcc1 = (uint16_t *)iEccdata1;
uint16_t *pEcc2 = (uint16_t *)iEccdata2;
for ( iIndex = 0; iIndex <2; iIndex++)
{
nT1 ^= (((*pEcc1) >> iIndex) & 0x01);
nT2 ^= (((*pEcc2) >> iIndex) & 0x01);
}
for (iIndex = 0; iIndex < 2; iIndex++) // 2 word of ECC data
iCompecc |= (((~*pEcc1++) ^ (~*pEcc2++)) << iIndex * 16);
for(iIndex = 0; iIndex < 24; iIndex++) {
iEccsum += ((iCompecc >> iIndex) & 0x01);
}
#endif
switch (iEccsum) {
case 0 :
printf("RESULT : no error\n");
return ECC_NO_ERROR;
case 1 :
printf("RESULT : ECC code 1 bit fail\n");
return ECC_ECC_ERROR;
case 12 :
if (nT1 != nT2)
{
#if (XMODE == 8)
iFindbyte = ((iCompecc >> 17 & 1) << 8) + ((iCompecc >> 15 & 1) << 7) + ((iCompecc >> 13 & 1) << 6)
+ ((iCompecc >> 11 & 1) << 5) + ((iCompecc >> 9 & 1) << 4) + ((iCompecc >> 7 & 1) << 3)
+ ((iCompecc >> 5 & 1) << 2) + ((iCompecc >> 3 & 1) << 1) + (iCompecc >> 1 & 1);
iFindbit = (uint8_t)(((iCompecc >> 23 & 1) << 2) + ((iCompecc >> 21 & 1) << 1) + (iCompecc >> 19 & 1));
iNewvalue = (uint8_t)(pPagedata[iFindbyte] ^ (1 << iFindbit));
#else // CASE_X16
iFindbyte = ((iCompecc >> 15 & 1) << 7) + ((iCompecc >> 13 & 1) << 6)
+ ((iCompecc >> 11 & 1) << 5) + ((iCompecc >> 9 & 1) << 4) + ((iCompecc >> 7 & 1) << 3)
+ ((iCompecc >> 5 & 1) << 2) + ((iCompecc >> 3 & 1) << 1) + (iCompecc >> 1 & 1) ;
iFindbit = (uint16_t)(((iCompecc >> 23 & 1) << 3) + ((iCompecc >> 21 & 1) << 2) + ((iCompecc >> 19 & 1) << 1)
+ (iCompecc >> 17 & 1) );
iNewvalue = (uint16_t)(pPagedata[iFindbyte] ^ (1 << iFindbit));
#endif
printf("iCompecc = %d\n",iCompecc);
printf("RESULT : one bit error\r\n");
printf("byte = %d, bit = %d\r\n", iFindbyte, iFindbit);
printf("corrupted = %x, corrected = %x\r\n", pPagedata[iFindbyte], iNewvalue);
if (pOffset != NULL) {
pOffset = iFindbyte;
}
if (pCorrected != NULL) {
pCorrected = iNewvalue;
}
return ECC_CORRECTABLE_ERROR;
}
else
return ECC_UNCORRECTABLE_ERROR;
default :
printf("RESULT : unrecoverable error\n");
return ECC_UNCORRECTABLE_ERROR;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -