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

📄 fw_task.c

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