📄 sddriver.lst
字号:
\ 000000DA 0020 MOV R0,#+0
\ ??SD_GetCardInfo_1:
\ 000000DC 04B0 ADD SP,#+0x10
\ 000000DE 30BC POP {R4,R5}
\ 000000E0 02BC POP {R1}
\ 000000E2 0847 BX R1 ;; return
\ ??SD_GetCardInfo_2:
\ 000000E4 ........ DC32 sds + 8
\ 000000E8 ........ DC32 sds + 12
507 }
508
509 /*******************************************************************************************************************
510 ** 函数名称: INT8U SD_CalTimeout() Name: INT8U SD_CalTimeout()
511 ** 功能描述: 计算读/写/擦超时时间 Function: calculate timeout of reading,writing,erasing
512 ** 输 入: INT8U *csdbuf : CSD寄存器内容 Input: INT8U *csdbuf : CSD register content
513 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
514 *******************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
515 INT8U SD_CalTimeout(INT8U *csdbuf)
516 {
\ SD_CalTimeout:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 021C MOV R2,R0
517 INT32U tmp;
518 INT8U time_u,time_v,fator;
519
520 sds.timeout_read = READ_TIMEOUT_100MS; /* 默认读超时为100ms */
\ 00000004 3C48 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 00000006 8721 MOV R1,#+0x87
\ 00000008 4902 LSL R1,R1,#+0x9 ;; #+0x10E00
\ 0000000A 0160 STR R1,[R0, #+0]
521 sds.timeout_write = WRITE_TIMEOUT_250MS; /* 默认写超时为250ms */
\ 0000000C 3B48 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 0000000E 3C49 LDR R1,??SD_CalTimeout_0+0x8 ;; 0x2a300
\ 00000010 0160 STR R1,[R0, #+0]
522 sds.timeout_erase = WRITE_TIMEOUT_250MS;
\ 00000012 3C48 LDR R0,??SD_CalTimeout_0+0xC ;; sds + 24
\ 00000014 3A49 LDR R1,??SD_CalTimeout_0+0x8 ;; 0x2a300
\ 00000016 0160 STR R1,[R0, #+0]
523
524 time_u = (csdbuf[TAAC_POS] & TAAC_MSK); /* 读超时时间单位 read timeout unit */
\ 00000018 5078 LDRB R0,[R2, #+0x1]
\ 0000001A 4007 LSL R0,R0,#+0x1D ;; ZeroExt R0,R0,#+0x1D,#+0x1D
\ 0000001C 400F LSR R0,R0,#+0x1D
\ 0000001E 031C MOV R3,R0
525 time_v = (csdbuf[TAAC_POS] & NSAC_MSK) >> 3; /* 读超时时间值 read timeout value */
\ 00000020 5078 LDRB R0,[R2, #+0x1]
\ 00000022 7821 MOV R1,#+0x78
\ 00000024 0140 AND R1,R0
\ 00000026 081C MOV R0,R1
\ 00000028 C010 ASR R0,R0,#+0x3
\ 0000002A 041C MOV R4,R0
526 fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2; /* 读超时时间因数 read timeout factor */
\ 0000002C 107B LDRB R0,[R2, #+0xC]
\ 0000002E 1C21 MOV R1,#+0x1C
\ 00000030 0140 AND R1,R0
\ 00000032 081C MOV R0,R1
\ 00000034 8010 ASR R0,R0,#+0x2
\ 00000036 051C MOV R5,R0
527
528 if(time_v == 0) return SD_ERR_CARD_PARAM; /* 卡参数有错误 card parameter is error */
\ 00000038 2406 LSL R4,R4,#+0x18 ;; ZeroExt R4,R4,#+0x18,#+0x18
\ 0000003A 240E LSR R4,R4,#+0x18
\ 0000003C 002C CMP R4,#+0
\ 0000003E 01D1 BNE ??SD_CalTimeout_1
\ 00000040 0320 MOV R0,#+0x3
\ 00000042 56E0 B ??SD_CalTimeout_2
529
530 tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u]; /* TACC * f (单位 unit: clock) */
\ ??SD_CalTimeout_1:
\ 00000044 2406 LSL R4,R4,#+0x18 ;; ZeroExt R4,R4,#+0x18,#+0x18
\ 00000046 240E LSR R4,R4,#+0x18
\ 00000048 2F48 LDR R0,??SD_CalTimeout_0+0x10 ;; time_value
\ 0000004A 005D LDRB R0,[R0, R4]
\ 0000004C 2F49 LDR R1,??SD_CalTimeout_0+0x14 ;; 0x546000
\ 0000004E 4843 MUL R0,R1
\ 00000050 0A21 MOV R1,#+0xA
\ 00000052 ........ _BLF ??div32_t,??rT??div32_t
\ 00000056 081C MOV R0,R1
\ 00000058 1B06 LSL R3,R3,#+0x18 ;; ZeroExt R3,R3,#+0x18,#+0x18
\ 0000005A 1B0E LSR R3,R3,#+0x18
\ 0000005C 0421 MOV R1,#+0x4
\ 0000005E 5943 MUL R1,R3
\ 00000060 2B4F LDR R7,??SD_CalTimeout_0+0x18 ;; time_unit
\ 00000062 7958 LDR R1,[R7, R1]
\ 00000064 ........ _BLF ??divu32_t,??rT??divu32_t
\ 00000068 0E1C MOV R6,R1
531 tmp = tmp + csdbuf[NSAC_POS] * 100; /* TACC * f + NSAC * 100 (单位 unit: clock) */
\ 0000006A 9078 LDRB R0,[R2, #+0x2]
\ 0000006C 6421 MOV R1,#+0x64
\ 0000006E 4843 MUL R0,R1
\ 00000070 3618 ADD R6,R6,R0
532
533 /* 计算得到的超时值 the timeout value of being calculated */
534 sds.timeout_read = tmp;
\ 00000072 2148 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 00000074 0660 STR R6,[R0, #+0]
535 sds.timeout_write = tmp * r2w_fator[fator]; /* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
\ 00000076 2148 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 00000078 2D06 LSL R5,R5,#+0x18 ;; ZeroExt R5,R5,#+0x18,#+0x18
\ 0000007A 2D0E LSR R5,R5,#+0x18
\ 0000007C 2549 LDR R1,??SD_CalTimeout_0+0x1C ;; r2w_fator
\ 0000007E 495D LDRB R1,[R1, R5]
\ 00000080 7143 MUL R1,R6
\ 00000082 0160 STR R1,[R0, #+0]
536
537 if (sds.card_type == CARDTYPE_SD)
\ 00000084 .... LDR R0,??DataTable7 ;; sds
\ 00000086 0078 LDRB R0,[R0, #+0]
\ 00000088 0028 CMP R0,#+0
\ 0000008A 1FD1 BNE ??SD_CalTimeout_3
538 {
539 sds.timeout_read = sds.timeout_read * 100 / 8; /* 实际值为计算值的100倍 */
\ 0000008C 1A48 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 0000008E 1A49 LDR R1,??SD_CalTimeout_0 ;; sds + 16
\ 00000090 0968 LDR R1,[R1, #+0]
\ 00000092 6427 MOV R7,#+0x64
\ 00000094 7943 MUL R1,R7
\ 00000096 C908 LSR R1,R1,#+0x3
\ 00000098 0160 STR R1,[R0, #+0]
540 sds.timeout_write = sds.timeout_write * 100 / 8;
\ 0000009A 1848 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 0000009C 1749 LDR R1,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 0000009E 0968 LDR R1,[R1, #+0]
\ 000000A0 6427 MOV R7,#+0x64
\ 000000A2 7943 MUL R1,R7
\ 000000A4 C908 LSR R1,R1,#+0x3
\ 000000A6 0160 STR R1,[R0, #+0]
541 if (sds.timeout_read > READ_TIMEOUT_100MS) /* 取计算值与默认值中的最小值 */
\ 000000A8 1348 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 000000AA 0068 LDR R0,[R0, #+0]
\ 000000AC 1A49 LDR R1,??SD_CalTimeout_0+0x20 ;; 0x10e01
\ 000000AE 8842 CMP R0,R1
\ 000000B0 03D3 BCC ??SD_CalTimeout_4
542 sds.timeout_read = READ_TIMEOUT_100MS;
\ 000000B2 1148 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 000000B4 8721 MOV R1,#+0x87
\ 000000B6 4902 LSL R1,R1,#+0x9 ;; #+0x10E00
\ 000000B8 0160 STR R1,[R0, #+0]
543
544 if (sds.timeout_write > WRITE_TIMEOUT_250MS)
\ ??SD_CalTimeout_4:
\ 000000BA 1048 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 000000BC 0068 LDR R0,[R0, #+0]
\ 000000BE 1749 LDR R1,??SD_CalTimeout_0+0x24 ;; 0x2a301
\ 000000C0 8842 CMP R0,R1
\ 000000C2 11D3 BCC ??SD_CalTimeout_5
545 sds.timeout_write = WRITE_TIMEOUT_250MS;
\ 000000C4 0D48 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 000000C6 0E49 LDR R1,??SD_CalTimeout_0+0x8 ;; 0x2a300
\ 000000C8 0160 STR R1,[R0, #+0]
\ 000000CA 0DE0 B ??SD_CalTimeout_5
546 }
547 else
548 {
549 sds.timeout_read = sds.timeout_read * 10 / 8; /* 实际值为计算值的10倍 */
\ ??SD_CalTimeout_3:
\ 000000CC 0A48 LDR R0,??SD_CalTimeout_0 ;; sds + 16
\ 000000CE 0A49 LDR R1,??SD_CalTimeout_0 ;; sds + 16
\ 000000D0 0968 LDR R1,[R1, #+0]
\ 000000D2 0A27 MOV R7,#+0xA
\ 000000D4 7943 MUL R1,R7
\ 000000D6 C908 LSR R1,R1,#+0x3
\ 000000D8 0160 STR R1,[R0, #+0]
550 sds.timeout_write = sds.timeout_write * 10 / 8;
\ 000000DA 0848 LDR R0,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 000000DC 0749 LDR R1,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 000000DE 0968 LDR R1,[R1, #+0]
\ 000000E0 0A27 MOV R7,#+0xA
\ 000000E2 7943 MUL R1,R7
\ 000000E4 C908 LSR R1,R1,#+0x3
\ 000000E6 0160 STR R1,[R0, #+0]
551 }
552
553 sds.timeout_erase = sds.timeout_write;
\ ??SD_CalTimeout_5:
\ 000000E8 0648 LDR R0,??SD_CalTimeout_0+0xC ;; sds + 24
\ 000000EA 0449 LDR R1,??SD_CalTimeout_0+0x4 ;; sds + 20
\ 000000EC 0968 LDR R1,[R1, #+0]
\ 000000EE 0160 STR R1,[R0, #+0]
554 return SD_NO_ERR;
\ 000000F0 0020 MOV R0,#+0
\ ??SD_CalTimeout_2:
\ 000000F2 F0BC POP {R4-R7}
\ 000000F4 02BC POP {R1}
\ 000000F6 0847 BX R1 ;; return
\ ??SD_CalTimeout_0:
\ 000000F8 ........ DC32 sds + 16
\ 000000FC ........ DC32 sds + 20
\ 00000100 00A30200 DC32 0x2a300
\ 00000104 ........ DC32 sds + 24
\ 00000108 ........ DC32 time_value
\ 0000010C 00605400 DC32 0x546000
\ 00000110 ........ DC32 time_unit
\ 00000114 ........ DC32 r2w_fator
\ 00000118 010E0100 DC32 0x10e01
\ 0000011C 01A30200 DC32 0x2a301
555 }
556
557 /*******************************************************************************************************************
558 ** 函数名称: INT8U SD_ActiveInit() Name: INT8U SD_ActiveInit()
559 ** 功能描述: 激活卡,并获得卡型 Function: active card, and get the card type
560 ** 输 入: 无 Input: NULL
561 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
562 ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
563 当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
564 最大次数为宏定义SD_IDLE_WAIT_MAX.
565 *******************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
566 INT8U SD_ActiveInit(void)
567 {
\ SD_ActiveInit:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -