Add initial port for FT9xx series from Bridgetek.
Add FT90X and FT93X to the list of devices in tusb_option.h. 1700 for FT90x and 1701 for FT93x. Set endpoint attributes for FT90x and FT93x in dcd_attr.h. Add FT90x routines for USB device in src/portable/bridgetek/ft90x/dcd_ft90x.c The location for hardware header files and libraries is hw/mcu/bridgetek/ft90x/hardware. There are no files in the repository, but files will be linked as a submodule in the future. The required files can be copied from or linked to the location "C:/Program Files(x86)/Bridgetek/FT9xx Toolchain/Toolchain/hardware" once the toolchain is installed. Makefile for the MM900EV1B board for developing with an FT900 device is present. Use "BOARD=mm900ev1b".
This commit is contained in:
6
hw/mcu/bridgetek/ft90x/Readme.md
Normal file
6
hw/mcu/bridgetek/ft90x/Readme.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# BridgeTek FT9xx MCU
|
||||
|
||||
**BridgeTek** provides a hardware abstraction library with software source code for the SDKs for FT9xx software family.
|
||||
The pre-built libraries and the source code can be redistributed.
|
||||
Registers definition files `<sdk>/include/registers/ft900_registers.h` and included peripheral register definition files have licenses that allow for redistribution.
|
||||
Whole SDK repository is installed as part of the FT9xx Toolchain and can be downloaded from BridgeTek web page `https://www.brtchip.com`
|
286
hw/mcu/bridgetek/ft90x/hardware/scripts/crt0.S
Normal file
286
hw/mcu/bridgetek/ft90x/hardware/scripts/crt0.S
Normal file
@@ -0,0 +1,286 @@
|
||||
.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
|
94
hw/mcu/bridgetek/ft90x/hardware/scripts/ldscript.ld
Normal file
94
hw/mcu/bridgetek/ft90x/hardware/scripts/ldscript.ld
Normal file
@@ -0,0 +1,94 @@
|
||||
/* Default linker script, for normal executables */
|
||||
OUTPUT_FORMAT("elf32-ft32")
|
||||
OUTPUT_ARCH(ft32)
|
||||
SEARCH_DIR("/data/win8/ft32/ft32-elf/lib");
|
||||
/* Allow the command line to override the memory region sizes. */
|
||||
__PMSIZE = DEFINED(__PMSIZE) ? __PMSIZE : 256K;
|
||||
__RAMSIZE = DEFINED(__RAMSIZE) ? __RAMSIZE : 64K;
|
||||
MEMORY
|
||||
{
|
||||
flash (rx) : ORIGIN = 0, LENGTH = __PMSIZE
|
||||
ram (rw!x) : ORIGIN = 0x800000, LENGTH = __RAMSIZE
|
||||
}
|
||||
SECTIONS
|
||||
{
|
||||
.text :
|
||||
{
|
||||
*(.text*)
|
||||
*(.strings)
|
||||
*(._pm*)
|
||||
*(.init)
|
||||
*(.fini)
|
||||
_etext = . ;
|
||||
. = ALIGN(4);
|
||||
} > flash
|
||||
.tors :
|
||||
{
|
||||
___ctors = . ;
|
||||
*(.ctors)
|
||||
___ctors_end = . ;
|
||||
___dtors = . ;
|
||||
*(.dtors)
|
||||
___dtors_end = . ;
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
.data : AT (ADDR (.text) + SIZEOF (.text))
|
||||
{
|
||||
*(.data)
|
||||
*(.data*)
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
_edata = . ;
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
.bss SIZEOF(.data) + ADDR(.data) :
|
||||
{
|
||||
_bss_start = . ;
|
||||
*(.bss)
|
||||
*(.bss*)
|
||||
*(COMMON)
|
||||
_end = . ;
|
||||
. = ALIGN(4);
|
||||
} > ram
|
||||
__data_load_start = LOADADDR(.data);
|
||||
__data_load_end = __data_load_start + SIZEOF(.data);
|
||||
.stab 0 (NOLOAD) :
|
||||
{
|
||||
*(.stab)
|
||||
}
|
||||
.stabstr 0 (NOLOAD) :
|
||||
{
|
||||
*(.stabstr)
|
||||
}
|
||||
/* 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_line.* .debug_line_end ) }
|
||||
.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) }
|
||||
/* DWARF 3 */
|
||||
.debug_pubtypes 0 : { *(.debug_pubtypes) }
|
||||
.debug_ranges 0 : { *(.debug_ranges) }
|
||||
/* DWARF Extension. */
|
||||
.debug_macro 0 : { *(.debug_macro) }
|
||||
.debug_addr 0 : { *(.debug_addr) }
|
||||
}
|
Reference in New Issue
Block a user