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

📄 fmcdev.c

📁 u盘MCU端源代码,开发U盘的可以参考.
💻 C
📖 第 1 页 / 共 5 页
字号:
            return k_error;
        }
        return k_success;

#if defined(k_mcu_97FDC) || defined(k_mcu_97102)
    case k_hsd_usb_set_descriptor:    
        trace0(0, dev, 0, "RQ_SET_DESCRIPTOR");
        return k_error;

    case k_dsd_usb_get_configuration: 
        trace0(0, dev, 0, "RQ_GET_CONFIGURATION");
        // tell the data pump where to find it and how much there is 
        _payload_source(&g_usb_dev_cfg, 1);
        return k_success;
#endif

    case k_hsd_usb_set_configuration: 
        trace0(0, dev, 0, "RQ_SET_CONFIGURATION");
#ifdef k_20x_family
        if (*(uint8 *)(message_rd_arg(msgp)))
        {
            // config the gpios
//            x_gpioa_out = kbm_msk_gpioa_out_configured;
//            x_gpioa_dir = kbm_msk_gpioa_dir_configured; 
        } else
        {
            // config the gpios
//            x_gpioa_out = kbm_msk_gpioa_out_unconfigured;
//            x_gpioa_dir = kbm_msk_gpioa_dir_unconfigured; 
        }
#else
        // make sure it is in the supported range
        if (rqstp->wValueLo > g_fs_dev_dscr[k_usb_devdscrsz - 1])
            return k_error;
        // remember it
        g_usb_dev_cfg = rqstp->wValueLo;
        if (g_usb_dev_cfg)  // unconfigured -> configured
        {
            // config the gpios
            x_gpioa_out = kbm_msk_gpioa_out_configured;
            x_gpioa_dir = kbm_msk_gpioa_dir_configured; 
            // enable/disable endpoints, clear toggles, etc.
            endpoint_rx_enable(1);
            endpoint_tx_enable(2);
            //endpoint_rx_enable(2); // don't enable the endpoint here - wait until we are ready in ATAPI.c

            endpoint_clr_rx_toggle(1);
            endpoint_clr_tx_toggle(2);
        } else  // configured -> unconfigured
        {
            // config the gpios
            x_gpioa_out = kbm_msk_gpioa_out_unconfigured;
            x_gpioa_dir = kbm_msk_gpioa_dir_unconfigured; 
            // enable/disable endpoints, clear toggles, etc.
            endpoint_rx_disable(1);
            endpoint_tx_disable(2);
        }
#endif
        return k_success;

    case k_msg_source_payload:  
        // load some application specific data into a packet buffer
        // return k_in_progress if app expects to be supply at least one more packet's worth of data
        // return k_finished otherwise
        pnr = *(uint8 *)(message_rd_arg(msgp));
        pktsz = _min(g_data_len, k_maxpktsz);
        g_data_len -= pktsz;
        mmu_wr_pkt(0, pnr, g_source_addr, pktsz);
        g_source_addr += pktsz;
        trace2(0, dev, 0, "k_msg_source_payload - pnr:%d pktsz:%d", pnr, pktsz);
        return g_data_len ? k_in_progress : k_finished;

    case k_msg_sink_payload:  
        // unload data from a packet buffer and do something application specific with it
        // return k_in_progress if app can process this request
        // return k_finished otherwise
        pnr = *(uint8 *)(message_rd_arg(msgp));
#ifdef k_20x_family


//!!!watch out for this on sink pkts!!!!      ////////////////// pkt size s/b part of message!!!
        pktsz = x_ep0rx_bc;
#else                                                 
        pktsz = _min(g_data_len, k_maxpktsz);
#endif
        g_data_len -= pktsz;
        mmu_rd_pkt(pnr, pktsz, g_sink_addr);
        g_sink_addr += pktsz;
        return g_data_len ? k_in_progress : k_finished;

    default: 
        return k_error;
    }
    return k_error;
}
//------------------------------------------------------------------------------
// <<< DEVICE - INTERRUPT HANDLER >>>
// Target MCU: 
//  FDC, 102, 200
// Declaration: 
//  void dev_intr(void);
// Purpose: 
//  Handle interrupts.
// Arguments: 
//  intr - the interrupt that occurred. It is a number, not a bitmask.
// Return: 
//  k_ignored - causes default processing within the kernel isr
//  k_success - prevents default processing within the kernel isr
// Note:
//  This fuction is called from the kernel isrs.  Therefore it executes at 
//  interrupt level, not foreground level.  In this current version of the kernel,
//  all interrupts use register bank 0, the same as the foreground.  Thus,
//  other functions can be called from inside dev_intr() (as long as they are
//  either truly reentrant, or never called from the foreground).  But future
//  versions of the kernel may use alternate register banks... so it is wise
//  to avoid calling functions herein.  (Macros are ok, though...).
//  Do NOT yield from this routine.  It is NOT part of any thread.  It does 
//  not execute in an any thread's context.  Yielding from within this function 
//  will cause your firmware to flounder, panic, flail, and eventually expire.
// $$$
// TBD:
//  For the 200 this needs to be copied into executable ram by the kernel,
//  to execute from the "cache".  This has not been implemented yet, so watch
//  this space for updates.
//------------------------------------------------------------------------------
uint8 dev_intr(uint8 intr) reentrant using 1 
{
    trace1(0, dev, 1, "-(dev_intr(%d))", intr); 
    switch (intr)
    {


        // 200 interrupts
        //$$$ allow default processing for these
        // they are only included here to see tracepoints...
#ifdef k_20x_family
    case k_irq_usb_stat_ep2_err:      // external0/x_usb_stat
        // a token in the opposite direction inferred by the kbm_ep2_ctl_dir bit of x_ep2_ctl
        // i.e., an unexpected in or out token
        trace0(0, dev, 1, "--(k_irq_usb_stat_ep2_err)");
        return k_ignored;

    case k_irq_usb_stat_2dot0:        // external0/x_usb_stat
        // high speed signalling detected by the host
        trace0(0, dev, 1, "--(k_irq_usb_stat_2dot0)");
        return k_ignored;

    case k_irq_usb_stat_resume:       // external0/x_usb_stat
        // resume signaling detected.  only valid if the sie is in the suspend state
        // via bit kbm_sie_conf_suspend or register x_sie_conf
        trace0(0, dev, 1, "--(k_irq_usb_stat_resume)");
        return k_ignored;

    case k_irq_usb_stat_reset:        // external0/x_usb_stat
        // indicates that a usb reset has been detected
        trace0(0, dev, 1, "--(k_irq_usb_stat_reset)");
        return k_ignored;

    case k_irq_usberr_to:             // external0/x_usb_stat/x_usb_err
        // sof occurred before valid ack handshake from host on some ndp
        trace0(0, dev, 1, "--(k_irq_usberr_to)");
        return k_ignored;

    case k_irq_usberr_token:          // external0/x_usb_stat/x_usb_err
        // unexpected token received from host on some ndp
        trace0(0, dev, 1, "--(k_irq_usberr_token)");
        return k_ignored;

    case k_irq_usberr_ovrflw:         // external0/x_usb_stat/x_usb_err
        // ndp2 packet bigger than 512 bytes received,
        // or ndp0/1 packet bigger than 64 bytes received
        trace0(0, dev, 1, "--(k_irq_usberr_ovrflw)");
        return k_ignored;

    case k_irq_usberr_stall:          // external0/x_usb_stat/x_usb_err
        // received a token on some ndp while that ndp was stalled
        trace0(0, dev, 1, "--(k_irq_usberr_stall)");
        return k_ignored;

    case k_irq_usberr_dtog:           // external0/x_usb_stat/x_usb_err
        // bad toggle received on some endpoint
        trace0(0, dev, 1, "--(k_irq_usberr_dtog)");
        return k_ignored;

    case k_irq_usberr_bitstf:         // external0/x_usb_stat/x_usb_err
        // packet with bit stuff error received on some ndp
        trace0(0, dev, 1, "--(k_irq_usberr_bitstf)");
        return k_ignored;

    case k_irq_usberr_pid:            // external0/x_usb_stat/x_usb_err
        // packet with pid error received on some ndp
        trace0(0, dev, 1, "--(k_irq_usberr_pid)");
        return k_ignored;

    case k_irq_usberr_crc:            // external0/x_usb_stat/x_usb_err
        // packet with crc error received on some ndp
        trace0(0, dev, 1, "--(k_irq_usberr_crc)");
        return k_ignored;

    case k_irq_usb_setup:             // external0
        // a setup was received on ndp0
        trace0(0, dev, 1, "--(k_irq_usb_setup)");
        return k_ignored;

    case k_irq_fdc:                   // external0
        // interrupt from the fdc control block
        trace0(0, dev, 1, "--(k_irq_fdc)");
        return k_success;

        //$$$ these need to actually do something

    case k_irq_ata:                   // external0
        // interrupt from the ata control block
        trace0(0, dev, 1, "--(k_irq_ata)");
        //g_intr_cnt++ ;
        thread_set_sync(g_ix_ata_thread, kbm_sync_ata_irq);
        return k_success;

    case k_irq_ramrd_b:               // external0
        // current xfer FROM sram buffer B has completed
        trace0(0, dev, 1, "--(k_irq_ramrd_b)");

        thread_set_sync(g_ix_ata_thread, kbm_sync_usbtx); 
        return k_ignored;

    case k_irq_ramrd_a:               // external0
        // current xfer FROM sram buffer A has completed
        trace0(0, dev, 1, "--(k_irq_ramrd_a)");
        thread_set_sync(g_ix_ata_thread, kbm_sync_usbtx); 
        return k_ignored;

    case k_irq_ramwr_b:               // external0
        // current xfer TO sram buffer B has completed
        trace0(0, dev, 1, "--(k_irq_ramwr_b)");
        thread_set_sync(g_ix_ata_thread, kbm_sync_usbrx); 
        return k_ignored;

    case k_irq_ramwr_a:               // external0
        // current xfer TO sram buffer A has completed
        trace0(0, dev, 1, "--(k_irq_ramwr_a)");
        thread_set_sync(g_ix_ata_thread, kbm_sync_usbrx); 
        return k_ignored;

    case k_irq_usb_ep0zlp:                 // external1 
        // zero length packet received & ack'd on ndp0
        trace0(0, dev, 1, "--(k_irq_usb_ep0zlp)");
        return k_ignored;

    case k_irq_debug:                 // external1 
        // debug data transmitted through debug port (datagram style)
        trace0(0, dev, 1, "--(k_irq_debug)");
        return k_ignored;

        //$$$ allow default processing for these
        // they are only included here to see tracepoints...

    case k_irq_usb_ep1rx:             // external1 
        // packet received on ndp1
        trace0(0, dev, 1, "--(k_irq_usb_ep1rx)");
        return k_ignored;

    case k_irq_usb_ep1tx:             // external1 
        // packet transmitted (and ack came back) on ndp1
        trace0(0, dev, 1, "--(k_irq_usb_ep1tx)");
        return k_ignored;

    case k_irq_usb_ep0rx:             // external1 
        // packet received on ndp0
        trace0(0, dev, 1, "--(k_irq_usb_ep0rx)");
        return k_ignored;

    case k_irq_usb_ep0tx:             // external1 
        // packet transmitted (and ack came back) on ndp0
        trace0(0, dev, 1, "--(k_irq_usb_ep0tx)");
        return k_ignored;

    case k_irq_usb_suspend:           // external1
        // indicates that a usb suspend has been detected
        trace0(0, dev, 1, "--(k_irq_usb_suspend)");
        return k_ignored;

    case k_irq_usb_reset:             // external2 
        // usb reset detected
        trace0(0, dev, 1, "--(k_irq_usb_reset)");
        return k_ignored;

    case k_irq_usb_resume:            // external2
        // usn resume signaling detected
        trace0(0, dev, 1, "--(k_irq_usb_resume)");
        return k_ignored;

    case k_irq_external:              // external2
        // an external irq woke up the processor from sleep
        trace0(0, dev, 1, "--(k_irq_external)");
        return k_ignored;

    case k_irq_req_set_stall:         // external3
        // sie core processed request
        trace0(0, dev, 1, "--(k_irq_req_set_stall)");
        return k_ignored;

    case k_irq_req_clr_stall:         // external3

⌨️ 快捷键说明

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