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