?? usb_task.c
字號:
#elif ((USB_DEVICE_FEATURE == DISABLE)&& (USB_HOST_FEATURE == ENABLED))
usb_host_task();
// -----------------------------------------------------------------------------
//! ---- ERROR, NO MODE ENABLED -------------------------------------------------
#elif ((USB_DEVICE_FEATURE == DISABLE)&& (USB_HOST_FEATURE == DISABLE))
#error at least one of USB_DEVICE_FEATURE or USB_HOST_FEATURE should be enabled
#error otherwise the usb task has nothing to do ...
#endif
// -----------------------------------------------------------------------------
}
//! @brief USB interrupt subroutine
//!
//! This function is called each time a USB interrupt occurs.
//! The following USB DEVICE events are taken in charge:
//! - VBus On / Off
//! - Start Of Frame
//! - Suspend
//! - Wake-Up
//! - Resume
//! - Reset
//! - Start of frame
//!
//! The following USB HOST events are taken in charge:
//! - Device connection
//! - Device Disconnection
//! - Start Of Frame
//! - ID pin change
//! - SOF (or Keep alive in low speed) sent
//! - Wake up on USB line detected
//!
//! For each event, the user can launch an action by completing
//! the associate define (See conf_usb.h file to add action upon events)
//!
//! Note: Only interrupts events that are enabled are processed
//!
//! @param none
//!
//! @return none
#ifdef AVRGCC
ISR(USB_GEN_vect)
#else
#pragma vector = USB_GENERAL_vect
__interrupt void usb_general_interrupt()
#endif
{
#if (USB_HOST_PIPE_INTERRUPT_TRANSFER == ENABLE)
U8 i;
U8 save_pipe_nb;
#endif
// ---------- DEVICE events management -----------------------------------
#if (USB_DEVICE_FEATURE == ENABLED)
//- VBUS state detection
if (Is_usb_vbus_transition() && Is_usb_vbus_interrupt_enabled())
{
Usb_ack_vbus_transition();
if (Is_usb_vbus_high())
{
usb_connected = TRUE;
Usb_vbus_on_action();
Usb_send_event(EVT_USB_POWERED);
Usb_enable_reset_interrupt();
usb_start_device();
Usb_attach();
}
else
{
Usb_vbus_off_action();
usb_connected = FALSE;
usb_configuration_nb = 0;
Usb_send_event(EVT_USB_UNPOWERED);
}
}
// - Device start of frame received
if (Is_usb_sof() && Is_sof_interrupt_enabled())
{
Usb_ack_sof();
Usb_sof_action();
}
// - Device Suspend event (no more USB activity detected)
if (Is_usb_suspend() && Is_suspend_interrupt_enabled())
{
Usb_ack_suspend();
Usb_enable_wake_up_interrupt();
Usb_ack_wake_up(); // clear wake up to detect next event
Usb_freeze_clock();
Usb_send_event(EVT_USB_SUSPEND);
Usb_suspend_action();
}
// - Wake up event (USB activity detected): Used to resume
if (Is_usb_wake_up() && Is_swake_up_interrupt_enabled())
{
Usb_unfreeze_clock();
Usb_ack_wake_up();
Usb_disable_wake_up_interrupt();
Usb_wake_up_action();
Usb_send_event(EVT_USB_WAKE_UP);
}
// - Resume state bus detection
if (Is_usb_resume() && Is_resume_interrupt_enabled())
{
Usb_disable_wake_up_interrupt();
Usb_ack_resume();
Usb_disable_resume_interrupt();
Usb_resume_action();
Usb_send_event(EVT_USB_RESUME);
}
// - USB bus reset detection
if (Is_usb_reset()&& Is_reset_interrupt_enabled())
{
Usb_ack_reset();
usb_init_device();
Usb_reset_action();
Usb_send_event(EVT_USB_RESET);
}
#endif// End DEVICE FEATURE MODE
// ---------- HOST events management -----------------------------------
#if (USB_HOST_FEATURE == ENABLED && USB_DEVICE_FEATURE == ENABLED)
// - ID pin change detection
if(Is_usb_id_transition()&&Is_usb_id_interrupt_enabled())
{
if(Is_usb_id_device())
{ g_usb_mode=USB_MODE_DEVICE;}
else
{ g_usb_mode=USB_MODE_HOST;}
Usb_ack_id_transition();
if( g_usb_mode != g_old_usb_mode) // Basic Debounce
{
if(Is_usb_id_device()) // Going to device mode
{
Usb_send_event(EVT_USB_DEVICE_FUNCTION);
}
else // Going to host mode
{
Usb_send_event(EVT_USB_HOST_FUNCTION);
}
Usb_id_transition_action();
LOG_STR_CODE(log_id_change);
#if ( ID_PIN_CHANGE_GENERATE_RESET == ENABLE)
// Hot ID transition generates wdt reset
#ifndef AVRGCC
Wdt_change_16ms(); while(1);
#else
Wdt_change_enable(); while(1);
#endif
#endif
}
}
#endif
#if (USB_HOST_FEATURE == ENABLED)
// - The device has been disconnected
if(Is_device_disconnection() && Is_host_device_disconnection_interrupt_enabled())
{
host_disable_all_pipe();
Host_ack_device_disconnection();
device_state=DEVICE_DISCONNECTED;
Usb_send_event(EVT_HOST_DISCONNECTION);
LOG_STR_CODE(log_device_disconnect);
Host_device_disconnection_action();
}
// - Device connection
if(Is_device_connection() && Is_host_device_connection_interrupt_enabled())
{
Host_ack_device_connection();
host_disable_all_pipe();
Host_device_connection_action();
}
// - Host Start of frame has been sent
if (Is_host_sof() && Is_host_sof_interrupt_enabled())
{
Host_ack_sof();
Usb_send_event(EVT_HOST_SOF);
private_sof_counter++;
// delay timeout management for interrupt tranfer mode in host mode
#if ((USB_HOST_PIPE_INTERRUPT_TRANSFER==ENABLE) && (TIMEOUT_DELAY_ENABLE==ENABLE))
if (private_sof_counter>=250) // Count 1/4 sec
{
private_sof_counter=0;
for(i=0;i<MAX_EP_NB;i++)
{
if(it_pipe_str[i].enable==ENABLE)
{
save_pipe_nb=Host_get_selected_pipe();
Host_select_pipe(i);
if((++it_pipe_str[i].timeout>TIMEOUT_DELAY) && (Host_get_pipe_type()!=TYPE_INTERRUPT))
{
it_pipe_str[i].enable=DISABLE;
it_pipe_str[i].status=PIPE_DELAY_TIMEOUT;
Host_stop_pipe_interrupt(i);
if (is_any_interrupt_pipe_active()==FALSE) // If no more transfer is armed
{
if (g_sav_int_sof_enable==FALSE)
{
Host_disable_sof_interrupt();
}
}
it_pipe_str[i].handle(PIPE_DELAY_TIMEOUT,it_pipe_str[i].nb_byte_processed);
}
Host_select_pipe(save_pipe_nb);
}
}
}
#endif // (USB_HOST_PIPE_INTERRUPT_TRANSFER==ENABLE) && (TIMEOUT_DELAY_ENABLE==ENABLE))
Host_sof_action();
}
// - Host Wake-up has been received
if (Is_host_hwup() && Is_host_hwup_interrupt_enabled())
{
Host_disable_hwup_interrupt(); // Wake up interrupt should be disable host is now wake up !
// CAUTION HWUP can be cleared only when USB clock is active (not frozen)!
Pll_start_auto(); // First Restart the PLL for USB operation
Wait_pll_ready(); // Get sure pll is lock
Usb_unfreeze_clock(); // Enable clock on USB interface
Host_ack_hwup(); // Clear HWUP interrupt flag
Usb_send_event(EVT_HOST_HWUP); // Send software event
Host_hwup_action(); // Map custom action
}
#endif // End HOST FEATURE MODE
}
extern void suspend_action(void)
{
Enable_interrupt();
Enter_power_down_mode();
}
extern void host_suspend_action(void)
{
//Enter_power_down_mode(); //For example...
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -