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

📄 mscuser.lst

📁 开发ARM,基于IAR环境下的C代码开发
💻 LST
📖 第 1 页 / 共 5 页
字号:
ARM COMPILER V2.53,  mscuser                                                               24/09/06  22:23:19  PAGE 1   


ARM COMPILER V2.53, COMPILATION OF MODULE mscuser
OBJECT MODULE PLACED IN .\Obj\mscuser.obj
COMPILER INVOKED BY: d:\Keil\ARM\BIN\CA.exe mscuser.c THUMB DEBUG PRINT(.\LST\MSCUSER.LST) TABS(4) OBJECT(.\Obj\mscuser.
                    -obj) 

stmt  level    source

    1          /*----------------------------------------------------------------------------
    2           *      U S B  -  K e r n e l
    3           *----------------------------------------------------------------------------
    4           *      Name:    MSCUSER.C
    5           *      Purpose: Mass Storage Class Custom User Module
    6           *      Version: V1.10
    7           *----------------------------------------------------------------------------
    8           *      This file is part of the uVision/ARM development tools.
    9           *      Copyright (c) 2005-2006 Keil Software. All rights reserved.
   10           *      This software may only be used under the terms of a valid, current,
   11           *      end user licence from KEIL for a compatible version of KEIL software
   12           *      development tools. Nothing else gives you the right to use it.
   13           *---------------------------------------------------------------------------*/
   14          
   15          #include <AT91SAM7S64.H>                    /* AT91SAM7S64 definitions */
   16          
   17          #include "..\..\Board.h"
   18          
   19          #include "type.h"
   20          
   21          #include "usb.h"
   22          #include "msc.h"
   23          #include "usbcfg.h"
   24          #include "usbhw.h"
   25          #include "usbcore.h"
   26          #include "mscuser.h"
   27          
   28          #include "memory.h"
   29          
   30          
   31          BYTE  Memory[MSC_MemorySize] __at MSC_MemoryStart;   /* MSC RAM */
   32          
   33          BOOL  MemOK;                   /* Memory OK */
   34          
   35          DWORD Offset;                  /* R/W Offset */
   36          DWORD Length;                  /* R/W Length */
   37          
   38          BYTE  BulkStage;               /* Bulk Stage */
   39          
   40          BYTE  BulkBuf[MSC_MAX_PACKET]; /* Bulk In/Out Buffer */
   41          BYTE  BulkLen;                 /* Bulk In/Out Length */
   42          
   43          MSC_CBW CBW;                   /* Command Block Wrapper */
   44          MSC_CSW CSW;                   /* Command Status Wrapper */
   45          
   46          
   47          /*
   48           *  MSC Mass Storage Reset Request Callback
   49           *   Called automatically on Mass Storage Reset Request
   50           *    Parameters:      None (global SetupPacket and EP0Buf)
   51           *    Return Value:    TRUE - Success, FALSE - Error
   52           */
   53          
   54          BOOL MSC_Reset (void) {
   55   1      
   56   1        AT91C_BASE_PIOA->PIO_SODR = LED1 | LED2;     /* Turn Off R/W LED */
   57   1        BulkStage = MSC_BS_CBW;
   58   1        return (TRUE);
ARM COMPILER V2.53,  mscuser                                                               24/09/06  22:23:19  PAGE 2   

   59   1      }
   60          
   61          
   62          /*
   63           *  MSC Get Max LUN Request Callback
   64           *   Called automatically on Get Max LUN Request
   65           *    Parameters:      None (global SetupPacket and EP0Buf)
   66           *    Return Value:    TRUE - Success, FALSE - Error
   67           */
   68          
   69          BOOL MSC_GetMaxLUN (void) {
   70   1      
   71   1        EP0Buf[0] = 0;               /* No LUN associated with this device */
   72   1        return (TRUE);
   73   1      }
   74          
   75          
   76          /*
   77           *  MSC Memory Read Callback
   78           *   Called automatically on Memory Read Event
   79           *    Parameters:      None (global variables)
   80           *    Return Value:    None
   81           */
   82          
   83          void MSC_MemoryRead (void) {
   84   1        DWORD n;
   85   1      
   86   1        if (Length > MSC_MAX_PACKET) {
   87   2          n = MSC_MAX_PACKET;
   88   2        } else {
   89   2          n = Length;
   90   2        }
   91   1      
   92   1        if ((Offset + n) > MSC_MemorySize) {
   93   2          n = MSC_MemorySize - Offset;
   94   2          BulkStage = MSC_BS_DATA_IN_LAST_STALL;
   95   2        }
   96   1      
   97   1        USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + Offset), n);
   98   1        Offset += n;
   99   1        Length -= n;
  100   1      
  101   1        CSW.dDataResidue -= n;
  102   1      
  103   1        if (Length == 0) {
  104   2          BulkStage = MSC_BS_DATA_IN_LAST;
  105   2        }
  106   1      
  107   1        if (BulkStage != MSC_BS_DATA_IN) {
  108   2          AT91C_BASE_PIOA->PIO_SODR = LED1;  /* Turn Off Read LED */
  109   2          CSW.bStatus = CSW_CMD_PASSED;
  110   2        }
  111   1      }
  112          
  113          
  114          /*
  115           *  MSC Memory Write Callback
  116           *   Called automatically on Memory Write Event
  117           *    Parameters:      None (global variables)
  118           *    Return Value:    None
  119           */
  120          
  121          void MSC_MemoryWrite (void) {
  122   1        DWORD n;
  123   1      
  124   1        if ((Offset + BulkLen) > MSC_MemorySize) {
ARM COMPILER V2.53,  mscuser                                                               24/09/06  22:23:19  PAGE 3   

  125   2          BulkLen = MSC_MemorySize - Offset;
  126   2          BulkStage = MSC_BS_CSW;
  127   2          USB_SetStallEP(MSC_EP_OUT);
  128   2        }
  129   1      
  130   1        for (n = 0; n < BulkLen; n++) {
  131   2          Memory[Offset + n] = BulkBuf[n];
  132   2        }
  133   1      
  134   1        Offset += BulkLen;
  135   1        Length -= BulkLen;
  136   1      
  137   1        CSW.dDataResidue -= BulkLen;
  138   1      
  139   1        if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
  140   2          AT91C_BASE_PIOA->PIO_SODR = LED2;  /* Turn Off Write LED */
  141   2          CSW.bStatus = CSW_CMD_PASSED;
  142   2          MSC_SetCSW();
  143   2        }
  144   1      }
  145          
  146          
  147          /*
  148           *  MSC Memory Verify Callback
  149           *   Called automatically on Memory Verify Event
  150           *    Parameters:      None (global variables)
  151           *    Return Value:    None
  152           */
  153          
  154          void MSC_MemoryVerify (void) {
  155   1        DWORD n;
  156   1      
  157   1        if ((Offset + BulkLen) > MSC_MemorySize) {
  158   2          BulkLen = MSC_MemorySize - Offset;
  159   2          BulkStage = MSC_BS_CSW;
  160   2          USB_SetStallEP(MSC_EP_OUT);
  161   2        }
  162   1      
  163   1        for (n = 0; n < BulkLen; n++) {
  164   2          if (Memory[Offset + n] != BulkBuf[n]) {
  165   3            MemOK = FALSE;
  166   3            break;
  167   3          }
  168   2        }
  169   1      
  170   1        Offset += BulkLen;
  171   1        Length -= BulkLen;
  172   1      
  173   1        CSW.dDataResidue -= BulkLen;
  174   1      
  175   1        if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
  176   2          CSW.bStatus = (MemOK) ? CSW_CMD_PASSED : CSW_CMD_FAILED;
  177   2          MSC_SetCSW();
  178   2        }
  179   1      }
  180          
  181          
  182          /*
  183           *  MSC SCSI Read/Write Setup Callback
  184           *    Parameters:      None (global variables)
  185           *    Return Value:    TRUE - Success, FALSE - Error
  186           */
  187          
  188          BOOL MSC_RWSetup (void) {
  189   1        DWORD n;
  190   1      
ARM COMPILER V2.53,  mscuser                                                               24/09/06  22:23:19  PAGE 4   

  191   1        /* Logical Block Address of First Block */
  192   1        n = (CBW.CB[2] << 24) |
  193   1            (CBW.CB[3] << 16) |
  194   1            (CBW.CB[4] <<  8) |
  195   1            (CBW.CB[5] <<  0);
  196   1      
  197   1        Offset = n * MSC_BlockSize;
  198   1      
  199   1        /* Number of Blocks to transfer */
  200   1        n = (CBW.CB[7] <<  8) |
  201   1            (CBW.CB[8] <<  0);
  202   1      
  203   1        Length = n * MSC_BlockSize;
  204   1      
  205   1        if (CBW.dDataLength != Length) {
  206   2          USB_SetStallEP(MSC_EP_IN);
  207   2          USB_SetStallEP(MSC_EP_OUT);
  208   2          CSW.bStatus = CSW_PHASE_ERROR;
  209   2          MSC_SetCSW();
  210   2          return (FALSE);
  211   2        }
  212   1      
  213   1        return (TRUE);
  214   1      }
  215          
  216          
  217          /*
  218           *  Check Data IN Format
  219           *    Parameters:      None (global variables)
  220           *    Return Value:    TRUE - Success, FALSE - Error
  221           */
  222          
  223          BOOL DataInFormat (void) {
  224   1      
  225   1        if (CBW.dDataLength == 0) {
  226   2          CSW.bStatus = CSW_PHASE_ERROR;
  227   2          MSC_SetCSW();
  228   2          return (FALSE);
  229   2        }
  230   1        if ((CBW.bmFlags & 0x80) == 0) {
  231   2          USB_SetStallEP(MSC_EP_OUT);
  232   2          CSW.bStatus = CSW_PHASE_ERROR;
  233   2          MSC_SetCSW();
  234   2          return (FALSE);
  235   2        }
  236   1        return (TRUE);
  237   1      }
  238          
  239          
  240          /*
  241           *  Perform Data IN Transfer
  242           *    Parameters:      None (global variables)
  243           *    Return Value:    TRUE - Success, FALSE - Error
  244           */
  245          
  246          void DataInTransfer (void) {
  247   1      
  248   1        if (BulkLen > CBW.dDataLength) {
  249   2          BulkLen = CBW.dDataLength;
  250   2        }
  251   1      
  252   1        USB_WriteEP(MSC_EP_IN, BulkBuf, BulkLen);
  253   1        BulkStage = MSC_BS_DATA_IN_LAST;
  254   1      
  255   1        CSW.dDataResidue -= BulkLen;
  256   1        CSW.bStatus = CSW_CMD_PASSED;
ARM COMPILER V2.53,  mscuser                                                               24/09/06  22:23:19  PAGE 5   

  257   1      }
  258          
  259          
  260          /*
  261           *  MSC SCSI Test Unit Ready Callback
  262           *    Parameters:      None (global variables)
  263           *    Return Value:    None
  264           */
  265          
  266          void MSC_TestUnitReady (void) {
  267   1      
  268   1        if (CBW.dDataLength != 0) {
  269   2          if ((CBW.bmFlags & 0x80) != 0) {
  270   3            USB_SetStallEP(MSC_EP_IN);
  271   3          } else {
  272   3            USB_SetStallEP(MSC_EP_OUT);
  273   3          }
  274   2        }
  275   1      
  276   1        CSW.bStatus = CSW_CMD_PASSED;
  277   1        MSC_SetCSW();
  278   1      }
  279          
  280          
  281          /*
  282           *  MSC SCSI Request Sense Callback
  283           *    Parameters:      None (global variables)
  284           *    Return Value:    None
  285           */
  286          
  287          void MSC_RequestSense (void) {
  288   1      
  289   1        if (!DataInFormat()) return;
  290   1      
  291   1        BulkBuf[ 0] = 0x70;          /* Response Code */
  292   1        BulkBuf[ 1] = 0x00;
  293   1        BulkBuf[ 2] = 0x02;          /* Sense Key */

⌨️ 快捷键说明

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