📄 device_new.c
字号:
TRACE0(65, dev, 1, "--(k_irq_nak2rx)");
// set our usr synchronizer, knl isr auto-masked the nak irq
thread_set_sync(g_ix_dev_thread, kbm_sync_outnak);
return k_ignored;
case k_irq_nak2tx: // external5
TRACE0(66, dev, 1, "--(k_irq_nak2tx)");
// set our usr synchronizer, knl isr auto-masked the nak irq
thread_set_sync(g_ix_dev_thread, kbm_sync_innak);
return k_ignored;
case k_irq_usb_reset:
TRACE0(67, dev, 1, "--(k_irq_usb_reset)");
case k_irq_usb_stat_reset: // external0/x_usb_stat
// indicates that a usb reset has been detected
//TRACE0(95, dev, 1, "--(k_irq_usb_stat_reset)");
// don't disturb the mscbot thread if we aren't even enumerated yet
// because its probably initializing the drive still
if (dev_rd_most_recent_config())
{
// make sure to clear it so next reset during re-enum
// will not keep continually resetting the mcu.
dev_wr_most_recent_config(0);
TRACE0(68, dev, 1, "setting reset synch because configuration is set");
thread_set_sync(g_ix_dev_thread, kbm_sync_usbrst);
}
return k_ignored;
case k_irq_blk_xfer_complete: // external 0
TRACE0(69, dev, 1, "--(k_irq_blk_xfer_complete)");
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_blk);
x_imr0 |= kbm_isr0_blk_xfer_complete; //!!! persistent???
return k_success;
case k_irq_fmc: // external0
TRACE0(70, dev, 1, "--(k_irq_fmc)");
// may have to expand this function to decide _who_ interrupted us at this point
// by checking on who is currently in control of the mux
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_irq);
x_imr0 |= kbm_isr0_fmc_irq;
return k_success;
case k_irq_fmc_cfc_dev_err: // cfc_stat
TRACE0(71, dev, 1, "--(k_irq_fmc_cfc_dev_err)");
return k_success;
case k_irq_fmc_iordy_err: // cfc_stat
TRACE0(72, dev, 1, "--(k_irq_fmc_iordy_err)");
return k_success;
case k_irq_fmc_cfc_intrq: // cfc_stat
TRACE0(73, dev, 1, "--(k_irq_fmc_cfc_intrq)");
return k_success;
case k_irq_fmc_cfc_xrdy: // cfc_stat
TRACE0(74, dev, 1, "--(k_irq_fmc_cfc_xrdy)");
return k_success;
case k_irq_fmc_cfc_rrdy: // cfc_stat
TRACE0(75, dev, 1, "--(k_irq_fmc_cfc_rrdy)");
return k_success;
case k_irq_fmc_sm_ecc_err_d_a: // smc_stat
TRACE0(76, dev, 1, "--(k_irq_fmc_sm_ecc_err_d_a)");
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_blk);
return k_success;
case k_irq_fmc_sm_ecc_err_d_b: // smc_stat
TRACE0(77, dev, 1, "--(k_irq_fmc_sm_ecc_err_d_b)");
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_blk);
return k_success;
case k_irq_fmc_sm_ecc_err_c_a: // smc_stat
TRACE0(78, dev, 1, "--(k_irq_fmc_sm_ecc_err_c_a)");
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_blk);
return k_success;
case k_irq_fmc_sm_ecc_err_c_b: // smc_stat
TRACE0(79, dev, 1, "--(k_irq_fmc_sm_ecc_err_c_b)");
thread_set_sync(g_ix_dev_thread, kbm_sync_fmc_blk);
return k_success;
case k_irq_fmc_sm_rdy: // smc_stat
TRACE0(80, dev, 1, "--(k_irq_fmc_sm_rdy)");
return k_success;
case k_irq_fmc_msc_rdy: // msc_stat
TRACE0(81, dev, 1, "--(k_irq_fmc_msc_rdy)");
return k_success;
case k_irq_fmc_msc_sif_int: // msc_stat
TRACE0(82, dev, 1, "--(k_irq_fmc_msc_sif_int)");
return k_success;
case k_irq_fmc_msc_drq: // msc_stat
TRACE0(83, dev, 1, "--(k_irq_fmc_msc_drq)");
return k_success;
case k_irq_fmc_msc_crc_err: // msc_stat
TRACE0(84, dev, 1, "--(k_irq_fmc_msc_crc_err)");
return k_success;
case k_irq_fmc_msc_timeout_err: // msc_stat
TRACE0(85, dev, 1, "--(k_irq_fmc_msc_timeout_err)");
return k_success;
case k_irq_fmc_sdc_crc_err: // sdc_stat
TRACE0(86, dev, 1, "--(k_irq_fmc_sdc_crc_err)");
//set the abort sync, so that we can exit immediately from wait_xxx_timeout functions
thread_set_sync(g_ix_dev_thread, kbm_sync_abort);
// mask the intrrupt so it doesn't disturb us
irq_control(k_irq_fmc_sdc_crc_err, kbm_irqctl_clear |kbm_irqctl_mask);
return k_success;
case k_irq_fmc_sdc_crd_rdy: // sdc_stat
TRACE0(87, dev, 1, "--(k_irq_fmc_sdc_crd_rdy)");
return k_success;
case k_irq_fmc_sdc_rsp_rdy: // sdc_stat
TRACE0(88, dev, 1, "--(k_irq_fmc_sdc_rsp_rdy)");
return k_success;
case k_irq_fmc_sdc_cmd_rdy: // sdc_stat
TRACE0(89, dev, 1, "--(k_irq_fmc_sdc_cmd_rdy)");
return k_success;
case k_irq_fmc_sdc_flash_prg_err: // external0
TRACE0(90, dev, 1, "--(k_irq_fmc_sdc_flash_prg_err)");
//set the abort sync, so that we can exit immediately from wait_xxx_timeout functions
thread_set_sync(g_ix_dev_thread, kbm_sync_abort);
// mask the intrrupt so it doesn't disturb us
irq_control(k_irq_fmc_sdc_flash_prg_err, kbm_irqctl_clear |kbm_irqctl_mask);
return k_success;
case k_irq_cf_insert: // external2
TRACE0(91, dev, 1, "--(k_irq_cf_insert, media present, media unknown, media_changed)");
TRACE0(92, dev, 0, "_cf_pwr_on()") ;
_cf_pwr_on();
_inserted(k_lun_cf);
#ifdef k_pfm_led
_mcu_register_set_bits(x_gpiob_out, kbm_gpio13);
#endif
return k_ignored;
case k_irq_ms_insert: // external2
TRACE0(93, dev, 1, "--(k_irq_ms_insert, media present, media unknown, media_changed)");
_ms_pwr_on();
_inserted(k_lun_ms);
#ifdef k_pfm_led
_mcu_register_set_bits(x_gpiob_out, kbm_gpio12);
#endif
return k_ignored;
case k_irq_sm_insert: // external2
TRACE0(94, dev, 1, "--(k_irq_sm_insert, media present, media unknown, media_changed)");
_sm_pwr_on();
_inserted(k_lun_sm);
#ifdef k_pfm_led
_mcu_register_set_bits(x_gpiob_out, kbm_gpio14);
#endif
return k_ignored;
case k_irq_cf_eject: // external2
TRACE0(95, dev, 1, "--(k_irq_cf_eject, no media)");
TRACE0(96, dev, 0, "_cf_pwr_off()") ;
_cf_pwr_off();
_ejected(k_lun_cf);
#ifdef k_pfm_led
_mcu_register_clr_bits(x_gpiob_out, kbm_gpio13);
#endif
return k_ignored;
case k_irq_ms_eject: // external2
TRACE0(97, dev, 1, "--(k_irq_ms_eject, no media)");
_ms_pwr_off();
_ejected(k_lun_ms);
#ifdef k_pfm_led
_mcu_register_clr_bits(x_gpiob_out, kbm_gpio12);
#endif
return k_ignored;
case k_irq_sm_eject: // external2
TRACE0(98, dev, 1, "--(k_irq_sm_eject, no media)");
_sm_pwr_off();
_ejected(k_lun_sm);
#ifdef k_pfm_led
_mcu_register_clr_bits(x_gpiob_out, kbm_gpio14);
#endif
return k_ignored;
case k_irq_sd_insert_eject: // external2
_lun_map_log2phy(k_log_lun_sd, k_lun_sd);
// don't mask the interrupt back in here, dfa_sd_initialize() does it when its done.
TRACE0(99, dev, 1, "--(k_irq_sd_insert_eject)");
_lun_map_log2phy(k_log_lun_sd, k_lun_sd);
_mcu_register_clr_bits(x_crd_ps, kbm_crd_ps_sd |kbm_crd_ps_mmc);
#ifdef k_pfm_led
_mcu_register_clr_bits(x_gpiob_out, kbm_gpio15);
#endif
_inserted(k_lun_sd);
_inserted(k_lun_mmc);
return k_ignored;
case k_irq_fmc_err_sd_blk_ovrun: // external2
TRACE0(100, dev, 1, "--(k_irq_fmc_err_sd_blk_ovrun)");
//set the abort sync, so that we can exit immediately from wait_xxx_timeout functions
thread_set_sync(g_ix_dev_thread, kbm_sync_abort);
// mask the intrrupt so it doesn't disturb us
irq_control(k_irq_fmc_err_sd_blk_ovrun, kbm_irqctl_clear |kbm_irqctl_mask);
return k_ignored;
default:
return k_ignored;
}
// how'd we get here?
return k_error;
}
//------------------------------------------------------------------------------
// holds return values from dfa's, accessed via argp.
static t_result _result;
//+-----------------------------------------------------------------------------
// Name:
// media_changed1
//
// Declaration:
// void media_changed1(void);
//
// Purpose:
// Called once per lun per media change.
// Runs _dfa_lun_initialize_media
//
// Arguments:
// None.
// However, relies on g_active_lun.
// Activates on kbm_sync_create.
//
// Return:
// No return value.
// However, the DFA's argument pointer is written with a t_result indicating:
// k_success - command completed.
// k_usbrst - usb reset signalling was detected while executing the command.
// k_aborted - traffic occurred on the control pipe while wexecuting the command (probably a mass storage reset).
// k_timeout - a timeout limit exceeded while executing the command.
// (This allows the caller to see the return value, via the argp, after the DFA terminates).
//
// Notes:
// This is a STATE in a DFA, not a FUNCTION.
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
static void media_changed1(void) reentrant;
static void media_changed1() reentrant
{
TRACE0(101, dev, 0, "media_changed1()");
// check the results of _dfa_lun_reset_media...
if ((k_success == _result) && _lun_is_media_changed(g_active_lun))
{
// init media and return to dev_thread_wait_cbw
thread_run_dfa(_dfa_lun_initialize_media(g_active_lun), (void*) &_result, thread_end_dfa);
}
// reset failed, skip init, return to dev_thread_wait_cbw
thread_end_dfa();
}
//+-----------------------------------------------------------------------------
// Name:
// dfa_media_changed
//
// Declaration:
// void dfa_media_changed(void);
//
// Purpose:
// Run once per lun per media change.
// Runs _dfa_lun_reset_media
//
// Arguments:
// None.
// However, the physical lun number must be passed in the thread's argp field.
// Activates on kbm_sync_create.
//
// Return:
// No return value.
// However, the DFA's argument pointer is written with a t_result indicating:
// k_success - command completed.
// k_usbrst - usb reset signalling was detected while executing the command.
// k_aborted - traffic occurred on the control pipe while wexecuting the command (probably a mass storage reset).
// k_timeout - a timeout limit exceeded while executing the command.
// (This allows the caller to see the return value, via the argp, after the DFA terminates).
// g_active_lun is modified here.
//
// Notes:
// This is a DFA, not a FUNCTION.
//
// Since:
// fmc-1.0
//------------------------------------------------------------------------------
static void dfa_media_changed(void) reentrant;
static void dfa_media_changed() reentrant
{
TRACE0(102, dev, 0, "dfa_media_changed()");
thread_clr_sync(kbm_sync_create);
TRACE1(103, dev, 0, "establish lun %d", g_active_lun);
thread_run_dfa(_dfa_lun_reset_media(g_active_lun), (void*) &_result, media_changed1);
}
//------------------------------------------------------------------------------
// Activates on kbm_sync_create.
//------------------------------------------------------------------------------
static void dev_thread_wait_csw() reentrant
{
TRACE0(104, dev, 0, "dev_thread_wait_csw()");
fgnd_hpbot_wait_status_start(_result);
thread_yield_ex2(kbm_sync_cbw, dev_thread_wait_cbw);
}
//------------------------------------------------------------------------------
// Activates on kbm_sync_cbw.
//------------------------------------------------------------------------------
static void dev_thread_wait_cbw() reentrant
{
uint8 media;
TRACE0(105, dev, 0, "dev_thread_wait_cbw()");
_lun_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -