📄 main.lss
字号:
{
180: e92d4010 stmdb sp!, {r4, lr}
void (*kernelstart)(void);
SystemInit();
184: ebffffda bl f4 <SystemInit>
uart0Init(B9600, UART_8N1, UART_FIFO_OFF); // setup the UART
188: e3a01003 mov r1, #3 ; 0x3
18c: e3a02000 mov r2, #0 ; 0x0
190: e59f00d4 ldr r0, [pc, #212] ; 26c <.text+0x26c>
194: eb0002a7 bl c38 <uart0Init>
PCB_PINSEL2 = 0x0F814924; //Init Extendet Memory
198: e59f20d0 ldr r2, [pc, #208] ; 270 <.text+0x270>
19c: e59f30d0 ldr r3, [pc, #208] ; 274 <.text+0x274>
1a0: e5832014 str r2, [r3, #20]
BCFG1 = 0x2000FFEF;
1a4: e59f20cc ldr r2, [pc, #204] ; 278 <.text+0x278>
1a8: e59f30cc ldr r3, [pc, #204] ; 27c <.text+0x27c>
printf("\n\n\r");
1ac: e59f00cc ldr r0, [pc, #204] ; 280 <.text+0x280>
1b0: e5032ffb str r2, [r3, #-4091]
1b4: eb00030f bl df8 <_printf_P>
printf("*******************************************\n\r");
1b8: e59f00c4 ldr r0, [pc, #196] ; 284 <.text+0x284>
1bc: eb00030d bl df8 <_printf_P>
printf("* *\n\r");
1c0: e59f00c0 ldr r0, [pc, #192] ; 288 <.text+0x288>
1c4: eb00030b bl df8 <_printf_P>
printf("* ARM Linux MMC Boot Loader *\n\r");
1c8: e59f00bc ldr r0, [pc, #188] ; 28c <.text+0x28c>
1cc: eb000309 bl df8 <_printf_P>
printf("* *\n\r");
1d0: e59f00b0 ldr r0, [pc, #176] ; 288 <.text+0x288>
1d4: eb000307 bl df8 <_printf_P>
printf("* Copyright (C) 2005 by Ulrich Radig *\n\r");
1d8: e59f00b0 ldr r0, [pc, #176] ; 290 <.text+0x290>
1dc: eb000305 bl df8 <_printf_P>
printf("* *\n\r");
1e0: e59f00a0 ldr r0, [pc, #160] ; 288 <.text+0x288>
1e4: eb000303 bl df8 <_printf_P>
printf("*******************************************\n\n\r");
1e8: e59f00a4 ldr r0, [pc, #164] ; 294 <.text+0x294>
while (mmc_init() != 0) //setup the MMC Card
{
printf("**MMC/SD - Card not found! **\r");
1ec: eb000301 bl df8 <_printf_P>
1f0: eb0000c5 bl 50c <mmc_init>
1f4: e3500000 cmp r0, #0 ; 0x0
1f8: e59f0098 ldr r0, [pc, #152] ; 298 <.text+0x298>
1fc: 1afffffa bne 1ec <main+0x6c>
}
//Speichern der Cluster Size und Cluster Offset (Anfang Datenbereich)
Cluster_Data_Store();
//Initialisierung der MMC/SD-Karte ENDE!
load_file (FILE1,(int*)KERNEL_START);
200: e59f4094 ldr r4, [pc, #148] ; 29c <.text+0x29c>
204: eb00026a bl bb4 <Cluster_Data_Store>
208: e1a01004 mov r1, r4
20c: e59f008c ldr r0, [pc, #140] ; 2a0 <.text+0x2a0>
210: eb0004cf bl 1554 <load_file>
//verify_file (FILE1,(int*)KERNEL_START);
//load_file (FILE2,(int*)BOOTIMG_ADDR);
printf("\n\n\rLinux wird gestartet!\n\n\r");
214: e59f0088 ldr r0, [pc, #136] ; 2a4 <.text+0x2a4>
218: eb0002f6 bl df8 <_printf_P>
PCB_PINSEL0 = 0x80000005;
21c: e59f1050 ldr r1, [pc, #80] ; 274 <.text+0x274>
220: e3a03116 mov r3, #-2147483643 ; 0x80000005
224: e5813000 str r3, [r1]
PCB_PINSEL2 = 0x0F814924;
BCFG0 = 0x2000FFEF;
228: e59f204c ldr r2, [pc, #76] ; 27c <.text+0x27c>
22c: e59f0044 ldr r0, [pc, #68] ; 278 <.text+0x278>
BCFG1 = 0x2000FFEF;
BCFG2 = 0x0000FFEF;
230: e59fc070 ldr ip, [pc, #112] ; 2a8 <.text+0x2a8>
234: e59f3034 ldr r3, [pc, #52] ; 270 <.text+0x270>
238: e5813014 str r3, [r1, #20]
23c: e5020fff str r0, [r2, #-4095]
240: e5020ffb str r0, [r2, #-4091]
244: e502cff7 str ip, [r2, #-4087]
BCFG3 = 0x0000FFEF;
248: e502cff3 str ip, [r2, #-4083]
VICDefVectAddr = 0x81000018;
24c: e59f2058 ldr r2, [pc, #88] ; 2ac <.text+0x2ac>
250: e3e03000 mvn r3, #0 ; 0x0
254: e5032fcb str r2, [r3, #-4043]
kernelstart = (void (*)(void))KERNEL_START;//KERNEL_START;
(*kernelstart)();
258: e1a0e00f mov lr, pc
25c: e12fff14 bx r4
printf("Never reached this!!");
260: e59f0048 ldr r0, [pc, #72] ; 2b0 <.text+0x2b0>
264: eb0002e3 bl df8 <_printf_P>
268: eafffffe b 268 <main+0xe8>
26c: 00000187 andeq r0, r0, r7, lsl #3
270: 0f814924 svceq 0x00814924
274: e002c000 and ip, r2, r0
278: 2000ffef andcs pc, r0, pc, ror #31
27c: ffe00fff undefined instruction 0xffe00fff
280: 00001aac andeq r1, r0, ip, lsr #21
284: 00001978 andeq r1, r0, r8, ror r9
288: 000019a8 andeq r1, r0, r8, lsr #19
28c: 000019d8 ldreqd r1, [r0], -r8
290: 00001a08 andeq r1, r0, r8, lsl #20
294: 00001a38 andeq r1, r0, r8, lsr sl
298: 00001a68 andeq r1, r0, r8, ror #20
29c: 81008000 tsthi r0, r0
2a0: 00001a88 andeq r1, r0, r8, lsl #21
2a4: 00001a94 muleq r0, r4, sl
2a8: 0000ffef andeq pc, r0, pc, ror #31
2ac: 81000018 tsthi r0, r8, lsl r0
2b0: 00001ab0 streqh r1, [r0], -r0
000002b4 <Read_Byte_MMC>:
//############################################################################
{
unsigned char Byte = 0;
SPI0_SPDR = 0xff;
2b4: e59f3020 ldr r3, [pc, #32] ; 2dc <.text+0x2dc>
2b8: e3a020ff mov r2, #255 ; 0xff
2bc: e5832008 str r2, [r3, #8]
while(!(SPI0_SPSR & (1<<SPIF))){};
2c0: e59f2014 ldr r2, [pc, #20] ; 2dc <.text+0x2dc>
2c4: e5923004 ldr r3, [r2, #4]
2c8: e3130080 tst r3, #128 ; 0x80
2cc: 0afffffb beq 2c0 <Read_Byte_MMC+0xc>
Byte = SPI0_SPDR;
2d0: e5920008 ldr r0, [r2, #8]
2d4: e20000ff and r0, r0, #255 ; 0xff
return (Byte);
}
2d8: e12fff1e bx lr
2dc: e0020000 and r0, r2, r0
000002e0 <Write_Command_MMC>:
2e0: e59f20a0 ldr r2, [pc, #160] ; 388 <.text+0x388>
2e4: e5923000 ldr r3, [r2]
2e8: e92d4010 stmdb sp!, {r4, lr}
2ec: e3833b01 orr r3, r3, #1024 ; 0x400
2f0: e5823000 str r3, [r2]
//############################################################################
//Routine zum Senden eines Bytes zur MMC-Karte
inline void Write_Byte_MMC (unsigned char Byte)
//############################################################################
{
SPI0_SPDR = Byte; //Sendet ein Byte
2f4: e59f3090 ldr r3, [pc, #144] ; 38c <.text+0x38c>
2f8: e3a020ff mov r2, #255 ; 0xff
2fc: e5832008 str r2, [r3, #8]
while(!(SPI0_SPSR & (1<<SPIF))){}; //Wartet bis Byte gesendet wurde
300: e59f3084 ldr r3, [pc, #132] ; 38c <.text+0x38c>
304: e5933004 ldr r3, [r3, #4]
308: e3130080 tst r3, #128 ; 0x80
30c: 0afffffb beq 300 <Write_Command_MMC+0x20>
310: e59f2070 ldr r2, [pc, #112] ; 388 <.text+0x388>
314: e5923000 ldr r3, [r2]
318: e3c33b01 bic r3, r3, #1024 ; 0x400
31c: e5823000 str r3, [r2]
320: e3a01000 mov r1, #0 ; 0x0
324: e4d02001 ldrb r2, [r0], #1
328: e59f305c ldr r3, [pc, #92] ; 38c <.text+0x38c>
32c: e5832008 str r2, [r3, #8]
330: e59f3054 ldr r3, [pc, #84] ; 38c <.text+0x38c>
334: e5933004 ldr r3, [r3, #4]
338: e3130080 tst r3, #128 ; 0x80
33c: 0afffffb beq 330 <Write_Command_MMC+0x50>
340: e2813001 add r3, r1, #1 ; 0x1
344: e20310ff and r1, r3, #255 ; 0xff
348: e3510006 cmp r1, #6 ; 0x6
34c: 0a000008 beq 374 <Write_Command_MMC+0x94>
350: eafffff3 b 324 <Write_Command_MMC+0x44>
354: ebffffd6 bl 2b4 <Read_Byte_MMC>
358: e59f2030 ldr r2, [pc, #48] ; 390 <.text+0x390>
35c: e2843001 add r3, r4, #1 ; 0x1
360: e1a03803 mov r3, r3, lsl #16
364: e1540002 cmp r4, r2
368: e1a04823 mov r4, r3, lsr #16
36c: 08bd8010 ldmeqia sp!, {r4, pc}
370: ea000001 b 37c <Write_Command_MMC+0x9c>
374: ebffffce bl 2b4 <Read_Byte_MMC>
378: e3a04001 mov r4, #1 ; 0x1
37c: e35000ff cmp r0, #255 ; 0xff
380: 0afffff3 beq 354 <Write_Command_MMC+0x74>
384: e8bd8010 ldmia sp!, {r4, pc}
388: e0028000 and r8, r2, r0
38c: e0020000 and r0, r2, r0
390: 000001f5 streqd r0, [r0], -r5
00000394 <Write_Byte_MMC>:
394: e59f3018 ldr r3, [pc, #24] ; 3b4 <.text+0x3b4>
398: e20000ff and r0, r0, #255 ; 0xff
39c: e5830008 str r0, [r3, #8]
3a0: e59f300c ldr r3, [pc, #12] ; 3b4 <.text+0x3b4>
3a4: e5933004 ldr r3, [r3, #4]
3a8: e3130080 tst r3, #128 ; 0x80
3ac: 0afffffb beq 3a0 <Write_Byte_MMC+0xc>
}
3b0: e12fff1e bx lr
3b4: e0020000 and r0, r2, r0
000003b8 <MMC_Read_Block>:
//############################################################################
//Routine zum schreiben eines Blocks(512Byte) auf die MMC/SD-Karte
unsigned char mmc_write_sector (unsigned long addr,unsigned char *Buffer)
//############################################################################
{
unsigned char tmp;
//Commando 24 zum schreiben eines Blocks auf die MMC/SD - Karte
unsigned char CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
addr wird von Blocks zu Bytes umgerechnet danach werden
diese in das Commando eingef黦t*/
//addr = addr << 9; //addr = addr * 512
CMD[1] = ((addr & 0xFF000000) >>24 );
CMD[2] = ((addr & 0x00FF0000) >>16 );
CMD[3] = ((addr & 0x0000FF00) >>8 );
//Sendet Commando CMD24 an MMC/SD-Karte (Write 1 Block/512 Bytes)
tmp = Write_Command_MMC (CMD);
if (tmp != 0)
{
return(tmp);
}
//Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte
for (unsigned char a=0;a<100;a++)
{
Read_Byte_MMC();
}
//Sendet Start Byte an MMC/SD-Karte
Write_Byte_MMC(0xFE);
//Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte
for (unsigned short int a=0;a<512;a++)
{
Write_Byte_MMC(*Buffer++);
}
//CRC-Byte schreiben
Write_Byte_MMC(0xFF); //Schreibt Dummy CRC
Write_Byte_MMC(0xFF); //CRC Code wird nicht benutzt
//Wartet auf MMC/SD-Karte Bussy
while (Read_Byte_MMC() != 0xff){};
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
MMC_Disable();
return(0);
}
//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
void MMC_Read_Block(unsigned char *CMD,unsigned char *Buffer,unsigned short int Bytes)
//############################################################################
{
3b8: e92d4070 stmdb sp!, {r4, r5, r6, lr}
3bc: e1a02802 mov r2, r2, lsl #16
3c0: e1a04001 mov r4, r1
3c4: e1a06822 mov r6, r2, lsr #16
//Sendet Commando CMD an MMC/SD-Karte
if (Write_Command_MMC (CMD) != 0)
3c8: ebffffc4 bl 2e0 <Write_Command_MMC>
3cc: e3500000 cmp r0, #0 ; 0x0
3d0: 18bd8070 ldmneia sp!, {r4, r5, r6, pc}
{
return;
}
//Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
while (Read_Byte_MMC() != 0xfe){};
3d4: ebffffb6 bl 2b4 <Read_Byte_MMC>
3d8: e35000fe cmp r0, #254 ; 0xfe
3dc: 1afffffc bne 3d4 <MMC_Read_Block+0x1c>
3e0: e3a05000 mov r5, #0 ; 0x0
3e4: ea000004 b 3fc <MMC_Read_Block+0x44>
//Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte
for (unsigned short int a=0;a<Bytes;a++)
{
*Buffer++ = Read_Byte_MMC();
3e8: ebffffb1 bl 2b4 <Read_Byte_MMC>
3ec: e2853001 add r3, r5, #1 ; 0x1
3f0: e1a03803 mov r3, r3, lsl #16
3f4: e5440001 strb r0, [r4, #-1]
3f8: e1a05823 mov r5, r3, lsr #16
3fc: e1550006 cmp r5, r6
400: e2844001 add r4, r4, #1 ; 0x1
404: 1afffff7 bne 3e8 <MMC_Read_Block+0x30>
}
//CRC-Byte auslesen
Read_Byte_MMC();//CRC - Byte wird nicht ausgewertet
408: ebffffa9 bl 2b4 <Read_Byte_MMC>
Read_Byte_MMC();//CRC - Byte wird nicht ausgewertet
40c: ebffffa8 bl 2b4 <Read_Byte_MMC>
//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
MMC_Disable();
410: e59f200c ldr r2, [pc, #12] ; 424 <.text+0x424>
414: e5923000 ldr r3, [r2]
418: e3833b01 orr r3, r3, #1024 ; 0x400
41c: e5823000 str r3, [r2]
420: e8bd8070 ldmia sp!, {r4, r5, r6, pc}
424: e0028000 and r8, r2, r0
00000428 <mmc_read_sector>:
return;
}
//############################################################################
//Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
unsigned char mmc_read_sector (unsigned long addr,unsigned char *Buffer)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -