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

📄 mscuser.lst

📁 USB存储器
💻 LST
📖 第 1 页 / 共 5 页
字号:
ARM COMPILER V2.42b,  mscuser                                                              02/01/06  23:45:16  PAGE 1   


ARM COMPILER V2.42b, COMPILATION OF MODULE mscuser
OBJECT MODULE PLACED IN .\Obj\mscuser.obj
COMPILER INVOKED BY: C:\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.03
    7           *----------------------------------------------------------------------------
    8           *      This file is part of the uVision/ARM development tools.
    9           *      Copyright (c) 2005 Keil Software. All rights reserved.
   10           *---------------------------------------------------------------------------*/
   11          
   12          #include <LPC214X.H>                        /* LPC214x definitions */
   13          
   14          #include "type.h"
   15          
   16          #include "usb.h"
   17          #include "msc.h"
   18          #include "usbcfg.h"
   19          #include "usbhw.h"
   20          #include "usbcore.h"
   21          #include "mscuser.h"
   22          
   23          #include "memory.h"
   24          
   25          
   26          BYTE  Memory[MSC_MemorySize] __at MSC_MemoryStart;   /* MSC RAM */
   27          
   28          BOOL  MemOK;                   /* Memory OK */
   29          
   30          DWORD Offset;                  /* R/W Offset */
   31          DWORD Length;                  /* R/W Length */
   32          
   33          BYTE  BulkStage;               /* Bulk Stage */
   34          
   35          BYTE  BulkBuf[MSC_MAX_PACKET]; /* Bulk In/Out Buffer */
   36          BYTE  BulkLen;                 /* Bulk In/Out Length */
   37          
   38          MSC_CBW CBW;                   /* Command Block Wrapper */
   39          MSC_CSW CSW;                   /* Command Status Wrapper */
   40          
   41          
   42          /*
   43           *  MSC Mass Storage Reset Request Callback
   44           *   Called automatically on Mass Storage Reset Request
   45           *    Parameters:      None (global SetupPacket and EP0Buf)
   46           *    Return Value:    TRUE - Success, FALSE - Error
   47           */
   48          
   49          BOOL MSC_Reset (void) {
   50   1      
   51   1        IOCLR1 = (LED_RD | LED_WR);  /* Turn Off R/W LED */
   52   1        BulkStage = MSC_BS_CBW;
   53   1        return (TRUE);
   54   1      }
   55          
   56          
   57          /*
   58           *  MSC Get Max LUN Request Callback
ARM COMPILER V2.42b,  mscuser                                                              02/01/06  23:45:16  PAGE 2   

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

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

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

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

⌨️ 快捷键说明

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