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

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -