sm.h

来自「U盘控制器USB97C223的固件代码,对2kPAGE NAND FLASH 有」· C头文件 代码 · 共 621 行 · 第 1/2 页

H
621
字号
//------------------------------------------------------------------------------
// smart media library options
//------------------------------------------------------------------------------
#define k_sm_option_rderr_reassign  1  /* Reassign with Read Error */
#define k_sm_option_l2p_err_erase   1  /* BlockErase for Contradicted L2P Table */
#define k_sm_option_use_hw_ecc      0  /* 0:do sw ecc, 1:use hw ecc support */


/***************************************************************************
SmartMedia Command & Status Definition
***************************************************************************/
/* SmartMedia Command */
#define k_sm_read         0x00 
#define k_sm_read2        0x01 
#define k_sm_write        0x10 
#define k_sm_read_redt    0x50 
#define k_sm_erase1       0x60 
#define k_sm_read_status  0x70 
#define k_sm_read_id      0x90 
#define k_sm_write_data   0x80 
#define k_sm_erase2       0xD0 
#define k_sm_reset_chip   0xFF 

// new nand flash command opcodes
#define k_nand_cmd_read_for_data      0x30
#define k_nand_cmd_read_for_copy      0x35
#define k_nand_cmd_read_cache_next    0x31  /* toshiba only */
#define k_nand_cmd_read_cache_final   0x3f  /* toshiba only */
#define k_nand_cmd_read_offset_addr   0x05
#define k_nand_cmd_read_offset_data   0xE0
#define k_nand_cmd_write_cache_data   0x85
#define k_nand_cmd_write_cache        0x15
#define k_nand_cmd_write_page         k_sm_write
#define k_nand_cmd_read_id            0x90 
#define k_nand_cmd_read_id_ex         0x91


/* SmartMedia Status */
#define kbm_sm_status_write_failed    0x01  /* 0:Pass, 1:Fail */
#define kbm_sm_status_suspended       0x20  /* 0:Not Suspended, 1:Suspended */
#define kbm_sm_status_ready           0x40  /* 0:Busy, 1:Ready */
#define kbm_sm_status_n_wr_protect    0x80  /* 0:Protect, 1:Not Protect */

/* SmartMedia Busy Time (1bit:0.1ms) */
#define k_sm_busy_programming_timeout 21  /* tPROG : 20ms ----- Program Time */
#define k_sm_busy_erase_timeout       400 /* tBERASE: 400ms ----- Block Erase Time */
#define k_sm_busy_read_timeout        2   /* tR : 100us ----- Data transfer Time */
#define k_sm_busy_reset_timeout       7   /* tRST : 6ms ----- Device Resetting Time */
// new nand flash timeouts
#define k_nand_write_page_timeout     2   /* 700 usecs max */


/* Hardware Timer (1bit:0.1ms) */
#define k_sm_busy_power_up_timeout    301 // 300ms ------ Power On Wait Time TIME_PON*/
#define k_sm_card_check_poll_interval 21  // 20ms  ------ Card Check Interval Timer CDCHK */
#define k_sm_time_wp_poll_interval    6   // 5ms  ------ WP Check Interval Timer */

//------------------------------------------------------------------------------
// Redundant Data (aka extra data) buffer field offsets
//------------------------------------------------------------------------------
#define k_ix_redt_data_status   0x04
#define k_ix_redt_block_status  0x05
#define k_ix_redt_lba1_hi       0x06
#define k_ix_redt_lba1_lo       0x07
#define k_ix_redt_lba2_hi       0x0B
#define k_ix_redt_lba2_lo       0x0C
#define k_ix_redt_ecc1_0        0x0D
#define k_ix_redt_ecc1_1        0x0E
#define k_ix_redt_ecc1_2        0x0F
#define k_ix_redt_ecc2_0        0x08
#define k_ix_redt_ecc2_1        0x09
#define k_ix_redt_ecc2_2        0x0A

// export the buffer for sm_ecc usage
extern xdata uint8  x_sm_redt_data[] ;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// SmartMedia lun specific attribute
#define kbm_sm_media_addr_4cyc  kbm_lun_media_custom0 

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern xdata uint8 nand_id_maker ;
extern xdata uint8 nand_id_device ;
extern xdata uint8 nand_id_3;
extern xdata uint8 nand_id_4;
extern xdata uint8 nand_id_5;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern xdata uint8 g_nand_rd_addr_msb ;
extern xdata uint8 g_nand_rd_addr_mid ;
extern xdata uint8 g_nand_rd_addr_lsb ;
extern xdata uint8 g_nand_wr_addr_msb ;
extern xdata uint8 g_nand_wr_addr_mid ;
extern xdata uint8 g_nand_wr_addr_lsb ;

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
extern xdata uint8 g_nand_rw_speed ;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern void nand_rd_va2pa() reentrant;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern void nand_wr_va2pa() reentrant;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern void nand_incr_addr() reentrant;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void sm_reset_device(void) reentrant;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
t_result sm_redt_data_wr(void) reentrant;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
t_result sm_identify_media_format(void)reentrant;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void sm_soft_reset(void) reentrant ;

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
uint8 sm_read_id(void) reentrant ;

//+-----------------------------------------------------------------------------
//------------------------------------------------------------------------------
void sm_read_id_ex(void) reentrant ;

