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

📄 sdspi.lst

📁 Tried to make CAN logger on AT91sam7X-ek, but have no idea how to implement FATFs... -( I m just a
💻 LST
📖 第 1 页 / 共 5 页
字号:
    238              }
    239          }
    240          
    241          //------------------------------------------------------------------------------
    242          /// Convert SD MCI command to a SPI mode command token.
    243          /// \param pCmdToken Pointer to the SD command token.
    244          /// \param arg    SD command argument
    245          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    246          void SDSPI_MakeCmd(unsigned char *pCmdToken, unsigned int arg)
    247          {
   \                     SDSPI_MakeCmd:
   \   00000000   10402DE9           PUSH     {R4,LR}
   \   00000004   0040A0E1           MOV      R4,R0
    248              unsigned char sdCmdNum;
    249              unsigned char crc = 0;
    250              unsigned char crcPrev = 0;
    251          
    252              sdCmdNum = 0x3f & *pCmdToken;
    253              *pCmdToken = sdCmdNum | 0x40;
   \   00000008   0000D4E5           LDRB     R0,[R4, #+0]
   \   0000000C   3F0000E2           AND      R0,R0,#0x3F
   \   00000010   400080E3           ORR      R0,R0,#0x40
   \   00000014   0000C4E5           STRB     R0,[R4, #+0]
    254              *(pCmdToken+1) = (arg >> 24) & 0xff;
   \   00000018   210CA0E1           LSR      R0,R1,#+24
   \   0000001C   0100C4E5           STRB     R0,[R4, #+1]
    255              *(pCmdToken+2) = (arg >> 16) & 0xff;
   \   00000020   2108A0E1           LSR      R0,R1,#+16
   \   00000024   0200C4E5           STRB     R0,[R4, #+2]
    256              *(pCmdToken+3) = (arg >> 8) & 0xff;
   \   00000028   2104A0E1           LSR      R0,R1,#+8
   \   0000002C   0300C4E5           STRB     R0,[R4, #+3]
    257              *(pCmdToken+4) = arg & 0xff;
   \   00000030   0410C4E5           STRB     R1,[R4, #+4]
    258          
    259              crc = crc7(crcPrev, (unsigned char *)(pCmdToken), 5);
    260          
    261              *(pCmdToken+5) = (crc << 1) | 1;
   \   00000034   0520A0E3           MOV      R2,#+5
   \   00000038   0410A0E1           MOV      R1,R4
   \   0000003C   0000A0E3           MOV      R0,#+0
   \   00000040   ........           BL       crc7
   \   00000044   0110A0E3           MOV      R1,#+1
   \   00000048   800081E1           ORR      R0,R1,R0, LSL #+1
   \   0000004C   0500C4E5           STRB     R0,[R4, #+5]
    262          }
   \   00000050   1040BDE8           POP      {R4,LR}
   \   00000054   1EFF2FE1           BX       LR               ;; return
    263          
    264          //------------------------------------------------------------------------------
    265          /// Get response after send SD command.
    266          /// Return 0 if no error, otherwise indicate an error.
    267          /// \param pSdSpi Pointer to the SD SPI instance.
    268          /// \param pCommand  Pointer to the SD command
    269          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    270          unsigned char SDSPI_GetCmdResp(SdSpi *pSdSpi, SdSpiCmd *pCommand)
    271          {
   \                     SDSPI_GetCmdResp:
   \   00000000   7C402DE9           PUSH     {R2-R6,LR}
   \   00000004   0040A0E1           MOV      R4,R0
   \   00000008   0150A0E1           MOV      R5,R1
    272              unsigned char resp[8];  // response 
    273              unsigned char error;
    274              unsigned int  respRetry = 8; //NCR max 8, refer to card datasheet
   \   0000000C   0860A0E3           MOV      R6,#+8
    275          
    276              memset(resp, 0, 8);
   \   00000010   0820A0E3           MOV      R2,#+8
   \   00000014   0010A0E3           MOV      R1,#+0
   \   00000018   0D00A0E1           MOV      R0,SP
   \   0000001C   ........           BL       memset
    277          
    278              // Wait for response start bit. 
    279              do {
    280                  error = SDSPI_Read(pSdSpi, &resp[0], 1);
   \                     ??SDSPI_GetCmdResp_1:
   \   00000020   0120A0E3           MOV      R2,#+1
   \   00000024   0D10A0E1           MOV      R1,SP
   \   00000028   0400A0E1           MOV      R0,R4
   \   0000002C   ........           BL       SDSPI_Read
    281                  if (error) {
   \   00000030   0010B0E1           MOVS     R1,R0
   \   00000034   1000001A           BNE      ??SDSPI_GetCmdResp_2
    282                      TRACE_DEBUG("\n\rpb SDSPI_GetCmdResp: 0x%X\n\r", error);
    283                      return error;
    284                  }
    285                  if ((resp[0]&0x80) == 0) {
   \   00000038   0000DDE5           LDRB     R0,[SP, #+0]
   \   0000003C   800010E3           TST      R0,#0x80
    286                      break;
    287                  }
    288                  respRetry--;
   \   00000040   01605612           SUBSNE   R6,R6,#+1
    289              } while(respRetry > 0);
   \   00000044   F5FFFF1A           BNE      ??SDSPI_GetCmdResp_1
    290          
    291              switch (pCommand->resType) {
   \   00000048   1C00D5E5           LDRB     R0,[R5, #+28]
   \   0000004C   010040E2           SUB      R0,R0,#+1
   \   00000050   060050E3           CMP      R0,#+6
   \   00000054   0700008A           BHI      ??SDSPI_GetCmdResp_3
   \   00000058   04108FE2           ADR      R1,??SDSPI_GetCmdResp_0
   \   0000005C   0010D1E7           LDRB     R1,[R1, R0]
   \   00000060   01F18FE0           ADD      PC,PC,R1, LSL #+2
   \                     ??SDSPI_GetCmdResp_0:
   \   00000064   01071304           DC8      +1,+7,+19,+4
   \   00000068   04042600           DC8      +4,+4,+38,+0
    292                  case 1:
    293                  *(pCommand->pResp) = resp[0];
   \                     ??SDSPI_GetCmdResp_4:
   \   0000006C   180095E5           LDR      R0,[R5, #+24]
   \   00000070   0010DDE5           LDRB     R1,[SP, #+0]
   \   00000074   001080E5           STR      R1,[R0, #+0]
    294                  break;
    295          
    296                  case 2:
    297                  error = SDSPI_Read(pSdSpi, &resp[1], 1);
    298                  if (error) {
    299                      return error;
    300                  }
    301                  *(pCommand->pResp) = resp[0]
    302                                    | (resp[1] << 8);
    303                  break;
    304          
    305                  // Response 3, get OCR
    306                  case 3:
    307                  error = SDSPI_Read(pSdSpi, &resp[1], 4);
    308                  if (error) {
    309                      return error;
    310                  }
    311                  *(pCommand->pResp) = resp[0] 
    312                                    | (resp[1] << 8) 
    313                                    | (resp[2] << 16)
    314                                    | (resp[3] << 24);
    315                  *(pCommand->pResp+1) = resp[4];
    316                  break;
    317          
    318                  case 7:
    319                  TRACE_DEBUG("case 7\n\r");
    320                  error = SDSPI_Read(pSdSpi, &resp[1], 4);
    321                  if (error) {
    322                      return error;
    323                  }
    324                  *(pCommand->pResp) = resp[0]
    325                                    | (resp[1] << 8) 
    326                                    | (resp[2] << 16)
    327                                    | (resp[3] << 24);
    328                  *(pCommand->pResp+1) = resp[4];
    329                  break;
    330          
    331                  default:
    332                  TRACE_DEBUG("PB default\n\r");
    333                  break;
    334              }
    335          
    336              return 0;
   \                     ??SDSPI_GetCmdResp_3:
   \   00000078   0000A0E3           MOV      R0,#+0
   \                     ??SDSPI_GetCmdResp_2:
   \   0000007C   7640BDE8           POP      {R1,R2,R4-R6,LR}
   \   00000080   1EFF2FE1           BX       LR               ;; return
   \                     ??SDSPI_GetCmdResp_5:
   \   00000084   0120A0E3           MOV      R2,#+1
   \   00000088   01108DE2           ADD      R1,SP,#+1
   \   0000008C   0400A0E1           MOV      R0,R4
   \   00000090   ........           BL       SDSPI_Read
   \   00000094   0010B0E1           MOVS     R1,R0
   \   00000098   F7FFFF1A           BNE      ??SDSPI_GetCmdResp_2
   \   0000009C   0000DDE5           LDRB     R0,[SP, #+0]
   \   000000A0   0110DDE5           LDRB     R1,[SP, #+1]
   \   000000A4   010480E1           ORR      R0,R0,R1, LSL #+8
   \   000000A8   181095E5           LDR      R1,[R5, #+24]
   \   000000AC   000081E5           STR      R0,[R1, #+0]
   \   000000B0   F0FFFFEA           B        ??SDSPI_GetCmdResp_3
   \                     ??SDSPI_GetCmdResp_6:
   \   000000B4   0420A0E3           MOV      R2,#+4
   \   000000B8   01108DE2           ADD      R1,SP,#+1
   \   000000BC   0400A0E1           MOV      R0,R4
   \   000000C0   ........           BL       SDSPI_Read
   \   000000C4   0010B0E1           MOVS     R1,R0
   \   000000C8   EBFFFF1A           BNE      ??SDSPI_GetCmdResp_2
   \                     ??SDSPI_GetCmdResp_7:
   \   000000CC   0000DDE5           LDRB     R0,[SP, #+0]
   \   000000D0   0110DDE5           LDRB     R1,[SP, #+1]
   \   000000D4   010480E1           ORR      R0,R0,R1, LSL #+8
   \   000000D8   0210DDE5           LDRB     R1,[SP, #+2]
   \   000000DC   010880E1           ORR      R0,R0,R1, LSL #+16
   \   000000E0   0310DDE5           LDRB     R1,[SP, #+3]
   \   000000E4   010C80E1           ORR      R0,R0,R1, LSL #+24
   \   000000E8   181095E5           LDR      R1,[R5, #+24]
   \   000000EC   000081E5           STR      R0,[R1, #+0]
   \   000000F0   180095E5           LDR      R0,[R5, #+24]
   \   000000F4   0410DDE5           LDRB     R1,[SP, #+4]
   \   000000F8   041080E5           STR      R1,[R0, #+4]
   \   000000FC   DDFFFFEA           B        ??SDSPI_GetCmdResp_3
   \                     ??SDSPI_GetCmdResp_8:
   \   00000100   0420A0E3           MOV      R2,#+4
   \   00000104   01108DE2           ADD      R1,SP,#+1
   \   00000108   0400A0E1           MOV      R0,R4
   \   0000010C   ........           BL       SDSPI_Read
   \   00000110   0010B0E1           MOVS     R1,R0
   \   00000114   D8FFFF1A           BNE      ??SDSPI_GetCmdResp_2
   \   00000118   EBFFFFEA           B        ??SDSPI_GetCmdResp_7
    337          }
    338          
    339          //------------------------------------------------------------------------------
    340          /// Get response after send data.
    341          /// Return 0 if no error, otherwise indicate an error.
    342          /// \param pSdSpi Pointer to the SD SPI instance.
    343          /// \param pCommand  Pointer to the SD command
    344          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    345          unsigned char SDSPI_GetDataResp(SdSpi *pSdSpi, SdSpiCmd *pCommand)
    346          {
   \                     SDSPI_GetDataResp:
   \   00000000   38402DE9           PUSH     {R3-R5,LR}
   \   00000004   0040A0E1           MOV      R4,R0
    347              unsigned char resp = 0;  // response 
   \   00000008   0010A0E3           MOV      R1,#+0
   \   0000000C   0010CDE5           STRB     R1,[SP, #+0]
    348              unsigned char error;
    349              unsigned int respRetry = 18; //NCR max 8, refer to card datasheet
   \   00000010   1250A0E3           MOV      R5,#+18
    350          
    351              // Wait for response start bit. 
    352              do {
    353                  error = SDSPI_Read(pSdSpi, &resp, 1);
   \                     ??SDSPI_GetDataResp_0:
   \   00000014   0120A0E3           MOV      R2,#+1
   \   00000018   0D10A0E1           MOV      R1,SP
   \   0000001C   0400A0E1           MOV      R0,R4

⌨️ 快捷键说明

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