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