📄 diskio.txt
字号:
; generated by ARM C/C++ Compiler, 4.1 [Build 561]
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Flash\Obj\diskio.o --depend=.\Flash\Obj\diskio.d --cpu=Cortex-M3 --apcs=interwork -O0 --diag_suppress=870 -I..\..\Libraries\CMSIS\CM3\CoreSupport -I..\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x -I..\..\Libraries\STM32F10x_StdPeriph_Driver\inc -I..\..\User\bsp -I..\..\User\fatfs -I..\..\User -IC:\Keil\ARM\INC -IC:\Keil\ARM\INC\ST\STM32F10x -D__MICROLIB -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER ..\..\User\fatfs\diskio.c]
THUMB
AREA ||i.disk_initialize||, CODE, READONLY, ALIGN=2
disk_initialize PROC
;;;33
;;;34 DSTATUS disk_initialize (
000000 b5f0 PUSH {r4-r7,lr}
;;;35 BYTE drv /* Physical drive nmuber (0..) */
;;;36 )
;;;37 {
000002 b095 SUB sp,sp,#0x54
000004 4607 MOV r7,r0
;;;38 SD_CardInfo mSDCardInfo; /* 定义SD卡状态信息结构体 */
;;;39 uint32_t DeviceSizeMul = 0, NumberOfBlocks = 0;
000006 2500 MOVS r5,#0
000008 2600 MOVS r6,#0
;;;40 uint16_t Status;
;;;41
;;;42 Status = SD_Init();
00000a f7fffffe BL SD_Init
00000e 4604 MOV r4,r0
;;;43 if (Status != SD_OK)
000010 2c2a CMP r4,#0x2a
000012 d000 BEQ |L1.22|
;;;44 {
;;;45 fs_printf("SD_Init() fail (%d) : file %s on line %d\r\n", Status, __FILE__, __LINE__);
;;;46 goto retfail;
000014 e042 B |L1.156|
|L1.22|
;;;47 }
;;;48
;;;49 SD_GetCardInfo(&mSDCardInfo); /* 读取SD卡的信息 */
000016 a801 ADD r0,sp,#4
000018 f7fffffe BL SD_GetCardInfo
;;;50 SD_SelectDeselect((uint32_t) (mSDCardInfo.RCA << 16));
00001c f8bd1050 LDRH r1,[sp,#0x50]
000020 0408 LSLS r0,r1,#16
000022 f7fffffe BL SD_SelectDeselect
;;;51 DeviceSizeMul = (mSDCardInfo.SD_csd.DeviceSizeMul + 2);
000026 f89d001c LDRB r0,[sp,#0x1c]
00002a 1c85 ADDS r5,r0,#2
;;;52
;;;53 if (mSDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) /* 高容量SD卡 SDHC */
00002c f89d0052 LDRB r0,[sp,#0x52]
000030 2802 CMP r0,#2
000032 d105 BNE |L1.64|
;;;54 {
;;;55 Mass_Block_Count = (mSDCardInfo.SD_csd.DeviceSize + 1) * 1024;
000034 9805 LDR r0,[sp,#0x14]
000036 1c40 ADDS r0,r0,#1
000038 0280 LSLS r0,r0,#10
00003a 4919 LDR r1,|L1.160|
00003c 6008 STR r0,[r1,#0] ; Mass_Block_Count
00003e e011 B |L1.100|
|L1.64|
;;;56 }
;;;57 else /* 普通SD卡, 最大4G */
;;;58 {
;;;59 NumberOfBlocks = ((1 << (mSDCardInfo.SD_csd.RdBlockLen)) / 512);
000040 f89d200c LDRB r2,[sp,#0xc]
000044 2101 MOVS r1,#1
000046 fa01f002 LSL r0,r1,r2
00004a 17c1 ASRS r1,r0,#31
00004c eb0051d1 ADD r1,r0,r1,LSR #23
000050 124e ASRS r6,r1,#9
;;;60 Mass_Block_Count = ((mSDCardInfo.SD_csd.DeviceSize + 1) * (1 << DeviceSizeMul) << (NumberOfBlocks/2));
000052 9805 LDR r0,[sp,#0x14]
000054 1c40 ADDS r0,r0,#1
000056 2101 MOVS r1,#1
000058 40a9 LSLS r1,r1,r5
00005a 4348 MULS r0,r1,r0
00005c 0871 LSRS r1,r6,#1
00005e 4088 LSLS r0,r0,r1
000060 490f LDR r1,|L1.160|
000062 6008 STR r0,[r1,#0] ; Mass_Block_Count
|L1.100|
;;;61 }
;;;62
;;;63 Status = SD_SelectDeselect((uint32_t) (mSDCardInfo.RCA << 16));
000064 f8bd1050 LDRH r1,[sp,#0x50]
000068 0408 LSLS r0,r1,#16
00006a f7fffffe BL SD_SelectDeselect
00006e 4604 MOV r4,r0
;;;64 Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
000070 f44f6000 MOV r0,#0x800
000074 f7fffffe BL SD_EnableWideBusOperation
000078 4604 MOV r4,r0
;;;65 if (Status != SD_OK)
00007a 2c2a CMP r4,#0x2a
00007c d000 BEQ |L1.128|
;;;66 {
;;;67 fs_printf("SD_EnableWideBusOperation(SDIO_BusWide_4b) Fail (%d)\r\n", Status);
;;;68 goto retfail;
00007e e00d B |L1.156|
|L1.128|
;;;69 }
;;;70
;;;71 Status = SD_SetDeviceMode(SD_DMA_MODE); /* 设置SD卡工作模式为DMA, 其它模式由中断、轮询 */
000080 2000 MOVS r0,#0
000082 f7fffffe BL SD_SetDeviceMode
000086 4604 MOV r4,r0
;;;72 if (Status != SD_OK)
000088 2c2a CMP r4,#0x2a
00008a d000 BEQ |L1.142|
;;;73 {
;;;74 fs_printf("SD_SetDeviceMode(SD_DMA_MODE) Fail (%d)\r\n", Status);
;;;75 goto retfail;
00008c e006 B |L1.156|
|L1.142|
;;;76 }
;;;77
;;;78 /* 显示容量 */
;;;79 Mass_Block_Size = 512;
00008e f44f7000 MOV r0,#0x200
000092 4904 LDR r1,|L1.164|
000094 6008 STR r0,[r1,#0] ; Mass_Block_Size
;;;80 if (mSDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD) /* 高容量SD卡 SDHC */
;;;81 {
;;;82 fs_printf("SDHC Card, Memory Size = %uMB\r\n", Mass_Block_Count / (1024 * 4));
;;;83 }
;;;84 else
;;;85 {
;;;86 fs_printf("Normal Card, Memory Size = %uMB\r\n", (Mass_Block_Count * Mass_Block_Size) /(1024*1024));
;;;87 }
;;;88
;;;89 return RES_OK;
000096 2000 MOVS r0,#0
|L1.152|
;;;90 retfail:
;;;91 return RES_ERROR;
;;;92 }
000098 b015 ADD sp,sp,#0x54
00009a bdf0 POP {r4-r7,pc}
|L1.156|
00009c 2001 MOVS r0,#1 ;91
00009e e7fb B |L1.152|
;;;93
ENDP
|L1.160|
DCD Mass_Block_Count
|L1.164|
DCD Mass_Block_Size
AREA ||i.disk_ioctl||, CODE, READONLY, ALIGN=1
disk_ioctl PROC
;;;198
;;;199 DRESULT disk_ioctl (
000000 4603 MOV r3,r0
;;;200 BYTE drv, /* Physical drive nmuber (0..) */
;;;201 BYTE ctrl, /* Control code */
;;;202 void *buff /* Buffer to send/receive control data */
;;;203 )
;;;204 {
;;;205 return RES_OK;
000002 2000 MOVS r0,#0
;;;206 }
000004 4770 BX lr
;;;207
ENDP
AREA ||i.disk_read||, CODE, READONLY, ALIGN=2
REQUIRE _printf_percent
REQUIRE _printf_d
REQUIRE _printf_int_dec
disk_read PROC
;;;110
;;;111 DRESULT disk_read (
000000 e92d41f0 PUSH {r4-r8,lr}
;;;112 BYTE drv, /* Physical drive nmuber (0..) */
;;;113 BYTE *buff, /* Data buffer to store read data */
;;;114 DWORD sector, /* Sector address (LBA) */
;;;115 BYTE count /* Number of sectors to read (1..255) */
;;;116 )
;;;117 {
000004 4680 MOV r8,r0
000006 460e MOV r6,r1
000008 4614 MOV r4,r2
00000a 461d MOV r5,r3
;;;118 SD_Error Status = SD_OK;
00000c 272a MOVS r7,#0x2a
;;;119
;;;120 if (count == 1)
00000e 2d01 CMP r5,#1
000010 d106 BNE |L3.32|
;;;121 {
;;;122 Status = SD_ReadBlock(buff, sector << 9 , SECTOR_SIZE);
000012 0261 LSLS r1,r4,#9
000014 025a LSLS r2,r3,#9
000016 4630 MOV r0,r6
000018 f7fffffe BL SD_ReadBlock
00001c 4607 MOV r7,r0
00001e e007 B |L3.48|
|L3.32|
;;;123 }
;;;124 else
;;;125 {
;;;126 Status = SD_ReadMultiBlocks(buff, sector << 9 , SECTOR_SIZE, count);
000020 0261 LSLS r1,r4,#9
000022 462b MOV r3,r5
000024 f44f7200 MOV r2,#0x200
000028 4630 MOV r0,r6
00002a f7fffffe BL SD_ReadMultiBlocks
00002e 4607 MOV r7,r0
|L3.48|
;;;127 }
;;;128
;;;129 if (Status == SD_OK)
000030 2f2a CMP r7,#0x2a
000032 d102 BNE |L3.58|
;;;130 {
;;;131 return RES_OK;
000034 2000 MOVS r0,#0
|L3.54|
;;;132 }
;;;133 else
;;;134 {
;;;135 printf("Err: SD_ReadMultiBlocks(,%d,%d)\r\n",sector,count);
;;;136 return RES_ERROR;
;;;137 }
;;;138 }
000036 e8bd81f0 POP {r4-r8,pc}
|L3.58|
00003a 462a MOV r2,r5 ;135
00003c 4621 MOV r1,r4 ;135
00003e a002 ADR r0,|L3.72|
000040 f7fffffe BL __2printf
000044 2001 MOVS r0,#1 ;136
000046 e7f6 B |L3.54|
;;;139
ENDP
|L3.72|
000048 4572723a DCB "Err: SD_ReadMultiBlocks(,%d,%d)\r\n",0
00004c 2053445f
000050 52656164
000054 4d756c74
000058 69426c6f
00005c 636b7328
000060 2c25642c
000064 2564290d
000068 0a00
00006a 00 DCB 0
00006b 00 DCB 0
AREA ||i.disk_status||, CODE, READONLY, ALIGN=1
disk_status PROC
;;;97
;;;98 DSTATUS disk_status (
000000 4601 MOV r1,r0
;;;99 BYTE drv /* Physical drive nmuber (0..) */
;;;100 )
;;;101 {
;;;102 return 0;
000002 2000 MOVS r0,#0
;;;103 }
000004 4770 BX lr
;;;104
ENDP
AREA ||i.disk_write||, CODE, READONLY, ALIGN=2
REQUIRE _printf_percent
REQUIRE _printf_d
REQUIRE _printf_int_dec
disk_write PROC
;;;151 #if _READONLY == 0
;;;152 DRESULT disk_write (
000000 e92d41f0 PUSH {r4-r8,lr}
;;;153 BYTE drv, /* Physical drive nmuber (0..) */
;;;154 const BYTE *buff, /* Data to be written */
;;;155 DWORD sector, /* Sector address (LBA) */
;;;156 BYTE count /* Number of sectors to write (1..255) */
;;;157 )
;;;158 {
000004 4680 MOV r8,r0
000006 460e MOV r6,r1
000008 4614 MOV r4,r2
00000a 461d MOV r5,r3
;;;159 SD_Error Status = SD_OK;
00000c 272a MOVS r7,#0x2a
;;;160
;;;161 #if 1
;;;162 while (count--)
00000e e009 B |L5.36|
|L5.16|
;;;163 {
;;;164 Status = SD_WriteBlock((uint8_t *)buff, sector << 9 ,SECTOR_SIZE);
000010 0261 LSLS r1,r4,#9
000012 f44f7200 MOV r2,#0x200
000016 4630 MOV r0,r6
000018 f7fffffe BL SD_WriteBlock
00001c 4607 MOV r7,r0
;;;165 if (Status != SD_OK)
00001e 2f2a CMP r7,#0x2a
000020 d000 BEQ |L5.36|
;;;166 {
;;;167 break;
000022 e004 B |L5.46|
|L5.36|
000024 0028 MOVS r0,r5 ;162
000026 f1a50101 SUB r1,r5,#1 ;162
00002a b2cd UXTB r5,r1 ;162
00002c d1f0 BNE |L5.16|
|L5.46|
00002e bf00 NOP
;;;168 }
;;;169 }
;;;170 #else /* SD_WriteMultiBlocks() 偶尔会执行出错 */
;;;171 if (count == 1)
;;;172 {
;;;173 Status = SD_WriteBlock((uint8_t *)buff, sector << 9 ,SECTOR_SIZE);
;;;174 }
;;;175 else
;;;176 {
;;;177 Status = SD_WriteMultiBlocks((uint8_t *)buff, sector << 9 ,SECTOR_SIZE, count);
;;;178 }
;;;179 #endif
;;;180
;;;181 if (Status == SD_OK)
000030 2f2a CMP r7,#0x2a
000032 d102 BNE |L5.58|
;;;182 {
;;;183 return RES_OK;
000034 2000 MOVS r0,#0
|L5.54|
;;;184 }
;;;185 else
;;;186 {
;;;187 printf("Err: SD_WriteBlocks(,%d,%d)\r\n",sector,count);
;;;188 return RES_ERROR;
;;;189 }
;;;190 }
000036 e8bd81f0 POP {r4-r8,pc}
|L5.58|
00003a 462a MOV r2,r5 ;187
00003c 4621 MOV r1,r4 ;187
00003e a002 ADR r0,|L5.72|
000040 f7fffffe BL __2printf
000044 2001 MOVS r0,#1 ;188
000046 e7f6 B |L5.54|
;;;191 #endif /* _READONLY */
ENDP
|L5.72|
000048 4572723a DCB "Err: SD_WriteBlocks(,%d,%d)\r\n",0
00004c 2053445f
000050 57726974
000054 65426c6f
000058 636b7328
00005c 2c25642c
000060 2564290d
000064 0a00
000066 00 DCB 0
000067 00 DCB 0
AREA ||.data||, DATA, ALIGN=2
Mass_Block_Size
DCD 0x00000000
Mass_Block_Count
DCD 0x00000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -