⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000000   ....               LDR         R0,??DataTable8    ;; Stat
   \   00000002   0078               LDRB        R0,[R0, #+0]
   \   00000004   7047               BX          LR                 ;; return
    383          }
    384          
    385          
    386          
    387          /*----------------*/
    388          /* Read Sector(s) */
    389          

   \                                 In segment CODE, align 4, keep-with-next
    390          extern DRESULT disk_read (
    391          	BYTE *buff,		/* Data buffer to store read data */
    392          	DWORD sector,		/* Sector number (LBA) */
    393          	BYTE count			/* Sector count (1..255) */
    394          )
    395          {
   \                     disk_read:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   151C               MOV         R5,R2
    396          	if (Stat & STA_NOINIT) return RES_NOTRDY;
   \   00000006   ....               LDR         R0,??DataTable8    ;; Stat
   \   00000008   0078               LDRB        R0,[R0, #+0]
   \   0000000A   C007               LSL         R0,R0,#+31
   \   0000000C   01D5               BPL         ??disk_read_0
   \   0000000E   0320               MOV         R0,#+3
   \   00000010   34E0               B           ??disk_read_1
    397          	if (!count) return RES_PARERR;
   \                     ??disk_read_0:
   \   00000012   002D               CMP         R5,#+0
   \   00000014   01D1               BNE         ??disk_read_2
   \   00000016   0420               MOV         R0,#+4
   \   00000018   30E0               B           ??disk_read_1
    398          
    399          	sector *= 512;		/* LBA --> byte address */
   \                     ??disk_read_2:
   \   0000001A   4902               LSL         R1,R1,#+9
    400          
    401          	SELECT();			/* CS = L */
   \   0000001C   8026               MOV         R6,#+128
   \   0000001E   B601               LSL         R6,R6,#+6          ;; #+8192
   \   00000020   ....               LDR         R0,??DataTable15   ;; 0xfffff434
   \   00000022   0660               STR         R6,[R0, #+0]
    402          
    403          	if (count == 1) {	/* Single block read */
   \   00000024   012D               CMP         R5,#+1
   \   00000026   0CD1               BNE         ??disk_read_3
    404          		if ((send_cmd(CMD17, sector) == 0)	/* READ_SINGLE_BLOCK */
    405          			&& rcvr_datablock(buff, (BYTE)(512/2)))
   \   00000028   5120               MOV         R0,#+81
   \   0000002A   ........           BL          send_cmd
   \   0000002E   0028               CMP         R0,#+0
   \   00000030   1CD1               BNE         ??disk_read_4
   \   00000032   0021               MOV         R1,#+0
   \   00000034   201C               MOV         R0,R4
   \   00000036   ........           BL          rcvr_datablock
   \   0000003A   0028               CMP         R0,#+0
   \   0000003C   16D0               BEQ         ??disk_read_4
    406          			count = 0;
   \   0000003E   0025               MOV         R5,#+0
   \   00000040   14E0               B           ??disk_read_4
    407          	}
    408          	else {				/* Multiple block read */
    409          		if (send_cmd(CMD18, sector) == 0) {	/* READ_MULTIPLE_BLOCK */
   \                     ??disk_read_3:
   \   00000042   5220               MOV         R0,#+82
   \   00000044   ........           BL          send_cmd
   \   00000048   0028               CMP         R0,#+0
   \   0000004A   0FD1               BNE         ??disk_read_4
    410          			do {
    411          				if (!rcvr_datablock(buff, (BYTE)(512/2))) break;
   \                     ??disk_read_5:
   \   0000004C   0021               MOV         R1,#+0
   \   0000004E   201C               MOV         R0,R4
   \   00000050   ........           BL          rcvr_datablock
   \   00000054   0028               CMP         R0,#+0
   \   00000056   05D0               BEQ         ??disk_read_6
    412          				buff += 512;
   \   00000058   3009               LSR         R0,R6,#+4
   \   0000005A   2418               ADD         R4,R4,R0
    413          			} while (--count);
   \   0000005C   6D1E               SUB         R5,R5,#+1
   \   0000005E   2D06               LSL         R5,R5,#+24
   \   00000060   2D0E               LSR         R5,R5,#+24
   \   00000062   F3D1               BNE         ??disk_read_5
    414          			send_cmd(CMD12, 0);				/* STOP_TRANSMISSION */
   \                     ??disk_read_6:
   \   00000064   0021               MOV         R1,#+0
   \   00000066   4C20               MOV         R0,#+76
   \   00000068   ........           BL          send_cmd
    415          		}
    416          	}
    417          
    418          	DESELECT();			/* CS = H */
   \                     ??disk_read_4:
   \   0000006C   ....               LDR         R0,??DataTable16   ;; 0xfffff430
   \   0000006E   0660               STR         R6,[R0, #+0]
    419          	rcvr_spi();			/* Idle (Release DO) */
   \   00000070   FF20               MOV         R0,#+255
   \   00000072   ........           BL          AT91_spi
    420          
    421          	return count ? RES_ERROR : RES_OK;
   \   00000076   281C               MOV         R0,R5
   \   00000078   00D0               BEQ         ??disk_read_1
   \   0000007A   0120               MOV         R0,#+1
   \                     ??disk_read_1:
   \   0000007C   ....               B           ?Subroutine17
    422          }
    423          
    424          
    425          
    426          /*-----------------*/
    427          /* Write Sector(s) */
    428          
    429          #ifndef _READONLY

   \                                 In segment CODE, align 4, keep-with-next
    430          extern DRESULT disk_write (
    431          	const BYTE *buff,	/* Data to be written */
    432          	DWORD sector,		/* Sector number (LBA) */
    433          	BYTE count			/* Sector count (1..255) */
    434          )
    435          {
   \                     disk_write:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   151C               MOV         R5,R2
    436          	if (Stat & STA_NOINIT) return RES_NOTRDY;
   \   00000006   ....               LDR         R0,??DataTable17   ;; Stat
   \   00000008   0278               LDRB        R2,[R0, #+0]
   \   0000000A   D207               LSL         R2,R2,#+31
   \   0000000C   01D5               BPL         ??disk_write_0
   \   0000000E   0320               MOV         R0,#+3
   \   00000010   3CE0               B           ??disk_write_1
    437          	if (Stat & STA_PROTECT) return RES_WRPRT;
   \                     ??disk_write_0:
   \   00000012   0078               LDRB        R0,[R0, #+0]
   \   00000014   4007               LSL         R0,R0,#+29
   \   00000016   01D5               BPL         ??disk_write_2
   \   00000018   0220               MOV         R0,#+2
   \   0000001A   37E0               B           ??disk_write_1
    438          	if (!count) return RES_PARERR;
   \                     ??disk_write_2:
   \   0000001C   002D               CMP         R5,#+0
   \   0000001E   01D1               BNE         ??disk_write_3
   \   00000020   0420               MOV         R0,#+4
   \   00000022   33E0               B           ??disk_write_1
    439          	sector *= 512;		/* LBA --> byte address */
   \                     ??disk_write_3:
   \   00000024   4902               LSL         R1,R1,#+9
    440          
    441          	SELECT();			/* CS = L */
   \   00000026   8026               MOV         R6,#+128
   \   00000028   B601               LSL         R6,R6,#+6          ;; #+8192
   \   0000002A   ....               LDR         R0,??DataTable15   ;; 0xfffff434
   \   0000002C   0660               STR         R6,[R0, #+0]
    442          
    443          	if (count == 1) {	/* Single block write */
   \   0000002E   012D               CMP         R5,#+1
   \   00000030   0CD1               BNE         ??disk_write_4
    444          		if ((send_cmd(CMD24, sector) == 0)	/* WRITE_BLOCK */
    445          			&& xmit_datablock(buff, 0xFE))
   \   00000032   5820               MOV         R0,#+88
   \   00000034   ........           BL          send_cmd
   \   00000038   0028               CMP         R0,#+0
   \   0000003A   1FD1               BNE         ??disk_write_5
   \   0000003C   FE21               MOV         R1,#+254
   \   0000003E   201C               MOV         R0,R4
   \   00000040   ........           BL          xmit_datablock
   \   00000044   0028               CMP         R0,#+0
   \   00000046   19D0               BEQ         ??disk_write_5
    446          			count = 0;
   \   00000048   0025               MOV         R5,#+0
   \   0000004A   17E0               B           ??disk_write_5
    447          	}
    448          	else {				/* Multiple block write */
    449          		if (send_cmd(CMD25, sector) == 0) {	/* WRITE_MULTIPLE_BLOCK */
   \                     ??disk_write_4:
   \   0000004C   5920               MOV         R0,#+89
   \   0000004E   ........           BL          send_cmd
   \   00000052   0028               CMP         R0,#+0
   \   00000054   12D1               BNE         ??disk_write_5
    450          			do {
    451          				if (!xmit_datablock(buff, 0xFC)) break;
   \                     ??disk_write_6:
   \   00000056   FC21               MOV         R1,#+252
   \   00000058   201C               MOV         R0,R4
   \   0000005A   ........           BL          xmit_datablock
   \   0000005E   0028               CMP         R0,#+0
   \   00000060   05D0               BEQ         ??disk_write_7
    452          				buff += 512;
   \   00000062   3009               LSR         R0,R6,#+4
   \   00000064   2418               ADD         R4,R4,R0
    453          			} while (--count);
   \   00000066   6D1E               SUB         R5,R5,#+1
   \   00000068   2D06               LSL         R5,R5,#+24
   \   0000006A   2D0E               LSR         R5,R5,#+24
   \   0000006C   F3D1               BNE         ??disk_write_6
    454          			if (!xmit_datablock(0, 0xFD))	/* STOP_TRAN token */
   \                     ??disk_write_7:
   \   0000006E   FD21               MOV         R1,#+253
   \   00000070   0020               MOV         R0,#+0
   \   00000072   ........           BL          xmit_datablock
   \   00000076   0028               CMP         R0,#+0
   \   00000078   00D1               BNE         ??disk_write_5
    455          				count = 1;
   \   0000007A   0125               MOV         R5,#+1
    456          		}
    457          	}
    458          
    459          	DESELECT();			/* CS = H */
   \                     ??disk_write_5:
   \   0000007C   ....               LDR         R0,??DataTable16   ;; 0xfffff430
   \   0000007E   0660               STR         R6,[R0, #+0]
    460          	rcvr_spi();			/* Idle (Release DO) */
   \   00000080   FF20               MOV         R0,#+255
   \   00000082   ........           BL          AT91_spi
    461          
    462          	return count ? RES_ERROR : RES_OK;
   \   00000086   281C               MOV         R0,R5
   \   00000088   00D0               BEQ         ??disk_write_1
   \   0000008A   0120               MOV         R0,#+1
   \                     ??disk_write_1:
   \   0000008C   ....               B           ?Subroutine17
    463          }
    464          #endif
    465          
    466          
    467          
    468          /*--------------------------*/
    469          /* Miscellaneous Functions  */
    470          

   \                                 In segment CODE, align 4, keep-with-next
    471          DRESULT disk_ioctl (
    472          	BYTE ctrl,		/* Control code */
    473          	void *buff		/* Buffer to send/receive data block */
    474          )
    475          {
   \                     disk_ioctl:
   \   00000000   7FB5               PUSH        {R0-R6,LR}
    476          	DRESULT res;
    477          	BYTE n, csd[16], *ptr = buff;
   \   00000002   0C1C               MOV         R4,R1
    478          	WORD csm, csize;
    479          
    480          
    481          	if (Stat & STA_NOINIT) return RES_NOTRDY;
   \   00000004   ....               LDR         R1,??DataTable17   ;; Stat
   \   00000006   0978               LDRB        R1,[R1, #+0]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -