📄 msd.txt
字号:
00002a 2800 CMP r0,#0 ;593
00002c d0fb BEQ |L7.38|
00002e 4620 MOV r0,r4 ;595
000030 bd70 POP {r4-r6,pc}
;;;597
ENDP
AREA ||i.MSD_WriteBlock||, CODE, READONLY, ALIGN=2
MSD_WriteBlock PROC
;;;88 u8 MSD_WriteBlock(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
;;;89 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;90 u32 i = 0;
;;;91 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;92
;;;93 /* MSD chip select low */
;;;94 MSD_CS_LOW();
000004 f8df8068 LDR r8,|L8.112|
000008 4605 MOV r5,r0 ;89
00000a 4689 MOV r9,r1 ;89
00000c 4616 MOV r6,r2 ;89
00000e 2400 MOVS r4,#0 ;90
000010 27ff MOVS r7,#0xff ;91
000012 2108 MOVS r1,#8
000014 4640 MOV r0,r8
000016 f7fffffe BL GPIO_ResetBits
;;;95 /* Send CMD24 (MSD_WRITE_BLOCK) to write multiple block */
;;;96 MSD_SendCmd(MSD_WRITE_BLOCK, WriteAddr, 0xFF);
00001a 22ff MOVS r2,#0xff
00001c 4649 MOV r1,r9
00001e 2018 MOVS r0,#0x18
000020 f7fffffe BL MSD_SendCmd
;;;97
;;;98 /* Check if the MSD acknowledged the write block command: R1 response (0x00: no errors) */
;;;99 if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
000024 2000 MOVS r0,#0
000026 f7fffffe BL MSD_GetResponse
00002a b9b0 CBNZ r0,|L8.90|
;;;100 {
;;;101 /* Send a dummy byte */
;;;102 MSD_WriteByte(DUMMY);
00002c 20ff MOVS r0,#0xff
00002e f7fffffe BL MSD_WriteByte
;;;103 /* Send the data token to signify the start of the data */
;;;104 MSD_WriteByte(0xFE);
000032 20fe MOVS r0,#0xfe
000034 f7fffffe BL MSD_WriteByte
;;;105 /* Write the block data to MSD : write count data by block */
;;;106 for (i = 0; i < NumByteToWrite; i++)
000038 e004 B |L8.68|
|L8.58|
;;;107 {
;;;108 /* Send the pointed byte */
;;;109 MSD_WriteByte(*pBuffer);
00003a 7828 LDRB r0,[r5,#0]
00003c f7fffffe BL MSD_WriteByte
;;;110 /* Point to the next location where the byte read will be saved */
;;;111 pBuffer++;
000040 1c6d ADDS r5,r5,#1
000042 1c64 ADDS r4,r4,#1 ;106
|L8.68|
000044 42b4 CMP r4,r6 ;106
000046 d3f8 BCC |L8.58|
;;;112 }
;;;113 /* Put CRC bytes (not really needed by us, but required by MSD) */
;;;114 MSD_ReadByte();
000048 f7fffffe BL MSD_ReadByte
;;;115 MSD_ReadByte();
00004c f7fffffe BL MSD_ReadByte
;;;116 /* Read data response */
;;;117 if (MSD_GetDataResponse() == MSD_DATA_OK)
000050 f7fffffe BL MSD_GetDataResponse
000054 2805 CMP r0,#5
000056 d100 BNE |L8.90|
;;;118 {
;;;119 rvalue = MSD_RESPONSE_NO_ERROR;
000058 2700 MOVS r7,#0
|L8.90|
;;;120 }
;;;121 }
;;;122
;;;123 /* MSD chip select high */
;;;124 MSD_CS_HIGH();
00005a 2108 MOVS r1,#8
00005c 4640 MOV r0,r8
00005e f7fffffe BL GPIO_SetBits
;;;125 /* Send dummy byte: 8 Clock pulses of delay */
;;;126 MSD_WriteByte(DUMMY);
000062 20ff MOVS r0,#0xff
000064 f7fffffe BL MSD_WriteByte
;;;127 /* Returns the reponse */
;;;128 return rvalue;
000068 4638 MOV r0,r7
;;;129 }
00006a e8bd87f0 POP {r4-r10,pc}
;;;130
ENDP
00006e 0000 DCW 0x0000
|L8.112|
000070 40011800 DCD 0x40011800
AREA ||i.MSD_ReadBlock||, CODE, READONLY, ALIGN=2
MSD_ReadBlock PROC
;;;142 u8 MSD_ReadBlock(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)
;;;143 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;144 u32 i = 0;
;;;145 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;146
;;;147 /* MSD chip select low */
;;;148 MSD_CS_LOW();
000004 4f18 LDR r7,|L9.104|
000006 4605 MOV r5,r0 ;143
000008 4689 MOV r9,r1 ;143
00000a 4616 MOV r6,r2 ;143
00000c 2400 MOVS r4,#0 ;144
00000e f04f08ff MOV r8,#0xff ;145
000012 2108 MOVS r1,#8
000014 4638 MOV r0,r7
000016 f7fffffe BL GPIO_ResetBits
;;;149 /* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */
;;;150 MSD_SendCmd(MSD_READ_SINGLE_BLOCK, ReadAddr, 0xFF);
00001a 22ff MOVS r2,#0xff
00001c 4649 MOV r1,r9
00001e 2011 MOVS r0,#0x11
000020 f7fffffe BL MSD_SendCmd
;;;151
;;;152 /* Check if the MSD acknowledged the read block command: R1 response (0x00: no errors) */
;;;153 if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
000024 2000 MOVS r0,#0
000026 f7fffffe BL MSD_GetResponse
00002a b990 CBNZ r0,|L9.82|
;;;154 {
;;;155 /* Now look for the data token to signify the start of the data */
;;;156 if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
00002c 20fe MOVS r0,#0xfe
00002e f7fffffe BL MSD_GetResponse
000032 b970 CBNZ r0,|L9.82|
000034 e005 B |L9.66|
;;;157 {
;;;158 /* Read the MSD block data : read NumByteToRead data */
;;;159 for (i = 0; i < NumByteToRead; i++)
;;;160 {
;;;161 /* Save the received data */
;;;162 *pBuffer = MSD_ReadByte();
000036 bf00 NOP
|L9.56|
000038 f7fffffe BL MSD_ReadByte
00003c f8050b01 STRB r0,[r5],#1
000040 1c64 ADDS r4,r4,#1 ;159
|L9.66|
000042 42b4 CMP r4,r6 ;159
000044 d3f8 BCC |L9.56|
;;;163 /* Point to the next location where the byte read will be saved */
;;;164 pBuffer++;
;;;165 }
;;;166 /* Get CRC bytes (not really needed by us, but required by MSD) */
;;;167 MSD_ReadByte();
000046 f7fffffe BL MSD_ReadByte
;;;168 MSD_ReadByte();
00004a f7fffffe BL MSD_ReadByte
;;;169 /* Set response value to success */
;;;170 rvalue = MSD_RESPONSE_NO_ERROR;
00004e f04f0800 MOV r8,#0
|L9.82|
;;;171 }
;;;172 }
;;;173
;;;174 /* MSD chip select high */
;;;175 MSD_CS_HIGH();
000052 2108 MOVS r1,#8
000054 4638 MOV r0,r7
000056 f7fffffe BL GPIO_SetBits
;;;176 /* Send dummy byte: 8 Clock pulses of delay */
;;;177 MSD_WriteByte(DUMMY);
00005a 20ff MOVS r0,#0xff
00005c f7fffffe BL MSD_WriteByte
;;;178 /* Returns the reponse */
;;;179 return rvalue;
000060 4640 MOV r0,r8
;;;180 }
000062 e8bd87f0 POP {r4-r10,pc}
;;;181
ENDP
000066 0000 DCW 0x0000
|L9.104|
000068 40011800 DCD 0x40011800
AREA ||i.MSD_WriteBuffer||, CODE, READONLY, ALIGN=2
MSD_WriteBuffer PROC
;;;193 u8 MSD_WriteBuffer(u8* pBuffer, u32 WriteAddr, u32 NumByteToWrite)
;;;194 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;195 u32 i = 0, NbrOfBlock = 0, Offset = 0;
;;;196 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;197
;;;198 /* Calculate number of blocks to write */
;;;199 NbrOfBlock = NumByteToWrite / BLOCK_SIZE;
;;;200 /* MSD chip select low */
;;;201 MSD_CS_LOW();
000004 f8dfa080 LDR r10,|L10.136|
000008 4605 MOV r5,r0 ;194
00000a 4689 MOV r9,r1 ;194
00000c 2600 MOVS r6,#0 ;195
00000e 24ff MOVS r4,#0xff ;196
000010 0a57 LSRS r7,r2,#9 ;199
000012 2108 MOVS r1,#8
000014 4650 MOV r0,r10
000016 f7fffffe BL GPIO_ResetBits
;;;202
;;;203 /* Data transfer */
;;;204 while (NbrOfBlock --)
00001a e02a B |L10.114|
|L10.28|
;;;205 {
;;;206 /* Send CMD24 (MSD_WRITE_BLOCK) to write blocks */
;;;207 MSD_SendCmd(MSD_WRITE_BLOCK, WriteAddr + Offset, 0xFF);
00001c eb090106 ADD r1,r9,r6
000020 22ff MOVS r2,#0xff
000022 2018 MOVS r0,#0x18
000024 f7fffffe BL MSD_SendCmd
;;;208
;;;209 /* Check if the MSD acknowledged the write block command: R1 response (0x00: no errors) */
;;;210 if (MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
000028 2000 MOVS r0,#0
00002a f7fffffe BL MSD_GetResponse
00002e 2800 CMP r0,#0
;;;211 {
;;;212 return MSD_RESPONSE_FAILURE;
000030 f04f00ff MOV r0,#0xff
000034 d001 BEQ |L10.58|
|L10.54|
;;;213 }
;;;214 /* Send dummy byte */
;;;215 MSD_WriteByte(DUMMY);
;;;216 /* Send the data token to signify the start of the data */
;;;217 MSD_WriteByte(MSD_START_DATA_SINGLE_BLOCK_WRITE);
;;;218 /* Write the block data to MSD : write count data by block */
;;;219 for (i = 0; i < BLOCK_SIZE; i++)
;;;220 {
;;;221 /* Send the pointed byte */
;;;222 MSD_WriteByte(*pBuffer);
;;;223 /* Point to the next location where the byte read will be saved */
;;;224 pBuffer++;
;;;225 }
;;;226 /* Set next write address */
;;;227 Offset += 512;
;;;228 /* Put CRC bytes (not really needed by us, but required by MSD) */
;;;229 MSD_ReadByte();
;;;230 MSD_ReadByte();
;;;231 /* Read data response */
;;;232 if (MSD_GetDataResponse() == MSD_DATA_OK)
;;;233 {
;;;234 /* Set response value to success */
;;;235 rvalue = MSD_RESPONSE_NO_ERROR;
;;;236 }
;;;237 else
;;;238 {
;;;239 /* Set response value to failure */
;;;240 rvalue = MSD_RESPONSE_FAILURE;
;;;241 }
;;;242 }
;;;243
;;;244 /* MSD chip select high */
;;;245 MSD_CS_HIGH();
;;;246 /* Send dummy byte: 8 Clock pulses of delay */
;;;247 MSD_WriteByte(DUMMY);
;;;248 /* Returns the reponse */
;;;249 return rvalue;
;;;250 }
000036 e8bd87f0 POP {r4-r10,pc}
|L10.58|
00003a f7fffffe BL MSD_WriteByte
00003e 20fe MOVS r0,#0xfe ;217
000040 f7fffffe BL MSD_WriteByte
000044 2400 MOVS r4,#0 ;219
000046 f44f7800 MOV r8,#0x200 ;219
|L10.74|
00004a 7828 LDRB r0,[r5,#0] ;222
00004c f7fffffe BL MSD_WriteByte
000050 1c6d ADDS r5,r5,#1 ;224
000052 1c64 ADDS r4,r4,#1 ;219
000054 4544 CMP r4,r8 ;219
000056 d3f8 BCC |L10.74|
000058 f5067600 ADD r6,r6,#0x200 ;227
00005c f7fffffe BL MSD_ReadByte
000060 f7fffffe BL MSD_ReadByte
000064 f7fffffe BL MSD_GetDataResponse
000068 2805 CMP r0,#5 ;232
00006a d101 BNE |L10.112|
00006c 2400 MOVS r4,#0 ;235
00006e e000 B |L10.114|
|L10.112|
000070 24ff MOVS r4,#0xff ;240
|L10.114|
000072 1e7f SUBS r7,r7,#1 ;204
000074 d2d2 BCS |L10.28|
000076 2108 MOVS r1,#8 ;245
000078 4650 MOV r0,r10 ;245
00007a f7fffffe BL GPIO_SetBits
00007e 20ff MOVS r0,#0xff ;247
000080 f7fffffe BL MSD_WriteByte
000084 4620 MOV r0,r4 ;249
000086 e7d6 B |L10.54|
;;;251
ENDP
|L10.136|
000088 40011800 DCD 0x40011800
AREA ||i.MSD_ReadBuffer||, CODE, READONLY, ALIGN=2
MSD_ReadBuffer PROC
;;;263 u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead)
;;;264 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;265 u32 i = 0, NbrOfBlock = 0, Offset = 0;
;;;266 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;267
;;;268 /* Calculate number of blocks to read */
;;;269 NbrOfBlock = NumByteToRead / BLOCK_SIZE;
;;;270 /* MSD chip select low */
;;;271 MSD_CS_LOW();
000004 f8dfa074 LDR r10,|L11.124|
000008 4605 MOV r5,r0 ;264
00000a 4689 MOV r9,r1 ;264
00000c 2600 MOVS r6,#0 ;265
00000e 24ff MOVS r4,#0xff ;266
000010 0a57 LSRS r7,r2,#9 ;269
000012 2108 MOVS r1,#8
000014 4650 MOV r0,r10
000016 f7fffffe BL GPIO_ResetBits
00001a f44f7800 MOV r8,#0x200
00001e e021 B |L11.100|
|L11.32|
;;;272
;;;273 /* Data transfer */
;;;274 while (NbrOfBlock --)
;;;275 {
;;;276 /* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */
;;;277 MSD_SendCmd (MSD_READ_SINGLE_BLOCK, ReadAddr + Offset, 0xFF);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -