fc10ef2e10
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
91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
#include "sdram_manager.h"
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
|
|
SdramManager &SdramManager::instance()
|
|
{
|
|
static SdramManager mgr;
|
|
return mgr;
|
|
}
|
|
|
|
SdramManager::SdramManager()
|
|
: handle_{
|
|
.device = SDRAM_DEVICE_0,
|
|
.config = {
|
|
.column_address_width = EXMC_SDRAM_COW_ADDRESS_9,
|
|
.row_address_width = EXMC_SDRAM_ROW_ADDRESS_13,
|
|
.data_width = EXMC_SDRAM_DATABUS_WIDTH_16B,
|
|
.internal_bank_number = EXMC_SDRAM_4_INTER_BANK,
|
|
.cas_latency = EXMC_CAS_LATENCY_3_SDCLK,
|
|
.write_protection = false,
|
|
.sdclock_config = EXMC_SDCLK_PERIODS_3_HCLK,
|
|
.burst_read_switch = true,
|
|
.pipeline_read_delay = EXMC_PIPELINE_DELAY_2_HCLK,
|
|
.timing = {
|
|
.load_mode_register_delay = 2,
|
|
.exit_selfrefresh_delay = 7,
|
|
.row_address_select_delay = 5,
|
|
.auto_refresh_delay = 6,
|
|
.write_recovery_delay = 2,
|
|
.row_precharge_delay = 2,
|
|
.row_to_column_delay = 2,
|
|
}},
|
|
.private_data = nullptr}
|
|
{
|
|
}
|
|
|
|
RetCode SdramManager::init()
|
|
{
|
|
if (initialized_)
|
|
{
|
|
return RET_OK;
|
|
}
|
|
|
|
printf("[SdramManager] Initializing...\r\n");
|
|
RetCode ret = sdram_init(&handle_);
|
|
if (ret == RET_OK)
|
|
{
|
|
initialized_ = true;
|
|
printf("[SdramManager] Init OK, base=0x%08lX\r\n", base_address());
|
|
}
|
|
else
|
|
{
|
|
printf("[SdramManager] Init failed: %d\r\n", ret);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
RetCode SdramManager::write(uint32_t offset, const void *data, uint32_t length)
|
|
{
|
|
if (!initialized_)
|
|
return RET_NOT_INITIALIZED;
|
|
return sdram_write(&handle_, offset, data, length);
|
|
}
|
|
|
|
RetCode SdramManager::read(uint32_t offset, void *buffer, uint32_t length)
|
|
{
|
|
if (!initialized_)
|
|
return RET_NOT_INITIALIZED;
|
|
return sdram_read(&handle_, offset, buffer, length);
|
|
}
|
|
|
|
RetCode SdramManager::fill(uint32_t offset, uint8_t value, uint32_t length)
|
|
{
|
|
if (!initialized_)
|
|
return RET_NOT_INITIALIZED;
|
|
return sdram_fill(&handle_, offset, value, length);
|
|
}
|
|
|
|
RetCode SdramManager::self_test(uint32_t test_size)
|
|
{
|
|
if (!initialized_)
|
|
return RET_NOT_INITIALIZED;
|
|
printf("[SdramManager] Running self-test (%lu bytes)...\r\n", test_size);
|
|
return sdram_self_test(&handle_, test_size);
|
|
}
|
|
|
|
uint32_t SdramManager::base_address() const
|
|
{
|
|
return sdram_get_base_address(handle_.device);
|
|
}
|