ecc.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:3k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 2001  Microsoft Corporation
  7. Function: CountNumberOfOnes()
  8. Description: Counts the number of bits that are "1" in a byte.
  9. Returns: Number of bits that are "1".
  10. -------------------------------------------------------------------------------*/
  11. #include <windows.h>
  12. UCHAR CountNumberOfOnes(UCHAR num)
  13. {
  14. UCHAR count = 0;
  15. while(num)
  16. {
  17. num=num&(num-1);
  18. count++;
  19. }
  20. return count;
  21. }
  22. #define DATA_BUFF_LEN 512
  23. #define ECC_BUFF_LEN 3 // # of bytes in ECC
  24. #define NO_DATA_ERROR 0
  25. #define ECC_ERROR 1
  26. #define CORRECTABLE_ERROR 12 // Half of the ECC bits are 1
  27. /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  28. Function: ECC_CorrectData()
  29. Description: Corrects any errors (if possible) in the specified data.
  30. Notes: This implemention uses 3 bytes of ECC info for every 512 bytes
  31. of data.  Furthermore, a only single-bit error can be corrected
  32. for every 512 bytes of data.
  33. This code is based on the ECC algorithm publicly available on
  34. Samsung's FLASH media website.
  35. Returns: Boolean indicating if the data was corrected.
  36. -------------------------------------------------------------------------------*/
  37. BOOL ECC_CorrectData(LPBYTE pData, LPBYTE pExistingECC, LPBYTE pNewECC)
  38. {
  39. DWORD i, numOnes, byteLocation, bitLocation;
  40. BYTE xorECC[ECC_BUFF_LEN];
  41. //----- 1. Check the parameters -----
  42. if((pData == NULL) || (pExistingECC == NULL) || (pNewECC == NULL))
  43. {
  44. return FALSE;
  45. }
  46. //----- 2. First, determine if this is a single-bit, correctable, error -----
  47. //    NOTE: To answer this question, the two ECC values are XOR'd 
  48. //  together and the total # of 1 bits is counted, which 
  49. //  then tell us if we can correct the erroneous single-bit 
  50. //  transition in the data.
  51. for(i=0; i<ECC_BUFF_LEN; i++)
  52. {
  53. xorECC[i] = pExistingECC[i] ^ pNewECC[i];
  54. }
  55. numOnes = 0;
  56. for(i=0; i<ECC_BUFF_LEN; i++)
  57. {
  58. numOnes += CountNumberOfOnes(xorECC[i]);
  59. }
  60. switch(numOnes)
  61. {
  62. case NO_DATA_ERROR: // Data doesn't contain an error
  63. return TRUE;
  64. case ECC_ERROR: // Existing ECC value has gone bad!
  65. return FALSE;
  66. case CORRECTABLE_ERROR: // Single-bit error
  67. break;
  68. default: // More than a single-bit error
  69. return FALSE;
  70. }
  71. //----- 3. Compute the location of the single-bit error -----
  72. byteLocation = ( ((xorECC[2]&0x02)<<7) |
  73.  ((xorECC[1]&0x80))    | ((xorECC[1]&0x20)<<1) | 
  74.          ((xorECC[1]&0x08)<<2) | ((xorECC[1]&0x02)<<3) |
  75.  ((xorECC[0]&0x80)>>4) | ((xorECC[0]&0x20)>>3) | 
  76.  ((xorECC[0]&0x08)>>2) | ((xorECC[0]&0x02)>>1) );
  77. bitLocation  = (((xorECC[2]&0x80)>>5) | ((xorECC[2]&0x20)>>4) | ((xorECC[2]&0x08)>>3) );
  78. //----- 4. Correct the single-bit error (set the bit to its complementary value) -----
  79. if(pData[byteLocation] & (0x01 << bitLocation))
  80. {
  81. pData[byteLocation] &= ~(0x01 << bitLocation); // 0->1 error, set bit to 0
  82. }else
  83. {
  84. pData[byteLocation] |= (0x01 <<  bitLocation); // 1->0 error, set bit to 1
  85. }
  86. return TRUE;
  87. }