/**
  **********************************************************************************
  * @file   ssi_hal.c
  * @author  Product application department
  * @version V1.0
  * @date    2020.03.17
  * @brief   SSI模块HAL层驱动.
  *
  @verbatim
  ===================================================================================
                                  ##### 更新 #####
  ===================================================================================
  [..] 更新时间:
  [..] 更新人:
  [..] 更新内容:
        1. nothing.
  @endverbatim
*/
#include "ssi_hal.h"

/*** 全局变量定义 ***************************************************************/
/** @
  * @{volatile
  */
/** @ 
  * @}
  */
/** @ 
  * @{static
  */
/** @ 
  * @}
  */
/*** 常量定义 *******************************************************************/
/** @
  * @{const
  */
/** @ 
  * @}
  */

/*** 函数定义 *******************************************************************/


static HAL_StatusTypeDef DrvSSIStatusToHalStatus(DRV_SSI_StatusTypeDef DrvStatus)
{
    switch(DrvStatus)
    {
        case DRV_SSI_OK:
        {
            return(HAL_OK);
        }

        case DRV_SSI_ERROR:
        {
            return(HAL_ERROR);
        }

        case DRV_SSI_BUSY:
        {
            return(HAL_BUSY);
        }

        case DRV_SSI_TIMEOUT:
        {
            return(HAL_TIMEOUT);
        }
    }
}
/**
 *@brief 重置SSI结构体.
 *
 *@param[in] pinit 指向SSI_InitTypeDef结构体的指针;
 *@retval @ref HAL_StatusTypeDef
 */
HAL_StatusTypeDef HAL_SSI_DeInit(SSI_HandleTypeDef *hssi)
{
	DRV_SSI_StructInit(&hssi->Init);
  return DrvSSIStatusToHalStatus(DRV_SSI_DeInit(hssi->Instance));
}
/**
  *@brief 初始化SSI_HandleTypeDef结构体指定的SSI模块的管脚、时钟、中断、EDMAC等配置.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
__weak void HAL_SSI_MspInit(SSI_HandleTypeDef *hssi)
{

}
/**
 *@brief 赋予SSI结构体默认值.
 *
 *@param[in] pinit 指向SSI_InitTypeDef结构体的指针;
 *@return 无 @ref 无
 */
//void HAL_SSI_StructInit(SSI_HandleTypeDef *SSI)
//{
//  
//}
/**
  *@brief 根据SSI_InitTypeDef指定的参数初始化SSI模块,并初始化相关handle..
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_Init(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    if(hssi->State == HAL_SSI_STATE_RESET)
    {
        HAL_SSI_MspInit(hssi);
    }
    hssi->State = HAL_SSI_STATE_BUSY;
    /**/
    ret = DRV_SSI_Init(hssi->Instance,&hssi->Init,Timeout);
    if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}
    hssi->RxCnt = 0;
    hssi->RxSize = 0;
    hssi->TxCnt = 0;
    hssi->TxSize = 0;

    hssi->ErrorCode = HAL_SSI_ERROR_NONE;
    hssi->State = HAL_SSI_STATE_READY;

    return(HAL_OK);
}
/**
  *@brief 获取Device ID.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_Read_ID(SSI_HandleTypeDef *hssi,uint8_t mode,uint16_t *ID,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
	  hssi->pRxBuf = ID;
  	hssi->RxSize = 2;
    switch(mode)
		{
			case STD_mode:
				ret = DRV_SSI_STD_Read_ID(hssi->Instance,ID,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
				break;	
			default:
				return HAL_ERROR;
				break;
	  }
    return(HAL_OK);
}
/**
  *@brief sector擦除.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_Sector_Erase(SSI_HandleTypeDef *hssi,uint8_t mode,uint32_t addr,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    switch(mode)
		{
			case STD_mode:
				ret = DRV_SSI_EFlash_STD_Sector_Erase(hssi->Instance,addr,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
				break;
			default:
				return HAL_ERROR;
				break;
	  }
    return(HAL_OK);
}
/**
  *@brief SSI读.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_Read(SSI_HandleTypeDef *hssi,uint8_t mode,uint32_t addr,uint8_t *buf,uint32_t len,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
	  hssi->RxSize = len;
	  hssi->pRxBuf = buf;
    switch(mode)
		{
			case STD_mode:
				ret = DRV_SSI_EFlash_STD_Read(hssi->Instance,addr,hssi->RxSize,hssi->pRxBuf,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
				break;
			case DUAL_mode:
				ret = DRV_SSI_EFlash_DUAL_Read(hssi->Instance,&hssi->Init,addr,hssi->RxSize,hssi->pRxBuf,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
			  break;
			case QUAD_mode:
				ret = DRV_SSI_EFlash_QUAD_Read(hssi->Instance,&hssi->Init,addr,hssi->RxSize,hssi->pRxBuf,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
			  break;	
			default:
				return HAL_ERROR;
				break;
	  }

    return(HAL_OK);
}
/**
  *@brief SSI编程.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_Program(SSI_HandleTypeDef *hssi,uint8_t mode,uint32_t addr,uint8_t *buf,uint32_t len,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
	  
	  hssi->pTxBuf = buf;
	  hssi->TxSize = len;
    switch(mode)
		{
			case STD_mode:
				ret = DRV_SSI_EFlash_STD_Program(hssi->Instance,addr,hssi->TxSize,hssi->pTxBuf,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}
				break;
			case QUAD_mode:
				ret = DRV_SSI_EFlash_QUAD_Program(hssi->Instance,&hssi->Init,addr,hssi->TxSize,hssi->pTxBuf,Timeout);
				if(ret!=DRV_SSI_OK)
				{
					return DrvSSIStatusToHalStatus(ret);
				}		
				break;				
			default:
				return HAL_ERROR;
				break;
	  }

    return(HAL_OK);
}
/**
  *@brief 进入QPI模式.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_Enter(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
	  uint16_t buf;
    if(hssi->Init.Format!=STD_mode)
		{
			ret = DRV_SSI_STD_Init(hssi->Instance,hssi->Init.SSI_STD_BaudRatePrescaler,Timeout);
			if(ret != DRV_SSI_OK)
			{
					return DrvSSIStatusToHalStatus(ret);
			}		
		}
		ret = DRV_SSI_EFlash_QPI_Enter(hssi->Instance,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}
   ret = DRV_EFlash_Set_Read_Para(hssi->Instance,hssi->Init.SSI_QUAD_BaudRatePrescaler,0x31,Timeout);
	if(ret != DRV_SSI_OK)
	{
		return DrvSSIStatusToHalStatus(ret);;
	}	
    return(HAL_OK);
}
/**
  *@brief 进入QPI模式.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_EXIT(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;

		ret = DRV_SSI_EFlash_QPI_EXIT(hssi->Instance,&hssi->Init,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}

    return(HAL_OK);
}
/**
  *@brief sector擦除(QPI)
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_Sector_Erase(SSI_HandleTypeDef *hssi,uint32_t addr,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
		ret = DRV_SSI_EFlash_QPI_Sector_Erase(hssi->Instance,&hssi->Init,addr,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}
    return(HAL_OK);
}
/**
  *@brief SSI读(QPI)
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_Read(SSI_HandleTypeDef *hssi,uint32_t addr,uint8_t *buf,uint32_t len,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    hssi->pRxBuf = buf;
	  hssi->RxSize = len;
		ret = DRV_SSI_EFlash_QPI_Read(hssi->Instance,addr,hssi->RxSize,hssi->pRxBuf,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}
    return(HAL_OK);
}
/**
  *@brief SSI编程.
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_Program(SSI_HandleTypeDef *hssi,uint32_t addr,uint8_t *buf,uint32_t len,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    
	  hssi->pTxBuf = buf;
	  hssi->TxSize = len;
		ret = DRV_SSI_EFlash_QPI_Program(hssi->Instance,&hssi->Init,addr,hssi->TxSize,hssi->pTxBuf,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}

    return(HAL_OK);
}
/**
  *@brief 进入XIP模式
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_XIP_Enter(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    
	  ret = DRV_XIP_Enter(hssi->Instance,&hssi->Init,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}

    return(HAL_OK);
}
/**
  *@brief 退出XIP模式
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_XIP_EXIT(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    
	  ret = DRV_XIP_EXIT(hssi->Instance,&hssi->Init ,Timeout);
		if(ret!=DRV_SSI_OK)
		{
			return DrvSSIStatusToHalStatus(ret);
		}

    return(HAL_OK);
}
/**
  *@brief 软复位FLASH
  *
  @param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@retval @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_FLASH_Reset(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
    DRV_SSI_StatusTypeDef ret;
    
  	ret = DRV_SSI_STD_Reset_Enable(hssi->Instance,Timeout);
	  if(ret != DRV_SSI_OK)
	  {
		  return DrvSSIStatusToHalStatus(ret);
	  } 
	  ret = DRV_SSI_STD_Reset(hssi->Instance,Timeout);
	  if(ret != DRV_SSI_OK)
	  {
		  return DrvSSIStatusToHalStatus(ret);
	  } 
    return(HAL_OK);
}
/**
  *@brief SSI FLASH写使能
  *
  *@param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  Timeout 超时时间;
  *@retval 结果 @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_Write_Enable(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
     return DrvSSIStatusToHalStatus(DRV_SSI_EFlash_Write_Enable(hssi->Instance,Timeout));
}
/**
  *@brief SSI FLASH写使能(QPI)
  *
  *@param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  Timeout 超时时间;
  *@retval 结果 @ref HAL_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_EFlash_QPI_Write_Enable(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
	return DrvSSIStatusToHalStatus(DRV_SSI_EFlash_QPI_Write_Enable(hssi->Instance,&hssi->Init,Timeout));
}
/**
  *@brief 启动SSI STD DMA
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  cmd 操作指令
  *@param[in]  addr 地址;
  *@param[in]  dmaConf 传输方式;
  *@return 无
  */
void HAL_SSI_STD_DMA_Trig(SSI_HandleTypeDef *hssi, unsigned char cmd, unsigned int addr, int dmaConf)
{	
	DRV_SSI_STD_DMA_Trig(hssi->Instance,cmd,addr,dmaConf);
}	
/**
  *@brief 启动SSI QUAD DMA
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  cmd 操作指令
  *@param[in]  addr 地址;
  *@param[in]  dmaConf 传输方式;
  *@return 无
  */
void HAL_SSI_DUAL_DMA_Trig(SSI_HandleTypeDef *hssi, unsigned char cmd, unsigned int addr, int dmaConf)
{
	DRV_SSI_DUAL_DMA_Trig(hssi->Instance,cmd,addr,dmaConf);
}	
/**
  *@brief 启动SSI QUAD DMA 
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  cmd 操作指令
  *@param[in]  addr 地址;
  *@param[in]  dmaConf 传输方式;
  *@return 无
  */
void HAL_SSI_QUAD_DMA_Trig(SSI_HandleTypeDef *hssi, unsigned char cmd, unsigned int addr, int dmaConf)
{
	DRV_SSI_QUAD_DMA_Trig(hssi->Instance,cmd,addr,dmaConf);
}	
/**
  *@brief 启动SSI QPI DMA 
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  cmd 操作指令
  *@param[in]  addr 地址;
  *@param[in]  dmaConf 传输方式;
  *@return 无
  */
void HAL_SSI_QPI_DMA_Trig(SSI_HandleTypeDef *hssi, unsigned char cmd, unsigned int addr, int dmaConf)
{
	DRV_SSI_QPI_DMA_Trig(hssi->Instance,cmd,addr,dmaConf);
}
/**
  *@brief DMA传输数据等级设置
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  level 等级
  *@return 无
  */
void HAL_SSI_DMA_Transmit_level(SSI_HandleTypeDef *hssi,unsigned char level)
{
	DRV_SSI_DMA_Transmit_level(hssi->Instance,level); 
}
/**
  *@brief DMA接收数据等级设置
  *
  *@param[in]  hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in]  level 等级
  *@return 无
  */
void HAL_SSI_DMA_Receive_level(SSI_HandleTypeDef *hssi,unsigned char level)
{
	DRV_SSI_DMA_Receive_level(hssi->Instance,level);  
}
/**
  *@brief SSI wait IDLE
  *
  *@param[in] hssi  指向SSI_HandleTypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in] Timeout 超时时间;
  *@return 结果 @ref DRV_SSI_StatusTypeDef
  */
HAL_StatusTypeDef HAL_SSI_WAIT_IDLE(SSI_HandleTypeDef *hssi,uint32_t Timeout)
{
   return DrvSSIStatusToHalStatus(DRV_SSI_WaitonFlagTimeout(hssi->Instance,SSI_FLAG_INDEX_BUSY,SET,Timeout));
}

/**
  *@brief   ssi单线模式初始化
  *@param[in] SSIx  指向SSI_TypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@return 无
  */
void HAL_SSI_Standard_Init(SSI_TypeDef *SSIx)
{
	SSI_Standard_Init(SSIx);
}


/**
  *@brief ssi单线模式下，向flash中写数据
  *@param[in] SSIx  指向SSI_TypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in] psend 发送数据地址
  *@param[in] addr  源地址;
  *@param[in] length  传输数据长度;
  *@param[in] binten  是否开启中断;
  *@return 无
  */
void HAL_SSI_STD_DMA_Program(SSI_TypeDef *SSIx, uint8_t* psend, uint32_t addr, uint32_t length, bool binten)
{
	SSI_STD_DMA_Program(SSIx, psend, addr, length, binten);
}


/**
  *@brief ssi单线模式下，从flash中读数据
  *@param[in] SSIx  指向SSI_TypeDef结构体的指针,此结构体包含了SSI模块的配置信息;
  *@param[in] psend 发送数据地址
  *@param[in] addr  源地址;
  *@param[in] length  传输数据长度;
  *@param[in] binten  是否开启中断;
  *@return 无
  */
void HAL_SSI_STD_DMA_Read(SSI_TypeDef *SSIx,  uint8_t* pread, uint32_t addr, uint32_t length, bool binten)
{
	SSI_STD_DMA_Read(SSIx, pread, addr, length, binten);
}






