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

📄 sd.lst

📁 FS7805 使用ATA硬盘的demo
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE SD
OBJECT MODULE PLACED IN .\Output\Sd.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Sd.c LARGE BROWSE INCDIR(.\Includes) DEBUG OBJECTEXTEND CODE SYMBOLS PRINT(
                    -.\Output\Sd.lst) OBJECT(.\Output\Sd.obj)

stmt level    source

   1          //----------------------------------------------------------------------------
   2          //  (C) Copyright 2002, SOTA Design Technology Inc.
   3          //          ALL RIGHTS RESERVED
   4          //----------------------------------------------------------------------------
   5          // Project: S603
   6          // File Name:   Sd.c
   7          // Author:  David Yen
   8          // Description:
   9          //   The SD access module
  10          // Revision History
  11          // 10/17/02: David Yen created.
  12          //----------------------------------------------------------------------------
  13          
  14          #include "Include.h"
  15          #include "fs7822.h"
  16          #include "fs7822regs.h"
  17          //#include <reg51.h>
  18          #include <stdio.h>
  19          #include <string.h>
  20          //#include "Device.h"
  21          #include "UsbDisk.h"
  22          #include "Storage.h"
  23          
  24          #define MAX_CMD_LEN          6
  25          #define MAX_RESP_LEN         17 // Max response length = 136 bits
  26          #define RSP_LEN              6
  27          #define LONG_RSP_LEN         17
  28          #define CARD_CMD_START       0x40
  29          #define CARD_PWRUP_FINISH    0x80
  30          #define OPERATION_VOL_RANGE  0x00FF0000
  31          #define GOOD_CRC16_STS       0x02
  32          
  33          /* SD_COMMAND */
  34          #define SD_CMD_ONLY         1
  35          #define SD_CMD_SHORT_RSP    2
  36          #define SD_CMD_LONG_RSP     3
  37          #define SD_CMD_TX_DATA      4
  38          #define SD_CMD_TX_DATA_ONLY 5
  39          #define SD_CMD_RX_DATA      6
  40          #define SD_CMD_RX_DATA_ONLY 7
  41          
  42          #define IDLE_STATE          0
  43          #define READY_STATE         1
  44          #define IDENTIFY_STATE      2
  45          #define STANDBY_STATE       3
  46          #define TRANSFER_STATE      4
  47          #define DATA_STATE          5
  48          #define RECEIVE_STATE       6
  49          #define PRGROGAM_STATE      7
  50          #define DISCONNECT_STATE    8
  51          
  52          #define BUS_WIDTH_1BIT      0x00
  53          #define BUS_WIDTH_4BIT      0x02
  54          
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 2   

  55          //      Command Name      Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
  56          #define GO_IDLE_STATE        0    //  V      V      V      -
  57          #define SEND_OP_COND         1    //  V      V             R3 (OCR)
  58          #define ALL_SEND_CID         2    //  V      V      V      R2
  59          #define SEND_RELATIVE_ADDR   3    //  R1     R1     R6     See SdGetRespType()
  60          #define SET_DSR              4    //  V      V      V      -
  61          #define SWITCH               6    //         V             R1
  62          #define SELECT_CARD          7    //  V      V      V      R1
  63          #define SEND_EXT_CSD         8    //         V             R1
  64          #define SEND_CSD             9    //  V      V      V      R2
  65          #define SEND_CID             10   //  V      V      V      R2
  66          #define READ_DAT_UNTIL_STOP  11   //  V      V             R1
  67          #define STOP_TRANS           12   //  V      V      V      R1
  68          #define SEND_STATUS          13   //  V      V      V      R1
  69          #define GO_INACTIVE_STATE    15   //  V      V      V      -
  70          #define SET_BLOCKLEN         16   //  V      V      V      R1
  71          #define READ_BLOCK           17   //  V      V      V      R1
  72          #define READ_MUL_BLOCK       18   //  V      V      V      R1
  73          #define WRITE_DAT_UNTIL_STOP 20   //  V      V             R1
  74          #define SET_BLOCK_COUNT      23   //  V      V             R1
  75          #define WRITE_BLOCK          24   //  V      V      V      R1
  76          #define WRITE_MUL_BLOCK      25   //  V      V      V      R1
  77          #define PROGRAM_CID          26   //  V      V             R1
  78          #define PROGRAM_CSD          27   //  V      V      V      R1
  79          #define SET_WRITE_PROT       28   //  V      V      V      R1
  80          #define CLR_WRITE_PROT       29   //  V      V      V      R1
  81          #define SEND_WRITE_PROT      30   //  V      V      V      R1
  82          #define ERASE_WR_BLK_START   32   //                V      R1
  83          #define ERASE_WR_BLK_END     33   //                V      R1
  84          #define ERASE_GROUP_START    35   //  V      V             R1
  85          #define ERASE_GROUP_END      36   //  V      V             R1
  86          #define ERASE                38   //  V      V      V      R1
  87          #define FAST_IO              39   //  V      V             R4
  88          #define GO_IRQ_STATE         40   //  V      V             R5
  89          #define LOCK_UNLOCK          42   //  V      V      V      R1
  90          #define APP_CMD              55   //  V      V      V      R1
  91          #define GEN_CMD              56   //  V      V      V      R1
  92          
  93          //      ACMD Name         Index   MMC-3.1 MMC-4.0 SD-1.01  Resp
  94          #define SET_BUS_WIDTH        6    //                V      R1
  95          #define SEND_SD_STATUS       13   //                V      R1
  96          #define SEND_NUM_WR_BLOCKS   22   //                V      R1
  97          #define SET_WR_BLK_ERASE_CNT 23   //                V      R1
  98          #define SD_SEND_OP_COND      41   //                V      R3 (OCR)
  99          #define SET_CLR_CARD_DETECT  42   //                V      R1
 100          #define SEND_SCR             51   //                V      R1
 101          
 102          // ??? According to Spec of MMC3.1, MultiMediaCard returns response of
 103          //     type R1 to APP_CMD (CMD55). But, according to Spec of SD1.01
 104          //     page 23, MultiMediaCard will not respond to APP_CMD - CMD55.
 105          //     Is this a confliction ?
 106          
 107          
 108          #define SdHiClk()  SDMI_CTL=(SDMI_CTL|bmSD_CLK_SEL)|bmSD_CLK_EN;
 109          #define SdLoClk()  SDMI_CTL=(SDMI_CTL&~bmSD_CLK_SEL)|bmSD_CLK_EN;
 110          #define SdStopClk() SDMI_CTL=SDMI_CTL&~bmSD_CLK_EN;
 111          #define IsCardBusy() (SDMI_ST&bmSD_BUSY)
 112          #define SdWriteProtect() ((SDMI_ST & bmSD_WR_PROTECT))
 113          //#define SdCardExist() (CSRRead(SD_BASE + SD_STATUS) & SD_CARD_STS)
 114          //#define SdCtrlReset() CSRWrite(SD_BASE + SD_CLK_CTRL, SD_RESET | SD_CLK_EN)
 115          #define SdWaitCard()\
 116          {\
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 3   

 117            CmdTimer = SD_CMD_TIMEOUT;\
 118            while (IsCardBusy() && CmdTimer);\
 119          }
 120          
 121          #ifdef PMOS
 122            #define SdPowerOn() {SD_POWER_CTRL = 0; Delay(50);}
 123            #define SdPowerOff() SD_POWER_CTRL = 1
 124          #else
                #define SdPowerOn()
                #define SdPowerOff()
              #endif
 128          
 129          typedef enum {CARD_SD, CARD_MMC} TCARD_TYPE;
 130          
 131          /*************************************************
 132             Global Variables
 133          *************************************************/
 134          xdata BYTE SdGetFlashInfoTimer = 0;
 135          
 136          /*************************************************
 137             Local Variables
 138          *************************************************/
 139          static xdata UINT32 SdAvailableBlocks = 0;
 140          static xdata TCARD_TYPE CardType = CARD_SD;
 141          static idata BYTE SdCmdBuf[MAX_CMD_LEN];
 142          static xdata BYTE SdRespBuf[MAX_RESP_LEN];
 143          static idata UINT32 RCA = 0;
 144          static BOOL MmcProtol;
 145          
 146          #define TYPE_RESP_NO      0
 147          #define TYPE_RESP_R1      1
 148          #define TYPE_RESP_R2      2
 149          #define TYPE_RESP_R3      3
 150          #define TYPE_RESP_R4      4
 151          #define TYPE_RESP_R5      5
 152          #define TYPE_RESP_R6      6
 153          
 154          xdata BYTE IsAppCmd = false;
 155          /*
 156          //modify by David Guo
 157          //xdata   UINT16  MMCtest = 0;
 158          //xdata   UINT16  MMCerror1 = 0;
 159          //xdata   UINT16  MMCerror2 = 0;
 160          //xdata   UINT16  MMCerror3 = 0;
 161          //xdata   BYTE    MMCCmdIndex[150];
 162          //end modify by David Guo
 163          */
 164          BYTE SdGetRespType(BYTE CmdIndex)
 165          {
 166   1          if(CmdIndex == SEND_RELATIVE_ADDR)
 167   1          {
 168   2              if(CardType == CARD_SD)
 169   2                  return TYPE_RESP_R6;
 170   2              else
 171   2                  return TYPE_RESP_R1;
 172   2          }
 173   1          switch(CmdIndex)
 174   1          {
 175   2              case GO_IDLE_STATE        : return TYPE_RESP_NO; break;
 176   2              case SEND_OP_COND         : return TYPE_RESP_R3; break;
 177   2              case ALL_SEND_CID         : return TYPE_RESP_R2; break;
 178   2              case SET_DSR              : return TYPE_RESP_NO; break;
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 4   

 179   2              case SWITCH               : return TYPE_RESP_R1; break;
 180   2              case SELECT_CARD          : return TYPE_RESP_R1; break;
 181   2              case SEND_EXT_CSD         : return TYPE_RESP_R1; break;
 182   2              case SEND_CSD             : return TYPE_RESP_R2; break;
 183   2              case SEND_CID             : return TYPE_RESP_R2; break;
 184   2              case READ_DAT_UNTIL_STOP  : return TYPE_RESP_R1; break;
 185   2              case STOP_TRANS           : return TYPE_RESP_R1; break;
 186   2              case SEND_STATUS          : return TYPE_RESP_R1; break;
 187   2              case GO_INACTIVE_STATE    : return TYPE_RESP_NO; break;
 188   2              case SET_BLOCKLEN         : return TYPE_RESP_R1; break;
 189   2              case READ_BLOCK           : return TYPE_RESP_R1; break;
 190   2              case READ_MUL_BLOCK       : return TYPE_RESP_R1; break;
 191   2              case WRITE_DAT_UNTIL_STOP : return TYPE_RESP_R1; break;
 192   2              case SET_BLOCK_COUNT      : return TYPE_RESP_R1; break;
 193   2              case WRITE_BLOCK          : return TYPE_RESP_R1; break;
 194   2              case WRITE_MUL_BLOCK      : return TYPE_RESP_R1; break;
 195   2              case PROGRAM_CID          : return TYPE_RESP_R1; break;
 196   2              case PROGRAM_CSD          : return TYPE_RESP_R1; break;
 197   2              case SET_WRITE_PROT       : return TYPE_RESP_R1; break;
 198   2              case CLR_WRITE_PROT       : return TYPE_RESP_R1; break;
 199   2              case SEND_WRITE_PROT      : return TYPE_RESP_R1; break;
 200   2              case ERASE_WR_BLK_START   : return TYPE_RESP_R1; break;
 201   2              case ERASE_WR_BLK_END     : return TYPE_RESP_R1; break;
 202   2              case ERASE_GROUP_START    : return TYPE_RESP_R1; break;
 203   2              case ERASE_GROUP_END      : return TYPE_RESP_R1; break;
 204   2              case ERASE                : return TYPE_RESP_R1; break;
 205   2              case FAST_IO              : return TYPE_RESP_R4; break;
 206   2              case GO_IRQ_STATE         : return TYPE_RESP_R5; break;
 207   2              case LOCK_UNLOCK          : return TYPE_RESP_R1; break;
 208   2              case APP_CMD              : return TYPE_RESP_R1; break;
 209   2              case GEN_CMD              : return TYPE_RESP_R1; break;
 210   2              // APP_CMDs
 211   2              case SEND_NUM_WR_BLOCKS   : return TYPE_RESP_R1; break;
 212   2              case SD_SEND_OP_COND      : return TYPE_RESP_R3; break;
 213   2              case SEND_SCR             : return TYPE_RESP_R1; break;
 214   2              default                   : return TYPE_RESP_NO; break;
 215   2          }
 216   1          // Following commands are with identical index and response type:
 217   1          //   1. SET_BUS_WIDTH        (ACMD6)    Response R1
 218   1          //      SWITCH               (CMD6)     Response R1
 219   1          //   2. SEND_SD_STATUS       (ACMD13)   Response R1
 220   1          //      SEND_STATUS          (CMD13)    Response R1
 221   1          //   3. SET_WR_BLK_ERASE_CNT (ACMD23)   Response R1
 222   1          //      SET_BLOCK_COUNT      (CMD23)    Response R1
 223   1          //   4. SET_CLR_CARD_DETECT  (ACMD42)   Response R1
 224   1          //      LOCK_UNLOCK          (CMD42)    Response R1
 225   1      }
 226          
 227          STATUS SdSendCmd(BYTE CmdIndex, PBYTE CmdBuf)
 228          {
 229   1          BYTE RespType , RespLen , CmdType;
 230   1          //BYTE Status;
 231   1          BYTE i;
 232   1          BYTE RetryCount = 0;
 233   1      
 234   1          RespType = SdGetRespType(CmdIndex);
 235   1      
 236   1      
 237   1          if((CmdIndex == READ_BLOCK)||
 238   1             (CmdIndex == READ_MUL_BLOCK))
 239   1          {
 240   2              RespLen = 6;
C51 COMPILER V7.02b   SD                                                                   07/18/2006 15:32:57 PAGE 5   

 241   2              CmdType = SD_CMD_RX_DATA;
 242   2          }
 243   1          else if((CmdIndex == WRITE_BLOCK)||
 244   1                  (CmdIndex == WRITE_MUL_BLOCK))
 245   1          {
 246   2              RespLen = 6;
 247   2              CmdType = SD_CMD_TX_DATA;
 248   2          }
 249   1          else if(RespType == TYPE_RESP_NO)
 250   1          {
 251   2              RespLen = 0;
 252   2              CmdType = SD_CMD_ONLY;
 253   2          }
 254   1          else if(RespType == TYPE_RESP_R2)
 255   1          {
 256   2              RespLen = 17;
 257   2              CmdType = SD_CMD_LONG_RSP;
 258   2          }
 259   1      
 260   1          else
 261   1          {
 262   2              RespLen = 6;
 263   2              CmdType = SD_CMD_SHORT_RSP;
 264   2          }
 265   1      
 266   1          if (CmdIndex == 0x5)
 267   1          {
 268   2              RespLen = 6;
 269   2              CmdType = SD_CMD_SHORT_RSP;
 270   2      
 271   2          }
 272   1      
 273   1          for( ; RetryCount < 3; RetryCount++)
 274   1          {
 275   2              //CmdBuf[0] = CARD_CMD_START | CmdIndex;
 276   2              SDMCMDRESBUF00 = CARD_CMD_START | CmdIndex;

⌨️ 快捷键说明

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