nand_media.c

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

C
559
字号
// Purpose:
//
// Arguments:
//
// Return:
//
// Notes:
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result  nand_read_sector(void) reentrant
{
  trace4(0, nand, 0, "nand_read_sector() - zone:%d RD_PHY:%d log:%d page:%d", g_addr_zone, g_addr_rd_phy_blk, g_addr_log_blk, g_addr_page) ;
  nand_select_card() ;
  return sm_media_read_sector() ;
}

//+-----------------------------------------------------------------------------
// Name:
//   nand_write_sector()
//
// Declaration:
// t_result nand_write_sector(uint8 *buf) reentrant
//
// Purpose:
//
// Arguments:
//
// Return:
//
// Notes:
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result nand_write_sector() reentrant
{
  trace4(0, nand, 0, "nand_write_sector() zone:%d WR_PHY:%d log:%d page:%d", g_addr_zone, g_addr_wr_phy_blk, g_addr_log_blk, g_addr_page) ;
  nand_select_card() ;
  return sm_media_write_sector() ;
}

//+-----------------------------------------------------------------------------
// Name:
//   nand_copy_sector()
//
// Declaration:
// t_result nand_copy_sector() reentrant
//
// Purpose:
//
// Arguments:
//
// Return:
//
// Notes:
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result nand_copy_sector() reentrant
{
  trace4(0, nand, 0, "nand_copy_sector() zone:%d SRC_BLK:%d DEST_BLK:%d page:%d", g_addr_zone, g_addr_rd_phy_blk, g_addr_wr_phy_blk, g_addr_page) ;
  nand_select_card() ;
  return sm_media_copy_sector() ;
}

//+-----------------------------------------------------------------------------
// Name:
//   nand_read_extra_data()
//
// Declaration:
//   TBD
//
// Purpose:
//   TBD
//
// Arguments:
//   TBD
//
// Return:
//   TBD
//
// Notes:
//   TBD
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result nand_read_extra_data(void) reentrant
{
  trace3(0, nand, 0, "nand_read_extra_data() zone:%d phy_blk:%d page:%d", g_addr_zone, g_addr_rd_phy_blk, g_addr_page) ;
  nand_select_card( ) ;
  return sm_media_read_extra_data() ;
}


//+-----------------------------------------------------------------------------
// Name:
//   nand_write_extra_data()
//
// Declaration:
//   t_result nand_write_extra_data(void) reentrant
//
// Purpose:
//   TBD
//
// Arguments:
//   TBD
//
// Return:
//   TBD
//
// Notes:
//   TBD
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result nand_write_extra_data(void) reentrant
{
  nand_select_card( ) ;
  return sm_media_write_extra_data() ;
}


//+-----------------------------------------------------------------------------
// Name:
//   nand_erase_card()
//
// Declaration:
//   t_result nand_erase_card() reentrant
//
// Purpose:
//  TBD
//
// Arguments:
//  TBD
//
// Return:
//  k_success always
//
// Notes:
//  TBD
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result nand_erase_card() reentrant
{
  trace0(0, nand, 0, "nand_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_set_read_addr()
//
// Declaration:
//   t_result nand_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_set_read_addr() reentrant 
{
  trace3(0, nand, 0, "nand_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(g_nand_rd_addr_lsb) ; 
  _sm_data_wr(g_nand_rd_addr_mid) ; 
  if ( _lun_data(media)&kbm_sm_media_addr_4cyc)
    _sm_data_wr(g_nand_rd_addr_msb);
  _sm_hw_set_rd_data(g_nand_rw_speed);
  return k_success ;
}


//+-----------------------------------------------------------------------------
// Name:
//   nand_set_write_addr()
//
// Declaration:
//   t_result nand_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_set_write_addr() reentrant 
{
  trace3(0, nand, 0, "nand_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(g_nand_wr_addr_lsb) ; 
  _sm_data_wr(g_nand_wr_addr_mid) ; 
  if ( _lun_data(media)&kbm_sm_media_addr_4cyc)
    _sm_data_wr(g_nand_wr_addr_msb);
  _sm_hw_set_wr_data(g_nand_rw_speed);
  return k_success ;
}

//+-----------------------------------------------------------------------------
// Name:
//   nand_set_erase_addr()
//
// Declaration:
//   t_result nand_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_set_erase_addr() reentrant 
{
  trace3(0, nand, 0, "nand_set_erase_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(g_nand_wr_addr_lsb) ; 
  _sm_data_wr(g_nand_wr_addr_mid) ; 
  if ( _lun_data(media)&kbm_sm_media_addr_4cyc)
    _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 + -
显示快捷键?