📄 ms.c
字号:
// 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 + -