//+-----------------------------------------------------------------------------
//------------------------------------------------------------------------------
void sm_pio_rd_buf(uint8 *databuf) reentrant ;

//-----------------------------------------------------------------------------
t_result sm_check_status(void) reentrant ;

//-----------------------------------------------------------------------------
t_result sm_media_check_format(void)reentrant;

//-----------------------------------------------------------------------------
t_result sm_media_seek_cis(void) reentrant;

//-----------------------------------------------------------------------------
t_result sm_read_cis_sect(uint8 *)reentrant;

//-----------------------------------------------------------------------------
t_result sm_validate_cis(uint8 *) reentrant ;

//-----------------------------------------------------------------------------
t_result sm_wait_rdy_with_timeout(uint16 ) reentrant;

//-----------------------------------------------------------------------------
void sm_synch_hw_buff_to_redt_buf(void) reentrant;

//------------------------------------------------------------------------------
void sm_set_write_mode_extra_data(void) reentrant ;

//------------------------------------------------------------------------------
void sm_set_write_mode_page_data(void) reentrant ;

//------------------------------------------------------------------------------
void sm_correct_sram_bit(uint8 buffer, uint8 ix_bit, uint16 offset) reentrant;

//------------------------------------------------------------------------------
t_result sm_check_data_status(uint8 start_page, uint8 count) reentrant;



//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// a byte of attribute bits reserved for keeping the firmware flexible, even
// after it goes into the masked rom.
//------------------------------------------------------------------------------
#if defined(k_smc_write_multi_support)
// define a variable to allow multiple emulation to be enabled/disabled
extern xdata uint8 g_write_mult_emu;
#else
// always choose the false path for mcu's w/o multiple emulation support
#define g_write_mult_emu k_false
#endif


//+-----------------------------------------------------------------------------
// Name:
//   sm_setup_wr_multi_opts()
//
// Declaration:
//   void sm_setup_wr_multi_opts(void) reentrant
//
// Purpose:
//   determine write split mode (multi-enable, hs1pg/normal, or disabled),
//   and set the mask into g_sm_mode_ctl_2_opts so it can be set quickly
//
// Arguments:
//   none
//
// Return:
//   none
//
// Notes:
// g_sm_mode_ctl_2_opts values:
//    0x00        (default) write multiple emulation enabled, mode is determined from the card id
//    0x-1        multiple emulation disabled - writes will be performed via single page fw bursts
//    0x02        override emulation mode - select "Normal" regardless of card capabilities
//    0x12        reserved - results undefined for 223
//    0x22        override emulation mode - select "HS 1 Page," regardless of card capabilities
//    0x32        reserved - results undefined for 223
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
extern xdata uint8 g_sm_mode_ctl_2_opts;
void sm_setup_mult_write_opts() reentrant;

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
void sm_setup_mult_write_emu() reentrant;


//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// sm lun overrides
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// define instance method of enabling the lun mux.  since thereis already
// a mechanism for doing this, I'm simply going to use it (defined in fmc.h)
// instead of wrapping a function call in this class (which is the more "OO" pure way
// of encapsulating the "class" methods) to that function.
//
// note it is a FUNCTION not a DFA!!!!
//-------------------------------------------------------------------------------
#undef _v_lun_enable_mux
#define _v_lun_enable_mux fmc_select_smc

//------------------------------------------------------------------------------
void sm_initialize_controller(void) reentrant;
#undef _v_lun_initialize_controller
#define _v_lun_initialize_controller sm_initialize_controller

//------------------------------------------------------------------------------
void dfa_sm_initialize_media(void) reentrant;
#undef _v_dfa_lun_initialize_media
#define _v_dfa_lun_initialize_media dfa_sm_initialize_media

//------------------------------------------------------------------------------
void dfa_sm_reset_media(void) reentrant;
#undef _v_dfa_lun_reset_media
#define _v_dfa_lun_reset_media dfa_sm_reset_media

//--------------------------------------------------------------------------------
void dfa_sm_identify_media(void) reentrant;
#undef _v_dfa_lun_identify_media
#define _v_dfa_lun_identify_media dfa_sm_identify_media

//------------------------------------------------------------------------------
void sm_dfa_read(void) reentrant ;
#undef _v_dfa_lun_read
#define _v_dfa_lun_read sm_dfa_read

//------------------------------------------------------------------------------
void sm_dfa_write(void) reentrant ;
#undef _v_dfa_lun_write
#define _v_dfa_lun_write sm_dfa_write

//------------------------------------------------------------------------------
void sm_dfa_verify(void) reentrant ;
#undef _v_dfa_lun_verify
#define _v_dfa_lun_verify sm_dfa_verify

//------------------------------------------------------------------------------
#undef _v_dfa_lun_erase_media
#define _v_dfa_lun_erase_media media_dfa_erase

//------------------------------------------------------------------------------
#undef _v_dfa_lun_report_media_geometry
#define _v_dfa_lun_report_media_geometry media_dfa_report_media_geometry



// index into the vtbl
typedef uint8 t_sm_vtbl_ix ;
typedef enum e_sm_vtbl_entry
{
  k_sm_vtbl_sz = k_lun_vtbl_sz
} ;

// sm class definition:
#define _v_sm _v_lun

// sm class vtable declaration & vtable size declaration
extern code  _vtbl_decl(sm) ;

#else
#error "header file 'sm.h' included too many times"
#endif //  _sm_h_

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?