📄 mmc.lst
字号:
347 //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
348 while (Read_Byte_MMC() != 0xfe){};
\ ??MMC_Read_Block_3:
\ 0000001E ........ BL Read_Byte_MMC
\ 00000022 FE28 CMP R0,#+0xFE
\ 00000024 FBD1 BNE ??MMC_Read_Block_3
349
350 //Write blocks(normal 512Bytes) to MMC/SD-Card
351 for (i=0;i<Bytes;i++)
\ 00000026 0020 MOV R0,#+0
\ 00000028 051C MOV R5,R0
\ ??MMC_Read_Block_4:
\ 0000002A 0198 LDR R0,[SP, #+0x4]
\ 0000002C 8542 CMP R5,R0
\ 0000002E 05D2 BCS ??MMC_Read_Block_5
352 {
353 *Buffer++ = Read_Byte_MMC();
\ 00000030 ........ BL Read_Byte_MMC
\ 00000034 2070 STRB R0,[R4, #+0]
\ 00000036 641C ADD R4,#+0x1
354 }
\ 00000038 6D1C ADD R5,#+0x1
\ 0000003A F6E7 B ??MMC_Read_Block_4
355
356 //CRC-Byte
357 Read_Byte_MMC();//CRC - Byte
\ ??MMC_Read_Block_5:
\ 0000003C ........ BL Read_Byte_MMC
358 Read_Byte_MMC(); //CRC - Byte
\ 00000040 ........ BL Read_Byte_MMC
359
360 //set MMC_Chip_Select to high (MMC/SD-Card invalid)
361 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,MMC_Chip_Select) ;
\ 00000044 8021 MOV R1,#+0x80
\ 00000046 8901 LSL R1,R1,#+0x6 ;; #+0x2000
\ 00000048 .... LDR R0,??DataTable25 ;; 0xfffff400
\ 0000004A ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
362 return('0');
\ 0000004E 3020 MOV R0,#+0x30
\ ??MMC_Read_Block_2:
\ 00000050 02B0 ADD SP,#+0x8
\ 00000052 F0BC POP {R4-R7}
\ 00000054 02BC POP {R1}
\ 00000056 0847 BX R1 ;; return
363 }
364
365 //****************************************************************************
366 //Routine for reading Blocks(512Byte) from MMC/SD-Card
367 //Return 0 if no Error.
\ In segment CODE, align 4, keep-with-next
368 unsigned char MMC_read_sector(unsigned long addr,unsigned char *Buffer)
369 //****************************************************************************
370 {
\ MMC_read_sector:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
\ 00000006 0D1C MOV R5,R1
371 //Command 16 is reading Blocks from MMC/SD-Card
372 unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; //Command 17 read a single block
\ 00000008 6846 MOV R0,SP
\ 0000000A 1049 LDR R1,??MMC_read_sector_0 ;; `?<Constant {81, 0, 0, 0, 0, 255}>`
\ 0000000C 0A68 LDR R2,[R1, #0]
\ 0000000E 0260 STR R2,[R0, #0]
\ 00000010 4A68 LDR R2,[R1, #+0x4]
\ 00000012 4260 STR R2,[R0, #+0x4]
373 unsigned char temp;
374
375 AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA) ; //clear all interrupt.
\ 00000014 .... LDR R0,??DataTable25 ;; 0xfffff400
\ 00000016 ........ _BLF AT91F_PIO_GetInterruptStatus,AT91F_PIO_GetInterruptStatus??rT
376
377 //Address conversation(logic block address-->byte address)
378 addr = addr << 9; //addr = addr * 512
\ 0000001A 6402 LSL R4,R4,#+0x9
379
380 CMD[1] = ((addr & 0xFF000000) >>24 );
\ 0000001C 6846 MOV R0,SP
\ 0000001E 211C MOV R1,R4
\ 00000020 090E LSR R1,R1,#+0x18
\ 00000022 4170 STRB R1,[R0, #+0x1]
381 CMD[2] = ((addr & 0x00FF0000) >>16 );
\ 00000024 6846 MOV R0,SP
\ 00000026 211C MOV R1,R4
\ 00000028 090C LSR R1,R1,#+0x10
\ 0000002A 8170 STRB R1,[R0, #+0x2]
382 CMD[3] = ((addr & 0x0000FF00) >>8 );
\ 0000002C 6846 MOV R0,SP
\ 0000002E 211C MOV R1,R4
\ 00000030 090A LSR R1,R1,#+0x8
\ 00000032 C170 STRB R1,[R0, #+0x3]
383
384 temp=MMC_Read_Block(CMD,Buffer,512);
\ 00000034 8022 MOV R2,#+0x80
\ 00000036 9200 LSL R2,R2,#+0x2 ;; #+0x200
\ 00000038 291C MOV R1,R5
\ 0000003A 6846 MOV R0,SP
\ 0000003C ........ BL MMC_Read_Block
\ 00000040 061C MOV R6,R0
385
386 return(temp);
\ 00000042 301C MOV R0,R6
\ 00000044 02B0 ADD SP,#+0x8
\ 00000046 70BC POP {R4-R6}
\ 00000048 02BC POP {R1}
\ 0000004A 0847 BX R1 ;; return
\ ??MMC_read_sector_0:
\ 0000004C ........ DC32 `?<Constant {81, 0, 0, 0, 0, 255}>`
387 }
388
389 //***************************************************************************
390 //读 CID Registers from MMC/SD-Card (16Bytes)
391 //错误返回0.
\ In segment CODE, align 4, keep-with-next
392 unsigned char Read_CID_MMC(unsigned char *Buffer)
393 //***************************************************************************
394 {
\ Read_CID_MMC:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
395 //Command for reading CID Registers //Command 10
396 unsigned char CMD[] = {0x4A,0x00,0x00,0x00,0x00,0xFF};
\ 00000006 6846 MOV R0,SP
\ 00000008 0749 LDR R1,??Read_CID_MMC_0 ;; `?<Constant {74, 0, 0, 0, 0, 255}>`
\ 0000000A 0A68 LDR R2,[R1, #0]
\ 0000000C 0260 STR R2,[R0, #0]
\ 0000000E 4A68 LDR R2,[R1, #+0x4]
\ 00000010 4260 STR R2,[R0, #+0x4]
397 unsigned char temp;
398 temp=MMC_Read_Block(CMD,Buffer,16); //read 16 bytes ***CID为128字节的寄存器
\ 00000012 1022 MOV R2,#+0x10
\ 00000014 211C MOV R1,R4
\ 00000016 6846 MOV R0,SP
\ 00000018 ........ BL MMC_Read_Block
\ 0000001C 051C MOV R5,R0
399
400 return(temp);
\ 0000001E 281C MOV R0,R5
\ 00000020 02B0 ADD SP,#+0x8
\ 00000022 30BC POP {R4,R5}
\ 00000024 02BC POP {R1}
\ 00000026 0847 BX R1 ;; return
\ ??Read_CID_MMC_0:
\ 00000028 ........ DC32 `?<Constant {74, 0, 0, 0, 0, 255}>`
401 }
402
403 //***************************************************************************
404 //读 CSD Reg from MMC/SD-Card (16Bytes)
405 //错误返回0.
\ In segment CODE, align 4, keep-with-next
406 unsigned char Read_CSD_MMC(unsigned char *Buffer)
407 //***************************************************************************
408 {
\ Read_CSD_MMC:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
409 //Command for reading CSD Registers
410 unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF}; //Command 9
\ 00000006 6846 MOV R0,SP
\ 00000008 0749 LDR R1,??Read_CSD_MMC_0 ;; `?<Constant {73, 0, 0, 0, 0, 255}>`
\ 0000000A 0A68 LDR R2,[R1, #0]
\ 0000000C 0260 STR R2,[R0, #0]
\ 0000000E 4A68 LDR R2,[R1, #+0x4]
\ 00000010 4260 STR R2,[R0, #+0x4]
411 unsigned char temp;
412 temp=MMC_Read_Block(CMD,Buffer,16); //read 16 bytes CSD长度为512=16*16
\ 00000012 1022 MOV R2,#+0x10
\ 00000014 211C MOV R1,R4
\ 00000016 6846 MOV R0,SP
\ 00000018 ........ BL MMC_Read_Block
\ 0000001C 051C MOV R5,R0
413
414 return(temp);
\ 0000001E 281C MOV R0,R5
\ 00000020 02B0 ADD SP,#+0x8
\ 00000022 30BC POP {R4,R5}
\ 00000024 02BC POP {R1}
\ 00000026 0847 BX R1 ;; return
\ ??Read_CSD_MMC_0:
\ 00000028 ........ DC32 `?<Constant {73, 0, 0, 0, 0, 255}>`
415 }
416
417 //***************************************************************************
418 //返回制: [0]-success or something error!
\ In segment CODE, align 4, keep-with-next
419 unsigned char MMC_Start_Read_Sector(unsigned long sector) //读一个扇区
420 //***************************************************************************
421 {
\ MMC_Start_Read_Sector:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
422 unsigned char retry;
423 //Command 16 is reading Blocks from MMC/SD-Card
424 unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; //command 17 1010001
\ 00000006 6846 MOV R0,SP
\ 00000008 1649 LDR R1,??MMC_Start_Read_Sector_0 ;; `?<Constant {81, 0, 0, 0, 0, 255}>_1`
\ 0000000A 0A68 LDR R2,[R1, #0]
\ 0000000C 0260 STR R2,[R0, #0]
\ 0000000E 4A68 LDR R2,[R1, #+0x4]
\ 00000010 4260 STR R2,[R0, #+0x4]
425 unsigned char temp;
426
427 AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA); //clear all interrupt.
\ 00000012 .... LDR R0,??DataTable25 ;; 0xfffff400
\ 00000014 ........ _BLF AT91F_PIO_GetInter
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -