URL
https://opencores.org/ocsvn/storm_soc/storm_soc/trunk
Subversion Repositories storm_soc
Compare Revisions
- This comparison shows the changes necessary to convert path
/storm_soc
- from Rev 12 to Rev 13
- ↔ Reverse comparison
Rev 12 → Rev 13
/trunk/basic_system/software/bootloader/build/storm_boot_startup_code.lst
0,0 → 1,138
1 # 1 "build/storm_boot_startup_code.S" |
2 # 1 "<built-in>" |
1 .global main // int main(void) |
0 |
0 |
2 |
3 .global _etext // -> .data initial values in ROM |
4 .global _data // -> .data area in RAM |
5 .global _edata // end of .data area |
6 .global __bss_start // -> .bss area in RAM |
7 .global __bss_end__ // end of .bss area |
8 .global _stack // top of stack |
9 |
10 // Stack Sizes |
11 .set UND_STACK_SIZE, 0x00000080 |
12 .set ABT_STACK_SIZE, 0x00000080 |
13 .set FIQ_STACK_SIZE, 0x00000080 |
14 .set IRQ_STACK_SIZE, 0X00000080 |
15 .set SVC_STACK_SIZE, 0x00000080 |
16 |
17 // Standard definitions of Mode bits and Interrupt flags in MSRs |
18 .set MODE_USR, 0x10 // User Mode |
19 .set MODE_FIQ, 0x11 // FIQ Mode |
20 .set MODE_IRQ, 0x12 // IRQ Mode |
21 .set MODE_SVC, 0x13 // Supervisor Mode |
22 .set MODE_ABT, 0x17 // Abort Mode |
23 .set MODE_UND, 0x1B // Undefined Mode |
24 .set MODE_SYS, 0x1F // System Mode |
25 |
26 .equ FIQ_BIT, 0x40 // when FIQ bit is set, FIQ is disabled |
27 .equ IRQ_BIT, 0x80 // when IRQ bit is set, IRQ is disabled |
28 |
29 .text |
30 .code 32 |
31 .align 2 |
32 |
33 .global _boot |
34 .func _boot |
35 _boot: |
36 |
37 // Runtime Interrupt Vectors |
38 // ------------------------------------------------------------------- |
39 Vectors: |
40 0000 EAFFFFFE b _start // reset - _start |
41 0004 EAFFFFFE b . // undefined |
42 0008 EAFFFFFE b . // SWI |
43 000c EAFFFFFE b . // program abort |
44 0010 EAFFFFFE b . // data abort |
45 0014 E1A00000 nop // reserved |
46 0018 EAFFFFFE b . // IRQ |
47 001c EAFFFFFE b . // FIQ |
48 |
50 .endfunc |
51 |
52 |
53 // Setup the operating mode & stack. |
54 // ------------------------------------------------------------------- |
55 .global _start, start, _mainCRTStartup |
56 .func _start |
57 |
58 _start: |
59 start: |
60 _mainCRTStartup: |
61 |
62 // Who am I? Where am I going? |
63 |
64 // - Set stack location for system mode with interrupts disabled |
65 // ------------------------------------------------------------------- |
66 0020 E59F0034 ldr r0,=_stack // Calc stack base |
67 0024 E10F1000 mrs r1,CPSR |
68 0028 E3C1107F bic r1,r1,#0x7F |
69 002c E38110DF orr r1,r1,#MODE_SYS|IRQ_BIT|FIQ_BIT // Change to System Mode |
70 0030 E129F001 msr CPSR,r1 |
71 0034 E1A0D000 mov sp,r0 // Store stack base |
72 |
73 |
74 // Call main program: main(0) |
75 // ------------------------------------------------------------------- |
76 0038 E3A00000 mov r0,#0 // no arguments (argc = 0) |
77 003c E1A01000 mov r1,r0 |
78 0040 E1A02000 mov r2,r0 |
79 0044 E1A0B000 mov fp,r0 // null frame pointer |
80 0048 E1A07000 mov r7,r0 // null frame pointer for thumb |
81 004c E59FA00C ldr r10,=main |
82 0050 E1A0E00F mov lr,pc |
83 0054 E1A0F00A mov pc, r10 // enter main() |
84 |
86 .endfunc |
87 |
88 .global _reset, reset, exit, abort |
89 .func _reset |
90 _reset: |
91 reset: |
92 exit: |
93 abort: |
94 |
95 0058 EAFFFFFE b . // loop until reset |
96 |
98 .endfunc |
99 |
100 005c 00000000 .end |
100 00000000 |
DEFINED SYMBOLS |
*ABS*:00000000 build/storm_boot_startup_code.S |
build/storm_boot_startup_code.S:11 *ABS*:00000080 UND_STACK_SIZE |
build/storm_boot_startup_code.S:12 *ABS*:00000080 ABT_STACK_SIZE |
build/storm_boot_startup_code.S:13 *ABS*:00000080 FIQ_STACK_SIZE |
build/storm_boot_startup_code.S:14 *ABS*:00000080 IRQ_STACK_SIZE |
build/storm_boot_startup_code.S:15 *ABS*:00000080 SVC_STACK_SIZE |
build/storm_boot_startup_code.S:18 *ABS*:00000010 MODE_USR |
build/storm_boot_startup_code.S:19 *ABS*:00000011 MODE_FIQ |
build/storm_boot_startup_code.S:20 *ABS*:00000012 MODE_IRQ |
build/storm_boot_startup_code.S:21 *ABS*:00000013 MODE_SVC |
build/storm_boot_startup_code.S:22 *ABS*:00000017 MODE_ABT |
build/storm_boot_startup_code.S:23 *ABS*:0000001b MODE_UND |
build/storm_boot_startup_code.S:24 *ABS*:0000001f MODE_SYS |
build/storm_boot_startup_code.S:26 *ABS*:00000040 FIQ_BIT |
build/storm_boot_startup_code.S:27 *ABS*:00000080 IRQ_BIT |
build/storm_boot_startup_code.S:30 .text:00000000 $a |
build/storm_boot_startup_code.S:35 .text:00000000 _boot |
build/storm_boot_startup_code.S:39 .text:00000000 Vectors |
build/storm_boot_startup_code.S:58 .text:00000020 _start |
build/storm_boot_startup_code.S:59 .text:00000020 start |
build/storm_boot_startup_code.S:60 .text:00000020 _mainCRTStartup |
build/storm_boot_startup_code.S:90 .text:00000058 _reset |
build/storm_boot_startup_code.S:91 .text:00000058 reset |
build/storm_boot_startup_code.S:92 .text:00000058 exit |
build/storm_boot_startup_code.S:93 .text:00000058 abort |
build/storm_boot_startup_code.S:100 .text:0000005c $d |
|
UNDEFINED SYMBOLS |
main |
_etext |
_data |
_edata |
__bss_start |
__bss_end__ |
_stack |
/trunk/basic_system/software/bootloader/build/storm_boot_startup_code.S
0,0 → 1,100
.global main // int main(void) |
|
.global _etext // -> .data initial values in ROM |
.global _data // -> .data area in RAM |
.global _edata // end of .data area |
.global __bss_start // -> .bss area in RAM |
.global __bss_end__ // end of .bss area |
.global _stack // top of stack |
|
// Stack Sizes |
.set UND_STACK_SIZE, 0x00000080 |
.set ABT_STACK_SIZE, 0x00000080 |
.set FIQ_STACK_SIZE, 0x00000080 |
.set IRQ_STACK_SIZE, 0X00000080 |
.set SVC_STACK_SIZE, 0x00000080 |
|
// Standard definitions of Mode bits and Interrupt flags in MSRs |
.set MODE_USR, 0x10 // User Mode |
.set MODE_FIQ, 0x11 // FIQ Mode |
.set MODE_IRQ, 0x12 // IRQ Mode |
.set MODE_SVC, 0x13 // Supervisor Mode |
.set MODE_ABT, 0x17 // Abort Mode |
.set MODE_UND, 0x1B // Undefined Mode |
.set MODE_SYS, 0x1F // System Mode |
|
.equ FIQ_BIT, 0x40 // when FIQ bit is set, FIQ is disabled |
.equ IRQ_BIT, 0x80 // when IRQ bit is set, IRQ is disabled |
|
.text |
.code 32 |
.align 2 |
|
.global _boot |
.func _boot |
_boot: |
|
// Runtime Interrupt Vectors |
// ------------------------------------------------------------------- |
Vectors: |
b _start // reset - _start |
b . // undefined |
b . // SWI |
b . // program abort |
b . // data abort |
nop // reserved |
b . // IRQ |
b . // FIQ |
|
.size _boot, . - _boot |
.endfunc |
|
|
// Setup the operating mode & stack. |
// ------------------------------------------------------------------- |
.global _start, start, _mainCRTStartup |
.func _start |
|
_start: |
start: |
_mainCRTStartup: |
|
// Who am I? Where am I going? |
|
// - Set stack location for system mode with interrupts disabled |
// ------------------------------------------------------------------- |
ldr r0,=_stack // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_SYS|IRQ_BIT|FIQ_BIT // Change to System Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
|
// Call main program: main(0) |
// ------------------------------------------------------------------- |
mov r0,#0 // no arguments (argc = 0) |
mov r1,r0 |
mov r2,r0 |
mov fp,r0 // null frame pointer |
mov r7,r0 // null frame pointer for thumb |
ldr r10,=main |
mov lr,pc |
mov pc, r10 // enter main() |
|
.size _start, . - _start |
.endfunc |
|
.global _reset, reset, exit, abort |
.func _reset |
_reset: |
reset: |
exit: |
abort: |
|
b . // loop until reset |
|
.size _reset, . - _reset |
.endfunc |
|
.end |
/trunk/basic_system/software/bootloader/build/STORMcore-ROM.ld
0,0 → 1,127
/***********************************************************************/ |
/* */ |
/* ROM.ld: Linker Script File */ |
/* */ |
/***********************************************************************/ |
ENTRY(_boot) |
STACK_SIZE = 0x8000; |
|
/* Memory Definitions */ |
MEMORY |
{ |
ROM (rx) : ORIGIN = 0xFFF00000, LENGTH = 0x00002000 |
RAM (rw) : ORIGIN = 0x00000000, LENGTH = 0x00008000 |
} |
|
/* Section Definitions */ |
SECTIONS |
{ |
/* first section is .text which is used for code */ |
.text : |
{ |
*storm_startup_code.o (.text) /* Startup code */ |
*(.text) /* remaining code */ |
*(.rodata) /* read-only data (constants) */ |
*(.rodata*) |
*(.glue_7) |
*(.glue_7t) |
} > ROM |
|
. = ALIGN(4); |
|
/* .ctors .dtors are used for c++ constructors/destructors */ |
/* added by Martin Thomas 4/2005 based on Anglia Design example */ |
.ctors : |
{ |
PROVIDE(__ctors_start__ = .); |
KEEP(*(SORT(.ctors.*))) |
KEEP(*(.ctors)) |
PROVIDE(__ctors_end__ = .); |
} >ROM |
|
.dtors : |
{ |
PROVIDE(__dtors_start__ = .); |
KEEP(*(SORT(.dtors.*))) |
KEEP(*(.dtors)) |
PROVIDE(__dtors_end__ = .); |
} >ROM |
|
. = ALIGN(4); |
/* mthomas - end */ |
|
|
_etext = . ; |
PROVIDE (etext = .); |
|
/* .data section which is used for initialized data */ |
.data : AT (_etext) |
{ |
_data = .; |
*(.data) |
SORT(CONSTRUCTORS) /* mt 4/2005 */ |
} > RAM |
|
. = ALIGN(4); |
_edata = . ; |
PROVIDE (edata = .); |
|
/* .bss section which is used for uninitialized data */ |
.bss (NOLOAD) : |
{ |
__bss_start = . ; |
__bss_start__ = . ; |
*(.bss) |
*(COMMON) |
. = ALIGN(4); |
} > RAM |
|
. = ALIGN(4); |
__bss_end__ = . ; |
PROVIDE (__bss_end = .); |
|
/* .stack ALIGN(256) : */ |
.stack : |
{ |
. = ALIGN(256); |
. += STACK_SIZE; |
PROVIDE (_stack = .); |
} > RAM |
|
_end = . ; |
PROVIDE (end = .); |
|
/* Stabs debugging sections. */ |
.stab 0 : { *(.stab) } |
.stabstr 0 : { *(.stabstr) } |
.stab.excl 0 : { *(.stab.excl) } |
.stab.exclstr 0 : { *(.stab.exclstr) } |
.stab.index 0 : { *(.stab.index) } |
.stab.indexstr 0 : { *(.stab.indexstr) } |
.comment 0 : { *(.comment) } |
/* DWARF debug sections. |
Symbols in the DWARF debugging sections are relative to the beginning |
of the section so we begin them at 0. */ |
/* DWARF 1 */ |
.debug 0 : { *(.debug) } |
.line 0 : { *(.line) } |
/* GNU DWARF 1 extensions */ |
.debug_srcinfo 0 : { *(.debug_srcinfo) } |
.debug_sfnames 0 : { *(.debug_sfnames) } |
/* DWARF 1.1 and DWARF 2 */ |
.debug_aranges 0 : { *(.debug_aranges) } |
.debug_pubnames 0 : { *(.debug_pubnames) } |
/* DWARF 2 */ |
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } |
.debug_abbrev 0 : { *(.debug_abbrev) } |
.debug_line 0 : { *(.debug_line) } |
.debug_frame 0 : { *(.debug_frame) } |
.debug_str 0 : { *(.debug_str) } |
.debug_loc 0 : { *(.debug_loc) } |
.debug_macinfo 0 : { *(.debug_macinfo) } |
/* SGI/MIPS DWARF 2 extensions */ |
.debug_weaknames 0 : { *(.debug_weaknames) } |
.debug_funcnames 0 : { *(.debug_funcnames) } |
.debug_typenames 0 : { *(.debug_typenames) } |
.debug_varnames 0 : { *(.debug_varnames) } |
} |
/trunk/basic_system/software/bootloader/build/storm_boot_startup_code - Kopie.S
0,0 → 1,178
.global main // int main(void) |
|
.global _etext // -> .data initial values in ROM |
.global _data // -> .data area in RAM |
.global _edata // end of .data area |
.global __bss_start // -> .bss area in RAM |
.global __bss_end__ // end of .bss area |
.global _stack // top of stack |
|
// Stack Sizes |
.set UND_STACK_SIZE, 0x00000080 |
.set ABT_STACK_SIZE, 0x00000080 |
.set FIQ_STACK_SIZE, 0x00000080 |
.set IRQ_STACK_SIZE, 0X00000080 |
.set SVC_STACK_SIZE, 0x00000080 |
|
// Standard definitions of Mode bits and Interrupt flags in MSRs |
.set MODE_USR, 0x10 // User Mode |
.set MODE_FIQ, 0x11 // FIQ Mode |
.set MODE_IRQ, 0x12 // IRQ Mode |
.set MODE_SVC, 0x13 // Supervisor Mode |
.set MODE_ABT, 0x17 // Abort Mode |
.set MODE_UND, 0x1B // Undefined Mode |
.set MODE_SYS, 0x1F // System Mode |
|
.equ FIQ_BIT, 0x40 // when FIQ bit is set, FIQ is disabled |
.equ IRQ_BIT, 0x80 // when IRQ bit is set, IRQ is disabled |
|
.text |
.code 32 |
.align 2 |
|
.global _boot |
.func _boot |
_boot: |
|
// Runtime Interrupt Vectors |
// ------------------------------------------------------------------- |
Vectors: |
b _start // reset - _start |
ldr pc,_undf // undefined - _undf |
ldr pc,_swi // SWI - _swi |
ldr pc,_pabt // program abort - _pabt |
ldr pc,_dabt // data abort - _dabt |
nop // reserved |
ldr pc,[pc,#-0xFF0] // IRQ - read the VIC |
ldr pc,[pc,#-0xFF0] // FIQ - read the VIC |
|
|
// Use this group for development |
_undf: .word __undf // undefined |
_swi: .word __swi // SWI |
_pabt: .word __pabt // program abort |
_dabt: .word __dabt // data abort |
_irq: .word __irq // IRQ |
_fiq: .word __fiq // FIQ |
|
__undf: b . // undefined |
__swi: b . // SWI |
__pabt: b . // program abort |
__dabt: b . // data abort |
__irq: b . // IRQ |
__fiq: b . // FIQ |
|
.size _boot, . - _boot |
.endfunc |
|
|
// Setup the operating mode & stack. |
// ------------------------------------------------------------------- |
.global _start, start, _mainCRTStartup |
.func _start |
|
_start: |
start: |
_mainCRTStartup: |
|
// Who am I? Where am I going? |
|
// Initialize Interrupt System |
// - Set stack location for each mode |
// - Leave in System Mode with Interrupts Disabled |
// ---------------------------------------------------- |
ldr r0,=_stack // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_UND|IRQ_BIT|FIQ_BIT // Change to Undefined Instruction mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
sub r0,r0,#UND_STACK_SIZE // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_ABT|IRQ_BIT|FIQ_BIT // Change to Abort Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
sub r0,r0,#ABT_STACK_SIZE // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_FIQ|IRQ_BIT|FIQ_BIT // Change to FIQ Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
sub r0,r0,#FIQ_STACK_SIZE // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_IRQ|IRQ_BIT|FIQ_BIT // Change to IRQ Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
sub r0,r0,#IRQ_STACK_SIZE // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_SVC|IRQ_BIT|FIQ_BIT // Change to Supervisor Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
sub r0,r0,#SVC_STACK_SIZE // Calc stack base |
mrs r1,CPSR |
bic r1,r1,#0x7F |
orr r1,r1,#MODE_SYS|IRQ_BIT|FIQ_BIT // Change to System Mode |
msr CPSR,r1 |
mov sp,r0 // Store stack base |
|
// Copy initialized data to its execution address in RAM (NOPE!) |
// Directly execute from ROM -> only for bootloader |
// ------------------------------------------------------------------- |
//#ifdef ROM_RUN |
// ldr r1,=_etext // -> ROM data start |
// ldr r2,=_data // -> data start |
// ldr r3,=_edata // -> end of data |
//x01: cmp r2,r3 // check if data to move |
// beq y01 |
// ldrlo r0,[r1],#4 // copy it |
// strlo r0,[r2],#4 |
// blo x01 // loop until done |
//y01: |
//#endif |
|
// Clear .bss (not needed) |
// ---------- |
// mov r0,#0 // get a zero |
// ldr r1,=__bss_start // -> bss start |
// ldr r2,=__bss_end__ // -> bss end |
//x02: cmp r1,r2 // check if data to clear |
// beq y02 |
// strlo r0,[r1],#4 // clear 4 bytes |
// blo x02 // loop until done |
//y02: |
|
// Call main program: main(0) |
// -------------------------- |
mov r0,#0 // no arguments (argc = 0) |
mov r1,r0 |
mov r2,r0 |
mov fp,r0 // null frame pointer |
mov r7,r0 // null frame pointer for thumb |
ldr r10,=main |
mov lr,pc |
mov pc, r10 // enter main() |
|
.size _start, . - _start |
.endfunc |
|
.global _reset, reset, exit, abort |
.func _reset |
_reset: |
reset: |
exit: |
abort: |
|
b . // loop until reset |
|
.size _reset, . - _reset |
.endfunc |
|
.end |
/trunk/basic_system/software/bootloader/storm_extractor.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
trunk/basic_system/software/bootloader/storm_extractor.exe
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/basic_system/software/bootloader/terminal_stuff.txt
===================================================================
--- trunk/basic_system/software/bootloader/terminal_stuff.txt (nonexistent)
+++ trunk/basic_system/software/bootloader/terminal_stuff.txt (revision 13)
@@ -0,0 +1,101 @@
++--------------------------------------------------------------+
+| <<< STORM Core Processor System - By Stephan Nolting >>> |
++--------------------------------------------------------------+
+| Bootloader for STORM SoC Version: 30.04.2012 |
+| Contact: stnolting@googlemail.com |
++--------------------------------------------------------------+
+
+ < Welcome to the STORM SoC bootloader console! >
+ < Select an operation from the menu below or press >
+ < the boot key for immediate application start >
+
+ a - Program core RAM via UART_0
+ b - Core RAM dump
+ c - Boot from I2C EEPROM (i2c0, 0xA0)
+ d - Program I2C EEPROM (i2c0, 0xA0) via UART_0
+ e - Show content of I2C EEPROM (i2c0, 0xA0)
+ r - Restart system
+ x - Jump to application
+
+Select: _
+
+
+
+
+
+ . . ) . . .
+ . * . *
+ . . . *
+ . . * .
+ _|___ * /\ . .
+ . . _|__ |# |. o / \ __ .
+___ | # |_ | # | __|___ | # |__ . | #| _
+ # |____| |#| | |__| # | . | # |# |___| |___|
+ #| # | # #|_|__|_# |# | # # |___|# | |# | # #
+ |# |# | # | # | |# #| #| # | #|__#| #
+_#_|____|____|______|___|__|__#___|_#_|____|______|_#______
+
+ <<< STORM Core Processor System - By Stephan Nolting >>>
+____________________________________________________________
+
+ a - Program core RAM via UART_0
+ b - Core RAM dump
+ c - Boot from I2C EEPROM (i2c0, 0xA0)
+ d - Program I2C EEPROM (i2c0, 0xA0) via UART_0
+ e - Show content of I2C EEPROM (i2c0, 0xA0)
+ r - Restart system
+ x - Jump to application
+____________________________________________________________
+
+Select: _
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ . . ) . .
+ . * . *
+ . . .
+ . . * .
+ * /\ .
+ . _|__ . . o / \
+ __ | # |_ __|___ | # |__ .
+ # |____| |#| . __| # | | # |# |___
+ #| # | # #|_|_ |# | # # |___|# | |#
+ |# |# | #| | |# #| #| # | #|__#
+ #_|____|____|___|______|__|__#___|_#_|____|______
+ /'\
+ / ' \
+ / ' \
+ / | \
+ \|/ / \
+ / | \
+ / | \ +---------+
+ / \ | HANOVER |
+ / | \ +---------+
+ / | \ 8
+ / \ 8
+ / | \ 8
+ / | \ .~8~..
+ / | \
+ / \ \|/
+ / | \
+ / | \
+ / | \
+
+
+
+
+
Index: trunk/basic_system/software/bootloader/main.map
===================================================================
--- trunk/basic_system/software/bootloader/main.map (nonexistent)
+++ trunk/basic_system/software/bootloader/main.map (revision 13)
@@ -0,0 +1,264 @@
+
+Memory Configuration
+
+Name Origin Length Attributes
+ROM 0xfff00000 0x00002000 xr
+RAM 0x00000000 0x00008000 rw
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+LOAD build/storm_boot_startup_code.o
+LOAD main.o
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib/be\libc.a
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib/be\libm.a
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib/be\libc.a
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/be\libgcc.a
+START GROUP
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/be\libgcc.a
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib/be\libg.a
+LOAD c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/lib/be\libc.a
+END GROUP
+ 0x00008000 STACK_SIZE = 0x8000
+
+.text 0xfff00000 0x1cd8
+ *storm_startup_code.o(.text)
+ *(.text)
+ .text 0xfff00000 0x64 build/storm_boot_startup_code.o
+ 0xfff00058 reset
+ 0xfff00000 _boot
+ 0xfff00020 _mainCRTStartup
+ 0xfff00058 abort
+ 0xfff00020 _start
+ 0xfff00058 _reset
+ 0xfff00058 exit
+ 0xfff00020 start
+ .text 0xfff00064 0xfe0 main.o
+ 0xfff00274 io_spi0_disable
+ 0xfff00088 io_set_gpio0_pin
+ 0xfff000c8 io_toggle_gpio0_pin
+ 0xfff000e4 io_set_gpio0_port
+ 0xfff004e8 set_cmsr
+ 0xfff000a4 io_clr_gpio0_pin
+ 0xfff00298 io_i2c0_speed
+ 0xfff00214 io_spi0_speed
+ 0xfff00550 uart0_scanf
+ 0xfff00258 io_spi0_enable
+ 0xfff00220 io_spi0_trans
+ 0xfff002c4 io_i2c0_byte_transfer
+ 0xfff0048c set_syscpreg
+ 0xfff005a0 uart0_print_buffer
+ 0xfff00518 uart0_printf
+ 0xfff004e0 get_cmsr
+ 0xfff00634 hex_string_to_long
+ 0xfff00700 main
+ 0xfff005c4 long_to_hex_string
+ 0xfff000f0 io_set_pwm
+ 0xfff00504 io_disable_irq
+ 0xfff006d8 delay
+ 0xfff003f4 get_syscpreg
+ 0xfff001bc io_uart0_read_byte
+ 0xfff001f0 io_spi0_config
+ 0xfff001d4 io_uart0_send_byte
+ 0xfff006ac qbytes_to_long
+ 0xfff00064 io_read_gpio0_pin
+ 0xfff004f0 io_enable_irq
+ 0xfff0007c io_read_gpio0_port
+ 0xfff0016c io_get_pwm
+ *(.rodata)
+ *(.rodata*)
+ .rodata.str1.4
+ 0xfff01044 0xc94 main.o
+ 0xca0 (size before relaxing)
+ *(.glue_7)
+ .glue_7 0xfff01cd8 0x0 build/storm_boot_startup_code.o
+ .glue_7 0xfff01cd8 0x0 main.o
+ *(.glue_7t)
+ .glue_7t 0xfff01cd8 0x0 build/storm_boot_startup_code.o
+ .glue_7t 0xfff01cd8 0x0 main.o
+ 0xfff01cd8 . = ALIGN (0x4)
+
+.ctors 0xfff01cd8 0x0
+ 0xfff01cd8 PROVIDE (__ctors_start__, .)
+ *(SORT(.ctors.*))
+ *(.ctors)
+ 0xfff01cd8 PROVIDE (__ctors_end__, .)
+
+.dtors 0xfff01cd8 0x0
+ 0xfff01cd8 PROVIDE (__dtors_start__, .)
+ *(SORT(.dtors.*))
+ *(.dtors)
+ 0xfff01cd8 PROVIDE (__dtors_end__, .)
+ 0xfff01cd8 . = ALIGN (0x4)
+ 0xfff01cd8 _etext = .
+ 0xfff01cd8 PROVIDE (etext, .)
+
+.data 0x00000000 0x0 load address 0xfff01cd8
+ 0x00000000 _data = .
+ *(.data)
+ .data 0x00000000 0x0 build/storm_boot_startup_code.o
+ .data 0x00000000 0x0 main.o
+ 0x00000000 . = ALIGN (0x4)
+ 0x00000000 _edata = .
+ 0x00000000 PROVIDE (edata, .)
+
+.bss 0x00000000 0x0
+ 0x00000000 __bss_start = .
+ 0x00000000 __bss_start__ = .
+ *(.bss)
+ .bss 0x00000000 0x0 build/storm_boot_startup_code.o
+ .bss 0x00000000 0x0 main.o
+ *(COMMON)
+ 0x00000000 . = ALIGN (0x4)
+ 0x00000000 . = ALIGN (0x4)
+ 0x00000000 __bss_end__ = .
+ 0x00000000 PROVIDE (__bss_end, .)
+
+.stack 0x00000000 0x8000
+ 0x00000000 . = ALIGN (0x100)
+ 0x00008000 . = (. + STACK_SIZE)
+ *fill* 0x00000000 0x8000 00
+ 0x00008000 PROVIDE (_stack, .)
+ 0x00008000 _end = .
+ 0x00008000 PROVIDE (end, .)
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+
+.stab.excl
+ *(.stab.excl)
+
+.stab.exclstr
+ *(.stab.exclstr)
+
+.stab.index
+ *(.stab.index)
+
+.stab.indexstr
+ *(.stab.indexstr)
+
+.comment 0x00000000 0x1b
+ *(.comment)
+ .comment 0x00000000 0x1b main.o
+
+.debug
+ *(.debug)
+
+.line
+ *(.line)
+
+.debug_srcinfo
+ *(.debug_srcinfo)
+
+.debug_sfnames
+ *(.debug_sfnames)
+
+.debug_aranges 0x00000000 0x40
+ *(.debug_aranges)
+ .debug_aranges
+ 0x00000000 0x20 build/storm_boot_startup_code.o
+ .debug_aranges
+ 0x00000020 0x20 main.o
+
+.debug_pubnames
+ 0x00000000 0x25a
+ *(.debug_pubnames)
+ .debug_pubnames
+ 0x00000000 0x25a main.o
+
+.debug_info 0x00000000 0x7cc
+ *(.debug_info .gnu.linkonce.wi.*)
+ .debug_info 0x00000000 0x83 build/storm_boot_startup_code.o
+ .debug_info 0x00000083 0x749 main.o
+
+.debug_abbrev 0x00000000 0x1db
+ *(.debug_abbrev)
+ .debug_abbrev 0x00000000 0x14 build/storm_boot_startup_code.o
+ .debug_abbrev 0x00000014 0x1c7 main.o
+
+.debug_line 0x00000000 0x354
+ *(.debug_line)
+ .debug_line 0x00000000 0x69 build/storm_boot_startup_code.o
+ .debug_line 0x00000069 0x2eb main.o
+
+.debug_frame 0x00000000 0x268
+ *(.debug_frame)
+ .debug_frame 0x00000000 0x268 main.o
+
+.debug_str 0x00000000 0x335
+ *(.debug_str)
+ .debug_str 0x00000000 0x335 main.o
+ 0x35d (size before relaxing)
+
+.debug_loc 0x00000000 0x928
+ *(.debug_loc)
+ .debug_loc 0x00000000 0x928 main.o
+
+.debug_macinfo
+ *(.debug_macinfo)
+
+.debug_weaknames
+ *(.debug_weaknames)
+
+.debug_funcnames
+ *(.debug_funcnames)
+
+.debug_typenames
+ *(.debug_typenames)
+
+.debug_varnames
+ *(.debug_varnames)
+OUTPUT(main.elf elf32-bigarm)
+
+Cross Reference Table
+
+Symbol File
+__bss_end__ build/storm_boot_startup_code.o
+__bss_start build/storm_boot_startup_code.o
+_boot build/storm_boot_startup_code.o
+_data build/storm_boot_startup_code.o
+_edata build/storm_boot_startup_code.o
+_etext build/storm_boot_startup_code.o
+_mainCRTStartup build/storm_boot_startup_code.o
+_reset build/storm_boot_startup_code.o
+_stack build/storm_boot_startup_code.o
+_start build/storm_boot_startup_code.o
+abort build/storm_boot_startup_code.o
+delay main.o
+exit build/storm_boot_startup_code.o
+get_cmsr main.o
+get_syscpreg main.o
+hex_string_to_long main.o
+io_clr_gpio0_pin main.o
+io_disable_irq main.o
+io_enable_irq main.o
+io_get_pwm main.o
+io_i2c0_byte_transfer main.o
+io_i2c0_speed main.o
+io_read_gpio0_pin main.o
+io_read_gpio0_port main.o
+io_set_gpio0_pin main.o
+io_set_gpio0_port main.o
+io_set_pwm main.o
+io_spi0_config main.o
+io_spi0_disable main.o
+io_spi0_enable main.o
+io_spi0_speed main.o
+io_spi0_trans main.o
+io_toggle_gpio0_pin main.o
+io_uart0_read_byte main.o
+io_uart0_send_byte main.o
+long_to_hex_string main.o
+main main.o
+ build/storm_boot_startup_code.o
+qbytes_to_long main.o
+reset build/storm_boot_startup_code.o
+set_cmsr main.o
+set_syscpreg main.o
+start build/storm_boot_startup_code.o
+uart0_print_buffer main.o
+uart0_printf main.o
+uart0_scanf main.o
Index: trunk/basic_system/software/bootloader/storm_program.bin
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/basic_system/software/bootloader/storm_program.bin
===================================================================
--- trunk/basic_system/software/bootloader/storm_program.bin (nonexistent)
+++ trunk/basic_system/software/bootloader/storm_program.bin (revision 13)
trunk/basic_system/software/bootloader/storm_program.bin
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/basic_system/software/bootloader/main.lss
===================================================================
--- trunk/basic_system/software/bootloader/main.lss (nonexistent)
+++ trunk/basic_system/software/bootloader/main.lss (revision 13)
@@ -0,0 +1,2821 @@
+
+main.elf: file format elf32-bigarm
+
+Sections:
+Idx Name Size VMA LMA File off Algn
+ 0 .text 00001cd8 fff00000 fff00000 00008000 2**2
+ CONTENTS, ALLOC, LOAD, READONLY, CODE
+ 1 .stack 00008000 00000000 00000000 00000074 2**0
+ ALLOC
+ 2 .comment 0000001b 00000000 00000000 00009cd8 2**0
+ CONTENTS, READONLY
+ 3 .debug_aranges 00000040 00000000 00000000 00009cf8 2**3
+ CONTENTS, READONLY, DEBUGGING
+ 4 .debug_pubnames 0000025a 00000000 00000000 00009d38 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 5 .debug_info 000007cc 00000000 00000000 00009f92 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 6 .debug_abbrev 000001db 00000000 00000000 0000a75e 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 7 .debug_line 00000354 00000000 00000000 0000a939 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 8 .debug_frame 00000268 00000000 00000000 0000ac90 2**2
+ CONTENTS, READONLY, DEBUGGING
+ 9 .debug_str 00000335 00000000 00000000 0000aef8 2**0
+ CONTENTS, READONLY, DEBUGGING
+ 10 .debug_loc 00000928 00000000 00000000 0000b22d 2**0
+ CONTENTS, READONLY, DEBUGGING
+Disassembly of section .text:
+
+fff00000 <_boot>:
+
+// Runtime Interrupt Vectors
+// -------------------------------------------------------------------
+Vectors:
+ b _start // reset - _start
+fff00000: ea000006 b fff00020 <_mainCRTStartup>
+ b . // undefined
+fff00004: eafffffe b fff00004 <_boot+0x4>
+ b . // SWI
+fff00008: eafffffe b fff00008 <_boot+0x8>
+ b . // program abort
+fff0000c: eafffffe b fff0000c <_boot+0xc>
+ b . // data abort
+fff00010: eafffffe b fff00010 <_boot+0x10>
+ nop // reserved
+fff00014: e1a00000 nop (mov r0,r0)
+ b . // IRQ
+fff00018: eafffffe b fff00018 <_boot+0x18>
+ b . // FIQ
+fff0001c: eafffffe b fff0001c <_boot+0x1c>
+
+fff00020 <_mainCRTStartup>:
+
+ .size _boot, . - _boot
+ .endfunc
+
+
+// Setup the operating mode & stack.
+// -------------------------------------------------------------------
+ .global _start, start, _mainCRTStartup
+ .func _start
+
+_start:
+start:
+_mainCRTStartup:
+
+// Who am I? Where am I going?
+
+// - Set stack location for system mode with interrupts disabled
+// -------------------------------------------------------------------
+ ldr r0,=_stack // Calc stack base
+fff00020: e59f0034 ldr r0, [pc, #52] ; fff0005c <.text+0x5c>
+ mrs r1,CPSR
+fff00024: e10f1000 mrs r1, CPSR
+ bic r1,r1,#0x7F
+fff00028: e3c1107f bic r1, r1, #127 ; 0x7f
+ orr r1,r1,#MODE_SYS|IRQ_BIT|FIQ_BIT // Change to System Mode
+fff0002c: e38110df orr r1, r1, #223 ; 0xdf
+ msr CPSR,r1
+fff00030: e129f001 msr CPSR_fc, r1
+ mov sp,r0 // Store stack base
+fff00034: e1a0d000 mov sp, r0
+
+
+// Call main program: main(0)
+// -------------------------------------------------------------------
+ mov r0,#0 // no arguments (argc = 0)
+fff00038: e3a00000 mov r0, #0 ; 0x0
+ mov r1,r0
+fff0003c: e1a01000 mov r1, r0
+ mov r2,r0
+fff00040: e1a02000 mov r2, r0
+ mov fp,r0 // null frame pointer
+fff00044: e1a0b000 mov fp, r0
+ mov r7,r0 // null frame pointer for thumb
+fff00048: e1a07000 mov r7, r0
+ ldr r10,=main
+fff0004c: e59fa00c ldr sl, [pc, #12] ; fff00060 <.text+0x60>
+ mov lr,pc
+fff00050: e1a0e00f mov lr, pc
+ mov pc, r10 // enter main()
+fff00054: e1a0f00a mov pc, sl
+
+fff00058 <_reset>:
+
+ .size _start, . - _start
+ .endfunc
+
+ .global _reset, reset, exit, abort
+ .func _reset
+_reset:
+reset:
+exit:
+abort:
+
+ b . // loop until reset
+fff00058: eafffffe b fff00058 <_reset>
+fff0005c: 00008000 andeq r8, r0, r0
+fff00060: fff00700 undefined instruction 0xfff00700
+
+fff00064 :
+// Read general purpose IO port
+ unsigned long io_read_gpio0_pin(unsigned char pin)
+// ******************************************************************************
+{
+ unsigned long temp = GPIO0_IN & (1<:
+
+// ******************************************************************************
+// Read general purpose IO port
+ unsigned long io_read_gpio0_port(void)
+// ******************************************************************************
+{
+ return GPIO0_IN;
+fff0007c: e3e03a0f mvn r3, #61440 ; 0xf000
+fff00080: e5130ffb ldr r0, [r3, #-4091]
+}
+fff00084: e1a0f00e mov pc, lr
+
+fff00088 :
+
+// ******************************************************************************
+// Set general purpose IO port
+ void io_set_gpio0_pin(unsigned char pin)
+// ******************************************************************************
+{
+ GPIO0_OUT = GPIO0_OUT | (1<:
+
+// ******************************************************************************
+// Clear general purpose IO port
+ void io_clr_gpio0_pin(unsigned char pin)
+// ******************************************************************************
+{
+fff000a4: e20000ff and r0, r0, #255 ; 0xff
+ GPIO0_OUT = GPIO0_OUT & ~(1<:
+// ******************************************************************************
+// Set general purpose IO port
+ void io_toggle_gpio0_pin(unsigned char pin)
+// ******************************************************************************
+{
+ GPIO0_OUT = GPIO0_OUT ^ (1<:
+
+// ******************************************************************************
+// Clear general purpose IO port
+ void io_set_gpio0_port(unsigned long value)
+// ******************************************************************************
+{
+ GPIO0_OUT = value;
+fff000e4: e3e03a0f mvn r3, #61440 ; 0xf000
+fff000e8: e5030fff str r0, [r3, #-4095]
+}
+fff000ec: e1a0f00e mov pc, lr
+
+fff000f0 :
+
+
+
+// ###########################################################################################################################
+// Pulse-Width-Modulation Controller
+// ###########################################################################################################################
+
+// ******************************************************************************
+// Set pwm value
+ void io_set_pwm(unsigned char port, unsigned char data)
+// ******************************************************************************
+{
+fff000f0: e20000ff and r0, r0, #255 ; 0xff
+ unsigned long temp = 0;
+
+ // value adjustment
+ if(port > 7)
+fff000f4: e3500007 cmp r0, #7 ; 0x7
+fff000f8: e92d4010 stmdb sp!, {r4, lr}
+fff000fc: e3a0c000 mov ip, #0 ; 0x0
+fff00100: e3e0e0ff mvn lr, #255 ; 0xff
+fff00104: e20110ff and r1, r1, #255 ; 0xff
+fff00108: 8a000011 bhi fff00154
+ port = 0;
+
+ if(port < 4){
+ temp = PWM0_CONF0; // get working copy
+ temp = temp & ~(0xFF << (port*8)); // clear old value
+ temp = temp | (unsigned long)(data << (port*8)); // insert new value
+ PWM0_CONF0 = temp;
+ }
+ else{
+ port = port-4;
+ temp = PWM0_CONF1; // get working copy
+ temp = temp & ~(0xFF << (port*8)); // clear old value
+fff0010c: e2403004 sub r3, r0, #4 ; 0x4
+fff00110: e20330ff and r3, r3, #255 ; 0xff
+fff00114: e3500003 cmp r0, #3 ; 0x3
+fff00118: e1a0e183 mov lr, r3, lsl #3
+fff0011c: e3e04a0f mvn r4, #61440 ; 0xf000
+fff00120: e1a0c180 mov ip, r0, lsl #3
+fff00124: 9a000007 bls fff00148
+fff00128: e3a030ff mov r3, #255 ; 0xff
+fff0012c: e1a03e13 mov r3, r3, lsl lr
+fff00130: e5142f8b ldr r2, [r4, #-3979]
+fff00134: e1e03003 mvn r3, r3
+fff00138: e0022003 and r2, r2, r3
+ temp = temp | (unsigned long)(data << (port*8)); // insert new value
+fff0013c: e1822e11 orr r2, r2, r1, lsl lr
+ PWM0_CONF1 = temp;
+fff00140: e5042f8b str r2, [r4, #-3979]
+fff00144: e8bd8010 ldmia sp!, {r4, pc}
+fff00148: e3a030ff mov r3, #255 ; 0xff
+fff0014c: e1a03c13 mov r3, r3, lsl ip
+fff00150: e1e0e003 mvn lr, r3
+fff00154: e3e02a0f mvn r2, #61440 ; 0xf000
+fff00158: e5123f8f ldr r3, [r2, #-3983]
+fff0015c: e003300e and r3, r3, lr
+fff00160: e1833c11 orr r3, r3, r1, lsl ip
+fff00164: e5023f8f str r3, [r2, #-3983]
+fff00168: e8bd8010 ldmia sp!, {r4, pc}
+
+fff0016c :
+ }
+}
+
+// ******************************************************************************
+// Set pwm value
+ unsigned char io_get_pwm(unsigned char port)
+// ******************************************************************************
+{
+fff0016c: e20000ff and r0, r0, #255 ; 0xff
+ unsigned long temp = 0;
+
+ // value adjustment
+ if(port > 7)
+fff00170: e3500007 cmp r0, #7 ; 0x7
+fff00174: e3a02000 mov r2, #0 ; 0x0
+fff00178: 8a00000a bhi fff001a8
+ port = 0;
+
+ if(port < 4)
+ temp = PWM0_CONF0; // get config register
+ else{
+ port = port-4;
+ temp = PWM0_CONF1; // get config register
+fff0017c: e2403004 sub r3, r0, #4 ; 0x4
+fff00180: e3500003 cmp r0, #3 ; 0x3
+fff00184: e20320ff and r2, r3, #255 ; 0xff
+fff00188: 9a000005 bls fff001a4
+fff0018c: e3e03a0f mvn r3, #61440 ; 0xf000
+fff00190: e5130f8b ldr r0, [r3, #-3979]
+fff00194: e1a02182 mov r2, r2, lsl #3
+fff00198: e1a00230 mov r0, r0, lsr r2
+fff0019c: e20000ff and r0, r0, #255 ; 0xff
+ }
+
+ temp = temp >> (port*8); // only keep designated byte
+
+ return (unsigned char)temp;
+}
+fff001a0: e1a0f00e mov pc, lr
+fff001a4: e1a02180 mov r2, r0, lsl #3
+fff001a8: e3e03a0f mvn r3, #61440 ; 0xf000
+fff001ac: e5130f8f ldr r0, [r3, #-3983]
+fff001b0: e1a00230 mov r0, r0, lsr r2
+fff001b4: e20000ff and r0, r0, #255 ; 0xff
+fff001b8: e1a0f00e mov pc, lr
+
+fff001bc :
+
+
+
+// ###########################################################################################################################
+// General Purpose UART "miniUART" (UART_0)
+// ###########################################################################################################################
+
+// ******************************************************************************
+// Read one byte via UART 0
+ int io_uart0_read_byte(void)
+// ******************************************************************************
+{
+ if ((UART0_SREG & (1<:
+
+// ******************************************************************************
+// Write one byte via UART 0
+ int io_uart0_send_byte(int ch)
+// ******************************************************************************
+{
+fff001d4: e3e02a0f mvn r2, #61440 ; 0xf000
+ while((UART0_SREG & (1<
+ UART0_DATA = (ch & 0x000000FF);
+fff001e4: e20030ff and r3, r0, #255 ; 0xff
+fff001e8: e5023fe7 str r3, [r2, #-4071]
+ return ch;
+}
+fff001ec: e1a0f00e mov pc, lr
+
+fff001f0 :
+
+
+
+// ###########################################################################################################################
+// Serial Peripherial Interface (SPI_CONTROLLER_0)
+// ###########################################################################################################################
+
+// ******************************************************************************
+// Configure SPI 0
+ void io_spi0_config(unsigned char auto_cs, unsigned long data_size)
+// ******************************************************************************
+{
+fff001f0: e20000ff and r0, r0, #255 ; 0xff
+ // devices update their serial input on a rising edge of sclk,
+ // so we need to update the mosi output of the core before
+ // -> at the falling edge of sclk = set SPI_TX_NEG
+ if(auto_cs == 1)
+fff001f4: e3500001 cmp r0, #1 ; 0x1
+ SPI0_CONF = (1<:
+}
+
+// ******************************************************************************
+// Configure SPI 0 CLK frequency -> (sys_clk/(spi_clk*2))-1
+ void io_spi0_speed(unsigned long clk_divider)
+// ******************************************************************************
+{
+ SPI0_PRSC = clk_divider; // (sys_clk/(spi_clk*2))-1;
+fff00214: e3e03a0f mvn r3, #61440 ; 0xf000
+fff00218: e5030fcb str r0, [r3, #-4043]
+}
+fff0021c: e1a0f00e mov pc, lr
+
+fff00220 :
+
+// ******************************************************************************
+// Sends/receives max 32 bits via SPI, CS and config must be done outside
+ unsigned long io_spi0_trans(unsigned long data)
+// ******************************************************************************
+{
+fff00220: e3e02a0f mvn r2, #61440 ; 0xf000
+ // spi transmission
+ while((SPI0_CONF & (1<
+ SPI0_DAT0 = data;
+fff00230: e5020fbf str r0, [r2, #-4031]
+ SPI0_CONF = SPI0_CONF | (1<
+
+ return SPI0_DAT0;
+fff00250: e5120fbf ldr r0, [r2, #-4031]
+}
+fff00254: e1a0f00e mov pc, lr
+
+fff00258 :
+
+// ******************************************************************************
+// Controls the CS of SPI0, enables a connected CS (turns it LOW)
+ void io_spi0_enable(unsigned char device)
+// ******************************************************************************
+{
+ SPI0_SCSR = SPI0_SCSR | (1<:
+
+// ******************************************************************************
+// Controls the CS of SPI0, disables a connected CS (turns it HIGH)
+ void io_spi0_disable(unsigned char device)
+// ******************************************************************************
+{
+fff00274: e20000ff and r0, r0, #255 ; 0xff
+ SPI0_SCSR = SPI0_SCSR & ~(1<:
+
+
+
+
+// ###########################################################################################################################
+// Inter Intergrated Circuit Interface (I²C_CONTROLLER_0)
+// ###########################################################################################################################
+
+// ******************************************************************************
+// Configure SPI 0 CLK frequency -> (sys_clk/(5*i2c_clock)-1
+ void io_i2c0_speed(unsigned long clk_divider)
+// ******************************************************************************
+{
+ I2C0_CTRL = I2C0_CTRL & ~(1<> 8;
+fff002a0: e1a01420 mov r1, r0, lsr #8
+fff002a4: e3c33080 bic r3, r3, #128 ; 0x80
+fff002a8: e5023f97 str r3, [r2, #-3991]
+fff002ac: e5020f9f str r0, [r2, #-3999]
+fff002b0: e5021f9b str r1, [r2, #-3995]
+ I2C0_CTRL = I2C0_CTRL | (1<:
+
+// ******************************************************************************
+// Read/write byte from/to I²C slave, max 2 address bytes
+ int io_i2c0_byte_transfer(unsigned char rw, // 'r' read / 'w' write cycle
+ unsigned char id, // device ID
+ unsigned long data_adr, // byte address
+ unsigned char adr_bytes, // number of adr bytes
+ unsigned char data) // data byte
+// ******************************************************************************
+{
+fff002c4: e92d4030 stmdb sp!, {r4, r5, lr}
+ // transfer slave identification address
+ I2C0_DATA = id & 0xFE; // device id and write
+ I2C0_CMD = (1<
+ if((I2C0_STAT & (1<
+ adr_bytes--;
+fff00314: e24c3001 sub r3, ip, #1 ; 0x1
+fff00318: e203c0ff and ip, r3, #255 ; 0xff
+ if(adr_bytes == 1)
+fff0031c: e35c0001 cmp ip, #1 ; 0x1
+ I2C0_DATA = data_adr >> 8; // high byte
+fff00320: 01a02424 moveq r2, r4, lsr #8
+fff00324: 03e03a0f mvneq r3, #61440 ; 0xf000
+ else
+ I2C0_DATA = data_adr; // low byte
+fff00328: 13e03a0f mvnne r3, #61440 ; 0xf000
+fff0032c: 05032f93 streq r2, [r3, #-3987]
+fff00330: 15034f93 strne r4, [r3, #-3987]
+ I2C0_CMD = (1<
+ if((I2C0_STAT & (1<
+fff00358: e3e00001 mvn r0, #1 ; 0x1
+fff0035c: e8bd8030 ldmia sp!, {r4, r5, pc}
+ return -2;
+ }
+
+ if(rw == 'w'){
+fff00360: e3500077 cmp r0, #119 ; 0x77
+fff00364: 1a00000c bne fff0039c
+ // write adressed byte
+ I2C0_DATA = data; // send data
+fff00368: e3e03a0f mvn r3, #61440 ; 0xf000
+ I2C0_CMD = (1<
+ if((I2C0_STAT & (1<
+fff003c8: e5123faf ldr r3, [r2, #-4015]
+fff003cc: e3130080 tst r3, #128 ; 0x80
+fff003d0: 1affffef bne fff00394
+fff003d4: e3a03068 mov r3, #104 ; 0x68
+fff003d8: e5023faf str r3, [r2, #-4015]
+fff003dc: e3e00a0f mvn r0, #61440 ; 0xf000
+fff003e0: e5103faf ldr r3, [r0, #-4015]
+fff003e4: e3130002 tst r3, #2 ; 0x2
+fff003e8: 1afffffc bne fff003e0
+fff003ec: e5100f93 ldr r0, [r0, #-3987]
+fff003f0: e8bd8030 ldmia sp!, {r4, r5, pc}
+
+fff003f4 :
+
+
+
+
+// ###########################################################################################################################
+// System
+// ###########################################################################################################################
+
+// ******************************************************************************
+// read system coprocessor register x
+ unsigned long get_syscpreg(unsigned char index)
+// ******************************************************************************
+{
+fff003f4: e20000ff and r0, r0, #255 ; 0xff
+ unsigned long _cp_val;
+ switch(index){
+fff003f8: e350000d cmp r0, #13 ; 0xd
+fff003fc: 979ff100 ldrls pc, [pc, r0, lsl #2]
+fff00400: ea000015 b fff0045c <.text+0x45c>
+fff00404: fff0043c undefined instruction 0xfff0043c
+fff00408: fff00484 undefined instruction 0xfff00484
+fff0040c: fff0047c undefined instruction 0xfff0047c
+fff00410: fff0045c undefined instruction 0xfff0045c
+fff00414: fff0045c undefined instruction 0xfff0045c
+fff00418: fff0045c undefined instruction 0xfff0045c
+fff0041c: fff00474 undefined instruction 0xfff00474
+fff00420: fff0045c undefined instruction 0xfff0045c
+fff00424: fff0046c undefined instruction 0xfff0046c
+fff00428: fff00464 undefined instruction 0xfff00464
+fff0042c: fff0045c undefined instruction 0xfff0045c
+fff00430: fff00454 undefined instruction 0xfff00454
+fff00434: fff0044c undefined instruction 0xfff0044c
+fff00438: fff00444 undefined instruction 0xfff00444
+ case ID_REG_0: asm volatile ("mrc p15,0,%0, c0, c0" : "=r" (_cp_val) : /* no inputs */ ); break;
+fff0043c: ee100f10 mrc 15, 0, r0, cr0, cr0, {0}
+fff00440: e1a0f00e mov pc, lr
+ case ID_REG_1: asm volatile ("mrc p15,0,%0, c1, c1" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case ID_REG_2: asm volatile ("mrc p15,0,%0, c2, c2" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 3: asm volatile ("mrc p15,0,%0, c3, c3" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 4: asm volatile ("mrc p15,0,%0, c4, c4" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 5: asm volatile ("mrc p15,0,%0, c5, c5" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case SYS_CTRL_0: asm volatile ("mrc p15,0,%0, c6, c6" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 7: asm volatile ("mrc p15,0,%0, c7, c7" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case CSTAT: asm volatile ("mrc p15,0,%0, c8, c8" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case ADR_FB: asm volatile ("mrc p15,0,%0, c9, c9" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 10: asm volatile ("mrc p15,0,%0,c10,c10" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case LFSR_POLY: asm volatile ("mrc p15,0,%0,c11,c11" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case LFSR_DATA: asm volatile ("mrc p15,0,%0,c12,c12" : "=r" (_cp_val) : /* no inputs */ ); break;
+ case SYS_IO: asm volatile ("mrc p15,0,%0,c13,c13" : "=r" (_cp_val) : /* no inputs */ ); break;
+fff00444: ee1d0f1d mrc 15, 0, r0, cr13, cr13, {0}
+// case 14: asm volatile ("mrc p15,0,%0,c14,c14" : "=r" (_cp_val) : /* no inputs */ ); break;
+// case 15: asm volatile ("mrc p15,0,%0,c15,c15" : "=r" (_cp_val) : /* no inputs */ ); break;
+ default: _cp_val = 0; break;
+ }
+ return _cp_val;
+}
+fff00448: e1a0f00e mov pc, lr
+fff0044c: ee1c0f1c mrc 15, 0, r0, cr12, cr12, {0}
+fff00450: e1a0f00e mov pc, lr
+fff00454: ee1b0f1b mrc 15, 0, r0, cr11, cr11, {0}
+fff00458: e1a0f00e mov pc, lr
+fff0045c: e3a00000 mov r0, #0 ; 0x0
+fff00460: e1a0f00e mov pc, lr
+fff00464: ee190f19 mrc 15, 0, r0, cr9, cr9, {0}
+fff00468: e1a0f00e mov pc, lr
+fff0046c: ee180f18 mrc 15, 0, r0, cr8, cr8, {0}
+fff00470: e1a0f00e mov pc, lr
+fff00474: ee160f16 mrc 15, 0, r0, cr6, cr6, {0}
+fff00478: e1a0f00e mov pc, lr
+fff0047c: ee120f12 mrc 15, 0, r0, cr2, cr2, {0}
+fff00480: e1a0f00e mov pc, lr
+fff00484: ee110f11 mrc 15, 0, r0, cr1, cr1, {0}
+fff00488: e1a0f00e mov pc, lr
+
+fff0048c :
+
+// ******************************************************************************
+// write system coprocessor register x
+ void set_syscpreg(unsigned long _cp_val, unsigned char index)
+// ******************************************************************************
+{
+fff0048c: e20110ff and r1, r1, #255 ; 0xff
+ switch(index){
+fff00490: e2411006 sub r1, r1, #6 ; 0x6
+fff00494: e3510007 cmp r1, #7 ; 0x7
+fff00498: 979ff101 ldrls pc, [pc, r1, lsl #2]
+fff0049c: ea000008 b fff004c4 <.text+0x4c4>
+fff004a0: fff004c8 undefined instruction 0xfff004c8
+fff004a4: fff004c4 undefined instruction 0xfff004c4
+fff004a8: fff004c4 undefined instruction 0xfff004c4
+fff004ac: fff004c4 undefined instruction 0xfff004c4
+fff004b0: fff004c4 undefined instruction 0xfff004c4
+fff004b4: fff004d0 undefined instruction 0xfff004d0
+fff004b8: fff004d8 undefined instruction 0xfff004d8
+fff004bc: fff004c0 undefined instruction 0xfff004c0
+// case ID_REG_0: asm volatile ("mcr p15,0,%0, c0, c0,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case ID_REG_1: asm volatile ("mcr p15,0,%0, c1, c1,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case ID_REG_2: asm volatile ("mcr p15,0,%0, c2, c2,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 3: asm volatile ("mcr p15,0,%0, c3, c3,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 4: asm volatile ("mcr p15,0,%0, c4, c4,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 5: asm volatile ("mcr p15,0,%0, c5, c5,0" : /* no outputs */ : "r" (_cp_val)); break;
+ case SYS_CTRL_0: asm volatile ("mcr p15,0,%0, c6, c6,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 7: asm volatile ("mcr p15,0,%0, c7, c7,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case CSTAT: asm volatile ("mcr p15,0,%0, c8, c8,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case ADR_FB: asm volatile ("mcr p15,0,%0, c9, c9,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 10: asm volatile ("mcr p15,0,%0,c10,c10,0" : /* no outputs */ : "r" (_cp_val)); break;
+ case LFSR_POLY: asm volatile ("mcr p15,0,%0,c11,c11,0" : /* no outputs */ : "r" (_cp_val)); break;
+ case LFSR_DATA: asm volatile ("mcr p15,0,%0,c12,c12,0" : /* no outputs */ : "r" (_cp_val)); break;
+ case SYS_IO: asm volatile ("mcr p15,0,%0,c13,c13,0" : /* no outputs */ : "r" (_cp_val)); break;
+fff004c0: ee0d0f1d mcr 15, 0, r0, cr13, cr13, {0}
+fff004c4: e1a0f00e mov pc, lr
+fff004c8: ee060f16 mcr 15, 0, r0, cr6, cr6, {0}
+fff004cc: e1a0f00e mov pc, lr
+fff004d0: ee0b0f1b mcr 15, 0, r0, cr11, cr11, {0}
+fff004d4: e1a0f00e mov pc, lr
+fff004d8: ee0c0f1c mcr 15, 0, r0, cr12, cr12, {0}
+fff004dc: e1a0f00e mov pc, lr
+
+fff004e0 :
+// case 14: asm volatile ("mcr p15,0,%0,c14,c14,0" : /* no outputs */ : "r" (_cp_val)); break;
+// case 15: asm volatile ("mcr p15,0,%0,c15,c15,0" : /* no outputs */ : "r" (_cp_val)); break;
+ default: break;
+ }
+}
+// ******************************************************************************
+// read CMSR value
+ unsigned long get_cmsr(void)
+// ******************************************************************************
+{
+ unsigned long _cmsr;
+ asm volatile (" mrs %0, cpsr" : "=r" (_cmsr) : /* no inputs */ );
+fff004e0: e10f0000 mrs r0, CPSR
+ return _cmsr;
+}
+fff004e4: e1a0f00e mov pc, lr
+
+fff004e8 :
+
+// ******************************************************************************
+// write CMSR value
+ void set_cmsr(unsigned long _cmsr)
+// ******************************************************************************
+{
+ asm volatile (" msr cpsr, %0" : /* no outputs */ : "r" (_cmsr) );
+fff004e8: e129f000 msr CPSR_fc, r0
+}
+fff004ec: e1a0f00e mov pc, lr
+
+fff004f0 :
+
+// ******************************************************************************
+// Enable global IRQ
+ void io_enable_irq(void)
+// ******************************************************************************
+{
+fff004f0: e52de004 str lr, [sp, #-4]!
+ unsigned long _cmsr = get_cmsr();
+fff004f4: ebfffff9 bl fff004e0
+ _cmsr = _cmsr & ~(1<
+
+fff00504 :
+
+// ******************************************************************************
+// Disable global IRQ
+ void io_disable_irq(void)
+// ******************************************************************************
+{
+fff00504: e52de004 str lr, [sp, #-4]!
+ unsigned long _cmsr = get_cmsr();
+fff00508: ebfffff4 bl fff004e0
+ _cmsr = _cmsr | (1<
+
+fff00518 :
+// ############################################################################################
+// Print text string via UART 0
+ const char *uart0_printf(const char *string)
+// ############################################################################################
+{
+fff00518: e92d4010 stmdb sp!, {r4, lr}
+fff0051c: e1a04000 mov r4, r0
+ char ch;
+
+ while ((ch = *string)){
+fff00520: e5d00000 ldrb r0, [r0]
+fff00524: e3500000 cmp r0, #0 ; 0x0
+fff00528: 1a000003 bne fff0053c
+fff0052c: ea000005 b fff00548
+fff00530: e5f40001 ldrb r0, [r4, #1]!
+fff00534: e3500000 cmp r0, #0 ; 0x0
+fff00538: 0a000002 beq fff00548
+ if (io_uart0_send_byte(ch)<=0)
+fff0053c: ebffff24 bl fff001d4
+fff00540: e3500000 cmp r0, #0 ; 0x0
+fff00544: cafffff9 bgt fff00530
+ break;
+ string++;
+ }
+ return string;
+}
+fff00548: e1a00004 mov r0, r4
+fff0054c: e8bd8010 ldmia sp!, {r4, pc}
+
+fff00550 :
+
+// ############################################################################################
+// Read text string via UART 0
+ void uart0_scanf(unsigned char *buffer, int length, unsigned char en_echo)
+// ############################################################################################
+{
+fff00550: e92d4070 stmdb sp!, {r4, r5, r6, lr}
+ int temp = 0;
+
+ while(length > 0){
+fff00554: e2514000 subs r4, r1, #0 ; 0x0
+fff00558: e1a05000 mov r5, r0
+fff0055c: e20260ff and r6, r2, #255 ; 0xff
+fff00560: d8bd8070 ldmleia sp!, {r4, r5, r6, pc}
+ temp = io_uart0_read_byte();
+fff00564: ebffff14 bl fff001bc
+ if(temp != -1){
+fff00568: e3700001 cmn r0, #1 ; 0x1
+ temp = (unsigned char)(temp & 0x000000FF);
+fff0056c: e20030ff and r3, r0, #255 ; 0xff
+fff00570: 0a000005 beq fff0058c
+ *buffer++ = temp;
+ if(en_echo == 1)
+fff00574: e3560001 cmp r6, #1 ; 0x1
+fff00578: e5c53000 strb r3, [r5]
+ io_uart0_send_byte(temp); // echo
+fff0057c: e1a00003 mov r0, r3
+fff00580: e2855001 add r5, r5, #1 ; 0x1
+fff00584: 0a000003 beq fff00598
+ length--;
+fff00588: e2444001 sub r4, r4, #1 ; 0x1
+fff0058c: e3540000 cmp r4, #0 ; 0x0
+fff00590: cafffff3 bgt fff00564
+fff00594: e8bd8070 ldmia sp!, {r4, r5, r6, pc}
+fff00598: ebffff0d bl fff001d4
+fff0059c: eafffff9 b fff00588
+
+fff005a0 :
+ }
+ }
+}
+
+// ############################################################################################
+// Print character buffer via UART 0
+ void uart0_print_buffer(unsigned char *buffer, int size)
+// ############################################################################################
+{
+fff005a0: e92d4030 stmdb sp!, {r4, r5, lr}
+ unsigned char char_buffer = 0;
+ while(size > 0){
+fff005a4: e2514000 subs r4, r1, #0 ; 0x0
+fff005a8: e1a05000 mov r5, r0
+fff005ac: d8bd8030 ldmleia sp!, {r4, r5, pc}
+ char_buffer = *buffer++;
+ io_uart0_send_byte(char_buffer);
+fff005b0: e4d50001 ldrb r0, [r5], #1
+fff005b4: ebffff06 bl fff001d4
+fff005b8: e2544001 subs r4, r4, #1 ; 0x1
+fff005bc: 1afffffb bne fff005b0
+fff005c0: e8bd8030 ldmia sp!, {r4, r5, pc}
+
+fff005c4 :
+ void long_to_hex_string(unsigned long data, // max 32 bit data word
+ unsigned char *buffer, // buffer to store the string
+ unsigned char numbers) // number of places, max 8
+// ############################################################################################
+{
+fff005c4: e92d4010 stmdb sp!, {r4, lr}
+fff005c8: e20240ff and r4, r2, #255 ; 0xff
+ unsigned char temp_char = 0;
+ unsigned long temp_data = 0;
+
+ // fit into range
+ if(numbers > 8)
+fff005cc: e3540008 cmp r4, #8 ; 0x8
+fff005d0: 83a04008 movhi r4, #8 ; 0x8
+fff005d4: 8a000001 bhi fff005e0
+ numbers = 8;
+ if(numbers < 1)
+fff005d8: e3540000 cmp r4, #0 ; 0x0
+ numbers = 1;
+
+ while(numbers > 0){
+ // isolate one 4-bit value
+ if(numbers > 1)
+ temp_data = data >> ((numbers-1)*4);
+ else
+ temp_data = data;
+ temp_data = temp_data & 0x0000000F;
+ numbers--;
+
+ // convert 4-bit value temp_data to char temp_char
+ if(temp_data < 10)
+ temp_char = '0' + temp_data;
+ else
+ temp_char = 'A' + temp_data - 10;
+
+ // save character
+ *buffer++ = temp_char;
+ }
+
+ *buffer++ = 0; // terminate string
+}
+fff005dc: 03a04001 moveq r4, #1 ; 0x1
+fff005e0: e1a02001 mov r2, r1
+fff005e4: e1a0e004 mov lr, r4
+fff005e8: e1a0310e mov r3, lr, lsl #2
+fff005ec: e35e0001 cmp lr, #1 ; 0x1
+fff005f0: e2433004 sub r3, r3, #4 ; 0x4
+fff005f4: e1a0c000 mov ip, r0
+fff005f8: 81a0c330 movhi ip, r0, lsr r3
+fff005fc: e24e3001 sub r3, lr, #1 ; 0x1
+fff00600: e20cc00f and ip, ip, #15 ; 0xf
+fff00604: e203e0ff and lr, r3, #255 ; 0xff
+fff00608: e35c0009 cmp ip, #9 ; 0x9
+fff0060c: e28c3030 add r3, ip, #48 ; 0x30
+fff00610: 828c3037 addhi r3, ip, #55 ; 0x37
+fff00614: e35e0000 cmp lr, #0 ; 0x0
+fff00618: e4c23001 strb r3, [r2], #1
+fff0061c: 1afffff1 bne fff005e8
+fff00620: e2443001 sub r3, r4, #1 ; 0x1
+fff00624: e20330ff and r3, r3, #255 ; 0xff
+fff00628: e0813003 add r3, r1, r3
+fff0062c: e5c3e001 strb lr, [r3, #1]
+fff00630: e8bd8010 ldmia sp!, {r4, pc}
+
+fff00634 :
+
+
+// ############################################################################################
+// Convert 1/2/3/4/5/6/7/8 hex-chars to 32 bit value
+ unsigned long hex_string_to_long(unsigned char *buffer, // string char buffer
+ unsigned char numbers) // number of places, max 8
+// ############################################################################################
+{
+fff00634: e20110ff and r1, r1, #255 ; 0xff
+ unsigned long temp_char = 0;
+ unsigned long temp_data = 0;
+
+ // fit into range
+ if(numbers > 8)
+fff00638: e3510008 cmp r1, #8 ; 0x8
+fff0063c: e92d4010 stmdb sp!, {r4, lr}
+fff00640: e1a04000 mov r4, r0
+fff00644: 8a000016 bhi fff006a4
+ return 0;
+ if(numbers < 1)
+fff00648: e3510000 cmp r1, #0 ; 0x0
+fff0064c: 0a000014 beq fff006a4
+fff00650: e3a00000 mov r0, #0 ; 0x0
+fff00654: ea000006 b fff00674
+ return 0;
+
+ while(numbers > 0){
+ numbers--;
+fff00658: e2413001 sub r3, r1, #1 ; 0x1
+fff0065c: e20310ff and r1, r3, #255 ; 0xff
+
+ temp_char = (unsigned long)(*buffer++); // isolate one char
+ if((temp_char > '0'-1) && (temp_char < '9'+1))
+ temp_char = temp_char - '0';
+ else if((temp_char > 'A'-1) && (temp_char < 'F'+1))
+ temp_char = temp_char - 'A' + 10;
+ else if((temp_char > 'a'-1) && (temp_char < 'f'+1))
+ temp_char = temp_char - 'a' + 10;
+ else
+ return 0;
+ temp_char = temp_char & 0x0F;
+ temp_data = temp_data | (temp_char << 4*numbers);
+fff00660: e202200f and r2, r2, #15 ; 0xf
+fff00664: e1a03101 mov r3, r1, lsl #2
+fff00668: e3510000 cmp r1, #0 ; 0x0
+fff0066c: e1800312 orr r0, r0, r2, lsl r3
+fff00670: 08bd8010 ldmeqia sp!, {r4, pc}
+fff00674: e4d43001 ldrb r3, [r4], #1
+fff00678: e2432030 sub r2, r3, #48 ; 0x30
+fff0067c: e3520009 cmp r2, #9 ; 0x9
+fff00680: e243c041 sub ip, r3, #65 ; 0x41
+fff00684: 9afffff3 bls fff00658
+fff00688: e35c0005 cmp ip, #5 ; 0x5
+fff0068c: e243e061 sub lr, r3, #97 ; 0x61
+fff00690: e2432037 sub r2, r3, #55 ; 0x37
+fff00694: 9affffef bls fff00658
+fff00698: e35e0005 cmp lr, #5 ; 0x5
+fff0069c: e2432057 sub r2, r3, #87 ; 0x57
+fff006a0: 9affffec bls fff00658
+fff006a4: e3a00000 mov r0, #0 ; 0x0
+ }
+
+ return temp_data;
+}
+fff006a8: e8bd8010 ldmia sp!, {r4, pc}
+
+fff006ac :
+
+
+// ############################################################################################
+// Concate 4 bytes (chars) to single 32 bit value
+ unsigned long qbytes_to_long(unsigned char *buffer)
+// ############################################################################################
+{
+fff006ac: e1a03000 mov r3, r0
+ unsigned long temp = 0;
+ temp = temp | (0xFF000000 & (*buffer++ << 24));
+ temp = temp | (0x00FF0000 & (*buffer++ << 16));
+fff006b0: e5d00001 ldrb r0, [r0, #1]
+fff006b4: e283c001 add ip, r3, #1 ; 0x1
+fff006b8: e5d32000 ldrb r2, [r3]
+ temp = temp | (0x0000FF00 & (*buffer++ << 8));
+fff006bc: e5dc1002 ldrb r1, [ip, #2]
+fff006c0: e1a00800 mov r0, r0, lsl #16
+fff006c4: e1800c02 orr r0, r0, r2, lsl #24
+fff006c8: e5dc3001 ldrb r3, [ip, #1]
+fff006cc: e1800001 orr r0, r0, r1
+ temp = temp | (0x000000FF & (*buffer++ << 0));
+ return temp;
+}
+fff006d0: e1800403 orr r0, r0, r3, lsl #8
+fff006d4: e1a0f00e mov pc, lr
+
+fff006d8 :
+
+
+// ############################################################################################
+// simple delay routine
+ void delay(int time) // waits time*10000 clock ticks
+// ############################################################################################
+{
+ time = time*2500*4;
+fff006d8: e0603280 rsb r3, r0, r0, lsl #5
+fff006dc: e0800103 add r0, r0, r3, lsl #2
+fff006e0: e0800100 add r0, r0, r0, lsl #2
+fff006e4: e1a00200 mov r0, r0, lsl #4
+ while(time > 0){
+fff006e8: e3500000 cmp r0, #0 ; 0x0
+fff006ec: d1a0f00e movle pc, lr
+ asm volatile ("NOP");
+fff006f0: e1a00000 nop (mov r0,r0)
+fff006f4: e2500001 subs r0, r0, #1 ; 0x1
+fff006f8: 1afffffc bne fff006f0
+fff006fc: e1a0f00e mov pc, lr
+
+fff00700 :
+// ############################################################################################
+// STORM SoC Bootloader
+ int main(void)
+// ############################################################################################
+{
+fff00700: e92d45f0 stmdb sp!, {r4, r5, r6, r7, r8, sl, lr}
+ int function_sel, data, i, start_app = 0;
+ unsigned long *data_pointer, word_buffer, adr_buffer, cnt;
+ unsigned char buffer[5], char_tmp, *char_pointer, device_id;
+
+ // show reset ack
+ io_set_gpio0_port(0);
+fff00704: e3a00000 mov r0, #0 ; 0x0
+fff00708: e24dd00c sub sp, sp, #12 ; 0xc
+fff0070c: ebfffe74 bl fff000e4
+ set_syscpreg(0xC3, SYS_IO);
+fff00710: e3a0100d mov r1, #13 ; 0xd
+fff00714: e3a000c3 mov r0, #195 ; 0xc3
+fff00718: ebffff5b bl fff0048c
+
+ // init I²C
+ io_i2c0_speed(0x0063); // 100kHz
+fff0071c: e3a00063 mov r0, #99 ; 0x63
+fff00720: ebfffedc bl fff00298
+
+ // enable write-through strategy
+ set_syscpreg(get_syscpreg(SYS_CTRL_0) | (1<
+fff0072c: e3a01006 mov r1, #6 ; 0x6
+fff00730: e3800008 orr r0, r0, #8 ; 0x8
+fff00734: ebffff54 bl fff0048c
+
+ // Check config switches for immediate boot-config
+ function_sel = (int)((~(get_syscpreg(SYS_IO) >> 17)) & 0x0F);
+fff00738: e3a0000d mov r0, #13 ; 0xd
+fff0073c: ebffff2c bl fff003f4
+ switch(function_sel){
+fff00740: e1a008a0 mov r0, r0, lsr #17
+fff00744: e1e00000 mvn r0, r0
+fff00748: e200000f and r0, r0, #15 ; 0xf
+fff0074c: e3500001 cmp r0, #1 ; 0x1
+fff00750: 03a04030 moveq r4, #48 ; 0x30
+fff00754: 028da007 addeq sl, sp, #7 ; 0x7
+fff00758: 0a00001a beq fff007c8
+fff0075c: e3500002 cmp r0, #2 ; 0x2
+fff00760: 0a000070 beq fff00928
+ case 1: function_sel = '0'; goto main_menu; break; // auto start application from RAM
+ case 2: function_sel = '3'; goto main_menu; start_app = 1; device_id = 0xA0; break; // auto boot from i²c EEPROM 0xA0
+ default: break;
+ }
+
+ // Intro screen
+ uart0_printf("\r\n\r\n\r\n+----------------------------------------------------------------+\r\n");
+fff00764: e59f07ec ldr r0, [pc, #2028] ; fff00f58 <.text+0xf58>
+fff00768: ebffff6a bl fff00518
+ uart0_printf( "| <<< STORM Core Processor System - By Stephan Nolting >>> |\r\n");
+fff0076c: e59f07e8 ldr r0, [pc, #2024] ; fff00f5c <.text+0xf5c>
+fff00770: ebffff68 bl fff00518
+ uart0_printf( "+----------------------------------------------------------------+\r\n");
+fff00774: e59f07e4 ldr r0, [pc, #2020] ; fff00f60 <.text+0xf60>
+fff00778: ebffff66 bl fff00518
+ uart0_printf( "| Bootloader for STORM SoC Version: 20120524-D |\r\n");
+fff0077c: e59f07e0 ldr r0, [pc, #2016] ; fff00f64 <.text+0xf64>
+fff00780: ebffff64 bl fff00518
+ uart0_printf( "| Contact: stnolting@googlemail.com |\r\n");
+fff00784: e59f07dc ldr r0, [pc, #2012] ; fff00f68 <.text+0xf68>
+fff00788: ebffff62 bl fff00518
+ uart0_printf( "+----------------------------------------------------------------+\r\n\r\n");
+fff0078c: e59f07d8 ldr r0, [pc, #2008] ; fff00f6c <.text+0xf6c>
+fff00790: ebffff60 bl fff00518
+
+ uart0_printf( " < Welcome to the STORM SoC bootloader console! >\r\n < Select an operation from the menu below or press >\r\n");
+fff00794: e59f07d4 ldr r0, [pc, #2004] ; fff00f70 <.text+0xf70>
+fff00798: ebffff5e bl fff00518
+ uart0_printf( " < the boot key for immediate application start. >\r\n\r\n");
+fff0079c: e59f07d0 ldr r0, [pc, #2000] ; fff00f74 <.text+0xf74>
+fff007a0: ebffff5c bl fff00518
+
+ // Console menu
+ uart0_printf(" 0 - boot from core RAM (start application)\r\n 1 - program core RAM via UART_0\r\n 2 - core RAM dump\r\n");
+fff007a4: e59f07cc ldr r0, [pc, #1996] ; fff00f78 <.text+0xf78>
+fff007a8: ebffff5a bl fff00518
+ uart0_printf(" 3 - boot from I2C EEPROM\r\n 4 - program I2C EEPROM via UART_0\r\n 5 - show content of I2C EEPROM\r\n");
+fff007ac: e59f07c8 ldr r0, [pc, #1992] ; fff00f7c <.text+0xf7c>
+fff007b0: ebffff58 bl fff00518
+ uart0_printf(" a - automatic boot configuration\r\n h - help\r\n r - restart system\r\n\r\nSelect: ");
+fff007b4: e59f07c4 ldr r0, [pc, #1988] ; fff00f80 <.text+0xf80>
+fff007b8: ebffff56 bl fff00518
+fff007bc: e28da007 add sl, sp, #7 ; 0x7
+
+ while(1){
+
+ // console input
+ function_sel = io_uart0_read_byte();
+fff007c0: ebfffe7d bl fff001bc
+fff007c4: e1a04000 mov r4, r0
+
+main_menu:
+
+ // boot button
+ if (((get_syscpreg(SYS_IO) >> 16) & 0x01) == 0){
+fff007c8: e3a0000d mov r0, #13 ; 0xd
+fff007cc: ebffff08 bl fff003f4
+fff007d0: e3100801 tst r0, #65536 ; 0x10000
+ function_sel = '3';
+ start_app = 1;
+ device_id = 0xA0;
+ }
+
+ // main functions
+ switch(function_sel){
+
+ // boot from RAM (start application)
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case '0':
+ io_uart0_send_byte((char)function_sel);
+ start_app = 1;
+ break;
+
+ // load ram via UART0
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case '1':
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf("\r\n\r\nApplication will start automatically after download.\r\n-> Waiting for 'storm_program.bin' in byte-stream mode...");
+ uart0_scanf(buffer,4,0); // get storm master boot record code
+ if((buffer[0] == 'S') && (buffer[1] == 'M') && (buffer[2] == 'B') && (buffer[3] == 'R')){
+ uart0_scanf(buffer,4,0); // get image size
+ adr_buffer = qbytes_to_long(buffer);
+ if (adr_buffer > RAM_SIZE-8){
+ uart0_printf(" ERROR! Program file too big!\r\n\r\n");
+ break;
+ }
+ data_pointer = 0;
+ while(data_pointer != adr_buffer+4){
+ uart0_scanf(buffer,4,0); // get word
+ *data_pointer = qbytes_to_long(buffer); // store memory entry
+ data_pointer = data_pointer + 1;
+ }
+ start_app = 1;
+ }
+ else
+ uart0_printf(" Invalid programming file!\r\n\r\nSelect: ");
+ break;
+
+ // ram memory dump
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case '2':
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf("\r\n\r\nAbort dumping by pressing any key.\r\nPress any key to continue.\r\n\r\n");
+ while(io_uart0_read_byte() == -1);
+ while(io_uart0_read_byte() != -1);
+ data_pointer = 0;
+ while(data_pointer != RAM_SIZE){
+ word_buffer = *data_pointer;
+ io_uart0_send_byte(word_buffer >> 24);
+ io_uart0_send_byte(word_buffer >> 16);
+ io_uart0_send_byte(word_buffer >> 8);
+ io_uart0_send_byte(word_buffer >> 0);
+ data_pointer++;
+ if(io_uart0_read_byte() != -1){
+ break;
+ uart0_printf("\r\n\r\nAborted!");
+ }
+ }
+ uart0_printf("\r\n\r\nDumping completed.\r\n\r\nSelect: ");
+ break;
+
+ // boot from I²C EEPROM
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case '3':
+ if(start_app == 0){
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf("\r\n\r\nEnter device address (2x hex_chars, set LSB to '0'): ");
+ uart0_scanf(buffer,2,1);
+ device_id = (unsigned char)hex_string_to_long(buffer, 2);
+ if(device_id == 0){
+ uart0_printf(" Invalid address!\r\n\r\nSelect: ");
+fff007d4: 03a06001 moveq r6, #1 ; 0x1
+fff007d8: 03a050a0 moveq r5, #160 ; 0xa0
+fff007dc: 1a000035 bne fff008b8
+ break;
+ }
+ }
+
+ uart0_printf("\r\nApplication will start automatically after upload.\r\n-> Loading boot image...");
+ cnt = 0;
+ buffer[0] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+fff007e0: e3a04000 mov r4, #0 ; 0x0
+fff007e4: e59f0798 ldr r0, [pc, #1944] ; fff00f84 <.text+0xf84>
+fff007e8: ebffff4a bl fff00518
+fff007ec: e1a01005 mov r1, r5
+fff007f0: e1a02004 mov r2, r4
+fff007f4: e3a03002 mov r3, #2 ; 0x2
+fff007f8: e3a00072 mov r0, #114 ; 0x72
+fff007fc: e58d4000 str r4, [sp]
+fff00800: ebfffeaf bl fff002c4
+ buffer[1] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+fff00804: e1a01005 mov r1, r5
+fff00808: e5cd0007 strb r0, [sp, #7]
+fff0080c: e3a02001 mov r2, #1 ; 0x1
+fff00810: e3a03002 mov r3, #2 ; 0x2
+fff00814: e3a00072 mov r0, #114 ; 0x72
+fff00818: e58d4000 str r4, [sp]
+fff0081c: ebfffea8 bl fff002c4
+ buffer[2] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+fff00820: e3a02002 mov r2, #2 ; 0x2
+fff00824: e1a03002 mov r3, r2
+fff00828: e5cd0008 strb r0, [sp, #8]
+fff0082c: e1a01005 mov r1, r5
+fff00830: e3a00072 mov r0, #114 ; 0x72
+fff00834: e58d4000 str r4, [sp]
+fff00838: ebfffea1 bl fff002c4
+ buffer[3] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+fff0083c: e3a03002 mov r3, #2 ; 0x2
+fff00840: e5cd0009 strb r0, [sp, #9]
+fff00844: e1a01005 mov r1, r5
+fff00848: e3a00072 mov r0, #114 ; 0x72
+fff0084c: e3a02003 mov r2, #3 ; 0x3
+fff00850: e58d4000 str r4, [sp]
+fff00854: ebfffe9a bl fff002c4
+ if((buffer[0] == 'S') && (buffer[1] == 'M') && (buffer[2] == 'B') && (buffer[3] == 'R')){
+fff00858: e5dd3007 ldrb r3, [sp, #7]
+fff0085c: e20000ff and r0, r0, #255 ; 0xff
+fff00860: e3530053 cmp r3, #83 ; 0x53
+fff00864: e5cd000a strb r0, [sp, #10]
+fff00868: 1a000002 bne fff00878
+fff0086c: e5dd3008 ldrb r3, [sp, #8]
+fff00870: e353004d cmp r3, #77 ; 0x4d
+fff00874: 0a000062 beq fff00a04
+ buffer[0] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[1] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[2] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[3] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ adr_buffer = qbytes_to_long(buffer);
+ data_pointer = 0;
+ while((data_pointer != adr_buffer+4) && (data_pointer < IRAM_SIZE)){
+ buffer[0] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[1] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[2] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ buffer[3] = (unsigned char)io_i2c0_byte_transfer('r',device_id,cnt++,2,0x00);
+ *data_pointer = qbytes_to_long(buffer); // store memory entry
+ data_pointer = data_pointer + 1;
+ }
+ uart0_printf(" Upload complete\r\n");
+ start_app = 1;
+ }
+ else
+ uart0_printf(" Invalid boot device or file!\r\n\r\nSelect: ");
+fff00878: e59f0708 ldr r0, [pc, #1800] ; fff00f88 <.text+0xf88>
+fff0087c: ebffff25 bl fff00518
+ break;
+
+ // program I²C EEPROM
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case '4':
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf("\r\n\r\nEnter device address (2x hex_chars, set LSB to '0'): ");
+ uart0_scanf(buffer,2,1);
+ device_id = (unsigned char)hex_string_to_long(buffer, 2);
+ if(device_id == 0){
+ uart0_printf("\r\nInvalid address!\r\n\r\nSelect: ");
+ break;
+ }
+
+ uart0_printf("\r\nData will overwrite RAM content!\r\n-> Waiting for 'storm_program.bin' in byte-stream mode...");
+ uart0_scanf(buffer,4,0);
+ if((buffer[0]=='S') && (buffer[1]=='M') && (buffer[2]=='B') && (buffer[3]=='R')){
+ char_pointer = 0; // beginning of RAM
+ *char_pointer++ = 'S'; asm volatile ("NOP");
+ *char_pointer++ = 'M'; asm volatile ("NOP");
+ *char_pointer++ = 'B'; asm volatile ("NOP");
+ *char_pointer++ = 'R'; asm volatile ("NOP");
+ uart0_scanf(buffer,4,0);
+ *char_pointer++ = buffer[0];
+ *char_pointer++ = buffer[1];
+ *char_pointer++ = buffer[2];
+ *char_pointer++ = buffer[3];
+ cnt = qbytes_to_long(buffer);
+ if(cnt > 0xFFFC){
+ uart0_printf(" ERROR! Program file too big!\r\n\r\n");
+ break;
+ }
+
+ for(i=0; i 16 bit addresses,\r\n");
+ uart0_printf("fixed boot device address: 0xA0\r\n\r\n");
+ uart0_printf("Terminal setup: 9600 baud, 8 data bits, no parity, 1 stop bit\r\n\r\n");
+ uart0_printf("For more information see the STORM Core / STORM SoC datasheet\r\n");
+ uart0_printf("http://opencores.org/project,storm_core\r\n");
+ uart0_printf("http://opencores.org/project,storm_soc\r\n");
+ uart0_printf("Contact: stnolting@googlemail.com\r\n");
+ uart0_printf("(c) 2012 by Stephan Nolting\r\n\r\nSelect: ");
+ break;
+
+ // back to the future
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case 'f':
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf("\r\n\r\nWe'll send you back - to the future!.\r\n\r\n");
+ uart0_printf(" - Doctor Emmet L. Brown\r\n\r\nSelect: ");
+ break;
+
+ // restart system
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case 'r':
+ io_uart0_send_byte((char)function_sel);
+ asm volatile ("mov r0, #0x0FF00000");
+ asm volatile ("add pc, r0, #0xF0000000"); // jump to bootloader
+ while(1);
+ break;
+
+ // no input
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ case -1:
+ break;
+
+ // invalid selection
+ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ default:
+ io_uart0_send_byte((char)function_sel);
+ uart0_printf(" Invalid operation!\r\nTry again: ");
+ break;
+
+ }
+
+ // start application request
+ if(start_app != 0)
+fff00880: e3560000 cmp r6, #0 ; 0x0
+fff00884: 0affffcd beq fff007c0
+ break;
+
+ }
+
+ // start application
+ uart0_printf("\r\n\r\n-> Starting application...\r\n\r\n");
+fff00888: e59f06fc ldr r0, [pc, #1788] ; fff00f8c <.text+0xf8c>
+fff0088c: ebffff21 bl fff00518
+ set_syscpreg(0x00, SYS_IO);
+fff00890: e3a0100d mov r1, #13 ; 0xd
+fff00894: e3a00000 mov r0, #0 ; 0x0
+fff00898: ebfffefb bl fff0048c
+
+ // disable write-through strategy
+ set_syscpreg(get_syscpreg(SYS_CTRL_0) & ~(1<
+fff008a4: e3a01006 mov r1, #6 ; 0x6
+fff008a8: e3c00008 bic r0, r0, #8 ; 0x8
+fff008ac: ebfffef6 bl fff0048c
+
+ // jump to application
+ asm volatile ("mov pc, #0");
+fff008b0: e3a0f000 mov pc, #0 ; 0x0
+fff008b4: eafffffe b fff008b4
+fff008b8: e3540034 cmp r4, #52 ; 0x34
+fff008bc: 0a000028 beq fff00964
+fff008c0: ca00001b bgt fff00934
+fff008c4: e3540031 cmp r4, #49 ; 0x31
+fff008c8: 0a000035 beq fff009a4
+fff008cc: da000097 ble fff00b30
+fff008d0: e3540032 cmp r4, #50 ; 0x32
+fff008d4: 0a0000a1 beq fff00b60
+fff008d8: e3540033 cmp r4, #51 ; 0x33
+fff008dc: 1a000097 bne fff00b40
+fff008e0: e1a00004 mov r0, r4
+fff008e4: ebfffe3a bl fff001d4
+fff008e8: e59f06a0 ldr r0, [pc, #1696] ; fff00f90 <.text+0xf90>
+fff008ec: ebffff09 bl fff00518
+fff008f0: e1a0000a mov r0, sl
+fff008f4: e3a01002 mov r1, #2 ; 0x2
+fff008f8: e3a02001 mov r2, #1 ; 0x1
+fff008fc: ebffff13 bl fff00550
+fff00900: e3a01002 mov r1, #2 ; 0x2
+fff00904: e1a0000a mov r0, sl
+fff00908: ebffff49 bl fff00634
+fff0090c: e21010ff ands r1, r0, #255 ; 0xff
+fff00910: 11a05001 movne r5, r1
+fff00914: 13a06000 movne r6, #0 ; 0x0
+fff00918: 1affffb0 bne fff007e0
+fff0091c: e59f0670 ldr r0, [pc, #1648] ; fff00f94 <.text+0xf94>
+fff00920: ebfffefc bl fff00518
+fff00924: eaffffa5 b fff007c0
+fff00928: e3a04033 mov r4, #51 ; 0x33
+fff0092c: e28da007 add sl, sp, #7 ; 0x7
+fff00930: eaffffa4 b fff007c8
+fff00934: e3540066 cmp r4, #102 ; 0x66
+fff00938: 0a00002a beq fff009e8
+fff0093c: da0000a5 ble fff00bd8
+fff00940: e3540068 cmp r4, #104 ; 0x68
+fff00944: 0a000107 beq fff00d68
+fff00948: e3540072 cmp r4, #114 ; 0x72
+fff0094c: 1a00007b bne fff00b40
+fff00950: e1a00004 mov r0, r4
+fff00954: ebfffe1e bl fff001d4
+fff00958: e3a006ff mov r0, #267386880 ; 0xff00000
+fff0095c: e280f20f add pc, r0, #-268435456 ; 0xf0000000
+fff00960: eafffffe b fff00960
+fff00964: e1a00004 mov r0, r4
+fff00968: ebfffe19 bl fff001d4
+fff0096c: e59f061c ldr r0, [pc, #1564] ; fff00f90 <.text+0xf90>
+fff00970: ebfffee8 bl fff00518
+fff00974: e1a0000a mov r0, sl
+fff00978: e3a01002 mov r1, #2 ; 0x2
+fff0097c: e3a02001 mov r2, #1 ; 0x1
+fff00980: ebfffef2 bl fff00550
+fff00984: e1a0000a mov r0, sl
+fff00988: e3a01002 mov r1, #2 ; 0x2
+fff0098c: ebffff28 bl fff00634
+fff00990: e21080ff ands r8, r0, #255 ; 0xff
+fff00994: 1a00009c bne fff00c0c
+fff00998: e59f05f8 ldr r0, [pc, #1528] ; fff00f98 <.text+0xf98>
+fff0099c: ebfffedd bl fff00518
+fff009a0: eaffff86 b fff007c0
+fff009a4: e1a00004 mov r0, r4
+fff009a8: ebfffe09 bl fff001d4
+fff009ac: e59f05e8 ldr r0, [pc, #1512] ; fff00f9c <.text+0xf9c>
+fff009b0: ebfffed8 bl fff00518
+fff009b4: e1a0000a mov r0, sl
+fff009b8: e3a01004 mov r1, #4 ; 0x4
+fff009bc: e3a02000 mov r2, #0 ; 0x0
+fff009c0: ebfffee2 bl fff00550
+fff009c4: e5dd3007 ldrb r3, [sp, #7]
+fff009c8: e3530053 cmp r3, #83 ; 0x53
+fff009cc: 1a000002 bne fff009dc
+fff009d0: e5dd3008 ldrb r3, [sp, #8]
+fff009d4: e353004d cmp r3, #77 ; 0x4d
+fff009d8: 0a00010d beq fff00e14
+fff009dc: e59f05bc ldr r0, [pc, #1468] ; fff00fa0 <.text+0xfa0>
+fff009e0: ebfffecc bl fff00518
+fff009e4: eaffff75 b fff007c0
+fff009e8: e1a00004 mov r0, r4
+fff009ec: ebfffdf8 bl fff001d4
+fff009f0: e59f05ac ldr r0, [pc, #1452] ; fff00fa4 <.text+0xfa4>
+fff009f4: ebfffec7 bl fff00518
+fff009f8: e59f05a8 ldr r0, [pc, #1448] ; fff00fa8 <.text+0xfa8>
+fff009fc: ebfffec5 bl fff00518
+fff00a00: eaffff6e b fff007c0
+fff00a04: e5dd3009 ldrb r3, [sp, #9]
+fff00a08: e3530042 cmp r3, #66 ; 0x42
+fff00a0c: 1affff99 bne fff00878
+fff00a10: e3500052 cmp r0, #82 ; 0x52
+fff00a14: 1affff97 bne fff00878
+fff00a18: e1a01005 mov r1, r5
+fff00a1c: e3a02004 mov r2, #4 ; 0x4
+fff00a20: e2433040 sub r3, r3, #64 ; 0x40
+fff00a24: e2800020 add r0, r0, #32 ; 0x20
+fff00a28: e58d4000 str r4, [sp]
+fff00a2c: ebfffe24 bl fff002c4
+fff00a30: e1a01005 mov r1, r5
+fff00a34: e5cd0007 strb r0, [sp, #7]
+fff00a38: e3a02005 mov r2, #5 ; 0x5
+fff00a3c: e3a03002 mov r3, #2 ; 0x2
+fff00a40: e3a00072 mov r0, #114 ; 0x72
+fff00a44: e58d4000 str r4, [sp]
+fff00a48: ebfffe1d bl fff002c4
+fff00a4c: e1a01005 mov r1, r5
+fff00a50: e5cd0008 strb r0, [sp, #8]
+fff00a54: e3a02006 mov r2, #6 ; 0x6
+fff00a58: e3a03002 mov r3, #2 ; 0x2
+fff00a5c: e3a00072 mov r0, #114 ; 0x72
+fff00a60: e58d4000 str r4, [sp]
+fff00a64: ebfffe16 bl fff002c4
+fff00a68: e1a01005 mov r1, r5
+fff00a6c: e5cd0009 strb r0, [sp, #9]
+fff00a70: e3a02007 mov r2, #7 ; 0x7
+fff00a74: e3a03002 mov r3, #2 ; 0x2
+fff00a78: e3a00072 mov r0, #114 ; 0x72
+fff00a7c: e58d4000 str r4, [sp]
+fff00a80: ebfffe0f bl fff002c4
+fff00a84: e5cd000a strb r0, [sp, #10]
+fff00a88: e1a0000a mov r0, sl
+fff00a8c: ebffff06 bl fff006ac
+fff00a90: e2907004 adds r7, r0, #4 ; 0x4
+fff00a94: 0a000022 beq fff00b24
+fff00a98: e1a06004 mov r6, r4
+fff00a9c: e2842008 add r2, r4, #8 ; 0x8
+fff00aa0: e1a01005 mov r1, r5
+fff00aa4: e3a03002 mov r3, #2 ; 0x2
+fff00aa8: e3a00072 mov r0, #114 ; 0x72
+fff00aac: e58d6000 str r6, [sp]
+fff00ab0: ebfffe03 bl fff002c4
+fff00ab4: e2842009 add r2, r4, #9 ; 0x9
+fff00ab8: e5cd0007 strb r0, [sp, #7]
+fff00abc: e1a01005 mov r1, r5
+fff00ac0: e3a03002 mov r3, #2 ; 0x2
+fff00ac4: e3a00072 mov r0, #114 ; 0x72
+fff00ac8: e58d6000 str r6, [sp]
+fff00acc: ebfffdfc bl fff002c4
+fff00ad0: e284200a add r2, r4, #10 ; 0xa
+fff00ad4: e5cd0008 strb r0, [sp, #8]
+fff00ad8: e1a01005 mov r1, r5
+fff00adc: e3a03002 mov r3, #2 ; 0x2
+fff00ae0: e3a00072 mov r0, #114 ; 0x72
+fff00ae4: e58d6000 str r6, [sp]
+fff00ae8: ebfffdf5 bl fff002c4
+fff00aec: e284200b add r2, r4, #11 ; 0xb
+fff00af0: e5cd0009 strb r0, [sp, #9]
+fff00af4: e1a01005 mov r1, r5
+fff00af8: e3a03002 mov r3, #2 ; 0x2
+fff00afc: e3a00072 mov r0, #114 ; 0x72
+fff00b00: e58d6000 str r6, [sp]
+fff00b04: ebfffdee bl fff002c4
+fff00b08: e5cd000a strb r0, [sp, #10]
+fff00b0c: e1a0000a mov r0, sl
+fff00b10: ebfffee5 bl fff006ac
+fff00b14: e4840004 str r0, [r4], #4
+fff00b18: e1540007 cmp r4, r7
+fff00b1c: 13540902 cmpne r4, #32768 ; 0x8000
+fff00b20: 3affffdd bcc fff00a9c
+fff00b24: e59f0480 ldr r0, [pc, #1152] ; fff00fac <.text+0xfac>
+fff00b28: ebfffe7a bl fff00518
+fff00b2c: eaffff55 b fff00888
+fff00b30: e3740001 cmn r4, #1 ; 0x1
+fff00b34: 0affff21 beq fff007c0
+fff00b38: e3540030 cmp r4, #48 ; 0x30
+fff00b3c: 0a000004 beq fff00b54
+fff00b40: e20400ff and r0, r4, #255 ; 0xff
+fff00b44: ebfffda2 bl fff001d4
+fff00b48: e59f0460 ldr r0, [pc, #1120] ; fff00fb0 <.text+0xfb0>
+fff00b4c: ebfffe71 bl fff00518
+fff00b50: eaffff1a b fff007c0
+fff00b54: e1a00004 mov r0, r4
+fff00b58: ebfffd9d bl fff001d4
+fff00b5c: eaffff49 b fff00888
+fff00b60: e1a00004 mov r0, r4
+fff00b64: ebfffd9a bl fff001d4
+fff00b68: e59f0444 ldr r0, [pc, #1092] ; fff00fb4 <.text+0xfb4>
+fff00b6c: ebfffe69 bl fff00518
+fff00b70: ebfffd91 bl fff001bc
+fff00b74: e3700001 cmn r0, #1 ; 0x1
+fff00b78: 0afffffc beq fff00b70
+fff00b7c: ebfffd8e bl fff001bc
+fff00b80: e3700001 cmn r0, #1 ; 0x1
+fff00b84: 1afffffc bne fff00b7c
+fff00b88: e3a05000 mov r5, #0 ; 0x0
+fff00b8c: ea000001 b fff00b98
+fff00b90: e3550902 cmp r5, #32768 ; 0x8000
+fff00b94: 0a00000c beq fff00bcc
+fff00b98: e5954000 ldr r4, [r5]
+fff00b9c: e1a00c24 mov r0, r4, lsr #24
+fff00ba0: ebfffd8b bl fff001d4
+fff00ba4: e1a00824 mov r0, r4, lsr #16
+fff00ba8: ebfffd89 bl fff001d4
+fff00bac: e1a00424 mov r0, r4, lsr #8
+fff00bb0: ebfffd87 bl fff001d4
+fff00bb4: e1a00004 mov r0, r4
+fff00bb8: ebfffd85 bl fff001d4
+fff00bbc: ebfffd7e bl fff001bc
+fff00bc0: e3700001 cmn r0, #1 ; 0x1
+fff00bc4: e2855004 add r5, r5, #4 ; 0x4
+fff00bc8: 0afffff0 beq fff00b90
+fff00bcc: e59f03e4 ldr r0, [pc, #996] ; fff00fb8 <.text+0xfb8>
+fff00bd0: ebfffe50 bl fff00518
+fff00bd4: eafffef9 b fff007c0
+fff00bd8: e3540035 cmp r4, #53 ; 0x35
+fff00bdc: 0a0000a9 beq fff00e88
+fff00be0: e3540061 cmp r4, #97 ; 0x61
+fff00be4: 1affffd5 bne fff00b40
+fff00be8: e1a00004 mov r0, r4
+fff00bec: ebfffd78 bl fff001d4
+fff00bf0: e59f03c4 ldr r0, [pc, #964] ; fff00fbc <.text+0xfbc>
+fff00bf4: ebfffe47 bl fff00518
+fff00bf8: e59f03c0 ldr r0, [pc, #960] ; fff00fc0 <.text+0xfc0>
+fff00bfc: ebfffe45 bl fff00518
+fff00c00: e59f03bc ldr r0, [pc, #956] ; fff00fc4 <.text+0xfc4>
+fff00c04: ebfffe43 bl fff00518
+fff00c08: eafffeec b fff007c0
+fff00c0c: e59f03b4 ldr r0, [pc, #948] ; fff00fc8 <.text+0xfc8>
+fff00c10: ebfffe40 bl fff00518
+fff00c14: e1a0000a mov r0, sl
+fff00c18: e3a01004 mov r1, #4 ; 0x4
+fff00c1c: e3a02000 mov r2, #0 ; 0x0
+fff00c20: ebfffe4a bl fff00550
+fff00c24: e5dd3007 ldrb r3, [sp, #7]
+fff00c28: e3530053 cmp r3, #83 ; 0x53
+fff00c2c: 1a000002 bne fff00c3c
+fff00c30: e5dd2008 ldrb r2, [sp, #8]
+fff00c34: e352004d cmp r2, #77 ; 0x4d
+fff00c38: 0a000004 beq fff00c50
+fff00c3c: e59f0388 ldr r0, [pc, #904] ; fff00fcc <.text+0xfcc>
+fff00c40: ebfffe34 bl fff00518
+fff00c44: e59f0384 ldr r0, [pc, #900] ; fff00fd0 <.text+0xfd0>
+fff00c48: ebfffe32 bl fff00518
+fff00c4c: eafffedb b fff007c0
+fff00c50: e5dd1009 ldrb r1, [sp, #9]
+fff00c54: e3510042 cmp r1, #66 ; 0x42
+fff00c58: 1afffff7 bne fff00c3c
+fff00c5c: e5dd000a ldrb r0, [sp, #10]
+fff00c60: e3500052 cmp r0, #82 ; 0x52
+fff00c64: 1afffff4 bne fff00c3c
+fff00c68: e3a04000 mov r4, #0 ; 0x0
+fff00c6c: e5c43000 strb r3, [r4]
+fff00c70: e1a00000 nop (mov r0,r0)
+fff00c74: e5c42001 strb r2, [r4, #1]
+fff00c78: e1a00000 nop (mov r0,r0)
+fff00c7c: e5c41002 strb r1, [r4, #2]
+fff00c80: e1a00000 nop (mov r0,r0)
+fff00c84: e5c40003 strb r0, [r4, #3]
+fff00c88: e1a00000 nop (mov r0,r0)
+fff00c8c: e241103e sub r1, r1, #62 ; 0x3e
+fff00c90: e1a0000a mov r0, sl
+fff00c94: e1a02004 mov r2, r4
+fff00c98: ebfffe2c bl fff00550
+fff00c9c: e5dd3007 ldrb r3, [sp, #7]
+fff00ca0: e5c43004 strb r3, [r4, #4]
+fff00ca4: e5dd2008 ldrb r2, [sp, #8]
+fff00ca8: e5c42005 strb r2, [r4, #5]
+fff00cac: e5dd3009 ldrb r3, [sp, #9]
+fff00cb0: e5c43006 strb r3, [r4, #6]
+fff00cb4: e5dd200a ldrb r2, [sp, #10]
+fff00cb8: e1a0000a mov r0, sl
+fff00cbc: e5c42007 strb r2, [r4, #7]
+fff00cc0: ebfffe79 bl fff006ac
+fff00cc4: e3a03cff mov r3, #65280 ; 0xff00
+fff00cc8: e28330fc add r3, r3, #252 ; 0xfc
+fff00ccc: e1500003 cmp r0, r3
+fff00cd0: e1a05000 mov r5, r0
+fff00cd4: 8a000095 bhi fff00f30
+fff00cd8: e3700004 cmn r0, #4 ; 0x4
+fff00cdc: 12844008 addne r4, r4, #8 ; 0x8
+fff00ce0: 1280600b addne r6, r0, #11 ; 0xb
+fff00ce4: 0a000006 beq fff00d04
+fff00ce8: ebfffd33 bl fff001bc
+fff00cec: e3700001 cmn r0, #1 ; 0x1
+fff00cf0: 0afffffc beq fff00ce8
+fff00cf4: e1560004 cmp r6, r4
+fff00cf8: e5c40000 strb r0, [r4]
+fff00cfc: e2844001 add r4, r4, #1 ; 0x1
+fff00d00: 1afffff8 bne fff00ce8
+fff00d04: e59f02c8 ldr r0, [pc, #712] ; fff00fd4 <.text+0xfd4>
+fff00d08: ebfffe02 bl fff00518
+fff00d0c: e59f02c4 ldr r0, [pc, #708] ; fff00fd8 <.text+0xfd8>
+fff00d10: ebfffe00 bl fff00518
+fff00d14: e375000c cmn r5, #12 ; 0xc
+fff00d18: 0a00000f beq fff00d5c
+fff00d1c: e3a04000 mov r4, #0 ; 0x0
+fff00d20: e285700c add r7, r5, #12 ; 0xc
+fff00d24: e1a06004 mov r6, r4
+fff00d28: e5d45000 ldrb r5, [r4]
+fff00d2c: e3a00077 mov r0, #119 ; 0x77
+fff00d30: e1a01008 mov r1, r8
+fff00d34: e1a02006 mov r2, r6
+fff00d38: e3a03002 mov r3, #2 ; 0x2
+fff00d3c: e58d5000 str r5, [sp]
+fff00d40: ebfffd5f bl fff002c4
+fff00d44: e3500000 cmp r0, #0 ; 0x0
+fff00d48: 1afffff7 bne fff00d2c
+fff00d4c: e2844001 add r4, r4, #1 ; 0x1
+fff00d50: e1540007 cmp r4, r7
+fff00d54: e1a06004 mov r6, r4
+fff00d58: 1afffff2 bne fff00d28
+fff00d5c: e59f0278 ldr r0, [pc, #632] ; fff00fdc <.text+0xfdc>
+fff00d60: ebfffdec bl fff00518
+fff00d64: eaffffb6 b fff00c44
+fff00d68: e1a00004 mov r0, r4
+fff00d6c: ebfffd18 bl fff001d4
+fff00d70: e59f0268 ldr r0, [pc, #616] ; fff00fe0 <.text+0xfe0>
+fff00d74: ebfffde7 bl fff00518
+fff00d78: e59f0264 ldr r0, [pc, #612] ; fff00fe4 <.text+0xfe4>
+fff00d7c: ebfffde5 bl fff00518
+fff00d80: e59f0260 ldr r0, [pc, #608] ; fff00fe8 <.text+0xfe8>
+fff00d84: ebfffde3 bl fff00518
+fff00d88: e59f025c ldr r0, [pc, #604] ; fff00fec <.text+0xfec>
+fff00d8c: ebfffde1 bl fff00518
+fff00d90: e59f0258 ldr r0, [pc, #600] ; fff00ff0 <.text+0xff0>
+fff00d94: ebfffddf bl fff00518
+fff00d98: e59f0254 ldr r0, [pc, #596] ; fff00ff4 <.text+0xff4>
+fff00d9c: ebfffddd bl fff00518
+fff00da0: e59f0250 ldr r0, [pc, #592] ; fff00ff8 <.text+0xff8>
+fff00da4: ebfffddb bl fff00518
+fff00da8: e59f024c ldr r0, [pc, #588] ; fff00ffc <.text+0xffc>
+fff00dac: ebfffdd9 bl fff00518
+fff00db0: e59f0248 ldr r0, [pc, #584] ; fff01000 <.text+0x1000>
+fff00db4: ebfffdd7 bl fff00518
+fff00db8: e59f0244 ldr r0, [pc, #580] ; fff01004 <.text+0x1004>
+fff00dbc: ebfffdd5 bl fff00518
+fff00dc0: e59f0240 ldr r0, [pc, #576] ; fff01008 <.text+0x1008>
+fff00dc4: ebfffdd3 bl fff00518
+fff00dc8: e59f023c ldr r0, [pc, #572] ; fff0100c <.text+0x100c>
+fff00dcc: ebfffdd1 bl fff00518
+fff00dd0: e59f0238 ldr r0, [pc, #568] ; fff01010 <.text+0x1010>
+fff00dd4: ebfffdcf bl fff00518
+fff00dd8: e59f0234 ldr r0, [pc, #564] ; fff01014 <.text+0x1014>
+fff00ddc: ebfffdcd bl fff00518
+fff00de0: e59f0230 ldr r0, [pc, #560] ; fff01018 <.text+0x1018>
+fff00de4: ebfffdcb bl fff00518
+fff00de8: e59f022c ldr r0, [pc, #556] ; fff0101c <.text+0x101c>
+fff00dec: ebfffdc9 bl fff00518
+fff00df0: e59f0228 ldr r0, [pc, #552] ; fff01020 <.text+0x1020>
+fff00df4: ebfffdc7 bl fff00518
+fff00df8: e59f0224 ldr r0, [pc, #548] ; fff01024 <.text+0x1024>
+fff00dfc: ebfffdc5 bl fff00518
+fff00e00: e59f0220 ldr r0, [pc, #544] ; fff01028 <.text+0x1028>
+fff00e04: ebfffdc3 bl fff00518
+fff00e08: e59f021c ldr r0, [pc, #540] ; fff0102c <.text+0x102c>
+fff00e0c: ebfffdc1 bl fff00518
+fff00e10: eafffe6a b fff007c0
+fff00e14: e5dd3009 ldrb r3, [sp, #9]
+fff00e18: e3530042 cmp r3, #66 ; 0x42
+fff00e1c: 1afffeee bne fff009dc
+fff00e20: e5dd300a ldrb r3, [sp, #10]
+fff00e24: e3530052 cmp r3, #82 ; 0x52
+fff00e28: 1afffeeb bne fff009dc
+fff00e2c: e3a01004 mov r1, #4 ; 0x4
+fff00e30: e3a02000 mov r2, #0 ; 0x0
+fff00e34: e1a0000a mov r0, sl
+fff00e38: ebfffdc4 bl fff00550
+fff00e3c: e1a0000a mov r0, sl
+fff00e40: ebfffe19 bl fff006ac
+fff00e44: e3a03c7f mov r3, #32512 ; 0x7f00
+fff00e48: e28330f8 add r3, r3, #248 ; 0xf8
+fff00e4c: e1500003 cmp r0, r3
+fff00e50: 8a000036 bhi fff00f30
+fff00e54: e2905004 adds r5, r0, #4 ; 0x4
+fff00e58: 0afffe8a beq fff00888
+fff00e5c: e3a04000 mov r4, #0 ; 0x0
+fff00e60: e3a01004 mov r1, #4 ; 0x4
+fff00e64: e3a02000 mov r2, #0 ; 0x0
+fff00e68: e1a0000a mov r0, sl
+fff00e6c: ebfffdb7 bl fff00550
+fff00e70: e1a0000a mov r0, sl
+fff00e74: ebfffe0c bl fff006ac
+fff00e78: e4840004 str r0, [r4], #4
+fff00e7c: e1550004 cmp r5, r4
+fff00e80: 1afffff6 bne fff00e60