📄 fw_task.c
字号:
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: CONDITIONS AS PER SIGNED LIMITED LICENSE AGREEMENT (AT91
// SOFTWARE AND USER DOCUMENTATION)
// ALL SOFTWARE IS PROVIDED AS IS, WITH ALL FAULTS, AND WITH NO WARRANTY
// WHATSOEVER. ATMEL EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS, IMPLIED,
// OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.
// ----------------------------------------------------------------------------
// File Name : fw_task.c
// Object : initializations,firmware task and isr
// Creation : JCB 27/oct/2002
// Modif : JCB 18/feb/2005
// ----------------------------------------------------------------------------
#include "board.h"
#include "po_types.h"
#include "trace.h"
#include "fw_usb.h"
#include "po_kernel.h"
#include "ms_device.h"
#include "ms_rbc.h"
#include "dbgu.h"
extern void AT91F_ASM_UDP_Handler(void);
/*****************************************************************
*
* ROUTINE fw_init
*
*-----------------------------------------------------------------
*
* Purpose : Initialization of the registers
*
* Input parameters :
*
* Output parameters :
*
* Global data :
*
*****************************************************************/
void fw_init( void )
{
fw_databk = 0;
#ifdef AT91SAM9265
// Enable USB
AT91F_UDPHS_EnableUSB( USBDEV_BASE_UDP );
#else
// Specific Chip USB Initialisation
// Enables the 48MHz USB clock UDPCK and System Peripheral USB Clock
AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_UDP );
// Enables the corresponding peripheral clock.
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC,(1 << AT91C_ID_UDP) );
#ifdef PULL_UP_USB
// Enable UDP Pull Up (USB_DP_PUP)
#ifdef AT91SAM7A3
#ifdef REV_A // old board
AT91F_PIO_SetOutput( AT91C_BASE_PIOB, AT91C_PIO_PB1 );
#else // new board
AT91F_PIO_ClearOutput( AT91C_BASE_PIOB, AT91C_PIO_PB1 );
#endif
#else
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91C_PIO_PA16 );
#endif
#endif
#endif
#ifndef AT91SAM9265
/* Acquire an interrupt vector and assign an ISR routine. */
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, AT91C_AIC_PRIOR_MIDDLE, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, fw_isr );
// Enable corresponding IT number
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_UDP );
#else
// Acquire an interrupt vector and assign an ISR routine
#ifdef ADS_COMPIL
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_UDPHS, AT91C_AIC_PRIOR_MIDDLE, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, AT91F_ASM_UDP_Handler );
#else
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_UDPHS, AT91C_AIC_PRIOR_MIDDLE, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, fw_isr );
#endif
// Enable corresponding IT number
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_UDPHS );
#endif
// On AT91SAM7Sxxx the "End Of Bus Reset" is NO-MASK. So we not need to enable it.
}
/*****************************************************************
*
* ROUTINE : usb_task
*
*-----------------------------------------------------------------
*
* Purpose : Main loop of USB-MS.
* Not an API function but is provided for system whitout
* operating system.
* In this case, usbms_loop should be called in the main
* loop
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data :
*
*****************************************************************/
#ifdef ADS_COMPIL
void usb_task( void )
#else
void usb_task( void )
#endif
{
/* Flags set by ISR: USB_EVENT, USB_RX, USB_TX */
if( 0 != USB_EVENT )
{
TRACE_DEBUG_L( "USB_EVENT 0x%X\n\r", USB_EVENT);
ms_usbEvent( USB_EVENT );
}
if( 0 != USB_RX )
{
TRACE_DEBUG_L( "ms_dataRec 0x%X\n\r", (int)USB_RX);
ms_dataReceived();
/* USB_RX is updated when data is read */
}
if( 1 == USB_TX )
{
TRACE_DEBUG_L( "ms_sendComplete\n\r");
ms_sendComplete();
po_lock();
USB_TX = 0;
po_unlock();
}
}
/*****************************************************************
*
* ROUTINE fw_isr
*
*-----------------------------------------------------------------
*
* Purpose :
* Interrupt routine wake on SOF arrival
*
* IT:
* USB End Of Bus Reset Interrupt
* (UDP) Endpoint 0 Interrupt : EP CTRL
* (UDP) Endpoint 1 Interrupt : EP BULK IN
* (UDP) Endpoint 2 Interrupt : EP BULK OUT
* (UDP) USB Suspend Interrupt
* (UDP) USB Resume Interrupt
*
* Input parameters : NONE
*
* Output parameters : NONE
*
* Global data :
*
*****************************************************************/
#ifdef ADS_COMPIL
void fw_isr(void)
#else
__ramfunc void fw_isr(void)
#endif
{
ULONG _IT_reg_b1 = 0;
#ifndef AT91SAM9265
AT91PS_PMC pPMC = AT91C_BASE_PMC;
#endif
fw_deviceState |= FW_DS_INISR;
#ifdef USE_LED
if(countLed == 0)
{
AT91F_LED_blinkSpeed(1);
countLed = 1;
}
#endif
fw_IsrCount++;
_IT_reg_b1 = fw_readInterruptRegister();
// TRACE_DEBUG_L( "\n\rIT=%#08lx\n\r", _IT_reg_b1);
// If we have an Interrupt
if(_IT_reg_b1 != 0 )
{
/**********************************/
/* USB End Of Bus Reset Interrupt */
/**********************************/
if(_IT_reg_b1 & AT91C_UDP_ENDBUSRES)
{
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT );
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT );
/* USB Interrupt Enable Register */
/* AT91C_UDP_EPINT0 : Endpoint 0 Interrupt */
/* AT91C_UDP_RXSUSP : USB Suspend Interrupt */
/* AT91C_UDP_RXRSM : USB Resume Interrupt */
/* AT91C_UDP_EXTRSM : USB External Resume Interrupt */
/* AT91C_UDP_SOFINT : USB Start Of frame Interrupt */
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0| AT91C_UDP_RXSUSP
| AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM
| AT91C_UDP_SOFINT );
#ifdef USE_LED
countLed = 0;
AT91F_LED_off(0);
AT91F_LED_off(1);
#endif
USB_EVENT |= USB_EVENT_MASK_UNPLUG;
fw_busReset();
// Reset all endpoint
AT91F_UDP_ResetEp( USBDEV_BASE_UDP, 0x0000FFFF );
#ifndef AT91SAM9265
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_CTRL, AT91C_UDP_EPTYPE_CTRL );
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_IN, AT91C_UDP_EPTYPE_BULK_IN );
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_BULK_OUT, AT91C_UDP_EPTYPE_BULK_OUT );
#else
AT91F_UDP_EpSet( USBDEV_BASE_UDP, FW_EP_CTRL,
AT91C_EPT_SIZE_8 | AT91C_EPT_DIR_OUT | AT91C_EPT_TYPE_CTL_EPT | AT91C_BK_NUMBER_1 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -