/**
  **********************************************************************************
  * @file    psram_hal.c
  * @author  Product application department 
  * @version V1.0
  * @date    2020.07.11
  * @brief   PSRAM模块HAL层驱动..
  * @note 这个文件提供了hal层psram接口:
  *     - psram初始化接口.
  *
  @verbatim
  ===================================================================================
                                  ##### 更新 #####
  ===================================================================================
  [..] 更新时间:
  [..] 更新人:
  [..] 更新内容:
        1. nothing.
  @endverbatim
 */
#include "psram_hal.h"
#include "ssi_hal.h"

/*** 全局变量定义 ***************************************************************/
/**@ volatile
  *@{
  */

/**@
  *@}
  */

/**@ static
  *@{
  */
static SSI_TypeDef *g_psram_ssi;
/**@
  *@}
  */

/*** 常量定义 *******************************************************************/
/**@ const
  *@{
  */
/**@
  *@}
  */
/*** 函数定义 *******************************************************************/

/**
 * @brief PSRAM初始化
 * @param[in] Sys_clk: PSRAM模块系统时钟
 * @note sdram 初始化
 * @retval NONE
*/
void HAL_PSRAM_Init(uint32_t Sys_clk)
{
  DRV_PsramInit(SSI2);
  g_psram_ssi = SSI2;
}

/**
 * @brief 获取PSRAM的基地址
 * @param[in] -NONE
 * @param[out] -PSRAM的基地址
 * @retval NONE
*/
static uint32_t get_psram_baseaddress(void)
{
  if (g_psram_ssi == SSI2)
    return 0x14000000;
  else
    return 0x10000000;
}

/**
  *@brief PSRAM:读取PSRAM
  *
  *@param[in] address :PSRAM地址
  *@param[in] length：读取数据的长度
  *@param[out] buffer:读取数据buffer
  *@return 
  * -0:成功
  * -1:失败
  */
uint8_t HAL_PSRAM_Read(uint32_t address, uint8_t *buffer, uint32_t length)
{
  uint32_t i;

  if (address < get_psram_baseaddress())
    return FALSE;

  for (i = 0; i < length; i++)
  {
    buffer[i] = (*(__IO uint8_t *)(address + i));
  }
  return TRUE;
}

/**
  *@brief PSRAM:写PSRAM
  *
  *@param[in] address :PSRAM地址
  *@param[in] length：写入数据的长度
  *@param[out] buffer:写入数据buffer
  *@return 
  * -0:成功
  * -1:失败
  */
uint8_t HAL_PSRAM_Write(uint32_t address, uint8_t *buffer, uint32_t length)
{
  uint32_t i;

  if (address < get_psram_baseaddress())
    return FALSE;

  for (i = 0; i < length; i++)
  {
		(*(__IO uint8_t *)(address+i)) = buffer[i];
    
  }
  return TRUE;
}

