mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
3623ba1884
temporarily disable codespell
287 lines
6.9 KiB
ArmAsm
287 lines
6.9 KiB
ArmAsm
.equ SYS_REGMSC0CFG_B3 , 0x1001b
|
|
.equ SYS_REGIRQCTL_B3 , 0x100e3
|
|
.equ MAILBOX_MEMORY , 0x13000
|
|
|
|
.equ IS_IMG_SDBL_PRESENT, 0
|
|
.equ IS_IMG_D2XX_PRESENT, 0
|
|
.equ IS_IMG_DLOG_PRESENT, 0
|
|
|
|
.section .crt0
|
|
.global _start
|
|
|
|
_start:
|
|
# START Interrupt Vector Table [[
|
|
jmp __PMSIZE-4 # RESET Vector
|
|
jmp interrupt_33 # Watchdog reset vector
|
|
jmp interrupt_0
|
|
jmp interrupt_1
|
|
jmp interrupt_2
|
|
jmp interrupt_3
|
|
jmp interrupt_4
|
|
jmp interrupt_5
|
|
jmp interrupt_6
|
|
jmp interrupt_7
|
|
jmp interrupt_8
|
|
jmp interrupt_9
|
|
jmp interrupt_10
|
|
jmp interrupt_11
|
|
jmp interrupt_12
|
|
jmp interrupt_13
|
|
jmp interrupt_14
|
|
jmp interrupt_15
|
|
jmp interrupt_16
|
|
jmp interrupt_17
|
|
jmp interrupt_18
|
|
jmp interrupt_19
|
|
jmp interrupt_20
|
|
jmp interrupt_21
|
|
jmp interrupt_22
|
|
jmp interrupt_23
|
|
jmp interrupt_24
|
|
jmp interrupt_25
|
|
jmp interrupt_26
|
|
jmp interrupt_27
|
|
jmp interrupt_28
|
|
jmp interrupt_29
|
|
jmp interrupt_30
|
|
jmp interrupt_31
|
|
jmp __PMSIZE-8 #Interrupt vector 32 (NMI)
|
|
# ]] END Interrupt Vector Table
|
|
|
|
codestart:
|
|
jmp init
|
|
|
|
.global _exithook
|
|
_exithook: # Debugger uses '_exithook' at 0x90 to catch program exit
|
|
return
|
|
|
|
init:
|
|
# Disable all interrupts
|
|
ldk $r0,0x80
|
|
.ifdef __FT930__
|
|
sta.b 0x10123, $r0
|
|
.else
|
|
sta.b 0x100e3,$r0
|
|
.endif
|
|
|
|
# Reset all peripherals
|
|
# lda.l $r0, 0x10018
|
|
# bins.l $r0, $r0, 0x23F # Set bit 31
|
|
# sta.l 0x10018, $r0
|
|
|
|
# Initialize DATA by copying from program memory
|
|
ldk.l $r0,__data_load_start
|
|
ldk.l $r1,__data_load_end
|
|
ldk.l $r2,0 # Will use __data after binutils patch
|
|
|
|
jmp .dscopy
|
|
.dsloop:
|
|
# Copy PM[$r0] to RAM $r2
|
|
lpmi.l $r3,$r0,0
|
|
sti.l $r2,0,$r3
|
|
add.l $r0,$r0,4
|
|
add.l $r2,$r2,4
|
|
.dscopy:
|
|
cmp.l $r0,$r1
|
|
jmpc lt,.dsloop
|
|
|
|
# Zero BSS
|
|
ldk.l $r0,_bss_start
|
|
ldk.l $r2,_end
|
|
sub.l $r2,$r2,$r0
|
|
ldk.l $r1,0
|
|
ldk $r3,32764
|
|
1:
|
|
cmp $r2,$r3
|
|
jmpc lt,2f
|
|
memset $r0,$r1,$r3
|
|
add $r0,$r0,$r3
|
|
sub $r2,$r2,$r3
|
|
jmp 1b
|
|
2:
|
|
memset $r0,$r1,$r2
|
|
.ifdef __FT930__
|
|
/*##############################################################*/
|
|
# copy UserConfig DATA from flash to mailbox memory
|
|
/*##############################################################*/
|
|
ldk.l $r0,D2XX_Struct_start /*start of d2xx config in PM memory */
|
|
ldk.l $r1,D2XX_Struct_end /*end of d2xx config in PM memory */
|
|
ldk.l $r2,D2XXTEST_UserD2xxConfig /* RAM cache where the d2xx config from PM to be copied*/
|
|
jmp .configcopy
|
|
|
|
.configloop:
|
|
# Copy PM[$r0] to RAM[$r2]
|
|
lpmi.l $r3,$r0,0
|
|
sti.l $r2,0,$r3
|
|
# Increment
|
|
add.l $r0,$r0,4
|
|
add.l $r2,$r2,4
|
|
.configcopy:
|
|
cmp.l $r0,$r1
|
|
jmpc lt,.configloop
|
|
|
|
ldk.l $r1,D2XX_Struct_start
|
|
ldk.l $r2,D2XX_Struct_end
|
|
#compute size
|
|
sub.l $r2,$r2,$r1
|
|
ldk.l $r1,D2XXTEST_UserD2xxConfig
|
|
ldk.l $r0,MAILBOX_MEMORY /* D2xx config from RAM cache to be copied to Mailbox memory */
|
|
# Copy RAM[$r1] to Mailbox $r0, for $r2 bytes
|
|
streamouti.b $r0,$r1,$r2
|
|
/*############################################################*/
|
|
.endif
|
|
sub.l $sp,$sp,24 # Space for the caller argument frame
|
|
call main
|
|
|
|
.equ EXITEXIT , 0x1fffc
|
|
|
|
.global _exit
|
|
_exit:
|
|
sta.l EXITEXIT,$r0 # simulator end of test
|
|
jmp _exithook
|
|
|
|
#_watchdog_isr:
|
|
# ldk $sp,__RAMSIZE
|
|
# jmp __PMSIZE-4
|
|
|
|
# Macro to construct the interrupt stub code.
|
|
# it just saves r0, loads r0 with the int vector
|
|
# and branches to interrupt_common.
|
|
|
|
.macro inth i=0
|
|
interrupt_\i:
|
|
push $r0 # {
|
|
lda $r0,(vector_table + 4 * \i)
|
|
jmp interrupt_common
|
|
.endm
|
|
|
|
inth 0
|
|
inth 1
|
|
inth 2
|
|
inth 3
|
|
inth 4
|
|
inth 5
|
|
inth 6
|
|
inth 7
|
|
inth 8
|
|
inth 9
|
|
inth 10
|
|
inth 11
|
|
inth 12
|
|
inth 13
|
|
inth 14
|
|
inth 15
|
|
inth 16
|
|
inth 17
|
|
inth 18
|
|
inth 19
|
|
inth 20
|
|
inth 21
|
|
inth 22
|
|
inth 23
|
|
inth 24
|
|
inth 25
|
|
inth 26
|
|
inth 27
|
|
inth 28
|
|
inth 29
|
|
inth 30
|
|
inth 31
|
|
inth 32
|
|
inth 33
|
|
|
|
# On entry: r0, already saved, holds the handler function
|
|
interrupt_common:
|
|
push $r1 # {
|
|
push $r2 # {
|
|
push $r3 # {
|
|
push $r4 # {
|
|
push $r5 # {
|
|
push $r6 # {
|
|
push $r7 # {
|
|
push $r8 # {
|
|
push $r9 # {
|
|
push $r10 # {
|
|
push $r11 # {
|
|
push $r12 # {
|
|
push $cc # {
|
|
|
|
calli $r0
|
|
|
|
pop $cc # }
|
|
pop $r12 # }
|
|
pop $r11 # }
|
|
pop $r10 # }
|
|
pop $r9 # }
|
|
pop $r8 # }
|
|
pop $r7 # }
|
|
pop $r6 # }
|
|
pop $r5 # }
|
|
pop $r4 # }
|
|
pop $r3 # }
|
|
pop $r2 # }
|
|
pop $r1 # }
|
|
pop $r0 # } matching push in interrupt_0-31 above
|
|
reti
|
|
|
|
# Null function for unassigned interrupt to point at
|
|
.global nullvector
|
|
nullvector:
|
|
return
|
|
|
|
.section .data
|
|
.global vector_table
|
|
.align (4) # assembler alignment is in the power of 2 (in this case 2^4)
|
|
vector_table:
|
|
.rept 34
|
|
.long nullvector
|
|
.endr
|
|
|
|
|
|
.section .text
|
|
.global __gxx_personality_sj0
|
|
__gxx_personality_sj0:
|
|
|
|
|
|
.section ._flash_d2xx_config
|
|
.global __pD2XXDefaultConfiguration
|
|
.align (10)
|
|
|
|
D2XX_partition_start = .
|
|
|
|
.if IS_IMG_D2XX_PRESENT
|
|
.ifdef __FT930__
|
|
.include "ft930_d2xx_default_config.inc"
|
|
.else
|
|
.include "ft900_d2xx_default_config.inc"
|
|
.endif
|
|
.endif
|
|
|
|
D2XX_partition_end = .
|
|
|
|
.section ._flash_dlog_partition
|
|
.align (10)
|
|
.global __dlog_partition
|
|
__dlog_partition:
|
|
dlog_partition_start = .
|
|
.if IS_IMG_DLOG_PRESENT
|
|
.long 0xF7D1D106
|
|
.rept (0x1000-4)
|
|
.byte 0xFF
|
|
.endr
|
|
.endif
|
|
dlog_partition_end = .
|
|
|
|
.section ._pm
|
|
.global __sdbl_partition_sizeof
|
|
.global __D2XX_partition_sizeof
|
|
.global __dlog_partition_sizeof
|
|
.if IS_IMG_SDBL_PRESENT
|
|
__sdbl_partition_sizeof = 0x2000
|
|
.else
|
|
__sdbl_partition_sizeof = 0
|
|
.endif
|
|
|
|
__D2XX_partition_sizeof = D2XX_partition_end - D2XX_partition_start
|
|
__dlog_partition_sizeof = dlog_partition_end - dlog_partition_start
|