📄 mmc.lst
字号:
##############################################################################
# #
# IAR ARM ANSI C/C++ Compiler V4.31A/W32 EVALUATION 27/Nov/2007 14:04:54 #
# Copyright 1999-2005 IAR Systems. All rights reserved. #
# #
# Cpu mode = interwork #
# Endian = little #
# Stack alignment = 4 #
# Source file = G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\mmc_sd\mmc.c #
# Command line = G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\mmc_sd\mmc.c -D #
# AT91SAM7X256 -D PULL_UP_USB -D USE_LED -lC #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\FLASH_Debug\List\" -o #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\FLASH_Debug\Obj\" -z9 --debug #
# --cpu_mode thumb --endian little --cpu ARM7TDMI #
# --stack_align 4 --interwork -e --fpu None #
# --dlib_config "C:\Program Files\IAR #
# Systems\Embedded Workbench 4.0 #
# Evaluation\ARM\LIB\dl4tptinl8f.h" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\srcIAR\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\src\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\FILESYSTEM\inc\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\MASSSTORAGE\inc\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\AT91SAM7X256\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\inc\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\mmc_sd\" -I #
# "G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\..\..\COMMON_FS_MS\" -I "C:\Program #
# Files\IAR Systems\Embedded Workbench 4.0 #
# Evaluation\ARM\INC\" #
# List file = G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\FLASH_Debug\List\mmc.lst #
# Object file = G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\AT91SAM7X-Mass #
# Storage\compil\FLASH_Debug\Obj\mmc.r79 #
# #
# #
##############################################################################
G:\AT91_ENERGY\ATMEL_ARM\x256_mmc\mmc_sd\mmc.c
1 /*-----------------------------------------------------------------------*/
2 /* MMC/SDC (in SPI mode) control module 2006 */
3 /*-----------------------------------------------------------------------*/
4
5 #include <stdio.h>
6 #include "Board.h"
7 //#include "mmc.h"
8 #include "dbgu.h"
9 #include "trace.h"
10 #include "string.h"
11
12 #include "mmc.h" //为了 AT91F_ReadMedia() ,AT91F_Flash_Write_Address()能与mmc的参数同步
13
14 #include "po_types.h"
15
16 #define CARD_WP_PIN AT91C_PIO_PA16
17 #define CARD_INS_PIN AT91C_PIO_PA15
18 static AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
19 static AT91PS_SPI pSPI = AT91C_BASE_SPI0;
20
21 #define CARD_SELECT_PIN AT91C_PA13_SPI0_NPCS1
22 #define SPI_CSR_NUM 0
23
24 #define SPI_SCBR_MIN 2
25
26
27 /* MMC/SD command (in SPI) */
28 #define CMD0 (0x40+0) /* GO_IDLE_STATE */
29 #define CMD1 (0x40+1) /* SEND_OP_COND */
30 #define CMD9 (0x40+9) /* SEND_CSD */
31 #define CMD10 (0x40+10) /* SEND_CID */
32 #define CMD12 (0x40+12) /* STOP_TRANSMISSION */
33 #define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */
34 #define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */
35 #define CMD24 (0x40+24) /* WRITE_BLOCK */
36 #define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */
37 #define CMD58 (0x40+58) /* READ_OCR */
38
39
40 /* Control signals (Platform dependent) */
41 #define SELECT() (pPIOA->PIO_CODR = CARD_SELECT_PIN) /* MMC CS = L */
42 #define DESELECT() (pPIOA->PIO_SODR = CARD_SELECT_PIN) /* MMC CS = H */
43
44 #define SOCKWP CARD_WP_PIN /* Write protect switch (PB5) */
45 #define SOCKINS CARD_INS_PIN /* Card detect switch (PB4) */
46
47 // #define POWER_ON() PORTE &= ~0x80 /* Socke power (PE7) */
48 // #define POWER_OFF() PORTE |= 0x80
49
50 #define POWER_ON()
51 #define POWER_OFF()
52
53 static volatile
\ In segment DATA_I, align 1, align-sorted
54 DSTATUS Stat = STA_NOINIT; /* Disk status */
\ Stat:
\ 00000000 DS8 1
\ 00000001 REQUIRE `?<Initializer for Stat>`
\ 00000001 DS8 1
\ 00000002 REQUIRE `?<Initializer for Timer>`
55
56 // AT91: thru systime
57 static volatile
58 BYTE Timer; /* 100Hz decrement timer */
59
60
61
62 /*-----------------------------------------------------------------------*/
63 /* Module Private Functions */
64
65
66 #if 0
67 /*--------------------------------*/
68 /* Transmit a byte to MMC via SPI */
69 /* (Platform dependent) */
70
71 #define xmit_spi(dat) SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF)
72
73 /*---------------------------------*/
74 /* Receive a byte from MMC via SPI */
75 /* (Platform dependent) */
76
77 static
78 BYTE rcvr_spi()
79 {
80 SPDR = 0xFF;
81 loop_until_bit_is_set(SPSR, SPIF);
82 return SPDR;
83 }
84
85 /* Alternative macro to receive data fast */
86 #define rcvr_spi_m(dst) SPDR=0xFF; loop_until_bit_is_set(SPSR,SPIF); *(dst)=SPDR
87
88 #endif
89
90 extern void AT91F_DBGU_Printk( char *buffer) ;
91 extern void AT91F_DBGU_Init(void) ;
92 //********************************************************
93 /*void AT91F_DBGU_Printk( char *buffer)
94 {
95 while(*buffer != '\0') {
96 while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
97 AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, *buffer++);
98 }
99 }
100
101 void AT91F_DBGU_Init(void)
102 {
103
104 }
105 */
106 //*****************************************************
107
\ In segment CODE, align 4, keep-with-next
108 static void AT91_spiSetSpeed(BYTE speed)
109 {
110 DWORD reg;
111
112 if ( speed < SPI_SCBR_MIN ) speed = SPI_SCBR_MIN;
\ AT91_spiSetSpeed:
\ 00000000 0228 CMP R0,#+2
\ 00000002 00D2 BCS ??AT91_spiSetSpeed_0
\ 00000004 0220 MOV R0,#+2
113 if ( speed > 1 ) speed &= 0xFE;
114
115 reg = pSPI->SPI_CSR[SPI_CSR_NUM];
\ ??AT91_spiSetSpeed_0:
\ 00000006 .... LDR R1,??DataTable4 ;; 0xfffe0030
\ 00000008 0A68 LDR R2,[R1, #+0]
116 reg = ( reg & ~(AT91C_SPI_SCBR) ) | ( (DWORD)speed << 8 );
117 pSPI->SPI_CSR[SPI_CSR_NUM] = reg;
\ 0000000A 044B LDR R3,??AT91_spiSetSpeed_1 ;; 0xffff00ff
\ 0000000C 1340 AND R3,R2
\ 0000000E FE22 MOV R2,#+254
\ 00000010 0240 AND R2,R0
\ 00000012 1002 LSL R0,R2,#+8
\ 00000014 1843 ORR R0,R3
\ 00000016 0860 STR R0,[R1, #+0]
118 }
\ 00000018 00B0 ADD SP,#+0
\ 0000001A 7047 BX LR ;; return
\ ??AT91_spiSetSpeed_1:
\ 0000001C FF00FFFF DC32 0xffff00ff
119
\ In segment CODE, align 4, keep-with-next
120 static BYTE AT91_spi(BYTE outgoing)
121 {
\ AT91_spi:
\ 00000000 0649 LDR R1,??AT91_spi_0 ;; 0xfffe0010
122 BYTE incoming;
123
124 while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait
\ ??AT91_spi_1:
\ 00000002 0A68 LDR R2,[R1, #+0]
\ 00000004 9207 LSL R2,R2,#+30
\ 00000006 FCD5 BPL ??AT91_spi_1
125 pSPI->SPI_TDR = (WORD)( outgoing );
\ 00000008 054A LDR R2,??AT91_spi_0+0x4 ;; 0xfffe000c
\ 0000000A 1060 STR R0,[R2, #+0]
126 while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char
\ ??AT91_spi_2:
\ 0000000C 0868 LDR R0,[R1, #+0]
\ 0000000E C007 LSL R0,R0,#+31
\ 00000010 FCD5 BPL ??AT91_spi_2
127 incoming = (BYTE)( pSPI->SPI_RDR );
\ 00000012 0448 LDR R0,??AT91_spi_0+0x8 ;; 0xfffe0008
\ 00000014 0068 LDR R0,[R0, #+0]
\ 00000016 0006 LSL R0,R0,#+24
\ 00000018 000E LSR R0,R0,#+24
128
129 return incoming;
\ 0000001A 7047 BX LR ;; return
\ ??AT91_spi_0:
\ 0000001C 1000FEFF DC32 0xfffe0010
\ 00000020 0C00FEFF DC32 0xfffe000c
\ 00000024 0800FEFF DC32 0xfffe0008
130 }
131
132 /*--------------------------------*/
133 /* Transmit a byte to MMC via SPI */
134 /* (Platform dependent) */
135
136 static
137 void xmit_spi(BYTE dat)
138 {
139 AT91_spi(dat);
140 }
141
142 /*---------------------------------*/
143 /* Receive a byte from MMC via SPI */
144 /* (Platform dependent) */
145
146 static
147 BYTE rcvr_spi(void)
148 {
149 return AT91_spi(0xff);
150 }
151
152 /* Alternative "macro" (not at AT91 so far) to receive data fast */
153 static
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -