📄 bsp_sdio_sd.txt
字号:
00008e 200f MOVS r0,#0xf ;2577
000090 e7cd B |L5.46|
|L5.146|
000092 4640 MOV r0,r8 ;2580
000094 e7cb B |L5.46|
;;;2582
ENDP
000096 0000 DCW 0x0000
|L5.152|
DCD 0x40018000
AREA ||i.CmdResp7Error||, CODE, READONLY, ALIGN=2
CmdResp7Error PROC
;;;2270 */
;;;2271 static SD_Error CmdResp7Error(void)
000000 b570 PUSH {r4-r6,lr}
;;;2272 {
;;;2273 SD_Error errorstatus = SD_OK;
000002 262a MOVS r6,#0x2a
;;;2274 uint32_t status;
;;;2275 uint32_t timeout = SDIO_CMD0TIMEOUT;
000004 f44f3580 MOV r5,#0x10000
;;;2276
;;;2277 status = SDIO->STA;
000008 480f LDR r0,|L6.72|
00000a 6b44 LDR r4,[r0,#0x34]
;;;2278
;;;2279 while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) && (timeout > 0))
00000c e002 B |L6.20|
|L6.14|
;;;2280 {
;;;2281 timeout--;
00000e 1e6d SUBS r5,r5,#1
;;;2282 status = SDIO->STA;
000010 480d LDR r0,|L6.72|
000012 6b44 LDR r4,[r0,#0x34]
|L6.20|
000014 f0140f45 TST r4,#0x45 ;2279
000018 d101 BNE |L6.30|
00001a 2d00 CMP r5,#0 ;2279
00001c d1f7 BNE |L6.14|
|L6.30|
;;;2283 }
;;;2284
;;;2285 if ((timeout == 0) || (status & SDIO_FLAG_CTIMEOUT))
00001e b115 CBZ r5,|L6.38|
000020 f0140f04 TST r4,#4
000024 d005 BEQ |L6.50|
|L6.38|
;;;2286 {
;;;2287 /*!< Card is not V2.0 complient or card does not support the set voltage range */
;;;2288 errorstatus = SD_CMD_RSP_TIMEOUT;
000026 2603 MOVS r6,#3
;;;2289 SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
000028 2004 MOVS r0,#4
00002a f7fffffe BL SDIO_ClearFlag
;;;2290 return(errorstatus);
00002e 4630 MOV r0,r6
|L6.48|
;;;2291 }
;;;2292
;;;2293 if (status & SDIO_FLAG_CMDREND)
;;;2294 {
;;;2295 /*!< Card is SD V2.0 compliant */
;;;2296 errorstatus = SD_OK;
;;;2297 SDIO_ClearFlag(SDIO_FLAG_CMDREND);
;;;2298 return(errorstatus);
;;;2299 }
;;;2300 return(errorstatus);
;;;2301 }
000030 bd70 POP {r4-r6,pc}
|L6.50|
000032 f0140f40 TST r4,#0x40 ;2293
000036 d005 BEQ |L6.68|
000038 262a MOVS r6,#0x2a ;2296
00003a 2040 MOVS r0,#0x40 ;2297
00003c f7fffffe BL SDIO_ClearFlag
000040 4630 MOV r0,r6 ;2298
000042 e7f5 B |L6.48|
|L6.68|
000044 4630 MOV r0,r6 ;2300
000046 e7f3 B |L6.48|
;;;2302
ENDP
|L6.72|
DCD 0x40018000
AREA ||i.FindSCR||, CODE, READONLY, ALIGN=2
FindSCR PROC
;;;2861 */
;;;2862 static SD_Error FindSCR(uint16_t rca, uint32_t *pscr)
000000 e92d41fc PUSH {r2-r8,lr}
;;;2863 {
000004 4607 MOV r7,r0
000006 460d MOV r5,r1
;;;2864 uint32_t index = 0;
000008 2600 MOVS r6,#0
;;;2865 SD_Error errorstatus = SD_OK;
00000a 242a MOVS r4,#0x2a
;;;2866 uint32_t tempscr[2] = {0, 0};
00000c 2000 MOVS r0,#0
00000e 9000 STR r0,[sp,#0]
000010 9001 STR r0,[sp,#4]
;;;2867
;;;2868 /*!< Set Block Size To 8 Bytes */
;;;2869 /*!< Send CMD55 APP_CMD with argument as card's RCA */
;;;2870 SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)8;
000012 2008 MOVS r0,#8
000014 495b LDR r1,|L7.388|
000016 6008 STR r0,[r1,#0] ; SDIO_CmdInitStructure
;;;2871 SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;
000018 2010 MOVS r0,#0x10
00001a 6048 STR r0,[r1,#4] ; SDIO_CmdInitStructure
;;;2872 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
00001c 2040 MOVS r0,#0x40
00001e 6088 STR r0,[r1,#8] ; SDIO_CmdInitStructure
;;;2873 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
000020 2000 MOVS r0,#0
000022 60c8 STR r0,[r1,#0xc] ; SDIO_CmdInitStructure
;;;2874 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
000024 f44f6080 MOV r0,#0x400
000028 6108 STR r0,[r1,#0x10] ; SDIO_CmdInitStructure
;;;2875 SDIO_SendCommand(&SDIO_CmdInitStructure);
00002a 4608 MOV r0,r1
00002c f7fffffe BL SDIO_SendCommand
;;;2876
;;;2877 errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);
000030 2010 MOVS r0,#0x10
000032 f7fffffe BL CmdResp1Error
000036 4604 MOV r4,r0
;;;2878
;;;2879 if (errorstatus != SD_OK)
000038 2c2a CMP r4,#0x2a
00003a d002 BEQ |L7.66|
;;;2880 {
;;;2881 return(errorstatus);
00003c 4620 MOV r0,r4
|L7.62|
;;;2882 }
;;;2883
;;;2884 /*!< Send CMD55 APP_CMD with argument as card's RCA */
;;;2885 SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16;
;;;2886 SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
;;;2887 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;2888 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
;;;2889 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;2890 SDIO_SendCommand(&SDIO_CmdInitStructure);
;;;2891
;;;2892 errorstatus = CmdResp1Error(SD_CMD_APP_CMD);
;;;2893
;;;2894 if (errorstatus != SD_OK)
;;;2895 {
;;;2896 return(errorstatus);
;;;2897 }
;;;2898 SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
;;;2899 SDIO_DataInitStructure.SDIO_DataLength = 8;
;;;2900 SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b;
;;;2901 SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
;;;2902 SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
;;;2903 SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
;;;2904 SDIO_DataConfig(&SDIO_DataInitStructure);
;;;2905
;;;2906
;;;2907 /*!< Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
;;;2908 SDIO_CmdInitStructure.SDIO_Argument = 0x0;
;;;2909 SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_SEND_SCR;
;;;2910 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;2911 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
;;;2912 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;2913 SDIO_SendCommand(&SDIO_CmdInitStructure);
;;;2914
;;;2915 errorstatus = CmdResp1Error(SD_CMD_SD_APP_SEND_SCR);
;;;2916
;;;2917 if (errorstatus != SD_OK)
;;;2918 {
;;;2919 return(errorstatus);
;;;2920 }
;;;2921
;;;2922 while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
;;;2923 {
;;;2924 if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
;;;2925 {
;;;2926 *(tempscr + index) = SDIO_ReadData();
;;;2927 index++;
;;;2928 }
;;;2929 }
;;;2930
;;;2931 if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
;;;2932 {
;;;2933 SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
;;;2934 errorstatus = SD_DATA_TIMEOUT;
;;;2935 return(errorstatus);
;;;2936 }
;;;2937 else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
;;;2938 {
;;;2939 SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
;;;2940 errorstatus = SD_DATA_CRC_FAIL;
;;;2941 return(errorstatus);
;;;2942 }
;;;2943 else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
;;;2944 {
;;;2945 SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
;;;2946 errorstatus = SD_RX_OVERRUN;
;;;2947 return(errorstatus);
;;;2948 }
;;;2949 else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
;;;2950 {
;;;2951 SDIO_ClearFlag(SDIO_FLAG_STBITERR);
;;;2952 errorstatus = SD_START_BIT_ERR;
;;;2953 return(errorstatus);
;;;2954 }
;;;2955
;;;2956 /*!< Clear all the static flags */
;;;2957 SDIO_ClearFlag(SDIO_STATIC_FLAGS);
;;;2958
;;;2959 *(pscr + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) | ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24);
;;;2960
;;;2961 *(pscr) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) | ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24);
;;;2962
;;;2963 return(errorstatus);
;;;2964 }
00003e e8bd81fc POP {r2-r8,pc}
|L7.66|
000042 4851 LDR r0,|L7.392|
000044 6800 LDR r0,[r0,#0] ;2885 ; RCA
000046 0400 LSLS r0,r0,#16 ;2885
000048 494e LDR r1,|L7.388|
00004a 6008 STR r0,[r1,#0] ;2885 ; SDIO_CmdInitStructure
00004c 2037 MOVS r0,#0x37 ;2886
00004e 6048 STR r0,[r1,#4] ;2886 ; SDIO_CmdInitStructure
000050 2040 MOVS r0,#0x40 ;2887
000052 6088 STR r0,[r1,#8] ;2887 ; SDIO_CmdInitStructure
000054 2000 MOVS r0,#0 ;2888
000056 60c8 STR r0,[r1,#0xc] ;2888 ; SDIO_CmdInitStructure
000058 f44f6080 MOV r0,#0x400 ;2889
00005c 6108 STR r0,[r1,#0x10] ;2889 ; SDIO_CmdInitStructure
00005e 4608 MOV r0,r1 ;2890
000060 f7fffffe BL SDIO_SendCommand
000064 2037 MOVS r0,#0x37 ;2892
000066 f7fffffe BL CmdResp1Error
00006a 4604 MOV r4,r0 ;2892
00006c 2c2a CMP r4,#0x2a ;2894
00006e d001 BEQ |L7.116|
000070 4620 MOV r0,r4 ;2896
000072 e7e4 B |L7.62|
|L7.116|
000074 4845 LDR r0,|L7.396|
000076 4946 LDR r1,|L7.400|
000078 6008 STR r0,[r1,#0] ;2898 ; SDIO_DataInitStructure
00007a 2008 MOVS r0,#8 ;2899
00007c 6048 STR r0,[r1,#4] ;2899 ; SDIO_DataInitStructure
00007e 2030 MOVS r0,#0x30 ;2900
000080 6088 STR r0,[r1,#8] ;2900 ; SDIO_DataInitStructure
000082 2002 MOVS r0,#2 ;2901
000084 60c8 STR r0,[r1,#0xc] ;2901 ; SDIO_DataInitStructure
000086 2000 MOVS r0,#0 ;2902
000088 6108 STR r0,[r1,#0x10] ;2902 ; SDIO_DataInitStructure
00008a 2001 MOVS r0,#1 ;2903
00008c 6148 STR r0,[r1,#0x14] ;2903 ; SDIO_DataInitStructure
00008e 4608 MOV r0,r1 ;2904
000090 f7fffffe BL SDIO_DataConfig
000094 2000 MOVS r0,#0 ;2908
000096 493b LDR r1,|L7.388|
000098 6008 STR r0,[r1,#0] ;2908 ; SDIO_CmdInitStructure
00009a 2033 MOVS r0,#0x33 ;2909
00009c 6048 STR r0,[r1,#4] ;2909 ; SDIO_CmdInitStructure
00009e 2040 MOVS r0,#0x40 ;2910
0000a0 6088 STR r0,[r1,#8] ;2910 ; SDIO_CmdInitStructure
0000a2 2000 MOVS r0,#0 ;2911
0000a4 60c8 STR r0,[r1,#0xc] ;2911 ; SDIO_CmdInitStructure
0000a6 f44f6080 MOV r0,#0x400 ;2912
0000aa 6108 STR r0,[r1,#0x10] ;2912 ; SDIO_CmdInitStructure
0000ac 4608 MOV r0,r1 ;2913
0000ae f7fffffe BL SDIO_SendCommand
0000b2 2033 MOVS r0,#0x33 ;2915
0000b4 f7fffffe BL CmdResp1Error
0000b8 4604 MOV r4,r0 ;2915
0000ba 2c2a CMP r4,#0x2a ;2917
0000bc d001 BEQ |L7.194|
0000be 4620 MOV r0,r4 ;2919
0000c0 e7bd B |L7.62|
|L7.194|
0000c2 e009 B |L7.216|
|L7.196|
0000c4 f44f1000 MOV r0,#0x200000 ;2924
0000c8 f7fffffe BL SDIO_GetFlagStatus
0000cc b120 CBZ r0,|L7.216|
0000ce f7fffffe BL SDIO_ReadData
0000d2 f84d0026 STR r0,[sp,r6,LSL #2] ;2926
0000d6 1c76 ADDS r6,r6,#1 ;2927
|L7.216|
0000d8 482e LDR r0,|L7.404|
0000da 6b40 LDR r0,[r0,#0x34] ;2922
0000dc f240612a MOV r1,#0x62a ;2922
0000e0 4208 TST r0,r1 ;2922
0000e2 d0ef BEQ |L7.196|
0000e4 2008 MOVS r0,#8 ;2931
0000e6 f7fffffe BL SDIO_GetFlagStatus
0000ea b128 CBZ r0,|L7.248|
0000ec 2008 MOVS r0,#8 ;2933
0000ee f7fffffe BL SDIO_ClearFlag
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -