📄 mmc.lst
字号:
\ 0000000A 5918 ADD R1,R3,R1
\ 0000000C ........ BL disk_write
467 return acd;
\ 00000010 02BC POP {R1}
\ 00000012 0847 BX R1 ;; return
468 }
\ In segment CODE, align 4, keep-with-next
469 unsigned char Erase_MMC_Cluster(unsigned int cluster)
470 {
\ Erase_MMC_Cluster:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 FFB0 SUB SP,#+508
\ 00000004 81B0 SUB SP,#+4
\ 00000006 041C MOV R4,R0
471 BYTE buff[512];
472 BYTE acd;
473 memset(buff, 0xff, sizeof(buff));
\ 00000008 8020 MOV R0,#+128
\ 0000000A 8000 LSL R0,R0,#+2 ;; #+512
\ 0000000C FF21 MOV R1,#+255
\ 0000000E 6A46 MOV R2,SP
\ ??Erase_MMC_Cluster_0:
\ 00000010 401E SUB R0,R0,#+1
\ 00000012 1154 STRB R1,[R2, R0]
\ 00000014 FCD1 BNE ??Erase_MMC_Cluster_0
474 for(char i=0;i<32;i++)
\ 00000016 0025 MOV R5,#+0
475 {
476 acd=disk_write (buff,cluster,1);
\ ??Erase_MMC_Cluster_1:
\ 00000018 0122 MOV R2,#+1
\ 0000001A 211C MOV R1,R4
\ 0000001C 6846 MOV R0,SP
\ 0000001E ........ BL disk_write
477 if(acd==RES_ERROR) return 0;
\ 00000022 0128 CMP R0,#+1
\ 00000024 01D1 BNE ??Erase_MMC_Cluster_2
\ 00000026 0020 MOV R0,#+0
\ 00000028 05E0 B ??Erase_MMC_Cluster_3
478 }
\ ??Erase_MMC_Cluster_2:
\ 0000002A 6D1C ADD R5,R5,#+1
\ 0000002C 2D06 LSL R5,R5,#+24
\ 0000002E 2D0E LSR R5,R5,#+24
\ 00000030 202D CMP R5,#+32
\ 00000032 F1D3 BCC ??Erase_MMC_Cluster_1
479 return 1;
\ 00000034 0120 MOV R0,#+1
\ ??Erase_MMC_Cluster_3:
\ 00000036 7FB0 ADD SP,#+508
\ 00000038 01B0 ADD SP,#+4
\ 0000003A C046 NOP
\ 0000003C REQUIRE ?Subroutine22
\ 0000003C ;; // Fall through to label ?Subroutine22
480 }
481
482 /*--------------------------*/
483 /* Miscellaneous Functions */
484
\ In segment CODE, align 4, keep-with-next
485 DRESULT disk_ioctl (
486 BYTE ctrl, /* Control code */
487 void *buff /* Buffer to send/receive data block */
488 )
489 {
\ disk_ioctl:
\ 00000000 7FB5 PUSH {R0-R6,LR}
490 DRESULT res;
491 BYTE n, csd[16], *ptr = buff;
\ 00000002 0C1C MOV R4,R1
492 WORD csm, csize;
493
494
495 if (Stat & STA_NOINIT) return RES_NOTRDY;
\ 00000004 .... LDR R1,??DataTable17 ;; Stat
\ 00000006 0978 LDRB R1,[R1, #+0]
\ 00000008 C907 LSL R1,R1,#+31
\ 0000000A 01D5 BPL ??disk_ioctl_0
\ 0000000C 0320 MOV R0,#+3
\ 0000000E 64E0 B ??disk_ioctl_1
496
497 SELECT(); /* CS = L */
\ ??disk_ioctl_0:
\ 00000010 8025 MOV R5,#+128
\ 00000012 AD01 LSL R5,R5,#+6 ;; #+8192
\ 00000014 .... LDR R1,??DataTable15 ;; 0xfffff434
\ 00000016 0D60 STR R5,[R1, #+0]
498
499 res = RES_ERROR;
\ 00000018 0126 MOV R6,#+1
500 switch (ctrl) {
\ 0000001A 0128 CMP R0,#+1
\ 0000001C 06D0 BEQ ??disk_ioctl_2
\ 0000001E 0A28 CMP R0,#+10
\ 00000020 2BD0 BEQ ??disk_ioctl_3
\ 00000022 0B28 CMP R0,#+11
\ 00000024 36D0 BEQ ??disk_ioctl_4
\ 00000026 0C28 CMP R0,#+12
\ 00000028 41D0 BEQ ??disk_ioctl_5
\ 0000002A 4FE0 B ??disk_ioctl_6
501 case GET_SECTORS : /* Get number of sectors on the disk (unsigned long) */
502 if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16/2)) {
\ ??disk_ioctl_2:
\ 0000002C 0021 MOV R1,#+0
\ 0000002E 4920 MOV R0,#+73
\ 00000030 ........ BL send_cmd
\ 00000034 0028 CMP R0,#+0
\ 00000036 4AD1 BNE ??disk_ioctl_7
\ 00000038 0821 MOV R1,#+8
\ 0000003A 6846 MOV R0,SP
\ 0000003C ........ BL rcvr_datablock
\ 00000040 0028 CMP R0,#+0
\ 00000042 44D0 BEQ ??disk_ioctl_7
503 /* Calculate disk size */
504 csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
505 csize = ((WORD)(csd[8] & 3) >> 6) + (WORD)(csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;
506 #ifdef _BYTE_ACC
507 ST_DWORD(ptr, (DWORD)csize * csm);
508 #else
509 *(DWORD*)ptr = (DWORD)csize * csm;
\ 00000044 6846 MOV R0,SP
\ 00000046 C179 LDRB R1,[R0, #+7]
\ 00000048 8900 LSL R1,R1,#+2
\ 0000004A 8279 LDRB R2,[R0, #+6]
\ 0000004C 9207 LSL R2,R2,#+30
\ 0000004E 920F LSR R2,R2,#+30
\ 00000050 9202 LSL R2,R2,#+10
\ 00000052 8918 ADD R1,R1,R2
\ 00000054 491C ADD R1,R1,#+1
\ 00000056 0904 LSL R1,R1,#+16
\ 00000058 090C LSR R1,R1,#+16
\ 0000005A 0122 MOV R2,#+1
\ 0000005C 837A LDRB R3,[R0, #+10]
\ 0000005E DB09 LSR R3,R3,#+7
\ 00000060 407A LDRB R0,[R0, #+9]
\ 00000062 8007 LSL R0,R0,#+30
\ 00000064 800F LSR R0,R0,#+30
\ 00000066 4000 LSL R0,R0,#+1
\ 00000068 1818 ADD R0,R3,R0
\ 0000006A 801C ADD R0,R0,#+2
\ 0000006C 8240 LSL R2,R0
\ 0000006E 1204 LSL R2,R2,#+16
\ 00000070 120C LSR R2,R2,#+16
\ 00000072 5143 MUL R1,R2
\ 00000074 2160 STR R1,[R4, #+0]
510 #endif
511 res = RES_OK;
\ ??disk_ioctl_8:
\ 00000076 0026 MOV R6,#+0
\ 00000078 29E0 B ??disk_ioctl_7
512 }
513 break;
514
515 case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */
516 if ((send_cmd(CMD9, 0) == 0) /* READ_CSD */
517 && rcvr_datablock(ptr, 16/2))
\ ??disk_ioctl_3:
\ 0000007A 0021 MOV R1,#+0
\ 0000007C 4920 MOV R0,#+73
\ 0000007E ........ BL send_cmd
\ 00000082 0028 CMP R0,#+0
\ 00000084 23D1 BNE ??disk_ioctl_7
\ 00000086 0821 MOV R1,#+8
\ 00000088 201C MOV R0,R4
\ 0000008A ........ BL rcvr_datablock
\ 0000008E 0028 CMP R0,#+0
\ 00000090 1DD0 BEQ ??disk_ioctl_7
518 res = RES_OK;
\ 00000092 F0E7 B ??disk_ioctl_8
519 break;
520
521 case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */
522 if ((send_cmd(CMD10, 0) == 0) /* READ_CID */
523 && rcvr_datablock(ptr, 16/2))
\ ??disk_ioctl_4:
\ 00000094 0021 MOV R1,#+0
\ 00000096 4A20 MOV R0,#+74
\ 00000098 ........ BL send_cmd
\ 0000009C 0028 CMP R0,#+0
\ 0000009E 16D1 BNE ??disk_ioctl_7
\ 000000A0 0821 MOV R1,#+8
\ 000000A2 201C MOV R0,R4
\ 000000A4 ........ BL rcvr_datablock
\ 000000A8 0028 CMP R0,#+0
\ 000000AA 10D0 BEQ ??disk_ioctl_7
524 res = RES_OK;
\ 000000AC E3E7 B ??disk_ioctl_8
525 break;
526
527 case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */
528 if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */
\ ??disk_ioctl_5:
\ 000000AE 0021 MOV R1,#+0
\ 000000B0 7A20 MOV R0,#+122
\ 000000B2 ........ BL send_cmd
\ 000000B6 0028 CMP R0,#+0
\ 000000B8 09D1 BNE ??disk_ioctl_7
529 for (n = 0; n < 4; n++)
\ 000000BA 0426 MOV R6,#+4
530 *ptr++ = rcvr_spi();
\ ??disk_ioctl_9:
\ 000000BC FF20 MOV R0,#+255
\ 000000BE ........ BL AT91_spi
\ 000000C2 2070 STRB R0,[R4, #+0]
\ 000000C4 641C ADD R4,R4,#+1
\ 000000C6 761E SUB R6,R6,#+1
\ 000000C8 F8D1 BNE ??disk_ioctl_9
531 res = RES_OK;
\ 000000CA D4E7 B ??disk_ioctl_8
532 }
533 break;
534
535 default:
536 res = RES_PARERR;
\ ??disk_ioctl_6:
\ 000000CC 0426 MOV R6,#+4
537 }
538
539 DESELECT(); /* CS = H */
\ ??disk_ioctl_7:
\ 000000CE .... LDR R0,??DataTable16 ;; 0xfffff430
\ 000000D0 0560 STR R5,[R0, #+0]
540 rcvr_spi(); /* Idle (Release DO) */
\ 000000D2 FF20 MOV R0,#+255
\ 000000D4 ........ BL AT91_spi
541
542 return res;
\ 000000D8 301C MOV R0,R6
\ ??disk_ioctl_1:
\ 000000DA 04B0 ADD SP,#+16
\ 000000DC .... B ?Subroutine21
543 }
544
545
546
547 /*---------------------------------------*/
548 /* Device timer interrupt procedure */
549 /* This must be called in period of 10ms */
550 /* (Platform dependent) */
551
\ In segment CODE, align 4, keep-with-next
552 void disk_timerproc ()
553 {
554 static BYTE pv;
555 BYTE n, s;
556 n = Timer; /* 100Hz decrement timer */
\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -