MXC-A36-Demo/MCU/examples/turnkey/lvgl_Dashboard_8080/Src/app_hw.c

1117 lines
39 KiB
C
Raw Normal View History

/*
* 1. AT command and log: UART3
* 2. HCI interface: UART0, GPIO_PMU, handled by host.c.
* 3. Display: DMA1, SPIx8_0, GPIO (for cs)
* 4. Touchpad: I2C3
* 5. PSRAM: OSPI
* 6. external Flash: DMA0, SPIx8_1
* 7. DSP: IPC, RPMSG
* 8. DSP XIP Flash: QSPI1
* 9. Sensors: handled by 1010
* 10. System clock, XIP Flash: handled by sleep procedure
*/
#include "fr30xx.h"
#include "driver_display.h"
#include "driver_touchpad.h"
#include "driver_psram.h"
#include "IC_W25Qxx.h"
#include "ext_flash.h"
#include "app_config.h"
#include "app_hw.h"
PARALLEL_HandTypeDef hparallel;
struct hw_gpio_state_t {
uint16_t PortA_PullEN;
uint16_t PortB_PullEN;
uint16_t PortC_PullEN;
uint16_t PortD_PullEN;
uint16_t PortA_PullSelect;
uint16_t PortB_PullSelect;
uint16_t PortC_PullSelect;
uint16_t PortD_PullSelect;
uint32_t PortA_PullResCfg;
uint32_t PortB_PullResCfg;
uint32_t PortC_PullResCfg;
uint32_t PortD_PullResCfg;
uint32_t PortA_DriveCfg;
uint32_t PortB_DriveCfg;
uint32_t PortC_DriveCfg;
uint32_t PortD_DriveCfg;
uint32_t PortA_L_FuncMux;
uint32_t PortA_H_FuncMux;
uint32_t PortB_L_FuncMux;
uint32_t PortB_H_FuncMux;
uint32_t PortC_L_FuncMux;
uint32_t PortC_H_FuncMux;
uint32_t PortD_L_FuncMux;
uint32_t PortD_H_FuncMux;
uint32_t QSPI_PullSelect;
uint32_t QSPI_PullEN;
uint32_t OSPI_PullSelect;
uint32_t OSPI_PullEN;
uint16_t GPIOA_OutputEN;
uint16_t GPIOA_OUT_DATA;
uint16_t GPIOA_EXTI_EN;
uint16_t GPIOA_EXTI_INT_EN;
uint32_t GPIOA_EXTI_TYPE;
uint16_t GPIOB_OutputEN;
uint16_t GPIOB_OUT_DATA;
uint16_t GPIOB_EXTI_EN;
uint16_t GPIOB_EXTI_INT_EN;
uint32_t GPIOB_EXTI_TYPE;
uint16_t GPIOC_OutputEN;
uint16_t GPIOC_OUT_DATA;
uint16_t GPIOC_EXTI_EN;
uint16_t GPIOC_EXTI_INT_EN;
uint32_t GPIOC_EXTI_TYPE;
uint16_t GPIOD_OutputEN;
uint16_t GPIOD_OUT_DATA;
uint16_t GPIOD_EXTI_EN;
uint16_t GPIOD_EXTI_INT_EN;
uint32_t GPIOD_EXTI_TYPE;
};
static struct hw_gpio_state_t gpio_state;
UART_HandleTypeDef uart_log_handle;
DMA_HandleTypeDef dma_display_handle;
SPI_HandleTypeDef spi_display_handle;
I2C_HandleTypeDef i2c_touchpad_handle;
SPI_HandleTypeDef spi_flash_handle;
DMA_HandleTypeDef dma_flash_handle;
void app_at_rx_done(struct __UART_HandleTypeDef *handle);
void display_cs_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
}
void display_cs_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_5, GPIO_PIN_CLEAR);
}
#if BOARD_SEL == BOARD_EVB_FR5090
void display_reset_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
}
void display_reset_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR);
}
void display_vci_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
}
void display_vci_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR);
}
bool display_te_status(void)
{
return 1;
}
#elif BOARD_SEL == BOARD_EVB_FR3092E
void display_reset_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET);//2014.1.16 by hsp
//extern void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data);
//uint8_t cmd = GPIO_PIN_7; //bit7 = BT_PA7 bit6 = BT_PA6 bit5 = BT_PA5 bit4 = BT_PA4
//btdm_host_send_vendor_cmd(0x18, 1, &cmd);
}
void display_reset_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_11, GPIO_PIN_CLEAR);//2014.1.16 by hsp
//extern void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data);
//uint8_t cmd = GPIO_PIN_7; //bit7 = BT_PA7 bit6 = BT_PA6 bit5 = BT_PA5 bit4 = BT_PA4
//btdm_host_send_vendor_cmd(0x18, 1, &cmd);
}
void display_vci_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
void display_vci_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
bool display_te_status(void)
{
return gpio_read_pin(GPIOC, GPIO_PIN_7);
}
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
void display_reset_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
}
void display_reset_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR);
}
void display_vci_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
}
void display_vci_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR);
}
bool display_te_status(void)
{
return gpio_read_pin(GPIOB, GPIO_PIN_15);
}
#elif BOARD_SEL == BOARD_EVB_FR3092E
void display_reset_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
}
void display_reset_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_6, GPIO_PIN_CLEAR);
}
void display_vci_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
void display_vci_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
bool display_te_status(void)
{
return gpio_read_pin(GPIOC, GPIO_PIN_7);
}
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
void display_reset_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
}
void display_reset_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_14, GPIO_PIN_CLEAR);
}
void display_vci_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
}
void display_vci_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_13, GPIO_PIN_CLEAR);
}
bool display_te_status(void)
{
return gpio_read_pin(GPIOB, GPIO_PIN_15);
}
#else
#error "choose correct board"
#endif
void display_delay_ms(uint32_t counter)
{
system_delay_us(counter * 1000);
}
#if BOARD_SEL == BOARD_EVB_FR5090
void touchpad_reset_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
void touchpad_reset_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
#elif BOARD_SEL == BOARD_EVB_FR3092E
#if 1 //DISPLAY_TYPE_ICNA3310
void touchpad_reset_set(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
}
void touchpad_reset_clear(void)
{
gpio_write_pin(GPIOB, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
#else
void touchpad_reset_set(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
}
void touchpad_reset_clear(void)
{
gpio_write_pin(GPIOA, GPIO_PIN_6, GPIO_PIN_CLEAR);
}
#endif
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
void touchpad_reset_set(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
void touchpad_reset_clear(void)
{
gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
void touchpad_reset_set(void)
{
//gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET);
}
void touchpad_reset_clear(void)
{
//gpio_write_pin(GPIOC, GPIO_PIN_15, GPIO_PIN_CLEAR);
}
#else
#error "choose correct board"
#endif
void touchpad_delay_ms(uint32_t counter)
{
system_delay_us(counter * 1000);
}
__RAM_CODE void hw_log_init(bool wake_up)
{
if (wake_up == false) {
GPIO_InitTypeDef gpio_config;
/* ========================================================== */
/* ========= Uart LOG configuration ========= */
/* ========================================================== */
/* configure PB4 and PB5 to UART3 function */
gpio_config.Pin = GPIO_PIN_4 | GPIO_PIN_5;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_1;
gpio_init(GPIOB, &gpio_config);
__SYSTEM_UART3_CLK_ENABLE();
/* UART3: used for Log and AT command */
uart_log_handle.UARTx = UART3;
uart_log_handle.Init.BaudRate = 921600;
uart_log_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
uart_log_handle.Init.StopBits = UART_STOPBITS_1;
uart_log_handle.Init.Parity = UART_PARITY_NONE;
uart_log_handle.Init.FIFO_Mode = UART_FIFO_ENABLE;
uart_log_handle.TxCpltCallback = NULL;
uart_log_handle.RxCpltCallback = app_at_rx_done;
uart_init(&uart_log_handle);
NVIC_EnableIRQ(UART3_IRQn);
}
else {
__SYSTEM_UART3_CLK_ENABLE();
uart_init(&uart_log_handle);
__UART_INT_RX_ENABLE(uart_log_handle.UARTx);
NVIC_EnableIRQ(UART3_IRQn);
}
}
__RAM_CODE void hw_display_init(bool wake_up)
{
if (wake_up == false) {
GPIO_InitTypeDef gpio_config;
#if 0
/* ========================================================== */
/* ========= Display interface configuration ========= */
/* ========================================================== */
/* config DMA1 for display */
__SYSTEM_DMA1_CLK_ENABLE();
dma_display_handle.DMAx = DMA1;
dma_display_handle.Channel = DMA_Channel0;
dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC;
dma_display_handle.Init.Request_ID = 2;
system_dmac_request_id_config(SPIMX8_0_TX, DMA1_REQUEST_ID_2);
dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_2;
dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4;
dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4;
dma_init(&dma_display_handle);
NVIC_EnableIRQ(DMA1_IRQn);
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
/* configure C0, C1, C2, C3, C4 to SPIx8_0 function */
gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_5;
gpio_init(GPIOC, &gpio_config);
/* configure C5 to CS function */
gpio_config.Pin = GPIO_PIN_5;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
#endif
__SYSTEM_PARALLEL_CLK_ENABLE();
__SYSTEM_PARALLEL_CLK_SELECT_SPLL();
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
__SYSTEM_DMA0_CLK_ENABLE();
__SYSTEM_DMA1_CLK_ENABLE();
static GPIO_InitTypeDef GPIO_Handle;
GPIO_Handle.Alternate = GPIO_FUNCTION_8;
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = 0xffff;//0xffff; //DB0-DB7
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(GPIOC, &GPIO_Handle);
GPIO_Handle.Alternate = GPIO_FUNCTION_8;// csx wrx rdx dcx PB12-PB15
GPIO_Handle.Mode = GPIO_MODE_AF_PP;
GPIO_Handle.Pin = GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_15;;
GPIO_Handle.Pull = GPIO_PULLUP;
gpio_init(GPIOB, &GPIO_Handle);
/* PARALLEL Init */
hparallel.PARALLELx = PARALLEL0;
//hparallel.Init.DataBusSelect = DATA_BUS_8_BIT;
hparallel.Init.DataBusSelect = DATA_BUS_16_BIT;
hparallel.Init.ParallelMode = MODE_8080;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 0;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 1;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 2;
hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 3; //16bit
// hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_0 = 3;
// hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_1 = 2;
// hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_2 = 1;
// hparallel.PARALLELx->DATA_CFG.DATA_TRANS_SEQ_3 = 0; //8bit swap
hparallel.PARALLELx->CRM.WRITE_CLK_CFG = 1;
hparallel.PARALLELx->CRM.READ_CLK_CFG = 1;
hparallel.Init.ReadClock = RDCLK_DIV_4;
hparallel.Init.WriteClock = WDCLK_DIV_8;
parallel_init(&hparallel);
__PARALLEL_CS_SET(hparallel.PARALLELx);
//__PARALLEL_CS_RELEASE(hparallel.PARALLELx);
/* DMA Init */
#if 1
system_dmac_request_id_config(PARALLEL_INTERFACE,DMA1_REQUEST_ID_2);
dma_display_handle.DMAx = DMA1;
dma_display_handle.Channel = DMA_Channel1;
dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC;
dma_display_handle.Init.Request_ID = DMA1_REQUEST_ID_2;
dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_2;
dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16;
dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16;
dma_init(&dma_display_handle);
NVIC_ClearPendingIRQ(DMA1_IRQn);
NVIC_EnableIRQ(DMA1_IRQn);
#else
system_dmac_request_id_config(PARALLEL_INTERFACE,DMA0_REQUEST_ID_3);
dma_display_handle.DMAx = DMA0;
dma_display_handle.Channel = DMA_Channel2;
dma_display_handle.Init.Data_Flow = DMA_M2P_DMAC;
dma_display_handle.Init.Request_ID = DMA0_REQUEST_ID_3;
dma_display_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_3;
dma_display_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_1;
dma_display_handle.Init.Source_Inc = DMA_ADDR_INC_INC;
dma_display_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_display_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_display_handle.Init.Source_Burst_Len = DMA_BURST_LEN_16;
dma_display_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_16;
dma_init(&dma_display_handle);
NVIC_ClearPendingIRQ(DMA0_IRQn);
NVIC_EnableIRQ(DMA0_IRQn);
#endif
#if BOARD_SEL == BOARD_EVB_FR5090
/* configure B13, PB14 to VCCI function, RESET function */
gpio_config.Pin = GPIO_PIN_13 | GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
#elif BOARD_SEL == BOARD_EVB_FR3092E
#if 0
/* configure PC15, PC6 to VCCI function, RESET function n*/
gpio_config.Pin = GPIO_PIN_6 | GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC7 to TE functio(interrupt pin) */
gpio_config.Pin = GPIO_PIN_7;
gpio_config.Mode = GPIO_MODE_INPUT;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLDOWN;
gpio_init(GPIOC, &gpio_config);
#endif
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
/* configure B13, PB14 to VCCI function, RESET function */
gpio_config.Pin = GPIO_PIN_13 | GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
/* configure GPIO_PB15 to TE functio(interrupt pin) */
gpio_config.Pin = GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_INPUT;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLDOWN;
gpio_init(GPIOB, &gpio_config);
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
/* configure PC15, PC6 to VCCI function, RESET function n*/
gpio_config.Pin = GPIO_PIN_6 | GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC7 to TE functio(interrupt pin) */
gpio_config.Pin = GPIO_PIN_7;
gpio_config.Mode = GPIO_MODE_INPUT;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLDOWN;
gpio_init(GPIOC, &gpio_config);
#else
#error "choose correct board"
#endif
#if 0
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
spi_display_handle.SPIx = SPIMX8_0;
spi_display_handle.Init.Work_Mode = SPI_WORK_MODE_0;
spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
#if BOARD_SEL == BOARD_EVB_FR5090
spi_display_handle.Init.BaudRate_Prescaler = 2;
#elif BOARD_SEL == BOARD_EVB_FR3092E
spi_display_handle.Init.BaudRate_Prescaler = 4;
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
spi_display_handle.Init.BaudRate_Prescaler = 4;
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
spi_display_handle.Init.BaudRate_Prescaler = 4;
#else
#error "choose correct board"
#endif
spi_display_handle.Init.TxFIFOEmpty_Threshold = 20;
spi_display_handle.Init.RxFIFOFull_Threshold = 0;
spi_master_init(&spi_display_handle);
display_cs_set();
display_init();
#endif
gpio_config.Pin = GPIO_PIN_11|GPIO_PIN_3;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
display_reset_set();
system_delay_us(10000);
display_reset_clear();
system_delay_us(20000);
display_reset_set();
system_delay_us(50000);
display_init();
}
else {
// __SYSTEM_DMA1_CLK_ENABLE();
// system_dmac_request_id_config(SPIMX8_0_TX, DMA1_REQUEST_ID_2);
// dma_init(&dma_display_handle);
// NVIC_EnableIRQ(DMA1_IRQn);
//
// __SYSTEM_GPIOB_CLK_ENABLE();
// __SYSTEM_GPIOC_CLK_ENABLE();
// __SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
// spi_display_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
// spi_master_init(&spi_display_handle);
}
}
__RAM_CODE void hw_touchpad_init(bool wake_up)
{
if (wake_up == false) {
GPIO_InitTypeDef gpio_config;
/* ========================================================== */
/* ========= TP configuration ========= */
/* ========================================================== */
__SYSTEM_GPIOC_CLK_ENABLE();
#if BOARD_SEL == BOARD_EVB_FR5090
/* configure GPIO_PC6 and GPIO_PC7 to I2C3 mode */
gpio_config.Pin = GPIO_PIN_6|GPIO_PIN_7;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_3;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC15 to reset pin */
gpio_config.Pin = GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC14 to interrupt pin */
gpio_config.Pin = GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLUP;
gpio_init(GPIOC, &gpio_config);
#elif BOARD_SEL == BOARD_EVB_FR3092E
#if 1 //DISPLAY_TYPE_ICNA3310
/* configure GPIO_PB12 and GPIO_PB13 to I2C2 mode */
gpio_config.Pin = GPIO_PIN_12|GPIO_PIN_13;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_3;
gpio_init(GPIOB, &gpio_config);
/* configure GPIO_PB15 to reset pin */
gpio_config.Pin = GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
/* configure GPIO_PB14 to interrupt pin */
gpio_config.Pin = GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLUP;
gpio_init(GPIOB, &gpio_config);
exti_interrupt_enable(GPIOB,EXTI_LINE_14);
exti_clear_LineStatus(GPIOB,EXTI_LINE_14);
NVIC_EnableIRQ(GPIOB_IRQn);
#else
/* configure GPIO_PA4 and GPIO_PA5 to I2C2 mode */
gpio_config.Pin = GPIO_PIN_4|GPIO_PIN_5;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_3;
gpio_init(GPIOA, &gpio_config);
__SYSTEM_GPIOA_CLK_ENABLE();
/* configure GPIO_PA6 to reset pin */
gpio_config.Pin = GPIO_PIN_6;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOA, &gpio_config);
__SYSTEM_GPIOB_CLK_ENABLE();
/* configure GPIO_PB14 to interrupt pin */
gpio_config.Pin = GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLUP;
gpio_init(GPIOB, &gpio_config);
#endif
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
/* configure GPIO_PC6 and GPIO_PC7 to I2C3 mode */
gpio_config.Pin = GPIO_PIN_6|GPIO_PIN_7;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_3;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC15 to reset pin */
gpio_config.Pin = GPIO_PIN_15;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
/* configure GPIO_PC14 to interrupt pin */
gpio_config.Pin = GPIO_PIN_14;
gpio_config.Mode = GPIO_MODE_EXTI_IT_FALLING;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_config.Pull = GPIO_PULLUP;
gpio_init(GPIOC, &gpio_config);
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
#else
#error "choose correct board"
#endif
/* I2C Init */
#if BOARD_SEL == BOARD_EVB_FR5090
__SYSTEM_I2C3_CLK_ENABLE();
i2c_touchpad_handle.I2Cx = I2C3;
i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT;
i2c_touchpad_handle.Init.SCL_HCNT = 220;
i2c_touchpad_handle.Init.SCL_LCNT = 230;
#elif BOARD_SEL == BOARD_EVB_FR3092E
__SYSTEM_I2C2_CLK_ENABLE();
i2c_touchpad_handle.I2Cx = I2C2;
i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT;
i2c_touchpad_handle.Init.SCL_HCNT = 220;
i2c_touchpad_handle.Init.SCL_LCNT = 230;
#elif BOARD_SEL == BOARD_EVB_FR3092E_CM
__SYSTEM_I2C3_CLK_ENABLE();
i2c_touchpad_handle.I2Cx = I2C3;
i2c_touchpad_handle.Init.I2C_Mode = I2C_MODE_MASTER_7BIT;
i2c_touchpad_handle.Init.SCL_HCNT = 90;
i2c_touchpad_handle.Init.SCL_LCNT = 90;
#elif BOARD_SEL == BOARD_EVB_FR3092E_RGB
#else
#error "choose correct board"
#endif
i2c_init(&i2c_touchpad_handle);
__TOUCHPAD_RESET_SET();
touchpad_init();
}
else {
__SYSTEM_GPIOC_CLK_ENABLE();
#if BOARD_SEL == BOARD_EVB_FR3092E
__SYSTEM_I2C2_CLK_ENABLE();
#else
__SYSTEM_I2C3_CLK_ENABLE();
#endif
i2c_init(&i2c_touchpad_handle);
}
}
__RAM_CODE void hw_psram_init(bool wake_up)
{
uint32_t reg_value;
__SYSTEM_OSPI_CLK_SELECT_AUPLL();
__SYSTEM_OSPI_CLK_ENABLE();
__SYSTEM_AHBC_CLK_ENABLE();
__CACHE_FLUSH(CACHE);
__CACHE_WR_MODE_SET(CACHE, CACHE_WR_WRITE_THROUGH);
__CACHE_ADDR_RANGEx_BANK_SET(CACHE, 0, 0 >> 16);
__CACHE_ADDR_RANGEx_MASK_SET(CACHE, 0, 0x001F);
__CACHE_ADDR_RANGEx_POL_SET(CACHE, 0, CACHE_POL_CACHABLE);
__CACHE_ADDR_RANGEx_ENABLE(CACHE, 0);
__CACHE_ENABLE(CACHE);
if (wake_up == false) {
/* setup PSRAM OSPI RESET pin */
SYSTEM->OspiPadConfig.OSPI_FuncMux |= 0x00300000;
SYSTEM->OspiOutEN &= (~(1<<10));
SYSTEM->OspiData |= (1<<10);
system_delay_us(200); // tPU > 150us
SYSTEM->OspiData &= (~(1<<10));
system_delay_us(10); // tRP > 1us
SYSTEM->OspiData |= (1<<10);
system_delay_us(600); // tDPDp > 500us
system_delay_us(300); // tHSPU > 1ms, from power up to fully access
}
/* configure OSPI pad to OSPI 4-line mode function */
reg_value = SYSTEM->OspiPadConfig.OSPI_FuncMux;
reg_value &= 0xfcf00ffc;
reg_value |= 0x01055001;
SYSTEM->OspiPadConfig.OSPI_FuncMux = reg_value;
psram_init(wake_up == false);
}
__RAM_CODE void hw_external_flash_init(bool wake_up)
{
if (wake_up == false) {
GPIO_InitTypeDef gpio_config;
#if(SPI_FLASH_GPIO_SEL==1)
/* ========================================================== */
/* config GPIO for external flash */
gpio_config.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_7;
gpio_init(GPIOC, &gpio_config);
/* CS of external flash is controllerd by software */
__SYSTEM_GPIOC_CLK_ENABLE();
gpio_config.Pin = GPIO_PIN_9;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOC, &gpio_config);
/* config DMA0 for external flash */
__SYSTEM_DMA0_CLK_ENABLE();
dma_flash_handle.DMAx = DMA0;
dma_flash_handle.Channel = DMA_Channel0;
dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC;
dma_flash_handle.Init.Request_ID = 2;
system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2);
dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1;
dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4;
dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC;
dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4;
dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4;
dma_init(&dma_flash_handle);
/* Initial SPIx8_1 for extern flash */
__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
spi_flash_handle.SPIx = SPIMX8_1;
spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3;
spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
spi_flash_handle.Init.BaudRate_Prescaler = 2;
spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20;
spi_flash_handle.Init.RxFIFOFull_Threshold = 4;
spi_master_init(&spi_flash_handle);
__SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
__SPI_CS_Release();
IC_W25Qxx_QuadConfig(true);
NVIC_EnableIRQ(DMA0_IRQn);
NVIC_EnableIRQ(SPIMX8_1_IRQn);
#elif(SPI_FLASH_GPIO_SEL==2)
__SYSTEM_GPIOB_CLK_ENABLE();
/* ========= External Flash interface configuration ======== */
/* config GPIO for external flash */
gpio_config.Pin = GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 ;
gpio_config.Mode = GPIO_MODE_AF_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_7;
gpio_init(GPIOB, &gpio_config);
/* CS of external flash is controllerd by software */
gpio_config.Pin = GPIO_PIN_1;
gpio_config.Mode = GPIO_MODE_OUTPUT_PP;
gpio_config.Pull = GPIO_PULLUP;
gpio_config.Alternate = GPIO_FUNCTION_0;
gpio_init(GPIOB, &gpio_config);
/* config DMA1 for external flash */
__SYSTEM_DMA1_CLK_ENABLE();
dma_flash_handle.DMAx = DMA1;
dma_flash_handle.Channel = DMA_Channel0;
dma_flash_handle.Init.Data_Flow = DMA_P2M_DMAC;
dma_flash_handle.Init.Request_ID = 2;
system_dmac_request_id_config(SPIMX8_0_RX, DMA0_REQUEST_ID_2);
dma_flash_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_1;
dma_flash_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_4;
dma_flash_handle.Init.Source_Inc = DMA_ADDR_INC_NO_CHANGE;
dma_flash_handle.Init.Desination_Inc = DMA_ADDR_INC_INC;
dma_flash_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_32;
dma_flash_handle.Init.Source_Burst_Len = DMA_BURST_LEN_4;
dma_flash_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_4;
dma_init(&dma_flash_handle);
/* Initial SPIx8_0 for extern flash */
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
spi_flash_handle.SPIx = SPIMX8_0;
spi_flash_handle.Init.Work_Mode = SPI_WORK_MODE_3;
spi_flash_handle.Init.Frame_Size = SPI_FRAME_SIZE_8BIT;
spi_flash_handle.Init.BaudRate_Prescaler = 2;
spi_flash_handle.Init.TxFIFOEmpty_Threshold = 20;
spi_flash_handle.Init.RxFIFOFull_Threshold = 4;
spi_master_init(&spi_flash_handle);
__SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
__SPI_CS_Release();
IC_W25Qxx_QuadConfig(true);
NVIC_EnableIRQ(DMA1_IRQn);
NVIC_EnableIRQ(SPIMX8_0_IRQn);
#endif
}
else {
#if(SPI_FLASH_GPIO_SEL==1)
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_DMA0_CLK_ENABLE();
system_dmac_request_id_config(SPIMX8_1_RX, DMA0_REQUEST_ID_2);
dma_init(&dma_flash_handle);
__SYSTEM_SPI_MASTER1_X8_CLK_ENABLE();
spi_master_init(&spi_flash_handle);
__SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
NVIC_EnableIRQ(DMA0_IRQn);
NVIC_EnableIRQ(SPIMX8_1_IRQn);
#elif(SPI_FLASH_GPIO_SEL==2)
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_DMA1_CLK_ENABLE();
system_dmac_request_id_config(SPIMX8_0_RX, DMA1_REQUEST_ID_2);
dma_init(&dma_flash_handle);
__SYSTEM_SPI_MASTER0_X8_CLK_ENABLE();
spi_master_init(&spi_flash_handle);
__SPI_RX_SAMPLE_DLY(spi_flash_handle.SPIx, 2);
NVIC_EnableIRQ(DMA1_IRQn);
NVIC_EnableIRQ(SPIMX8_0_IRQn);
#endif
}
}
__RAM_CODE void hw_dsp_xip_flash_init(bool wake_up)
{
uint32_t reg_value;
/* init QSPI1 for DSP XIP flash */
__SYSTEM_QSPI1_CLK_SELECT_AUPLL();
__SYSTEM_QSPI1_CLK_ENABLE();
/* configure OSPI pad to DSP XIP flash function */
reg_value = SYSTEM->OspiPadConfig.OSPI_FuncMux;
reg_value &= 0xc3fff033;
reg_value |= 0x14000544;
SYSTEM->OspiPadConfig.OSPI_FuncMux = reg_value;
/* power on DSP flash */
ool_write(0xfc, ool_read(0xfc) | 0x01);
/* configure DSP XIP controller */
flash_enable_quad(QSPI1);
flash_init_controller(QSPI1, FLASH_RD_TYPE_QUAD_FAST, FLASH_WR_TYPE_SINGLE);
flash_set_baudrate(QSPI1, QSPI_BAUDRATE_DIV_4);
}
__RAM_CODE void hw_dsp_restore(void)
{
}
__RAM_CODE __attribute__((noinline)) static void rise_qspi_clock(void)
{
__SYSTEM_QSPI0_CLK_SELECT_AUPLL();
__QSPI_DELAY_CS_START_SET(QSPI0, 4);
__QSPI_DELAY_CS_END_SET(QSPI0, 4);
__QSPI_DELAY_CS_DESSERT_SET(QSPI0, 8);
__QSPI_READ_CAPTURE_DELAY_SET(QSPI0, 3); // FLASH_ID_PUYA_P25Q32: 4 when div is 2
// FLASH_ID_XMC_XM25LU32: 3 when div is 2
// FLASH_ID_GIANTEC_GT25Q16A: 1 when div is 4
// FLASH_ID_GIANTEC_GT25Q16A: 4 when div is 2
system_delay_us(1000);
}
__RAM_CODE void hw_xip_flash_init(bool wake_up)
{
// init internal flash
__SYSTEM_PFC_CLK_ENABLE();
__SYSTEM_QSPI0_CLK_ENABLE();
__SYSTEM_APB_CLK_ENABLE();
__SYSTEM_APB1_CLK_ENABLE();
system_cache_enable(true);
flash_enable_quad(QSPI0);
SYSTEM->QspiPadConfig.QSPI_FuncMux = 0x00000500;
flash_init_controller(QSPI0, FLASH_RD_TYPE_QUAD_FAST, FLASH_WR_TYPE_SINGLE);
if (wake_up == false) {
flash_set_IO_DRV(QSPI0, 3);
}
flash_set_baudrate(QSPI0, QSPI_BAUDRATE_DIV_2);
rise_qspi_clock();
}
__RAM_CODE void hw_gpio_save(void)
{
gpio_state.PortA_PullEN = SYSTEM->PortA_PullEN;
gpio_state.PortB_PullEN = SYSTEM->PortB_PullEN;
gpio_state.PortC_PullEN = SYSTEM->PortC_PullEN;
gpio_state.PortD_PullEN = SYSTEM->PortD_PullEN;
gpio_state.PortA_PullSelect = SYSTEM->PortA_PullSelect;
gpio_state.PortB_PullSelect = SYSTEM->PortB_PullSelect;
gpio_state.PortC_PullSelect = SYSTEM->PortC_PullSelect;
gpio_state.PortD_PullSelect = SYSTEM->PortD_PullSelect;
gpio_state.PortA_PullResCfg = SYSTEM->PortA_PullResCfg;
gpio_state.PortB_PullResCfg = SYSTEM->PortB_PullResCfg;
gpio_state.PortC_PullResCfg = SYSTEM->PortC_PullResCfg;
gpio_state.PortD_PullResCfg = SYSTEM->PortD_PullResCfg;
gpio_state.PortA_DriveCfg = SYSTEM->PortA_DriveCfg;
gpio_state.PortB_DriveCfg = SYSTEM->PortB_DriveCfg;
gpio_state.PortC_DriveCfg = SYSTEM->PortC_DriveCfg;
gpio_state.PortD_DriveCfg = SYSTEM->PortD_DriveCfg;
gpio_state.PortA_L_FuncMux = SYSTEM->PortA_L_FuncMux;
gpio_state.PortA_H_FuncMux = SYSTEM->PortA_H_FuncMux;
gpio_state.PortB_L_FuncMux = SYSTEM->PortB_L_FuncMux;
gpio_state.PortB_H_FuncMux = SYSTEM->PortB_H_FuncMux;
gpio_state.PortC_L_FuncMux = SYSTEM->PortC_L_FuncMux;
gpio_state.PortC_H_FuncMux = SYSTEM->PortC_H_FuncMux;
gpio_state.PortD_L_FuncMux = SYSTEM->PortD_L_FuncMux;
gpio_state.PortD_H_FuncMux = SYSTEM->PortD_H_FuncMux;
gpio_state.QSPI_PullSelect = SYSTEM->QspiPadConfig.QSPI_PullSelect;
gpio_state.QSPI_PullEN = SYSTEM->QspiPadConfig.QSPI_PullEN;
gpio_state.OSPI_PullSelect = SYSTEM->OspiPadConfig.OSPI_PullSelect;
gpio_state.OSPI_PullEN = SYSTEM->OspiPadConfig.OSPI_PullEN;
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
gpio_state.GPIOA_OutputEN = GPIOA->GPIO_OutputEN;
gpio_state.GPIOA_OUT_DATA = GPIOA->GPIO_OUT_DATA;
gpio_state.GPIOA_EXTI_EN = GPIOA->EXTI_EN;
gpio_state.GPIOA_EXTI_INT_EN= GPIOA->EXTI_INT_EN;
gpio_state.GPIOA_EXTI_TYPE = GPIOA->EXTI_TYPE;
gpio_state.GPIOB_OutputEN = GPIOB->GPIO_OutputEN;
gpio_state.GPIOB_OUT_DATA = GPIOB->GPIO_OUT_DATA;
gpio_state.GPIOB_EXTI_EN = GPIOB->EXTI_EN;
gpio_state.GPIOB_EXTI_INT_EN= GPIOB->EXTI_INT_EN;
gpio_state.GPIOB_EXTI_TYPE = GPIOB->EXTI_TYPE;
gpio_state.GPIOC_OutputEN = GPIOC->GPIO_OutputEN;
gpio_state.GPIOC_OUT_DATA = GPIOC->GPIO_OUT_DATA;
gpio_state.GPIOC_EXTI_EN = GPIOC->EXTI_EN;
gpio_state.GPIOC_EXTI_INT_EN= GPIOC->EXTI_INT_EN;
gpio_state.GPIOC_EXTI_TYPE = GPIOC->EXTI_TYPE;
gpio_state.GPIOD_OutputEN = GPIOD->GPIO_OutputEN;
gpio_state.GPIOD_OUT_DATA = GPIOD->GPIO_OUT_DATA;
gpio_state.GPIOD_EXTI_EN = GPIOD->EXTI_EN;
gpio_state.GPIOD_EXTI_INT_EN= GPIOD->EXTI_INT_EN;
gpio_state.GPIOD_EXTI_TYPE = GPIOD->EXTI_TYPE;
}
__RAM_CODE void hw_gpio_restore(void)
{
SYSTEM->PortA_PullEN = gpio_state.PortA_PullEN;
SYSTEM->PortB_PullEN = gpio_state.PortB_PullEN;
SYSTEM->PortC_PullEN = gpio_state.PortC_PullEN;
SYSTEM->PortD_PullEN = gpio_state.PortD_PullEN;
SYSTEM->PortA_PullSelect = gpio_state.PortA_PullSelect;
SYSTEM->PortB_PullSelect = gpio_state.PortB_PullSelect;
SYSTEM->PortC_PullSelect = gpio_state.PortC_PullSelect;
SYSTEM->PortD_PullSelect = gpio_state.PortD_PullSelect;
SYSTEM->PortA_PullResCfg = gpio_state.PortA_PullResCfg;
SYSTEM->PortB_PullResCfg = gpio_state.PortB_PullResCfg;
SYSTEM->PortC_PullResCfg = gpio_state.PortC_PullResCfg;
SYSTEM->PortD_PullResCfg = gpio_state.PortD_PullResCfg;
SYSTEM->PortA_DriveCfg = gpio_state.PortA_DriveCfg;
SYSTEM->PortB_DriveCfg = gpio_state.PortB_DriveCfg;
SYSTEM->PortC_DriveCfg = gpio_state.PortC_DriveCfg;
SYSTEM->PortD_DriveCfg = gpio_state.PortD_DriveCfg;
SYSTEM->PortA_L_FuncMux = gpio_state.PortA_L_FuncMux;
SYSTEM->PortA_H_FuncMux = gpio_state.PortA_H_FuncMux;
SYSTEM->PortB_L_FuncMux = gpio_state.PortB_L_FuncMux;
SYSTEM->PortB_H_FuncMux = gpio_state.PortB_H_FuncMux;
SYSTEM->PortC_L_FuncMux = gpio_state.PortC_L_FuncMux;
SYSTEM->PortC_H_FuncMux = gpio_state.PortC_H_FuncMux;
SYSTEM->PortD_L_FuncMux = gpio_state.PortD_L_FuncMux;
SYSTEM->PortD_H_FuncMux = gpio_state.PortD_H_FuncMux;
SYSTEM->QspiPadConfig.QSPI_PullSelect = gpio_state.QSPI_PullSelect;
SYSTEM->QspiPadConfig.QSPI_PullEN = gpio_state.QSPI_PullEN;
SYSTEM->OspiPadConfig.OSPI_PullSelect = gpio_state.OSPI_PullSelect;
SYSTEM->OspiPadConfig.OSPI_PullEN = gpio_state.OSPI_PullEN;
__SYSTEM_GPIOA_CLK_ENABLE();
__SYSTEM_GPIOB_CLK_ENABLE();
__SYSTEM_GPIOC_CLK_ENABLE();
__SYSTEM_GPIOD_CLK_ENABLE();
GPIOA->GPIO_OutputEN = gpio_state.GPIOA_OutputEN;
GPIOA->GPIO_OUT_DATA = gpio_state.GPIOA_OUT_DATA;
GPIOA->EXTI_EN = gpio_state.GPIOA_EXTI_EN;
GPIOA->EXTI_INT_EN = gpio_state.GPIOA_EXTI_INT_EN;
GPIOA->EXTI_TYPE = gpio_state.GPIOA_EXTI_TYPE;
GPIOB->GPIO_OutputEN = gpio_state.GPIOB_OutputEN;
GPIOB->GPIO_OUT_DATA = gpio_state.GPIOB_OUT_DATA;
GPIOB->EXTI_EN = gpio_state.GPIOB_EXTI_EN;
GPIOB->EXTI_INT_EN = gpio_state.GPIOB_EXTI_INT_EN;
GPIOB->EXTI_TYPE = gpio_state.GPIOB_EXTI_TYPE;
GPIOC->GPIO_OutputEN = gpio_state.GPIOC_OutputEN;
GPIOC->GPIO_OUT_DATA = gpio_state.GPIOC_OUT_DATA;
GPIOC->EXTI_EN = gpio_state.GPIOC_EXTI_EN;
GPIOC->EXTI_INT_EN = gpio_state.GPIOC_EXTI_INT_EN;
GPIOC->EXTI_TYPE = gpio_state.GPIOC_EXTI_TYPE;
GPIOD->GPIO_OutputEN = gpio_state.GPIOD_OutputEN;
GPIOD->GPIO_OUT_DATA = gpio_state.GPIOD_OUT_DATA;
GPIOD->EXTI_EN = gpio_state.GPIOD_EXTI_EN;
GPIOD->EXTI_INT_EN = gpio_state.GPIOD_EXTI_INT_EN;
GPIOD->EXTI_TYPE = gpio_state.GPIOD_EXTI_TYPE;
}
__RAM_CODE void hw_clock_init(void)
{
System_ClkConfig_t sys_clk_cfg;
sys_clk_cfg.AUPLL_CFG.PLL_N = 8;
sys_clk_cfg.AUPLL_CFG.PLL_M = 0;
sys_clk_cfg.AUPLL_CFG.PowerEn = 1;
sys_clk_cfg.SPLL_CFG.PLL_N = 8;
sys_clk_cfg.SPLL_CFG.PLL_M = 0;
sys_clk_cfg.SPLL_CFG.PowerEn = 1;
sys_clk_cfg.MCU_Clock_Source = MCU_CLK_SEL_SPLL_CLK;
sys_clk_cfg.SOC_DIV = 1;
sys_clk_cfg.MCU_DIV = 1;
sys_clk_cfg.APB0_DIV = 1;
sys_clk_cfg.APB1_DIV = 1;
sys_clk_cfg.APB2_DIV = 1;
sys_clk_cfg.APB3_DIV = 1;
System_AUPLL_config(&sys_clk_cfg.AUPLL_CFG, 1000);
System_SPLL_config(&sys_clk_cfg.SPLL_CFG, 1000);
System_MCU_clock_Config(&sys_clk_cfg);
__SYSTEM_SPI_MASTER0_X8_CLK_SELECT_AUPLL();
__SYSTEM_SPI_MASTER1_X8_CLK_SELECT_AUPLL();
__SYSTEM_I2C_CLK_SELECT_SPLL();
__SYSTEM_BLEND_CLK_SELECT_SPLL();
__SYSTEM_UART_CLK_SELECT_SPLL();
}