summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2023-01-30 22:13:14 +0700
committerGitHub <[email protected]>2023-01-30 22:13:14 +0700
commitb03a688b247e42ca161ec415ada773927a1190a5 (patch)
tree7ce4025f35d59579fea5926c610e6c4856b47f82 /hw
parent7166bb364380d436644d68541f1d905cc40cf2d1 (diff)
parent770de31dd92667f0c97fb3afbfb7726ba5e9898b (diff)
Merge pull request #1768 from ftdigdm/port-ft90x
Port ft90x
Diffstat (limited to 'hw')
-rw-r--r--hw/bsp/brtmm90x/boards/mm900evxb/board.h48
-rw-r--r--hw/bsp/brtmm90x/family.c110
-rw-r--r--hw/bsp/brtmm90x/family.mk20
m---------hw/mcu/bridgetek/ft9xx/ft90x-sdk0
4 files changed, 126 insertions, 52 deletions
diff --git a/hw/bsp/brtmm90x/boards/mm900evxb/board.h b/hw/bsp/brtmm90x/boards/mm900evxb/board.h
index 57936fda5..771779108 100644
--- a/hw/bsp/brtmm90x/boards/mm900evxb/board.h
+++ b/hw/bsp/brtmm90x/boards/mm900evxb/board.h
@@ -27,21 +27,53 @@
#ifndef BOARD_H_
#define BOARD_H_
-// Note: This definition file covers all MM900EV1B, MM900EV2B, and MM900EV3B boards.
+// Note: This definition file covers all MM900EV1B, MM900EV2B, MM900EV3B,
+// MM900EV-Lite boards.
// Each of these boards has an FT900 device.
#ifdef __cplusplus
extern "C" {
#endif
-#define GPIO_UART0_TX 48
-#define GPIO_UART0_RX 49
-#define GPIO_ETH_LED0 61
-#define GPIO_ETH_LED1 62
-#define GPIO_REMOTE_WAKEUP_PIN 18
-#define USBD_VBUS_DTC_PIN 3
+// UART to use on this board.
+#ifndef BOARD_UART
+#define BOARD_UART UART0
+#endif
+
+// UART is on connector CN1.
+#ifndef BOARD_GPIO_UART0_TX
+#define BOARD_GPIO_UART0_TX 48 // Pin 4 of CN1.
+#endif
+#ifndef BOARD_GPIO_UART0_RX
+#define BOARD_GPIO_UART0_RX 49 // Pin 6 of CN1.
+#endif
+
+// LED is connected to pins 17 (signal) and 15 (GND) of CN1.
+#ifndef BOARD_GPIO_LED
+#define BOARD_GPIO_LED 35
+#endif
+#ifndef BOARD_GPIO_LED_STATE_ON
+#define BOARD_GPIO_LED_STATE_ON 1
+#endif
+// Button is connected to pins 13 (signal) and 15 (GND) of CN1.
+#ifndef BOARD_GPIO_BUTTON
+#define BOARD_GPIO_BUTTON 56
+#endif
+// Button is pulled up and grounded for active.
+#ifndef BOARD_GPIO_BUTTON_STATE_ACTIVE
+#define BOARD_GPIO_BUTTON_STATE_ACTIVE 0
+#endif
-#define GPIO_REMOTE_WAKEUP
+// Enable the Remote Wakeup signalling.
+// Remote wakeup is wired to pin 40 of CN1.
+#ifndef BOARD_GPIO_REMOTE_WAKEUP
+#define BOARD_GPIO_REMOTE_WAKEUP 18
+#endif
+
+// USB VBus signal is connected directly to the FT900.
+#ifndef BOARD_USBD_VBUS_DTC_PIN
+#define BOARD_USBD_VBUS_DTC_PIN 3
+#endif
#ifdef __cplusplus
}
diff --git a/hw/bsp/brtmm90x/family.c b/hw/bsp/brtmm90x/family.c
index 6b3c1f56c..3b6b03904 100644
--- a/hw/bsp/brtmm90x/family.c
+++ b/hw/bsp/brtmm90x/family.c
@@ -27,15 +27,15 @@
#include "bsp/board.h"
#include "board.h"
-#include <registers/ft900_registers.h>
#include <ft900.h>
+#include <registers/ft900_registers.h>
#if CFG_TUD_ENABLED
-int8_t board_ft90x_vbus(void); // Board specific implementation of VBUS detection for USB device.
-extern void ft90x_usbd_pm_ISR(uint16_t pmcfg); // Interrupt handler for USB device power management
+int8_t board_ft9xx_vbus(void); // Board specific implementation of VBUS detection for USB device.
+extern void ft9xx_usbd_pm_ISR(uint16_t pmcfg); // Interrupt handler for USB device power management
#endif
-#ifdef GPIO_REMOTE_WAKEUP
+#ifdef BOARD_GPIO_REMOTE_WAKEUP
void gpio_ISR(void);
#endif
void timer_ISR(void);
@@ -49,12 +49,17 @@ void board_pm_ISR(void);
void board_init(void)
{
sys_reset_all();
+
// Enable the UART Device.
sys_enable(sys_device_uart0);
- // Set UART0 GPIO functions to UART0_TXD and UART0_RXD.
- gpio_function(GPIO_UART0_TX, pad_uart0_txd); /* UART0 TXD */
- gpio_function(GPIO_UART0_RX, pad_uart0_rxd); /* UART0 RXD */
- uart_open(UART0, /* Device */
+ // Set BOARD_UART GPIO function pins for TXD and RXD.
+#ifdef BOARD_GPIO_UART_TX
+ gpio_function(BOARD_GPIO_UART_TX, pad_uart0_txd); /* UART0 TXD */
+#endif
+#ifdef BOARD_GPIO_UART_RX
+ gpio_function(BOARD_GPIO_UART_RX, pad_uart0_rxd); /* UART0 RXD */
+#endif
+ uart_open(BOARD_UART, /* Device */
1, /* Prescaler = 1 */
UART_DIVIDER_19200_BAUD, /* Divider = 1302 */
uart_data_bits_8, /* No. Data Bits */
@@ -64,12 +69,17 @@ void board_init(void)
// Use sizeof to avoid pulling in strlen unnecessarily.
board_uart_write(WELCOME_MSG, sizeof(WELCOME_MSG));
-#if 0
- // Ethernet LEDs
- gpio_function(GPIO_ETH_LED0, pad_gpio4); /* ETH LED0 */
- gpio_dir(GPIO_ETH_LED0, pad_dir_open_drain);
- gpio_function(GPIO_ETH_LED1, pad_gpio5); /* ETH LED1 */
- gpio_dir(GPIO_ETH_LED1, pad_dir_output);
+#ifdef BOARD_GPIO_LED
+ gpio_function(BOARD_GPIO_LED, pad_func_0);
+ gpio_idrive(BOARD_GPIO_LED, pad_drive_12mA);
+ gpio_dir(BOARD_GPIO_LED, pad_dir_output);
+#endif
+
+#ifdef BOARD_GPIO_BUTTON
+ gpio_function(BOARD_GPIO_BUTTON, pad_func_0);
+ // Pull up if active low. Down if active high.
+ gpio_pull(BOARD_GPIO_BUTTON, (BOARD_GPIO_BUTTON_STATE_ACTIVE == 0)?pad_pull_pullup:pad_pull_pulldown);
+ gpio_dir(BOARD_GPIO_BUTTON, pad_dir_input);
#endif
sys_enable(sys_device_timer_wdt);
@@ -82,26 +92,26 @@ void board_init(void)
// Setup VBUS detect GPIO. If the device is connected then this
// will set the MASK_SYS_PMCFG_DEV_DETECT_EN bit in PMCFG.
- gpio_interrupt_disable(USBD_VBUS_DTC_PIN);
- gpio_function(USBD_VBUS_DTC_PIN, pad_vbus_dtc);
- gpio_pull(USBD_VBUS_DTC_PIN, pad_pull_pulldown);
- gpio_dir(USBD_VBUS_DTC_PIN, pad_dir_input);
+ gpio_interrupt_disable(BOARD_USBD_VBUS_DTC_PIN);
+ gpio_function(BOARD_USBD_VBUS_DTC_PIN, pad_vbus_dtc);
+ gpio_pull(BOARD_USBD_VBUS_DTC_PIN, pad_pull_pulldown);
+ gpio_dir(BOARD_USBD_VBUS_DTC_PIN, pad_dir_input);
interrupt_attach(interrupt_0, (int8_t)interrupt_0, board_pm_ISR);
-#ifdef GPIO_REMOTE_WAKEUP
- //Configuring GPIO pin to wakeup.
+#ifdef BOARD_GPIO_REMOTE_WAKEUP
+ // Configuring GPIO pin to wakeup.
// Set up the wakeup pin.
- gpio_dir(GPIO_REMOTE_WAKEUP_PIN, pad_dir_input);
- gpio_pull(GPIO_REMOTE_WAKEUP_PIN, pad_pull_pullup);
+ gpio_dir(BOARD_GPIO_REMOTE_WAKEUP, pad_dir_input);
+ gpio_pull(BOARD_GPIO_REMOTE_WAKEUP, pad_pull_pullup);
// Attach an interrupt handler.
interrupt_attach(interrupt_gpio, (uint8_t)interrupt_gpio, gpio_ISR);
- gpio_interrupt_enable(GPIO_REMOTE_WAKEUP_PIN, gpio_int_edge_falling);
+ gpio_interrupt_enable(BOARD_GPIO_REMOTE_WAKEUP, gpio_int_edge_falling);
#endif
- uart_disable_interrupt(UART0, uart_interrupt_tx);
- uart_disable_interrupt(UART0, uart_interrupt_rx);
+ uart_disable_interrupt(BOARD_UART, uart_interrupt_tx);
+ uart_disable_interrupt(BOARD_UART, uart_interrupt_rx);
// Enable all peripheral interrupts.
interrupt_enable_globally();
@@ -117,10 +127,10 @@ void timer_ISR(void)
}
}
-#ifdef GPIO_REMOTE_WAKEUP
+#ifdef BOARD_GPIO_REMOTE_WAKEUP
void gpio_ISR(void)
{
- if (gpio_is_interrupted(GPIO_REMOTE_WAKEUP_PIN))
+ if (gpio_is_interrupted(BOARD_GPIO_REMOTE_WAKEUP))
{
}
}
@@ -153,16 +163,16 @@ void board_pm_ISR(void)
)
{
#if CFG_TUD_ENABLED
- ft90x_usbd_pm_ISR(pmcfg);
+ ft9xx_usbd_pm_ISR(pmcfg);
#endif
}
#endif
}
#if CFG_TUD_ENABLED
-int8_t board_ft90x_vbus(void)
+int8_t board_ft9xx_vbus(void)
{
- return gpio_read(USBD_VBUS_DTC_PIN);
+ return gpio_read(BOARD_USBD_VBUS_DTC_PIN);
}
#endif
@@ -173,20 +183,33 @@ int8_t board_ft90x_vbus(void)
// Turn LED on or off
void board_led_write(bool state)
{
- gpio_write(GPIO_ETH_LED0, state);
+#ifdef BOARD_GPIO_LED
+ gpio_write(BOARD_GPIO_LED, (state == 0)?(BOARD_GPIO_LED_STATE_ON?0:1):BOARD_GPIO_LED_STATE_ON);
+#endif
}
// Get the current state of button
// a '1' means active (pressed), a '0' means inactive.
uint32_t board_button_read(void)
{
- return 0;
+ uint32_t state = 0;
+#ifdef BOARD_GPIO_BUTTON
+ state = (gpio_read(BOARD_GPIO_BUTTON) == BOARD_GPIO_BUTTON_STATE_ACTIVE)?1:0;
+#endif
+ return state;
}
// Get characters from UART
int board_uart_read(uint8_t *buf, int len)
{
- int r = uart_readn(UART0, (uint8_t *)buf, len);
+ int r = 0;
+
+#ifdef BOARD_UART
+ if (uart_rx_has_data(BOARD_UART))
+ {
+ r = uart_readn(BOARD_UART, (uint8_t *)buf, len);
+ }
+#endif
return r;
}
@@ -194,10 +217,14 @@ int board_uart_read(uint8_t *buf, int len)
// Send characters to UART
int board_uart_write(void const *buf, int len)
{
+ int r = 0;
+
+#ifdef BOARD_UART
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual" // uart_writen does not have const for buffer parameter.
- int r = uart_writen(UART0, (uint8_t *)((const void *)buf), len);
+ r = uart_writen(BOARD_UART, (uint8_t *)((const void *)buf), len);
#pragma GCC diagnostic pop
+#endif
return r;
}
@@ -213,3 +240,18 @@ uint32_t board_millis(void)
return safe_ms;
}
+
+// Restart the program
+// Called in the event of a watchdog timeout
+void chip_reboot(void)
+{
+ // SOFT reset
+ __asm__("call 0");
+ #if 0
+ // HARD reset
+ // Initiates data transfer from Flash Memory to Data Memory (DBG_CMDF2D3)
+ // followed by a system reboot
+ dbg_memory_copy(0xfe, 0, 0, 255);
+#endif
+}
+
diff --git a/hw/bsp/brtmm90x/family.mk b/hw/bsp/brtmm90x/family.mk
index 3933f15cc..0ddf47a3a 100644
--- a/hw/bsp/brtmm90x/family.mk
+++ b/hw/bsp/brtmm90x/family.mk
@@ -3,12 +3,12 @@ CROSS_COMPILE = ft32-elf-
SKIP_NANOLIB = 1
# Set to use FT90X prebuilt libraries.
-FT90X_PREBUILT_LIBS = 0
-ifeq ($(FT90X_PREBUILT_LIBS),1)
+FT9XX_PREBUILT_LIBS = 0
+ifeq ($(FT9XX_PREBUILT_LIBS),1)
# If the FT90X toolchain is installed on Windows systems then the SDK
# include files and prebuilt libraries are at: %FT90X_TOOLCHAIN%/hardware
FT9XX_SDK = $(FT90X_TOOLCHAIN)/hardware
-INC += $(FT9XX_SDK)/include
+INC += "$(FT9XX_SDK)/include"
else
# The submodule BRTSG-FOSS/ft90x-sdk contains header files and source
# code for the Bridgetek SDK. This can be used instead of the prebuilt
@@ -16,12 +16,12 @@ else
DEPS_SUBMODULES += hw/mcu/bridgetek/ft9xx/ft90x-sdk
# The SDK can be used to load specific files from the Bridgetek SDK.
FT9XX_SDK = hw/mcu/bridgetek/ft9xx/ft90x-sdk/Source
-INC += $(TOP)/$(FT9XX_SDK)/include
+INC += "$(TOP)/$(FT9XX_SDK)/include"
endif
# Add include files which are within the TinyUSB directory structure.
INC += \
- $(TOP)/$(BOARD_PATH)
+ $(TOP)/$(BOARD_PATH)
# Add required C Compiler flags for FT90X.
CFLAGS += \
@@ -30,14 +30,14 @@ CFLAGS += \
-fvar-tracking-assignments \
-fmessage-length=0 \
-ffunction-sections \
- -DCFG_TUSB_MCU=OPT_MCU_FT90X
+ -DCFG_TUSB_MCU=OPT_MCU_FT90X
+
+# Maximum USB device speed supported by the board
+CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED
# lwip/src/core/raw.c:334:43: error: declaration of 'recv' shadows a global declaration
CFLAGS += -Wno-error=shadow
-# Add include files outside the TinyUSB structure that are added manually.
-CFLAGS += -I"$(FT9XX_SDK)/include"
-
# Set Linker flags.
LD_FILE = hw/mcu/bridgetek/ft9xx/scripts/ldscript.ld
LDFLAGS += $(addprefix -L,$(LDINC)) \
@@ -48,7 +48,7 @@ LDFLAGS += $(addprefix -L,$(LDINC)) \
SRC_C += src/portable/bridgetek/ft9xx/dcd_ft9xx.c
# Linker library.
-ifneq ($(FT90X_PREBUILT_LIBS),1)
+ifneq ($(FT9XX_PREBUILT_LIBS),1)
# Optionally add in files from the Bridgetek SDK instead of the prebuilt
# library. These are the minimum required.
SRC_C += $(FT9XX_SDK)/src/sys.c
diff --git a/hw/mcu/bridgetek/ft9xx/ft90x-sdk b/hw/mcu/bridgetek/ft9xx/ft90x-sdk
-Subproject e8122eb6bd6286a1fe31f175a3e3eb0e7770c3e
+Subproject 91060164afe239fcb394122e8bf9eb24d3194eb