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

📄 device_new.c

📁 <B>SMSC USB2.0 Flash硬盘驱动源码</B>
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -