📄 sddriver.lst
字号:
403 return ret;
404 }
405
406 ret = SD_EraseEndBlock(startaddr + sds.erase_unit - 1); /* 选择终止块地址 select end address */
407 if (ret != SD_NO_ERR)
408 {
409 SD_EndSD();
410 return ret;
411 }
412
413 ret = SD_EraseSelectedBlock(); /* 擦除所选的块 erase blocks selected */
414 if (ret != SD_NO_ERR)
415 {
416 SD_EndSD();
417 return ret;
418 }
419
420 startaddr += sds.erase_unit; /* 起始地址递增 */
421 blocknum -= sds.erase_unit;
422 tmp = blocknum - sds.erase_unit;
423 };
424
425 if (blocknum > 0) /* 擦除不够once_erase块 */
426 { /* erase blocks that numbers is not enough once_erase */
427 ret = SD_EraseStartBlock(startaddr);
428 if (ret != SD_NO_ERR)
429 {
430 SD_EndSD();
431 return ret;
432 }
433
434 ret = SD_EraseEndBlock(startaddr + blocknum - 1);
435 if (ret != SD_NO_ERR)
436 {
437 SD_EndSD();
438 return ret;
439 }
440
441 ret = SD_EraseSelectedBlock();
442 if (ret != SD_NO_ERR)
443 {
444 SD_EndSD();
445 return ret;
446 }
447 }
448
449 SD_EndSD();
450 return SD_NO_ERR; /* 返回擦除成功 return erase sucessfully */
451 }
452 #endif
453
454
455 /*****************************************************************
456
457 下面为子程序
458
459 *****************************************************************/
460 /*******************************************************************************************************************
461 ** 函数名称: INT8U SD_GetCardInfo() Name: INT8U SD_GetCardInfo()
462 ** 功能描述: 获得SD/MMC卡的信息 Function: get the information of SD/MMC card
463 ** 输 入: INT8U cardtype: 卡类型 Input: INT8U cardtype: card type
464 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
465 *******************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
466 INT8U SD_GetCardInfo()
467 {
\ SD_GetCardInfo:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 84B0 SUB SP,#+0x10
468 INT32U tmp;
469 INT8U csdbuf[16],ret;
470
471 ret = SD_ReadCSD(16, csdbuf); /* 读CSD寄存器 read CSD register */
\ 00000004 6946 MOV R1,SP
\ 00000006 1020 MOV R0,#+0x10
\ 00000008 ........ _BLF SD_ReadCSD,SD_ReadCSD??rT
\ 0000000C 051C MOV R5,R0
472 if (ret != SD_NO_ERR)
\ 0000000E 002D CMP R5,#+0
\ 00000010 01D0 BEQ ??SD_GetCardInfo_0
473 return ret;
\ 00000012 281C MOV R0,R5
\ 00000014 62E0 B ??SD_GetCardInfo_1
474
475 SD_CalTimeout(csdbuf); /* 计算超时时间值 calculate timeout value */
\ ??SD_GetCardInfo_0:
\ 00000016 6846 MOV R0,SP
\ 00000018 ........ BL SD_CalTimeout
476
477 /* 计算块的最大长度 */ /* calculate the size of a sector */
478 sds.block_len = 1 << (csdbuf[READ_BL_LEN_POS] & READ_BL_LEN_MSK); /* (2 ^ READ_BL_LEN) */
\ 0000001C 3148 LDR R0,??SD_GetCardInfo_2 ;; sds + 8
\ 0000001E 0121 MOV R1,#+0x1
\ 00000020 6A46 MOV R2,SP
\ 00000022 5279 LDRB R2,[R2, #+0x5]
\ 00000024 1207 LSL R2,R2,#+0x1C ;; ZeroExt R2,R2,#+0x1C,#+0x1C
\ 00000026 120F LSR R2,R2,#+0x1C
\ 00000028 9140 LSL R1,R2
\ 0000002A 0160 STR R1,[R0, #+0]
479
480 /* 计算卡中块的个数 */ /* calculate the sector numbers of the SD Card */
481 sds.block_num = ((csdbuf[C_SIZE_POS1] & C_SIZE_MSK1) << 10) +
482 (csdbuf[C_SIZE_POS2] << 2) +
483 ((csdbuf[C_SIZE_POS3] & C_SIZE_MSK3) >> 6) + 1; /* (C_SIZE + 1)*/
\ 0000002C .... LDR R0,??DataTable4 ;; sds + 4
\ 0000002E 6946 MOV R1,SP
\ 00000030 8979 LDRB R1,[R1, #+0x6]
\ 00000032 8907 LSL R1,R1,#+0x1E ;; ZeroExt R1,R1,#+0x1E,#+0x1E
\ 00000034 890F LSR R1,R1,#+0x1E
\ 00000036 8902 LSL R1,R1,#+0xA
\ 00000038 6A46 MOV R2,SP
\ 0000003A D279 LDRB R2,[R2, #+0x7]
\ 0000003C 9200 LSL R2,R2,#+0x2
\ 0000003E 8918 ADD R1,R1,R2
\ 00000040 6A46 MOV R2,SP
\ 00000042 127A LDRB R2,[R2, #+0x8]
\ 00000044 1206 LSL R2,R2,#+0x18 ;; ZeroExt R2,R2,#+0x18,#+0x18
\ 00000046 120E LSR R2,R2,#+0x18
\ 00000048 9209 LSR R2,R2,#+0x6
\ 0000004A 1206 LSL R2,R2,#+0x18 ;; ZeroExt R2,R2,#+0x18,#+0x18
\ 0000004C 120E LSR R2,R2,#+0x18
\ 0000004E 8918 ADD R1,R1,R2
\ 00000050 491C ADD R1,#+0x1
\ 00000052 0160 STR R1,[R0, #+0]
484
485 tmp = ((csdbuf[C_SIZE_MULT_POS1] & C_SIZE_MULT_MSK1) << 1) +
486 ((csdbuf[C_SIZE_MULT_POS2] & C_SIZE_MULT_MSK2) >> 7) + 2; /* (C_SIZE_MULT + 2) */
\ 00000054 6846 MOV R0,SP
\ 00000056 407A LDRB R0,[R0, #+0x9]
\ 00000058 8007 LSL R0,R0,#+0x1E ;; ZeroExt R0,R0,#+0x1E,#+0x1E
\ 0000005A 800F LSR R0,R0,#+0x1E
\ 0000005C 4000 LSL R0,R0,#+0x1
\ 0000005E 6946 MOV R1,SP
\ 00000060 897A LDRB R1,[R1, #+0xA]
\ 00000062 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 00000064 090E LSR R1,R1,#+0x18
\ 00000066 C909 LSR R1,R1,#+0x7
\ 00000068 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 0000006A 090E LSR R1,R1,#+0x18
\ 0000006C 4018 ADD R0,R0,R1
\ 0000006E 801C ADD R0,#+0x2
\ 00000070 041C MOV R4,R0
487
488 /* 获得卡中块的数量 */ /* get the block numbers in card */
489 sds.block_num = sds.block_num * (1 << tmp); /* (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */
\ 00000072 .... LDR R0,??DataTable4 ;; sds + 4
\ 00000074 .... LDR R1,??DataTable4 ;; sds + 4
\ 00000076 0968 LDR R1,[R1, #+0]
\ 00000078 0122 MOV R2,#+0x1
\ 0000007A A240 LSL R2,R4
\ 0000007C 5143 MUL R1,R2
\ 0000007E 0160 STR R1,[R0, #+0]
490
491 /* 计算擦除的单位(单位: 块) */
492 if (sds.card_type == CARDTYPE_MMC)
\ 00000080 .... LDR R0,??DataTable7 ;; sds
\ 00000082 0078 LDRB R0,[R0, #+0]
\ 00000084 0128 CMP R0,#+0x1
\ 00000086 17D1 BNE ??SD_GetCardInfo_3
493 {
494 tmp = ((csdbuf[ERASE_GRP_SIZE_POS] & ERASE_GRP_SIZE_MSK) >> 2) + 1; /* (ERASE_GRP_SIZE + 1) */
\ 00000088 6846 MOV R0,SP
\ 0000008A 807A LDRB R0,[R0, #+0xA]
\ 0000008C 7C21 MOV R1,#+0x7C
\ 0000008E 0140 AND R1,R0
\ 00000090 081C MOV R0,R1
\ 00000092 8010 ASR R0,R0,#+0x2
\ 00000094 401C ADD R0,#+0x1
\ 00000096 041C MOV R4,R0
495
496 /* (ERASE_GRP_SIZE + 1) * (ERASE_GRP_MULTI + 1) */
497 tmp *= ((csdbuf[ERASE_GRP_MULTI_POS1] & ERASE_GRP_MULTI_MSK1) << 3) +
498 ((csdbuf[ERASE_GRP_MULTI_POS2] & ERASE_GRP_MULTI_MSK2) >> 5) + 1;
\ 00000098 6846 MOV R0,SP
\ 0000009A 807A LDRB R0,[R0, #+0xA]
\ 0000009C 8007 LSL R0,R0,#+0x1E ;; ZeroExt R0,R0,#+0x1E,#+0x1E
\ 0000009E 800F LSR R0,R0,#+0x1E
\ 000000A0 C000 LSL R0,R0,#+0x3
\ 000000A2 6946 MOV R1,SP
\ 000000A4 C97A LDRB R1,[R1, #+0xB]
\ 000000A6 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 000000A8 090E LSR R1,R1,#+0x18
\ 000000AA 4909 LSR R1,R1,#+0x5
\ 000000AC 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 000000AE 090E LSR R1,R1,#+0x18
\ 000000B0 4018 ADD R0,R0,R1
\ 000000B2 401C ADD R0,#+0x1
\ 000000B4 4443 MUL R4,R0
\ 000000B6 0EE0 B ??SD_GetCardInfo_4
499 }
500 else /*calculate the size of sector */
501 tmp = ((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +
502 ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1; /* SD: SECTOR_SIZE */
\ ??SD_GetCardInfo_3:
\ 000000B8 6846 MOV R0,SP
\ 000000BA 807A LDRB R0,[R0, #+0xA]
\ 000000BC 8006 LSL R0,R0,#+0x1A ;; ZeroExt R0,R0,#+0x1A,#+0x1A
\ 000000BE 800E LSR R0,R0,#+0x1A
\ 000000C0 4000 LSL R0,R0,#+0x1
\ 000000C2 6946 MOV R1,SP
\ 000000C4 C97A LDRB R1,[R1, #+0xB]
\ 000000C6 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 000000C8 090E LSR R1,R1,#+0x18
\ 000000CA C909 LSR R1,R1,#+0x7
\ 000000CC 0906 LSL R1,R1,#+0x18 ;; ZeroExt R1,R1,#+0x18,#+0x18
\ 000000CE 090E LSR R1,R1,#+0x18
\ 000000D0 4018 ADD R0,R0,R1
\ 000000D2 401C ADD R0,#+0x1
\ 000000D4 041C MOV R4,R0
503
504 sds.erase_unit = tmp; /* 擦除单位(块) */
\ ??SD_GetCardInfo_4:
\ 000000D6 0448 LDR R0,??SD_GetCardInfo_2+0x4 ;; sds + 12
\ 000000D8 0460 STR R4,[R0, #+0]
505
506 return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -