📄 bchhwsim.c
字号:
bP[2] = ( FLByte ) ( dwRL >> 16) ;
bP[3] = ( FLByte ) ( dwRL >> 24 ) ;
bP[4] = ( FLByte ) dwRH ;
bP[5] = ( FLByte ) ( dwRH >> 8 ) ;
bP[6] = ( FLByte ) ( dwRH >> 16 ) ;
}
/* ------------------------------------------------------------------------- */
/* */
/* function: */
/* */
/* FLSNative BCH_Syndrome(FLByte bV[], FLSNative nsnumbytes, FLByte bS[]) */
/* */
/* description: Calculate syndrome bits for BCH 4 error correction code */
/* */
/* */
/* Perfomance in accelerated using multiplication tables of g(X) */
/* */
/* Input: */
/* bV[] - Page of data + parity bytes */
/* nsnumbytes - Number of data bytes */
/* 1 <= nsnumbytes <= 2040 */
/* */
/* Output: */
/* bS[] - 7 bytes of BCH 4 ECC syndrome bits */
/* */
/* */
/* Returned value: */
/* 0 - Syndrome is not 0 (There are errors) */
/* 1 - Syndrome is 0 (Data is correct) */
/* */
/* ------------------------------------------------------------------------- */
FLSNative BCH_Syndrome(FLByte bV[], FLSNative nsnumbytes, FLByte bS[])
{
/* Calculate syndrome bits */
/* Store remainder at dwRH:dwRL, bits 25 to 32 of dwRH are zeros */
FLDword dwRL = 0, dwRH = 0 ;
/* dwRH:dwRL accumulate the intermediate division result */
/* in the 56 right most bits */
FLSNative nsi = 0 ;
FLSNative nsind ;
dwRL = 0 ;
dwRH = 0 ;
/* Iterate on bytes of page */
while ( nsi < nsnumbytes )
{
nsind = ( FLByte ) dwRL ^ bV[nsi] ;
dwRL = ( dwRL >> 8 ) | ( dwRH << 24 ) ;
dwRL ^= dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
nsi++ ;
}
/* bS[0] to bS[6] are the syndrome bits */
bS[0] = ( FLByte ) ( dwRL ^ bV[nsnumbytes] ) ;
bS[1] = ( FLByte ) ( ( dwRL >> 8 ) ^ bV[nsnumbytes+1] ) ;
bS[2] = ( FLByte ) ( ( dwRL >> 16 ) ^ bV[nsnumbytes+2] ) ;
bS[3] = ( FLByte ) ( ( dwRL >> 24 ) ^ bV[nsnumbytes+3] ) ;
bS[4] = ( FLByte ) ( dwRH ^ bV[nsnumbytes+4] ) ;
bS[5] = ( FLByte ) ( ( dwRH >> 8 ) ^ bV[nsnumbytes+5] ) ;
bS[6] = ( FLByte ) ( ( dwRH >> 16 ) ^ bV[nsnumbytes+6] ) ;
/* Check if syndrome == 0 */
for ( nsi = 0 ; nsi < 7 ; nsi++ ) if ( bS[nsi] != 0 ) return 0 ;
return 1 ;
}
/* ------------------------------------------------------------------------- */
/* */
/* function: FLByte Hamming_Parity(FLByte bU[],nsnumbytes) */
/* */
/* description: */
/* */
/* Calculate Hamming parity bits for 1 error correction, 2 errors detection */
/* */
/* Perfomance in accelerated using multiplication tables of Hamming g(X) */
/* */
/* Input: */
/* bU[] - PageInfo bytes */
/* nsnumbytes - Number of bytes */
/* 1 <= nsnumbytes <= 14 */
/* */
/* Returned value: */
/* */
/* 1 byte of parity */
/* */
/* */
/* ------------------------------------------------------------------------- */
FLByte Hamming_Parity(FLByte bU[],FLSNative nsnumbytes)
{
FLSNative nsi = 0 ;
FLByte bparity = 0 ;
/* Calculate parity bits by C software */
while ( nsi < nsnumbytes )
{
bparity = bHammingTable[bU[nsi] ^ bparity ] ;
nsi++ ;
}
bparity ^= 0x01 ;
/* Invert parity LS bit, Makes the decoding of free sector easier */
/* have no effect on Hamming performance, except for an additional */
/* xor operation */
return bparity ;
}
/* ------------------------------------------------------------------------- */
/* */
/* function: FLByte Hamming_Syndrome(FLByte bV[],FLSNative nsnumbytes) */
/* */
/* description: */
/* */
/* Calculate Hamming syndrome bits for 1 error correction, 2 errors detection*/
/* */
/* */
/* Perfomance in accelerated using multiplication tables of Hamming g(X) */
/* */
/* Input: */
/* bV[] - PageInfo bytes + paritybyte */
/* nsnumbytes - Number of bytes */
/* 1 <= nsnumbytes <= 14 */
/* */
/* Returned value: */
/* 1 byte of syndrome */
/* */
/* */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* BCH update function */
/* */
/* Algorithms and programming were written by : */
/* */
/* Itai Dror */
/* */
/* Fortress Security Division, Omer */
/* M - Systems, Flash Disk Pioneers */
/* email: itaid@m-sys.com */
/* */
/* */
/* version 1.0, April. 20, 2002 */
/* */
/* ------------------------------------------------------------------------- */
/* */
/* function: */
/* */
/* void BCH_ParityUpdate(FLByte bOldPageInfo[], */
/* FLByte bNewPageInfo[], FLByte bBCHParity[] ) */
/* */
/* */
/* description: */
/* */
/* UpDating BCH parity bytes accoring to the OldPageInfo, */
/* NewPageInfo, and the current BCHParity. */
/* NewParity = OldParity ^ ParityOf( OldPageInfo ^ NewPageInfo ) */
/* This is working because BCH codes are linear. */
/* */
/* Function updates also NewPageInfo[7] which is the hamming parity */
/* byte of NewPageInfo */
/* */
/* Input: */
/* */
/* OldPageInfo - The page info bytes */
/* */
/* NewPageInfo - The new page info bytes which replace the old ones */
/* */
/* Input / Output: */
/* */
/* bBCHParity[] - 7 BCH parity bytes. Byte of parity are updated by this */
/* function. */
/* */
/* Output: */
/* */
/* bNewPageInfo[7] - Hamming parity of NewPageInfo[0..6] */
/* */
/* Returned value : */
/* */
/* None */
/* */
void BCH_ParityUpdate(FLByte bOldPageInfo[], FLByte bNewPageInfo[],
FLByte bBCHParity[])
{
/* UpDate BCH parity bits */
/* Store parity at dwRH:dwRL, bits 25 to 32 of dwRH are zeros */
FLDword dwRL = 0, dwRH = 0 ;
/* dwRH:dwRL accumulate the intermediate division result */
/* in the 56 right most bits */
FLSNative nsind ;
FLByte bparity = 0 ;
bparity = bHammingTable[ bNewPageInfo[0] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[0] ^ bNewPageInfo[0] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bparity = bHammingTable[bNewPageInfo[1] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[1] ^ bNewPageInfo[1] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bparity = bHammingTable[bNewPageInfo[2] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[2] ^ bNewPageInfo[2] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bparity = bHammingTable[bNewPageInfo[3] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[3] ^ bNewPageInfo[3] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bparity = bHammingTable[bNewPageInfo[4] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[4] ^ bNewPageInfo[4] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bparity = bHammingTable[bNewPageInfo[5] ^ bparity ] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[5] ^ bNewPageInfo[5] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bNewPageInfo[7] = ( FLByte ) ( bHammingTable[ (FLByte ) ( bNewPageInfo[6] ^ bparity )] ^ 0x01 ) ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[6] ^ bNewPageInfo[6] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
nsind = ( FLByte ) dwRL ^ bOldPageInfo[7] ^ bNewPageInfo[7] ;
dwRL = ( ( dwRL >> 8 ) | ( dwRH << 24 ) ) ^ dwLSGenpolyTable[nsind] ;
dwRH = ( dwRH >> 8 ) ^ dwMSGenpolyTable[nsind] ;
bBCHParity[0] = ( FLByte ) ( bBCHParity[0] ^ ( FLByte ) dwRL ) ;
bBCHParity[1] = ( FLByte ) ( bBCHParity[1] ^ ( FLByte ) ( dwRL >> 8 ) ) ;
bBCHParity[2] = ( FLByte ) ( bBCHParity[2] ^ ( FLByte ) ( dwRL >> 16) ) ;
bBCHParity[3] = ( FLByte ) ( bBCHParity[3] ^ ( FLByte ) ( dwRL >> 24 ) ) ;
bBCHParity[4] = ( FLByte ) ( bBCHParity[4] ^ ( FLByte ) dwRH ) ;
bBCHParity[5] = ( FLByte ) ( bBCHParity[5] ^ ( FLByte ) ( dwRH >> 8 ) ) ;
bBCHParity[6] = ( FLByte ) ( bBCHParity[6] ^ ( FLByte ) ( dwRH >> 16 ) ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -