www.pudn.com > SMSC USB2.0.zip > ecc.h


//------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------ 
// ecc library 
//------------------------------------------------------------------------------ 
//------------------------------------------------------------------------------ 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_correct() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *,uint8 *,uint8 *) reentrant ; 
// 
// Purpose: 
//   use ecc correction on databuf using ecc values from redundant 
//   data buffer.  the ecc values are then recomputed and returned in 
//   in the 3 byte eccbuf. 
// 
// Arguments: 
//  databuf   - 512 byte buffer to run through the ecc_correction 
//  redtbuf   - redundant data buffer (to be fixed) 
//  eccbuf    - 3 byte buffer to store corrected ecc data 
// 
// Return: 
//   - k_success - if the buffer contained no ecc errors 
//   - k_ecc_corrected_buf_err - if the buffer contained a single bit error, 
//             and has already been corrected (buffer contains valid data) 
//   - k_ecc_corrected_buf_err - if the buf_ecc lp_hi, lp_lo, or cp contained 
//             an error.  the buf_ecc and ecc variables will have the ecc code 
//             for the given buffer. 
//   - k_ecc_uncorrectable_err - if the buffer contains too many errors to 
//             correct. 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
#define k_ecc_success                 k_success 
#define k_ecc_corrected_buf_err       0x80 
#define k_ecc_corrected_ecc_code_err  0x81 
#define k_ecc_uncorrectable_err       0x82 
 
t_result ecc_sw_correct(uint8* buf, uint8* redtbuf, uint8* eccbuf ) reentrant ; 
 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_sw_calculate() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *) reentrant ; 
// 
// Purpose: 
//   calculates ecc lp and cp values from a given 512 byte buffer 
// 
// Arguments: 
//  databuf   - 512 byte buffer to obtain ecc values 
// 
// Return: 
//  none 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
void ecc_sw_calculate(uint8 *) reentrant ; 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_sw_calculate() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *) reentrant ; 
// 
// Purpose: 
//   calculates ecc lp and cp values from a given 512 byte buffer 
// 
// Arguments: 
//  databuf   - 512 byte buffer to obtain ecc values 
// 
// Return: 
//  none 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
t_result ecc_check_rd_error() reentrant ; 
 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_sw_calculate() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *) reentrant ; 
// 
// Purpose: 
//   calculates ecc lp and cp values from a given 512 byte buffer 
// 
// Arguments: 
//  databuf   - 512 byte buffer to obtain ecc values 
// 
// Return: 
//  none 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
// void ecc_load_from_hw(uint8 pg) reentrant ; 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_sw_calculate() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *) reentrant ; 
// 
// Purpose: 
//   calculates ecc lp and cp values from a given 512 byte buffer 
// 
// Arguments: 
//  databuf   - 512 byte buffer to obtain ecc values 
// 
// Return: 
//  none 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
// void ecc_load_from_redt_data(void) reentrant ; 
 
//+----------------------------------------------------------------------------- 
// Name: 
//   ecc_sw_calculate() 
// 
// Declaration: 
//   int8 ecc_correct(uint8 *) reentrant ; 
// 
// Purpose: 
//   calculates ecc lp and cp values from a given 512 byte buffer 
// 
// Arguments: 
//  databuf   - 512 byte buffer to obtain ecc values 
// 
// Return: 
//  none 
// 
// Notes: 
//   This is a FUNCTION, not a DFA. 
// 
// Since: 
//   fmc-1.0 
//------------------------------------------------------------------------------ 
t_result ecc_check_and_correct(uint8 *sector) reentrant ; 
 
// extern xdata uint8  smil_ecc1 ;     /* LP 15-8 */ 
// extern xdata uint8  smil_ecc2 ;     /* LP 7-0  */ 
// extern xdata uint8  smil_ecc3 ;     /* CP 5-0,"1","1" */ 
 
extern xdata uint8 x_eccbuf[6]; 
 
typedef union u_ecc 
{ 
  uint8 ecc[3] ; 
  struct 
  { 
    uint8 lp_lo;  // lsw msb 
    uint8 lp_hi;  // msw lsb 
    uint8 cp;     // lsw lsb 
  } u8 ; 
} t_ecc ; 
 
extern xdata t_ecc ecc_pg_1 ; 
extern xdata t_ecc ecc_pg_2 ; 
 
extern xdata uint8 buf_ecc_lp_hi ;  // line parity hi-byte (LP 15-8) 
extern xdata uint8 buf_ecc_lp_lo ;  // line parity lo-byte (LP 7-0) 
extern xdata uint8 buf_ecc_cp ;     // column parity bits  (CP 5-0,"1","1") 
extern xdata uint8 ecc_lp_hi ;  // line parity hi-byte (LP 15-8) 
extern xdata uint8 ecc_lp_lo ;  // line parity lo-byte (LP 7-0) 
extern xdata uint8 ecc_cp ;     // column parity bits  (CP 5-0,"1","1")