📄 sdspi.lst
字号:
110 AT91S_SPI *pSpiHw = pSdSpi->pSpiHw;
\ 00000004 003090E5 LDR R3,[R0, #+0]
111
112 // Enable the SPI clock
113 AT91C_BASE_PMC->PMC_PCER = (1 << pSdSpi->spiId);
\ 00000008 01C0A0E3 MOV R12,#+1
\ 0000000C D4E0D0E1 LDRSB LR,[R0, #+4]
\ 00000010 1CCEA0E1 LSL R12,R12,LR
\ 00000014 EFE0E0E3 MVN LR,#+239
\ 00000018 C0EFCEE3 BIC LR,LR,#0x300
\ 0000001C 00C08EE5 STR R12,[LR, #+0]
114
115 //TRACE_DEBUG("CSR[%d]=0x%8X\n\r", cs, csr);
116 pSpiHw->SPI_CSR[cs] = csr;
\ 00000020 01C183E0 ADD R12,R3,R1, LSL #+2
\ 00000024 30208CE5 STR R2,[R12, #+48]
117
118 //jcb to put in sendcommand
119 // Write to the MR register
120 spiMr = pSpiHw->SPI_MR;
\ 00000028 042093E5 LDR R2,[R3, #+4]
121 spiMr |= AT91C_SPI_PCS;
122 spiMr &= ~((1 << cs) << 16);
123 pSpiHw->SPI_MR = spiMr;
\ 0000002C F02A82E3 ORR R2,R2,#0xF0000
\ 00000030 01C0A0E3 MOV R12,#+1
\ 00000034 1C11A0E1 LSL R1,R12,R1
\ 00000038 0118E0E1 MVN R1,R1, LSL #+16
\ 0000003C 021001E0 AND R1,R1,R2
\ 00000040 041083E5 STR R1,[R3, #+4]
124
125 // Disable the SPI clock
126 AT91C_BASE_PMC->PMC_PCDR = (1 << pSdSpi->spiId);
\ 00000044 D400D0E1 LDRSB R0,[R0, #+4]
\ 00000048 1C00A0E1 LSL R0,R12,R0
\ 0000004C 04108EE3 ORR R1,LR,#0x4
\ 00000050 000081E5 STR R0,[R1, #+0]
127 }
\ 00000054 0140BDE8 POP {R0,LR}
\ 00000058 1EFF2FE1 BX LR ;; return
128
129 //------------------------------------------------------------------------------
130 /// Use PDC for SPI data transfer.
131 /// Return 0 if no error, otherwise return error status.
132 /// \param pSdSpi Pointer to a SdSpi instance.
133 /// \param pData Data pointer.
134 /// \param size Data transfer byte count.
135 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
136 unsigned char SDSPI_PDC(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
137 {
138 AT91PS_SPI pSpiHw = pSdSpi->pSpiHw;
\ SDSPI_PDC:
\ 00000000 003090E5 LDR R3,[R0, #+0]
139 unsigned int spiIer;
140
141 if (pSdSpi->semaphore == 0) {
\ 00000004 0CC0D0E5 LDRB R12,[R0, #+12]
\ 00000008 00005CE3 CMP R12,#+0
142 TRACE_DEBUG("No semaphore\n\r");
143 return SDSPI_ERROR_LOCK;
\ 0000000C 0100A003 MOVEQ R0,#+1
\ 00000010 1400000A BEQ ??SDSPI_PDC_0
144 }
145 pSdSpi->semaphore--;
\ 00000014 0CC0D0E5 LDRB R12,[R0, #+12]
\ 00000018 01C04CE2 SUB R12,R12,#+1
\ 0000001C 0CC0C0E5 STRB R12,[R0, #+12]
146
147 // Enable the SPI clock
148 AT91C_BASE_PMC->PMC_PCER = (1 << pSdSpi->spiId);
\ 00000020 01C0A0E3 MOV R12,#+1
\ 00000024 D400D0E1 LDRSB R0,[R0, #+4]
\ 00000028 1C00A0E1 LSL R0,R12,R0
\ 0000002C EFC0E0E3 MVN R12,#+239
\ 00000030 C0CFCCE3 BIC R12,R12,#0x300
\ 00000034 00008CE5 STR R0,[R12, #+0]
149
150 // Disable transmitter and receiver
151 pSpiHw->SPI_PTCR = AT91C_PDC_RXTDIS | AT91C_PDC_TXTDIS;
\ 00000038 0200A0E3 MOV R0,#+2
\ 0000003C 800F80E3 ORR R0,R0,#0x200
\ 00000040 200183E5 STR R0,[R3, #+288]
152
153 // Receive Pointer Register
154 pSpiHw->SPI_RPR = (int)pData;
\ 00000044 001183E5 STR R1,[R3, #+256]
155 // Receive Counter Register
156 pSpiHw->SPI_RCR = size;
\ 00000048 042183E5 STR R2,[R3, #+260]
157 // Transmit Pointer Register
158 pSpiHw->SPI_TPR = (int) pData;
\ 0000004C 081183E5 STR R1,[R3, #+264]
159 // Transmit Counter Register
160 pSpiHw->SPI_TCR = size;
\ 00000050 0C2183E5 STR R2,[R3, #+268]
161
162 spiIer = AT91C_SPI_RXBUFF;
163
164 // Enable transmitter and receiver
165 pSpiHw->SPI_PTCR = AT91C_PDC_RXTEN | AT91C_PDC_TXTEN;
\ 00000054 A000A0E1 MOV R0,R0, LSR #+1
\ 00000058 200183E5 STR R0,[R3, #+288]
166
167 // Interrupt enable shall be done after PDC TXTEN and RXTEN
168 pSpiHw->SPI_IER = spiIer;
\ 0000005C 4000A0E3 MOV R0,#+64
\ 00000060 140083E5 STR R0,[R3, #+20]
169
170 return 0;
\ 00000064 0000A0E3 MOV R0,#+0
\ ??SDSPI_PDC_0:
\ 00000068 1EFF2FE1 BX LR ;; return
171 }
172
173 //! Should be moved to a new file
174 //------------------------------------------------------------------------------
175 /// Read data on SPI data bus;
176 /// Returns 1 if read fails, returns 0 if no error.
177 /// \param pSdSpi Pointer to a SD SPI driver instance.
178 /// \param pData Data pointer.
179 /// \param size Data size.
180 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
181 unsigned char SDSPI_Read(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
182 {
\ SDSPI_Read:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 0050A0E1 MOV R5,R0
\ 00000008 0160A0E1 MOV R6,R1
\ 0000000C 0240A0E1 MOV R4,R2
183 unsigned char error;
184
185 // MOSI should hold high during read, or there will be wrong data in received data.
186 memset(pData, 0xff, size);
\ 00000010 FF10A0E3 MOV R1,#+255
\ 00000014 0600A0E1 MOV R0,R6
\ 00000018 ........ BL memset
187
188 error = SDSPI_PDC(pSdSpi, pData, size);
\ 0000001C 0420A0E1 MOV R2,R4
\ 00000020 0610A0E1 MOV R1,R6
\ 00000024 0500A0E1 MOV R0,R5
\ 00000028 ........ BL SDSPI_PDC
\ 0000002C 0040A0E1 MOV R4,R0
189
190 while(SDSPI_IsBusy(pSdSpi) == 1);
\ ??SDSPI_Read_0:
\ 00000030 0500A0E1 MOV R0,R5
\ 00000034 ........ BL SDSPI_IsBusy
\ 00000038 010050E3 CMP R0,#+1
\ 0000003C FBFFFF0A BEQ ??SDSPI_Read_0
191
192 if( error == 0 ) {
\ 00000040 000054E3 CMP R4,#+0
193 return 0;
\ 00000044 0000A003 MOVEQ R0,#+0
194 }
195 else {
196 TRACE_DEBUG("PB SDSPI_Read\n\r");
197 return 1;
\ 00000048 0100A013 MOVNE R0,#+1
\ 0000004C 7040BDE8 POP {R4-R6,LR}
\ 00000050 1EFF2FE1 BX LR ;; return
198 }
199 }
200
201 //------------------------------------------------------------------------------
202 /// Write data on SPI data bus;
203 /// Returns 1 if write fails, returns 0 if no error.
204 /// \param pSdSpi Pointer to a SD SPI driver instance.
205 /// \param pData Data pointer.
206 /// \param size Data size.
207 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
208 unsigned char SDSPI_Write(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
209 {
\ SDSPI_Write:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
\ 00000004 0040A0E1 MOV R4,R0
210 unsigned char error;
211
212 error = SDSPI_PDC(pSdSpi, pData, size);
\ 00000008 ........ BL SDSPI_PDC
\ 0000000C 0050A0E1 MOV R5,R0
213
214 while(SDSPI_IsBusy(pSdSpi) == 1);
\ ??SDSPI_Write_0:
\ 00000010 0400A0E1 MOV R0,R4
\ 00000014 ........ BL SDSPI_IsBusy
\ 00000018 010050E3 CMP R0,#+1
\ 0000001C FBFFFF0A BEQ ??SDSPI_Write_0
215
216 if( error == 0 ) {
\ 00000020 000055E3 CMP R5,#+0
217 return 0;
\ 00000024 0000A003 MOVEQ R0,#+0
218 }
219 else {
220 TRACE_DEBUG("PB SDSPI_Write\n\r");
221 return 1;
\ 00000028 0100A013 MOVNE R0,#+1
\ 0000002C 3240BDE8 POP {R1,R4,R5,LR}
\ 00000030 1EFF2FE1 BX LR ;; return
222 }
223 }
224
225 //------------------------------------------------------------------------------
226 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
227 unsigned char SDSPI_WaitDataBusy(SdSpi *pSdSpi)
228 {
\ SDSPI_WaitDataBusy:
\ 00000000 00502DE9 PUSH {R12,LR}
229 unsigned char busyData;
230
231 SDSPI_Read(pSdSpi, &busyData, 1);
\ 00000004 0120A0E3 MOV R2,#+1
\ 00000008 0D10A0E1 MOV R1,SP
\ 0000000C ........ BL SDSPI_Read
232
233 if (busyData != 0xff) {
\ 00000010 0000DDE5 LDRB R0,[SP, #+0]
\ 00000014 FF0050E3 CMP R0,#+255
234 return 1;
\ 00000018 0100A013 MOVNE R0,#+1
235 }
236 else {
237 return 0;
\ 0000001C 0000A003 MOVEQ R0,#+0
\ 00000020 0240BDE8 POP {R1,LR}
\ 00000024 1EFF2FE1 BX LR ;; return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -