⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ms.c

📁 <B>SMSC USB2.0 Flash硬盘驱动源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
// Notes:
//   This is a FUNCTION, not a DFA.
//   The module global variables _status0 and _status1are written with the results
//   as a side effect.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_read_status() reentrant
{
  trace0(0, ms, 0, "ms_read_status()");
  //_stack_check();
  // set the address
  if (k_success != ms_set_read_reg_addrs(k_ms_reg_status0, 2))
    return k_error;
  // write the tpc
  if (k_success != ms_set_tpc(k_ms_tpc_rd_reg, 2))
    return k_error;
  // read the value
  if (_ms_rx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_e, 0, 3))
      return k_error;
  _status0 = _ms_register_rd(ms_rx_db_lsb);
  _status1 = _ms_register_rd(ms_rx_db_msb);
  trace2(0, ms, 110, "_status0:%02X _status1:%02X", _status0, _status1);
  return k_success;
}

//+-----------------------------------------------------------------------------
// Name:
//   ms_write_parm_reg
//
// Declaration:
//   t_result ms_write_parm_reg(uint8 sys_parm, uint8 cmd_parm);
//
// Purpose:
//   Write the parameter registers of the MS card in preparation for issuing a
//   flash command.
//
// Arguments:
//   sys_parm - specific to the flash command about to be issued.
//   cmd_parm - specific to the flash command about to be issued.
//
//   The following global variables are accessed and delivered to the MS card:
//     g_ms_blk_addr_msb
//     g_ms_blk_addr_mid
//     g_ms_blk_addr_lsb
//     g_ms_page
//
// Return:
//   A t_result indicating:
//     k_success - parameter registers are written.
//     k_error   - failed write parameter registers.  actual contents unknown.
//
// Notes:
//   This is a FUNCTION, not a DFA.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_write_parm_reg(uint8 sys_parm,
                           uint8 cmd_parm) reentrant;
t_result ms_write_parm_reg(uint8 sys_parm,
                           uint8 cmd_parm) reentrant
{
  trace0(0, ms, 0, "ms_write_parm_reg()");
  //_stack_check();
  trace3(0, ms, 0, " mwpr - addr:0x00%02X%02X%02X", g_ms_blk_addr_msb, g_ms_blk_addr_mid, g_ms_blk_addr_lsb);
  trace3(0, ms, 0, " mwpr - page:0x%02X sys_parm:0x%02X cmd_parm:0x%02X", g_ms_page, sys_parm, cmd_parm);
  if (k_success != ms_set_write_reg_addrs(k_ms_parm_system, 6))
    return k_error;
  // write the tpc
  if (k_success != ms_set_tpc(k_ms_tpc_wr_reg, 6))
    return k_error;
  // write the parm regs
  _ms_register_wr(ms_tx_db_msb, g_ms_blk_addr_msb);
  _ms_register_wr(ms_tx_db_lsb, sys_parm);
  if (!_ms_tx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_t_buf_e, ms_fifo_stat_t_buf_e, 3))
      return k_error;
  _ms_register_wr(ms_tx_db_msb, g_ms_blk_addr_lsb);
  _ms_register_wr(ms_tx_db_lsb, g_ms_blk_addr_mid);
  if (!_ms_tx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_t_buf_e, ms_fifo_stat_t_buf_e, 3))
      return k_error;
  _ms_register_wr(ms_tx_db_msb, g_ms_page);
  _ms_register_wr(ms_tx_db_lsb, cmd_parm);
  if (!_ms_tx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_t_buf_e, ms_fifo_stat_t_buf_e, 3))
      return k_error;
  return k_success;
}

//+-----------------------------------------------------------------------------
// Name:
//   ms_read_extra_data_reg
//
// Declaration:
//   t_result ms_read_extra_data_reg(void);
//
// Purpose:
//   Read the extra data registers of the active block of the MS card into
//   the global variable g_ms_extra.  This is the lowest level, after the command
//   has been issued.  (Several command handlers must access the extra data).
//
// Arguments:
//   None.
//
// Return:
//   A t_result indicating:
//     k_success - the global variable g_ms_extra contains the results.
//     k_error   - cannot obtain the extra data.
//                 contents of g_ms_extra undefined.
//
// Notes:
//   This is a FUNCTION, not a DFA.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_read_extra_data_reg(void) reentrant;
t_result ms_read_extra_data_reg() reentrant
{
  trace0(0, ms, 0, "ms_read_extra_data_reg()");
  //_stack_check();
  // set the address
  if (k_success != ms_set_read_reg_addrs(k_ms_ext_ovwr_flg, 4))
    return k_error;
  // write the tpc
  if (k_success != ms_set_tpc(k_ms_tpc_rd_reg, 4))
    return k_error;
  // read the value
  if (_ms_rx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_e, 0, 3))
      return k_error;
  g_ms_extra[0] = _ms_register_rd(ms_rx_db_lsb);
  g_ms_extra[1] = _ms_register_rd(ms_rx_db_msb);
  if (_ms_rx_data_fifo_is_empty())
    if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_e, 0, 3))
      return k_error;
  g_ms_extra[2] = _ms_register_rd(ms_rx_db_lsb);
  g_ms_extra[3] = _ms_register_rd(ms_rx_db_msb);
  trace4(0, ms, 0, "rd xtra[0..3]:%02X%02X%02X%02X", g_ms_extra[0], g_ms_extra[1], g_ms_extra[2], g_ms_extra[3]);
  return k_success;
}

//+-----------------------------------------------------------------------------
// Name:
//   ms_read_extra_data
//
// Declaration:
//   t_result ms_read_extra_data(void);
//
// Purpose:
//   Read the extra data registers of the active block of the MS card into
//   the global variable g_ms_extra.
//
// Arguments:
//   None.
//
// Return:
//   A t_result indicating:
//     k_success - the global variable g_ms_extra contains the results.
//     k_error   - cannot obtain the extra data.
//                 contents of g_ms_extra undefined.
//
// Notes:
//   This is a FUNCTION, not a DFA.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_read_extra_data() reentrant
{
  trace4(0, ms, 0, "ms_read_extra_data(addr:0x00%02X%02X%02X page:%d)", g_ms_blk_addr_msb, g_ms_blk_addr_mid, g_ms_blk_addr_lsb, g_ms_page);
  //_stack_check();
  if (k_success != ms_write_parm_reg(0x80, 0x40))
    return k_error;
  if (k_success != ms_set_cmd(k_ms_block_read))
    return k_error;
  if (k_success != ms_get_int(5))
    return k_error;
  if (_factor & kbm_ms_reg_int_cmdnk)
  {
    trace0(0, err, 110, "error: cmdnk (ms_read_extra_data)");
    return k_error;
  }
  if (!(_factor & kbm_ms_reg_int_ced))
  {
    trace0(0, err, 110, "error: ced not set (ms_read_extra_data)");
    return k_error;
  }
  if (_factor & kbm_ms_reg_int_err)
  {
    trace0(0, err, 110, "error: err (ms_read_extra_data)");
    if (k_success != ms_read_status())
      return k_error;
//    if ((_status1 & (kbm_ms_reg_status1_ucex |kbm_ms_reg_status1_ucfg)) ==
//        (kbm_ms_reg_status1_ucex |kbm_ms_reg_status1_ucfg))
    if (_status1 & (kbm_ms_reg_status1_ucex |kbm_ms_reg_status1_ucfg))
    {
      trace0(0, err, 110, "error: ucex|ucfg - uncorrectable flash read error (ms_read_extra_data)");
      //ms_media_set_phyblock_failed();
      return k_error;
    }
  }
  // read the extra data registers
  if (k_success != ms_read_extra_data_reg())
    return k_error;
  return k_success;
}

//+-----------------------------------------------------------------------------
// Name:
//   ms_read_page_data
//
// Declaration:
//   t_result ms_read_page_data(uint8 pnr);
//
// Purpose:
//   Read a page (512 byte disk sector) from the MS card via pio and store the data
//   into either a packet buffer or an xdata buffer. (Lowest level, callable from
//   multple command handlers, as necessary.)
//
// Arguments:
//   pnr - the packet buffer number.  any value greater than or equal to k_max_pnr
//   will cause the data to be stored into xdata at _media_data(sector_buffer).
//
// Return:
//   A t_result indicating:
//     k_success - data read and stored.
//     k_error   - cannot read data.
//                 contents of target buffer undefined.
//
// Notes:
//   This is a FUNCTION, not a DFA.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_read_page_data(uint8 pnr) reentrant;
t_result ms_read_page_data(uint8 pnr) reentrant
{
  uint16 i;

  trace1(0, ms, 0, "ms_read_page_data(pnr:%d)", pnr);
  //_stack_check();
  // write the tpc
  if (k_success != ms_set_tpc(k_ms_tpc_rd_page_data |0x02, 0))
    return k_error;
  // read the data
  if (pnr < k_max_pnr)
  {
    _mcu_register_wr(x_sram_addr_lo, k_pkt_addrlo[pnr]);
    _mcu_register_wr(x_sram_addr_hi, k_pkt_addrhi[pnr]);
    // there are always 256 words of device data
#if 1 // opt for improved code density over execution speed since only called on insertion
    for (i=0; i<256; i++)
    {
      if (_ms_rx_data_fifo_is_empty())
        if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_e, 0, 3))
          return k_error;
      x_sram_data = _ms_register_rd(ms_rx_db_lsb);
      x_sram_data = _ms_register_rd(ms_rx_db_msb);
    }
#else // unrolled loop is a little faster, but eats more code space
    for (i=0; i<64; i++)
    {
      if (!_ms_rx_data_fifo_is_full())
        if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_f, ms_fifo_stat_r_buf_f, 10))
          return k_error;
      x_sram_data = _ms_register_rd(ms_rx_db_lsb);
      x_sram_data = _ms_register_rd(ms_rx_db_msb);
      x_sram_data = _ms_register_rd(ms_rx_db_lsb);
      x_sram_data = _ms_register_rd(ms_rx_db_msb);
      x_sram_data = _ms_register_rd(ms_rx_db_lsb);
      x_sram_data = _ms_register_rd(ms_rx_db_msb);
      x_sram_data = _ms_register_rd(ms_rx_db_lsb);
      x_sram_data = _ms_register_rd(ms_rx_db_msb);
    }
#endif
  }
  else
  {
    uint8 xdata* bufp = _media_data(sector_buffer);

    // there are always 256 words of device data
#if 1 // opt for improved code density over execution speed since only called on insertion
    for (i=0; i<256; i++)
    {
      if (_ms_rx_data_fifo_is_empty())
        if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_e, 0, 3))
          return k_error;
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
    }
#else // unrolled loop is a little faster, but eats more code space
    #if 0
    for (i=0; i<64; i++)
    {
      if (!_ms_rx_data_fifo_is_full())
        if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_f, ms_fifo_stat_r_buf_f, 10))
          return k_error;
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
    }
    #else // unroll it more
    for (i=0; i<32; i++)
    {
      if (!_ms_rx_data_fifo_is_full())
        if (k_success != ms_wait_fifo_with_timeout(ms_fifo_stat_r_buf_f, ms_fifo_stat_r_buf_f, 10))
          return k_error;
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
      *bufp++ = _ms_register_rd(ms_rx_db_lsb);
      *bufp++ = _ms_register_rd(ms_rx_db_msb);
    }
    #endif
#endif
  }
  return k_success;
}

//+-----------------------------------------------------------------------------
// Name:
//   ms_pio_read_page
//
// Declaration:
//   t_result ms_pio_read_page(uint8 pnr);
//
// Purpose:
//   Read a page (512 byte disk sector) from the MS card via pio and store the data
//   into either a packet buffer or an xdata buffer.
//
// Arguments:
//   pnr - the packet buffer number.  any value greater than or equal to k_max_pnr
//   will cause the data to be stored into xdata at _media_data(sector_buffer).
//
// Return:
//   A t_result indicating:
//     k_success - data read and stored.
//     k_error   - cannot read data.
//                 contents of target buffer undefined.
//
// Notes:
//   This is a FUNCTION, not a DFA.
//
// Since:
//   fmc-1.0
//------------------------------------------------------------------------------
t_result ms_pio_read_page(uint8 pnr) reentrant
{

⌨️ 快捷键说明

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