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

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000004   151C               MOV         R5,R2
    372          	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
    373          	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
    374          
    375          	sector *= 512;		/* LBA --> byte address */
   \                     ??disk_read_2:
   \   0000001A   4902               LSL         R1,R1,#+9
    376          
    377          	SELECT();			/* CS = L */
   \   0000001C   8026               MOV         R6,#+128
   \   0000001E   B601               LSL         R6,R6,#+6          ;; #+8192
   \   00000020   ....               LDR         R0,??DataTable12   ;; 0xfffff434
   \   00000022   0660               STR         R6,[R0, #+0]
    378          
    379          	if (count == 1) {	/* Single block read */
   \   00000024   012D               CMP         R5,#+1
   \   00000026   0CD1               BNE         ??disk_read_3
    380          		if ((send_cmd(CMD17, sector) == 0)	/* READ_SINGLE_BLOCK */
    381          			&& 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
    382          			count = 0;
   \   0000003E   0025               MOV         R5,#+0
   \   00000040   14E0               B           ??disk_read_4
    383          	}
    384          	else {				/* Multiple block read */
    385          		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
    386          			do {
    387          				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
    388          				buff += 512;
   \   00000058   3009               LSR         R0,R6,#+4
   \   0000005A   2418               ADD         R4,R4,R0
    389          			} 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
    390          			send_cmd(CMD12, 0);				/* STOP_TRANSMISSION */
   \                     ??disk_read_6:
   \   00000064   0021               MOV         R1,#+0
   \   00000066   4C20               MOV         R0,#+76
   \   00000068   ........           BL          send_cmd
    391          		}
    392          	}
    393          
    394          	DESELECT();			/* CS = H */
   \                     ??disk_read_4:
   \   0000006C   ....               LDR         R0,??DataTable13   ;; 0xfffff430
   \   0000006E   0660               STR         R6,[R0, #+0]
    395          	rcvr_spi();			/* Idle (Release DO) */
   \   00000070   FF20               MOV         R0,#+255
   \   00000072   ........           BL          AT91_spi
    396          
    397          	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           ?Subroutine21
    398          }
    399          

   \                                 In segment CODE, align 4, keep-with-next
    400          void mmc_read_page(DWORD block,DWORD page, BYTE *buff)
    401          /* Read page(s) 
    402          
    403          extern DRESULT disk_read (
    404          	BYTE *buff,		// Data buffer to store read data 
    405          	DWORD sector,		// Sector number (LBA) 
    406          	BYTE count			// Sector count (1..255) 
    407          )*/
    408          {
   \                     mmc_read_page:
   \   00000000   00B5               PUSH        {LR}
   \   00000002   031C               MOV         R3,R0
   \   00000004   101C               MOV         R0,R2
    409                  DWORD sector;
    410                  sector =((block<<5)+page);
    411          	disk_read (buff,sector,1);
   \   00000006   0122               MOV         R2,#+1
   \   00000008   5B01               LSL         R3,R3,#+5
   \   0000000A   5918               ADD         R1,R3,R1
   \   0000000C   ........           BL          disk_read
    412          }
   \   00000010   01BC               POP         {R0}
   \   00000012   0047               BX          R0                 ;; return
    413          
    414          /*-----------------*/
    415          /* Write Sector(s) */
    416          
    417          #ifndef _READONLY

   \                                 In segment CODE, align 4, keep-with-next
    418          extern DRESULT disk_write (
    419          	const BYTE *buff,	/* Data to be written */
    420          	DWORD sector,		/* Sector number (LBA) */
    421          	BYTE count			/* Sector count (1..255) */
    422          )
    423          {
   \                     disk_write:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   151C               MOV         R5,R2
    424          	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
    425          	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
    426          	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
    427          	sector *= 512;		/* LBA --> byte address */
   \                     ??disk_write_3:
   \   00000024   4902               LSL         R1,R1,#+9
    428          
    429          	SELECT();			/* CS = L */
   \   00000026   8026               MOV         R6,#+128
   \   00000028   B601               LSL         R6,R6,#+6          ;; #+8192
   \   0000002A   ....               LDR         R0,??DataTable12   ;; 0xfffff434
   \   0000002C   0660               STR         R6,[R0, #+0]
    430          
    431          	if (count == 1) {	/* Single block write */
   \   0000002E   012D               CMP         R5,#+1
   \   00000030   0CD1               BNE         ??disk_write_4
    432          		if ((send_cmd(CMD24, sector) == 0)	/* WRITE_BLOCK */
    433          			&& 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
    434          			count = 0;
   \   00000048   0025               MOV         R5,#+0
   \   0000004A   17E0               B           ??disk_write_5
    435          	}
    436          	else {				/* Multiple block write */
    437          		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
    438          			do {
    439          				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
    440          				buff += 512;
   \   00000062   3009               LSR         R0,R6,#+4
   \   00000064   2418               ADD         R4,R4,R0
    441          			} 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
    442          			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
    443          				count = 1;
   \   0000007A   0125               MOV         R5,#+1
    444          		}
    445          	}
    446          
    447          	DESELECT();			/* CS = H */
   \                     ??disk_write_5:
   \   0000007C   ....               LDR         R0,??DataTable13   ;; 0xfffff430
   \   0000007E   0660               STR         R6,[R0, #+0]
    448          	rcvr_spi();			/* Idle (Release DO) */
   \   00000080   FF20               MOV         R0,#+255
   \   00000082   ........           BL          AT91_spi
    449          
    450          	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           ?Subroutine21
    451          }
    452          #endif

   \                                 In segment CODE, align 4, keep-with-next
    453          int mmc_write_page(DWORD block,DWORD page, const BYTE *buff)
    454          /* Write Sector(s) 
    455          
    456          #ifndef _READONLY
    457          extern DRESULT disk_write (
    458          	const BYTE *buff,	// Data to be written 
    459          	DWORD sector,		// Sector number (LBA) 
    460          	BYTE count			// Sector count (1..255) 
    461          )*/
    462          {
   \                     mmc_write_page:
   \   00000000   00B5               PUSH        {LR}
   \   00000002   031C               MOV         R3,R0
   \   00000004   101C               MOV         R0,R2
    463                  DWORD  sector;
    464                  BYTE acd;
    465                  sector=((block<<5)+page);
    466          	acd=disk_write (buff,sector,1);
   \   00000006   0122               MOV         R2,#+1
   \   00000008   5B01               LSL         R3,R3,#+5

⌨️ 快捷键说明

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