3057 lines
81 KiB
C
3057 lines
81 KiB
C
/*==========================================================================================================
|
|
Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
|
|
Quectel Wireless Solutions Proprietary and Confidential.
|
|
===========================================================================================================*/
|
|
|
|
/*==========================================================================================================
|
|
|
|
EDIT HISTORY FOR MODULE
|
|
|
|
This section contains comments describing changes made to the module.
|
|
Notice that changes are listed in reverse chronological order.
|
|
|
|
WHEN WHO WHAT, WHERE, WHY
|
|
------------ ------- -------------------------------------------------------------------------------
|
|
09/04/2022 Fias 此文件是SPI的驱动接口
|
|
===========================================================================================================*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "osa.h"
|
|
#include "quec_spi.h"
|
|
#include "qspi_dma.h"
|
|
#include "bsp.h"
|
|
|
|
|
|
#ifndef MIN_SYS
|
|
|
|
#ifdef QUECTEL_OPEN_CPU
|
|
|
|
extern void UARTLogPrintf_Extend(const char *fmt, ...);
|
|
|
|
//#define spi_dbg_log(fmt, args...) uart_printf("[%s][%d]"fmt, __FUNCTION__, __LINE__, ##args)
|
|
|
|
#define spi_dbg_log(fmt, args...) \
|
|
{ \
|
|
/*if (log_config.log_cfg != LOG_DISABLE)*/ \
|
|
{ \
|
|
UARTLogPrintf_Extend(fmt, ##args); \
|
|
} \
|
|
}
|
|
|
|
|
|
#define CPUartLogPrintf(fmt,args...) \
|
|
{ \
|
|
/*if (log_config.log_cfg != LOG_DISABLE)*/ \
|
|
{ \
|
|
UARTLogPrintf_Extend(fmt, ##args); \
|
|
} \
|
|
}
|
|
|
|
extern void RTI_LOG(const char* fmt, ...);
|
|
|
|
#ifdef QUEC_FGM842D_WIFI_SUPPORT
|
|
//wifi一次传输1600字节, 可能会用到spi0 或者 spi2
|
|
#define SSP0_DMA_BUF_LEN 1600
|
|
#define SSP1_DMA_BUF_LEN 1024
|
|
#define SSP2_DMA_BUF_LEN 1600
|
|
|
|
#else //不支持wifi,使用默认的DMA长度
|
|
#define SSP0_DMA_BUF_LEN 1024
|
|
#define SSP1_DMA_BUF_LEN 1024
|
|
#define SSP2_DMA_BUF_LEN 1024
|
|
#endif
|
|
|
|
OSFlagRef SSP0_DMA_Done_FlgRef=NULL;
|
|
OSSemaRef SSP0SemaRef=NULL;
|
|
|
|
|
|
OSFlagRef SSP1_DMA_Done_FlgRef=NULL;
|
|
OSSemaRef SSP1SemaRef=NULL;
|
|
|
|
|
|
|
|
OSFlagRef SSP2_DMA_Done_FlgRef=NULL;
|
|
OSSemaRef SSP2SemaRef=NULL;
|
|
|
|
|
|
#define SSP0_DMA_INT_SUPPORT
|
|
#define SSP1_DMA_INT_SUPPORT
|
|
#define SSP2_DMA_INT_SUPPORT
|
|
|
|
/* Non-cache */
|
|
#pragma arm section rwdata="SSP0DmaBuf", zidata="SSP0DmaBuf"
|
|
__align(8) UINT8 DMA_SSP0_Tx_buf[SSP0_DMA_BUF_LEN+16]={0};
|
|
__align(8) UINT8 DMA_SSP0_Rx_buf[SSP0_DMA_BUF_LEN+16]={0};
|
|
#pragma arm section rwdata, zidata
|
|
|
|
|
|
|
|
/* Non-cache */
|
|
#pragma arm section rwdata="SSP1DmaBuf", zidata="SSP1DmaBuf"
|
|
__align(8) UINT8 DMA_SSP1_Tx_buf[SSP1_DMA_BUF_LEN+16]={0};
|
|
__align(8) UINT8 DMA_SSP1_Rx_buf[SSP1_DMA_BUF_LEN+16]={0};
|
|
#pragma arm section rwdata, zidata
|
|
|
|
|
|
/* Non-cache */
|
|
#pragma arm section rwdata="SSP2DmaBuf", zidata="SSP2DmaBuf"
|
|
__align(8) UINT8 DMA_SSP2_Tx_buf[SSP2_DMA_BUF_LEN+16]={0};
|
|
__align(8) UINT8 DMA_SSP2_Rx_buf[SSP2_DMA_BUF_LEN+16]={0};
|
|
#pragma arm section rwdata, zidata
|
|
|
|
|
|
static UINT32 v_spimode = SSP_SPI_MODE0;
|
|
|
|
|
|
|
|
//判断SPI端口是否被禁用
|
|
//该函数表示1607平台使用了SPI_PORT1返回1
|
|
int IS_SPI_PORT_DISABLED(port)
|
|
{
|
|
//1607平台只支持SPI0(GPIO33~36)SPI_PORT0;SPI1(GPIO4~7)SPI_PORT2;
|
|
if(CHIP_IS_CRANELG){
|
|
return (((port) == SPI_PORT1)?(1):(0));
|
|
}else{
|
|
return (0);
|
|
}
|
|
}
|
|
|
|
|
|
static void XllpDmacStartTransferWithStopIrqEnable( XLLP_DMAC_CHANNEL_T aChannel )
|
|
{
|
|
UINT32 aTargetData;
|
|
|
|
aTargetData = XLLP_Return_PDmacHandle()->DCSR[aChannel];
|
|
aTargetData |= XLLP_DMAC_DCSR_RUN | XLLP_DMAC_DCSR_STOP_IRQ_EN;
|
|
XLLP_Return_PDmacHandle()->DCSR[aChannel] = aTargetData;
|
|
}
|
|
|
|
static void spi_delay_us(unsigned int time)
|
|
{
|
|
volatile long i = 0;
|
|
|
|
i = time * 50;
|
|
|
|
while (i > 0)
|
|
{
|
|
i--;
|
|
}
|
|
}
|
|
|
|
|
|
static void Disable_SPI_SSP0(void)
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_SSE);
|
|
|
|
spi_reg_write(SSP0_TCR, SSP0_TCR_INITIAL); //default set data size 8bit
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_INITIAL);
|
|
spi_reg_write(SSP0_IER, SSP0_IER_INITIAL);
|
|
|
|
//CPUartLogPrintf("%s:SSP0_TCR[0x%x],SSP0_FCR[0x%x],SSP0_IER[0x%x]", __func__, spi_reg_read(SSP0_TCR), spi_reg_read(SSP0_FCR), spi_reg_read(SSP0_IER));
|
|
}
|
|
|
|
static void Disable_SPI_SSP1(void)
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_SSE);
|
|
|
|
spi_reg_write(SSP1_TCR, SSP1_TCR_INITIAL); //default set data size 8bit
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_INITIAL);
|
|
spi_reg_write(SSP1_IER, SSP1_IER_INITIAL);
|
|
|
|
//CPUartLogPrintf("%s:SSP1_TCR[0x%x],SSP1_FCR[0x%x],SSP1_IER[0x%x]", __func__, spi_reg_read(SSP1_TCR), spi_reg_read(SSP1_FCR), spi_reg_read(SSP1_IER));
|
|
}
|
|
|
|
|
|
static void Disable_SPI_SSP2(void)
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_SSE);
|
|
spi_reg_write(SSP2_TCR, SSP2_TCR_INITIAL); //default set data size 8bit
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_INITIAL);
|
|
spi_reg_write(SSP2_IER, SSP2_IER_INITIAL);
|
|
|
|
//CPUartLogPrintf("%s:SSP0_TCR[0x%x],SSP0_FCR[0x%x],SSP0_IER[0x%x]", __func__, spi_reg_read(SSP0_TCR), spi_reg_read(SSP0_FCR), spi_reg_read(SSP0_IER));
|
|
}
|
|
|
|
static void Enable_SPI_SSP0(void)
|
|
{
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_SSE);
|
|
//CPUartLogPrintf("%s:SSP0_TCR[0x%x]", __func__, spi_reg_read(SSP0_TCR));
|
|
}
|
|
|
|
|
|
static void Enable_SPI_SSP1(void)
|
|
{
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_SSE);
|
|
//CPUartLogPrintf("%s:SSP1_TCR[0x%x]", __func__, spi_reg_read(SSP1_TCR));
|
|
}
|
|
|
|
|
|
static void Enable_SPI_SSP2(void)
|
|
{
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_SSE);
|
|
//CPUartLogPrintf("%s:SSP0_TCR[0x%x]", __func__, spi_reg_read(SSP0_TCR));
|
|
}
|
|
|
|
/*Select the data bit length*/
|
|
static void SPI_SSP0_DSS(int DataSize)
|
|
{
|
|
switch(DataSize)
|
|
{
|
|
case 8:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS8);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, 0x8<<5/*SSP_TCR_DSS9*/);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS16);
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, 0x11<<5/*SSP_TCR_DSS18*/);
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS24);
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS32);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
CPUartLogPrintf("%s:invalid data size", __func__);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//CPUartLogPrintf("%s:DataSize=%d,SSP0_TCR[0x%x]", __func__, DataSize, spi_reg_read(SSP0_TCR));
|
|
}
|
|
|
|
static void SPI_SSP1_DSS(int DataSize)
|
|
{
|
|
switch(DataSize)
|
|
{
|
|
case 8:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS8);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, 0x8<<5/*SSP_TCR_DSS9*/);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS16);
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, 0x11<<5/*SSP_TCR_DSS18*/);
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS24);
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS32);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
CPUartLogPrintf("%s:invalid data size", __func__);
|
|
break;
|
|
}
|
|
}
|
|
//CPUartLogPrintf("%s:DataSize=%d,SSP1_TCR[0x%x]", __func__, DataSize, spi_reg_read(SSP1_TCR));
|
|
}
|
|
|
|
static void SPI_SSP2_DSS(int DataSize)
|
|
{
|
|
switch(DataSize)
|
|
{
|
|
case 8:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS8);
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, 0x8<<5/*SSP_TCR_DSS9*/);
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS16);
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, 0x11<<5/*SSP_TCR_DSS18*/);
|
|
break;
|
|
}
|
|
case 24:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS24);
|
|
break;
|
|
}
|
|
case 32:
|
|
{
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS32);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
CPUartLogPrintf("%s:invalid data size", __func__);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//CPUartLogPrintf("%s:DataSize=%d,SSP0_TCR[0x%x]", __func__, DataSize, spi_reg_read(SSP0_TCR));
|
|
}
|
|
|
|
|
|
static UINT32 SPI_SSP0_WaitSSPComplete(void)
|
|
{
|
|
volatile int timeout = 0;
|
|
|
|
timeout = 0xFFFF;
|
|
|
|
while ((spi_reg_read(SSP0_SR) & (SSP_SR_TFL | SSP_SR_TF_NF | SSP_SR_BSY)) != SSP_SR_TF_NF)
|
|
{
|
|
if((timeout--) <= 0)
|
|
{
|
|
CPUartLogPrintf("[NZC]SPINOR_WaitSSPComplete timeout");
|
|
return SSPWaitCompleteTimeOutError;
|
|
}
|
|
}
|
|
|
|
CPUartLogPrintf("%s:Exit", __func__);
|
|
|
|
return NoError;
|
|
}
|
|
|
|
|
|
static UINT32 SPI_SSP1_WaitSSPComplete(void)
|
|
{
|
|
volatile int timeout = 0;
|
|
|
|
timeout = 0xFFFF;
|
|
|
|
while ((spi_reg_read(SSP1_SR) & (SSP_SR_TFL | SSP_SR_TF_NF | SSP_SR_BSY)) != SSP_SR_TF_NF)
|
|
{
|
|
if((timeout--) <= 0)
|
|
{
|
|
CPUartLogPrintf("[NZC]SPINOR_WaitSSPComplete timeout");
|
|
return SSPWaitCompleteTimeOutError;
|
|
}
|
|
}
|
|
|
|
CPUartLogPrintf("%s:Exit", __func__);
|
|
|
|
return NoError;
|
|
}
|
|
|
|
|
|
static UINT32 SPI_SSP2_WaitSSPComplete(void)
|
|
{
|
|
volatile int timeout = 0;
|
|
|
|
timeout = 0xFFFF;
|
|
|
|
while ((spi_reg_read(SSP2_SR) & (SSP_SR_TFL | SSP_SR_TF_NF | SSP_SR_BSY)) != SSP_SR_TF_NF)
|
|
{
|
|
if((timeout--) <= 0)
|
|
{
|
|
CPUartLogPrintf("[NZC]SPINOR_WaitSSPComplete timeout");
|
|
return SSPWaitCompleteTimeOutError;
|
|
}
|
|
}
|
|
|
|
CPUartLogPrintf("%s:Exit", __func__);
|
|
|
|
return NoError;
|
|
}
|
|
|
|
/* START SPI DMA transfer*/
|
|
static UINT32 QUEC_SPI_SSP0_DMA_transfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 i = 0;
|
|
UINT32 flag_value, Retval = NoError;
|
|
DMA_CMDx_T RX_Cmd, TX_Cmd;
|
|
OSA_STATUS os_status = OS_SUCCESS;
|
|
|
|
ASSERT(len <= SSP0_DMA_BUF_LEN);
|
|
|
|
ASSERT(OSASemaphoreAcquire(SSP0SemaRef, OS_SUSPEND) == OS_SUCCESS);
|
|
|
|
//paddy.li 2020-06-16 fix SPI DMA Transfer Fail when without USB PLUGIN
|
|
//SleepFlag_SPI_Interface_DMA_Set(1);
|
|
|
|
if(outbuf != NULL)
|
|
{
|
|
memcpy(DMA_SSP0_Tx_buf, outbuf, len);
|
|
}
|
|
else
|
|
{
|
|
memset(&DMA_SSP0_Tx_buf[0], 0xFF, 8);
|
|
}
|
|
|
|
//fill out commands
|
|
RX_Cmd.value = 0;
|
|
RX_Cmd.bits.IncSrcAddr = 0;
|
|
RX_Cmd.bits.IncTrgAddr = 1;
|
|
RX_Cmd.bits.FlowSrc = 1;
|
|
RX_Cmd.bits.FlowTrg = 0;
|
|
RX_Cmd.bits.Width = 1;
|
|
RX_Cmd.bits.MaxBurstSize = 1;
|
|
RX_Cmd.bits.Length = len;
|
|
|
|
|
|
TX_Cmd.value = 0;
|
|
TX_Cmd.bits.IncSrcAddr = (outbuf != NULL);//if outbuf is not NULL, set IncSrcAddr 1, else set IncSrcAddr 0
|
|
TX_Cmd.bits.IncTrgAddr = 0;
|
|
TX_Cmd.bits.FlowSrc = 0;
|
|
TX_Cmd.bits.FlowTrg = 1;
|
|
TX_Cmd.bits.Width = 1;
|
|
TX_Cmd.bits.MaxBurstSize = 1;
|
|
TX_Cmd.bits.Length = len;
|
|
|
|
//setup DMA
|
|
//Map Device to Channels
|
|
XllpDmacMapDeviceToChannel(SSP0_RX_DMA_DEVICE, SSP0_RX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
XllpDmacMapDeviceToChannel(SSP0_TX_DMA_DEVICE, SSP0_TX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
|
|
XllpDmacNoDescriptorFetch(SSP0_RX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
XllpDmacNoDescriptorFetch(SSP0_TX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
|
|
//turn ON user alignment - in case buffer address is 64bit aligned
|
|
alignChannel(SSP0_RX_CHANNEL, 1); // 1 = user aligned (source and target addresses)
|
|
alignChannel(SSP0_TX_CHANNEL, 1); //DALGNX |= 1 << SSP0_TX_CHANNEL
|
|
|
|
//CPUartLogPrintf("TXCMD:0x%x, RXCMD:0x%x, raddr:0x%x, &DMA_SSP0_Tx_buf[0]=0x%x, &DMA_SSP0_Rx_buf[0]=0x%x\n", TX_Cmd.value, RX_Cmd.value, read_buff, &DMA_SSP0_Tx_buf[0], &DMA_SSP0_Rx_buf[0]);
|
|
|
|
loadNonDescriptor((UINT32)SSP0_DR, (UINT32)&DMA_SSP0_Rx_buf[0], &RX_Cmd, SSP0_RX_CHANNEL);//CMDx=RX_Cmd.value, TADRx=read_buff, SADRx=SSP0_DR
|
|
loadNonDescriptor((UINT32)&DMA_SSP0_Tx_buf[0], (UINT32)SSP0_DR, &TX_Cmd, SSP0_TX_CHANNEL);
|
|
|
|
//make sure SSP is disabled
|
|
Disable_SPI_SSP0();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP0_TCR, SSP0_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_INITIAL);
|
|
spi_reg_write(SSP0_IER, SSP0_IER_INITIAL);
|
|
/*Fias 2021-09-06 锟斤拷锟斤拷 Time Out Register TOR值*/
|
|
spi_reg_write(SSP0_TOR, 0x300);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP0_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP0();
|
|
|
|
//Kick off DMA
|
|
#ifdef SSP0_DMA_INT_SUPPORT
|
|
XllpDmacStartTransferWithStopIrqEnable(SSP0_RX_CHANNEL); //enable SSP0 RX DMA STOP INT
|
|
#else
|
|
XllpDmacStartTransfer(SSP0_RX_CHANNEL);
|
|
#endif
|
|
|
|
XllpDmacStartTransfer(SSP0_TX_CHANNEL);
|
|
|
|
CPUartLogPrintf("%s,kick off DMA",__func__);
|
|
|
|
|
|
#ifdef SSP0_DMA_INT_SUPPORT
|
|
os_status = OSAFlagWait( SSP0_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR_CLEAR, &flag_value, 10 );
|
|
if(os_status == OS_SUCCESS)
|
|
{
|
|
CPUartLogPrintf("DMA Transfer Done,len=0x%x",len);
|
|
}
|
|
else
|
|
{
|
|
|
|
UINT32 timeout = 0xFFFF;
|
|
//wait until the RX channel gets the stop UINT_Terrupt and the TX fifo is drained
|
|
while( ((readDmaStatusRegister(SSP0_RX_CHANNEL) & XLLP_DMAC_DCSR_STOP_INTR) != XLLP_DMAC_DCSR_STOP_INTR) )
|
|
{
|
|
//if we've waited long enough, fail
|
|
if((timeout--) <= 0)
|
|
{
|
|
RTI_LOG("TIMEOUT, os_status=0x%x, DMA Status 0x%x, SSP Status 0x%x", os_status, readDmaStatusRegister(SSP0_RX_CHANNEL), *SSP0_SR);
|
|
Retval = SSPRxChannelTimeOutError;
|
|
break;
|
|
}
|
|
}
|
|
if(Retval == NoError)
|
|
CPUartLogPrintf("%s,DMA Transfer Done after polling",__func__);
|
|
}
|
|
#endif
|
|
|
|
SPI_SSP0_WaitSSPComplete();
|
|
//make sure SSP is disabled
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_SSE | SSP_TCR_HFL);
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP0_TCR, SSP0_TCR_INITIAL);
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_INITIAL);
|
|
spi_reg_write(SSP0_IER, SSP0_IER_INITIAL);
|
|
spi_reg_write(SSP0_TOR, 0);
|
|
|
|
//clear out DMA settings
|
|
XllpDmacUnMapDeviceToChannel(SSP0_RX_DMA_DEVICE, SSP0_RX_CHANNEL);
|
|
XllpDmacUnMapDeviceToChannel(SSP0_TX_DMA_DEVICE, SSP0_TX_CHANNEL);
|
|
|
|
if(inbuf)
|
|
memcpy( (UINT8 *)inbuf, DMA_SSP0_Rx_buf, len );
|
|
/*else
|
|
for(i=0;i<len;i++)
|
|
CPUartLogPrintf("DMA_SSP0_Rx_buf[%d]=0x%x\n", i, DMA_SSP0_Rx_buf[i]);
|
|
*/
|
|
|
|
//paddy.li 2020-06-16 fix SPI DMA Transfer Fail when without USB PLUGIN
|
|
//SleepFlag_SPI_Interface_DMA_Set(0);
|
|
|
|
ASSERT(OSASemaphoreRelease(SSP0SemaRef) == OS_SUCCESS);
|
|
return Retval;
|
|
}
|
|
|
|
|
|
static UINT32 QUEC_SPI_SSP1_DMA_transfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 i = 0;
|
|
UINT32 flag_value, Retval = NoError;
|
|
DMA_CMDx_T RX_Cmd, TX_Cmd;
|
|
OSA_STATUS os_status = OS_SUCCESS;
|
|
|
|
ASSERT(len <= SSP1_DMA_BUF_LEN);
|
|
|
|
ASSERT(OSASemaphoreAcquire(SSP1SemaRef, OS_SUSPEND) == OS_SUCCESS);
|
|
|
|
//paddy.li 2020-06-16 fix SPI DMA Transfer Fail when without USB PLUGIN
|
|
//SleepFlag_SPI_Interface_DMA_Set(1);
|
|
|
|
if(outbuf != NULL)
|
|
{
|
|
memcpy(DMA_SSP1_Tx_buf, outbuf, len);
|
|
}
|
|
else
|
|
{
|
|
memset(&DMA_SSP1_Tx_buf[0], 0xFF, 8);
|
|
}
|
|
|
|
//fill out commands
|
|
RX_Cmd.value = 0;
|
|
RX_Cmd.bits.IncSrcAddr = 0;
|
|
RX_Cmd.bits.IncTrgAddr = 1;
|
|
RX_Cmd.bits.FlowSrc = 1;
|
|
RX_Cmd.bits.FlowTrg = 0;
|
|
RX_Cmd.bits.Width = 1;
|
|
RX_Cmd.bits.MaxBurstSize = 1;
|
|
RX_Cmd.bits.Length = len;
|
|
|
|
|
|
TX_Cmd.value = 0;
|
|
TX_Cmd.bits.IncSrcAddr = (outbuf != NULL);//if outbuf is not NULL, set IncSrcAddr 1, else set IncSrcAddr 0
|
|
TX_Cmd.bits.IncTrgAddr = 0;
|
|
TX_Cmd.bits.FlowSrc = 0;
|
|
TX_Cmd.bits.FlowTrg = 1;
|
|
TX_Cmd.bits.Width = 1;
|
|
TX_Cmd.bits.MaxBurstSize = 1;
|
|
TX_Cmd.bits.Length = len;
|
|
|
|
//setup DMA
|
|
//Map Device to Channels
|
|
XllpDmacMapDeviceToChannel(SSP1_RX_DMA_DEVICE, SSP1_RX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
XllpDmacMapDeviceToChannel(SSP1_TX_DMA_DEVICE, SSP1_TX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
|
|
XllpDmacNoDescriptorFetch(SSP1_RX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
XllpDmacNoDescriptorFetch(SSP1_TX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
|
|
//turn ON user alignment - in case buffer address is 64bit aligned
|
|
alignChannel(SSP1_RX_CHANNEL, 1); // 1 = user aligned (source and target addresses)
|
|
alignChannel(SSP1_TX_CHANNEL, 1); //DALGNX |= 1 << SSP0_TX_CHANNEL
|
|
|
|
//CPUartLogPrintf("TXCMD:0x%x, RXCMD:0x%x, raddr:0x%x, &DMA_SSP1_Tx_buf[0]=0x%x, &DMA_SSP1_Rx_buf[0]=0x%x\n", TX_Cmd.value, RX_Cmd.value, read_buff, &DMA_SSP1_Tx_buf[0], &DMA_SSP1_Rx_buf[0]);
|
|
|
|
loadNonDescriptor((UINT32)SSP1_DR, (UINT32)&DMA_SSP1_Rx_buf[0], &RX_Cmd, SSP1_RX_CHANNEL);//CMDx=RX_Cmd.value, TADRx=read_buff, SADRx=SSP0_DR
|
|
loadNonDescriptor((UINT32)&DMA_SSP1_Tx_buf[0], (UINT32)SSP1_DR, &TX_Cmd, SSP1_TX_CHANNEL);
|
|
|
|
//make sure SSP is disabled
|
|
Disable_SPI_SSP1();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP1_TCR, SSP1_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_INITIAL);
|
|
spi_reg_write(SSP1_IER, SSP1_IER_INITIAL);
|
|
/*Fias 2021-09-06 锟斤拷锟斤拷 Time Out Register TOR值*/
|
|
spi_reg_write(SSP1_TOR, 0x300);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP1_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP1();
|
|
|
|
//Kick off DMA
|
|
#ifdef SSP1_DMA_INT_SUPPORT
|
|
XllpDmacStartTransferWithStopIrqEnable(SSP1_RX_CHANNEL); //enable SSP1 RX DMA STOP INT
|
|
#else
|
|
XllpDmacStartTransfer(SSP1_RX_CHANNEL);
|
|
#endif
|
|
|
|
XllpDmacStartTransfer(SSP1_TX_CHANNEL);
|
|
|
|
CPUartLogPrintf("%s,kick off DMA",__func__);
|
|
|
|
|
|
#ifdef SSP1_DMA_INT_SUPPORT
|
|
os_status = OSAFlagWait(SSP1_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR_CLEAR, &flag_value, 10 );
|
|
if(os_status == OS_SUCCESS)
|
|
{
|
|
CPUartLogPrintf("DMA Transfer Done,len=0x%x",len);
|
|
}
|
|
else
|
|
{
|
|
UINT32 timeout = 0xFFFF;
|
|
//wait until the RX channel gets the stop UINT_Terrupt and the TX fifo is drained
|
|
while( ((readDmaStatusRegister(SSP1_RX_CHANNEL) & XLLP_DMAC_DCSR_STOP_INTR) != XLLP_DMAC_DCSR_STOP_INTR) )
|
|
{
|
|
//if we've waited long enough, fail
|
|
if((timeout--) <= 0)
|
|
{
|
|
RTI_LOG("TIMEOUT, os_status=0x%x, DMA Status 0x%x, SSP Status 0x%x", os_status, readDmaStatusRegister(SSP1_RX_CHANNEL), *SSP1_SR);
|
|
Retval = SSPRxChannelTimeOutError;
|
|
break;
|
|
}
|
|
}
|
|
if(Retval == NoError)
|
|
CPUartLogPrintf("%s,DMA Transfer Done after polling",__func__);
|
|
}
|
|
#endif
|
|
|
|
SPI_SSP1_WaitSSPComplete();
|
|
//make sure SSP is disabled
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_SSE | SSP_TCR_HFL);
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP1_TCR, SSP1_TCR_INITIAL);
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_INITIAL);
|
|
spi_reg_write(SSP1_IER, SSP1_IER_INITIAL);
|
|
spi_reg_write(SSP1_TOR, 0);
|
|
|
|
//clear out DMA settings
|
|
XllpDmacUnMapDeviceToChannel(SSP1_RX_DMA_DEVICE, SSP1_RX_CHANNEL);
|
|
XllpDmacUnMapDeviceToChannel(SSP1_TX_DMA_DEVICE, SSP1_TX_CHANNEL);
|
|
|
|
if(inbuf)
|
|
memcpy( (UINT8 *)inbuf, DMA_SSP1_Rx_buf, len );
|
|
/*else
|
|
for(i=0;i<len;i++)
|
|
CPUartLogPrintf("DMA_SSP1_Rx_buf[%d]=0x%x\n", i, DMA_SSP1_Rx_buf[i]);
|
|
*/
|
|
|
|
//paddy.li 2020-06-16 fix SPI DMA Transfer Fail when without USB PLUGIN
|
|
//SleepFlag_SPI_Interface_DMA_Set(0);
|
|
|
|
ASSERT(OSASemaphoreRelease(SSP1SemaRef) == OS_SUCCESS);
|
|
return Retval;
|
|
}
|
|
|
|
|
|
|
|
|
|
static UINT32 QUEC_SPI_SSP2_DMA_transfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 i = 0;
|
|
UINT32 flag_value, Retval = NoError;
|
|
DMA_CMDx_T RX_Cmd, TX_Cmd;
|
|
OSA_STATUS os_status = OS_SUCCESS;
|
|
|
|
ASSERT(len <= SSP2_DMA_BUF_LEN);
|
|
|
|
|
|
ASSERT(OSASemaphoreAcquire(SSP2SemaRef, OS_SUSPEND) == OS_SUCCESS);
|
|
//SleepFlag_SPI_Interface_DMA_Set(1);
|
|
|
|
if(outbuf != NULL)
|
|
{
|
|
memcpy(DMA_SSP2_Tx_buf, outbuf, len);
|
|
}
|
|
else
|
|
{
|
|
memset(&DMA_SSP2_Tx_buf[0], 0xFF, 8);
|
|
}
|
|
|
|
//fill out commands
|
|
RX_Cmd.value = 0;
|
|
RX_Cmd.bits.IncSrcAddr = 0;
|
|
RX_Cmd.bits.IncTrgAddr = 1;
|
|
RX_Cmd.bits.FlowSrc = 1;
|
|
RX_Cmd.bits.FlowTrg = 0;
|
|
RX_Cmd.bits.Width = 1;
|
|
RX_Cmd.bits.MaxBurstSize = 1;
|
|
RX_Cmd.bits.Length = len;
|
|
|
|
|
|
TX_Cmd.value = 0;
|
|
TX_Cmd.bits.IncSrcAddr = (outbuf != NULL);//if outbuf is not NULL, set IncSrcAddr 1, else set IncSrcAddr 0
|
|
TX_Cmd.bits.IncTrgAddr = 0;
|
|
TX_Cmd.bits.FlowSrc = 0;
|
|
TX_Cmd.bits.FlowTrg = 1;
|
|
TX_Cmd.bits.Width = 1;
|
|
TX_Cmd.bits.MaxBurstSize = 1;
|
|
TX_Cmd.bits.Length = len;
|
|
|
|
//setup DMA
|
|
//Map Device to Channels
|
|
XllpDmacMapDeviceToChannel(SSP2_RX_DMA_DEVICE, SSP2_RX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
XllpDmacMapDeviceToChannel(SSP2_TX_DMA_DEVICE, SSP2_TX_CHANNEL);//map dma channel in DMA_RCMRx
|
|
|
|
XllpDmacNoDescriptorFetch(SSP2_RX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
XllpDmacNoDescriptorFetch(SSP2_TX_CHANNEL);//set No-Descriptor Fetch bit in DMA_CSR031
|
|
|
|
//turn ON user alignment - in case buffer address is 64bit aligned
|
|
alignChannel(SSP2_RX_CHANNEL, 1); // 1 = user aligned (source and target addresses)
|
|
alignChannel(SSP2_TX_CHANNEL, 1); //DALGNX |= 1 << SSP0_TX_CHANNEL
|
|
|
|
loadNonDescriptor((UINT32)SSP2_DR, (UINT32)&DMA_SSP2_Rx_buf[0], &RX_Cmd, SSP2_RX_CHANNEL);//CMDx=RX_Cmd.value, TADRx=read_buff, SADRx=SSP0_DR
|
|
loadNonDescriptor((UINT32)&DMA_SSP2_Tx_buf[0], (UINT32)SSP2_DR, &TX_Cmd, SSP2_TX_CHANNEL);
|
|
|
|
//make sure SSP is disabled
|
|
Disable_SPI_SSP2();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP2_TCR, SSP2_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_INITIAL);
|
|
spi_reg_write(SSP2_IER, SSP2_IER_INITIAL);
|
|
/*Fias 2021-09-06 锟斤拷锟斤拷 Time Out Register TOR值*/
|
|
spi_reg_write(SSP2_TOR, 0x300);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP2_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP2();
|
|
|
|
//Kick off DMA
|
|
#ifdef SSP2_DMA_INT_SUPPORT
|
|
XllpDmacStartTransferWithStopIrqEnable(SSP2_RX_CHANNEL); //enable SSP0 RX DMA STOP INT
|
|
#else
|
|
XllpDmacStartTransfer(SSP2_RX_CHANNEL);
|
|
#endif
|
|
|
|
XllpDmacStartTransfer(SSP2_TX_CHANNEL);
|
|
|
|
CPUartLogPrintf("%s,kick off DMA",__func__);
|
|
|
|
|
|
#ifdef SSP2_DMA_INT_SUPPORT
|
|
os_status = OSAFlagWait( SSP2_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR_CLEAR, &flag_value, 10);
|
|
if(os_status == OS_SUCCESS)
|
|
{
|
|
CPUartLogPrintf("DMA Transfer Done,len=0x%x",len);
|
|
}
|
|
else
|
|
{
|
|
UINT32 timeout = 0xFFFF;
|
|
//wait until the RX channel gets the stop UINT_Terrupt and the TX fifo is drained
|
|
while( ((readDmaStatusRegister(SSP2_RX_CHANNEL) & XLLP_DMAC_DCSR_STOP_INTR) != XLLP_DMAC_DCSR_STOP_INTR) )
|
|
{
|
|
//if we've waited long enough, fail
|
|
if((timeout--) <= 0)
|
|
{
|
|
RTI_LOG("TIMEOUT, os_status=0x%x, DMA Status 0x%x, SSP Status 0x%x", os_status, readDmaStatusRegister(SSP2_RX_CHANNEL), *SSP2_SR);
|
|
Retval = SSPRxChannelTimeOutError;
|
|
break;
|
|
}
|
|
}
|
|
if(Retval == NoError)
|
|
CPUartLogPrintf("%s,DMA Transfer Done after polling",__func__);
|
|
}
|
|
#endif
|
|
|
|
SPI_SSP2_WaitSSPComplete();
|
|
|
|
//make sure SSP is disabled
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_SSE | SSP_TCR_HFL);
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP2_TCR, SSP2_TCR_INITIAL);
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_INITIAL);
|
|
spi_reg_write(SSP2_IER, SSP2_IER_INITIAL);
|
|
spi_reg_write(SSP2_TOR, 0);
|
|
|
|
//clear out DMA settings
|
|
XllpDmacUnMapDeviceToChannel(SSP2_RX_DMA_DEVICE, SSP2_RX_CHANNEL);
|
|
XllpDmacUnMapDeviceToChannel(SSP2_TX_DMA_DEVICE, SSP2_TX_CHANNEL);
|
|
|
|
if(inbuf)
|
|
memcpy( (UINT8 *)inbuf, DMA_SSP2_Rx_buf, len );
|
|
/*else
|
|
for(i=0;i<len;i++)
|
|
CPUartLogPrintf("DMA_SSP0_Rx_buf[%d]=0x%x\n", i, DMA_SSP0_Rx_buf[i]);
|
|
*/
|
|
|
|
//SleepFlag_SPI_Interface_DMA_Set(0);
|
|
|
|
ASSERT(OSASemaphoreRelease(SSP2SemaRef) == OS_SUCCESS);
|
|
return Retval;
|
|
}
|
|
|
|
|
|
|
|
#ifdef SSP0_DMA_INT_SUPPORT
|
|
int SSP0_DMA_DONE_ISR(UINT32 val)
|
|
{
|
|
XllpDmacStopTransfer( SSP0_RX_CHANNEL );
|
|
XllpDmacStopTransfer( SSP0_TX_CHANNEL );
|
|
OSAFlagSet(SSP0_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR);
|
|
//CPUartLogPrintf("yjy,ssp0 dma stop int,ch:%d\n", SSP0_RX_CHANNEL);
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef SSP1_DMA_INT_SUPPORT
|
|
int SSP1_DMA_DONE_ISR(UINT32 val)
|
|
{
|
|
XllpDmacStopTransfer( SSP1_RX_CHANNEL );
|
|
XllpDmacStopTransfer( SSP1_TX_CHANNEL );
|
|
OSAFlagSet(SSP1_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR);
|
|
//CPUartLogPrintf("yjy,ssp1 dma stop int,ch:%d\n", SSP1_RX_CHANNEL);
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef SSP2_DMA_INT_SUPPORT
|
|
int SSP2_DMA_DONE_ISR(UINT32 val)
|
|
{
|
|
XllpDmacStopTransfer( SSP2_RX_CHANNEL );
|
|
XllpDmacStopTransfer( SSP2_TX_CHANNEL );
|
|
OSAFlagSet(SSP2_DMA_Done_FlgRef, 0x01, OSA_FLAG_OR);
|
|
//CPUartLogPrintf("yjy,ssp2 dma stop int,ch:%d\n", SSP2_RX_CHANNEL);
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP0_DataTransfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP0_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(inbuf, outbuf, SSP0_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
inbuf += SSP0_DMA_BUF_LEN;
|
|
outbuf += SSP0_DMA_BUF_LEN;
|
|
len -= SSP0_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(inbuf, outbuf, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP1_DataTransfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP1_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(inbuf, outbuf, SSP1_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
inbuf += SSP1_DMA_BUF_LEN;
|
|
outbuf += SSP1_DMA_BUF_LEN;
|
|
len -= SSP1_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(inbuf, outbuf, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP2_DataTransfer(unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP2_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(inbuf, outbuf, SSP2_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
inbuf += SSP2_DMA_BUF_LEN;
|
|
outbuf += SSP2_DMA_BUF_LEN;
|
|
len -= SSP2_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(inbuf, outbuf, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP0_DMA_WriteData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP0_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(NULL, buf, SSP0_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP0_DMA_BUF_LEN;
|
|
len -= SSP0_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(NULL, buf, len);
|
|
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP1_DMA_WriteData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP1_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(NULL, buf, SSP1_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP1_DMA_BUF_LEN;
|
|
len -= SSP1_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(NULL, buf, len);
|
|
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP2_DMA_WriteData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP2_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(NULL, buf, SSP2_DMA_BUF_LEN);
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP2_DMA_BUF_LEN;
|
|
len -= SSP2_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(NULL, buf, len);
|
|
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP0_DMA_ReadData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP0_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(buf, NULL, SSP0_DMA_BUF_LEN);
|
|
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP0_DMA_BUF_LEN;
|
|
len -= SSP0_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP0_DMA_transfer(buf, NULL, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP1_DMA_ReadData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP1_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(buf, NULL, SSP1_DMA_BUF_LEN);
|
|
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP1_DMA_BUF_LEN;
|
|
len -= SSP1_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP1_DMA_transfer(buf, NULL, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
|
|
UINT32 QUEC_SPI_SSP2_DMA_ReadData(unsigned char *buf, unsigned int len)
|
|
{
|
|
UINT32 Retval = NoError;
|
|
|
|
while(len > SSP2_DMA_BUF_LEN)
|
|
{
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(buf, NULL, SSP2_DMA_BUF_LEN);
|
|
|
|
if(Retval != NoError)
|
|
return Retval;
|
|
|
|
buf += SSP2_DMA_BUF_LEN;
|
|
len -= SSP2_DMA_BUF_LEN;
|
|
}
|
|
|
|
if(len != 0)
|
|
Retval = QUEC_SPI_SSP2_DMA_transfer(buf, NULL, len);
|
|
|
|
return Retval;
|
|
}
|
|
|
|
/* END SPI DMA transfer*/
|
|
|
|
|
|
/* START SPI FIFO transfer*/
|
|
//#ifdef QUEC_SPI_FIFO
|
|
void QUEC_SPI_SSP0_PIO_transfer(unsigned char *buf_in,unsigned char *buf_out, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(8);
|
|
Enable_SPI_SSP0();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP0_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = BU_REG_READ8(SSP0_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP0_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
|
|
|
|
}
|
|
|
|
void QUEC_SPI_SSP0_PIO_Width_transfer(unsigned int *buf_in,unsigned int *buf_out, unsigned int len,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(bit_width);
|
|
Enable_SPI_SSP0();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP0_DR=buf_out[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = *(volatile unsigned int*)SSP0_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP0_DR=buf_out[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void QUEC_SPI_SSP1_PIO_transfer(unsigned char *buf_in,unsigned char *buf_out, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(8);
|
|
Enable_SPI_SSP1();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP1_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = BU_REG_READ8(SSP1_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP1_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP1();
|
|
|
|
|
|
}
|
|
|
|
void QUEC_SPI_SSP1_PIO_Width_transfer(unsigned int *buf_in,unsigned int *buf_out, unsigned int len,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(bit_width);
|
|
Enable_SPI_SSP1();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP1_DR=buf_out[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = *(volatile unsigned int*)SSP1_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP1_DR=buf_out[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP1();
|
|
|
|
|
|
}
|
|
|
|
|
|
void QUEC_SPI_SSP2_PIO_transfer(unsigned char *buf_in,unsigned char *buf_out, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(8);
|
|
Enable_SPI_SSP2();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP2_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = BU_REG_READ8(SSP2_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP2_DR, buf_out[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
|
|
}
|
|
|
|
|
|
void QUEC_SPI_SSP2_PIO_Width_transfer(unsigned int *buf_in,unsigned int *buf_out, unsigned int len, int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
//unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(bit_width);
|
|
Enable_SPI_SSP2();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)(SSP2_DR) = buf_out[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf_in[in_index++] = *(volatile unsigned int *)SSP2_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)(SSP2_DR) = buf_out[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
|
|
}
|
|
|
|
|
|
/***********************************************************
|
|
* SPI_SSP0_Write
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
void QUEC_SPI_SSP0_PIO_Write(unsigned char *buf, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(8);
|
|
Enable_SPI_SSP0();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP0_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = BU_REG_READ8(SSP0_DR);
|
|
in_index++;
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP0_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
|
|
/*asr add end*/
|
|
}
|
|
|
|
void QUEC_SPI_SSP0_PIO_Width_Write(unsigned int *buf,unsigned int len,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(bit_width);
|
|
Enable_SPI_SSP0();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP0_DR=buf[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = *(volatile unsigned int*)SSP0_DR;
|
|
in_index++;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP0_DR=buf[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
|
|
/*asr add end*/
|
|
}
|
|
|
|
/***********************************************************
|
|
* SPI_SSP1_Write
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
|
|
void QUEC_SPI_SSP1_PIO_Write(unsigned char *buf, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(8);
|
|
Enable_SPI_SSP1();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP1_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = BU_REG_READ8(SSP1_DR);
|
|
in_index++;
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP1_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP1();
|
|
|
|
/*asr add end*/
|
|
}
|
|
|
|
void QUEC_SPI_SSP1_PIO_Width_Write(unsigned int *buf,unsigned int len,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(bit_width);
|
|
Enable_SPI_SSP1();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP1_DR=buf[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = *(volatile unsigned int*)SSP1_DR;
|
|
in_index++;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP1_DR=buf[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP1();
|
|
|
|
/*asr add end*/
|
|
}
|
|
|
|
/***********************************************************
|
|
* SPI_SSP2_Write
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
void QUEC_SPI_SSP2_PIO_Write(unsigned char *buf, unsigned int len)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(8);
|
|
Enable_SPI_SSP2();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP2_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = BU_REG_READ8(SSP2_DR);
|
|
in_index++;
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP2_DR, buf[out_index++]);
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
}
|
|
|
|
|
|
void QUEC_SPI_SSP2_PIO_Width_Write(unsigned int *buf, unsigned int len, int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int miso_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(bit_width);
|
|
Enable_SPI_SSP2();
|
|
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)(SSP2_DR) = buf[out_index++];
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
miso_data = *(volatile unsigned int *)SSP2_DR;
|
|
in_index++;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)(SSP2_DR) = buf[out_index++];
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
}
|
|
|
|
|
|
/***********************************************************
|
|
* SPI_SSP0_Read
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
void QUEC_SPI_SSP0_PIO_Read(unsigned char *buf, unsigned int len, unsigned char mosi_status)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(8);
|
|
Enable_SPI_SSP0();
|
|
if(mosi_status)
|
|
mosi_data = 0xff;
|
|
else
|
|
mosi_data = 0x00;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP0_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = BU_REG_READ8(SSP0_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP0_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
}
|
|
|
|
void QUEC_SPI_SSP0_PIO_Width_Read(unsigned int *buf, unsigned int len, unsigned char mosi_status,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP0();
|
|
SPI_SSP0_DSS(bit_width);
|
|
Enable_SPI_SSP0();
|
|
if(mosi_status)
|
|
mosi_data = 0xffffffff;
|
|
else
|
|
mosi_data = 0x00000000;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP0_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP0_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP0_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP0_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = *(volatile unsigned int*)SSP0_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP0_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
}
|
|
|
|
/***********************************************************
|
|
* SPI_SSP1_Read
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
void QUEC_SPI_SSP1_PIO_Read(unsigned char *buf, unsigned int len, unsigned char mosi_status)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(8);
|
|
Enable_SPI_SSP1();
|
|
if(mosi_status)
|
|
mosi_data = 0xff;
|
|
else
|
|
mosi_data = 0x00;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP1_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = BU_REG_READ8(SSP1_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP1_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP1();
|
|
}
|
|
|
|
void QUEC_SPI_SSP1_PIO_Width_Read(unsigned int *buf, unsigned int len, unsigned char mosi_status,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP1();
|
|
SPI_SSP1_DSS(bit_width);
|
|
Enable_SPI_SSP1();
|
|
if(mosi_status)
|
|
mosi_data = 0xffffffff;
|
|
else
|
|
mosi_data = 0x00000000;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP1_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP1_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP1_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP1_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = *(volatile unsigned int*)SSP1_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP1_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP0();
|
|
}
|
|
|
|
/***********************************************************
|
|
* SPI_SSP2_Read
|
|
* PIO mode to write and then read out the data
|
|
* Returns:
|
|
* None
|
|
*************************************************************/
|
|
void QUEC_SPI_SSP2_PIO_Read(unsigned char *buf, unsigned int len, unsigned char mosi_status)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned char mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(8);
|
|
Enable_SPI_SSP2();
|
|
if(mosi_status)
|
|
mosi_data = 0xff;
|
|
else
|
|
mosi_data = 0x00;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
BU_REG_WRITE8(SSP2_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = BU_REG_READ8(SSP2_DR);
|
|
if(out_index<len)
|
|
BU_REG_WRITE8(SSP2_DR, mosi_data);
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
|
|
}
|
|
/* END SPI FIFO transfer*/
|
|
|
|
|
|
void QUEC_SPI_SSP2_PIO_Width_Read(unsigned int *buf, unsigned int len, unsigned char mosi_status,int bit_width)
|
|
{
|
|
unsigned int out_index = 0,in_index = 0;
|
|
unsigned int tmp_rxfifo;
|
|
unsigned char TxFifoLevel, RxFifoLevel;
|
|
unsigned int mosi_data;
|
|
int i;
|
|
|
|
Disable_SPI_SSP2();
|
|
SPI_SSP2_DSS(bit_width);
|
|
Enable_SPI_SSP2();
|
|
if(mosi_status)
|
|
mosi_data = 0xffffffff;
|
|
else
|
|
mosi_data = 0x00000000;
|
|
|
|
//SpiCsEnalbe();
|
|
if(((*SSP2_SR) & SSP_SR_TX_FIFO_NOT_FULL) == 0)
|
|
TxFifoLevel = 32; //1802s TxFIFO Trigger Level max vaule is 32
|
|
else
|
|
TxFifoLevel = ((*SSP2_SR)>>7)&0x1f;
|
|
|
|
for(i=TxFifoLevel; i<32 && out_index<len; i++)
|
|
{
|
|
*(volatile unsigned int*)SSP2_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_out[%d]=0x%x", __func__, out_index-1,buf_out[out_index-1]);
|
|
}
|
|
do{
|
|
|
|
tmp_rxfifo=*SSP2_SR;
|
|
|
|
RxFifoLevel=((tmp_rxfifo>>15)&0x1f);
|
|
|
|
if(((tmp_rxfifo & SSP_SR_RX_FIFO_NOT_EMPTY) == 0) && RxFifoLevel == 0x1f)
|
|
{
|
|
RxFifoLevel=0;
|
|
}
|
|
else
|
|
{
|
|
RxFifoLevel++;
|
|
}
|
|
for(i = 0; i<RxFifoLevel && in_index<len; i++)
|
|
{
|
|
buf[in_index++] = *(volatile unsigned int*)SSP2_DR;
|
|
if(out_index<len)
|
|
*(volatile unsigned int*)SSP2_DR=mosi_data;
|
|
out_index++;
|
|
//uart_printf("%s:buf_in[%d]=0x%x", __func__, in_index-1,buf_in[in_index-1]);
|
|
}
|
|
}while(in_index <len);
|
|
|
|
Disable_SPI_SSP2();
|
|
|
|
}
|
|
|
|
/* SPI Init*/
|
|
|
|
int ssp0_inited = 0;
|
|
int ssp1_inited = 0;
|
|
int ssp2_inited = 0; //To prevent memory leaks due to frequent initialization
|
|
|
|
void SPI_SSP0_Initialize(SPI_MODE_E spimode, SPI_CLK_E spiclk)
|
|
{
|
|
unsigned int v_reg, v_spiclk,especially_spiclk=0 ;
|
|
if(ssp0_inited== 0)
|
|
{
|
|
ASSERT(OSAFlagCreate(&SSP0_DMA_Done_FlgRef) == OS_SUCCESS);
|
|
ASSERT(OSASemaphoreCreate(&SSP0SemaRef,1,OSA_PRIORITY) == OS_SUCCESS);
|
|
|
|
#ifdef SSP0_DMA_INT_SUPPORT
|
|
dma_irq_callback_register((dma_callback_t)SSP0_DMA_DONE_ISR,SSP0_RX_CHANNEL);
|
|
#endif
|
|
ssp0_inited = 1;
|
|
}
|
|
|
|
switch(spimode)
|
|
{
|
|
case SPI_MODE0:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
case SPI_MODE1:
|
|
v_spimode = SSP_SPI_MODE1;
|
|
break;
|
|
case SPI_MODE2:
|
|
v_spimode = SSP_SPI_MODE2;
|
|
break;
|
|
case SPI_MODE3:
|
|
v_spimode = SSP_SPI_MODE3;
|
|
break;
|
|
default:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
}
|
|
|
|
switch(spiclk)
|
|
{
|
|
case SPI_CLK_100KHZ:
|
|
case SPI_CLK_200KHZ:
|
|
case SPI_CLK_300KHZ:
|
|
case SPI_CLK_400KHZ:
|
|
case SPI_CLK_500KHZ:
|
|
case SPI_CLK_600KHZ:
|
|
case SPI_CLK_700KHZ:
|
|
especially_spiclk=spiclk+1;
|
|
break;
|
|
case SPI_CLK_812_5KHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_812_5KHZ;
|
|
break;
|
|
case SPI_CLK_1_625MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_1_625MHZ;
|
|
break;
|
|
case SPI_CLK_3_25MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_3_25MHZ;
|
|
break;
|
|
case SPI_CLK_6_5MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
case SPI_CLK_13MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_13MHZ;
|
|
break;
|
|
case SPI_CLK_26MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_26MHZ;
|
|
break;
|
|
case SPI_CLK_52MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_52MHZ;
|
|
break;
|
|
default:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
}
|
|
|
|
if(0 != especially_spiclk)
|
|
{
|
|
spi_reg_bit_set(0xD4050008, BIT_27);
|
|
spi_reg_write(0xD4050044, 0xE0007800|((especially_spiclk*100/5)<<15));
|
|
spi_reg_write(APBC_SSP0_CLK_RST, 0x7B);
|
|
CPUartLogPrintf("%s:especially_spiclk=%d ;spiclk= %d]", __func__, especially_spiclk,spiclk);
|
|
}
|
|
else
|
|
{
|
|
spi_reg_write(APBC_SSP0_CLK_RST, APBC_SSP0_APBCLK_ENABLE|APBC_SSP0_FNCLK_ENABLE|APBC_SSP0_RST);
|
|
spi_reg_write(APBC_SSP0_CLK_RST, APBC_SSP0_APBCLK_ENABLE|APBC_SSP0_FNCLK_ENABLE|v_spiclk);
|
|
}
|
|
CPUartLogPrintf("%s:APBC_SSP0_CLK_RST[0x%x]", __func__, spi_reg_read(APBC_SSP0_CLK_RST));
|
|
|
|
v_reg = spi_reg_read(APBC_GPIO_CLK_RST); //0xD4015008 APBC_GPIO_CLK_RST
|
|
if((v_reg & 0x3) != 0x3)
|
|
{
|
|
CPUartLogPrintf("%s:v_reg[0x%x]", __func__, v_reg);
|
|
//if clk is not enable,-->reset and enable
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_RST);
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_APBCLK_ENABLE|APBC_GPIO_FNCLK_ENABLE);
|
|
}
|
|
|
|
//CPUartLogPrintf("%s:APBC_GPIO_CLK_RST[0x%x]", __func__, reg_read(APBC_GPIO_CLK_RST));
|
|
//CPUartLogPrintf("before,%s:SPI0_CLK[0x%x],SPI0_FRM[0x%x],SPI0_RXD[0x%x],SPI0_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI0_CLK), spi_reg_read(SPI0_FRM), spi_reg_read(SPI0_RXD), spi_reg_read(SPI0_TXD));
|
|
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH || CHIP_IS_CRANELG) //1602/1609/1605/1607
|
|
{
|
|
//CONFIG GPIO33~36 as SSP0 1602平台仅有这一组ssp0,固定写死
|
|
spi_reg_write(0xD401E160, 0x1081);
|
|
spi_reg_write(0xD401E164, 0x9081);
|
|
spi_reg_write(0xD401E168, 0x1081);
|
|
spi_reg_write(0xD401E16C, 0x1081);
|
|
}
|
|
else
|
|
{
|
|
//CONFIG GPIO16~19 as SSP0
|
|
spi_reg_write(SPI0_CLK, 0x1082);
|
|
spi_reg_write(SPI0_FRM, 0x9082);
|
|
spi_reg_write(SPI0_RXD, 0x1084);//20230724 软件修改gpio18,19的func4作为spi功能
|
|
spi_reg_write(SPI0_TXD, 0x1084);
|
|
}
|
|
|
|
|
|
//make sure SSP is disabled
|
|
Disable_SPI_SSP0();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP0_TCR, SSP0_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_INITIAL);
|
|
spi_reg_write(SSP0_IER, SSP0_IER_INITIAL);
|
|
|
|
spi_reg_write(SSP0_TOR, 0xC00);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP0_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP0_FCR, SSP0_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP0_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP0_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP0();
|
|
|
|
//CPUartLogPrintf("after,%s:SPI0_CLK[0x%x],SPI0_FRM[0x%x],SPI0_RXD[0x%x],SPI0_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI0_CLK), spi_reg_read(SPI0_FRM), spi_reg_read(SPI0_RXD), spi_reg_read(SPI0_TXD));
|
|
|
|
//CPUartLogPrintf("%s:TCR[0x%x],FCR[0x%x],IER[0x%x],TOR[0x%x]", __func__,
|
|
// spi_reg_read(SSP0_TCR), spi_reg_read(SSP0_FCR), spi_reg_read(SSP0_IER), spi_reg_read(SSP0_TOR));
|
|
|
|
}
|
|
|
|
|
|
void SPI_SSP1_Initialize(SPI_MODE_E spimode, SPI_CLK_E spiclk)
|
|
{
|
|
|
|
unsigned int v_reg, v_spiclk,especially_spiclk=0 ;
|
|
if(ssp1_inited == 0)
|
|
{
|
|
ASSERT(OSAFlagCreate(&SSP1_DMA_Done_FlgRef) == OS_SUCCESS);
|
|
ASSERT(OSASemaphoreCreate(&SSP1SemaRef,1,OSA_PRIORITY) == OS_SUCCESS);
|
|
#ifdef SSP1_DMA_INT_SUPPORT
|
|
dma_irq_callback_register((dma_callback_t)SSP1_DMA_DONE_ISR,SSP1_RX_CHANNEL);
|
|
#endif
|
|
ssp1_inited = 1;
|
|
}
|
|
|
|
switch(spimode)
|
|
{
|
|
case SPI_MODE0:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
case SPI_MODE1:
|
|
v_spimode = SSP_SPI_MODE1;
|
|
break;
|
|
case SPI_MODE2:
|
|
v_spimode = SSP_SPI_MODE2;
|
|
break;
|
|
case SPI_MODE3:
|
|
v_spimode = SSP_SPI_MODE3;
|
|
break;
|
|
default:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
}
|
|
|
|
switch(spiclk)
|
|
{
|
|
case SPI_CLK_100KHZ:
|
|
case SPI_CLK_200KHZ:
|
|
case SPI_CLK_300KHZ:
|
|
case SPI_CLK_400KHZ:
|
|
case SPI_CLK_500KHZ:
|
|
case SPI_CLK_600KHZ:
|
|
case SPI_CLK_700KHZ:
|
|
especially_spiclk=spiclk+1;
|
|
break;
|
|
case SPI_CLK_812_5KHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_812_5KHZ;
|
|
break;
|
|
case SPI_CLK_1_625MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_1_625MHZ;
|
|
break;
|
|
case SPI_CLK_3_25MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_3_25MHZ;
|
|
break;
|
|
case SPI_CLK_6_5MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
case SPI_CLK_13MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_13MHZ;
|
|
break;
|
|
case SPI_CLK_26MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_26MHZ;
|
|
break;
|
|
case SPI_CLK_52MHZ:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_52MHZ;
|
|
break;
|
|
default:
|
|
v_spiclk= APBC_SSP1_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
}
|
|
|
|
if(0 != especially_spiclk)
|
|
{
|
|
spi_reg_bit_set(0xD4050008, BIT_27);
|
|
spi_reg_write(0xD4050044, 0xE0007800|((especially_spiclk*100/5)<<15));
|
|
spi_reg_write(APBC_SSP1_CLK_RST, 0x7B);
|
|
CPUartLogPrintf("%s:especially_spiclk=%d ;spiclk= %d]", __func__, especially_spiclk,spiclk);
|
|
}
|
|
else
|
|
{
|
|
spi_reg_write(APBC_SSP1_CLK_RST, APBC_SSP1_APBCLK_ENABLE|APBC_SSP1_FNCLK_ENABLE|APBC_SSP1_RST);
|
|
spi_reg_write(APBC_SSP1_CLK_RST, APBC_SSP1_APBCLK_ENABLE|APBC_SSP1_FNCLK_ENABLE|v_spiclk);
|
|
}
|
|
CPUartLogPrintf("%s:APBC_SSP1_CLK_RST[0x%x]", __func__, spi_reg_read(APBC_SSP1_CLK_RST));
|
|
|
|
v_reg = spi_reg_read(APBC_GPIO_CLK_RST); //0xD4015008 APBC_GPIO_CLK_RST
|
|
if((v_reg & 0x3) != 0x3)
|
|
{
|
|
CPUartLogPrintf("%s:v_reg[0x%x]", __func__, v_reg);
|
|
//if clk is not enable,-->reset and enable
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_RST);
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_APBCLK_ENABLE|APBC_GPIO_FNCLK_ENABLE);
|
|
}
|
|
|
|
//CPUartLogPrintf("%s:APBC_GPIO_CLK_RST[0x%x]", __func__, reg_read(APBC_GPIO_CLK_RST));
|
|
//CPUartLogPrintf("before,%s:SPI0_CLK[0x%x],SPI0_FRM[0x%x],SPI0_RXD[0x%x],SPI0_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI0_CLK), spi_reg_read(SPI0_FRM), spi_reg_read(SPI0_RXD), spi_reg_read(SPI0_TXD));
|
|
|
|
|
|
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH || CHIP_IS_CRANELG) //1602/1605
|
|
{
|
|
//CONFIG GPIO4~7 as SSP1 1602平台仅有这一组ssp1,固定写死
|
|
spi_reg_write(0xD401E0EC, 0x1082);
|
|
spi_reg_write(0xD401E0F0, 0x9082);
|
|
spi_reg_write(0xD401E0F4, 0x1082);
|
|
spi_reg_write(0xD401E0F8, 0x1082);
|
|
}
|
|
else
|
|
{
|
|
//CONFIG GPIO4~7 as SSP1 // 7
|
|
spi_reg_write(SPI1_CLK, 0x1087);
|
|
spi_reg_write(SPI1_FRM, 0x9087);
|
|
spi_reg_write(SPI1_RXD, 0x1087);
|
|
spi_reg_write(SPI1_TXD, 0x1087);
|
|
}
|
|
|
|
|
|
//make sure SSP is disabled
|
|
Disable_SPI_SSP1();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP1_TCR, SSP1_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_INITIAL);
|
|
spi_reg_write(SSP1_IER, SSP1_IER_INITIAL);
|
|
|
|
spi_reg_write(SSP1_TOR, 0xC00);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP1_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP1_FCR, SSP1_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP1_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP1_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP1();
|
|
|
|
//CPUartLogPrintf("after,%s:SPI1_CLK[0x%x],SPI1_FRM[0x%x],SPI1_RXD[0x%x],SPI1_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI1_CLK), spi_reg_read(SPI1_FRM), spi_reg_read(SPI1_RXD), spi_reg_read(SPI1_TXD));
|
|
|
|
//CPUartLogPrintf("%s:TCR[0x%x],FCR[0x%x],IER[0x%x],TOR[0x%x]", __func__,
|
|
// spi_reg_read(SSP1_TCR), spi_reg_read(SSP1_FCR), spi_reg_read(SSP1_IER), spi_reg_read(SSP1_TOR));
|
|
|
|
}
|
|
|
|
|
|
void SPI_SSP2_Initialize(SPI_MODE_E spimode, SPI_CLK_E spiclk)
|
|
{
|
|
unsigned int v_reg, v_spiclk,especially_spiclk=0 ;
|
|
if(ssp2_inited == 0)
|
|
{
|
|
ASSERT(OSAFlagCreate(&SSP2_DMA_Done_FlgRef) == OS_SUCCESS);
|
|
ASSERT(OSASemaphoreCreate(&SSP2SemaRef,1,OSA_PRIORITY) == OS_SUCCESS);
|
|
#ifdef SSP2_DMA_INT_SUPPORT
|
|
dma_irq_callback_register((dma_callback_t)SSP2_DMA_DONE_ISR,SSP2_RX_CHANNEL);
|
|
#endif
|
|
ssp2_inited = 1;
|
|
}
|
|
|
|
switch(spimode)
|
|
{
|
|
case SPI_MODE0:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
case SPI_MODE1:
|
|
v_spimode = SSP_SPI_MODE1;
|
|
break;
|
|
case SPI_MODE2:
|
|
v_spimode = SSP_SPI_MODE2;
|
|
break;
|
|
case SPI_MODE3:
|
|
v_spimode = SSP_SPI_MODE3;
|
|
break;
|
|
default:
|
|
v_spimode = SSP_SPI_MODE0;
|
|
break;
|
|
}
|
|
|
|
switch(spiclk)
|
|
{
|
|
case SPI_CLK_100KHZ:
|
|
case SPI_CLK_200KHZ:
|
|
case SPI_CLK_300KHZ:
|
|
case SPI_CLK_400KHZ:
|
|
case SPI_CLK_500KHZ:
|
|
case SPI_CLK_600KHZ:
|
|
case SPI_CLK_700KHZ:
|
|
especially_spiclk=spiclk+1;
|
|
break;
|
|
case SPI_CLK_812_5KHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_812_5KHZ;
|
|
break;
|
|
case SPI_CLK_1_625MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_1_625MHZ;
|
|
break;
|
|
case SPI_CLK_3_25MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_3_25MHZ;
|
|
break;
|
|
case SPI_CLK_6_5MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
case SPI_CLK_13MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_13MHZ;
|
|
break;
|
|
case SPI_CLK_26MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_26MHZ;
|
|
break;
|
|
case SPI_CLK_52MHZ:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_52MHZ;
|
|
break;
|
|
default:
|
|
v_spiclk= APBC_SSP0_FNCLKSEL_6_5MHZ;
|
|
break;
|
|
}
|
|
|
|
if(0 != especially_spiclk)
|
|
{
|
|
spi_reg_bit_set(0xD4050008, BIT_27);
|
|
spi_reg_write(0xD4050044, 0xE0007800|((especially_spiclk*100/5)<<15));
|
|
spi_reg_write(APBC_SSP2_CLK_RST, 0x7B);
|
|
CPUartLogPrintf("%s:especially_spiclk=%d ;spiclk= %d]", __func__, especially_spiclk,spiclk);
|
|
}
|
|
else
|
|
{
|
|
spi_reg_write(APBC_SSP2_CLK_RST, APBC_SSP2_APBCLK_ENABLE|APBC_SSP2_FNCLK_ENABLE|APBC_SSP2_RST);
|
|
spi_reg_write(APBC_SSP2_CLK_RST, APBC_SSP2_APBCLK_ENABLE|APBC_SSP2_FNCLK_ENABLE|v_spiclk);
|
|
}
|
|
CPUartLogPrintf("%s:APBC_SSP2_CLK_RST[0x%x]", __func__, spi_reg_read(APBC_SSP2_CLK_RST));
|
|
|
|
v_reg = spi_reg_read(APBC_GPIO_CLK_RST); //0xD4015008 APBC_GPIO_CLK_RST
|
|
if((v_reg & 0x3) != 0x3)
|
|
{
|
|
CPUartLogPrintf("%s:v_reg[0x%x]", __func__, v_reg);
|
|
//if clk is not enable,-->reset and enable
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_RST);
|
|
spi_reg_write(APBC_GPIO_CLK_RST, APBC_GPIO_APBCLK_ENABLE|APBC_GPIO_FNCLK_ENABLE);
|
|
}
|
|
|
|
//CPUartLogPrintf("%s:APBC_GPIO_CLK_RST[0x%x]", __func__, reg_read(APBC_GPIO_CLK_RST));
|
|
//CPUartLogPrintf("before,%s:SPI0_CLK[0x%x],SPI0_FRM[0x%x],SPI0_RXD[0x%x],SPI0_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI0_CLK), spi_reg_read(SPI0_FRM), spi_reg_read(SPI0_RXD), spi_reg_read(SPI0_TXD));
|
|
|
|
#if 0
|
|
//CONFIG GPIO33~36 as SSP0
|
|
spi_reg_write(SPI0_CLK, 0x1081);
|
|
spi_reg_write(SPI0_FRM, 0x9081);
|
|
spi_reg_write(SPI0_RXD, 0x1081);
|
|
spi_reg_write(SPI0_TXD, 0x1081);
|
|
#endif
|
|
|
|
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609/1605
|
|
{
|
|
//CONFIG GPIO12~15 as SSP2 1602平台仅有这一组ssp2,固定写死
|
|
spi_reg_write(0xD401E10C, 0x1081);
|
|
spi_reg_write(0xD401E110, 0x9081);
|
|
spi_reg_write(0xD401E114, 0x1081);
|
|
spi_reg_write(0xD401E118, 0x1081);
|
|
}
|
|
else
|
|
{
|
|
//CONFIG GPIO33~36 as SSP2
|
|
spi_reg_write(SPI2_CLK, 0x1082);
|
|
spi_reg_write(SPI2_FRM, 0x9082);
|
|
spi_reg_write(SPI2_RXD, 0x1082);
|
|
spi_reg_write(SPI2_TXD, 0x1082);
|
|
}
|
|
|
|
Disable_SPI_SSP2();
|
|
|
|
//reset SSP CR's
|
|
spi_reg_write(SSP2_TCR, SSP2_TCR_INITIAL | v_spimode);
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_INITIAL);
|
|
spi_reg_write(SSP2_IER, SSP2_IER_INITIAL);
|
|
|
|
spi_reg_write(SSP2_TOR, 0xC00);
|
|
|
|
//setup in 8bit mode
|
|
spi_reg_bit_clr(SSP2_TCR, SSP_TCR_DSS_MASK);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_DSS8);
|
|
//spi_reg_bit_set(SSP_TCR, SSP_TCR_DSS8);
|
|
|
|
//setup FIFO CTRL, use SSP to do endian convert
|
|
spi_reg_write(SSP2_FCR, SSP2_FCR_DMA_READ | SSP_FCR_RRE(0) | SSP_FCR_RAFC);
|
|
spi_reg_bit_set(SSP2_TCR, SSP_TCR_TRIAL);
|
|
|
|
//setup IER
|
|
spi_reg_bit_set(SSP2_IER, SSP_IER_TIE | SSP_IER_RIE | SSP_IER_RTOIE);
|
|
|
|
//fire SSP up
|
|
Enable_SPI_SSP2();
|
|
//CPUartLogPrintf("after,%s:SPI0_CLK[0x%x],SPI0_FRM[0x%x],SPI0_RXD[0x%x],SPI0_TXD[0x%x]", __func__,
|
|
// spi_reg_read(SPI0_CLK), spi_reg_read(SPI0_FRM), spi_reg_read(SPI0_RXD), spi_reg_read(SPI0_TXD));
|
|
|
|
//CPUartLogPrintf("%s:TCR[0x%x],FCR[0x%x],IER[0x%x],TOR[0x%x]", __func__,
|
|
// spi_reg_read(SSP0_TCR), spi_reg_read(SSP0_FCR), spi_reg_read(SSP0_IER), spi_reg_read(SSP0_TOR));
|
|
|
|
}
|
|
|
|
QUEC_SPI_OpMode quec_spi_mode_set = QUEC_SPI_OP_DMA;
|
|
|
|
int quec_spi_init(SPI_PORT_E port, SPI_MODE_E spimode, SPI_CLK_E spiclk)
|
|
{
|
|
SPI_MODE_E quec_spimode=SPI_MODE_INVALID;
|
|
SPI_CLK_E quec_spiclk=SPI_CLK_INVALID;
|
|
if (spimode <=SPI_MODE_INVALID || spimode >= SPI_MODE_MAX) {
|
|
spi_dbg_log("invalid mode parameter!!\n");
|
|
return -1;
|
|
}
|
|
|
|
quec_spimode = spimode;
|
|
|
|
if (spiclk <=SPI_CLK_INVALID || spiclk >= SPI_CLK_MAX) {
|
|
spi_dbg_log("invalid clk parameter!!\n");
|
|
return -1;
|
|
}
|
|
|
|
quec_spiclk = spiclk;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
SPI_SSP0_Initialize(quec_spimode, quec_spiclk);
|
|
break;
|
|
case SPI_PORT1:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH) //1602/1605
|
|
{
|
|
SPI_SSP1_Initialize(quec_spimode, quec_spiclk);
|
|
}
|
|
else
|
|
{
|
|
SPI_SSP2_Initialize(quec_spimode, quec_spiclk);
|
|
}
|
|
break;
|
|
case SPI_PORT2:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609//1605
|
|
{
|
|
SPI_SSP2_Initialize(quec_spimode, quec_spiclk);
|
|
}
|
|
else
|
|
{
|
|
SPI_SSP1_Initialize(quec_spimode, quec_spiclk);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int quec_spi_write(SPI_PORT_E port, unsigned char *buf, unsigned int len)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if(buf==NULL){
|
|
spi_dbg_log("error with a NULL pointer,please check up the parameter please!\n");
|
|
return -1;
|
|
}
|
|
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP0_DMA_WriteData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP0_PIO_Write(buf, len);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH)
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DMA_WriteData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Write(buf, len);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DMA_WriteData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Write(buf, len);
|
|
}
|
|
}
|
|
|
|
break;
|
|
case SPI_PORT2:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609/1605
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DMA_WriteData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Write(buf, len);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DMA_WriteData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Write(buf, len);
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int quec_spi_pio_width_write(SPI_PORT_E port, unsigned int *buf, unsigned int len, int bit_width)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if(buf==NULL){
|
|
spi_dbg_log("error with a NULL pointer,please check up the parameter please!\n");
|
|
return -1;
|
|
}
|
|
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
{
|
|
QUEC_SPI_SSP0_PIO_Width_Write(buf, len, bit_width);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
{
|
|
if(CHIP_IS_CRANELR ||CHIP_IS_CRANELRH)//1602/1605
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Width_Write(buf, len, bit_width);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Width_Write(buf, len, bit_width);
|
|
}
|
|
}
|
|
break;
|
|
case SPI_PORT2:
|
|
{
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS||CHIP_IS_CRANELRH)
|
|
//1602/1609/1605
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Width_Write(buf, len, bit_width);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Width_Write(buf, len, bit_width);
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int quec_spi_read(SPI_PORT_E port, unsigned char *buf, unsigned int len)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if(buf==NULL){
|
|
spi_dbg_log("error with a NULL pointer,please check up the parameter please!\n");
|
|
return -1;
|
|
}
|
|
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP0_DMA_ReadData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP0_PIO_Read(buf, len,0);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH) //1602/1605
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DMA_ReadData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Read(buf, len, 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DMA_ReadData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Read(buf, len, 0);
|
|
}
|
|
}
|
|
|
|
break;
|
|
case SPI_PORT2:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609/1605
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DMA_ReadData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Read(buf, len, 0);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DMA_ReadData(buf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Read(buf, len, 0);
|
|
}
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int quec_spi_pio_width_read(SPI_PORT_E port, unsigned int *buf, unsigned int len, int bit_width)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if(buf==NULL){
|
|
spi_dbg_log("error with a NULL pointer,please check up the parameter please!\n");
|
|
return -1;
|
|
}
|
|
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
{
|
|
QUEC_SPI_SSP0_PIO_Width_Read(buf, len, 0, bit_width);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Width_Read(buf, len, 0, bit_width);
|
|
}
|
|
break;
|
|
case SPI_PORT2:
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Width_Read(buf, len, 0, bit_width);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int quec_spi_write_read(SPI_PORT_E port, unsigned char *inbuf, unsigned char *outbuf, unsigned int len)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if((inbuf != NULL) && (outbuf != NULL))
|
|
{
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP0_DataTransfer(inbuf,outbuf, len);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP0_PIO_transfer(inbuf, outbuf, len);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH)
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DataTransfer(inbuf,outbuf, len);
|
|
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_transfer(inbuf, outbuf, len);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DataTransfer(inbuf,outbuf, len);
|
|
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_transfer(inbuf, outbuf, len);
|
|
}
|
|
}
|
|
|
|
break;
|
|
case SPI_PORT2:
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609/1605
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP2_DataTransfer(inbuf,outbuf, len);
|
|
spi_dbg_log("QUEC_SPI_SSP2\n",);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_transfer(inbuf, outbuf, len);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(QUEC_SPI_OP_DMA==quec_spi_mode_set)
|
|
{
|
|
QUEC_SPI_SSP1_DataTransfer(inbuf,outbuf, len);
|
|
spi_dbg_log("QUEC_SPI_SSP1\n",);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_transfer(inbuf, outbuf, len);
|
|
}
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(inbuf == NULL) {
|
|
spi_dbg_log("ql_spi_transfer with NULL pointer to inbuf\n");
|
|
}
|
|
|
|
if(outbuf == NULL) {
|
|
spi_dbg_log("ql_spi_transfer with NULL pointer to outbuf\n");
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
int quec_spi_pio_width_write_read(SPI_PORT_E port, unsigned int *inbuf, unsigned int *outbuf, unsigned int len, int bit_width)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (port <= SPI_PORT_INVALID || port >= SPI_PORT_MAX || IS_SPI_PORT_DISABLED(port)) {
|
|
spi_dbg_log("invalid port parameter");
|
|
return -1;
|
|
}
|
|
|
|
if((inbuf != NULL) && (outbuf != NULL))
|
|
{
|
|
switch (port)
|
|
{
|
|
case SPI_PORT0:
|
|
{
|
|
QUEC_SPI_SSP0_PIO_Width_transfer(inbuf, outbuf, len, bit_width);
|
|
}
|
|
break;
|
|
case SPI_PORT1:
|
|
{
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELRH)//1602/1605
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Width_transfer(inbuf, outbuf, len, bit_width);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Width_transfer(inbuf, outbuf, len, bit_width);
|
|
}
|
|
|
|
}
|
|
break;
|
|
case SPI_PORT2:
|
|
{
|
|
if(CHIP_IS_CRANELR || CHIP_IS_CRANELS || CHIP_IS_CRANELRH) //1602/1609/1605
|
|
{
|
|
QUEC_SPI_SSP2_PIO_Width_transfer(inbuf, outbuf, len, bit_width);
|
|
}
|
|
else
|
|
{
|
|
QUEC_SPI_SSP1_PIO_Width_transfer(inbuf, outbuf, len, bit_width);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(inbuf == NULL) {
|
|
spi_dbg_log("ql_spi_transfer with NULL pointer to inbuf\n");
|
|
}
|
|
|
|
if(outbuf == NULL) {
|
|
spi_dbg_log("ql_spi_transfer with NULL pointer to outbuf\n");
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|