📄 sddriver.lst
字号:
\ 00000066 8020 MOV R0,#+0x80
\ 00000068 8000 LSL R0,R0,#+0x2 ;; #+0x200
\ 0000006A ........ _BLF SD_SetBlockLen,SD_SetBlockLen??rT
\ 0000006E 041C MOV R4,R0
109 if (ret != SD_NO_ERR)
\ 00000070 002C CMP R4,#+0
\ 00000072 08D1 BNE ??SD_Initialize_1
110 goto SD_ERR;
111
112 ret = SD_GetCardInfo(); /* 10. 读CSD寄存器,获取SD卡信息 read CSD register, get the information of SD card */
\ 00000074 ........ BL SD_GetCardInfo
\ 00000078 041C MOV R4,R0
113 if (ret != SD_NO_ERR)
\ 0000007A 002C CMP R4,#+0
\ 0000007C 03D1 BNE ??SD_Initialize_1
114 goto SD_ERR;
115
116 SD_EndSD();
\ 0000007E ........ BL SD_EndSD
117 return SD_NO_ERR; /* 初始化成功 initialize sucessfully */
\ 00000082 0020 MOV R0,#+0
\ 00000084 02E0 B ??SD_Initialize_3
118
119 SD_ERR:
120 SD_EndSD();
\ ??SD_Initialize_1:
\ 00000086 ........ BL SD_EndSD
121 return ret;
\ 0000008A 201C MOV R0,R4
\ ??SD_Initialize_3:
\ 0000008C 01B0 ADD SP,#+0x4
\ 0000008E 10BC POP {R4}
\ 00000090 02BC POP {R1}
\ 00000092 0847 BX R1 ;; return
122 }
123
124 /********************************************************************************************************************
125 ** 函数名称: INT8U SD_ReadBlock() Name: INT8U SD_ReadBlock()
126 ** 功能描述: 从SD/MMC卡中读一个块 Function: read a single block from SD/MMC card
127 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: address of block
128 INT8U *recbuf : 接收缓冲区,长度512Bytes INT8U *recbuf : the buffer of receive,length is 512Bytes
129 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
130 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
131 INT8U SD_ReadBlock(INT32U blockaddr, INT8U *recbuf)
132 {
\ SD_ReadBlock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 041C MOV R4,R0
\ 00000004 0D1C MOV R5,R1
133 INT8U ret;
134 SD_StartSD(); /* 向OS申请访问卡信号量 request semaphore acessed SD/MMC to OS */
\ 00000006 ........ BL SD_StartSD
135 if (SD_ChkCard() != 1)
\ 0000000A ........ _BLF SD_ChkCard,SD_ChkCard??rT
\ 0000000E 0128 CMP R0,#+0x1
\ 00000010 03D0 BEQ ??SD_ReadBlock_0
136 {
137 SD_EndSD();
\ 00000012 ........ BL SD_EndSD
138 return SD_ERR_NO_CARD; /* 卡没完全插入卡中 card is not inserted entirely */
\ 00000016 0120 MOV R0,#+0x1
\ 00000018 1AE0 B ??SD_ReadBlock_1
139 }
140
141 if (blockaddr > sds.block_num)
\ ??SD_ReadBlock_0:
\ 0000001A .... LDR R0,??DataTable4 ;; sds + 4
\ 0000001C 0068 LDR R0,[R0, #+0]
\ 0000001E A042 CMP R0,R4
\ 00000020 03D2 BCS ??SD_ReadBlock_2
142 {
143 SD_EndSD();
\ 00000022 ........ BL SD_EndSD
144 return SD_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 operate over the card range */
\ 00000026 0520 MOV R0,#+0x5
\ 00000028 12E0 B ??SD_ReadBlock_1
145 }
146
147 ret = SD_ReadSingleBlock(blockaddr); /* 读单块命令 read single blocks command */
\ ??SD_ReadBlock_2:
\ 0000002A 201C MOV R0,R4
\ 0000002C ........ _BLF SD_ReadSingleBlock,SD_ReadSingleBlock??rT
\ 00000030 061C MOV R6,R0
148 if (ret != SD_NO_ERR)
\ 00000032 002E CMP R6,#+0
\ 00000034 03D0 BEQ ??SD_ReadBlock_3
149 {
150 SD_EndSD();
\ 00000036 ........ BL SD_EndSD
151 return ret;
\ 0000003A 301C MOV R0,R6
\ 0000003C 08E0 B ??SD_ReadBlock_1
152 }
153
154 ret = SD_ReadBlockData(SD_BLOCKSIZE, recbuf); /* 读出数据 read data from sd card */
\ ??SD_ReadBlock_3:
\ 0000003E 291C MOV R1,R5
\ 00000040 8020 MOV R0,#+0x80
\ 00000042 8000 LSL R0,R0,#+0x2 ;; #+0x200
\ 00000044 ........ _BLF SD_ReadBlockData,SD_ReadBlockData??rT
\ 00000048 061C MOV R6,R0
155 SD_EndSD(); /* 归还访问卡信号量 return semaphore acessed SD/MMC to OS */
\ 0000004A ........ BL SD_EndSD
156
157 return ret;
\ 0000004E 301C MOV R0,R6
\ ??SD_ReadBlock_1:
\ 00000050 70BC POP {R4-R6}
\ 00000052 02BC POP {R1}
\ 00000054 0847 BX R1 ;; return
158 }
159
160 /********************************************************************************************************************
161 ** 函数名称: INT8U SD_ReadMultiBlock() Name: INT8U SD_ReadMultiBlock()
162 ** 功能描述: 从SD/MMC卡中读多个块 Function: read multi blocks from SD/MMC card
163 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: address of block
164 INT32U blocknum : 块数量 INT32U blocknum : the numbers of block
165 INT8U *recbuf : 接收缓冲区,每块512字节 INT8U *recbuf : the buffer of receive,each block length is 512Bytes
166 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
167 *********************************************************************************************************************/
168 #if SD_ReadMultiBlock_EN
169 INT8U SD_ReadMultiBlock(INT32U blockaddr, INT32U blocknum, INT8U *recbuf)
170 {
171 INT32U i;
172 INT8U ret;
173
174 SD_StartSD(); /* 向OS申请访问卡信号量 request semaphore acessed SD/MMC to OS */
175 if (SD_ChkCard() != 1)
176 {
177 SD_EndSD();
178 return SD_ERR_NO_CARD; /* 卡没完全插入卡中 card is not inserted entirely */
179 }
180
181 if ((blockaddr + blocknum) > sds.block_num)
182 {
183 SD_EndSD();
184 return SD_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 operate over the card range */
185 }
186
187 ret = SD_ReadMultipleBlock(blockaddr); /* 读多块命令 read multiple blocks command */
188 if (ret != SD_NO_ERR)
189 {
190 SD_EndSD(); /* 归还访问卡信号量 return semaphore acessed SD/MMC to OS */
191 return ret;
192 }
193
194 for (i = 0; i < blocknum; i++)
195 { /* 读出数据 read data from SD/MMC card */
196 ret = SD_ReadBlockData(SD_BLOCKSIZE, recbuf);
197 if (ret == SD_NO_ERR)
198 recbuf = recbuf + SD_BLOCKSIZE;
199 else
200 {
201 SD_EndSD();
202 return ret;
203 }
204 }
205
206 ret = SD_StopTransmission(); /* 结束数据传输 stop transmission operation */
207
208 SD_EndSD();
209 return ret;
210 }
211
212 #endif
213
214 /********************************************************************************************************************
215 ** 函数名称: INT8U SD_WriteBlock() Name: INT8U SD_WriteBlock()
216 ** 功能描述: 向SD/MMC卡中写入一个块 Function: write a block to SD/MMC card
217 ** 输 入: INT32U blockaddr: 块地址 Input: INT32U blockaddr: address of block
218 INT8U *sendbuf : 发送缓冲区,长度512Bytes INT8U *sendbuf : the buffer of send,length is 512Bytes
219 ** 输 出: 0: 成功 >0: 错误码 Output: 0: right >0: error code
220 *********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
221 INT8U SD_WriteBlock(INT32U blockaddr, INT8U *sendbuf)
222 {
\ SD_WriteBlock:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 81B0 SUB SP,#+0x4
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
223 INT8U ret,tmp[2];
224
225 SD_StartSD(); /* 向OS申请访问卡信号量 request semaphore acessed SD/MMC to OS */
\ 00000008 ........ BL SD_StartSD
226 if (SD_ChkCard() != 1)
\ 0000000C ........ _BLF SD_ChkCard,SD_ChkCard??rT
\ 00000010 0128 CMP R0,#+0x1
\ 00000012 03D0 BEQ ??SD_WriteBlock_0
227 {
228 SD_EndSD();
\ 00000014 ........ BL SD_EndSD
229 return SD_ERR_NO_CARD; /* 卡没完全插入卡中 card is not inserted entirely */
\ 00000018 0120 MOV R0,#+0x1
\ 0000001A 3CE0 B ??SD_WriteBlock_1
230 }
231
232 if (blockaddr > sds.block_num)
\ ??SD_WriteBlock_0:
\ 0000001C .... LDR R0,??DataTable4 ;; sds + 4
\ 0000001E 0068 LDR R0,[R0, #+0]
\ 00000020 A042 CMP R0,R4
\ 00000022 03D2 BCS ??SD_WriteBlock_2
233 {
234 SD_EndSD();
\ 00000024 ........ BL SD_EndSD
235 return SD_ERR_OVER_CARDRANGE; /* 操作超出卡容量范围 operate over the card range */
\ 00000028 0520 MOV R0,#+0x5
\ 0000002A 34E0 B ??SD_WriteBlock_1
236 }
237
238 if (SD_ChkCardWP() == 1)
\ ??SD_WriteBlock_2:
\ 0000002C ........ _BLF SD_ChkCardWP,SD_ChkCardWP??rT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -