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 + -
显示快捷键?