⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fw_task.c

📁 ATMEL公司的demo程序,USB驱动程序,与识别片上flash,并进行枚举和操作.
💻 C
📖 第 1 页 / 共 2 页
字号:
//  ----------------------------------------------------------------------------
//          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 + -