142 lines
3.6 KiB
C
Raw Normal View History

2025-10-10 16:07:00 +08:00
// Copyright 2020-2021 Beken
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <driver/qspi.h>
#include <driver/qspi_psram.h>
#include "qspi_hal.h"
#define READ_ID_CMD 0x9F
#define ENTER_QUAD_MODE_CMD 0x35
#define EXIT_QUAD_MODE_CMD 0xF5
#define QUAD_WRITE_CMD 0x38
#define WRITE_CMD 0x02
#define FAST_READ_QUAD 0xEB
#define FAST_READ 0x0B
#define READ_CMD 0x03
bk_err_t bk_qspi_psram_init(qspi_id_t id)
{
qspi_config_t config = {0};
config.src_clk = QSPI_SCLK_480M;
config.src_clk_div = 0x4;
config.clk_div = 0x10;
BK_LOG_ON_ERR(bk_qspi_init(id, &config));
return BK_OK;
}
bk_err_t bk_qspi_psram_deinit(qspi_id_t id)
{
BK_LOG_ON_ERR(bk_qspi_deinit(id));
return BK_OK;
}
bk_err_t bk_qspi_psram_enter_quad_mode(qspi_id_t id)
{
qspi_cmd_t enter_quad_cmd = {0};
enter_quad_cmd.wire_mode = QSPI_1WIRE;
enter_quad_cmd.work_mode = INDIRECT_MODE;
enter_quad_cmd.op = QSPI_WRITE;
enter_quad_cmd.cmd = ENTER_QUAD_MODE_CMD;
BK_LOG_ON_ERR(bk_qspi_command(id, &enter_quad_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_exit_quad_mode(qspi_id_t id)
{
qspi_cmd_t exit_quad_cmd = {0};
exit_quad_cmd.wire_mode = QSPI_4WIRE;
exit_quad_cmd.work_mode = INDIRECT_MODE;
exit_quad_cmd.op = QSPI_WRITE;
exit_quad_cmd.cmd = EXIT_QUAD_MODE_CMD;
BK_LOG_ON_ERR(bk_qspi_command(id, &exit_quad_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_quad_write(qspi_id_t id)
{
qspi_cmd_t quad_wr_cmd = {0};
quad_wr_cmd.wire_mode = QSPI_4WIRE;
quad_wr_cmd.work_mode = MEMORY_MAPPED_MODE;
quad_wr_cmd.op = QSPI_WRITE;
quad_wr_cmd.cmd = QUAD_WRITE_CMD;
quad_wr_cmd.addr = 0;
quad_wr_cmd.dummy_cycle = 0;
BK_LOG_ON_ERR(bk_qspi_command(id, &quad_wr_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_single_write(qspi_id_t id)
{
qspi_cmd_t quad_wr_cmd = {0};
quad_wr_cmd.wire_mode = QSPI_1WIRE;
quad_wr_cmd.work_mode = MEMORY_MAPPED_MODE;
quad_wr_cmd.op = QSPI_WRITE;
quad_wr_cmd.cmd = WRITE_CMD;
quad_wr_cmd.addr = 0;
quad_wr_cmd.dummy_cycle = 0;
BK_LOG_ON_ERR(bk_qspi_command(id, &quad_wr_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_quad_read(qspi_id_t id)
{
qspi_cmd_t qspi_rd_cmd = {0};
qspi_rd_cmd.wire_mode = QSPI_4WIRE;
qspi_rd_cmd.work_mode = MEMORY_MAPPED_MODE;
qspi_rd_cmd.op = QSPI_READ;
qspi_rd_cmd.cmd = FAST_READ_QUAD;
qspi_rd_cmd.addr = 0;
qspi_rd_cmd.dummy_cycle = 6;
BK_LOG_ON_ERR(bk_qspi_command(id, &qspi_rd_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_single_read(qspi_id_t id)
{
qspi_cmd_t qspi_rd_cmd = {0};
qspi_rd_cmd.wire_mode = QSPI_1WIRE;
qspi_rd_cmd.work_mode = MEMORY_MAPPED_MODE;
qspi_rd_cmd.op = QSPI_READ;
qspi_rd_cmd.cmd = READ_CMD;
qspi_rd_cmd.addr = 0;
qspi_rd_cmd.dummy_cycle = 0;
BK_LOG_ON_ERR(bk_qspi_command(id, &qspi_rd_cmd));
return BK_OK;
}
bk_err_t bk_qspi_psram_write(qspi_id_t id, uint32_t base_addr, const void *data, uint32_t size)
{
BK_LOG_ON_ERR(qspi_hal_direct_write(id, base_addr, data, size));
return BK_OK;
}
bk_err_t bk_qspi_psram_read(qspi_id_t id, uint32_t base_addr, void *data, uint32_t size)
{
BK_LOG_ON_ERR(qspi_hal_direct_read(id, base_addr, data, size));
return BK_OK;
}