📄 fw_task.c
字号:
if( (AT91F_UDPHS_EpGet( USBDEV_BASE_UDP, FW_EP_CTRL ) & AT91C_EPT_MAPPED) != AT91C_EPT_MAPPED )
{
TRACE_FATAL("\n\r PB FW_EP_CTRL\n\r");
for(;;);
}
// Endpoint type Bulk IN and Enable Endpoint
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_IN,
AT91C_EPT_SIZE_64 | AT91C_EPT_DIR_IN | AT91C_EPT_TYPE_BUL_EPT | AT91C_BK_NUMBER_1 );
if( (AT91F_UDPHS_EpGet( USBDEV_BASE_UDP, FW_EP_BULK_IN ) & AT91C_EPT_MAPPED) != AT91C_EPT_MAPPED )
{
TRACE_FATAL("\n\r PB FW_EP_BULK_IN\n\r");
for(;;);
}
// Endpoint type Bulk OUT and Enable Endpoint
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_OUT,
AT91C_EPT_SIZE_64 | AT91C_EPT_DIR_OUT | AT91C_EPT_TYPE_BUL_EPT | AT91C_BK_NUMBER_1 );
if( (AT91F_UDPHS_EpGet( USBDEV_BASE_UDP, FW_EP_BULK_OUT ) & AT91C_EPT_MAPPED) != AT91C_EPT_MAPPED )
{
TRACE_FATAL("\n\r PB FW_EP_BULK_OUT\n\r");
for(;;);
}
AT91F_UDPHS_CfgEnableEp( USBDEV_BASE_UDP, FW_EP_CTRL,
AT91C_NAK_OUT | AT91C_NAK_IN | AT91C_STALL_SENT_ERROR_CRC_ISO | AT91C_RX_SETUP_ERROR_FLOW_ISO
| AT91C_TX_COMPLETE | AT91C_RX_BK_RDY | AT91C_OVERFLOW_ERROR );
#endif
// Enable endpoint CTRL
AT91F_UDP_EnableEp( USBDEV_BASE_UDP, FW_EP_CTRL );
}
/****************************************/
/* (UDP) Endpoint 0 Interrupt : EP CTRL */
/****************************************/
if(_IT_reg_b1 & AT91C_UDP_EPINT0)
{
fw_ep0RxTxDone();
/* AT91C_UDP_EPINT1 : Endpoint 1 Interrupt */
/* AT91C_UDP_EPINT2 : Endpoint 2 Interrupt */
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT1 | AT91C_UDP_EPINT2 );
if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP )
{
AT91F_UDP_EpClear( USBDEV_BASE_UDP, FW_EP_CTRL, USBDEV_UDP_TXCOMP );
if(fw_AskValidateAddress)
{
fw_setAddressEnable(fw_AskValidateAddress);
fw_AskValidateAddress = 0;
}
}
/* traitement de la tache */
if((fw_deviceState & FW_DS_SETUP))
{
/* if we receive a setup process the command */
fw_deviceState &= ~FW_DS_SETUP;
fw_processCommand();
}
}
/*******************************************/
/* (UDP) Endpoint 1 Interrupt : EP BULK IN */
/*******************************************/
if(_IT_reg_b1 & AT91C_UDP_EPINT1)
{
/* we sent something */
/* transfer is already in progress */
/* don't mark it again, this INT can be due to a stall */
if( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_BULK_IN ) & USBDEV_UDP_TXCOMP )
{
AT91F_UDP_EpClear( USBDEV_BASE_UDP, FW_EP_BULK_IN, USBDEV_UDP_TXCOMP );
_IT_reg_b1 &= ~AT91C_UDP_EPINT1; /* clear interrupt BULK IN */
fw_mainTxDone();
}
}
/********************************************/
/* (UDP) Endpoint 2 Interrupt : EP BULK OUT */
/********************************************/
if(_IT_reg_b1 & AT91C_UDP_EPINT2)
{
_IT_reg_b1 &= ~AT91C_UDP_EPINT2; /* clear interrupt BULK OUT */
fw_mainRxDone();
}
/*****************************************/
/* (UDP) USB Resume Interrupt or WAKE_UP */
/*****************************************/
if( (_IT_reg_b1 & AT91C_UDP_RXRSM) ||(_IT_reg_b1 & AT91C_UDP_WAKEUP))
{
AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_PCK );
USB_EVENT |= USB_EVENT_MASK_RESUME;
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT );
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT );
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0 | AT91C_UDP_EPINT1
| AT91C_UDP_EPINT2 | AT91C_UDP_RXSUSP
| AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM
| AT91C_UDP_SOFINT | AT91C_UDP_WAKEUP );
#ifndef AT91SAM9265
/*************************************************************/
/* from AT91C_MASTER_CLOCK=32kHz to AT91C_MASTER_CLOCK=48MHz */
/*************************************************************/
#ifdef USE_LED
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_PWMC) );
#endif
AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_UDP );
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_UDP) );
#ifndef AT91SAM9265
AT91F_UDP_EnableTransceiver(USBDEV_BASE_UDP);
#endif
#if defined (AT91SAM9265) || defined (AT91SAM7A3)
#else
// Voltage regulator in normal mode : Disable VREG Low Power Mode
AT91F_VREG_Disable_LowPowerMode( AT91C_BASE_VREG );
#endif
// enable Main Oscillator
pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MOSCS ) );
AT91F_CKGR_CfgPLLReg( AT91C_BASE_CKGR,
((AT91C_CKGR_DIV & 0x0E) | // for certif
(AT91C_CKGR_PLLCOUNT & (28<<8)) |
(AT91C_CKGR_MUL & (0x48<<16))) |
AT91C_CKGR_USBDIV_1 );
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_LOCK ) );
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MCKRDY ) );
// AT91C_MASTER_CLOCK=SLCK/2 : change prescaler first
AT91F_PMC_CfgMCKReg( AT91C_BASE_PMC, AT91C_PMC_PRES_CLK_2 );
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MCKRDY ) );
// AT91C_MASTER_CLOCK=PLLCK/2 : then change source
pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MCKRDY ) );
#endif
}
/*******************************/
/* (UDP) USB Suspend Interrupt */
/*******************************/
if(_IT_reg_b1 & AT91C_UDP_RXSUSP)
{
USB_EVENT |= USB_EVENT_MASK_SUSPEND;
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT );
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT );
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_RXRSM | AT91C_UDP_WAKEUP);
#ifdef USE_LED
countLed = 0;
AT91F_LED_off(0);
AT91F_LED_off(1);
#endif
#ifndef AT91SAM9265
/*************************************************************/
/* from AT91C_MASTER_CLOCK=48MHz to AT91C_MASTER_CLOCK=32kHz */
/*************************************************************/
// AT91C_MASTER_CLOCK = SLCK/2 : change source first from 48 000 000 to 18. / 2 = 9M
AT91F_PMC_CfgMCKReg( AT91C_BASE_PMC, AT91C_PMC_PRES_CLK_2 );
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MCKRDY ) );
// AT91C_MASTER_CLOCK=SLCK : then change prescaler
AT91F_PMC_CfgMCKReg( AT91C_BASE_PMC, AT91C_PMC_CSS_SLOW_CLK );
while( !( AT91F_PMC_GetStatus( AT91C_BASE_PMC ) & AT91C_PMC_MCKRDY ) );
// disable PLL
AT91F_CKGR_CfgPLLReg( AT91C_BASE_CKGR, 0 );
// disable Main Oscillator
pPMC->PMC_MOR=0;
#if defined (AT91SAM9265) || defined (AT91SAM7A3)
#else
// Voltage regulator in standby mode : Enable VREG Low Power Mode
AT91F_VREG_Enable_LowPowerMode( AT91C_BASE_VREG );
#endif
#ifdef USE_LED
AT91F_PMC_DisablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_PWMC));
#endif
AT91F_UDP_DisableTransceiver(USBDEV_BASE_UDP);
//AT91F_PMC_DisablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_UDP) );
AT91F_PMC_CfgSysClkDisableReg( AT91C_BASE_PMC, AT91C_PMC_UDP );
#endif
}
}
if(!(fw_deviceState & FW_DS_TX))
{
if(fw_fifoId.NbOctetsLibres != FW_FIFO_SIZE)
{
/* a transfer will begin */
fw_deviceState |= FW_DS_TX;
/* if we are not transmitting and there is something to send, signal the task */
fw_mainTxDone();
}
}
if((fw_deviceState & FW_DS_RX) && !(fw_deviceState & FW_DS_TB_FULL))
{
fw_deviceState &= ~FW_DS_RX;
/* if something is in the endpoint buffers and at least one TB is free */
fw_mainRxDone();
}
/* clear interrupt */
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, _IT_reg_b1 & CLEAR_ALL_IT );
fw_deviceState &= ~FW_DS_INISR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -