Files
lishanpi/bsp/device/sdram/sdram_driver.h
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

113 lines
3.3 KiB
C++

#ifndef __SDRAM_DRIVER_H__
#define __SDRAM_DRIVER_H__
#include <cstdint>
#include "common_types.h"
#include "gd32f4xx.h"
/* SDRAM设备类型定义 */
typedef enum {
SDRAM_DEVICE_0 = 0, /* SDRAM设备0,基地址0xC0000000 */
SDRAM_DEVICE_1 = 1, /* SDRAM设备1,基地址0xD0000000 */
SDRAM_DEVICE_MAX
} sdram_device_t;
/* SDRAM配置结构体 */
typedef struct {
uint32_t column_address_width; /* 列地址宽度: 8, 9, 10, 11, 12位 */
uint32_t row_address_width; /* 行地址宽度: 11, 12, 13位 */
uint32_t data_width; /* 数据总线宽度: 8, 16, 32位 */
uint32_t internal_bank_number; /* 内部Bank数量: 2或4 */
uint32_t cas_latency; /* CAS延迟: 1, 2, 3个时钟周期 */
bool write_protection; /* 写保护使能 */
uint32_t sdclock_config; /* SDCLK配置: HCLK分频 */
bool burst_read_switch; /* 突发读取开关 */
uint32_t pipeline_read_delay; /* 流水线读取延迟: 0, 1, 2个HCLK */
/* 时序参数 */
struct {
uint32_t load_mode_register_delay; /* 加载模式寄存器延迟 (LMRD) */
uint32_t exit_selfrefresh_delay; /* 退出自刷新延迟 (XSRD) */
uint32_t row_address_select_delay; /* 行地址选择延迟 (RASD) */
uint32_t auto_refresh_delay; /* 自动刷新延迟 (ARFD) */
uint32_t write_recovery_delay; /* 写恢复延迟 (WRD) */
uint32_t row_precharge_delay; /* 行预充电延迟 (RPD) */
uint32_t row_to_column_delay; /* 行到列延迟 (RCD) */
} timing;
} sdram_config_t;
/* SDRAM句柄结构体 */
typedef struct {
sdram_device_t device; /* SDRAM设备 */
sdram_config_t config; /* SDRAM配置 */
void *private_data; /* 私有数据指针 */
} sdram_handle_t;
/* 函数声明 */
/**
* @brief 初始化SDRAM
* @param handle SDRAM句柄指针
* @return 操作结果
*/
ret_code_t sdram_init(sdram_handle_t *handle);
/**
* @brief 反初始化SDRAM
* @param handle SDRAM句柄指针
* @return 操作结果
*/
ret_code_t sdram_deinit(sdram_handle_t *handle);
/**
* @brief 写入数据到SDRAM
* @param handle SDRAM句柄指针
* @param address 相对地址(从SDRAM基地址开始的偏移)
* @param data 数据指针
* @param length 数据长度(字节)
* @return 操作结果
*/
ret_code_t sdram_write(sdram_handle_t *handle, uint32_t address, const void *data, uint32_t length);
/**
* @brief 从SDRAM读取数据
* @param handle SDRAM句柄指针
* @param address 相对地址(从SDRAM基地址开始的偏移)
* @param buffer 缓冲区指针
* @param length 数据长度(字节)
* @return 操作结果
*/
ret_code_t sdram_read(sdram_handle_t *handle, uint32_t address, void *buffer, uint32_t length);
/**
* @brief 填充SDRAM区域
* @param handle SDRAM句柄指针
* @param address 起始地址
* @param value 填充值
* @param length 填充长度(字节)
* @return 操作结果
*/
ret_code_t sdram_fill(sdram_handle_t *handle, uint32_t address, uint8_t value, uint32_t length);
/**
* @brief 验证SDRAM读写功能
* @param handle SDRAM句柄指针
* @param test_size 测试数据大小(字节)
* @return 操作结果
*/
ret_code_t sdram_self_test(sdram_handle_t *handle, uint32_t test_size);
/**
* @brief 获取SDRAM基地址
* @param device SDRAM设备
* @return SDRAM基地址,如果设备无效返回0
*/
uint32_t sdram_get_base_address(sdram_device_t device);
/**
* @brief 默认SDRAM初始化(使用预定义配置)
* @return 操作结果
*/
ret_code_t sdram_default_init(void);
#endif /* __SDRAM_DRIVER_H__ */