📄 mmc.lst
字号:
\ 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 + -