📄 u_idle.c
字号:
/******************************************************************************
* File name : idle.c
* Module name : main polling loop module
* Author : Hiromichi.Kondo
*-----------------------------------------------------------------------------
* $Id: idle.c,v 1.2 2003/04/16 10:16:33 9551619 Exp $
*****************************************************************************/
#include "c33l17.h"
#include "u_value.h"
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"
#include "usbmedia.h"
#ifdef EVENT_ON
#include "evt.h"
#include "system.h"
extern pEvtList sysEvtList;
#endif
int (*fnUSBUserCall)(unsigned int);
/*--- Function Prototype ---------------------------------------------------*/
void USB_MON_Proc(void);
void Attach_ev(void);
void Detach_ev(void);
void SpecialProc(void);
void IntStatusCheck(void);
void EPrIntStatusCheck(void);
/*****************************************************************************
* USB_MON_Proc
*****************************************************************************/
void USB_MON_Proc(void)
{
if( VBUSCheck() == VBUS_CONNECT )
{
if(vbus_on_1st == 0)
{
if ( fnUSBUserCall(VBUS_CONNECT) == 1)
{
T_MEDIA_INFO tInfo;
#ifdef EVENT_ON
Evt evt = { EVT_USB, USB_CONNECTED, 0L };
list_Append (sysEvtList, evt);
#endif
media_GetInfo( &tInfo );
last_lba = tInfo.ulSecCnt ;
sram_start_addr = (unsigned int)&usb_wk_buf[0];
timer3_SetCRxB(0xba0);
AttachProc(); /* USB attach process */
vbus_on_1st = 1;
}
}
if(vbus_on_1st == 1)
{
SpecialProc(); /* Special process */
USBProc(); /* USB process */
DeviceProc(); /* Device process */
IntStatusCheck(); /* Int status check */
}
}
else
{
if(vbus_on_1st == 1)
{
if ( fnUSBUserCall(VBUS_NOT_CONNECT) == 1)
{
#ifdef EVENT_ON
Evt evt = { EVT_USB, USB_DISCONNECT, 0L };
list_Append (sysEvtList, evt);
#endif
}
timer3_SetCRxB(0x3a20);
DetachProc(); /* Detach */
vbus_on_1st = 0;
}
}
}
/*****************************************************************************
* SpecialProc
*****************************************************************************/
void SpecialProc(void)
{
if( DIRECT_B(special_flag) )
{
if( special_flag.Reset ) /* Reset */
USBResetProc();
if( special_flag.Suspend ) /* Suspend */
SuspendResumeProc();
}
}
/*****************************************************************************
* IntStatusCheck
*****************************************************************************/
void IntStatusCheck(void)
{
unsigned char vbus_state;
di(); /* CPU */
if( main_int_stat.SIE_IntStat )
{
/* SIE */
if( sie_int_stat.VBUS_Changed )
{
/* VBUS */
vbus_state = VBUSCheck();
if(vbus_state == VBUS_NOT_CONNECT)
{
/* Detach */
special_flag.Detach = 1;
DIRECT_B(main_int_stat) = 0x00; /* Main */
}
}
else
{
if( sie_int_stat.DetectRESET )
{
/* USB Reset */
special_flag.Reset = 1;
DIRECT_B(main_int_stat) = 0x00; /* Main */
}
else
{
if( sie_int_stat.DetectSUSPEND )
{
/* */
special_flag.Suspend = 1;
DIRECT_B(main_int_stat) = 0x00; /* Main */
}
}
}
if( sie_int_stat.SetAddressCmp )
{ /* SetAddressCmp */
if( rUSB_Address_BP.USB_Address == 0x00 )
{ /* Default State */
usb_state = DEFAULT_STATE;
}
else
{ /* Address State */
usb_state = ADDRESS_STATE;
}
}
DIRECT_B(sie_int_stat) = 0x00;
}
if( main_int_stat.FIFO_IntStat )
{ /* FIFO */
if( fifo_int_stat.DescriptorCmp )
{ /* DescriptorCmp */
control_result = DESCRIPTOR_CMP;
}
if( fifo_int_stat.FIFO_IN_Cmp )
{ /* FIFO_IN_Cmp */
bulk_in_result = FIFO_IN_CMP;
}
if( fifo_int_stat.FIFO_OUT_Cmp )
{ /* FIFO_OUT_Cmp */
bulk_out_result = FIFO_OUT_CMP;
}
}
if( main_int_stat.EP0IntStat )
{ /* EP0 */
DIRECT_B(ep0_int_stat) = DIRECT_B(ep0_int_stat) & rEP0IntEnb;
if( ep0_int_stat.IN_TranErr )
{
control_result = EP0_IN_ERR;
}
if( ep0_int_stat.OUT_TranErr )
{
control_result = EP0_OUT_ERR;
}
if( ep0_int_stat.IN_TranACK )
{
control_result = EP0_IN_ACK;
}
if( ep0_int_stat.OUT_TranACK )
{
control_result = EP0_OUT_ACK;
}
DIRECT_B(ep0_int_stat) = 0x00; /* EP0 */
}
if( main_int_stat.EPrIntStat )
{ /* EPr */
EPrIntStatusCheck(); /* EPr */
}
if(rMainIntStat_BP.RcvEP0SETUP)
{ /* SETUP */
usb_flag.USBReqRcvd = 1;
}
DIRECT_B(main_int_stat) = 0x00;
ei(); /* CPU */
}
/*****************************************************************************
* EPrIntStatusCheck
*****************************************************************************/
void EPrIntStatusCheck(void)
{
if( epr_int_stat.EPaIntStat )
{ /* EPa */
if( bulk_in_result != FIFO_IN_CMP )
{
DIRECT_B(epa_int_stat) = DIRECT_B(epa_int_stat) & rEPaIntEnb;
if( epa_int_stat.IN_TranErr )
{
bulk_in_result = EPX_IN_ERR;
}
if( epa_int_stat.OUT_TranErr )
{
bulk_in_result = EPX_OUT_ERR;
}
if( epa_int_stat.IN_TranACK )
{
bulk_in_result = EPX_IN_ACK;
}
if( epa_int_stat.OUT_TranACK )
{
bulk_in_result = EPX_OUT_ACK;
}
}
DIRECT_B(epa_int_stat) = 0x00; /* EPa */
}
if( epr_int_stat.EPbIntStat )
{ /* EPb */
if( bulk_out_result != FIFO_OUT_CMP )
{
DIRECT_B(epb_int_stat) = DIRECT_B(epb_int_stat) & rEPbIntEnb;
if( epb_int_stat.IN_TranErr )
{
bulk_out_result = EPX_IN_ERR;
}
if( epb_int_stat.OUT_TranErr )
{
bulk_out_result = EPX_OUT_ERR;
}
if( epb_int_stat.IN_TranACK )
{
bulk_out_result = EPX_IN_ACK;
}
if( epb_int_stat.OUT_TranACK )
{
bulk_out_result = EPX_OUT_ACK;
}
}
DIRECT_B(epb_int_stat) = 0x00; /* EPb */
}
if( epr_int_stat.EPcIntStat )
{ /* EPc */
DIRECT_B(epc_int_stat) = DIRECT_B(epc_int_stat) & rEPcIntEnb;
if( epc_int_stat.IN_TranErr )
{
int_in_result = EPX_IN_ERR;
}
if( epc_int_stat.OUT_TranErr )
{
int_in_result = EPX_OUT_ERR;
}
if( epc_int_stat.IN_TranACK )
{
int_in_result = EPX_IN_ACK;
}
if( epc_int_stat.OUT_TranACK )
{
int_in_result = EPX_OUT_ACK;
}
DIRECT_B(epc_int_stat) = 0x00; /* EPc */
}
DIRECT_B(epr_int_stat) = 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -