📄 sdmmc.lis
字号:
0094 09C0 xjmp L8
0096 L27:
0096 .dbline 145
0096 ; }
0096 ; }
0096 L25:
0096 .dbline 146
0096 ; while(temp!=0);
0096 AA20 tst R10
0098 A9F7 brne L24
009A .dbline 148
009A ;
009A ; Init_Flag=0; //Init is completed,clear the flag
009A 2224 clr R2
009C 20920000 sts _Init_Flag,R2
00A0 .dbline 150
00A0 ;
00A0 ; MMC_Disable(); //set MMC_Chip_Select to high
00A0 C49A sbi 0x18,4
00A2 .dbline 150
00A2 .dbline 151
00A2 ; SPCR=spimode;
00A2 6DB9 out 0xd,R22
00A4 .dbline 152
00A4 ; SPSR=spispeeddub;
00A4 4EB9 out 0xe,R20
00A6 .dbline 153
00A6 ; return(0); //All commands have been taken.
00A6 0027 clr R16
00A8 .dbline -2
00A8 L8:
00A8 2696 adiw R28,6
00AA 0E940000 xcall pop_gset5
00AE .dbline 0 ; func end
00AE 0895 ret
00B0 .dbsym r spispeeddub 20 c
00B0 .dbsym r spimode 22 c
00B0 .dbsym l CMD 0 A[6:6]c
00B0 .dbsym r temp 10 c
00B0 .dbsym r i 12 c
00B0 .dbsym r retry 14 c
00B0 .dbend
00B0 .dbfunc e MMC_get_volume_info _MMC_get_volume_info fV
00B0 .dbstruct 0 11 MMC_VOLUME_INFO
00B0 .dbfield 0 size_MB i
00B0 .dbfield 2 sector_multiply c
00B0 .dbfield 3 sector_count i
00B0 .dbfield 5 name A[6:6]c
00B0 .dbend
00B0 ; tmp -> y+16
00B0 ; spispeeddub -> R20
00B0 ; spimode -> R22
00B0 ; buffer -> y+0
00B0 ; vinf -> R10,R11
.even
00B0 _MMC_get_volume_info::
00B0 0E940000 xcall push_gset3
00B4 5801 movw R10,R16
00B6 6497 sbiw R28,20
00B8 .dbline -1
00B8 .dbline 163
00B8 ; }
00B8 ;
00B8 ; //****************************************************************************
00B8 ; //returns the :
00B8 ; // size of the card in MB ( ret * 1024^2) == bytes
00B8 ; // sector count and multiplier MB are in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
00B8 ; // name of the media
00B8 ; void MMC_get_volume_info(VOLUME_INFO_TYPE *vinf)
00B8 ; //****************************************************************************
00B8 ; {
00B8 .dbline 168
00B8 ;
00B8 ; uint8 tmp[4],buffer[16];
00B8 ; #if !(HW_SPI_Mode)
00B8 ; uint8 spimode,spispeeddub;
00B8 ; spimode=SPCR;
00B8 6DB1 in R22,0xd
00BA .dbline 169
00BA ; spispeeddub=SPSR;
00BA 4EB1 in R20,0xe
00BC .dbline 170
00BC ; SPCR&=~(1<<SPIE);
00BC 6F98 cbi 0xd,7
00BE .dbline 174
00BE ; #endif
00BE ;
00BE ; // read the CSD register
00BE ; Read_CSD_MMC(buffer);
00BE 8E01 movw R16,R28
00C0 6FD2 xcall _Read_CSD_MMC
00C2 .dbline 179
00C2 ; // get the C_SIZE value. bits [73:62] of data
00C2 ; // [73:72] == buffer[6] && 0x03
00C2 ; // [71:64] == buffer[7]
00C2 ; // [63:62] == buffer[8] && 0xc0
00C2 ; vinf->sector_count = buffer[6] & 0x03;
00C2 8E81 ldd R24,y+6
00C4 9927 clr R25
00C6 8370 andi R24,3
00C8 9070 andi R25,0
00CA F501 movw R30,R10
00CC 9483 std z+4,R25
00CE 8383 std z+3,R24
00D0 .dbline 180
00D0 ; vinf->sector_count <<= 8;
00D0 C501 movw R24,R10
00D2 0396 adiw R24,3
00D4 FC01 movw R30,R24
00D6 4080 ldd R4,z+0
00D8 5180 ldd R5,z+1
00DA 542C mov R5,R4
00DC 4424 clr R4
00DE 5182 std z+1,R5
00E0 4082 std z+0,R4
00E2 .dbline 181
00E2 ; vinf->sector_count += buffer[7];
00E2 C501 movw R24,R10
00E4 0396 adiw R24,3
00E6 4F80 ldd R4,y+7
00E8 5524 clr R5
00EA FC01 movw R30,R24
00EC 6080 ldd R6,z+0
00EE 7180 ldd R7,z+1
00F0 640C add R6,R4
00F2 751C adc R7,R5
00F4 7182 std z+1,R7
00F6 6082 std z+0,R6
00F8 .dbline 182
00F8 ; vinf->sector_count <<= 2;
00F8 C501 movw R24,R10
00FA 0396 adiw R24,3
00FC FC01 movw R30,R24
00FE 4080 ldd R4,z+0
0100 5180 ldd R5,z+1
0102 440C lsl R4
0104 551C rol R5
0106 440C lsl R4
0108 551C rol R5
010A 5182 std z+1,R5
010C 4082 std z+0,R4
010E .dbline 183
010E ; vinf->sector_count += (buffer[8] & 0xc0) >> 6;
010E C501 movw R24,R10
0110 0396 adiw R24,3
0112 1C01 movw R2,R24
0114 26E0 ldi R18,6
0116 30E0 ldi R19,0
0118 0885 ldd R16,y+8
011A 1127 clr R17
011C 007C andi R16,192
011E 1070 andi R17,0
0120 0E940000 xcall asr16
0124 F101 movw R30,R2
0126 4080 ldd R4,z+0
0128 5180 ldd R5,z+1
012A 400E add R4,R16
012C 511E adc R5,R17
012E 5182 std z+1,R5
0130 4082 std z+0,R4
0132 .dbline 188
0132 ;
0132 ; // get the val for C_SIZE_MULT. bits [49:47] of sectorBuffer.data
0132 ; // [49:48] == buffer[5] && 0x03
0132 ; // [47] == buffer[4] && 0x80
0132 ; vinf->sector_multiply = buffer[9] & 0x03;
0132 8985 ldd R24,y+9
0134 8370 andi R24,3
0136 F501 movw R30,R10
0138 8283 std z+2,R24
013A .dbline 189
013A ; vinf->sector_multiply <<= 1;
013A C501 movw R24,R10
013C 0296 adiw R24,2
013E FC01 movw R30,R24
0140 4080 ldd R4,z+0
0142 440C lsl R4
0144 4082 std z+0,R4
0146 .dbline 190
0146 ; vinf->sector_multiply += (buffer[10] & 0x80) >> 7;
0146 C501 movw R24,R10
0148 0296 adiw R24,2
014A 1C01 movw R2,R24
014C 8A85 ldd R24,y+10
014E 8078 andi R24,128
0150 8695 lsr R24
0152 8695 lsr R24
0154 8695 lsr R24
0156 8695 lsr R24
0158 8695 lsr R24
015A 8695 lsr R24
015C 8695 lsr R24
015E F101 movw R30,R2
0160 4080 ldd R4,z+0
0162 480E add R4,R24
0164 4082 std z+0,R4
0166 .dbline 194
0166 ;
0166 ; // work out the MBs
0166 ; // mega bytes in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
0166 ; vinf->size_MB = vinf->sector_count >> (9-vinf->sector_multiply);
0166 F501 movw R30,R10
0168 2280 ldd R2,z+2
016A 3324 clr R3
016C 29E0 ldi R18,9
016E 30E0 ldi R19,0
0170 2219 sub R18,R2
0172 3309 sbc R19,R3
0174 F501 movw R30,R10
0176 0381 ldd R16,z+3
0178 1481 ldd R17,z+4
017A 0E940000 xcall lsr16
017E F501 movw R30,R10
0180 1183 std z+1,R17
0182 0083 std z+0,R16
0184 .dbline 196
0184 ; // get the name of the card
0184 ; Read_CID_MMC(buffer);
0184 8E01 movw R16,R28
0186 EED1 xcall _Read_CID_MMC
0188 .dbline 197
0188 ; vinf->name[0] = buffer[3];
0188 2B80 ldd R2,y+3
018A F501 movw R30,R10
018C 2582 std z+5,R2
018E .dbline 198
018E ; vinf->name[1] = buffer[4];
018E 2C80 ldd R2,y+4
0190 F501 movw R30,R10
0192 2682 std z+6,R2
0194 .dbline 199
0194 ; vinf->name[2] = buffer[5];
0194 2D80 ldd R2,y+5
0196 F501 movw R30,R10
0198 2782 std z+7,R2
019A .dbline 200
019A ; vinf->name[3] = buffer[6];
019A 2E80 ldd R2,y+6
019C F501 movw R30,R10
019E 2086 std z+8,R2
01A0 .dbline 201
01A0 ; vinf->name[4] = buffer[7];
01A0 2F80 ldd R2,y+7
01A2 F501 movw R30,R10
01A4 2186 std z+9,R2
01A6 .dbline 202
01A6 ; vinf->name[5] = 0x00; //end flag
01A6 2224 clr R2
01A8 F501 movw R30,R10
01AA 2286 std z+10,R2
01AC .dbline 232
01AC ; /* //----------------------------------------------------------
01AC ; // LCDclrscr();
01AC ; //Print Product name on lcd
01AC ; Com_putstring("Product:\r\n",10,&RTbuf_UART0);
01AC ; Com_putstring(vinf->name,6,&RTbuf_UART0);
01AC ; Com_putstring("\r\n",2,&RTbuf_UART0);
01AC ; //Print Card Size(eg:128MB)
01AC ; Com_putstring("Tot:",4,&RTbuf_UART0);
01AC ; tmp[0]=((vinf->size_MB>>12)&0x0f)+0x30;
01AC ; tmp[1]=(vinf->size_MB>>8)&0x0f+0x30;
01AC ; tmp[2]=(vinf->size_MB>>4)&0x0f+0x30;
01AC ; tmp[3]=vinf->size_MB&0x0f+0x30;
01AC ; Com_putstring(tmp,4,&RTbuf_UART0);
01AC ; Com_putstring("MB\r\n",4,&RTbuf_UART0);
01AC ; Com_putstring("sector_mult:",12,&RTbuf_UART0);
01AC ; // tmp[0]=((vinf->sector_multiply>>12)&0x0f)+0x30;
01AC ; // tmp[1]=(vinf->sector_multiply>>8)&0x0f+0x30;
01AC ; tmp[0]=(vinf->sector_multiply>>4)&0x0f+0x30;
01AC ; tmp[1]=vinf->sector_multiply&0x0f+0x30;
01AC ; Com_putstring(tmp,2,&RTbuf_UART0);
01AC ; Com_putstring("\r\n",2,&RTbuf_UART0);
01AC ; Com_putstring("sect_cnt:",9,&RTbuf_UART0);
01AC ; tmp[0]=((vinf->sector_count>>12)&0x0f)+0x30;
01AC ; tmp[1]=(vinf->sector_count>>8)&0x0f+0x30;
01AC ; tmp[2]=(vinf->sector_count>>4)&0x0f+0x30;
01AC ; tmp[3]=vinf->sector_count&0x0f+0x30;
01AC ; Com_putstring(tmp,4,&RTbuf_UART0);
01AC ; */
01AC ; #if !(HW_SPI_Mode)
01AC ; SPCR=spimode;
01AC 6DB9 out 0xd,R22
01AE .dbline 233
01AE ; SPSR=spispeeddub;
01AE 4EB9 out 0xe,R20
01B0 .dbline 235
01B0 ; #endif
01B0 ; MMC_Disable();
01B0 C49A sbi 0x18,4
01B2 .dbline 235
01B2 .dbline -2
01B2 L29:
01B2 6496 adiw R28,20
01B4 0E940000 xcall pop_gset3
01B8 .dbline 0 ; func end
01B8 0895 ret
01BA .dbsym l tmp 16 A[4:4]c
01BA .dbsym r spispeeddub 20 c
01BA .dbsym r spimode 22 c
01BA .dbsym l buffer 0 A[16:16]c
01BA .dbsym r vinf 10 pS[MMC_VOLUME_INFO]
01BA .dbend
01BA .dbfunc e Write_Command_MMC _Write_Command_MMC fc
01BA ; i -> R20
01BA ; retry -> R22
01BA ; tmp -> R10
01BA ; CMD -> R12,R13
.even
01BA _Write_Command_MMC::
01BA 0E940000 xcall push_gset4
01BE 6801 movw R12,R16
01C0 .dbline -1
01C0 .dbline 243
01C0 ; }
01C0 ;
01C0 ; //****************************************************************************
01C0 ; //Send a Command to MMC/SD-Card
01C0 ; //Return: the second byte of response register of MMC/SD-Card
01C0 ; uint8 Write_Command_MMC(uint8 *CMD)
01C0 ; //****************************************************************************
01C0 ; {
01C0 .dbline 245
01C0 ; uint8 tmp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -