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

📄 mmc.lst

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