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

📄 genecc.c

📁 瑞萨单片机开发软代码.非常实用小巧的平台,很多应用都可以在上面实现.
💻 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 + -