📄 main.lst
字号:
162
163 // struct Inter is an interface for transmit information from usb or application
164 // to bootloader
165
166 // define a global interface varialble
\ In section .bss, align 4
167 INTERFACE * interface;
\ interface:
\ 00000000 DS8 4
168
169 #define LEADAPP_STATE 1
170 #define STARTAPP_STATE 2
171 #define LOADAPP_STATE 3
172 #define STARTUSB_STATE 4
173 #define LISTEN 5
174
\ In section .data, align 4
175 unsigned char *BootVersion = {"1.0"};
\ BootVersion:
\ 00000000 ........ DC32 `?<Constant "1.0">`
176
177 //My define variable end ******************************************************
178 /// SPI driver instance.
\ In section .bss, align 4
179 static Spid spid;
\ spid:
\ 00000000 DS8 16
180
181 /// AT45 driver instance.
\ In section .bss, align 4
182 static At45 at45;
\ at45:
\ 00000000 DS8 40
183
184 /// Pins used by the application.
\ In section .rodata, align 4
185 static const Pin pins[] = {BOARD_AT45_A_SPI_PINS, BOARD_AT45_A_NPCS_PIN};
\ pins:
\ 00000000 0010000000F4 DC32 4096, 0FFFFF400H
\ FFFF
\ 00000008 02000100 DC8 2, 0, 1, 0
\ 0000000C 0020000000F4 DC32 8192, 0FFFFF400H
\ FFFF
\ 00000014 02000100 DC8 2, 0, 1, 0
\ 00000018 0040000000F4 DC32 16384, 0FFFFF400H
\ FFFF
\ 00000020 02000100 DC8 2, 0, 1, 0
\ 00000024 0008000000F4 DC32 2048, 0FFFFF400H
\ FFFF
\ 0000002C 02000100 DC8 2, 0, 1, 0
186
187 /// Page buffer.
\ In section .bss, align 4
188 static unsigned char pBuffer[2112];
\ pBuffer:
\ 00000000 DS8 2112
189
190 //------------------------------------------------------------------------------
191 // Internal functions
192 //------------------------------------------------------------------------------
193
194 //------------------------------------------------------------------------------
195 /// SPI interrupt handler. Invokes the SPI driver handler to check for pending
196 /// interrupts.
197 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
198 static void ISR_Spi(void)
199 {
\ ISR_Spi:
\ 00000000 01402DE9 PUSH {R0,LR}
200 SPID_Handler(&spid);
\ 00000004 ........ LDR R0,??DataTable69 ;; spid
201 }
\ 00000008 0050BDE8 POP {R12,LR}
\ 0000000C ........ B SPID_Handler ;; tailcall
202
203 //------------------------------------------------------------------------------
204 /// Retrieves and returns the At45 current status, or 0 if an error
205 /// happened.
206 /// \param pAt45 Pointer to a At45 driver instance.
207 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
208 static unsigned char AT45_GetStatus(At45 *pAt45)
209 {
\ AT45_GetStatus:
\ 00000000 13402DE9 PUSH {R0,R1,R4,LR}
\ 00000004 0040B0E1 MOVS R4,R0
210 unsigned char error;
211 unsigned char status;
212
213 // Sanity checks
214 ASSERT(pAt45, "-F- AT45_GetStatus: pAt45 is null\n\r");
\ 00000008 0400001A BNE ??AT45_GetStatus_0
\ 0000000C ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000010 ........ BL printf
\ 00000014 68009FE5 LDR R0,??AT45_GetStatus_1 ;; `?<Constant "-F- AT45_GetStatus: p...">`
\ 00000018 ........ BL printf
\ ??AT45_GetStatus_2:
\ 0000001C FEFFFFEA B ??AT45_GetStatus_2
215
216 // Issue a status register read command
217 error = AT45_SendCommand(pAt45, AT45_STATUS_READ, 1, &status, 1, 0, 0, 0);
\ ??AT45_GetStatus_0:
\ 00000020 0010A0E3 MOV R1,#+0
\ 00000024 0000A0E3 MOV R0,#+0
\ 00000028 03002DE9 PUSH {R0,R1}
\ 0000002C 0100A0E3 MOV R0,#+1
\ 00000030 03002DE9 PUSH {R0,R1}
\ 00000034 10308DE2 ADD R3,SP,#+16
\ 00000038 0020A0E1 MOV R2,R0
\ 0000003C D710A0E3 MOV R1,#+215
\ 00000040 0400A0E1 MOV R0,R4
\ 00000044 ........ BL AT45_SendCommand
\ 00000048 10D08DE2 ADD SP,SP,#+16 ;; stack cleaning
218 ASSERT(!error, "-F- AT45_GetStatus: Failed to issue command.\n\r");
\ 0000004C 000050E3 CMP R0,#+0
\ 00000050 0400000A BEQ ??AT45_GetStatus_3
\ 00000054 ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000058 ........ BL printf
\ 0000005C 24009FE5 LDR R0,??AT45_GetStatus_1+0x4 ;; `?<Constant "-F- AT45_GetStatus: F...">`
\ 00000060 ........ BL printf
\ ??AT45_GetStatus_4:
\ 00000064 FEFFFFEA B ??AT45_GetStatus_4
219
220 // Wait for command to terminate
221 while (AT45_IsBusy(pAt45));
\ ??AT45_GetStatus_3:
\ 00000068 0400A0E1 MOV R0,R4
\ 0000006C ........ BL AT45_IsBusy
\ 00000070 000050E3 CMP R0,#+0
\ 00000074 FBFFFF1A BNE ??AT45_GetStatus_3
222
223 return status;
\ 00000078 0000DDE5 LDRB R0,[SP, #+0]
\ 0000007C 1C40BDE8 POP {R2-R4,LR}
\ 00000080 1EFF2FE1 BX LR ;; return
\ ??AT45_GetStatus_1:
\ 00000084 ........ DC32 `?<Constant "-F- AT45_GetStatus: p...">`
\ 00000088 ........ DC32 `?<Constant "-F- AT45_GetStatus: F...">`
224 }
225
226 //------------------------------------------------------------------------------
227 /// Waits for the At45 to be ready to accept new commands.
228 /// \param pAt45 Pointer to a At45 driver instance.
229 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
230 static void AT45_WaitReady(At45 *pAt45)
231 {
\ AT45_WaitReady:
\ 00000000 10402DE9 PUSH {R4,LR}
\ 00000004 0040B0E1 MOVS R4,R0
232 unsigned char ready = 0;
233
234 // Sanity checks
235 ASSERT(pAt45, "-F- AT45_WaitUntilReady: pAt45 is null\n\r");
\ 00000008 0400001A BNE ??AT45_WaitReady_0
\ 0000000C ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000010 ........ BL printf
\ 00000014 1C009FE5 LDR R0,??AT45_WaitReady_1 ;; `?<Constant "-F- AT45_WaitUntilRea...">`
\ 00000018 ........ BL printf
\ ??AT45_WaitReady_2:
\ 0000001C FEFFFFEA B ??AT45_WaitReady_2
236
237 // Poll device until it is ready
238 while (!ready) {
239
240 ready = AT45_STATUS_READY(AT45_GetStatus(pAt45));
\ ??AT45_WaitReady_0:
\ 00000020 0400A0E1 MOV R0,R4
\ 00000024 ........ BL AT45_GetStatus
\ 00000028 800010E2 ANDS R0,R0,#0x80
241 }
\ 0000002C FBFFFF0A BEQ ??AT45_WaitReady_0
242 }
\ 00000030 1040BDE8 POP {R4,LR}
\ 00000034 1EFF2FE1 BX LR ;; return
\ ??AT45_WaitReady_1:
\ 00000038 ........ DC32 `?<Constant "-F- AT45_WaitUntilRea...">`
243
244 //------------------------------------------------------------------------------
245 /// Reads and returns the JEDEC identifier of a At45.
246 /// \param pAt45 Pointer to a At45 driver instance.
247 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
248 static unsigned int AT45_GetJedecId(At45 *pAt45)
249 {
\ AT45_GetJedecId:
\ 00000000 13402DE9 PUSH {R0,R1,R4,LR}
\ 00000004 0040B0E1 MOVS R4,R0
250 unsigned char error;
251 unsigned int id;
252
253 // Sanity checks
254 ASSERT(pAt45, "-F- AT45_GetJedecId: pAt45 is null\n\r");
\ 00000008 0400001A BNE ??AT45_GetJedecId_0
\ 0000000C ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000010 ........ BL printf
\ 00000014 68009FE5 LDR R0,??AT45_GetJedecId_1 ;; `?<Constant "-F- AT45_GetJedecId: ...">`
\ 00000018 ........ BL printf
\ ??AT45_GetJedecId_2:
\ 0000001C FEFFFFEA B ??AT45_GetJedecId_2
255
256 // Issue a manufacturer and device ID read command
257 error = AT45_SendCommand(pAt45, AT45_ID_READ, 1, (void *) &id, 4, 0, 0, 0);
\ ??AT45_GetJedecId_0:
\ 00000020 0010A0E3 MOV R1,#+0
\ 00000024 0000A0E3 MOV R0,#+0
\ 00000028 03002DE9 PUSH {R0,R1}
\ 0000002C 0400A0E3 MOV R0,#+4
\ 00000030 03002DE9 PUSH {R0,R1}
\ 00000034 10308DE2 ADD R3,SP,#+16
\ 00000038 0120A0E3 MOV R2,#+1
\ 0000003C 9F10A0E3 MOV R1,#+159
\ 00000040 0400A0E1 MOV R0,R4
\ 00000044 ........ BL AT45_SendCommand
\ 00000048 10D08DE2 ADD SP,SP,#+16 ;; stack cleaning
258 ASSERT(!error, "-F- AT45_GetJedecId: Could not issue command.\n\r");
\ 0000004C 000050E3 CMP R0,#+0
\ 00000050 0400000A BEQ ??AT45_GetJedecId_3
\ 00000054 ........ LDR R0,??DataTable12 ;; `?<Constant "-F- ASSERT: ">`
\ 00000058 ........ BL printf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -