159 lines
4.3 KiB
C
159 lines
4.3 KiB
C
/*
|
||
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
||
* All Rights Reserved.
|
||
*
|
||
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
||
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
||
* either version 1.0 of the License, or (at your option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
* See the Phytium Public License for more details.
|
||
*
|
||
*
|
||
* FilePath: fqspi_hw.c
|
||
* Date: 2022-02-10 14:53:42
|
||
* LastEditTime: 2022-02-18 09:00:41
|
||
* Description:
|
||
* This file is for
|
||
*
|
||
*
|
||
* Modify History:
|
||
* Ver Who Date Changes
|
||
* ----- ------ -------- --------------------------------------
|
||
*/
|
||
#include "ftypes.h"
|
||
#include "ferror_code.h"
|
||
#include "fassert.h"
|
||
#include "fdebug.h"
|
||
#include "fqspi_hw.h"
|
||
|
||
#define FQSPI_DEBUG_TAG "FQSPI-HW"
|
||
#define FQSPI_ERROR(format, ...) FT_DEBUG_PRINT_E(FQSPI_DEBUG_TAG, format, ##__VA_ARGS__)
|
||
#define FQSPI_WARN(format, ...) FT_DEBUG_PRINT_W(FQSPI_DEBUG_TAG, format, ##__VA_ARGS__)
|
||
#define FQSPI_INFO(format, ...) FT_DEBUG_PRINT_I(FQSPI_DEBUG_TAG, format, ##__VA_ARGS__)
|
||
#define FQSPI_DEBUG(format, ...) FT_DEBUG_PRINT_D(FQSPI_DEBUG_TAG, format, ##__VA_ARGS__)
|
||
|
||
|
||
/**
|
||
* @name: FQspiGetLdPortData
|
||
* @msg: read low data port register data
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @param {u8} *buf, read buffer
|
||
* @param {size_t} len, read length
|
||
* @return
|
||
*/
|
||
void FQspiGetLdPortData(uintptr base_addr, u8 *buf, size_t len)
|
||
{
|
||
FASSERT(buf);
|
||
u32 loop = 0;
|
||
u32 reg_val = 0;
|
||
|
||
for (loop = 0; loop < len; loop++)
|
||
{
|
||
/* read 4 bytes one time */
|
||
if (0 == loop % 4)
|
||
{
|
||
reg_val = FQSPI_READ_REG32(base_addr, FQSPI_REG_LD_PORT_OFFSET);
|
||
}
|
||
|
||
/* assign buf byte by byte */
|
||
buf[loop] = (u8)((reg_val >> (loop % 4) * 8) & 0xFF);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @name: FQspiSetLdPortData
|
||
* @msg: set low data port register data
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @param {u8} *buf, write buffer
|
||
* @param {size_t} len, write length
|
||
* @return
|
||
*/
|
||
void FQspiSetLdPortData(uintptr base_addr, const u8 *buf, size_t len)
|
||
{
|
||
FASSERT(buf);
|
||
FASSERT((len < 5) && (len));
|
||
u32 reg_val = 0;
|
||
|
||
if (1 == len)
|
||
{
|
||
reg_val = buf[0];
|
||
}
|
||
else if (2 == len)
|
||
{
|
||
reg_val = buf[1];
|
||
reg_val = (reg_val << 8) + buf[0];
|
||
}
|
||
else if (3 == len)
|
||
{
|
||
reg_val = buf[2];
|
||
reg_val = (reg_val << 8) + buf[1];
|
||
reg_val = (reg_val << 8) + buf[0];
|
||
}
|
||
else
|
||
{
|
||
reg_val = buf[3];
|
||
reg_val = (reg_val << 8) + buf[2];
|
||
reg_val = (reg_val << 8) + buf[1];
|
||
reg_val = (reg_val << 8) + buf[0];
|
||
}
|
||
|
||
/*write value to low bit port register 0x1c, make command valid */
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_LD_PORT_OFFSET, reg_val);
|
||
}
|
||
|
||
|
||
/**
|
||
* @name: FQspiWriteFlush
|
||
* @msg: config write flush register to make wr_cfg complete program
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @return
|
||
*/
|
||
void FQspiWriteFlush(uintptr base_addr)
|
||
{
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_FLUSH_OFFSET, 0x1);
|
||
}
|
||
|
||
/**
|
||
* @name: FQspiCommandPortSend
|
||
* @msg: send command port register value
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @return void
|
||
*/
|
||
void FQspiCommandPortSend(uintptr base_addr)
|
||
{
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_LD_PORT_OFFSET, 0x0);
|
||
}
|
||
|
||
/**
|
||
* @name: FQspiAddrPortConfig
|
||
* @msg: config address port register value
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @param {u32} addr addresss value write to register
|
||
* @return
|
||
*/
|
||
void FQspiAddrPortConfig(uintptr base_addr, u32 addr)
|
||
{
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_ADDR_PORT_OFFSET, addr);
|
||
}
|
||
|
||
/**
|
||
* @name: FQspiXIPModeSet
|
||
* @msg: config qspi xip mode
|
||
* @param {uintptr} base_addr, FQSPI controller base address
|
||
* @param {u8} enable enable or disable xip mode
|
||
* @return
|
||
*/
|
||
void FQspiXIPModeSet(uintptr base_addr, u8 enable)
|
||
{
|
||
if (enable)
|
||
{
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_MODE_OFFSET, FQSPI_QUAD_READ_MODE_ENABLE);
|
||
}
|
||
else
|
||
{
|
||
FQSPI_WRITE_REG32(base_addr, FQSPI_REG_MODE_OFFSET, FQSPI_QUAD_READ_MODE_DISABLE);
|
||
}
|
||
} |