📄 mmc.lst
字号:
\ 00000008 C907 LSL R1,R1,#+31
\ 0000000A 01D5 BPL ??disk_ioctl_0
\ 0000000C 0320 MOV R0,#+3
\ 0000000E 64E0 B ??disk_ioctl_1
482
483 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]
484
485 res = RES_ERROR;
\ 00000018 0126 MOV R6,#+1
486 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
487 case GET_SECTORS : /* Get number of sectors on the disk (unsigned long) */
488 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
489 /* Calculate disk size */
490 csm = 1 << (((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2);
491 csize = ((WORD)(csd[8] & 3) >> 6) + (WORD)(csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;
492 #ifdef _BYTE_ACC
493 ST_DWORD(ptr, (DWORD)csize * csm);
494 #else
495 *(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]
496 #endif
497 res = RES_OK;
\ ??disk_ioctl_8:
\ 00000076 0026 MOV R6,#+0
\ 00000078 29E0 B ??disk_ioctl_7
498 }
499 break;
500
501 case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */
502 if ((send_cmd(CMD9, 0) == 0) /* READ_CSD */
503 && 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
504 res = RES_OK;
\ 00000092 F0E7 B ??disk_ioctl_8
505 break;
506
507 case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */
508 if ((send_cmd(CMD10, 0) == 0) /* READ_CID */
509 && 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
510 res = RES_OK;
\ 000000AC E3E7 B ??disk_ioctl_8
511 break;
512
513 case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */
514 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
515 for (n = 0; n < 4; n++)
\ 000000BA 0426 MOV R6,#+4
516 *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
517 res = RES_OK;
\ 000000CA D4E7 B ??disk_ioctl_8
518 }
519 break;
520
521 default:
522 res = RES_PARERR;
\ ??disk_ioctl_6:
\ 000000CC 0426 MOV R6,#+4
523 }
524
525 DESELECT(); /* CS = H */
\ ??disk_ioctl_7:
\ 000000CE .... LDR R0,??DataTable16 ;; 0xfffff430
\ 000000D0 0560 STR R5,[R0, #+0]
526 rcvr_spi(); /* Idle (Release DO) */
\ 000000D2 FF20 MOV R0,#+255
\ 000000D4 ........ BL AT91_spi
527
528 return res;
\ 000000D8 301C MOV R0,R6
\ ??disk_ioctl_1:
\ 000000DA 04B0 ADD SP,#+16
\ 000000DC .... B ?Subroutine17
529 }
530
531
532
533 /*---------------------------------------*/
534 /* Device timer interrupt procedure */
535 /* This must be called in period of 10ms */
536 /* (Platform dependent) */
537
\ In segment CODE, align 4, keep-with-next
538 void disk_timerproc ()
539 {
540 static BYTE pv;
541 BYTE n, s;
542 n = Timer; /* 100Hz decrement timer */
\ disk_timerproc:
\ 00000000 .... LDR R0,??DataTable17 ;; Stat
\ 00000002 4178 LDRB R1,[R0, #+1]
543 if (n) Timer = --n;
\ 00000004 0A1C MOV R2,R1
\ 00000006 03D0 BEQ ??disk_timerproc_0
\ 00000008 491E SUB R1,R1,#+1
\ 0000000A 0906 LSL R1,R1,#+24
\ 0000000C 090E LSR R1,R1,#+24
\ 0000000E 4170 STRB R1,[R0, #+1]
544
545 // n = pv;
546 // pv = SOCKPORT & (SOCKWP | SOCKINS); /* Sapmle socket switch */
547
548 pv = pPIOA->PIO_PDSR;
\ ??disk_timerproc_0:
\ 00000010 054A LDR R2,??disk_timerproc_1 ;; 0xfffff43c
\ 00000012 1268 LDR R2,[R2, #+0]
549
550 if (n == pv) { /* Have contacts stabled? */
\ 00000014 1206 LSL R2,R2,#+24
\ 00000016 120E LSR R2,R2,#+24
\ 00000018 9142 CMP R1,R2
\ 0000001A 03D1 BNE ??disk_timerproc_2
551 s = Stat;
\ 0000001C 0178 LDRB R1,[R0, #+0]
552
553 if (pv & SOCKWP) /* WP is H (write protected) */
554 s |= STA_PROTECT;
555 else /* WP is L (write enabled) */
556 s &= ~STA_PROTECT;
557
558 if (pv & SOCKINS) /* INS = H (Socket empty) */
559 s |= (STA_NODISK | STA_NOINIT);
560 else /* INS = L (Card inserted) */
561 s &= ~STA_NODISK;
562
563 Stat = s;
\ 0000001E F922 MOV R2,#+249
\ 00000020 0A40 AND R2,R1
\ 00000022 0270 STRB R2,[R0, #+0]
564 }
565 }
\ ??disk_timerproc_2:
\ 00000024 00B0 ADD SP,#+0
\ 00000026 7047 BX LR ;; return
\ ??disk_timerproc_1:
\ 00000028 3CF4FFFF DC32 0xfffff43c
566 // 如下两个函数只是为了 集成到 mass storage 所提供得。与文件系统的实现无关
567
568 //读取相应媒体的一段数据 ,由于数据有可能不是整块的(512 * n),所以采取读整块,
569 //然后截取适当长度的字符。由于Start_Address为字节起始,需要换算为块地址
570 //调用 本函数的地方详见 ms_bot.c
571 //return value : no
\ In segment CODE, align 4, keep-with-next
572 void AT91F_ReadMedia1(unsigned int Start_Address, int size, unsigned char *buff)
573 {
\ AT91F_ReadMedia1:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 FFB0 SUB SP,#+508
\ 00000004 84B0 SUB SP,#+16
\ 00000006 141C MOV R4,R2
574 unsigned int Start_Sector ; //得到(mmc)的开始扇区
575 unsigned int Sector_Num ; //需要读写的扇区数
576 unsigned int Leave_Size ; //剩下的字节数(起始位置距离块开始地址的偏移)
577
578 unsigned int Last_size ; //剩余数据量
579 unsigned int Last_BlockNum ; //最后一块的块号
580 //unsigned char *GetBuff="" ;
581 unsigned char pBuf[SECTOR_SIZE]; //定义一个扇区大小的输入缓冲,如果读多块,多次读
582 int status ; //得到操作状态
583 #ifdef USE_LED
584 AT91F_LED_blinkSpeed(0);
\ 00000008 294A LDR R2,??AT91F_ReadMedia1_0 ;; 0xfffcc210
\ 0000000A 2A4B LDR R3,??AT91F_ReadMedia1_0+0x4 ;; 0xfffcc208
\ 0000000C 1B68 LDR R3,[R3, #+0]
\ 0000000E 5B08 LSR R3,R3,#+1
\ 00000010 1360
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -