/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#ifndef H_BSP_H
#define H_BSP_H

#include <inttypes.h>
#include <stm32f7xx_hal_gpio_ex.h>
#include <mcu/mcu.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Define special stackos sections */
#define sec_data_core   __attribute__((section(".data.core")))
#define sec_bss_core    __attribute__((section(".bss.core")))
#define sec_noinit      __attribute__((section(".noinit")))

/* More convenient section placement macros. */
#define bssnz_t sec_noinit

extern uint8_t _ram_start[];
extern uint8_t _dtcm_start[];
extern uint8_t _itcm_start[];
extern uint8_t _ram2_start[];

#define RAM_SIZE        (240 * 1024)
#define RAM2_SIZE       (16 * 1024)
#define DTCM_SIZE       (64 * 1024)
#define ITCM_SIZE       (16 * 1024)

/* LED pins */
#define LED_BLINK_PIN   MCU_GPIO_PORTI(1)

/* Button pin */
#define BUTTON_1 MCU_GPIO_PORTI(11)

/* Arduino pins */
#define ARDUINO_PIN_D0  MCU_GPIO_PORTD(0)
#define ARDUINO_PIN_D1  MCU_GPIO_PORTC(6)
#define ARDUINO_PIN_D2  MCU_GPIO_PORTG(6)
#define ARDUINO_PIN_D3  MCU_GPIO_PORTB(4)
#define ARDUINO_PIN_D4  MCU_GPIO_PORTG(7)
#define ARDUINO_PIN_D5  MCU_GPIO_PORTI(0)
#define ARDUINO_PIN_D6  MCU_GPIO_PORTH(6)
#define ARDUINO_PIN_D7  MCU_GPIO_PORTI(3)
#define ARDUINO_PIN_D8  MCU_GPIO_PORTI(2)
#define ARDUINO_PIN_D9  MCU_GPIO_PORTA(15)
#define ARDUINO_PIN_D10 MCU_GPIO_PORTA(8)
#define ARDUINO_PIN_D11 MCU_GPIO_PORTB(15)
#define ARDUINO_PIN_D12 MCU_GPIO_PORTB(14)
#define ARDUINO_PIN_D13 MCU_GPIO_PORTI(1)
#define ARDUINO_PIN_D14 MCU_GPIO_PORTB(9)
#define ARDUINO_PIN_D15 MCU_GPIO_PORTB(8)
#define ARDUINO_PIN_A0  MCU_GPIO_PORTA(0)
#define ARDUINO_PIN_A1  MCU_GPIO_PORTF(10)
#define ARDUINO_PIN_A2  MCU_GPIO_PORTF(9)
#define ARDUINO_PIN_A3  MCU_GPIO_PORTF(8)
#define ARDUINO_PIN_A4  MCU_GPIO_PORTF(7)
#define ARDUINO_PIN_A5  MCU_GPIO_PORTF(6)

#define ARDUINO_PIN_RX ARDUINO_PIN_D0
#define ARDUINO_PIN_TX ARDUINO_PIN_D1

#define ARDUINO_PIN_SCL ARDUINO_PIN_D15
#define ARDUINO_PIN_SDA ARDUINO_PIN_D14

#define ARDUINO_PIN_SCK  ARDUINO_PIN_D13
#define ARDUINO_PIN_MOSI ARDUINO_PIN_D11
#define ARDUINO_PIN_MISO ARDUINO_PIN_D12

#define LCD_BL_CTRL_PIN MCU_GPIO_PORTK(3)

#define VCP_TX_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTA(9), GPIO_AF7_USART1)
#define VCP_RX_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTA(10), GPIO_AF7_USART1)

#define uSD_Detect_PIN MCU_GPIO_PORTC(13)
#define SDMMC_CK_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(12), GPIO_AF12_SDMMC1)
#define SDMMC_CMD_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTD(2), GPIO_AF12_SDMMC1)
#define SDMMC_D0_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(8), GPIO_AF12_SDMMC1)
#define SDMMC_D1_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(9), GPIO_AF12_SDMMC1)
#define SDMMC_D2_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(10), HAL_AF12_SDMMC1)
#define SDMMC_D3_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(11), HAL_AF12_SDMMC1)

#define SAI_MCLK_A_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTI(4), 12)
#define SAI2_SD_B_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTG(10), 12)
#define SAI2_SCK_A_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTI(5), 12)
#define SAI2_FS_A_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTI(7), 12)
#define SAI2_SD_A_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTI(6), 12)

#define QUADSPI_CLK_PIN     MCU_AFIO_GPIO(MCU_GPIO_PORTB(2), GPIO_AF9_QUADSPI)
#define QUADSPI_BKS_NCS_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTB(6), GPIO_AF10_QUADSPI)
#define QUADSPI_BK1_IO0_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(11), GPIO_AF9_QUADSPI)
#define QUADSPI_BK1_IO1_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(12), GPIO_AF9_QUADSPI)
#define QUADSPI_BK1_IO2_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTE(2), GPIO_AF9_QUADSPI)
#define QUADSPI_BK1_IO3_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(13), GPIO_AF9_QUADSPI)

#define OTG_FS_OverCurrent_PIN       MCU_GPIO_PORTD(4)
#define USB_OTG_FS_DP_PIN            MCU_AFIO_GPIO(MCU_GPIO_PORTA(12), GPIO_AF12_USB_FS)
#define USB_OTG_FS_DM_PIN            MCU_AFIO_GPIO(MCU_GPIO_PORTA(11), GPIO_AF12_USB_FS)
#define USB_OTG_FS_VBUS_PIN          MCU_AFIO_GPIO(MCU_GPIO_PORTJ(12), GPIO_AF12_USB_FS)
#define USB_OTG_FS_ID_PIN            MCU_AFIO_GPIO(MCU_GPIO_PORTA(10), GPIO_AF12_USB_FS)
#define USB_OTG_FS_PowerSwitchON_PIN MCU_GPIO_PORTD(5)

#define OTG_HS_OverCurrent_PIN   MCU_GPIO_PORTE(3)
#define USB_OTG_HS_ULPI_CK_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTA(5), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_STP_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTC(0), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_NEXT_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTH(4), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_DIR_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTC(2), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D0_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTA(3), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D1_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(0), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D2_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(1), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D3_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(10), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D4_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(11), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D5_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(12), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D6_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(13), GPIO_AF10_USB_HS)
#define USB_OTG_HS_ULPI_D7_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTB(5), GPIO_AF10_USB_HS)

#define ETH_TX_EN_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTG(11), GPIO_AF11_ETH)
#define ETH_MDC_PIN     MCU_AFIO_GPIO(MCU_GPIO_PORTC(1), GPIO_AF11_ETH)
#define ETH_MDIO_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTA(2), GPIO_AF11_ETH)
#define ETH_REF_CLK_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTA(1), GPIO_AF11_ETH)
#define ETH_CRS_DV_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTA(7), GPIO_AF11_ETH)
#define ETH_RXD0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTC(4), GPIO_AF11_ETH)
#define ETH_RXD1_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTC(5), GPIO_AF11_ETH)
#define ETH_TXD0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTG(13), GPIO_AF11_ETH)
#define ETH_TXD1_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTG(14), GPIO_AF11_ETH)
#define RMII_RXER_PIN   MCU_GPIO_PORTG(14)

#define I2C3_SCL MCU_AFIO_GPIO(MCU_GPIO_PORTH(7), GPIO_AF4_I2C3)
#define I2C3_SDA MCU_AFIO_GPIO(MCU_GPIO_PORTH(8), GPIO_AF4_I2C3)

#define FMC_SDNRAS_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTF(11), GPIO_AF12_FMC)
#define FMC_SDNCAS_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTG(15), GPIO_AF12_FMC)
#define FMC_SDCLK_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTG(8), GPIO_AF12_FMC)
#define FMC_SDNWE_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTH(5), GPIO_AF12_FMC)
#define FMC_SDNE0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTH(3), GPIO_AF12_FMC)
#define FMC_SDCKE0_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTC(3), GPIO_AF12_FMC)
#define FMC_NBL0_PIN     MCU_AFIO_GPIO(MCU_GPIO_PORTE(0), GPIO_AF12_FMC)
#define FMC_NBL1_PIN     MCU_AFIO_GPIO(MCU_GPIO_PORTE(1), GPIO_AF12_FMC)
#define FMC_NBL2_PIN     MCU_AFIO_GPIO(MCU_GPIO_PORTG(), GPIO_AF12_FMC)
#define FMC_A0_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(0), GPIO_AF12_FMC)
#define FMC_A1_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(1), GPIO_AF12_FMC)
#define FMC_A3_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(3), GPIO_AF12_FMC)
#define FMC_A4_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(4), GPIO_AF12_FMC)
#define FMC_A5_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(5), GPIO_AF12_FMC)
#define FMC_A6_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(12), GPIO_AF12_FMC)
#define FMC_A7_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(13), GPIO_AF12_FMC)
#define FMC_A8_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(14), GPIO_AF12_FMC)
#define FMC_A9_PIN       MCU_AFIO_GPIO(MCU_GPIO_PORTF(15), GPIO_AF12_FMC)
#define FMC_A10_PIN      MCU_AFIO_GPIO(MCU_GPIO_PORTG(0), GPIO_AF12_FMC)
#define FMC_A11_PIN      MCU_AFIO_GPIO(MCU_GPIO_PORTG(1), GPIO_AF12_FMC)
#define FMC_A14_BA0_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTG(4), GPIO_AF12_FMC)
#define FMC_A15_BA1_PIN  MCU_AFIO_GPIO(MCU_GPIO_PORTG(5), GPIO_AF12_FMC)
#define FMC_D0_DA0_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTD(14), GPIO_AF12_FMC)
#define FMC_D1_DA1_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTD(15), GPIO_AF12_FMC)
#define FMC_D2_DA2_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTD(0), GPIO_AF12_FMC)
#define FMC_D3_DA3_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTD(1), GPIO_AF12_FMC)
#define FMC_D4_DA4_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTE(7), GPIO_AF12_FMC)
#define FMC_D5_DA5_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTE(8), GPIO_AF12_FMC)
#define FMC_D6_DA6_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTE(9), GPIO_AF12_FMC)
#define FMC_D7_DA7_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTE(10), GPIO_AF12_FMC)
#define FMC_D8_DA8_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTE(11), GPIO_AF12_FMC)
#define FMC_D11_DA11_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTE(14), GPIO_AF12_FMC)
#define FMC_D13_DA13_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(8), GPIO_AF12_FMC)
#define FMC_D14_DA14_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(9), GPIO_AF12_FMC)
#define FMC_D15_DA15_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(10), GPIO_AF12_FMC)

#define LCD_DISP_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTI(12), GPIO_AF14_LTDC)
#define LTDC_CLK_PIN   MCU_AFIO_GPIO(MCU_GPIO_PORTI(14), GPIO_AF14_LTDC)
#define LTDC_R0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTI(15), GPIO_AF14_LTDC)
#define LTDC_R1_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(0), GPIO_AF14_LTDC)
#define LTDC_R2_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(1), GPIO_AF14_LTDC)
#define LTDC_R3_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(2), GPIO_AF14_LTDC)
#define LTDC_R4_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(3), GPIO_AF14_LTDC)
#define LTDC_R5_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(4), GPIO_AF14_LTDC)
#define LTDC_R6_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(5), GPIO_AF14_LTDC)
#define LTDC_R7_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(6), GPIO_AF14_LTDC)
#define LTDC_G0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(7), GPIO_AF14_LTDC)
#define LTDC_G1_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(8), GPIO_AF14_LTDC)
#define LTDC_G2_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(9), GPIO_AF14_LTDC)
#define LTDC_G3_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(10), GPIO_AF14_LTDC)
#define LTDC_G4_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(11), GPIO_AF14_LTDC)
#define LTDC_G5_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(0), GPIO_AF14_LTDC)
#define LTDC_G6_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(1), GPIO_AF14_LTDC)
#define LTDC_G7_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(2), GPIO_AF14_LTDC)
#define LTDC_B0_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTE(4), GPIO_AF14_LTDC)
#define LTDC_B1_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(13), GPIO_AF14_LTDC)
#define LTDC_B2_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(14), GPIO_AF14_LTDC)
#define LTDC_B3_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTJ(15), GPIO_AF14_LTDC)
#define LTDC_B4_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTG(12), GPIO_AF14_LTDC)
#define LTDC_B5_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(4), GPIO_AF14_LTDC)
#define LTDC_B6_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(5), GPIO_AF14_LTDC)
#define LTDC_B7_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(6), GPIO_AF14_LTDC)
#define LTDC_DE_PIN    MCU_AFIO_GPIO(MCU_GPIO_PORTK(7), GPIO_AF14_LTDC)
#define LTDC_HSYNC_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTI(10), GPIO_AF14_LTDC)
#define LTDC_VSYNC_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTI(9), GPIO_AF14_LTDC)

#define SPDIF_RX0_PIN MCU_AFIO_GPIO(MCU_GPIO_PORTD(7), GPIO_AF8_SPDIFRX)

#define AUDIO_INT_PIN MCU_GPIO_PORTD(6)

#ifdef __cplusplus
}
#endif

#endif  /* H_BSP_H */
