📄 sddriver.lis
字号:
00DA 0A85 ldd R16,y+10
00DC 1127 clr R17
00DE 0078 andi R16,128
00E0 1070 andi R17,0
00E2 0E940000 xcall asr16
00E6 8985 ldd R24,y+9
00E8 9927 clr R25
00EA 8370 andi R24,3
00EC 9070 andi R25,0
00EE 880F lsl R24
00F0 991F rol R25
00F2 800F add R24,R16
00F4 911F adc R25,R17
00F6 0296 adiw R24,2
00F8 1C01 movw R2,R24
00FA 4424 clr R4
00FC 37FC sbrc R3,7
00FE 4094 com R4
0100 5524 clr R5
0102 47FC sbrc R4,7
0104 5094 com R5
0106 FE01 movw R30,R28
0108 208A std z+16,R2
010A 318A std z+17,R3
010C 428A std z+18,R4
010E 538A std z+19,R5
0110 .dbline 104
0110 ; ((csdbuf[C_SIZE_MULT_POS2] & C_SIZE_MULT_MSK2) >> 7) + 2; /* (C_SIZE_MULT + 2) */
0110 ;
0110 ; /* 获得卡中块的数量 */ /* get the block numbers in card */
0110 ; sds.block_num = sds.block_num * (1 << tmp); /* (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */
0110 FE01 movw R30,R28
0112 2089 ldd R18,z+16
0114 3189 ldd R19,z+17
0116 01E0 ldi R16,1
0118 10E0 ldi R17,0
011A 0E940000 xcall lsl16
011E 9801 movw R18,R16
0120 00910000 lds R16,_sds
0124 1127 clr R17
0126 0E940000 xcall empy16s
012A 00930000 sts _sds,R16
012E .dbline 107
012E ;
012E ; /* 计算扇区大小 */ /*calculate the size of sector */
012E ; sds.erase_unit = ((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +
012E 8B85 ldd R24,y+11
0130 8078 andi R24,128
0132 8695 lsr R24
0134 8695 lsr R24
0136 8695 lsr R24
0138 8695 lsr R24
013A 8695 lsr R24
013C 8695 lsr R24
013E 8695 lsr R24
0140 9A85 ldd R25,y+10
0142 9F73 andi R25,63
0144 990F lsl R25
0146 980F add R25,R24
0148 9F5F subi R25,255 ; addi 1
014A 90930200 sts _sds+2,R25
014E .dbline 110
014E ; ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1; /* SD (SECTOR_SIZE + 1) */
014E ;
014E ; return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
014E 0027 clr R16
0150 .dbline -2
0150 L15:
0150 6496 adiw R28,20
0152 0E940000 xcall pop_gset1
0156 .dbline 0 ; func end
0156 0895 ret
0158 .dbsym l tmp 16 l
0158 .dbsym r ret 20 c
0158 .dbsym l csdbuf 0 A[16:16]c
0158 .dbend
0158 .dbfunc e SD_CalTimeout _SD_CalTimeout fV
0158 ; time_u -> R14
0158 ; fator -> R10
0158 ; time_v -> R12
0158 ; tmp -> y+0
0158 ; csdbuf -> y+14
.even
0158 _SD_CalTimeout::
0158 1A93 st -y,r17
015A 0A93 st -y,r16
015C 0E940000 xcall push_gset5
0160 2497 sbiw R28,4
0162 .dbline -1
0162 .dbline 122
0162 ; }
0162 ;
0162 ;
0162 ; /*******************************************************************************************************************
0162 ; ** 函数名称: INT8U SD_CalTimeout() Name: INT8U SD_CalTimeout()
0162 ; ** 功能描述: 计算读/写/擦超时时间 Function: get the information of SD card
0162 ; ** 输 入: INT8U cardtype: 卡类型 Input: INT8U cardtype: card type
0162 ; INT8U *csdbuf : CSD寄存器内容 INT8U *csdbuf : CSD register content
0162 ; ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
0162 ; *******************************************************************************************************************/
0162 ; void SD_CalTimeout(uint8 *csdbuf)
0162 ; {
0162 .dbline 126
0162 ; uint32 tmp;
0162 ; uint8 time_u,time_v,fator;
0162 ;
0162 ; sds.timeout_read = READ_TIMEOUT_100MS; /* 默认读超时为100ms */
0162 40E0 ldi R20,0
0164 5EE0 ldi R21,14
0166 61E0 ldi R22,1
0168 70E0 ldi R23,0
016A 1A01 movw R2,R20
016C 20920300 sts _sds+3,R2
0170 .dbline 127
0170 ; sds.timeout_write = WRITE_TIMEOUT_250MS; /* 默认写超时为250ms */
0170 40E0 ldi R20,0
0172 53EA ldi R21,163
0174 62E0 ldi R22,2
0176 70E0 ldi R23,0
0178 1A01 movw R2,R20
017A 20920400 sts _sds+4,R2
017E .dbline 128
017E ; sds.timeout_erase = WRITE_TIMEOUT_250MS;
017E 40E0 ldi R20,0
0180 53EA ldi R21,163
0182 62E0 ldi R22,2
0184 70E0 ldi R23,0
0186 1A01 movw R2,R20
0188 20920500 sts _sds+5,R2
018C .dbline 130
018C ;
018C ; time_u = (csdbuf[TAAC_POS] & TAAC_MSK); /* 读超时时间单位 read timeout unit */
018C EE85 ldd R30,y+14
018E FF85 ldd R31,y+15
0190 8181 ldd R24,z+1
0192 8770 andi R24,7
0194 E82E mov R14,R24
0196 .dbline 131
0196 ; time_v = (csdbuf[TAAC_POS] & NSAC_MSK) >> 3; /* 读超时时间值 read timeout value */
0196 EE85 ldd R30,y+14
0198 FF85 ldd R31,y+15
019A 8181 ldd R24,z+1
019C 8877 andi R24,120
019E C82E mov R12,R24
01A0 C694 lsr R12
01A2 C694 lsr R12
01A4 C694 lsr R12
01A6 .dbline 132
01A6 ; fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2; /* 写超时时间因数 write timeout factor */
01A6 EE85 ldd R30,y+14
01A8 FF85 ldd R31,y+15
01AA 8485 ldd R24,z+12
01AC 8C71 andi R24,28
01AE A82E mov R10,R24
01B0 A694 lsr R10
01B2 A694 lsr R10
01B4 .dbline 134
01B4 ;
01B4 ; if(time_v == 0) return;
01B4 CC20 tst R12
01B6 09F4 brne L32
01B8 .dbline 134
01B8 BAC0 xjmp L28
01BA L32:
01BA .dbline 135
01BA ; if(fator >= 6) return;
01BA 8A2D mov R24,R10
01BC 8630 cpi R24,6
01BE 08F0 brlo L34
01C0 .dbline 135
01C0 B6C0 xjmp L28
01C2 L34:
01C2 .dbline 137
01C2 ;
01C2 ; tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u]; /* TACC * f (单位 unit: clock) */
01C2 80E0 ldi R24,<_time_value
01C4 90E0 ldi R25,>_time_value
01C6 EC2D mov R30,R12
01C8 FF27 clr R31
01CA E80F add R30,R24
01CC F91F adc R31,R25
01CE 2490 lpm R2,Z
01D0 3324 clr R3
01D2 4424 clr R4
01D4 5524 clr R5
01D6 40E0 ldi R20,0
01D8 50E6 ldi R21,96
01DA 64E5 ldi R22,84
01DC 70E0 ldi R23,0
01DE 5A92 st -y,R5
01E0 4A92 st -y,R4
01E2 3A92 st -y,R3
01E4 2A92 st -y,R2
01E6 8A01 movw R16,R20
01E8 9B01 movw R18,R22
01EA 0E940000 xcall empy32s
01EE 4AE0 ldi R20,10
01F0 50E0 ldi R21,0
01F2 60E0 ldi R22,0
01F4 70E0 ldi R23,0
01F6 7A93 st -y,R23
01F8 6A93 st -y,R22
01FA 5A93 st -y,R21
01FC 4A93 st -y,R20
01FE 0E940000 xcall div32s
0202 1801 movw R2,R16
0204 2901 movw R4,R18
0206 84E0 ldi R24,4
0208 8E9D mul R24,R14
020A 8001 movw R16,R0
020C 80E0 ldi R24,<_time_unit
020E 90E0 ldi R25,>_time_unit
0210 080F add R16,R24
0212 191F adc R17,R25
0214 0E940000 xcall lpm32
0218 3A93 st -y,R19
021A 2A93 st -y,R18
021C 1A93 st -y,R17
021E 0A93 st -y,R16
0220 8101 movw R16,R2
0222 9201 movw R18,R4
0224 0E940000 xcall div32u
0228 FE01 movw R30,R28
022A 0083 std z+0,R16
022C 1183 std z+1,R17
022E 2283 std z+2,R18
0230 3383 std z+3,R19
0232 .dbline 138
0232 ; tmp = tmp + csdbuf[NSAC_POS] * 100; /* TACC * f + NSAC * 100 (单位 unit: clock) */
0232 EE85 ldd R30,y+14
0234 FF85 ldd R31,y+15
0236 2280 ldd R2,z+2
0238 84E6 ldi R24,100
023A 829D mul R24,R2
023C 1001 movw R2,R0
023E 4424 clr R4
0240 37FC sbrc R3,7
0242 4094 com R4
0244 5524 clr R5
0246 47FC sbrc R4,7
0248 5094 com R5
024A FE01 movw R30,R28
024C 6080 ldd R6,z+0
024E 7180 ldd R7,z+1
0250 8280 ldd R8,z+2
0252 9380 ldd R9,z+3
0254 620C add R6,R2
0256 731C adc R7,R3
0258 841C adc R8,R4
025A 951C adc R9,R5
025C FE01 movw R30,R28
025E 6082 std z+0,R6
0260 7182 std z+1,R7
0262 8282 std z+2,R8
0264 9382 std z+3,R9
0266 .dbline 141
0266 ;
0266 ; /* 计算得到的超时值 the timeout value of being calculated */
0266 ; sds.timeout_read = tmp;
0266 FE01 movw R30,R28
0268 2080 ldd R2,z+0
026A 3180 ldd R3,z+1
026C 4280 ldd R4,z+2
026E 5380 ldd R5,z+3
0270 20920300 sts _sds+3,R2
0274 .dbline 142
0274 ; sds.timeout_write = tmp * r2w_fator[fator]; /* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
0274 80E0 ldi R24,<_r2w_fator
0276 90E0 ldi R25,>_r2w_fator
0278 EA2D mov R30,R10
027A FF27 clr R31
027C E80F add R30,R24
027E F91F adc R31,R25
0280 2490 lpm R2,Z
0282 3324 clr R3
0284 4424 clr R4
0286 5524 clr R5
0288 FE01 movw R30,R28
028A 6080 ldd R6,z+0
028C 7180 ldd R7,z+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -