nand_2k_media.c
来自「U盘控制器USB97C223的固件代码,对2kPAGE NAND FLASH 有」· C语言 代码 · 共 486 行 · 第 1/2 页
C
486 行
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_hi]) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_lo]) ;
n2k_page_set_wr_offset( _n2k_extra_data_offset(2)+k_ix_redt_lba1_hi ) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba1_hi]) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba1_lo]) ;
n2k_page_set_wr_offset( _n2k_extra_data_offset(2)+k_ix_redt_lba2_hi) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_hi]) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_lo]) ;
n2k_page_set_wr_offset( _n2k_extra_data_offset(3)+k_ix_redt_lba1_hi ) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba1_hi]) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba1_lo]) ;
n2k_page_set_wr_offset( _n2k_extra_data_offset(3)+k_ix_redt_lba2_hi) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_hi]) ;
_sm_data_wr( x_sm_redt_data[k_ix_redt_lba2_lo]) ;
*/
trace0(0, n2k, 0, "programming page with cache data") ;
return n2k_page_program() ;
}
//+-----------------------------------------------------------------------------
// Name:
// nand_2k_read_extra_data()
//
// Declaration:
// TBD
//
// Purpose:
// TBD
//
// Arguments:
// TBD
//
// Return:
// TBD
//
// Notes:
// TBD
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result n2k_read_extra_data(void) reentrant
{
uint8 i ;
trace3(0, n2k, 0, "n2k_read_extra_data() zone:%d phy_blk:%d page:%d", g_addr_zone, g_addr_rd_phy_blk, g_addr_page) ;
nand_select_card();
nand_rd_va2pa();
// send the "read" command to fetch the page
nand_page_read_for_data() ;
// jump to the last segment extra data offset... this will contain the extra-data for the page.
n2k_page_set_rd_offset( _n2k_extra_data_offset(3) ) ;
// pio the bytes into the extra data buffer
for(i=0;i<16;i++)
x_sm_redt_data[i]=_sm_data_rd() ;
_sm_hw_set_rd_standby();
sm_synch_hw_buff_to_redt_buf() ;
return k_success ;
}
//+-----------------------------------------------------------------------------
// Name:
// n2k_write_extra_data()
//
// Declaration:
// t_result n2k_write_extra_data(void) reentrant
//
// Purpose:
// TBD
//
// Arguments:
// TBD
//
// Return:
// TBD
//
// Notes:
// TBD
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result n2k_write_extra_data(void) reentrant
{
trace3(0, n2k, 0, "nand_2k_write_extra_data() zone:%d phy_blk:%d page:%d", g_addr_zone, g_addr_rd_phy_blk, g_addr_page) ;
trace0(0, n2k, 0, "error - not implemented") ;
return k_error ;
}
//+-----------------------------------------------------------------------------
// Name:
// nand_2k_erase_card()
//
// Declaration:
// t_result nand_2k_erase_card() reentrant
//
// Purpose:
// TBD
//
// Arguments:
// TBD
//
// Return:
// k_success always
//
// Notes:
// TBD
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result n2k_erase_card() reentrant
{
trace0(0, n2k, 0, "n2k_erase_card()") ;
for(g_addr_zone=0 ; g_addr_zone < _media_data(num_zones) ; g_addr_zone++)
{
// select the card once-per-zone
nand_select_card() ;
for(g_addr_wr_phy_blk = g_addr_zone?0:_media_data(boot_block)+1;
g_addr_wr_phy_blk < _media_data(physical_blocks_per_zone) ;
g_addr_wr_phy_blk++)
{
sm_media_erase_block() ;
}
}
return k_success ;
}
//+-----------------------------------------------------------------------------
// Name:
// nand_2k_set_read_addr()
//
// Declaration:
// t_result nand_2k_set_read_addr() reentrant
//
// Purpose:
// set media-specific address from internal zone/rd_phy_blk/sector addres
//
// Arguments:
// TBD
//
// Return:
// k_success always
//
// Notes:
// TBD
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result nand_2k_set_read_addr() reentrant
{
trace3(0, nand, 0, "nand_2k_set_read_addr() - page:%02X%02X%02X", g_nand_rd_addr_msb,g_nand_rd_addr_mid,g_nand_rd_addr_lsb) ;
_sm_hw_set_rd_addr();
_sm_data_wr(0x00);
_sm_data_wr(0x00);
_sm_data_wr(g_nand_rd_addr_lsb) ;
_sm_data_wr(g_nand_rd_addr_mid) ;
_sm_data_wr(g_nand_rd_addr_msb) ;
_sm_hw_set_rd_data(g_nand_rw_speed);
return k_success ;
}
//+-----------------------------------------------------------------------------
// Name:
// nand_2k_set_write_addr()
//
// Declaration:
// t_result nand_2k_set_write_addr() reentrant
//
// Purpose:
// set media-specific address from internal zone/wr_phy_blk/sector addres
//
// Arguments:
// TBD
//
// Return:
// k_success always
//
// Notes:
// TBD
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result nand_2k_set_write_addr() reentrant
{
trace3(0, n2k, 0, "nand_2k_set_write_addr() - page:%02X%02X%02X", g_nand_wr_addr_msb,g_nand_wr_addr_mid,g_nand_wr_addr_lsb) ;
_sm_hw_set_wr_addr();
_sm_data_wr(0x00);
_sm_data_wr(0x00);
_sm_data_wr(g_nand_wr_addr_lsb) ;
_sm_data_wr(g_nand_wr_addr_mid) ;
_sm_data_wr(g_nand_wr_addr_msb) ;
_sm_hw_set_wr_data(g_nand_rw_speed);
return k_success ;
}
//+-----------------------------------------------------------------------------
// Name:
// nand_2k_set_erase_addr()
//
// Declaration:
// t_result nand_2k_set_erase_addr() reentrant
//
// Purpose:
// set media-specific address from internal zone/wr_phy_blk
//
// Arguments:
// TBD
//
// Return:
// k_success always
//
// Notes:
// The block to be erased should be in g_addr_wr_phy_blk before this
// function is called
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
t_result nand_2k_set_erase_addr() reentrant
{
trace3(0, n2k, 0, "nand_2k_set_erase_addr() -> addr:%02X%02X%02X", g_nand_wr_addr_msb,g_nand_wr_addr_mid,g_nand_wr_addr_lsb) ;
_sm_hw_set_wr_addr();
_sm_data_wr(g_nand_wr_addr_lsb) ;
_sm_data_wr(g_nand_wr_addr_mid) ;
_sm_data_wr(g_nand_wr_addr_msb) ;
_sm_hw_set_wr_data(g_nand_rw_speed);
return k_success ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?