Files
lishanpi/bsp/device/sdram/sdram_manager.cpp
T
hm fc10ef2e10 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
2026-04-26 16:24:42 +08:00

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);
}