📄 sd_lib.lss
字号:
3c0: 0e 94 8e 00 call 0x11c <spiTransferByte>
3c4: 89 93 st Y+, r24
3c6: 11 50 subi r17, 0x01 ; 1
3c8: 17 ff sbrs r17, 7
3ca: f9 cf rjmp .-14 ; 0x3be <Read_CSD_MMC+0x2c>
3cc: 1f ef ldi r17, 0xFF ; 255
}
spiTransferByte(0xFF); // read 16-bit CRC
3ce: 81 2f mov r24, r17
3d0: 0e 94 8e 00 call 0x11c <spiTransferByte>
spiTransferByte(0xFF);
3d4: 81 2f mov r24, r17
3d6: 0e 94 8e 00 call 0x11c <spiTransferByte>
CSH;
3da: c4 9a sbi 0x18, 4 ; 24
return(0);
3dc: 80 e0 ldi r24, 0x00 ; 0
3de: 90 e0 ldi r25, 0x00 ; 0
3e0: df 91 pop r29
3e2: cf 91 pop r28
3e4: 1f 91 pop r17
3e6: 08 95 ret
000003e8 <MMC_get_volume_info>:
}
//-------------------------------------------------------------------------
//returns the :
// size of the card in MB ( ret * 1024^2) == bytes
// sector count and multiplier MB are in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
// name of the media
void MMC_get_volume_info(void){
3e8: 0f 93 push r16
3ea: 1f 93 push r17
3ec: cf 93 push r28
3ee: df 93 push r29
3f0: cd b7 in r28, 0x3d ; 61
3f2: de b7 in r29, 0x3e ; 62
3f4: 6f 97 sbiw r28, 0x1f ; 31
3f6: 0f b6 in r0, 0x3f ; 63
3f8: f8 94 cli
3fa: de bf out 0x3e, r29 ; 62
3fc: 0f be out 0x3f, r0 ; 63
3fe: cd bf out 0x3d, r28 ; 61
400: 8e 01 movw r16, r28
402: 0f 5f subi r16, 0xFF ; 255
404: 1f 4f sbci r17, 0xFF ; 255
406: f8 01 movw r30, r16
408: 8f e0 ldi r24, 0x0F ; 15
uint8_t i,buffer[16];
struct MMC_VOLUME_INFO vinf;
for(i=0;i<16;i++)buffer[i]=0;
40a: 11 92 st Z+, r1
40c: 81 50 subi r24, 0x01 ; 1
40e: 87 ff sbrs r24, 7
410: fc cf rjmp .-8 ; 0x40a <MMC_get_volume_info+0x22>
Read_CSD_MMC(buffer);
412: ce 01 movw r24, r28
414: 01 96 adiw r24, 0x01 ; 1
416: 0e 94 c9 01 call 0x392 <Read_CSD_MMC>
vinf.sector_count=buffer[6]&0x03;
41a: 8f 81 ldd r24, Y+7 ; 0x07
41c: 99 27 eor r25, r25
41e: aa 27 eor r26, r26
420: bb 27 eor r27, r27
422: 83 70 andi r24, 0x03 ; 3
424: 90 70 andi r25, 0x00 ; 0
426: a0 70 andi r26, 0x00 ; 0
428: b0 70 andi r27, 0x00 ; 0
vinf.sector_count<<=8;
42a: 22 27 eor r18, r18
42c: 38 2f mov r19, r24
42e: 49 2f mov r20, r25
430: 5a 2f mov r21, r26
vinf.sector_count+=buffer[7];
432: 88 85 ldd r24, Y+8 ; 0x08
434: 28 0f add r18, r24
436: 31 1d adc r19, r1
438: 41 1d adc r20, r1
43a: 51 1d adc r21, r1
vinf.sector_count<<=2;
43c: f2 e0 ldi r31, 0x02 ; 2
43e: 22 0f add r18, r18
440: 33 1f adc r19, r19
442: 44 1f adc r20, r20
444: 55 1f adc r21, r21
446: fa 95 dec r31
448: d1 f7 brne .-12 ; 0x43e <MMC_get_volume_info+0x56>
vinf.sector_count+=(buffer[8]&0xc0)>>6;
44a: 89 85 ldd r24, Y+9 ; 0x09
44c: 99 27 eor r25, r25
44e: e6 e0 ldi r30, 0x06 ; 6
450: 96 95 lsr r25
452: 87 95 ror r24
454: ea 95 dec r30
456: e1 f7 brne .-8 ; 0x450 <MMC_get_volume_info+0x68>
458: aa 27 eor r26, r26
45a: 97 fd sbrc r25, 7
45c: a0 95 com r26
45e: ba 2f mov r27, r26
460: 28 0f add r18, r24
462: 39 1f adc r19, r25
464: 4a 1f adc r20, r26
466: 5b 1f adc r21, r27
468: 2e 8b std Y+22, r18 ; 0x16
46a: 3f 8b std Y+23, r19 ; 0x17
46c: 48 8f std Y+24, r20 ; 0x18
46e: 59 8f std Y+25, r21 ; 0x19
vinf.sector_multiply=buffer[9]&0x03;
470: 6a 85 ldd r22, Y+10 ; 0x0a
472: 63 70 andi r22, 0x03 ; 3
vinf.sector_multiply<<=1;
474: 66 0f add r22, r22
vinf.sector_multiply+=(buffer[10]&0x80)>>7;
476: 8b 85 ldd r24, Y+11 ; 0x0b
478: 99 27 eor r25, r25
47a: 88 0f add r24, r24
47c: 89 2f mov r24, r25
47e: 88 1f adc r24, r24
480: 99 0b sbc r25, r25
482: 91 95 neg r25
484: 68 0f add r22, r24
486: 6d 8b std Y+21, r22 ; 0x15
//SD的容量
vinf.size_MB=vinf.sector_count>>(9-vinf.sector_multiply);
488: 89 e0 ldi r24, 0x09 ; 9
48a: 90 e0 ldi r25, 0x00 ; 0
48c: 86 1b sub r24, r22
48e: 91 09 sbc r25, r1
490: 04 c0 rjmp .+8 ; 0x49a <MMC_get_volume_info+0xb2>
492: 56 95 lsr r21
494: 47 95 ror r20
496: 37 95 ror r19
498: 27 95 ror r18
49a: 8a 95 dec r24
49c: d2 f7 brpl .-12 ; 0x492 <MMC_get_volume_info+0xaa>
49e: 29 8b std Y+17, r18 ; 0x11
4a0: 3a 8b std Y+18, r19 ; 0x12
4a2: 4b 8b std Y+19, r20 ; 0x13
4a4: 5c 8b std Y+20, r21 ; 0x14
4a6: f8 01 movw r30, r16
4a8: 8f e0 ldi r24, 0x0F ; 15
for(i=0;i<16;i++)buffer[i]=0;
4aa: 11 92 st Z+, r1
4ac: 81 50 subi r24, 0x01 ; 1
4ae: 87 ff sbrs r24, 7
4b0: fc cf rjmp .-8 ; 0x4aa <MMC_get_volume_info+0xc2>
Read_CID_MMC(buffer);
4b2: ce 01 movw r24, r28
4b4: 01 96 adiw r24, 0x01 ; 1
4b6: 0e 94 9e 01 call 0x33c <Read_CID_MMC>
4ba: 6f 96 adiw r28, 0x1f ; 31
4bc: 0f b6 in r0, 0x3f ; 63
4be: f8 94 cli
4c0: de bf out 0x3e, r29 ; 62
4c2: 0f be out 0x3f, r0 ; 63
4c4: cd bf out 0x3d, r28 ; 61
4c6: df 91 pop r29
4c8: cf 91 pop r28
4ca: 1f 91 pop r17
4cc: 0f 91 pop r16
4ce: 08 95 ret
000004d0 <ReadBlock>:
uint16_t BPB_FATSz16; //FAT占用的sectors
uint32_t BPB_HiddSec;
//-------------------------------------------------------------------------
uint8_t ReadBlock(uint32_t LBA){ //绝对地址读一个扇区
4d0: ef 92 push r14
4d2: ff 92 push r15
4d4: 0f 93 push r16
4d6: 1f 93 push r17
4d8: 7b 01 movw r14, r22
4da: 8c 01 movw r16, r24
mmcReset();
4dc: 0e 94 11 01 call 0x222 <mmcReset>
if(mmcRead(LBA,BUFFER)!=0)return SD_FAIL;
4e0: 42 eb ldi r20, 0xB2 ; 178
4e2: 50 e0 ldi r21, 0x00 ; 0
4e4: c8 01 movw r24, r16
4e6: b7 01 movw r22, r14
4e8: 0e 94 21 01 call 0x242 <mmcRead>
4ec: 88 23 and r24, r24
4ee: 19 f0 breq .+6 ; 0x4f6 <ReadBlock+0x26>
4f0: 81 e0 ldi r24, 0x01 ; 1
4f2: 90 e0 ldi r25, 0x00 ; 0
4f4: 02 c0 rjmp .+4 ; 0x4fa <ReadBlock+0x2a>
return SD_SUCC;
4f6: 80 e0 ldi r24, 0x00 ; 0
4f8: 90 e0 ldi r25, 0x00 ; 0
4fa: 1f 91 pop r17
4fc: 0f 91 pop r16
4fe: ff 90 pop r15
500: ef 90 pop r14
502: 08 95 ret
00000504 <WriteBlock>:
}
//-------------------------------------------------------------------------
uint8_t WriteBlock(uint32_t LBA){ //绝对地址写一个扇区
504: ef 92 push r14
506: ff 92 push r15
508: 0f 93 push r16
50a: 1f 93 push r17
50c: 7b 01 movw r14, r22
50e: 8c 01 movw r16, r24
mmcReset();
510: 0e 94 11 01 call 0x222 <mmcReset>
if(mmcWrite(LBA,BUFFER)!=0)return SD_FAIL;
514: 42 eb ldi r20, 0xB2 ; 178
516: 50 e0 ldi r21, 0x00 ; 0
518: c8 01 movw r24, r16
51a: b7 01 movw r22, r14
51c: 0e 94 57 01 call 0x2ae <mmcWrite>
520: 88 23 and r24, r24
522: 19 f0 breq .+6 ; 0x52a <WriteBlock+0x26>
524: 81 e0 ldi r24, 0x01 ; 1
526: 90 e0 ldi r25, 0x00 ; 0
528: 02 c0 rjmp .+4 ; 0x52e <WriteBlock+0x2a>
return SD_SUCC;
52a: 80 e0 ldi r24, 0x00 ; 0
52c: 90 e0 ldi r25, 0x00 ; 0
52e: 1f 91 pop r17
530: 0f 91 pop r16
532: ff 90 pop r15
534: ef 90 pop r14
536: 08 95 ret
00000538 <ReadFatBlock>:
}
//-------------------------------------------------------------------------
uint8_t ReadFatBlock(uint32_t Add){ //逻辑地址读一个扇区
538: dc 01 movw r26, r24
53a: cb 01 movw r24, r22
return ReadBlock(Add+PB_RelativeSector);
53c: 20 91 b4 02 lds r18, 0x02B4
540: 82 0f add r24, r18
542: 91 1d adc r25, r1
544: a1 1d adc r26, r1
546: b1 1d adc r27, r1
548: bc 01 movw r22, r24
54a: cd 01 movw r24, r26
54c: 0e 94 68 02 call 0x4d0 <ReadBlock>
}
550: 99 27 eor r25, r25
552: 08 95 ret
00000554 <WriteFatBlock>:
//-------------------------------------------------------------------------
uint8_t WriteFatBlock(uint32_t Add){ //逻辑地址写一个扇区
554: dc 01 movw r26, r24
556: cb 01 movw r24, r22
return WriteBlock(Add+PB_RelativeSector);
558: 20 91 b4 02 lds r18, 0x02B4
55c: 82 0f add r24, r18
55e: 91 1d adc r25, r1
560: a1 1d adc r26, r1
562: b1 1d adc r27, r1
564: bc 01 movw r22, r24
566: cd 01 movw r24, r26
568: 0e 94 82 02 call 0x504 <WriteBlock>
}
56c: 99 27 eor r25, r25
56e: 08 95 ret
00000570 <CopyBytes>:
//-------------------------------------------------------------------------
void CopyBytes(uint8_t *ps,uint8_t *pd,uint16_t size){ //内存拷贝
570: dc 01 movw r26, r24
572: fb 01 movw r30, r22
for(;size;size--)*pd++=*ps++;
574: 41 15 cp r20, r1
576: 51 05 cpc r21, r1
578: 29 f0 breq .+10 ; 0x584 <CopyBytes+0x14>
57a: 8d 91 ld r24, X+
57c: 81 93 st Z+, r24
57e: 41 50 subi r20, 0x01 ; 1
580: 50 40 sbci r21, 0x00 ; 0
582: f8 cf rjmp .-16 ; 0x574 <CopyBytes+0x4>
584: 08 95 ret
00000586 <IsEqual>:
}
//-------------------------------------------------------------------------
uint8_t IsEqual(uint8_t *pa,uint8_t *pb,uint8_t size){ //内存比较
586: dc 01 movw r26, r24
588: fb 01 movw r30, r22
for(;size;size--)if(*pa++!=*pb++)return 0;
58a: 44 23 and r20, r20
58c: 49 f0 breq .+18 ; 0x5a0 <IsEqual+0x1a>
58e: 91 91 ld r25, Z+
590: 8d 91 ld r24, X+
592: 89 17 cp r24, r25
594: 19 f0 breq .+6 ; 0x59c <IsEqual+0x16>
596: 80 e0 ldi r24, 0x00 ; 0
598: 90 e0 ldi r25, 0x00 ; 0
59a: 08 95 ret
59c: 41 50 subi r20, 0x01 ; 1
59e: f5 cf rjmp .-22 ; 0x58a <IsEqual+0x4>
return 1;
5a0: 81 e0 ldi r24, 0x01 ; 1
5a2: 90 e0 ldi r25, 0x00 ; 0
}
5a4: 08 95 ret
000005a6 <EmptyBytes>:
//-------------------------------------------------------------------------
void EmptyBytes(uint8_t *pd,uint16_t size){ //内存清空,因为单片机资源很紧张的,一个512的缓冲区要反复的用
5a6: fc 01 movw r30, r24
for(;size;size--)*pd++ =0;
5a8: 61 15 cp r22, r1
5aa: 71 05 cpc r23, r1
5ac: 21 f0 breq .+8 ; 0x5b6 <EmptyBytes+0x10>
5ae: 11 92 st Z+, r1
5b0: 61 50 subi r22, 0x01 ; 1
5b2: 70 40 sbci r23, 0x00 ; 0
5b4: f9 cf rjmp .-14 ; 0x5a8 <EmptyBytes+0x2>
5b6: 08 95 ret
000005b8 <ReadMBR>:
}
//-------------------------------------------------------------------------
uint8_t ReadMBR(void){ //读取MBR数据结构
uint8_t ok;
FAT_MBR * MBR=(FAT_MBR*)BUFFER;
ok=ReadBlock(MBR_Sector);//已经把值存到buffer里了
5b8: 60 e0 ldi r22, 0x00 ; 0
5ba: 70 e0 ldi r23, 0x00 ; 0
5bc: 80 e0 ldi r24, 0x00 ; 0
5be: 90 e0 ldi r25, 0x00 ; 0
5c0: 0e 94 68 02 call 0x4d0 <ReadBlock>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -