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

📄 bchhwsim.c

📁 M-System DOC(Disk on a Chip) Flash芯片映像读写工具, 可以进行二片Flash芯片的内容互相拷贝, 提高烧录程序的效率.
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -