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

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   0000005C   ....               B           ?Subroutine22
    244          }

   \                                 In segment CODE, align 4, keep-with-next
   \                     ?Subroutine22:
   \   00000000   30BC               POP         {R4,R5}
   \   00000002   02BC               POP         {R1}
   \   00000004   0847               BX          R1                 ;; return
    245          
    246          
    247          
    248          
    249          /*-----------------------------------------------------------------------*/
    250          /* Public Functions                                                      */
    251          
    252          
    253          /*-----------------------*/
    254          /* Initialize Disk Drive */
    255          /* (Platform dependent)  */
    256          
    257          //extern

   \                                 In segment CODE, align 4, keep-with-next
    258          DSTATUS disk_initialize ()
    259          {
   \                     disk_initialize:
   \   00000000   F0B5               PUSH        {R4-R7,LR}
    260          	BYTE n;
    261          
    262          	AT91PS_PMC pPMC      = AT91C_BASE_PMC;
    263          
    264          	POWER_ON();					/* Socket power ON */
    265          	//for (Timer = 3; Timer; );	/* Wait for 30ms */		
    266          	for (int n = 3000; n;n-- );	
    267          	/* MMC socket-switch init */
    268          	// disable internal Pull-Ups if needed
    269          		
    270          	// disable PIO from controlling MOSI, MISO, SCK (=hand over to SPI)
    271          	// keep CS untouched - used as GPIO pin during init
    272          	pPIOA->PIO_PDR = AT91C_PA16_SPI0_MISO | AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK; //  | NCPS_PDR_BIT;
   \   00000002   E020               MOV         R0,#+224
   \   00000004   C002               LSL         R0,R0,#+11         ;; #+458752
   \   00000006   2749               LDR         R1,??disk_initialize_0  ;; 0xfffff404
   \   00000008   0860               STR         R0,[R1, #+0]
    273          	// set pin-functions in PIO Controller
    274          	pPIOA->PIO_ASR = AT91C_PA16_SPI0_MISO | AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK; /// not here: | NCPS_ASR_BIT;
   \   0000000A   2749               LDR         R1,??disk_initialize_0+0x4  ;; 0xfffff470
   \   0000000C   0860               STR         R0,[R1, #+0]
    275          	
    276          	// set chip-select as output high (unselect card)
    277          	pPIOA->PIO_PER  = CARD_SELECT_PIN; // enable GPIO of CS-pin
   \   0000000E   8024               MOV         R4,#+128
   \   00000010   A401               LSL         R4,R4,#+6          ;; #+8192
   \   00000012   2648               LDR         R0,??disk_initialize_0+0x8  ;; 0xfffff400
   \   00000014   0460               STR         R4,[R0, #+0]
    278          	pPIOA->PIO_SODR = CARD_SELECT_PIN; // set high
   \   00000016   ....               LDR         R5,??DataTable13   ;; 0xfffff430
   \   00000018   2C60               STR         R4,[R5, #+0]
    279          	pPIOA->PIO_OER  = CARD_SELECT_PIN; // output enable
   \   0000001A   2548               LDR         R0,??disk_initialize_0+0xC  ;; 0xfffff410
   \   0000001C   0460               STR         R4,[R0, #+0]
    280          	
    281          	// enable peripheral clock for SPI ( PID Bit 5 )
    282          	pPMC->PMC_PCER = ( (DWORD) 1 << AT91C_ID_SPI0 ); // n.b. IDs are just bit-numbers
   \   0000001E   2548               LDR         R0,??disk_initialize_0+0x10  ;; 0xfffffc10
   \   00000020   1021               MOV         R1,#+16
   \   00000022   0160               STR         R1,[R0, #+0]
    283          	
    284          	// SPI enable and reset
    285          	pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST;
   \   00000024   244E               LDR         R6,??disk_initialize_0+0x14  ;; 0xfffe0000
   \   00000026   8120               MOV         R0,#+129
   \   00000028   3060               STR         R0,[R6, #+0]
    286          	
    287          	// SPI mode: master, FDIV=0, fault detection disabled
    288          	pSPI->SPI_MR  = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS ;
   \   0000002A   2448               LDR         R0,??disk_initialize_0+0x18  ;; 0xfffe0004
   \   0000002C   1121               MOV         R1,#+17
   \   0000002E   0160               STR         R1,[R0, #+0]
    289          	
    290          	// set chip-select-register
    291          	// 8 bits per transfer, CPOL=1, ClockPhase=0, DLYBCT = 0
    292          	pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8;
   \   00000030   ....               LDR         R0,??DataTable4    ;; 0xfffe0030
   \   00000032   0121               MOV         R1,#+1
   \   00000034   0160               STR         R1,[R0, #+0]
    293          	
    294          	// slow during init
    295          	AT91_spiSetSpeed(0xFE);
   \   00000036   FE20               MOV         R0,#+254
   \   00000038   ........           BL          AT91_spiSetSpeed
    296          	
    297          	// enable
    298          	pSPI->SPI_CR = AT91C_SPI_SPIEN;
   \   0000003C   0120               MOV         R0,#+1
   \   0000003E   3060               STR         R0,[R6, #+0]
    299                  //AT91F_US_SendFrame(AT91C_BASE_US0,"\nMM Start\n\r",10,0,0);
    300          	Stat |= STA_NOINIT;
   \   00000040   ....               LDR         R6,??DataTable8    ;; Stat
   \   00000042   3078               LDRB        R0,[R6, #+0]
   \   00000044   0121               MOV         R1,#+1
   \   00000046   0143               ORR         R1,R0
   \   00000048   3170               STRB        R1,[R6, #+0]
    301          	if (!(Stat & STA_NODISK)) {
   \   0000004A   3078               LDRB        R0,[R6, #+0]
   \   0000004C   8007               LSL         R0,R0,#+30
   \   0000004E   26D4               BMI         ??disk_initialize_1
    302          		n = 10;						/* Dummy clock */
   \   00000050   0A27               MOV         R7,#+10
    303          		do
    304          			rcvr_spi();
   \                     ??disk_initialize_2:
   \   00000052   FF20               MOV         R0,#+255
   \   00000054   ........           BL          AT91_spi
    305          		while (--n);
   \   00000058   7F1E               SUB         R7,R7,#+1
   \   0000005A   FAD1               BNE         ??disk_initialize_2
    306          
    307          		//AT91F_US_SendFrame(AT91C_BASE_US0,"\nSPI DONE\n\r",10,0,0);
    308          
    309          		SELECT();			/* CS = L */
   \   0000005C   ....               LDR         R0,??DataTable12   ;; 0xfffff434
   \   0000005E   0460               STR         R4,[R0, #+0]
    310          		if (send_cmd(CMD0, 0) == 1) {			/* Enter Idle state */
   \   00000060   0021               MOV         R1,#+0
   \   00000062   4020               MOV         R0,#+64
   \   00000064   ........           BL          send_cmd
   \   00000068   0128               CMP         R0,#+1
   \   0000006A   11D1               BNE         ??disk_initialize_3
    311          			Timer = 100;						/* Wait for card ready in timeout of 1 sec */
   \   0000006C   6420               MOV         R0,#+100
   \   0000006E   7070               STRB        R0,[R6, #+1]
    312          			while (Timer && send_cmd(CMD1, 0));
   \                     ??disk_initialize_4:
   \   00000070   7078               LDRB        R0,[R6, #+1]
   \   00000072   0028               CMP         R0,#+0
   \   00000074   05D0               BEQ         ??disk_initialize_5
   \   00000076   0021               MOV         R1,#+0
   \   00000078   4120               MOV         R0,#+65
   \   0000007A   ........           BL          send_cmd
   \   0000007E   0028               CMP         R0,#+0
   \   00000080   F6D1               BNE         ??disk_initialize_4
    313          			if (Timer) Stat &= ~STA_NOINIT;		/* When device goes ready, clear STA_NOINIT */
   \                     ??disk_initialize_5:
   \   00000082   7078               LDRB        R0,[R6, #+1]
   \   00000084   0028               CMP         R0,#+0
   \   00000086   03D0               BEQ         ??disk_initialize_3
   \   00000088   3078               LDRB        R0,[R6, #+0]
   \   0000008A   FE21               MOV         R1,#+254
   \   0000008C   0140               AND         R1,R0
   \   0000008E   3170               STRB        R1,[R6, #+0]
    314          		}
    315          		
    316          		//AT91F_DBGU_Printk("CMD0 done timer = %i\n", Timer);
    317          		
    318          		DESELECT();			/* CS = H */
   \                     ??disk_initialize_3:
   \   00000090   2C60               STR         R4,[R5, #+0]
    319          		rcvr_spi();			/* Idle (Release DO) */
   \   00000092   FF20               MOV         R0,#+255
   \   00000094   ........           BL          AT91_spi
    320          		
    321          		AT91_spiSetSpeed(SPI_SCBR_MIN);
   \   00000098   0220               MOV         R0,#+2
   \   0000009A   ........           BL          AT91_spiSetSpeed
    322          	}
    323          
    324          	if (Stat & STA_NOINIT)
   \                     ??disk_initialize_1:
   \   0000009E   3078               LDRB        R0,[R6, #+0]
    325          		disk_shutdown();
    326          	return Stat;
   \   000000A0   3078               LDRB        R0,[R6, #+0]
   \   000000A2   ....               B           ?Subroutine23
   \                     ??disk_initialize_0:
   \   000000A4   04F4FFFF           DC32        0xfffff404
   \   000000A8   70F4FFFF           DC32        0xfffff470
   \   000000AC   00F4FFFF           DC32        0xfffff400
   \   000000B0   10F4FFFF           DC32        0xfffff410
   \   000000B4   10FCFFFF           DC32        0xfffffc10
   \   000000B8   0000FEFF           DC32        0xfffe0000
   \   000000BC   0400FEFF           DC32        0xfffe0004
    327          }

   \                                 In segment CODE, align 4, keep-with-next
   \                     ?Subroutine23:
   \   00000000   F0BC               POP         {R4-R7}
   \   00000002   02BC               POP         {R1}
   \   00000004   0847               BX          R1                 ;; return
   \   00000006   C046               NOP         
   \                     ??Subroutine23_0:
   \   00000008   81841E00           DC32        0x1e8481
   \   0000000C   01020000           DC32        0x201
    328          
    329          /*-----------------------*/
    330          /* Shutdown              */
    331          /* (Platform dependent)  */
    332          
    333          #if 0
    334          DSTATUS disk_shutdown ()
    335          {
    336          	SPCR = 0;				/* Disable SPI function */
    337          	DDRB  = 0b11000000;		/* Disable drivers */
    338          	PORTB = 0b10110000;
    339          	POWER_OFF();			/* Socket power OFF */
    340          
    341          	Stat |= STA_NOINIT;
    342          
    343          	return Stat;
    344          }
    345          #endif
    346          

   \                                 In segment CODE, align 4, keep-with-next
    347          DSTATUS disk_shutdown ()
    348          {
    349          	return 0;
   \                     disk_shutdown:
   \   00000000   0020               MOV         R0,#+0
   \   00000002   7047               BX          LR                 ;; return
    350          }
    351          
    352          
    353          /*--------------------*/
    354          /* Return Disk Status */
    355          

   \                                 In segment CODE, align 4, keep-with-next
    356          DSTATUS disk_status ()
    357          {
    358          	return Stat;
   \                     disk_status:
   \   00000000   ....               LDR         R0,??DataTable8    ;; Stat
   \   00000002   0078               LDRB        R0,[R0, #+0]
   \   00000004   7047               BX          LR                 ;; return
    359          }
    360          
    361          
    362          
    363          /*----------------*/
    364          /* Read Sector(s) */
    365          

   \                                 In segment CODE, align 4, keep-with-next
    366          extern DRESULT disk_read (
    367          	BYTE *buff,		/* Data buffer to store read data */
    368          	DWORD sector,		/* Sector number (LBA) */
    369          	BYTE count			/* Sector count (1..255) */
    370          )
    371          {
   \                     disk_read:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0

⌨️ 快捷键说明

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