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

📄 main.c

📁 ATMEL公司的demo程序,USB驱动程序,与识别片上flash,并进行枚举和操作.
💻 C
字号:
//  ----------------------------------------------------------------------------
//          ATMEL Microcontroller Software Support  -  ROUSSET  -
//  ----------------------------------------------------------------------------
//  DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
//  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
//  DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
//  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
//  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
//  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
//  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//  ----------------------------------------------------------------------------
//  File Name           : main.c
//  Object              : Test function for the Basic File System FAT12 API
//  Creation            : JCB 15/apr/2005
//  Modif               :
//  ----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>

// Include Standard files
#include "board.h"
#include "po_types.h"
#include "po_kernel.h"
#include "trace.h"
#include "bfsa_flash.h"
#include "bfsa_api.h"
#include "fw_usb.h"
#include "dbgu.h"

// Globals
BOOL bGet = TRUE;


/*****************************************************************
*
*
* S U B - R O U T I N E  : menu
*
*-----------------------------------------------------------------
*
* Object :
*   This function print a menu on DEBUG COM port to test BFSA.
*
* Argument :            NONE
*
* Return value :        NONE
*
*****************************************************************/
void menu(void)
{
  ULONG status = 0;
  char val;

  if (bGet)
  {
    TRACE_INFO( "\n\r-BFSA-\n\r");
    TRACE_INFO( "2 mkdir\n\r");
    TRACE_INFO( "3 mk file\n\r");
    TRACE_INFO( "4 dir\n\r");
    TRACE_INFO( "5 cd\n\r");
    TRACE_INFO( "6 delete\n\r");
    TRACE_INFO( "7 Init\n\r");
    TRACE_INFO( "F Format\n\r");
  }

  if (bGet=AT91F_US_Get(&val))
  {
    TRACE_INFO( "\n\r");

    switch( val )
    {

      case '2': // mkdir
      {
        char dirName[10]="";

        TRACE_INFO( "mkdir <Name>\n\r");
        TRACE_INFO( "Enter name: ");
        AT91F_DBGU_scanf(dirName);
        TRACE_INFO( "\n\r");

        status = BFSA_mkdir(dirName);
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;


      case '3': // mk file
      {
        unsigned int ulSize = 0;
        int count;
        char fileName[10]="";
        char FileBuff[256];
        char Size[10]="";
        char i;

        TRACE_INFO( "file <FileName> <Si");
        TRACE_INFO( "ze>\n\rEnter name: ");
        AT91F_DBGU_scanf(fileName);
        TRACE_INFO( "\n\r");

        TRACE_INFO( "File size: ");
        AT91F_DBGU_scanf(Size );
        TRACE_INFO( "\n\r");

        i=0;
        while( (Size[i] != '\0') && (i != sizeof(Size)) )
        {
          if( (Size[i]>='0') && (Size[i]<='9') )
          {
            ulSize *=10;
            ulSize += ((unsigned int) Size[i] - '0'); // convert ASCII to INT
            i++;
          }
          else
          {
            break;
          }
        }

        // Fill buffer
        for (count=0; count < sizeof(FileBuff); count++)
        {
          FileBuff[count] = (unsigned char)count;
        }

        // Write parts of file
        for (count=0;count<ulSize / sizeof(FileBuff); count++)
        {
          status = BFSA_write( fileName, (char*)FileBuff, sizeof(FileBuff), count );
          if( BFSA_FAILURE(status) )
          {
            goto FAILURE;
          }
        }

        // Write end of file
        if (ulSize % sizeof( FileBuff) )
        {
          status = BFSA_write( fileName, (char*)FileBuff, ulSize % sizeof(FileBuff), ulSize / sizeof(FileBuff) );
          if( BFSA_FAILURE(status) )
          {
            goto FAILURE;
          }
        }
        status = BFSA_SUCCESS;
        TRACE_INFO( "OK\n\r");
      }
      break;

      case '4': // dir
      {
        status = BFSA_dir();
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;

      case  '5': // cd
      {
        char dirName[10]="";

        TRACE_INFO( "cd <DirName> \n\r");
        TRACE_INFO( "Enter name: ");
        AT91F_DBGU_scanf(dirName);
        TRACE_INFO( "\n\r");

        status = BFSA_cd(dirName);
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;

      case '6': // delete
      {
        char fileName[10]="";

        TRACE_INFO( "delete <FileName>");
        TRACE_INFO( "\n\r Enter name: ");
        AT91F_DBGU_scanf(fileName);
        TRACE_INFO( "\n\r");

        status = BFSA_delete(fileName);
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;

      case '7': // Init
      {
        status = BFSA_init();
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;

      case 'F': // Format
      {
        status = BFSA_format();
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        status = BFSA_init();
        if( BFSA_SUCCESS != status )
        {
          goto FAILURE;
        }
        TRACE_INFO( "OK\n\r");
      }
      break;
    }

    FAILURE:
        if( BFSA_SUCCESS != status )
          TRACE_INFO( "failed (0x%X)\n\r", (int)status);
  }
}



/*****************************************************************
*
* ROUTINE : main function
*
*-----------------------------------------------------------------
*
* Purpose :
*
* Input parameters  : NONE
*
* Output parameters :
*
* Global data :
*
*****************************************************************/
#ifdef ADS_COMPIL
void main( void )
#else
void main( void )
#endif
{
  int status = INTERNAL_ERROR;
#ifdef USE_LED
  unsigned char counter = 0;
#endif

  // Enable User Reset and set its minimal assertion to 960 us
  AT91F_RSTSetMode( AT91C_BASE_RSTC,AT91C_RSTC_URSTEN | (0x4<<8) );

  // Enable Peripheral clock in PMC for PIOA
  AT91F_PIOA_CfgPMC();

  // Set to 1 output PIO
  AT91F_PIO_SetOutput( AT91C_BASE_PIOA, 0xFFFFFFFF );

  // Enable PIO in output mode
  AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, 0xFFFFFFFF );

  // Disable pullup on PIO
  AT91F_PIO_CfgPullup( AT91C_BASE_PIOA, 0x00000000 );

#ifdef PULL_UP_USB
  // Disable UDP Pull Up (USB_DP_PUP)
  #ifdef AT91SAM7A3
    #ifdef REV_A  // old board
      AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB1);
      AT91F_PIO_SetOutput( AT91C_BASE_PIOB, AT91C_PIO_PB1 );
    #else  // new board
      AT91F_PIO_CfgOutput(AT91C_BASE_PIOB,AT91C_PIO_PB1);
      AT91F_PIO_ClearOutput( AT91C_BASE_PIOB, AT91C_PIO_PB1 );
    #endif
  #else
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PIO_PA16 );
  #endif
#endif

#if defined (TR_INFO) || defined (TR_WARNING) || defined (TR_ERROR) || defined (TR_FATAL) || defined (TR_DEBUG_H) || defined (TR_DEBUG_M)
  // Open PIO for DBGU
  AT91F_DBGU_CfgPIO();

  // Configure DBGU
  AT91F_US_Configure (
      (AT91PS_USART) AT91C_BASE_DBGU,
      AT91C_MASTER_CLOCK,
      AT91C_US_ASYNC_MODE,  	// mode Register to be programmed
      AT91C_DBGU_BAUD,        // baudrate to be programmed
      0);                   	// timeguard to be programmed

  // Enable Transmitter
  AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
  AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);

  // Disable peripheral clock in PMC for PIOA
  //AT91F_PMC_DisablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_PIOA) );
#endif

  TRACE_INFO( "\n\r\n\rUSB-BFSA\n\r");

#ifdef USE_LED
  // LED 2 and 3 are use for flash and usb occupation time
  AT91F_LED_init( AT91C_BASE_PWMC, AT91C_MASTER_CLOCK );
#endif

  bGet = TRUE;

  // Initialize BFSA
  if( BFSA_SUCCESS != BFSA_init() )
  {
    status = BFSA_format();
    if( BFSA_SUCCESS != status )
    {
      TRACE_INFO( "FORMAT PB\n\r");
    }
    else
    {
      TRACE_INFO( "FORMAT OK\n\r");
      status = 1; // We need a BFSA_init()
    }
  }
  else
  {
    status = BFSA_SUCCESS;
  }

  if( BFSA_SUCCESS != status )
  {
    if( BFSA_SUCCESS == BFSA_init() )
    {
      status = BFSA_SUCCESS;
    }
  }

  if( BFSA_SUCCESS == status )
  {
    if (USBMS_OK == usbms_init())
    {
      fw_init();  // Enable USB, PLL ...

      for(;;)
      {
        usb_task();
#if defined (AT91SAM7A3) || defined (AT91SAM9265)
#else
        if( AT91C_VREG_PSTDBY != (AT91C_BASE_VREG->VREG_MR & AT91C_VREG_PSTDBY) )
#endif
        {
          // Normal mode
          menu();
        }

#ifdef USE_LED
        AT91F_LED_off(0);
        if(countLed == 1)
        {
          counter++;
        }
        if(counter >= 20 )
        {
          AT91F_LED_off(1);
          counter = 0;
          countLed = 0;
        }
 #endif
      }
    }
  }
  TRACE_INFO( "Error END\n\r");
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -