📄 sdraw.lss
字号:
202: 22 87 std Z+10, r18 ; 0x0a
204: 27 c0 rjmp .+78 ; 0x254 <sdraw_get_info+0xf0>
break;
case 9:
case 10:
case 11:
case 12:
info->serial |= (uint32_t) b << ((12 - i) * 8);
206: 30 e0 ldi r19, 0x00 ; 0
208: 40 e0 ldi r20, 0x00 ; 0
20a: 50 e0 ldi r21, 0x00 ; 0
20c: 0e 2c mov r0, r14
20e: 04 c0 rjmp .+8 ; 0x218 <sdraw_get_info+0xb4>
210: 22 0f add r18, r18
212: 33 1f adc r19, r19
214: 44 1f adc r20, r20
216: 55 1f adc r21, r21
218: 0a 94 dec r0
21a: d2 f7 brpl .-12 ; 0x210 <sdraw_get_info+0xac>
21c: f8 01 movw r30, r16
21e: 83 85 ldd r24, Z+11 ; 0x0b
220: 94 85 ldd r25, Z+12 ; 0x0c
222: a5 85 ldd r26, Z+13 ; 0x0d
224: b6 85 ldd r27, Z+14 ; 0x0e
226: 82 2b or r24, r18
228: 93 2b or r25, r19
22a: a4 2b or r26, r20
22c: b5 2b or r27, r21
22e: 83 87 std Z+11, r24 ; 0x0b
230: 94 87 std Z+12, r25 ; 0x0c
232: a5 87 std Z+13, r26 ; 0x0d
234: b6 87 std Z+14, r27 ; 0x0e
236: 0e c0 rjmp .+28 ; 0x254 <sdraw_get_info+0xf0>
break;
case 13:
info->manufacturing_year = b << 4;
238: 22 95 swap r18
23a: 20 7f andi r18, 0xF0 ; 240
23c: f8 01 movw r30, r16
23e: 27 87 std Z+15, r18 ; 0x0f
240: 09 c0 rjmp .+18 ; 0x254 <sdraw_get_info+0xf0>
break;
case 14:
info->manufacturing_year |= b >> 4;
242: 92 2f mov r25, r18
244: 92 95 swap r25
246: 9f 70 andi r25, 0x0F ; 15
248: f8 01 movw r30, r16
24a: 87 85 ldd r24, Z+15 ; 0x0f
24c: 89 2b or r24, r25
24e: 87 87 std Z+15, r24 ; 0x0f
info->manufacturing_month = b & 0x0f;
250: 2f 70 andi r18, 0x0F ; 15
252: 20 8b std Z+16, r18 ; 0x10
254: 21 96 adiw r28, 0x01 ; 1
256: 48 ef ldi r20, 0xF8 ; 248
258: 5f ef ldi r21, 0xFF ; 255
25a: e4 0e add r14, r20
25c: f5 1e adc r15, r21
return 0;
}
while(sdraw_recv_byte() != 0xFE);
for(i = 0; i < 18; ++i)
25e: 50 ed ldi r21, 0xD0 ; 208
260: e5 16 cp r14, r21
262: 5f ef ldi r21, 0xFF ; 255
264: f5 06 cpc r15, r21
266: 09 f0 breq .+2 ; 0x26a <sdraw_get_info+0x106>
268: ae cf rjmp .-164 ; 0x1c6 <sdraw_get_info+0x62>
break;
}
}
/* read csd register */
if(sdraw_send_command_r1(CMD_SEND_CSD, 0))
26a: 40 e0 ldi r20, 0x00 ; 0
26c: 50 e0 ldi r21, 0x00 ; 0
26e: 60 e0 ldi r22, 0x00 ; 0
270: 70 e0 ldi r23, 0x00 ; 0
272: 89 e0 ldi r24, 0x09 ; 9
274: 0e 94 7b 00 call 0xf6 ; 0xf6 <sdraw_send_command_r1>
278: 88 23 and r24, r24
27a: 31 f0 breq .+12 ; 0x288 <sdraw_get_info+0x124>
{
unselect_card();
27c: 80 91 62 00 lds r24, 0x0062
280: 80 68 ori r24, 0x80 ; 128
282: 80 93 62 00 sts 0x0062, r24
286: 80 c0 rjmp .+256 ; 0x388 <sdraw_get_info+0x224>
}
uint8_t sdraw_recv_byte()
{
/* send dummy data for receiving some */
return SPI_recv_byte();
288: 0e 94 e0 03 call 0x7c0 ; 0x7c0 <SPI_recv_byte>
{
unselect_card();
return 0;
}
while(sdraw_recv_byte() != 0xfe);
28c: 8e 3f cpi r24, 0xFE ; 254
28e: e1 f7 brne .-8 ; 0x288 <sdraw_get_info+0x124>
290: ff 24 eor r15, r15
292: cc 24 eor r12, r12
294: ee 24 eor r14, r14
296: c0 e0 ldi r28, 0x00 ; 0
298: d0 e0 ldi r29, 0x00 ; 0
if(b & 0x40)
info->flag_copy = 1;
if(b & 0x20)
info->flag_write_protect = 1;
if(b & 0x10)
info->flag_write_protect_temp = 1;
29a: dd 24 eor r13, r13
29c: d3 94 inc r13
}
uint8_t sdraw_recv_byte()
{
/* send dummy data for receiving some */
return SPI_recv_byte();
29e: 0e 94 e0 03 call 0x7c0 ; 0x7c0 <SPI_recv_byte>
for(i = 0; i < 18; ++i)
{
b = sdraw_recv_byte();
switch(i)
2a2: 98 e0 ldi r25, 0x08 ; 8
2a4: f9 16 cp r15, r25
2a6: 41 f1 breq .+80 ; 0x2f8 <sdraw_get_info+0x194>
2a8: 9f 15 cp r25, r15
2aa: 50 f0 brcs .+20 ; 0x2c0 <sdraw_get_info+0x15c>
2ac: e6 e0 ldi r30, 0x06 ; 6
2ae: fe 16 cp r15, r30
2b0: a9 f0 breq .+42 ; 0x2dc <sdraw_get_info+0x178>
2b2: ef 15 cp r30, r15
2b4: c8 f0 brcs .+50 ; 0x2e8 <sdraw_get_info+0x184>
2b6: f5 e0 ldi r31, 0x05 ; 5
2b8: ff 16 cp r15, r31
2ba: 09 f0 breq .+2 ; 0x2be <sdraw_get_info+0x15a>
2bc: 59 c0 rjmp .+178 ; 0x370 <sdraw_get_info+0x20c>
2be: 0a c0 rjmp .+20 ; 0x2d4 <sdraw_get_info+0x170>
2c0: 4a e0 ldi r20, 0x0A ; 10
2c2: f4 16 cp r15, r20
2c4: 39 f1 breq .+78 ; 0x314 <sdraw_get_info+0x1b0>
2c6: f4 16 cp r15, r20
2c8: 00 f1 brcs .+64 ; 0x30a <sdraw_get_info+0x1a6>
2ca: 5e e0 ldi r21, 0x0E ; 14
2cc: f5 16 cp r15, r21
2ce: 09 f0 breq .+2 ; 0x2d2 <sdraw_get_info+0x16e>
2d0: 4f c0 rjmp .+158 ; 0x370 <sdraw_get_info+0x20c>
2d2: 39 c0 rjmp .+114 ; 0x346 <sdraw_get_info+0x1e2>
{
case 5:
csd_read_bl_len = b & 0x0f;
2d4: 7f e0 ldi r23, 0x0F ; 15
2d6: c7 2e mov r12, r23
2d8: c8 22 and r12, r24
2da: 4a c0 rjmp .+148 ; 0x370 <sdraw_get_info+0x20c>
break;
case 6:
csd_c_size = (uint16_t) (b & 0x03) << 8;
2dc: 90 e0 ldi r25, 0x00 ; 0
2de: 83 70 andi r24, 0x03 ; 3
2e0: 90 70 andi r25, 0x00 ; 0
2e2: d8 2f mov r29, r24
2e4: cc 27 eor r28, r28
2e6: 44 c0 rjmp .+136 ; 0x370 <sdraw_get_info+0x20c>
break;
case 7:
csd_c_size |= b;
2e8: 90 e0 ldi r25, 0x00 ; 0
2ea: c8 2b or r28, r24
2ec: d9 2b or r29, r25
csd_c_size <<= 2;
2ee: cc 0f add r28, r28
2f0: dd 1f adc r29, r29
2f2: cc 0f add r28, r28
2f4: dd 1f adc r29, r29
2f6: 3c c0 rjmp .+120 ; 0x370 <sdraw_get_info+0x20c>
break;
case 8:
csd_c_size |= b >> 6;
2f8: 82 95 swap r24
2fa: 86 95 lsr r24
2fc: 86 95 lsr r24
2fe: 83 70 andi r24, 0x03 ; 3
300: 90 e0 ldi r25, 0x00 ; 0
302: c8 2b or r28, r24
304: d9 2b or r29, r25
++csd_c_size;
306: 21 96 adiw r28, 0x01 ; 1
308: 33 c0 rjmp .+102 ; 0x370 <sdraw_get_info+0x20c>
break;
case 9:
csd_c_size_mult = (b & 0x03) << 1;
30a: 43 e0 ldi r20, 0x03 ; 3
30c: e4 2e mov r14, r20
30e: e8 22 and r14, r24
310: ee 0c add r14, r14
312: 2e c0 rjmp .+92 ; 0x370 <sdraw_get_info+0x20c>
break;
case 10:
csd_c_size_mult |= b >> 7;
314: 88 1f adc r24, r24
316: 88 27 eor r24, r24
318: 88 1f adc r24, r24
31a: e8 2a or r14, r24
info->capacity = (uint32_t) csd_c_size << (csd_c_size_mult + csd_read_bl_len + 2);
31c: 9e 01 movw r18, r28
31e: 40 e0 ldi r20, 0x00 ; 0
320: 50 e0 ldi r21, 0x00 ; 0
322: 8c 2d mov r24, r12
324: 90 e0 ldi r25, 0x00 ; 0
326: 02 96 adiw r24, 0x02 ; 2
328: 8e 0d add r24, r14
32a: 91 1d adc r25, r1
32c: 04 c0 rjmp .+8 ; 0x336 <sdraw_get_info+0x1d2>
32e: 22 0f add r18, r18
330: 33 1f adc r19, r19
332: 44 1f adc r20, r20
334: 55 1f adc r21, r21
336: 8a 95 dec r24
338: d2 f7 brpl .-12 ; 0x32e <sdraw_get_info+0x1ca>
33a: f8 01 movw r30, r16
33c: 21 8b std Z+17, r18 ; 0x11
33e: 32 8b std Z+18, r19 ; 0x12
340: 43 8b std Z+19, r20 ; 0x13
342: 54 8b std Z+20, r21 ; 0x14
344: 15 c0 rjmp .+42 ; 0x370 <sdraw_get_info+0x20c>
break;
case 14:
if(b & 0x40)
346: 90 e0 ldi r25, 0x00 ; 0
348: 86 ff sbrs r24, 6
34a: 02 c0 rjmp .+4 ; 0x350 <sdraw_get_info+0x1ec>
info->flag_copy = 1;
34c: f8 01 movw r30, r16
34e: d5 8a std Z+21, r13 ; 0x15
if(b & 0x20)
350: 85 ff sbrs r24, 5
352: 02 c0 rjmp .+4 ; 0x358 <sdraw_get_info+0x1f4>
info->flag_write_protect = 1;
354: f8 01 movw r30, r16
356: d6 8a std Z+22, r13 ; 0x16
if(b & 0x10)
358: 84 ff sbrs r24, 4
35a: 02 c0 rjmp .+4 ; 0x360 <sdraw_get_info+0x1fc>
info->flag_write_protect_temp = 1;
35c: f8 01 movw r30, r16
35e: d7 8a std Z+23, r13 ; 0x17
info->format = (b & 0x0c) >> 2;
360: 8c 70 andi r24, 0x0C ; 12
362: 90 70 andi r25, 0x00 ; 0
364: 95 95 asr r25
366: 87 95 ror r24
368: 95 95 asr r25
36a: 87 95 ror r24
36c: f8 01 movw r30, r16
36e: 80 8f std Z+24, r24 ; 0x18
return 0;
}
while(sdraw_recv_byte() != 0xfe);
for(i = 0; i < 18; ++i)
370: f3 94 inc r15
372: f2 e1 ldi r31, 0x12 ; 18
374: ff 16 cp r15, r31
376: 09 f0 breq .+2 ; 0x37a <sdraw_get_info+0x216>
378: 92 cf rjmp .-220 ; 0x29e <sdraw_get_info+0x13a>
info->format = (b & 0x0c) >> 2;
break;
}
}
unselect_card();
37a: 80 91 62 00 lds r24, 0x0062
37e: 80 68 ori r24, 0x80 ; 128
380: 80 93 62 00 sts 0x0062, r24
384: 81 e0 ldi r24, 0x01 ; 1
386: 01 c0 rjmp .+2 ; 0x38a <sdraw_get_info+0x226>
return 1;
388: 80 e0 ldi r24, 0x00 ; 0
}
38a: df 91 pop r29
38c: cf 91 pop r28
38e: 1f 91 pop r17
390: 0f 91 pop r16
392: ff 90 pop r15
394: ef 90 pop r14
396: df 90 pop r13
398: cf 90 pop r12
39a: 08 95 ret
0000039c <sdraw_init>:
return 1;
}
uint8_t sdraw_init()
{
39c: 1f 93 push r17
39e: cf 93 push r28
3a0: df 93 push r29
uint8_t i;
uint16_t j;
uint8_t response;
/* enable inputs for reading card status */
configure_pin_cd();
3a2: be 98 cbi 0x17, 6 ; 23
configure_pin_wp();
3a4: bf 98 cbi 0x17, 7 ; 23
/* enable outputs for MOSI, SCK, SS, input for MISO */
configure_pin_mosi();
3a6: ba 9a sbi 0x17, 2 ; 23
configure_pin_sck();
3a8: b9 9a sbi 0x17, 1 ; 23
configure_pin_ss();
3aa: 80 91 61 00 lds r24, 0x0061
3ae: 80 68 ori r24, 0x80 ; 128
3b0: 80 93 61 00 sts 0x0061, r24
configure_pin_miso();
3b4: bb 9a sbi 0x17, 3 ; 23
unselect_card();
3b6: 80 91 62 00 lds r24, 0x0062
3ba: 80 68 ori r24, 0x80 ; 128
3bc: 80 93 62 00 sts 0x0062, r24
static uint8_t raw_block_written;
static uint32_t raw_block_address;
uint8_t sdraw_card_detected()
{
return ((get_pin_cd() == 0x00) ? 1 : 0);
3c0: 86 b3 in r24, 0x16 ; 22
/* initialize SPI with lowest frequency; max. 400kHz during identification mode of card */
// SPI_init();
/* initialization procedure */
if(!sdraw_card_detected())
3c2: 82 95 swap r24
3c4: 86 95 lsr r24
3c6: 86 95 lsr r24
3c8: 83 70 andi r24, 0x03 ; 3
3ca: 80 ff sbrs r24, 0
3cc: 03 c0 rjmp .+6 ; 0x3d4 <sdraw_init+0x38>
{ UART_puts("ERROR : CARD NOT FOUND\n");
3ce: 80 e0 ldi r24, 0x00 ; 0
3d0: 91 e0 ldi r25, 0x01 ; 1
3d2: 25 c0 rjmp .+74 ; 0x41e <sdraw_init+0x82>
return 0;
}
UART_puts("CARD DETECTED\n");
3d4: 88 e1 ldi r24, 0x18 ; 24
3d6: 91 e0 ldi r25, 0x01 ; 1
3d8: 0e 94 c4 04 call 0x988 ; 0x988 <UART_puts>
3dc: 10 e0 ldi r17, 0x00 ; 0
}
uint8_t sdraw_recv_byte()
{
/* send dummy data for receiving some */
return SPI_recv_byte();
3de: 0e 94 e0 03 call 0x7c0 ; 0x7c0 <SPI_recv_byte>
UART_puts("CARD DETECTED\n");
/* card needs 74 cycles minimum to start up */
for(i = 0; i < 10; ++i)
3e2: 1f 5f subi r17, 0xFF ; 255
3e4: 1a 30 cpi r17, 0x0A ; 10
3e6: d9 f7 brne .-10 ; 0x3de <sdraw_init+0x42>
/* byte recv : 8 cycles */
sdraw_recv_byte();
}
/* address card */
select_card();
3e8: 80 91 62 00 lds r24, 0x0062
3ec: 8f 77 andi r24, 0x7F ; 127
3ee: 80 93 62 00 sts 0x0062, r24
3f2: c0 e0 ldi r28, 0x00 ; 0
3f4: d0 e0 ldi r29, 0x00 ; 0
/* reset card */
for(j = 0; ; ++j)
{
response = sdraw_send_command_r1(CMD_GO_IDLE_STATE, 0);
3f6: 40 e0 ldi r20, 0x00 ; 0
3f8: 50 e0 ldi r21, 0x00 ; 0
3fa: 60 e0 ldi r22, 0x00 ; 0
3fc: 70 e0 ldi r23, 0x00 ; 0
3fe: 80 e0 ldi r24, 0x00 ; 0
400: 0e 94 7b 00 call 0xf6 ; 0xf6 <sdraw_send_command_r1>
if(response == (1 << R1_IDLE_STATE))
404: 81 30 cpi r24, 0x01 ; 1
406: 89 f0 breq .+34 ; 0x42a <sdraw_init+0x8e>
break;
if(j == 0x1ff)
408: 81 e0 ldi r24, 0x01 ; 1
40a: cf 3f cpi r28, 0xFF ; 255
40c: d8 07 cpc r29, r24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -