Initial commit: LSPi (LiangShanPi) project
GD32F470ZGT6 based project with full peripheral support: - SDRAM (W9825G6KH) via EXMC - LCD NT35510 (480x800) via EXMC NOR/PSRAM - Flash (W25Q64) via SPI - UART (USART0) debug console - LED indicators - CMSIS-DAP debug interface - CMake + ARM GCC toolchain build system
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
#include "exmc_driver.h"
|
||||
#include <cstdio>
|
||||
|
||||
ExmcBus &ExmcBus::instance()
|
||||
{
|
||||
static ExmcBus bus;
|
||||
return bus;
|
||||
}
|
||||
|
||||
ExmcBus::ExmcBus()
|
||||
{
|
||||
}
|
||||
|
||||
ExmcBus::~ExmcBus()
|
||||
{
|
||||
}
|
||||
|
||||
RetCode ExmcBus::init()
|
||||
{
|
||||
rcu_periph_clock_enable(RCU_EXMC);
|
||||
printf("[EXMC] Clock enabled\r\n");
|
||||
|
||||
if (initialized_)
|
||||
{
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
rcu_periph_clock_enable(RCU_GPIOD);
|
||||
rcu_periph_clock_enable(RCU_GPIOE);
|
||||
rcu_periph_clock_enable(RCU_GPIOG);
|
||||
|
||||
gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
|
||||
gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
|
||||
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_0);
|
||||
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0);
|
||||
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
|
||||
|
||||
printf("[EXMC] Shared bus pins (D0-D15, A10) configured\r\n");
|
||||
|
||||
initialized_ = true;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
RetCode ExmcBus::deinit()
|
||||
{
|
||||
initialized_ = false;
|
||||
rcu_periph_clock_disable(RCU_EXMC);
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
RetCode ExmcBus::sdram_pin_init()
|
||||
{
|
||||
rcu_periph_clock_enable(RCU_GPIOC);
|
||||
rcu_periph_clock_enable(RCU_GPIOF);
|
||||
|
||||
/* SDNWE(PC0), SDNE0(PC2), SDCKE0(PC3) — SDRAM 写使能、片选和时钟使能 */
|
||||
gpio_af_set(GPIOC, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
||||
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
||||
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3);
|
||||
|
||||
/* SDDQM0(PE0), SDDQM1(PE1) — 数据掩码 */
|
||||
gpio_af_set(GPIOE, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1);
|
||||
gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1);
|
||||
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1);
|
||||
|
||||
/* A0-A5(PF0-PF5), NRAS(PF11), A6-A9(PF12-PF15) */
|
||||
gpio_af_set(GPIOF, GPIO_AF_12, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
|
||||
|
||||
/* A11-A12(PG1-PG2), BA0-BA1(PG4-PG5), SDCLK(PG8), NCAS(PG15) */
|
||||
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
||||
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
||||
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_15);
|
||||
|
||||
printf("[EXMC] SDRAM dedicated pins configured\r\n");
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
RetCode ExmcBus::norsram_lcd_pin_init()
|
||||
{
|
||||
rcu_periph_clock_enable(RCU_GPIOD);
|
||||
|
||||
gpio_af_set(GPIOD, GPIO_AF_12, GPIO_PIN_4 | GPIO_PIN_5);
|
||||
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5);
|
||||
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5);
|
||||
|
||||
rcu_periph_clock_enable(RCU_GPIOG);
|
||||
|
||||
gpio_af_set(GPIOG, GPIO_AF_12, GPIO_PIN_12);
|
||||
gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12);
|
||||
gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
|
||||
|
||||
printf("[EXMC] LCD/NOR-FLASH dedicated pins (NOE, NWE, NE3) configured\r\n");
|
||||
return RET_OK;
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
#ifndef __EXMC_DRIVER_H__
|
||||
#define __EXMC_DRIVER_H__
|
||||
|
||||
#include <cstdint>
|
||||
#include "bus_core.h"
|
||||
#include "gd32f4xx.h"
|
||||
|
||||
#define EXMC_REGION_0 EXMC_BANK0_NORSRAM_REGION0
|
||||
#define EXMC_REGION_1 EXMC_BANK0_NORSRAM_REGION1
|
||||
#define EXMC_REGION_2 EXMC_BANK0_NORSRAM_REGION2
|
||||
#define EXMC_REGION_3 EXMC_BANK0_NORSRAM_REGION3
|
||||
|
||||
#define EXMC_SDRAM_DEV_0 EXMC_SDRAM_DEVICE0
|
||||
#define EXMC_SDRAM_DEV_1 EXMC_SDRAM_DEVICE1
|
||||
|
||||
enum class ExmcPort : uint8_t {
|
||||
_0 = 0,
|
||||
MAX
|
||||
};
|
||||
|
||||
class ExmcBus {
|
||||
public:
|
||||
static ExmcBus &instance();
|
||||
|
||||
ExmcBus(const ExmcBus &) = delete;
|
||||
ExmcBus &operator=(const ExmcBus &) = delete;
|
||||
|
||||
RetCode init();
|
||||
RetCode deinit();
|
||||
|
||||
static RetCode sdram_pin_init();
|
||||
static RetCode norsram_lcd_pin_init();
|
||||
|
||||
private:
|
||||
ExmcBus();
|
||||
~ExmcBus();
|
||||
|
||||
bool initialized_ = false;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user