91 lines
2.7 KiB
ArmAsm
91 lines
2.7 KiB
ArmAsm
/*
|
|
#####ECOSGPLCOPYRIGHTBEGIN####
|
|
## -------------------------------------------
|
|
## This file is part of eCos, the Embedded Configurable Operating System.
|
|
## Copyright (C) 2008 Øyvind Harboe
|
|
##
|
|
## eCos is free software; you can redistribute it and/or modify it under
|
|
## the terms of the GNU General Public License as published by the Free
|
|
## Software Foundation; either version 2 or (at your option) any later version.
|
|
##
|
|
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
## for more details.
|
|
##
|
|
## You should have received a copy of the GNU General Public License along
|
|
## with eCos; if not, write to the Free Software Foundation, Inc.,
|
|
## 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
##
|
|
## As a special exception, if other files instantiate templates or use macros
|
|
## or inline functions from this file, or you compile this file and link it
|
|
## with other works to produce a work based on this file, this file does not
|
|
## by itself cause the resulting work to be covered by the GNU General Public
|
|
## License. However the source code for this file must still be made available
|
|
## in accordance with section (3) of the GNU General Public License.
|
|
##
|
|
## This exception does not invalidate any other reasons why a work based on
|
|
## this file might be covered by the GNU General Public License.
|
|
## -------------------------------------------
|
|
#####ECOSGPLCOPYRIGHTEND####
|
|
*/
|
|
|
|
/*
|
|
Jump table for flash driver
|
|
|
|
Registers in ARM callling convention is to place args in registers
|
|
starting at r0.
|
|
|
|
So for:
|
|
|
|
void foo(int a, int b, int c).
|
|
|
|
a=r0
|
|
b=r1
|
|
c=r2
|
|
|
|
|
|
*/
|
|
.global _stack_base
|
|
.global _stack_start
|
|
.global _workarea
|
|
.global _start
|
|
.global _start_bss_clear
|
|
_start:
|
|
// offset=0
|
|
// int erase(void *address, int len)
|
|
ldr sp,=_stack_start
|
|
bl erase
|
|
nop // Stop CPU here using hw breakpoint
|
|
|
|
// offset=0xc
|
|
// int program(void *buffer, void *address, int len)
|
|
ldr sp,=_stack_start
|
|
bl program
|
|
nop // Stop CPU here using hw breakpoint
|
|
|
|
// offset=0x18
|
|
ldr r0,=_workarea
|
|
nop // Stop CPU here using hw breakpoint
|
|
|
|
// offset=0x20
|
|
// int init() - returns error message if the flash chip can't be detected
|
|
ldr sp,=_stack_start
|
|
bl init
|
|
nop // Stop CPU here using hw breakpoint
|
|
|
|
.section ".bss"
|
|
.balign 4
|
|
_stack_base:
|
|
.rept 4096
|
|
.byte 0
|
|
.endr
|
|
_stack_start:
|
|
.balign 4
|
|
_workarea:
|
|
.rept 8192
|
|
.byte 0
|
|
.endr
|
|
// NB!!! we clear bss while the stack is in use, so we start BSS clearing here !!! :-)
|
|
_start_bss_clear:
|