This commit is contained in:
pvvx 2016-09-13 12:31:00 +03:00
parent aa9624efbe
commit 56693eef0d
125 changed files with 45637 additions and 1 deletions

293
lib/fwlib/src/hal_32k.c Normal file
View file

@ -0,0 +1,293 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#ifdef CONFIG_TIMER_MODULE
VOID
En32KCalibration(
VOID
)
{
u32 Rtemp;
u32 Ttemp = 0;
//DiagPrintf("32K clock source calibration\n");
//set parameter
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0);
//offset 1 = 0x1500
Rtemp = 0x811500;
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp);
HalDelayUs(40);
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0);
//offset 2 = 0x01c0
Rtemp = 0x8201c0;
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp);
HalDelayUs(40);
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0);
//offset 4 = 0x0100
Rtemp = 0x840100;
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp);
HalDelayUs(40);
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0);
//offset 0 = 0xf980
Rtemp = 0x80f980;
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp);
HalDelayUs(40);
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0);
while(1) {
//Polling LOCK
Rtemp = 0x110000;
HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp);
//DiagPrintf("Polling lock\n");
HalDelayUs(40);
Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL1);
if ((Rtemp & 0x3000) != 0x0){
//DiagPrintf("32.768 Calibration Success\n", Ttemp);
break;
}
else {
Ttemp++;
HalDelayUs(30);
//DiagPrintf("Check lock: %d\n", Ttemp);
//DiagPrintf("0x278: %x\n", Rtemp);
if (Ttemp > 100000) { /*Delay 100ms*/
DiagPrintf("32K Calibration Fail!!\n", Ttemp);
break;
}
}
}
}
#if CONFIG_WDG
WDG_ADAPTER WDGAdapter;
extern HAL_TIMER_OP HalTimerOp;
#ifdef CONFIG_WDG_NORMAL
VOID
WDGInitial(
IN u32 Period
)
{
u8 CountId;
u16 DivFactor;
u32 CountTemp;
u32 CountProcess = 0;
u32 DivFacProcess = 0;
u32 PeriodProcess = 100*Period;
u32 MinPeriodTemp = 0xFFFFFFFF;
u32 PeriodTemp = 0;
u32 *Reg = (u32*)&(WDGAdapter.Ctrl);
DBG_8195A(" Period = 0x%08x\n", Period);
for (CountId = 0; CountId < 12; CountId++) {
CountTemp = ((0x00000001 << (CountId+1))-1);
DivFactor = (u16)((PeriodProcess)/(CountTemp*3));
if (DivFactor > 0) {
PeriodTemp = 3*(DivFactor+1)*CountTemp;
if (PeriodProcess < PeriodTemp) {
if (MinPeriodTemp > PeriodTemp) {
MinPeriodTemp = PeriodTemp;
CountProcess = CountId;
DivFacProcess = DivFactor;
}
}
}
}
DBG_8195A("WdgScalar = 0x%08x\n", DivFacProcess);
DBG_8195A("WdgCunLimit = 0x%08x\n", CountProcess);
WDGAdapter.Ctrl.WdgScalar = DivFacProcess;
WDGAdapter.Ctrl.WdgEnByte = 0;
WDGAdapter.Ctrl.WdgClear = 1;
WDGAdapter.Ctrl.WdgCunLimit = CountProcess;
WDGAdapter.Ctrl.WdgMode = RESET_MODE;
WDGAdapter.Ctrl.WdgToISR = 0;
HAL_WRITE32(VENDOR_REG_BASE, 0, (*Reg));
}
VOID
WDGIrqHandle
(
IN VOID *Data
)
{
u32 temp;
WDG_REG *CtrlReg;
if (NULL != WDGAdapter.UserCallback) {
WDGAdapter.UserCallback(WDGAdapter.callback_id);
}
// Clear ISR
temp = HAL_READ32(VENDOR_REG_BASE, 0);
CtrlReg = (WDG_REG*)&temp;
CtrlReg->WdgToISR = 1; // write 1 clear
HAL_WRITE32(VENDOR_REG_BASE, 0, (temp));
}
VOID
WDGIrqInitial(
VOID
)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.IrqHandle.Data = (u32)&WDGAdapter;
WDGAdapter.IrqHandle.IrqFun = (IRQ_FUN)WDGIrqHandle;
WDGAdapter.IrqHandle.IrqNum = WDG_IRQ;
WDGAdapter.IrqHandle.Priority = 0;
InterruptRegister(&(WDGAdapter.IrqHandle));
InterruptEn(&(WDGAdapter.IrqHandle));
WDGAdapter.Ctrl.WdgToISR = 1; // clear ISR first
WDGAdapter.Ctrl.WdgMode = INT_MODE;
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
WDGAdapter.Ctrl.WdgToISR = 0;
}
VOID
WDGStart(
VOID
)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.Ctrl.WdgEnByte = 0xA5;
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
}
VOID
WDGStop(
VOID
)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.Ctrl.WdgEnByte = 0;
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
}
VOID
WDGRefresh(
VOID
)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.Ctrl.WdgClear = 1;
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
}
VOID
WDGIrqCallBackReg(
IN VOID *CallBack,
IN u32 Id
)
{
WDGAdapter.UserCallback = (VOID (*)(u32))CallBack;
WDGAdapter.callback_id = Id;
}
#endif
#ifdef CONFIG_WDG_TEST
VOID
WDGIrqHandle
(
IN VOID *Data
)
{
}
VOID
WDGGtimerHandle
(
IN VOID *Data
)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.Ctrl.WdgClear = 1;
DBG_8195A("reset WDG\n");
if (HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO2) == 0) {
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
}
}
VOID
InitWDGIRQ(VOID)
{
u32 *Temp = (u32*)&(WDGAdapter.Ctrl);
WDGAdapter.Ctrl.WdgScalar = 0x96;
WDGAdapter.Ctrl.WdgEnByte = 0xA5;
WDGAdapter.Ctrl.WdgClear = 1;
WDGAdapter.Ctrl.WdgCunLimit = CNTFFFH;
WDGAdapter.Ctrl.WdgMode = RESET_MODE;
WDGAdapter.Ctrl.WdgToISR = 0;
if (WDGAdapter.Ctrl.WdgMode == INT_MODE) {
WDGAdapter.IrqHandle.Data = NULL;
WDGAdapter.IrqHandle.IrqFun = (IRQ_FUN)WDGIrqHandle;
WDGAdapter.IrqHandle.IrqNum = WDG_IRQ;
WDGAdapter.IrqHandle.Priority = 0;
InterruptRegister(&(WDGAdapter.IrqHandle));
InterruptEn(&(WDGAdapter.IrqHandle));
}
else {
WDGAdapter.WdgGTimer.TimerIrqPriority = 0;
WDGAdapter.WdgGTimer.TimerMode = USER_DEFINED;
WDGAdapter.WdgGTimer.IrqDis = OFF;
WDGAdapter.WdgGTimer.TimerId = 2;//
WDGAdapter.WdgGTimer.IrqHandle.IrqFun = (IRQ_FUN)WDGGtimerHandle;
WDGAdapter.WdgGTimer.IrqHandle.IrqNum = TIMER2_7_IRQ;
WDGAdapter.WdgGTimer.IrqHandle.Priority = 0;
WDGAdapter.WdgGTimer.IrqHandle.Data = NULL;
if ((WDGAdapter.Ctrl.WdgCunLimit == CNTFFFH)&&(WDGAdapter.Ctrl.WdgScalar >= 0x8429)){
WDGAdapter.WdgGTimer.TimerLoadValueUs = 0xFFFFFFFF - WDGTIMERELY;
}
else {
WDGAdapter.WdgGTimer.TimerLoadValueUs = (BIT0 << (WDGAdapter.Ctrl.WdgCunLimit+1))
*WDGAdapter.Ctrl.WdgScalar*TIMER_TICK_US - WDGTIMERELY;
}
HalTimerOp.HalTimerInit((VOID*) &(WDGAdapter.WdgGTimer));
}
//fill reg
HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp)));
}
//WDG
VOID HalWdgInit(
VOID
)
{
}
#endif //CONFIG_WDG_TEST
#endif //CONFIG_WDG
#endif //#ifdef CONFIG_TIMER_MODULE

1603
lib/fwlib/src/hal_adc.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,23 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_common.h"
extern HAL_TIMER_OP HalTimerOp;
HAL_Status
HalCommonInit(void){
#ifdef CONFIG_TIMER_MODULE
HalTimerOpInit_Patch((VOID*)(&HalTimerOp));
#endif
return HAL_OK;
}

1450
lib/fwlib/src/hal_dac.c Normal file

File diff suppressed because it is too large Load diff

574
lib/fwlib/src/hal_gdma.c Normal file
View file

@ -0,0 +1,574 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_gdma.h"
#define MAX_GDMA_INDX 1
#define MAX_GDMA_CHNL 6
static u8 HalGdmaReg[MAX_GDMA_INDX+1];
const HAL_GDMA_CHNL GDMA_Chnl_Option[] = {
{0,0,GDMA0_CHANNEL0_IRQ,0},
{1,0,GDMA1_CHANNEL0_IRQ,0},
{0,1,GDMA0_CHANNEL1_IRQ,0},
{1,1,GDMA1_CHANNEL1_IRQ,0},
{0,2,GDMA0_CHANNEL2_IRQ,0},
{1,2,GDMA1_CHANNEL2_IRQ,0},
{0,3,GDMA0_CHANNEL3_IRQ,0},
{1,3,GDMA1_CHANNEL3_IRQ,0},
{0,4,GDMA0_CHANNEL4_IRQ,0},
{1,4,GDMA1_CHANNEL4_IRQ,0},
{0,5,GDMA0_CHANNEL5_IRQ,0},
{1,5,GDMA1_CHANNEL5_IRQ,0},
{0xff,0,0,0} // end
};
const HAL_GDMA_CHNL GDMA_Multi_Block_Chnl_Option[] = {
{0,4,GDMA0_CHANNEL4_IRQ,0},
{1,4,GDMA1_CHANNEL4_IRQ,0},
{0,5,GDMA0_CHANNEL5_IRQ,0},
{1,5,GDMA1_CHANNEL5_IRQ,0},
{0xff,0,0,0} // end
};
const u16 HalGdmaChnlEn[6] = {
GdmaCh0, GdmaCh1, GdmaCh2, GdmaCh3,
GdmaCh4, GdmaCh5
};
VOID HalGdmaOpInit(
IN VOID *Data
)
{
PHAL_GDMA_OP pHalGdmaOp = (PHAL_GDMA_OP) Data;
pHalGdmaOp->HalGdmaOnOff = HalGdmaOnOffRtl8195a;
pHalGdmaOp->HalGdamChInit = HalGdamChInitRtl8195a;
pHalGdmaOp->HalGdmaChDis = HalGdmaChDisRtl8195a;
pHalGdmaOp->HalGdmaChEn = HalGdmaChEnRtl8195a;
pHalGdmaOp->HalGdmaChSeting = HalGdmaChSetingRtl8195a;
#ifndef CONFIG_CHIP_E_CUT
pHalGdmaOp->HalGdmaChBlockSeting = HalGdmaChBlockSetingRtl8195a;
#else
pHalGdmaOp->HalGdmaChBlockSeting = HalGdmaChBlockSetingRtl8195a_V04;
#endif
pHalGdmaOp->HalGdmaChIsrEnAndDis = HalGdmaChIsrEnAndDisRtl8195a;
pHalGdmaOp->HalGdmaChIsrClean = HalGdmaChIsrCleanRtl8195a;
pHalGdmaOp->HalGdmaChCleanAutoSrc = HalGdmaChCleanAutoSrcRtl8195a;
pHalGdmaOp->HalGdmaChCleanAutoDst = HalGdmaChCleanAutoDstRtl8195a;
}
VOID HalGdmaOn(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
pHalGdmaAdapter->GdmaOnOff = ON;
HalGdmaOnOffRtl8195a((VOID*)pHalGdmaAdapter);
}
VOID HalGdmaOff(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
pHalGdmaAdapter->GdmaOnOff = OFF;
HalGdmaOnOffRtl8195a((VOID*)pHalGdmaAdapter);
}
BOOL HalGdmaChInit(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
return (HalGdamChInitRtl8195a((VOID*)pHalGdmaAdapter));
}
VOID HalGdmaChDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
HalGdmaChDisRtl8195a((VOID*)pHalGdmaAdapter);
}
VOID HalGdmaChEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
HalGdmaChEnRtl8195a((VOID*)pHalGdmaAdapter);
}
BOOL HalGdmaChSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
return (HalGdmaChSetingRtl8195a((VOID*)pHalGdmaAdapter));
}
BOOL HalGdmaChBlockSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
#ifndef CONFIG_CHIP_E_CUT
return (HalGdmaChBlockSetingRtl8195a((VOID*)pHalGdmaAdapter));
#else
return (HalGdmaChBlockSetingRtl8195a_V04((VOID*)pHalGdmaAdapter));
#endif
}
VOID HalGdmaChIsrEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
pHalGdmaAdapter->IsrCtrl = ENABLE;
HalGdmaChIsrEnAndDisRtl8195a((VOID*)pHalGdmaAdapter);
}
VOID HalGdmaChIsrDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
pHalGdmaAdapter->IsrCtrl = DISABLE;
HalGdmaChIsrEnAndDisRtl8195a((VOID*)pHalGdmaAdapter);
}
u8 HalGdmaChIsrClean(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
return (HalGdmaChIsrCleanRtl8195a((VOID*)pHalGdmaAdapter));
}
VOID HalGdmaChCleanAutoSrc(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
HalGdmaChCleanAutoSrcRtl8195a((VOID*)pHalGdmaAdapter);
}
VOID HalGdmaChCleanAutoDst(PHAL_GDMA_ADAPTER pHalGdmaAdapter)
{
HalGdmaChCleanAutoDstRtl8195a((VOID*)pHalGdmaAdapter);
}
HAL_Status HalGdmaChnlRegister (u8 GdmaIdx, u8 ChnlNum)
{
u32 mask;
if ((GdmaIdx > MAX_GDMA_INDX) || (ChnlNum > MAX_GDMA_CHNL)) {
// Invalid GDMA Index or Channel Number
return HAL_ERR_PARA;
}
mask = 1 << ChnlNum;
if ((HalGdmaReg[GdmaIdx] & mask) != 0) {
return HAL_BUSY;
}
else {
#if 1
if (HalGdmaReg[GdmaIdx] == 0) {
if (GdmaIdx == 0) {
ACTCK_GDMA0_CCTRL(ON);
GDMA0_FCTRL(ON);
}
else {
ACTCK_GDMA1_CCTRL(ON);
GDMA1_FCTRL(ON);
}
}
#endif
HalGdmaReg[GdmaIdx] |= mask;
return HAL_OK;
}
}
VOID HalGdmaChnlUnRegister (u8 GdmaIdx, u8 ChnlNum)
{
u32 mask;
if ((GdmaIdx > MAX_GDMA_INDX) || (ChnlNum > MAX_GDMA_CHNL)) {
// Invalid GDMA Index or Channel Number
return;
}
mask = 1 << ChnlNum;
HalGdmaReg[GdmaIdx] &= ~mask;
#if 1
if (HalGdmaReg[GdmaIdx] == 0) {
if (GdmaIdx == 0) {
ACTCK_GDMA0_CCTRL(OFF);
GDMA0_FCTRL(OFF);
}
else {
ACTCK_GDMA1_CCTRL(OFF);
GDMA1_FCTRL(OFF);
}
}
#endif
}
PHAL_GDMA_CHNL HalGdmaChnlAlloc (HAL_GDMA_CHNL *pChnlOption)
{
HAL_GDMA_CHNL *pgdma_chnl;
pgdma_chnl = pChnlOption;
if (pChnlOption == NULL) {
// Use default GDMA Channel Option table
pgdma_chnl = (HAL_GDMA_CHNL*)&GDMA_Chnl_Option[0];
}
else{
pgdma_chnl = (HAL_GDMA_CHNL*) pgdma_chnl;
}
while (pgdma_chnl->GdmaIndx <= MAX_GDMA_INDX) {
if (HalGdmaChnlRegister(pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl) == HAL_OK) {
// This GDMA Channel is available
break;
}
pgdma_chnl += 1;
}
if (pgdma_chnl->GdmaIndx > MAX_GDMA_INDX) {
pgdma_chnl = NULL;
}
return pgdma_chnl;
}
VOID HalGdmaChnlFree (HAL_GDMA_CHNL *pChnl)
{
IRQ_HANDLE IrqHandle;
IrqHandle.IrqNum = pChnl->IrqNum;
InterruptDis(&IrqHandle);
InterruptUnRegister(&IrqHandle);
HalGdmaChnlUnRegister(pChnl->GdmaIndx, pChnl->GdmaChnl);
}
VOID HalGdmaMemIrqHandler(VOID *pData)
{
PHAL_GDMA_OBJ pHalGdmaObj=(PHAL_GDMA_OBJ)pData;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PIRQ_HANDLE pGdmaIrqHandle;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle);
// Clean Auto Reload Bit
HalGdmaChCleanAutoDst((VOID*)pHalGdmaAdapter);
// Clear Pending ISR
HalGdmaChIsrClean((VOID*)pHalGdmaAdapter);
HalGdmaChDis((VOID*)(pHalGdmaAdapter));
pHalGdmaObj->Busy = 0;
if (pGdmaIrqHandle->IrqFun != NULL) {
pGdmaIrqHandle->IrqFun((VOID*)pGdmaIrqHandle->Data);
}
}
BOOL HalGdmaMemCpyAggrInit(PHAL_GDMA_OBJ pHalGdmaObj)
{
HAL_GDMA_CHNL *pgdma_chnl;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PIRQ_HANDLE pGdmaIrqHandle;
IRQ_HANDLE IrqHandle;
pgdma_chnl = HalGdmaChnlAlloc((PHAL_GDMA_CHNL) &GDMA_Multi_Block_Chnl_Option[0]); // get a whatever GDMA channel
if (NULL == pgdma_chnl) {
DBG_GDMA_ERR("%s: Cannot allocate a GDMA Channel\n", __FUNCTION__);
return _FALSE;
}
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle);
DBG_GDMA_INFO("%s: Use GDMA%d CH%d\n", __FUNCTION__, pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl);
_memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER));
pHalGdmaAdapter->GdmaCtl.TtFc = TTFCMemToMem;
pHalGdmaAdapter->GdmaCtl.Done = 1;
pHalGdmaAdapter->MuliBlockCunt = 0;
pHalGdmaAdapter->MaxMuliBlock = 1;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->GdmaIsrType = (TransferType|ErrType);
pHalGdmaAdapter->IsrCtrl = ENABLE;
pHalGdmaAdapter->GdmaOnOff = ON;
pHalGdmaAdapter->GdmaCtl.IntEn = 1;
pHalGdmaAdapter->Rsvd4to7 = 1;
pHalGdmaAdapter->Llpctrl = 1;
pGdmaIrqHandle->IrqNum = pgdma_chnl->IrqNum;
pGdmaIrqHandle->Priority = 0x10;
IrqHandle.IrqFun = (IRQ_FUN) HalGdmaMemIrqHandler;
IrqHandle.Data = (u32) pHalGdmaObj;
IrqHandle.IrqNum = pGdmaIrqHandle->IrqNum;
IrqHandle.Priority = pGdmaIrqHandle->Priority;
InterruptRegister(&IrqHandle);
InterruptEn(&IrqHandle);
pHalGdmaObj->Busy = 0;
return _TRUE;
}
VOID HalGdmaMultiBlockSetting(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
u8 BlockNumber;
u8 BlockIndex;
u8 FourBytesAlign;
BlockNumber = pHalGdmaObj->BlockNum;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
pHalGdmaAdapter->GdmaCtl.LlpSrcEn = 1;
pHalGdmaAdapter->GdmaCtl.LlpDstEn = 1;
if(((pHalGdmaBlock[0].SrcAddr & 0x03) == 0) &&((pHalGdmaBlock[0].DstAddr & 0x03) == 0)
&& ((pHalGdmaBlock[0].BlockLength & 0X03) == 0)){
pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes;
pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes;
FourBytesAlign = 1;
}
else{
pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte;
pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte;
FourBytesAlign = 0;
}
for(BlockIndex = 0; BlockIndex < BlockNumber; BlockIndex++){
pHalGdmaObj->GdmaChLli[BlockIndex].Sarx = pHalGdmaBlock[BlockIndex].SrcAddr;
pHalGdmaObj->GdmaChLli[BlockIndex].Darx = pHalGdmaBlock[BlockIndex].DstAddr;
pHalGdmaObj->BlockSizeList[BlockIndex].pNextBlockSiz = &pHalGdmaObj->BlockSizeList[BlockIndex + 1];
if(FourBytesAlign){
pHalGdmaObj->BlockSizeList[BlockIndex].BlockSize = pHalGdmaBlock[BlockIndex].BlockLength >> 2;
}
else{
pHalGdmaObj->BlockSizeList[BlockIndex].BlockSize = pHalGdmaBlock[BlockIndex].BlockLength;
}
pHalGdmaObj->Lli[BlockIndex].pLliEle = (GDMA_CH_LLI_ELE*) &pHalGdmaObj->GdmaChLli[BlockIndex];
pHalGdmaObj->Lli[BlockIndex].pNextLli = &pHalGdmaObj->Lli[BlockIndex + 1];
if(BlockIndex == BlockNumber - 1){
pHalGdmaObj->BlockSizeList[BlockIndex].pNextBlockSiz = NULL;
pHalGdmaObj->Lli[BlockIndex].pNextLli = NULL;
}
//DBG_GDMA_INFO("Lli[%d].pLiEle = %x\r\n", BlockIndex,Lli[BlockIndex].pLliEle);
//DBG_GDMA_INFO("Lli[%d].pNextLli = %x\r\n", BlockIndex,Lli[BlockIndex].pNextLli);
}
pHalGdmaAdapter->pBlockSizeList = (struct BLOCK_SIZE_LIST*) &pHalGdmaObj->BlockSizeList;
pHalGdmaAdapter->pLlix = (struct GDMA_CH_LLI*) &pHalGdmaObj->Lli;
//DBG_GDMA_INFO("pHalGdmaAdapter->pBlockSizeList = %x\r\n", pHalGdmaAdapter->pBlockSizeList);
//DBG_GDMA_INFO("pHalGdmaAdapter->pLlix = %x\r\n", pHalGdmaAdapter->pLlix );
}
VOID HalGdmaLLPMemAlign(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PGDMA_CH_LLI_ELE pLliEle;
struct GDMA_CH_LLI *pGdmaChLli;
struct BLOCK_SIZE_LIST *pGdmaChBkLi;
u32 CtlxLow;
u32 CtlxUp;
u8 BlockNumber;
u8 BlockIndex;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
BlockNumber = pHalGdmaObj->BlockNum;
pLliEle = pHalGdmaAdapter->pLlix->pLliEle;
pGdmaChLli = pHalGdmaAdapter->pLlix->pNextLli;
pGdmaChBkLi = pHalGdmaAdapter->pBlockSizeList;
//4 Move to the second block to configure Memory Alginment setting
pLliEle->Llpx = (u32) pGdmaChLli->pLliEle;
pGdmaChBkLi = pGdmaChBkLi ->pNextBlockSiz;
for(BlockIndex = 1; BlockIndex < BlockNumber; BlockIndex++){
pLliEle = pGdmaChLli->pLliEle;
CtlxLow = pLliEle->CtlxLow;
CtlxLow &= (BIT_INVC_CTLX_LO_DST_TR_WIDTH & BIT_INVC_CTLX_LO_SRC_TR_WIDTH);
CtlxUp = pLliEle->CtlxUp;
CtlxUp &= (BIT_INVC_CTLX_UP_BLOCK_BS);
if(((pHalGdmaBlock[BlockIndex].SrcAddr & 0x03) == 0) &&((pHalGdmaBlock[BlockIndex].DstAddr & 0x03) == 0)
&& ((pHalGdmaBlock[BlockIndex].BlockLength & 0X03) == 0)){
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes;
pGdmaChBkLi->BlockSize = pHalGdmaBlock[BlockIndex].BlockLength>> 2;
}
else{
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte;
pGdmaChBkLi->BlockSize = pHalGdmaBlock[BlockIndex].BlockLength;
}
CtlxLow |= (BIT_CTLX_LO_DST_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.DstTrWidth) |
BIT_CTLX_LO_SRC_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.SrcTrWidth));
CtlxUp |= BIT_CTLX_UP_BLOCK_BS(pGdmaChBkLi->BlockSize);
pGdmaChLli = pGdmaChLli->pNextLli;
pGdmaChBkLi = pGdmaChBkLi->pNextBlockSiz;
pLliEle->CtlxLow = CtlxLow;
pLliEle->CtlxUp = CtlxUp;
pLliEle->Llpx = (u32)(pGdmaChLli->pLliEle);
}
}
VOID HalGdmaMemAggr(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
u8 BlockNumber;
BlockNumber = pHalGdmaObj->BlockNum;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
if (pHalGdmaObj->Busy) {
DBG_GDMA_ERR("%s: ==> GDMA is Busy\r\n", __FUNCTION__);
return;
}
pHalGdmaObj->Busy = 1;
pHalGdmaAdapter->MaxMuliBlock = BlockNumber;
pHalGdmaAdapter->ChSar = pHalGdmaBlock[0].SrcAddr;
pHalGdmaAdapter->ChDar = pHalGdmaBlock[0].DstAddr;
HalGdmaMultiBlockSetting(pHalGdmaObj, pHalGdmaBlock);
HalGdmaOn((pHalGdmaAdapter));
HalGdmaChIsrEn((pHalGdmaAdapter));
HalGdmaChBlockSeting((pHalGdmaAdapter));
HalGdmaLLPMemAlign(pHalGdmaObj, pHalGdmaBlock);
HalGdmaChEn((pHalGdmaAdapter));
}
BOOL HalGdmaMemCpyInit(PHAL_GDMA_OBJ pHalGdmaObj)
{
HAL_GDMA_CHNL *pgdma_chnl;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PIRQ_HANDLE pGdmaIrqHandle;
IRQ_HANDLE IrqHandle;
pgdma_chnl = HalGdmaChnlAlloc(NULL); // get a whatever GDMA channel
if (NULL == pgdma_chnl) {
DBG_GDMA_ERR("%s: Cannot allocate a GDMA Channel\n", __FUNCTION__);
return _FALSE;
}
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle);
DBG_GDMA_INFO("%s: Use GDMA%d CH%d\n", __FUNCTION__, pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl);
#if 0
if (pgdma_chnl->GdmaIndx == 0) {
ACTCK_GDMA0_CCTRL(ON);
GDMA0_FCTRL(ON);
}
else if (pgdma_chnl->GdmaIndx == 1) {
ACTCK_GDMA1_CCTRL(ON);
GDMA1_FCTRL(ON);
}
#endif
_memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER));
// pHalGdmaAdapter->GdmaCtl.TtFc = TTFCMemToMem;
pHalGdmaAdapter->GdmaCtl.Done = 1;
// pHalGdmaAdapter->MuliBlockCunt = 0;
// pHalGdmaAdapter->MaxMuliBlock = 1;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->GdmaIsrType = (TransferType|ErrType);
pHalGdmaAdapter->IsrCtrl = ENABLE;
pHalGdmaAdapter->GdmaOnOff = ON;
pHalGdmaAdapter->GdmaCtl.IntEn = 1;
// pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight;
// pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight;
// pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes;
// pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes;
// pHalGdmaAdapter->GdmaCtl.Dinc = IncType;
// pHalGdmaAdapter->GdmaCtl.Sinc = IncType;
pGdmaIrqHandle->IrqNum = pgdma_chnl->IrqNum;
pGdmaIrqHandle->Priority = 10;
IrqHandle.IrqFun = (IRQ_FUN) HalGdmaMemIrqHandler;
IrqHandle.Data = (u32) pHalGdmaObj;
IrqHandle.IrqNum = pGdmaIrqHandle->IrqNum;
IrqHandle.Priority = pGdmaIrqHandle->Priority;
InterruptRegister(&IrqHandle);
InterruptEn(&IrqHandle);
pHalGdmaObj->Busy = 0;
return _TRUE;
}
VOID HalGdmaMemCpyDeInit(PHAL_GDMA_OBJ pHalGdmaObj)
{
HAL_GDMA_CHNL GdmaChnl;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PIRQ_HANDLE pGdmaIrqHandle;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle);
GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex;
GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum;
GdmaChnl.IrqNum = pGdmaIrqHandle->IrqNum;
HalGdmaChnlFree(&GdmaChnl);
}
// If multi-task using the same GDMA Object, then it needs a mutex to protect this procedure
VOID* HalGdmaMemCpy(PHAL_GDMA_OBJ pHalGdmaObj, void* pDest, void* pSrc, u32 len)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
if (pHalGdmaObj->Busy) {
DBG_GDMA_ERR("%s: ==> GDMA is Busy\r\n", __FUNCTION__);
return 0;
}
pHalGdmaObj->Busy = 1;
pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter);
DBG_GDMA_INFO("%s: ==> Src=0x%x Dst=0x%x Len=%d\r\n", __FUNCTION__, pSrc, pDest, len);
if ((((u32)pSrc & 0x03)==0) &&
(((u32)pDest & 0x03)==0) &&
((len & 0x03)== 0)) {
// 4-bytes aligned, move 4 bytes each transfer
pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes;
pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes;
pHalGdmaAdapter->GdmaCtl.BlockSize = len >> 2;
}
else {
pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte;
pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight;
pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte;
pHalGdmaAdapter->GdmaCtl.BlockSize = len;
}
pHalGdmaAdapter->ChSar = (u32)pSrc;
pHalGdmaAdapter->ChDar = (u32)pDest;
pHalGdmaAdapter->PacketLen = len;
HalGdmaOn((pHalGdmaAdapter));
HalGdmaChIsrEn((pHalGdmaAdapter));
HalGdmaChSeting((pHalGdmaAdapter));
HalGdmaChEn((pHalGdmaAdapter));
return (pDest);
}

145
lib/fwlib/src/hal_gpio.c Normal file
View file

@ -0,0 +1,145 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#ifdef CONFIG_GPIO_EN
HAL_GPIO_DATA_SECTION HAL_GPIO_ADAPTER gHAL_Gpio_Adapter;
extern PHAL_GPIO_ADAPTER _pHAL_Gpio_Adapter;
extern VOID GPIO_PullCtrl_8195a(u32 chip_pin, u8 pull_type);
/**
* @brief To get the GPIO IP Pin name for the given chip pin name
*
* @param chip_pin: The chip pin name.
*
* @retval The gotten GPIO IP pin name
*/
HAL_GPIO_TEXT_SECTION u32
HAL_GPIO_GetPinName(
u32 chip_pin
)
{
return HAL_GPIO_GetIPPinName_8195a((u32)chip_pin);
}
/**
* @brief Set the GPIO pad Pull type
*
* @param pin: The pin for pull type control.
* @param mode: the pull type for the pin.
* @return None
*/
VOID
HAL_GPIO_PullCtrl(
u32 pin,
u32 mode
)
{
u8 pull_type;
DBG_GPIO_INFO("%s: pin=0x%x mode=%d\n ", __FUNCTION__, (u32)pin, (u32)mode);
switch (mode) {
case hal_PullNone:
pull_type = DIN_PULL_NONE;
break;
case hal_PullDown:
pull_type = DIN_PULL_LOW;
break;
case hal_PullUp:
pull_type = DIN_PULL_HIGH;
break;
case hal_OpenDrain:
default:
pull_type = DIN_PULL_NONE;
break;
}
// HAL_GPIO_PullCtrl_8195a (pin, pull_type);
GPIO_PullCtrl_8195a (pin, pull_type);
}
/**
* @brief Initializes a GPIO Pin by the GPIO_Pin parameters.
*
* @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin initialization.
*
* @retval HAL_Status
*/
HAL_GPIO_TEXT_SECTION VOID
HAL_GPIO_Init(
HAL_GPIO_PIN *GPIO_Pin
)
{
if (_pHAL_Gpio_Adapter == NULL) {
_pHAL_Gpio_Adapter = &gHAL_Gpio_Adapter;
DBG_GPIO_INFO("%s: Initial GPIO Adapter\n ", __FUNCTION__);
}
HAL_GPIO_Init_8195a(GPIO_Pin);
}
/**
* @brief Initializes a GPIO Pin as a interrupt signal
*
* @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin initialization.
*
* @retval HAL_Status
*/
VOID
HAL_GPIO_Irq_Init(
HAL_GPIO_PIN *GPIO_Pin
)
{
if (_pHAL_Gpio_Adapter == NULL) {
_pHAL_Gpio_Adapter = &gHAL_Gpio_Adapter;
DBG_GPIO_INFO("%s: Initial GPIO Adapter\n ", __FUNCTION__);
}
if (_pHAL_Gpio_Adapter->IrqHandle.IrqFun == NULL) {
_pHAL_Gpio_Adapter->IrqHandle.IrqFun = HAL_GPIO_MbedIrqHandler_8195a;
_pHAL_Gpio_Adapter->IrqHandle.Priority = 8;
HAL_GPIO_RegIrq_8195a(&_pHAL_Gpio_Adapter->IrqHandle);
InterruptEn(&_pHAL_Gpio_Adapter->IrqHandle);
DBG_GPIO_INFO("%s: Initial GPIO IRQ Adapter\n ", __FUNCTION__);
}
DBG_GPIO_INFO("%s: GPIO(name=0x%x)(mode=%d)\n ", __FUNCTION__, GPIO_Pin->pin_name,
GPIO_Pin->pin_mode);
HAL_GPIO_MaskIrq_8195a(GPIO_Pin);
HAL_GPIO_Init_8195a(GPIO_Pin);
}
/**
* @brief UnInitial GPIO Adapter
*
*
* @retval HAL_Status
*/
VOID
HAL_GPIO_IP_DeInit(
VOID
)
{
if (_pHAL_Gpio_Adapter != NULL) {
InterruptDis(&_pHAL_Gpio_Adapter->IrqHandle);
HAL_GPIO_UnRegIrq_8195a(&_pHAL_Gpio_Adapter->IrqHandle);
_pHAL_Gpio_Adapter = NULL;
}
}
#endif // CONFIG_GPIO_EN

2694
lib/fwlib/src/hal_i2c.c Normal file

File diff suppressed because it is too large Load diff

535
lib/fwlib/src/hal_i2s.c Normal file
View file

@ -0,0 +1,535 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_i2s.h"
#include "rand.h"
#include "rtl_utility.h"
//1 need to be modified
/*======================================================
Local used variables
*/
SRAM_BF_DATA_SECTION
HAL_I2S_OP HalI2SOpSAL={0};
VOID
I2SISRHandle(
IN VOID *Data
)
{
PHAL_I2S_ADAPTER pI2SAdp = (PHAL_I2S_ADAPTER) Data;
PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL;
PHAL_I2S_INIT_DAT pI2SCfg = pI2SAdp->pInitDat;
u32 I2STxIsr, I2SRxIsr;
u8 I2SPageNum = pI2SCfg->I2SPageNum+1;
// u32 I2SPageSize = (pI2SAdp->I2SPageSize+1)<<2;
u32 i;
u32 pbuf;
I2STxIsr = pHalI2SOP->HalI2SReadReg(pI2SCfg, REG_I2S_TX_STATUS_INT);
I2SRxIsr = pHalI2SOP->HalI2SReadReg(pI2SCfg, REG_I2S_RX_STATUS_INT);
pI2SCfg->I2STxIntrClr = I2STxIsr;
pI2SCfg->I2SRxIntrClr = I2SRxIsr;
pHalI2SOP->HalI2SClrIntr(pI2SCfg);
for (i=0 ; i<I2SPageNum ; i++) { // page 0, 1, 2, 3
if (I2STxIsr & (1<<pI2SCfg->I2SHWTxIdx)) {
// pbuf = ((u32)(pI2SCfg->I2STxData)) + (I2SPageSize*pI2SCfg->I2SHWTxIdx);
pbuf = (u32)pI2SAdp->TxPageList[pI2SCfg->I2SHWTxIdx];
pI2SAdp->UserCB.TxCCB(pI2SAdp->UserCB.TxCBId, (char*)pbuf);
I2STxIsr &= ~(1<<pI2SCfg->I2SHWTxIdx);
pI2SCfg->I2SHWTxIdx += 1;
if (pI2SCfg->I2SHWTxIdx == I2SPageNum) {
pI2SCfg->I2SHWTxIdx = 0;
}
}
if (I2SRxIsr & (1<<pI2SCfg->I2SHWRxIdx)) {
// pbuf = ((u32)(pI2SCfg->I2SRxData)) + (I2SPageSize*pI2SCfg->I2SHWRxIdx);
pbuf = (u32)pI2SAdp->RxPageList[pI2SCfg->I2SHWRxIdx];
pI2SAdp->UserCB.RxCCB(pI2SAdp->UserCB.RxCBId, (char*)pbuf);
I2SRxIsr &= ~(1<<pI2SCfg->I2SHWRxIdx);
pI2SCfg->I2SHWRxIdx += 1;
if (pI2SCfg->I2SHWRxIdx == I2SPageNum) {
pI2SCfg->I2SHWRxIdx = 0;
}
}
}
}
static HAL_Status
RtkI2SIrqInit(
IN PHAL_I2S_ADAPTER pI2SAdapter
)
{
PIRQ_HANDLE pIrqHandle;
if (pI2SAdapter->DevNum > I2S_MAX_ID) {
DBG_I2S_ERR("RtkI2SIrqInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
pIrqHandle = &pI2SAdapter->IrqHandle;
switch (pI2SAdapter->DevNum){
case I2S0_SEL:
pIrqHandle->IrqNum = I2S0_PCM0_IRQ;
break;
case I2S1_SEL:
pIrqHandle->IrqNum = I2S1_PCM1_IRQ;
break;
default:
return HAL_ERR_PARA;
}
pIrqHandle->Data = (u32) (pI2SAdapter);
pIrqHandle->IrqFun = (IRQ_FUN) I2SISRHandle;
pIrqHandle->Priority = 3;
InterruptRegister(pIrqHandle);
InterruptEn(pIrqHandle);
return HAL_OK;
}
static HAL_Status
RtkI2SIrqDeInit(
IN PHAL_I2S_ADAPTER pI2SAdapter
)
{
if (pI2SAdapter->DevNum > I2S_MAX_ID) {
DBG_I2S_ERR("RtkI2SIrqDeInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
InterruptDis(&pI2SAdapter->IrqHandle);
InterruptUnRegister(&pI2SAdapter->IrqHandle);
return HAL_OK;
}
static HAL_Status
RtkI2SPinMuxInit(
IN PHAL_I2S_ADAPTER pI2SAdapter
)
{
u32 I2Stemp;
if (pI2SAdapter->DevNum > I2S_MAX_ID) {
DBG_I2S_ERR("RtkI2SPinMuxInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
// enable system pll
I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) | (1<<9) | (1<<10);
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp);
switch (pI2SAdapter->DevNum){
case I2S0_SEL:
ACTCK_I2S_CCTRL(ON);
SLPCK_I2S_CCTRL(ON);
LXBUS_FCTRL(ON); // enable lx bus for i2s
/*I2S0 Pin Mux Setting*/
PinCtrl(I2S0, pI2SAdapter->PinMux, ON);
if (pI2SAdapter->PinMux == I2S_S0) {
DBG_I2S_WARN(ANSI_COLOR_MAGENTA"I2S0 Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET);
}
I2S0_MCK_CTRL(ON);
I2S0_PIN_CTRL(ON);
I2S0_FCTRL(ON);
break;
case I2S1_SEL:
ACTCK_I2S_CCTRL(ON);
SLPCK_I2S_CCTRL(ON);
LXBUS_FCTRL(ON); // enable lx bus for i2s
/*I2S1 Pin Mux Setting*/
PinCtrl(I2S1, pI2SAdapter->PinMux, ON);
if (pI2SAdapter->PinMux == I2S_S2) {
DBG_I2S_WARN(ANSI_COLOR_MAGENTA"I2S1 Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET);
}
I2S1_MCK_CTRL(ON);
I2S1_PIN_CTRL(ON);
I2S0_FCTRL(ON); //i2s 1 is control by bit 24 BIT_PERI_I2S0_EN
I2S1_FCTRL(ON);
break;
default:
return HAL_ERR_PARA;
}
return HAL_OK;
}
static HAL_Status
RtkI2SPinMuxDeInit(
IN PHAL_I2S_ADAPTER pI2SAdapter
)
{
if (pI2SAdapter->DevNum > I2S_MAX_ID) {
DBG_I2S_ERR("RtkI2SPinMuxDeInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
switch (pI2SAdapter->DevNum){
case I2S0_SEL:
/*I2S0 Pin Mux Setting*/
//ACTCK_I2C0_CCTRL(OFF);
PinCtrl(I2S0, pI2SAdapter->PinMux, OFF);
I2S0_MCK_CTRL(OFF);
I2S0_PIN_CTRL(OFF);
//I2S0_FCTRL(OFF);
break;
case I2S1_SEL:
/*I2S1 Pin Mux Setting*/
//ACTCK_I2C1_CCTRL(OFF);
PinCtrl(I2S1, pI2SAdapter->PinMux, OFF);
I2S1_MCK_CTRL(OFF);
I2S1_PIN_CTRL(OFF);
//I2S1_FCTRL(OFF);
break;
default:
return HAL_ERR_PARA;
}
return HAL_OK;
}
HAL_Status
RtkI2SInit(
IN VOID *Data
)
{
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL;
PHAL_I2S_INIT_DAT pI2SCfg;
if (pI2SAdapter == 0) {
DBG_I2S_ERR("RtkI2SInit: Null Pointer\r\n");
return HAL_ERR_PARA;
}
if (pI2SAdapter->DevNum > I2S_MAX_ID) {
DBG_I2S_ERR("RtkI2SInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
pI2SCfg = pI2SAdapter->pInitDat;
/*I2S Initialize HAL Operations*/
HalI2SOpInit(pHalI2SOP);
/*I2S Interrupt Initialization*/
RtkI2SIrqInit(pI2SAdapter);
/*I2S Pin Mux Initialization*/
RtkI2SPinMuxInit(pI2SAdapter);
/*I2S Load User Setting*/
pI2SCfg->I2SIdx = pI2SAdapter->DevNum;
/*I2S HAL Initialization*/
pHalI2SOP->HalI2SInit(pI2SCfg);
/*I2S Device Status Update*/
pI2SAdapter->DevSts = I2S_STS_INITIALIZED;
/*I2S Enable Module*/
pI2SCfg->I2SEn = I2S_ENABLE;
pHalI2SOP->HalI2SEnable(pI2SCfg);
/*I2S Device Status Update*/
pI2SAdapter->DevSts = I2S_STS_IDLE;
return HAL_OK;
}
HAL_Status
RtkI2SDeInit(
IN VOID *Data
)
{
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL;
PHAL_I2S_INIT_DAT pI2SCfg;
u32 I2Stemp;
if (pI2SAdapter == 0) {
DBG_I2S_ERR("RtkI2SDeInit: Null Pointer\r\n");
return HAL_ERR_PARA;
}
pI2SCfg = pI2SAdapter->pInitDat;
/*I2S Disable Module*/
pI2SCfg->I2SEn = I2S_DISABLE;
pHalI2SOP->HalI2SEnable(pI2SCfg);
HalI2SClearAllOwnBit((VOID*)pI2SCfg);
/*I2C HAL DeInitialization*/
//pHalI2SOP->HalI2SDeInit(pI2SCfg);
/*I2S Interrupt DeInitialization*/
RtkI2SIrqDeInit(pI2SAdapter);
/*I2S Pin Mux DeInitialization*/
RtkI2SPinMuxDeInit(pI2SAdapter);
/*I2S HAL DeInitialization*/
pHalI2SOP->HalI2SDeInit(pI2SCfg);
/*I2S CLK Source Close*/
I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) & (~((1<<9) | (1<<10)));
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp);
/*I2S Device Status Update*/
pI2SAdapter->DevSts = I2S_STS_UNINITIAL;
return HAL_OK;
}
HAL_Status
RtkI2SEnable(
IN VOID *Data
)
{
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL;
PHAL_I2S_INIT_DAT pI2SCfg;
u32 I2Stemp;
// Enable IP Clock
I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) | (1<<9) | (1<<10);
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp);
ACTCK_I2S_CCTRL(ON);
SLPCK_I2S_CCTRL(ON);
pI2SCfg = pI2SAdapter->pInitDat;
pI2SCfg->I2SEn = I2S_ENABLE;
pHalI2SOP->HalI2SEnable(pI2SCfg);
return HAL_OK;
}
HAL_Status
RtkI2SDisable(
IN VOID *Data
)
{
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL;
PHAL_I2S_INIT_DAT pI2SCfg;
u32 I2Stemp;
pI2SCfg = pI2SAdapter->pInitDat;
pI2SCfg->I2SEn = I2S_DISABLE;
pHalI2SOP->HalI2SEnable(pI2SCfg);
// Gate IP Clock
ACTCK_I2S_CCTRL(OFF);
SLPCK_I2S_CCTRL(OFF);
// Close I2S bus clock(WS,SCLK,MCLK). If needs that clock, mark this.
I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) & (~((1<<9) | (1<<10)));
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp);
return HAL_OK;
}
RTK_STATUS
RtkI2SIoCtrl(
IN VOID *Data
)
{
return _EXIT_SUCCESS;
}
RTK_STATUS
RtkI2SPowerCtrl(
IN VOID *Data
)
{
return _EXIT_SUCCESS;
}
HAL_Status
RtkI2SLoadDefault(
IN VOID *Adapter,
IN VOID *Setting
)
{
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Adapter;
PHAL_I2S_INIT_DAT pI2SCfg = pI2SAdapter->pInitDat;
PHAL_I2S_DEF_SETTING pLoadSetting = (PHAL_I2S_DEF_SETTING)Setting;
if (pI2SAdapter == 0) {
DBG_I2S_ERR("RtkI2SLoadDefault: Null Pointer\r\n");
return HAL_ERR_PARA;
}
if (pI2SAdapter->pInitDat == NULL) {
DBG_I2S_ERR("RtkI2SLoadDefault: pInitDat is NULL!\r\n", pI2SAdapter->DevNum);
return HAL_ERR_PARA;
}
pI2SAdapter->DevSts = pLoadSetting->DevSts;
pI2SAdapter->ErrType = 0;
pI2SAdapter->TimeOut = 0;
pI2SCfg->I2SIdx = pI2SAdapter->DevNum;
pI2SCfg->I2SEn = I2S_DISABLE;
pI2SCfg->I2SMaster = pLoadSetting->I2SMaster;
pI2SCfg->I2SWordLen = pLoadSetting->I2SWordLen;
pI2SCfg->I2SChNum = pLoadSetting->I2SChNum;
pI2SCfg->I2SPageNum = pLoadSetting->I2SPageNum;
pI2SCfg->I2SPageSize = pLoadSetting->I2SPageSize;
pI2SCfg->I2SRate = pLoadSetting->I2SRate;
pI2SCfg->I2STRxAct = pLoadSetting->I2STRxAct;
pI2SCfg->I2STxIntrMSK = pLoadSetting->I2STxIntrMSK;
pI2SCfg->I2SRxIntrMSK = pLoadSetting->I2SRxIntrMSK;
return HAL_OK;
}
VOID HalI2SOpInit(
IN VOID *Data
)
{
PHAL_I2S_OP pHalI2SOp = (PHAL_I2S_OP) Data;
pHalI2SOp->HalI2SInit = HalI2SInitRtl8195a_Patch;
pHalI2SOp->HalI2SDeInit = HalI2SDeInitRtl8195a;
pHalI2SOp->HalI2STx = HalI2STxRtl8195a;
pHalI2SOp->HalI2SRx = HalI2SRxRtl8195a;
pHalI2SOp->HalI2SEnable = HalI2SEnableRtl8195a;
pHalI2SOp->HalI2SIntrCtrl = HalI2SIntrCtrlRtl8195a;
pHalI2SOp->HalI2SReadReg = HalI2SReadRegRtl8195a;
pHalI2SOp->HalI2SSetRate = HalI2SSetRateRtl8195a;
pHalI2SOp->HalI2SSetWordLen = HalI2SSetWordLenRtl8195a;
pHalI2SOp->HalI2SSetChNum = HalI2SSetChNumRtl8195a;
pHalI2SOp->HalI2SSetPageNum = HalI2SSetPageNumRtl8195a;
pHalI2SOp->HalI2SSetPageSize = HalI2SSetPageSizeRtl8195a;
pHalI2SOp->HalI2SClrIntr = HalI2SClrIntrRtl8195a;
pHalI2SOp->HalI2SClrAllIntr = HalI2SClrAllIntrRtl8195a;
pHalI2SOp->HalI2SDMACtrl = HalI2SDMACtrlRtl8195a;
}
HAL_Status
HalI2SInit(
IN VOID *Data
)
{
HAL_Status ret;
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE I2sPwrState;
#endif
ret = RtkI2SInit(Data);
#ifdef CONFIG_SOC_PS_MODULE
if(ret == HAL_OK) {
// To register a new peripheral device power state
I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum;
I2sPwrState.PwrState = ACT;
RegPowerState(I2sPwrState);
}
#endif
return ret;
}
VOID
HalI2SDeInit(
IN VOID *Data
)
{
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE I2sPwrState;
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
u8 HwState;
I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum;
QueryRegPwrState(I2sPwrState.FuncIdx, &(I2sPwrState.PwrState), &HwState);
// if the power state isn't ACT, then switch the power state back to ACT first
if ((I2sPwrState.PwrState != ACT) && (I2sPwrState.PwrState != INACT)) {
HalI2SEnable(Data);
QueryRegPwrState(I2sPwrState.FuncIdx, &(I2sPwrState.PwrState), &HwState);
}
if (I2sPwrState.PwrState == ACT) {
I2sPwrState.PwrState = INACT;
RegPowerState(I2sPwrState);
}
#endif
RtkI2SDeInit(Data);
}
HAL_Status
HalI2SDisable(
IN VOID *Data
)
{
HAL_Status ret;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE I2sPwrState;
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
#endif
ret = RtkI2SDisable(Data);
#ifdef CONFIG_SOC_PS_MODULE
if (ret == HAL_OK) {
I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum;
I2sPwrState.PwrState = SLPCG;
RegPowerState(I2sPwrState);
}
#endif
return ret;
}
HAL_Status
HalI2SEnable(
IN VOID *Data
)
{
HAL_Status ret;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE I2sPwrState;
PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data;
#endif
ret = RtkI2SEnable(Data);
#ifdef CONFIG_SOC_PS_MODULE
if (ret == HAL_OK) {
I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum;
I2sPwrState.PwrState = ACT;
RegPowerState(I2sPwrState);
}
#endif
return ret;
}

42
lib/fwlib/src/hal_mii.c Normal file
View file

@ -0,0 +1,42 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "hal_mii.h"
VOID
HalMiiOpInit(
IN VOID *Data
)
{
PHAL_MII_OP pHalMiiOp = (PHAL_MII_OP) Data;
pHalMiiOp->HalMiiGmacInit = HalMiiGmacInitRtl8195a;
pHalMiiOp->HalMiiInit = HalMiiInitRtl8195a;
pHalMiiOp->HalMiiGmacReset = HalMiiGmacResetRtl8195a;
pHalMiiOp->HalMiiGmacEnablePhyMode = HalMiiGmacEnablePhyModeRtl8195a;
pHalMiiOp->HalMiiGmacXmit = HalMiiGmacXmitRtl8195a;
pHalMiiOp->HalMiiGmacCleanTxRing = HalMiiGmacCleanTxRingRtl8195a;
pHalMiiOp->HalMiiGmacFillTxInfo = HalMiiGmacFillTxInfoRtl8195a;
pHalMiiOp->HalMiiGmacFillRxInfo = HalMiiGmacFillRxInfoRtl8195a;
pHalMiiOp->HalMiiGmacTx = HalMiiGmacTxRtl8195a;
pHalMiiOp->HalMiiGmacRx = HalMiiGmacRxRtl8195a;
pHalMiiOp->HalMiiGmacSetDefaultEthIoCmd = HalMiiGmacSetDefaultEthIoCmdRtl8195a;
pHalMiiOp->HalMiiGmacInitIrq = HalMiiGmacInitIrqRtl8195a;
pHalMiiOp->HalMiiGmacGetInterruptStatus = HalMiiGmacGetInterruptStatusRtl8195a;
pHalMiiOp->HalMiiGmacClearInterruptStatus = HalMiiGmacClearInterruptStatusRtl8195a;
#if 0
pHalMiiOp-> = Rtl8195a;
pHalMiiOp-> = Rtl8195a;
pHalMiiOp-> = Rtl8195a;
pHalMiiOp-> = Rtl8195a;
pHalMiiOp-> = Rtl8195a;
#endif
}

20
lib/fwlib/src/hal_nfc.c Normal file
View file

@ -0,0 +1,20 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_nfc.h"
VOID HalNFCOpInit(
IN VOID *Data
)
{
}

28
lib/fwlib/src/hal_pcm.c Normal file
View file

@ -0,0 +1,28 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "hal_pcm.h"
VOID HalPcmOpInit(
IN VOID *Data
)
{
PHAL_PCM_OP pHalPcmOp = (PHAL_PCM_OP) Data;
pHalPcmOp->HalPcmOnOff = HalPcmOnOffRtl8195a;
pHalPcmOp->HalPcmInit = HalPcmInitRtl8195a;
pHalPcmOp->HalPcmSetting = HalPcmSettingRtl8195a;
pHalPcmOp->HalPcmEn = HalPcmEnRtl8195a;
pHalPcmOp->HalPcmIsrEnAndDis= HalPcmIsrEnAndDisRtl8195a;
pHalPcmOp->HalPcmDumpReg= HalPcmDumpRegRtl8195a;
pHalPcmOp->HalPcm= HalPcmRtl8195a;
}

131
lib/fwlib/src/hal_pwm.c Normal file
View file

@ -0,0 +1,131 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#ifdef CONFIG_PWM_EN
#include "hal_pwm.h"
#include "hal_timer.h"
HAL_PWM_ADAPTER PWMPin[MAX_PWM_CTRL_PIN];
const u8 PWMTimerIdx[MAX_PWM_CTRL_PIN]= {3,4,5,6}; // the G-timer ID used for PWM pin 0~3
/**
* @brief Initializes and enable a PWM control pin.
*
* @param pwm_id: the PWM pin index
* @param sel: pin mux selection
*
* @retval HAL_Status
*/
HAL_Status
HAL_Pwm_Init(
u32 pwm_id,
u32 sel
)
{
HAL_PWM_ADAPTER *pPwmAdapt;
u32 timer_id;
DBG_PWM_INFO("%s: Init PWM for PWM %d, Sel %d\n", __FUNCTION__, pwm_id, sel);
if ((pwm_id >= MAX_PWM_CTRL_PIN) || (sel > 3)) {
DBG_PWM_ERR ("HAL_Pwm_Init: Invalid PWM index(%d), sel(%d)\n", pwm_id, sel);
return HAL_ERR_PARA;
}
pPwmAdapt = &PWMPin[pwm_id];
pPwmAdapt->pwm_id = pwm_id;
pPwmAdapt->sel = sel;
timer_id = PWMTimerIdx[pwm_id];
pPwmAdapt->gtimer_id = timer_id;
return HAL_Pwm_Init_8195a (pPwmAdapt);
}
/**
* @brief Disable a PWM control pin.
*
* @param pwm_id: the PWM pin index
*
* @retval None
*/
void
HAL_Pwm_Enable(
u32 pwm_id
)
{
HAL_PWM_ADAPTER *pPwmAdapt;
if (pwm_id >= MAX_PWM_CTRL_PIN) {
DBG_PWM_ERR ("HAL_Pwm_Enable: Invalid PWM index(%d)\n", pwm_id);
return;
}
pPwmAdapt = &PWMPin[pwm_id];
HAL_Pwm_Enable_8195a(pPwmAdapt);
}
/**
* @brief Disable a PWM control pin.
*
* @param pwm_id: the PWM pin index
*
* @retval None
*/
void
HAL_Pwm_Disable(
u32 pwm_id
)
{
HAL_PWM_ADAPTER *pPwmAdapt;
if (pwm_id >= MAX_PWM_CTRL_PIN) {
DBG_PWM_ERR ("HAL_Pwm_Disable: Invalid PWM index(%d)\n", pwm_id);
return;
}
pPwmAdapt = &PWMPin[pwm_id];
HAL_Pwm_Disable_8195a(pPwmAdapt);
}
/**
* @brief Set the duty ratio of the PWM pin.
*
* @param pwm_id: the PWM pin index
* @param period: the period time, in micro-second.
* @param pulse_width: the pulse width time, in micro-second.
*
* @retval None
*/
void
HAL_Pwm_SetDuty(
u32 pwm_id,
u32 period,
u32 pulse_width
)
{
HAL_PWM_ADAPTER *pPwmAdapt;
if (pwm_id >= MAX_PWM_CTRL_PIN) {
DBG_PWM_ERR ("HAL_Pwm_SetDuty: Invalid PWM index(%d)\n", pwm_id);
return;
}
// DBG_PWM_INFO("%s: Period%d Pulse%d\n", __FUNCTION__, period, pulse_width);
pPwmAdapt = &PWMPin[pwm_id];
HAL_Pwm_SetDuty_8195a(pPwmAdapt, period, pulse_width);
}
#endif // end of "#ifdef CONFIG_PWM_EN"

View file

@ -0,0 +1,971 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_sdr_controller.h"
#include "rtl8195a_sdr.h"
#if 0
#define HAL_SDR_WRITE32(addr, value32) HAL_WRITE32(SDR_CTRL_BASE, addr, value32)
#define HAL_SDR_WRITE16(addr, value16) HAL_WRITE16(SDR_CTRL_BASE, addr, value16)
#define HAL_SDR_WRITE8(addr, value8) HAL_WRITE8(SDR_CTRL_BASE, addr, value8)
#define HAL_SDR_READ32(addr) HAL_READ32(SDR_CTRL_BASE, addr)
#define HAL_SDR_READ16(addr) HAL_READ16(SDR_CTRL_BASE, addr)
#define HAL_SDR_READ8(addr) HAL_READ8(SDR_CTRL_BASE, addr)
#define HAL_SDRAM_WRITE32(addr, value32) HAL_WRITE32(SDR_SDRAM_BASE, addr, value32)
#define HAL_SDRAM_WRITE16(addr, value16) HAL_WRITE16(SDR_SDRAM_BASE, addr, value16)
#define HAL_SDRAM_WRITE8(addr, value8) HAL_WRITE8(SDR_SDRAM_BASE, addr, value8)
#define HAL_SDRAM_READ32(addr) HAL_READ32(SDR_SDRAM_BASE, addr)
#define HAL_SDRAM_READ16(addr) HAL_READ16(SDR_SDRAM_BASE, addr)
#define HAL_SDRAM_READ8(addr) HAL_READ8(SDR_SDRAM_BASE, addr)
#endif
HAL_CUT_B_RAM_DATA_SECTION
DRAM_INFO SdrDramDev = {
DRAM_INFO_TYPE,
DRAM_INFO_COL_ADDR_WTH,
DRAM_INFO_BANK_SZ,
DRAM_INFO_DQ_WTH
};
HAL_CUT_B_RAM_DATA_SECTION
DRAM_MODE_REG_INFO SdrDramModeReg = {
BST_LEN_4,
SENQUENTIAL,
0x3, // Mode0Cas: 3
0x0, // Mode0Wr
0, // Mode1DllEnN
0, // Mode1AllLat
0 // Mode2Cwl
};
HAL_CUT_B_RAM_DATA_SECTION
DRAM_TIMING_INFO SdrDramTiming = {
DRAM_TIMING_TRFC, // TrfcPs;
DRAM_TIMING_TREFI, // TrefiPs;
DRAM_TIMING_TWRMAXTCK, // WrMaxTck;
DRAM_TIMING_TRCD, // TrcdPs;
DRAM_TIMING_TRP, // TrpPs;
DRAM_TIMING_TRAS, // TrasPs;
DRAM_TIMING_TRRD, // TrrdTck;
DRAM_TIMING_TWR, // TwrPs;
DRAM_TIMING_TWTR, // TwtrTck;
//13090, // TrtpPs;
DRAM_TIMING_TMRD, // TmrdTck;
DRAM_TIMING_TRTP, // TrtpTck;
DRAM_TIMING_TCCD, // TccdTck;
DRAM_TIMING_TRC // TrcPs;
};
HAL_CUT_B_RAM_DATA_SECTION
DRAM_DEVICE_INFO SdrDramInfo = {
&SdrDramDev,
&SdrDramModeReg,
&SdrDramTiming,
DRAM_TIMING_TCK,
DFI_RATIO_1
};
#define FPGA
#define FPGA_TEMP
#define SDR_CLK_DLY_CTRL 0x40000300
#define MIN_RD_PIPE 0x0
#define MAX_RD_PIPE 0x7
#define SUPPORT_DRAM_KED
#ifdef FPGA
#ifdef FPGA_TEMP
#define MAX_TAP_DLY 0xC
#else
#define MAX_TAP_DLY 0x7F
#define SPEC_MAX_TAP 0xFF
#endif
#else
#define MAX_TAP_DLY 99 // 0~99
#define SPEC_MAX_TAP 99
#define WINDOW_COMBIN // combine window [0~a] and [b~99] (for asic mode)
#endif
#define TAP_DLY 0x1
#define REC_NUM 512
u32 SdrControllerInit(VOID);
VOID DramInit(DRAM_DEVICE_INFO *);
s32 MemTest(u32 loop_cnt);
u32 SdrCalibration(VOID);
u32 Sdr_Rand2(VOID);
//3 Note: stack overfloat if the arrary is declared in the task
HAL_CUT_B_RAM_DATA_SECTION
u32 AvaWds[2][REC_NUM];
HAL_CUT_B_RAM_DATA_SECTION
unsigned int rand_x = 123456789;
#ifdef CONFIG_SDR_EN
#ifdef CONFIG_SDR_VERIFY
enum{
LLT,
TXRPT,
RXBUFF,
TXBUFF,
};
#define REPORT_OFFSET 0x8000
#define RAMASK_OFFSET 0x8800
#define LLT_H_ADDR 0x650
#define TXREPORT_H_ADDR 0x660
#define RXBUFF_H_ADDR 0x670
#define TXBUFF_H_ADDR 0x680
#define REG_PKTBUF_DBG_CTRL_8723B 0x0140
int
rt_rpt_h_addr(u8 rpt)
{
u32 r_val, offset;
if (rpt == LLT){
offset = LLT_H_ADDR;
}
else if (rpt == TXRPT){
offset = TXREPORT_H_ADDR;
}
else if (rpt == RXBUFF){
offset = RXBUFF_H_ADDR;
}
else if (rpt == TXBUFF){
offset = TXBUFF_H_ADDR;
}
else {
}
r_val = ((HAL_READ32(WIFI_REG_BASE, REG_PKTBUF_DBG_CTRL_8723B)&0xFFFFF000)|offset);
HAL_WRITE32(WIFI_REG_BASE, REG_PKTBUF_DBG_CTRL_8723B, r_val);
}
int
rt_txrpt_read32(u8 macid, u8 offset)
{
u32 r_val;
rt_rpt_h_addr(TXRPT);
r_val = HAL_READ32(WIFI_REG_BASE, (REPORT_OFFSET + macid*4 + offset));
return r_val;
}
int
rt_txrpt_read16(u8 macid, u8 offset)
{
u16 r_val;
rt_rpt_h_addr(TXRPT);
r_val = HAL_READ16(WIFI_REG_BASE, (REPORT_OFFSET + macid*8 + offset));
return r_val;
}
int
rt_txrpt_read8(u8 macid, u8 offset)
{
u8 r_val;
rt_rpt_h_addr(TXRPT);
r_val = HAL_READ8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset));
return r_val;
}
int
rt_txrpt_read_1b(u8 macid, u8 offset, u8 bit_offset)
{
u8 r_val = ((rt_txrpt_read8(macid, offset) & BIT(bit_offset))?1:0);
return r_val;
}
int
rt_txrpt_write32(u8 macid, u8 offset, u32 val)
{
rt_rpt_h_addr(TXRPT);
HAL_WRITE32(WIFI_REG_BASE, (REPORT_OFFSET + macid*4 + offset), val);
}
int
rt_txrpt_write16(u8 macid, u8 offset, u16 val)
{
rt_rpt_h_addr(TXRPT);
HAL_WRITE16(WIFI_REG_BASE, (REPORT_OFFSET + macid*8 + offset), val);
}
int
rt_txrpt_write8(u8 macid, u8 offset, u8 val)
{
rt_rpt_h_addr(TXRPT);
DBG_8195A("Write addr %x %x\n", (REPORT_OFFSET + macid*16 + offset), val);
HAL_WRITE8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset), val);
}
int
rt_txrpt_write_1b(u8 macid, u8 offset, u8 bit_offset, u8 val)
{
u8 r_val = rt_txrpt_read8(macid, offset);
if (val){
r_val |= BIT(bit_offset);
}
else {
r_val &= (~BIT(bit_offset));
}
HAL_WRITE8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset), r_val);
}
u8
ReadTxrptsdr8(
IN u8 Macid,
IN u8 Offset)
{
u8 r_val;
r_val = rt_txrpt_read8(Macid, Offset);
return r_val;
}
VOID
WriteTxrptsdr8(
IN u8 Macid,
IN u8 Offset,
IN u8 Val)
{
rt_txrpt_write8(Macid, Offset, Val);
}
VOID
SdrTestApp(
IN VOID *Data
)
{
u32 *Cmd =(u32*)Data;
u32 Loop, LoopIndex, Value32, Addr, Loop1, LoopIndex1;
switch (Cmd[0]) {
case 1:
DBG_8195A("Initial SDR\n");
//1 "SdrControllerInit" is located in Image1, so we shouldn't call it in Image2
if (!SdrControllerInit()) {
DBG_8195A("SDR Calibartion Fail!!!!\n");
}
break;
case 2:
Loop = Cmd[1];
Loop1 = Cmd[2];
DBG_8195A("Verify SDR: Loop = 0x%08x Loop1 = 0x%08x\n",Loop, Loop1);
for (LoopIndex1=0; LoopIndex1 < Loop1; LoopIndex1++) {
for (LoopIndex=0; LoopIndex < Loop; LoopIndex++) {
Value32 = Rand2();
Addr = Rand2();
Addr &= 0x1FFFFF;
Addr &= (~0x3);
if (!(LoopIndex & 0xFFFFF)) {
DBG_8195A("Alive: LOOP = 0x%08x, LOOP = 0x%08x\n",LoopIndex1, LoopIndex);
}
// DBG_8195A("Value: 0x%x; Addr: 0x%x\n", Value32, Addr+SDR_SDRAM_BASE);
HAL_SDRAM_WRITE32(Addr, Value32);
if (Value32 != HAL_SDRAM_READ32(Addr)) {
DBG_8195A("Loop:%d; Addr: 0x%08x => CheckData error: W: 0x%08x /R:0x%x\n"
,LoopIndex
,Addr
,Value32
,HAL_SDRAM_READ32(Addr));
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSTBY_INFO2, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSTBY_INFO2)+1);
break;
}
}
}
DBG_8195A("Verify SDR Success\n");
break;
case 3:
DBG_8195A("WL read RPT MACID %x\n", Cmd[1]);
{
u8 i =0;
for(i=0;i<16;i++) {
DBG_8195A("WL RPT offset %d = %x\n", i, ReadTxrptsdr8(Cmd[1],i));
}
}
break;
case 4:
DBG_8195A("WL write RPT MACID %x\n", Cmd[1]);
{
u8 i =0;
for(i=0;i<16;i++) {
WriteTxrptsdr8(Cmd[1],i,Cmd[2]);
//DBG_8195A("WL RPT offset %d = %x\n", i, ReadTxrptsdr8(Cmd[1],i));
}
}
break;
default:
break;
}
}
#endif
HAL_SDRC_TEXT_SECTION
VOID
SdrCtrlInit(
VOID
){
HAL_WRITE32(0x40000000, 0x40,
((HAL_READ32(0x40000000, 0x40)&0xfffff)|0xe00000));
LDO25M_CTRL(ON);
}
HAL_SDRC_TEXT_SECTION
u32
SdrControllerInit(
VOID
)
{
DBG_8195A("SDR Controller Init\n");
HAL_WRITE32(0x40000000, 0x40,
((HAL_READ32(0x40000000, 0x40)&0xfffff)|0x300000));
SRAM_MUX_CFG(0x2);
SDR_CLK_SEL(SDR_CLOCK_SEL_VALUE);
HAL_PERI_ON_WRITE32(REG_GPIO_PULL_CTRL4,0);
ACTCK_SDR_CCTRL(ON);
SLPCK_SDR_CCTRL(ON);
PinCtrl(SDR, 0, ON);
HAL_PERI_ON_WRITE32(REG_GPIO_PULL_CTRL4,0);
MEM_CTRL_FCTRL(ON);
HalDelayUs(3000);
// sdr initialization
DramInit(&SdrDramInfo);
// sdr calibration
if(!SdrCalibration()) {
return 0;
}
else {
return 1;
}
}
HAL_SDRC_TEXT_SECTION
VOID
DramInit (
IN DRAM_DEVICE_INFO *DramInfo
)
{
u32 CsBstLen = 0; // 0:bst_4, 1:bst_8
u32 CasWr = 0;//, CasWrT; // cas write latency
u32 CasRd = 0, CasRdT = 0, CrlSrt = 0; // cas read latency
u32 AddLat;
u32 DramEmr2 = 0, DramMr0 = 0;
u32 CrTwr, DramMaxWr, DramWr;
u32 CrTrtw = 0, CrTrtwT = 0;
u32 DrmaPeriod;
DRAM_TYPE DdrType;
DRAM_DQ_WIDTH DqWidth;
DRAM_COLADDR_WTH Page;
u32 DfiRate;
volatile struct ms_rxi310_portmap *ms_ctrl_0_map;
ms_ctrl_0_map = (struct ms_rxi310_portmap*) SDR_CTRL_BASE;
ms_ctrl_0_map = ms_ctrl_0_map;
DfiRate = 1 << (u32) (DramInfo->DfiRate);
DrmaPeriod = (DramInfo->DdrPeriodPs)*(DfiRate); // according DFI_RATE to setting
// In PHY, write latency == 3
DramMaxWr= (DramInfo->Timing->WrMaxTck)/(DfiRate) +1;
DramWr = ((DramInfo->Timing->TwrPs) / DrmaPeriod)+1;
CrTwr = ((DramInfo->Timing->TwrPs) / DrmaPeriod) + 3;
if (CrTwr < DramMaxWr) {
CrTwr = CrTwr;
}
else {
CrTwr = DramMaxWr;
}
if ((DramInfo->Dev->DeviceType) == DRAM_DDR_2) {
DdrType = DRAM_DDR_2;
if (DramInfo->ModeReg->BstLen == BST_LEN_4) {
CsBstLen = 0; //bst_4
CrTrtwT = 2+2; //4/2+2
DramMr0 = 0x2;
}
else { // BST_LEN_8
CsBstLen = 1; // bst_8
CrTrtwT = 4+2; // 8/2+2
DramMr0 = 0x3;
}
CasRd = DramInfo->ModeReg->Mode0Cas;
AddLat = DramInfo->ModeReg ->Mode1AllLat;
CasWr = CasRd + AddLat -1;
DramEmr2 = 0;
DramMr0 =(((DramWr%6)-1) << (PCTL_MR_OP_BFO+1)) | // write_recovery
(0 << PCTL_MR_OP_BFO ) | // dll
(DramInfo->ModeReg->Mode0Cas << PCTL_MR_CAS_BFO ) |
(DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) |
DramMr0;
}
else if ((DramInfo->Dev->DeviceType) == DRAM_DDR_3) {
DdrType = DRAM_DDR_3;
if (DramInfo->ModeReg->BstLen == BST_LEN_4) {
CsBstLen = 0; //bst_4
DramMr0 = 0x2;
}
else { // BST_LEN_8
CsBstLen = 1; // bst_8
DramMr0 = 0x0;
}
CrlSrt = (DramInfo->ModeReg->Mode0Cas >> 1);
if (((DramInfo->ModeReg->Mode0Cas) & 0x1) ) {
CasRdT = CrlSrt+ 12;
}
else {
CasRdT = CrlSrt+ 4;
}
if (DramInfo->ModeReg->Mode1AllLat == 1) { // CL-1
AddLat = CasRd -1;
}
else if (DramInfo->ModeReg->Mode1AllLat == 2){ // CL-2
AddLat = CasRd -2;
}
else {
AddLat = 0;
}
CasRd = CasRdT + AddLat;
CasWr = DramInfo->ModeReg->Mode2Cwl + 5 + AddLat;
DramEmr2 = DramInfo->ModeReg->Mode2Cwl << 3;
if (DramWr == 16) {
DramWr = 0;
}
else if (DramWr <= 9) { // 5< wr <= 9
DramWr = DramWr - 4;
}
else {
DramWr = (DramWr + 1) / 2;
}
DramMr0 =(DramWr << (PCTL_MR_OP_BFO+1) ) | // write_recovery
(0 << PCTL_MR_OP_BFO ) | // dll
((DramInfo->ModeReg->Mode0Cas >>1 ) << PCTL_MR_CAS_BFO ) |
(DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) |
((DramInfo->ModeReg->Mode0Cas & 0x1) << 2 ) |
DramMr0;
CrTrtwT = (CasRdT + 6) - CasWr;
} // ddr2/ddr3
else if ((DramInfo->Dev->DeviceType) == DRAM_SDR) {
DdrType = DRAM_SDR;
if (DramInfo->ModeReg->BstLen == BST_LEN_4) {
DramMr0 = 2; // bst_4
CsBstLen = 0; //bst_4
CasRd = 0x2;
}
else { // BST_LEN_8
DramMr0 = 3; // bst_8
CsBstLen = 1; // bst_8
CasRd = 0x3;
}
CasWr = 0;
DramMr0 =(CasRd << PCTL_MR_CAS_BFO) |
(DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) |
DramMr0;
CrTrtwT = 0; // tic: CasRd + rd_rtw + rd_pipe
} // SDR
// countting tRTW
if ((CrTrtwT & 0x1)) {
CrTrtw = (CrTrtwT+1) /(DfiRate);
}
else {
CrTrtw = CrTrtwT /(DfiRate);
}
DqWidth = (DramInfo->Dev->DqWidth);
Page = DramInfo->Dev->ColAddrWth +1; // DQ16 -> memory:byte_unit *2
if (DqWidth == DRAM_DQ_32) { // paralle dq_16 => Page + 1
Page = Page +1;
}
#if 1
// WRAP_MISC setting
HAL_SDR_WRITE32(REG_SDR_MISC,(
(Page << WRAP_MISC_PAGE_SIZE_BFO) |
(DramInfo->Dev->Bank << WRAP_MISC_BANK_SIZE_BFO) |
(CsBstLen << WRAP_MISC_BST_SIZE_BFO ) |
(DqWidth << WRAP_MISC_DDR_PARAL_BFO)
));
// PCTL setting
HAL_SDR_WRITE32(REG_SDR_DCR,(
(0x2 << PCTL_DCR_DFI_RATE_BFO) |
(DqWidth << PCTL_DCR_DQ32_BFO ) |
(DdrType << PCTL_DCR_DDR3_BFO )
));
HAL_SDR_WRITE32(REG_SDR_IOCR,(
((CasRd -4)/(DfiRate) << PCTL_IOCR_TPHY_RD_EN_BFO ) |
(0 << PCTL_IOCR_TPHY_WL_BFO ) |
(((CasWr -3)/(DfiRate)) << PCTL_IOCR_TPHY_WD_BFO ) |
(0 << PCTL_IOCR_RD_PIPE_BFO )
));
if ((DramInfo->Dev->DeviceType) != SDR) { // DDR2/3
HAL_SDR_WRITE32(REG_SDR_EMR2,DramEmr2);
HAL_SDR_WRITE32(REG_SDR_EMR1,(
(1 << 2 ) | //RTT
(1 << 1 ) | //D.I.C
(DramInfo->ModeReg->Mode1DllEnN )
));
} // DDR2/3
HAL_SDR_WRITE32(REG_SDR_MR,DramMr0);
HAL_SDR_WRITE32(REG_SDR_DRR, (
(0 << PCTL_DRR_REF_DIS_BFO) |
(9 << PCTL_DRR_REF_NUM_BFO) |
((((DramInfo->Timing->TrefiPs)/DrmaPeriod)+1) << PCTL_DRR_TREF_BFO ) |
((((DramInfo->Timing->TrfcPs)/DrmaPeriod)+1) << PCTL_DRR_TRFC_BFO )
));
HAL_SDR_WRITE32(REG_SDR_TPR0,(
((((DramInfo->Timing->TrtpTck)/DfiRate)+1) << PCTL_TPR0_TRTP_BFO) |
(CrTwr << PCTL_TPR0_TWR_BFO ) |
((((DramInfo->Timing->TrasPs)/DrmaPeriod)+1) << PCTL_TPR0_TRAS_BFO) |
((((DramInfo->Timing->TrpPs)/DrmaPeriod)+1) << PCTL_TPR0_TRP_BFO )
));
HAL_SDR_WRITE32(REG_SDR_TPR1, (
(CrTrtw << PCTL_TPR1_TRTW_BFO) |
((((DramInfo->Timing->TwtrTck)/DfiRate)+3) << PCTL_TPR1_TWTR_BFO) |
((((DramInfo->Timing->TccdTck)/DfiRate)+1) << PCTL_TPR1_TCCD_BFO) |
((((DramInfo->Timing->TrcdPs)/DrmaPeriod)+1) << PCTL_TPR1_TRCD_BFO) |
((((DramInfo->Timing->TrcPs)/DrmaPeriod)+1) << PCTL_TPR1_TRC_BFO ) |
(((DramInfo->Timing->TrrdTck/DfiRate)+1) << PCTL_TPR1_TRRD_BFO)
));
HAL_SDR_WRITE32(REG_SDR_TPR2, (
(DramInfo->Timing->TmrdTck << PCTL_TPR2_TMRD_BFO ) |
(0 << PCTL_TPR2_INIT_NS_EN_BFO ) |
(2 << PCTL_TPR2_INIT_REF_NUM_BFO)
));
// set all_mode _idle
HAL_SDR_WRITE32(REG_SDR_CSR,0x700);
// start to init
HAL_SDR_WRITE32(REG_SDR_CCR,0x01);
while ((HAL_SDR_READ32(REG_SDR_CCR)& 0x1) == 0x0);
// enter mem_mode
HAL_SDR_WRITE32(REG_SDR_CSR,0x600);
#else
// WRAP_MISC setting
ms_ctrl_0_map->misc = //0x12;
(
(Page << WRAP_MISC_PAGE_SIZE_BFO) |
(DramInfo->Dev->Bank << WRAP_MISC_BANK_SIZE_BFO) |
(CsBstLen << WRAP_MISC_BST_SIZE_BFO ) |
(DqWidth << WRAP_MISC_DDR_PARAL_BFO)
);
// PCTL setting
ms_ctrl_0_map->dcr = //0x208;
(
(0x2 << PCTL_DCR_DFI_RATE_BFO) |
(DqWidth << PCTL_DCR_DQ32_BFO ) |
(DdrType << PCTL_DCR_DDR3_BFO )
);
ms_ctrl_0_map->iocr = (
((CasRd -4)/(DfiRate) << PCTL_IOCR_TPHY_RD_EN_BFO ) |
(0 << PCTL_IOCR_TPHY_WL_BFO ) |
(((CasWr -3)/(DfiRate)) << PCTL_IOCR_TPHY_WD_BFO ) |
(0 << PCTL_IOCR_RD_PIPE_BFO )
);
if ((DramInfo->Dev->DeviceType) != SDR) { // DDR2/3
ms_ctrl_0_map->emr2 = DramEmr2;
ms_ctrl_0_map->emr1 = (
(1 << 2 ) | //RTT
(1 << 1 ) | //D.I.C
(DramInfo->ModeReg->Mode1DllEnN )
);
} // DDR2/3
ms_ctrl_0_map->mr = DramMr0;
ms_ctrl_0_map->drr = (
(0 << PCTL_DRR_REF_DIS_BFO) |
(9 << PCTL_DRR_REF_NUM_BFO) |
((((DramInfo->Timing->TrefiPs)/DrmaPeriod)+1)<< PCTL_DRR_TREF_BFO ) |
((((DramInfo->Timing->TrfcPs)/DrmaPeriod)+1) << PCTL_DRR_TRFC_BFO )
);
ms_ctrl_0_map->tpr0= (
((((DramInfo->Timing->TrtpTck)/DfiRate)+1) << PCTL_TPR0_TRTP_BFO) |
(CrTwr << PCTL_TPR0_TWR_BFO ) |
((((DramInfo->Timing->TrasPs)/DrmaPeriod)+1) << PCTL_TPR0_TRAS_BFO) |
((((DramInfo->Timing->TrpPs)/DrmaPeriod)+1) << PCTL_TPR0_TRP_BFO )
);
ms_ctrl_0_map->tpr1= (
(CrTrtw << PCTL_TPR1_TRTW_BFO) |
((((DramInfo->Timing->TwtrTck)/DfiRate)+3) << PCTL_TPR1_TWTR_BFO) |
((((DramInfo->Timing->TccdTck)/DfiRate)+1) << PCTL_TPR1_TCCD_BFO) |
((((DramInfo->Timing->TrcdPs)/DrmaPeriod)+1) << PCTL_TPR1_TRCD_BFO) |
((((DramInfo->Timing->TrcPs)/DrmaPeriod)+1) << PCTL_TPR1_TRC_BFO ) |
(((DramInfo->Timing->TrrdTck/DfiRate)+1) << PCTL_TPR1_TRRD_BFO)
);
ms_ctrl_0_map->tpr2= (
(DramInfo->Timing->TmrdTck << PCTL_TPR2_TMRD_BFO ) |
(0 << PCTL_TPR2_INIT_NS_EN_BFO ) |
(2 << PCTL_TPR2_INIT_REF_NUM_BFO)
);
// set all_mode _idle
ms_ctrl_0_map->csr = 0x700;
// start to init
ms_ctrl_0_map->ccr = 0x1;
while (((ms_ctrl_0_map->ccr)& 0x1) == 0x0);
// enter mem_mode
ms_ctrl_0_map->csr= 0x600;
#endif
} // DramInit
//3
extern void *
_memset( void *s, int c, SIZE_T n );
HAL_SDRC_TEXT_SECTION
u32
SdrCalibration(
VOID
)
{
#ifdef FPGA
#ifdef FPGA_TEMP
// u32 Value32;
#endif
#else
// u32 Value32;
#endif
u32 RdPipe = 0, TapCnt = 0, Pass = 0, AvaWdsCnt = 0;
u32 RdPipeCounter, RecNum[2], RecRdPipe[2];//, AvaWds[2][REC_NUM];
BOOL RdPipeFlag, PassFlag = 0, Result;
Result = _FALSE;
#ifdef SUPPORT_DRAM_KED
// read calibration data from system data 0x5d~0x6c
SPIC_INIT_PARA SpicInitPara;
u32 valid;
union { u8 b[4]; u32 l;} value;
u32 CpuType = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) & (0x70)) >> 4);
valid = RdPipe = TapCnt = 0xFFFFFFFF;
value.l = HAL_READ32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType);
if((value.b[0]^value.b[1])==0xFF)
valid = value.b[0];
//DiagPrintf("dump1 %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]);
value.l = HAL_READ32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType+4);
if((value.b[0]^value.b[1])==0xFF)
RdPipe = value.b[0];
if((value.b[2]^value.b[3])==0xFF)
TapCnt = value.b[2];
//DiagPrintf("dump2 %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]);
if((valid==1)&&(RdPipe!=0xFFFFFFFF)&&(TapCnt!=0xFFFFFFFF)){
// wait DRAM settle down
HalDelayUs(10);
// load previous dram Ked data
HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO)));
SDR_DDL_FCTRL(TapCnt);
if(MemTest(3))
return _TRUE;
}
#endif
_memset((u8*)AvaWds, 0, sizeof(u32)*REC_NUM*2);
volatile struct ms_rxi310_portmap *ms_ctrl_0_map;
ms_ctrl_0_map = (struct ms_rxi310_portmap*) SDR_CTRL_BASE;
ms_ctrl_0_map = ms_ctrl_0_map;
PassFlag = PassFlag;
RdPipeCounter =0;
// DBG_8195A("%d\n",__LINE__);
for(RdPipe=MIN_RD_PIPE; RdPipe<=MAX_RD_PIPE; RdPipe++) {
// ms_ctrl_0_map->iocr = (ms_ctrl_0_map->iocr & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO);
HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO)));
DBG_SDR_INFO("IOCR: 0x%x; Write: 0x%x\n",HAL_SDR_READ32(REG_SDR_IOCR), (RdPipe << PCTL_IOCR_RD_PIPE_BFO));
// DBG_8195A("IOCR: 0x%x; Write: 0x%x\n",ms_ctrl_0_map->iocr, (RdPipe << PCTL_IOCR_RD_PIPE_BFO));
RdPipeFlag = _FALSE;
PassFlag = _FALSE;
AvaWdsCnt = 0;
for(TapCnt=0; TapCnt < (MAX_TAP_DLY+1); TapCnt++) {
// Modify clk delay
#ifdef FPGA
#ifdef FPGA_TEMP
SDR_DDL_FCTRL(TapCnt);
// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF);
// Value32 = (Value32 | (TapCnt << 16));
// WR_DATA(SDR_CLK_DLY_CTRL, Value32);
#else
HAL_SDR_WRITE32(REG_SDR_DLY0, TapCnt);
// ms_ctrl_0_map->phy_dly0 = TapCnt;
#endif
DBG_SDR_INFO("DLY: 0x%x; Write: 0x%x\n",HAL_PERI_ON_READ32(REG_PESOC_MEM_CTRL), TapCnt);
#else
SDR_DDL_FCTRL(TapCnt);
// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF);
// Value32 = (Value32 | (TapCnt << 16));
// WR_DATA(SDR_CLK_DLY_CTRL, Value32);
#endif
Pass = MemTest(10000);
PassFlag = _FALSE;
if(Pass==_TRUE) { // PASS
if (!RdPipeFlag) {
DBG_SDR_INFO("%d Time Pass\n", RdPipeCounter);
RdPipeCounter++;
RdPipeFlag = _TRUE;
RecRdPipe[RdPipeCounter - 1] = RdPipe;
}
AvaWds[RdPipeCounter-1][AvaWdsCnt] = TapCnt;
AvaWdsCnt++;
RecNum[RdPipeCounter-1] = AvaWdsCnt;
if((TapCnt+TAP_DLY)>=MAX_TAP_DLY) {
break;
}
PassFlag = _TRUE;
DBG_SDR_INFO("Verify Pass => RdPipe:%d; TapCnt: %d\n", RdPipe, TapCnt);
}
else { // FAIL
// if(PassFlag==_TRUE) {
// break;
// }
// else {
if (RdPipeCounter > 0) {
RdPipeCounter++;
if (RdPipeCounter < 3) {
RecNum[RdPipeCounter-1] = 0;
RecRdPipe[RdPipeCounter - 1] = RdPipe;
}
break;
}
// }
}
}
if (RdPipeCounter > 2) {
u8 BestRangeIndex, BestIndex;
#ifdef CONFIG_SDR_VERIFY //to reduce log
u32 i;
DBG_SDR_INFO("Avaliable RdPipe 0\n");
for (i=0;i<256;i++) {
DBG_SDR_INFO("%d\n", AvaWds[0][i]);
}
DBG_SDR_INFO("Avaliable RdPipe 1\n");
for (i=0;i<256;i++) {
DBG_SDR_INFO("%d\n", AvaWds[1][i]);
}
#endif
DBG_SDR_INFO("Rec 0 => total counter %d; RdPipe:%d;\n", RecNum[0], RecRdPipe[0]);
DBG_SDR_INFO("Rec 1 => total counter %d; RdPipe:%d;\n", RecNum[1], RecRdPipe[1]);
BestRangeIndex = (RecNum[0] > RecNum[1]) ? 0 : 1;
BestIndex = RecNum[BestRangeIndex]>>1;
DBG_SDR_INFO("The Finial RdPipe: %d; TpCnt: 0x%x\n", RecRdPipe[BestRangeIndex], AvaWds[BestRangeIndex][BestIndex]);
// set RdPipe and tap_dly
// ms_ctrl_0_map->iocr = (ms_ctrl_0_map->iocr & 0xff) | (RecRdPipe[BestRangeIndex] << PCTL_IOCR_RD_PIPE_BFO);
HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RecRdPipe[BestRangeIndex] << PCTL_IOCR_RD_PIPE_BFO)));
#ifdef FPGA
#ifdef FPGA_TEMP
SDR_DDL_FCTRL(AvaWds[BestRangeIndex][BestIndex]);
// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF);
// Value32 = Value32 | (AvaWds[BestRangeIndex][BestIndex] << 16);
// WR_DATA(SDR_CLK_DLY_CTRL, Value32);
#else
HAL_SDR_WRITE32(REG_SDR_DLY0, AvaWds[BestRangeIndex][BestIndex]);
// ms_ctrl_0_map->phy_dly0 = AvaWds[BestRangeIndex][BestIndex];
#endif
#else
SDR_DDL_FCTRL(AvaWds[BestRangeIndex][BestIndex]);
// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF);
// Value32 = Value32 | (AvaWds[BestRangeIndex][BestIndex] << 16);
// WR_DATA(SDR_CLK_DLY_CTRL, Value32);
#endif
#ifdef SUPPORT_DRAM_KED
RdPipe = RecRdPipe[BestRangeIndex];
TapCnt = AvaWds[BestRangeIndex][BestIndex];
value.b[0] = (u8)RdPipe;
value.b[1] = ~value.b[0];
value.b[2] = (u8)TapCnt;
value.b[3] = ~value.b[2];
//DiagPrintf("dump1w %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]);
HAL_WRITE32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType+4, value.l);
SpicWaitWipDoneRefinedRtl8195A(SpicInitPara);
valid = 1;
value.b[0] = (u8)valid;
value.b[1] = ~value.b[0];
value.b[2] = 0xFF;
value.b[3] = 0xFF;
//DiagPrintf("dump1w %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]);
HAL_WRITE32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType, value.l);
SpicWaitWipDoneRefinedRtl8195A(SpicInitPara);
#endif
Result = _TRUE;
break;
}
if (RdPipeCounter == 0) {
DBG_SDR_INFO("NOT Find RdPipe\n");
}
}
return Result;
} // SdrCalibration
HAL_SDRC_TEXT_SECTION
VOID
ChangeRandSeed(
IN u32 Seed
)
{
rand_x = Seed;
}
HAL_SDRC_TEXT_SECTION
u32
Sdr_Rand2(
VOID
)
{
HAL_RAM_DATA_SECTION static unsigned int y = 362436;
HAL_RAM_DATA_SECTION static unsigned int z = 521288629;
HAL_RAM_DATA_SECTION static unsigned int c = 7654321;
unsigned long long t, a= 698769069;
rand_x = 69069 * rand_x + 12345;
y ^= (y << 13); y ^= (y >> 17); y ^= (y << 5);
t = a * z + c; c = (t >> 32); z = t;
return rand_x + y + z;
}
HAL_SDRC_TEXT_SECTION
s32
MemTest(
u32 LoopCnt
)
{
u32 LoopIndex = 0;
u32 Value32, Addr;
for (LoopIndex = 0; LoopIndex<LoopCnt; LoopIndex++) {
Value32 = Sdr_Rand2();
Addr = Sdr_Rand2();
Addr &= 0x1FFFFF;
Addr &= (~0x3);
HAL_SDRAM_WRITE32(Addr, Value32);
if (HAL_SDRAM_READ32(Addr) != Value32) {
DBG_8195A("Test %d: No match addr 0x%x => 0x%x != 0x%x\n",LoopIndex,
Addr, Value32, HAL_SDRAM_READ32(Addr));
return _FALSE;
}
else {
// HAL_SDRAM_WRITE32(Addr, 0);
}
}
return _TRUE;
} // MemTest
#endif // end of "#ifdef CONFIG_SDR_EN"

File diff suppressed because it is too large Load diff

377
lib/fwlib/src/hal_ssi.c Normal file
View file

@ -0,0 +1,377 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "hal_ssi.h"
const HAL_GDMA_CHNL Ssi2_TX_GDMA_Chnl_Option[] = {
{0,4,GDMA0_CHANNEL4_IRQ,0},
{0,5,GDMA0_CHANNEL5_IRQ,0},
{0,3,GDMA0_CHANNEL3_IRQ,0},
{0,0,GDMA0_CHANNEL0_IRQ,0},
{0,1,GDMA0_CHANNEL1_IRQ,0},
{0,2,GDMA0_CHANNEL2_IRQ,0},
{0xff,0,0,0} // end
};
const HAL_GDMA_CHNL Ssi2_RX_GDMA_Chnl_Option[] = {
{1,4,GDMA1_CHANNEL4_IRQ,0},
{1,5,GDMA1_CHANNEL5_IRQ,0},
{1,3,GDMA1_CHANNEL3_IRQ,0},
{1,0,GDMA1_CHANNEL0_IRQ,0},
{1,1,GDMA1_CHANNEL1_IRQ,0},
{1,2,GDMA1_CHANNEL2_IRQ,0},
{0xff,0,0,0} // end
};
//TODO: Load default Setting: It should be loaded from external setting file.
const DW_SSI_DEFAULT_SETTING SpiDefaultSetting =
{
.RxCompCallback = NULL,
.RxCompCbPara = NULL,
.RxData = NULL,
.TxCompCallback = NULL,
.TxCompCbPara = NULL,
.TxData = NULL,
.DmaRxDataLevel = 7, // RX FIFO stored bytes > (DMARDLR(7) + 1) then trigger DMA transfer
.DmaTxDataLevel = 48, // TX FIFO free space > (FIFO_SPACE(64)-DMATDLR(48)) then trigger DMA transfer
.InterruptPriority = 0x20,
.RxLength = 0,
.RxLengthRemainder = 0,
.RxThresholdLevel = 7, // if number of entries in th RX FIFO >= (RxThresholdLevel+1), RX interrupt asserted
.TxLength = 0,
.TxThresholdLevel = 8, // if number of entries in th TX FIFO <= TxThresholdLevel, TX interrupt asserted
.SlaveSelectEnable = 0,
.ClockDivider = SSI_CLK_SPI0_2/1000000, // SCLK=1M
.DataFrameNumber = 0,
.ControlFrameSize = CFS_1_BIT,
.DataFrameFormat = FRF_MOTOROLA_SPI,
.DataFrameSize = DFS_8_BITS,
.DmaControl = 0, // default DMA is disable
.InterruptMask = 0x0,
.MicrowireDirection = MW_DIRECTION_MASTER_TO_SLAVE,
.MicrowireHandshaking = MW_HANDSHAKE_DISABLE,
.MicrowireTransferMode = MW_TMOD_NONSEQUENTIAL,
.SclkPhase = SCPH_TOGGLES_AT_START,
.SclkPolarity = SCPOL_INACTIVE_IS_HIGH,
.SlaveOutputEnable = SLV_TXD_ENABLE, // Slave
.TransferMode = TMOD_TR,
.TransferMechanism = SSI_DTM_INTERRUPT
};
extern HAL_Status HalSsiInitRtl8195a_Patch(VOID *Adaptor);
extern HAL_Status HalSsiPinmuxEnableRtl8195a_Patch(VOID *Adaptor);
extern HAL_Status HalSsiPinmuxDisableRtl8195a(VOID *Adaptor);
extern HAL_Status HalSsiDeInitRtl8195a(VOID * Adapter);
extern HAL_Status HalSsiClockOffRtl8195a(VOID * Adapter);
extern HAL_Status HalSsiClockOnRtl8195a(VOID * Adapter);
extern HAL_Status HalSsiIntReadRtl8195a(VOID *Adapter, VOID *RxData, u32 Length);
extern HAL_Status HalSsiIntWriteRtl8195a(VOID *Adapter, u8 *pTxData, u32 Length);
extern VOID HalSsiSetSclkRtl8195a(VOID *Adapter, u32 ClkRate);
#ifdef CONFIG_GDMA_EN
extern VOID HalSsiDmaInitRtl8195a(VOID *Adapter);
#endif
VOID HalSsiOpInit(VOID *Adaptor)
{
PHAL_SSI_OP pHalSsiOp = (PHAL_SSI_OP) Adaptor;
// pHalSsiOp->HalSsiPinmuxEnable = HalSsiPinmuxEnableRtl8195a;
pHalSsiOp->HalSsiPinmuxEnable = HalSsiPinmuxEnableRtl8195a_Patch;
pHalSsiOp->HalSsiPinmuxDisable = HalSsiPinmuxDisableRtl8195a;
pHalSsiOp->HalSsiEnable = HalSsiEnableRtl8195a;
pHalSsiOp->HalSsiDisable = HalSsiDisableRtl8195a;
// pHalSsiOp->HalSsiInit = HalSsiInitRtl8195a;
pHalSsiOp->HalSsiInit = HalSsiInitRtl8195a_Patch;
pHalSsiOp->HalSsiSetSclkPolarity = HalSsiSetSclkPolarityRtl8195a;
pHalSsiOp->HalSsiSetSclkPhase = HalSsiSetSclkPhaseRtl8195a;
pHalSsiOp->HalSsiWrite = HalSsiWriteRtl8195a;
pHalSsiOp->HalSsiRead = HalSsiReadRtl8195a;
pHalSsiOp->HalSsiGetRxFifoLevel = HalSsiGetRxFifoLevelRtl8195a;
pHalSsiOp->HalSsiGetTxFifoLevel = HalSsiGetTxFifoLevelRtl8195a;
pHalSsiOp->HalSsiGetStatus = HalSsiGetStatusRtl8195a;
pHalSsiOp->HalSsiGetInterruptStatus = HalSsiGetInterruptStatusRtl8195a;
pHalSsiOp->HalSsiLoadSetting = HalSsiLoadSettingRtl8195a;
pHalSsiOp->HalSsiSetInterruptMask = HalSsiSetInterruptMaskRtl8195a;
pHalSsiOp->HalSsiGetInterruptMask = HalSsiGetInterruptMaskRtl8195a;
pHalSsiOp->HalSsiSetDeviceRole = HalSsiSetDeviceRoleRtl8195a;
pHalSsiOp->HalSsiWriteable = HalSsiWriteableRtl8195a;
pHalSsiOp->HalSsiReadable = HalSsiReadableRtl8195a;
pHalSsiOp->HalSsiBusy = HalSsiBusyRtl8195a;
pHalSsiOp->HalSsiInterruptEnable = HalSsiInterruptEnableRtl8195a;
pHalSsiOp->HalSsiInterruptDisable = HalSsiInterruptDisableRtl8195a;
// pHalSsiOp->HalSsiReadInterrupt = HalSsiReadInterruptRtl8195a;
pHalSsiOp->HalSsiReadInterrupt = HalSsiIntReadRtl8195a;
pHalSsiOp->HalSsiSetRxFifoThresholdLevel = HalSsiSetRxFifoThresholdLevelRtl8195a;
pHalSsiOp->HalSsiSetTxFifoThresholdLevel = HalSsiSetTxFifoThresholdLevelRtl8195a;
// pHalSsiOp->HalSsiWriteInterrupt = HalSsiWriteInterruptRtl8195a;
pHalSsiOp->HalSsiWriteInterrupt = HalSsiIntWriteRtl8195a;
pHalSsiOp->HalSsiGetRawInterruptStatus = HalSsiGetRawInterruptStatusRtl8195a;
pHalSsiOp->HalSsiGetSlaveEnableRegister = HalSsiGetSlaveEnableRegisterRtl8195a;
pHalSsiOp->HalSsiSetSlaveEnableRegister = HalSsiSetSlaveEnableRegisterRtl8195a;
}
#ifdef CONFIG_GDMA_EN
HAL_Status
HalSsiTxGdmaInit(
IN PHAL_SSI_OP pHalSsiOp,
IN PHAL_SSI_ADAPTOR pHalSsiAdapter
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PSSI_DMA_CONFIG pDmaConfig;
HAL_GDMA_CHNL *pgdma_chnl;
PHAL_GDMA_OP pHalGdmaOp;
if ((NULL == pHalSsiOp) || (NULL == pHalSsiAdapter)) {
return HAL_ERR_PARA;
}
pDmaConfig = &pHalSsiAdapter->DmaConfig;
// Load default setting
HalSsiTxGdmaLoadDefRtl8195a((void*)pHalSsiAdapter);
// Start to patch the default setting
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter;
if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) {
// The default GDMA Channel is not available, try others
if (pHalSsiAdapter->Index == 2) {
// SSI2 TX Only can use GDMA 0
pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Ssi2_TX_GDMA_Chnl_Option);
}
else {
pgdma_chnl = HalGdmaChnlAlloc(NULL);
}
if (pgdma_chnl == NULL) {
// No Available DMA channel
return HAL_BUSY;
}
else {
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pDmaConfig->TxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum;
}
}
DBG_SSI_INFO("HalSsiTxGdmaInit: GdmaIndex=%d ChNum=%d \r\n", pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum);
pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp;
pHalGdmaOp->HalGdmaOnOff((VOID*)(pHalGdmaAdapter));
pHalGdmaOp->HalGdmaChIsrEnAndDis((VOID*)(pHalGdmaAdapter));
HalSsiDmaInit(pHalSsiAdapter);
InterruptRegister(&pDmaConfig->TxGdmaIrqHandle);
InterruptEn(&pDmaConfig->TxGdmaIrqHandle);
return HAL_OK;
}
VOID
HalSsiTxGdmaDeInit(
IN PHAL_SSI_ADAPTOR pHalSsiAdapter
)
{
PSSI_DMA_CONFIG pDmaConfig;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL GdmaChnl;
if (NULL == pHalSsiAdapter) {
return;
}
pDmaConfig = &pHalSsiAdapter->DmaConfig;
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter;
GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex;
GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum;
GdmaChnl.IrqNum = pDmaConfig->TxGdmaIrqHandle.IrqNum;
HalGdmaChnlFree(&GdmaChnl);
}
HAL_Status
HalSsiRxGdmaInit(
IN PHAL_SSI_OP pHalSsiOp,
IN PHAL_SSI_ADAPTOR pHalSsiAdapter
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
PSSI_DMA_CONFIG pDmaConfig;
HAL_GDMA_CHNL *pgdma_chnl;
PHAL_GDMA_OP pHalGdmaOp;
if ((NULL == pHalSsiOp) || (NULL == pHalSsiAdapter)) {
return HAL_ERR_PARA;
}
pDmaConfig = &pHalSsiAdapter->DmaConfig;
// Load default setting
HalSsiRxGdmaLoadDefRtl8195a((void*)pHalSsiAdapter);
// Start to patch the default setting
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter;
if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) {
// The default GDMA Channel is not available, try others
if (pHalSsiAdapter->Index == 2) {
// SSI2 RX Only can use GDMA 1
pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Ssi2_RX_GDMA_Chnl_Option);
}
else {
pgdma_chnl = HalGdmaChnlAlloc(NULL);
}
if (pgdma_chnl == NULL) {
// No Available DMA channel
return HAL_BUSY;
}
else {
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pDmaConfig->RxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum;
}
}
DBG_SSI_INFO("HalSsiRxGdmaInit: GdmaIndex=%d ChNum=%d \r\n", pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum);
pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp;
pHalGdmaOp->HalGdmaOnOff((VOID*)(pHalGdmaAdapter));
pHalGdmaOp->HalGdmaChIsrEnAndDis((VOID*)(pHalGdmaAdapter));
HalSsiDmaInit(pHalSsiAdapter);
InterruptRegister(&pDmaConfig->RxGdmaIrqHandle);
InterruptEn(&pDmaConfig->RxGdmaIrqHandle);
return HAL_OK;
}
VOID
HalSsiRxGdmaDeInit(
IN PHAL_SSI_ADAPTOR pHalSsiAdapter
)
{
PSSI_DMA_CONFIG pDmaConfig;
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL GdmaChnl;
if (NULL == pHalSsiAdapter) {
return;
}
pDmaConfig = &pHalSsiAdapter->DmaConfig;
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter;
GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex;
GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum;
GdmaChnl.IrqNum = pDmaConfig->RxGdmaIrqHandle.IrqNum;
HalGdmaChnlFree(&GdmaChnl);
}
#endif // end of "#ifdef CONFIG_GDMA_EN"
HAL_Status
HalSsiInit(VOID *Data)
{
HAL_Status ret;
PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE SsiPwrState;
#endif
ret = HalSsiInitRtl8195a_Patch(pHalSsiAdapter);
#ifdef CONFIG_SOC_PS_MODULE
if(ret == HAL_OK) {
// To register a new peripheral device power state
SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index;
SsiPwrState.PwrState = ACT;
RegPowerState(SsiPwrState);
}
#endif
return ret;
}
HAL_Status
HalSsiDeInit(VOID *Data)
{
HAL_Status ret;
PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE SsiPwrState;
u8 HardwareState;
SsiPwrState.FuncIdx= SPI0+ pHalSsiAdapter->Index;
QueryRegPwrState(SsiPwrState.FuncIdx, &(SsiPwrState.PwrState), &HardwareState);
if(SsiPwrState.PwrState != HardwareState){
DBG_SSI_ERR("Registered State is not the Hardware State");
return HAL_ERR_UNKNOWN;
}
else{
if((SsiPwrState.PwrState != INACT) && (SsiPwrState.PwrState !=ACT)){
DBG_SSI_INFO("Return to ACT state before DeInit");
HalSsiEnable(pHalSsiAdapter);
QueryRegPwrState(SsiPwrState.FuncIdx, &(SsiPwrState.PwrState), &HardwareState);
}
if(SsiPwrState.PwrState == ACT){
SsiPwrState.PwrState = INACT;
RegPowerState(SsiPwrState);
}
}
#endif
ret = HalSsiDeInitRtl8195a(pHalSsiAdapter);
return ret;
}
HAL_Status
HalSsiEnable(VOID *Data)
{
HAL_Status ret;
PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE SsiPwrState;
#endif
ret = HalSsiClockOnRtl8195a(pHalSsiAdapter);
#ifdef CONFIG_SOC_PS_MODULE
if(ret == HAL_OK) {
// To register a new peripheral device power state
SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index;
SsiPwrState.PwrState = ACT;
RegPowerState(SsiPwrState);
}
#endif
return ret;
}
HAL_Status
HalSsiDisable(VOID *Data)
{
HAL_Status ret;
PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE SsiPwrState;
#endif
ret = HalSsiClockOffRtl8195a(pHalSsiAdapter);
#ifdef CONFIG_SOC_PS_MODULE
if(ret == HAL_OK) {
// To register a new peripheral device power state
SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index;
SsiPwrState.PwrState = SLPCG;
RegPowerState(SsiPwrState);
}
#endif
return ret;
}

32
lib/fwlib/src/hal_timer.c Normal file
View file

@ -0,0 +1,32 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
VOID
HalTimerOpInit_Patch(
IN VOID *Data
)
{
PHAL_TIMER_OP pHalTimerOp = (PHAL_TIMER_OP) Data;
pHalTimerOp->HalGetTimerId = HalGetTimerIdRtl8195a;
pHalTimerOp->HalTimerInit = (BOOL (*)(void*))HalTimerInitRtl8195a_Patch;
#ifdef CONFIG_CHIP_C_CUT
pHalTimerOp->HalTimerReadCount = HalTimerReadCountRtl8195aV02;
#else
pHalTimerOp->HalTimerReadCount = HalTimerReadCountRtl8195a_Patch;
#endif
pHalTimerOp->HalTimerIrqClear = HalTimerIrqClearRtl8195a;
pHalTimerOp->HalTimerDis = HalTimerDisRtl8195a_Patch;
pHalTimerOp->HalTimerEn = HalTimerEnRtl8195a_Patch;
pHalTimerOp->HalTimerDumpReg = HalTimerDumpRegRtl8195a;
}

871
lib/fwlib/src/hal_uart.c Normal file
View file

@ -0,0 +1,871 @@
/*
* Routines to access hardware
*
* Copyright (c) 2013 Realtek Semiconductor Corp.
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*/
#include "rtl8195a.h"
#include "rtl8195a_uart.h"
#include "hal_uart.h"
#include "hal_gdma.h"
#ifndef CONFIG_CHIP_E_CUT
// Pre-Defined Supported Baud Rate Table for CPU 166 MHz
const u32 DEF_BAUDRATE_TABLE[] = {
110, 300, 600, 1200,
2400, 4800, 9600, 14400,
19200, 28800, 38400, 57600,
76800, 115200, 128000, 153600,
230400, 380400, 460800, 500000,
921600, 1000000, 1382400, 1444400,
1500000, 1843200, 2000000, 2100000,
2764800, 3000000, 3250000, 3692300,
3750000, 4000000, 6000000,
56000, 256000,
// For UART to IR Carrier
66000, 72000, 73400, 76000,
80000, 112000,
// End of the table
0xffffffff
};
const u16 ovsr_adj_table_10bit[10] = {
0x000, 0x020, 0x044, 0x124, 0x294, 0x2AA, 0x16B, 0x2DB, 0x3BB, 0x3EF
};
const u16 ovsr_adj_table_9bit[9] = {
0x000, 0x010, 0x044, 0x92, 0xAA, 0x155, 0x1B6, 0x1BB, 0x1EF
};
const u16 ovsr_adj_table_8bit[8] = {
0x000, 0x010, 0x044, 0x92, 0xAA, 0xB5, 0xBB, 0xEF
};
#if 0 // Old format
#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT)
const u8 DEF_OVSR_166[] = {
10, 10, 12, 14,
10, 10, 10, 11,
14, 11, 14, 11,
14, 10, 11, 14,
18, 17, 17, 18,
17, 13, 19, 18,
10, 11, 13, 19,
14, 13, 12, 11,
10, 10, 13,
20, 18,
// For UART to IR Carrier
13, 13, 18, 15,
20, 12,
};
const u16 DEF_DIV_166[] = {
74272, 27233, 11347, 4863,
3404, 1702, 851, 516,
304, 258, 152, 129,
76, 71, 58, 38,
19, 12, 10, 9,
5, 6, 3, 3,
5, 4, 3, 2,
2, 2, 2, 2,
2, 2, 1,
73, 17,
// For UART to IR Carrier
97, 89, 63, 73,
52, 62,
};
const u16 DEF_OVSR_ADJ_166[] = {
0x000, 0x000, 0x000, 0x000,
0x000, 0x000, 0x000, 0x000,
0x000, 0x000, 0x000, 0x000,
0x000, 0x000, 0x000, 0x000,
0x2AA, 0x3BB, 0x1B6, 0x010,
0x1B6, 0x2AA, 0x1B6, 0x2DB,
0x3BB, 0x000, 0x2AA, 0x294,
0x2DB, 0x2AA, 0x2AA, 0x000 ,
0x3BB, 0x088, 0x2AA,
0x000, 0x2DB,
// For UART to IR Carrier
0x000, 0x000, 0x000, 0x000,
0x000, 0x000
};
#endif //#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT)
#ifdef CONFIG_CHIP_C_CUT
const u8 DEF_OVSR_166[] = {
13, 12, 12, 12,
18, 10, 10, 11,
10, 11, 10, 20,
20, 20, 20, 20,
20, 18, 20, 12,
15, 16, 20, 19,
18, 15, 10, 13,
15, 13, 12, 11,
11, 10, 13,
16, 18,
// For UART to IR Carrier
13, 13, 18, 15,
20, 12,
};
const u16 DEF_DIV_166[] = {
58275, 23148, 11574, 5787,
1929, 1736, 868, 526,
434, 263, 217, 72,
54, 36, 32, 27,
18, 12, 9, 13,
6, 5, 3, 3,
3, 3, 4, 3,
2, 2, 2, 2,
2, 2, 1,
93, 18,
// For UART to IR Carrier
97, 89, 63, 73,
52, 62,
};
const u16 DEF_OVSR_ADJ_166[] = {
0x000, 0x000, 0x000, 0x000,
0x000, 0x000, 0x000, 0x000,
0x000, 0x000, 0x000, 0x010,
0x010, 0x010, 0x124, 0x010,
0x010, 0x088, 0x010, 0x2DB,
0x000, 0x16B, 0x010, 0x088,
0x2AA, 0x000, 0x294, 0x088,
0x000, 0x3BB, 0x3BB, 0x088,
0x010, 0x294, 0x3BB,
0x000, 0x010,
// For UART to IR Carrier
0x000, 0x000, 0x000, 0x000,
0x000, 0x000
};
#endif // #ifdef CONFIG_CHIP_C_CUT
#endif // end of #if 0 // Old format
#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT)
const u8 DEF_OVSR_B_CUT[] = {
20, 20, 20, 20,
20, 20, 15, 18,
13, 15, 18, 13,
18, 12, 11, 10,
16, 15, 16, 18,
11, 20, 19, 14,
18, 11, 20, 19,
14, 13, 12, 11,
21, 20, 13,
18, 11,
// For UART to IR Carrier
13, 13, 18, 15,
20, 12
};
const u16 DEF_DIV_B_CUT[] = {
37202, 13616, 6808, 3404,
1702, 851, 567, 315,
327, 189, 118, 109,
59, 59, 58, 53,
22, 14, 11, 9,
8, 4, 3, 4,
3, 4, 2, 2,
2, 2, 2, 2,
1, 1, 1,
81, 29,
// For UART to IR Carrier
97, 89, 63, 73,
52, 62
};
const u8 DEF_OVSR_ADJ_BITS_B_CUT_10B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
1, 3, 1, 2,
1, 4, 7, 1,
2, 1, 4, 5,
8, 6, 6, 1,
8, 4, 6,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
const u8 DEF_OVSR_ADJ_BITS_B_CUT_9B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
1, 3, 1, 1,
1, 4, 6, 1,
1, 1, 4, 4,
7, 6, 5, 1,
7, 4, 6,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
const u8 DEF_OVSR_ADJ_BITS_B_CUT_8B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
1, 3, 1, 1,
1, 4, 6, 1,
1, 1, 4, 4,
6, 5, 5, 1,
6, 4, 5,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
#endif // #if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT)
const u8 DEF_OVSR_C_CUT[] = {
20, 20, 20, 20,
20, 20, 20, 14,
20, 12, 14, 19,
19, 19, 13, 20,
19, 18, 20, 15,
18, 20, 20, 19,
11, 15, 20, 13,
15, 13, 12, 11,
11, 20, 13,
16, 13,
// For UART to IR Carrier
13, 13, 18, 15,
20, 12
};
const u16 DEF_DIV_C_CUT[] = {
37878, 13888, 6944, 3472,
1736, 868, 434, 413,
217, 241, 155, 76,
57, 38, 50, 27,
19, 12, 9, 11,
5, 4, 3, 3,
5, 3, 2, 3,
2, 2, 2, 2,
2, 1, 1,
93, 25,
// For UART to IR Carrier
97, 89, 63, 73,
52, 62
};
const u8 DEF_OVSR_ADJ_BITS_C_CUT_10B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1,
0, 3, 1, 2,
1, 8, 1, 2,
1, 1, 8, 2,
1, 9, 8, 3,
1, 8, 9,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
const u8 DEF_OVSR_ADJ_BITS_C_CUT_9B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1,
0, 2, 1, 1,
1, 8, 1, 2,
1, 1, 8, 2,
1, 8, 8, 3,
1, 8, 8,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
const u8 DEF_OVSR_ADJ_BITS_C_CUT_8B[] = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1,
0, 2, 1, 1,
1, 7, 1, 2,
1, 1, 7, 2,
1, 7, 7, 2,
1, 7, 7,
0, 0,
// For UART to IR Carrier
0, 0, 0, 0,
0, 0
};
#endif // #if !(CONFIG_CHIP_E_CUT)
extern u32 _UartIrqHandle(VOID *Data);
extern HAL_Status
HalRuartInitRtl8195a_Patch(
IN VOID *Data ///< RUART Adapter
);
#if (CONFIG_CHIP_C_CUT)
extern _LONG_CALL_ HAL_Status
HalRuartInitRtl8195aV02(
IN VOID *Data ///< RUART Adapter
);
#endif
extern u8 HalRuartGetChipVerRtl8195a(VOID);
const HAL_GDMA_CHNL Uart2_TX_GDMA_Chnl_Option[] = {
{0,0,GDMA0_CHANNEL0_IRQ,0},
{0,1,GDMA0_CHANNEL1_IRQ,0},
{0,2,GDMA0_CHANNEL2_IRQ,0},
{0,3,GDMA0_CHANNEL3_IRQ,0},
{0,4,GDMA0_CHANNEL4_IRQ,0},
{0,5,GDMA0_CHANNEL5_IRQ,0},
{0xff,0,0,0} // end
};
const HAL_GDMA_CHNL Uart2_RX_GDMA_Chnl_Option[] = {
{1,0,GDMA1_CHANNEL0_IRQ,0},
{1,1,GDMA1_CHANNEL1_IRQ,0},
{1,2,GDMA1_CHANNEL2_IRQ,0},
{1,3,GDMA1_CHANNEL3_IRQ,0},
{1,4,GDMA1_CHANNEL4_IRQ,0},
{1,5,GDMA1_CHANNEL5_IRQ,0},
{0xff,0,0,0} // end
};
VOID
HalRuartOpInit(
IN VOID *Data
)
{
PHAL_RUART_OP pHalRuartOp = (PHAL_RUART_OP) Data;
pHalRuartOp->HalRuartAdapterLoadDef = HalRuartAdapterLoadDefRtl8195a;
pHalRuartOp->HalRuartTxGdmaLoadDef = HalRuartTxGdmaLoadDefRtl8195a;
pHalRuartOp->HalRuartRxGdmaLoadDef = HalRuartRxGdmaLoadDefRtl8195a;
pHalRuartOp->HalRuartResetRxFifo = HalRuartResetRxFifoRtl8195a;
#if CONFIG_CHIP_E_CUT
pHalRuartOp->HalRuartInit = HalRuartInitRtl8195a_V04;
#else
pHalRuartOp->HalRuartInit = HalRuartInitRtl8195a_Patch; // Hardware Init ROM code patch
#endif
pHalRuartOp->HalRuartDeInit = HalRuartDeInitRtl8195a; // Hardware Init
pHalRuartOp->HalRuartPutC = HalRuartPutCRtl8195a; // Send a byte
pHalRuartOp->HalRuartSend = HalRuartSendRtl8195a; // Polling mode Tx
pHalRuartOp->HalRuartIntSend = HalRuartIntSendRtl8195a; // Interrupt mode Tx
#if CONFIG_CHIP_E_CUT
pHalRuartOp->HalRuartDmaSend = HalRuartDmaSendRtl8195a_V04; // DMA mode Tx
pHalRuartOp->HalRuartStopSend = HalRuartStopSendRtl8195a_V04; // Stop non-blocking TX
#else
pHalRuartOp->HalRuartDmaSend = HalRuartDmaSendRtl8195a_Patch; // DMA mode Tx
pHalRuartOp->HalRuartStopSend = HalRuartStopSendRtl8195a_Patch; // Stop non-blocking TX
#endif
pHalRuartOp->HalRuartGetC = HalRuartGetCRtl8195a; // get a byte
pHalRuartOp->HalRuartRecv = HalRuartRecvRtl8195a; // Polling mode Rx
pHalRuartOp->HalRuartIntRecv = HalRuartIntRecvRtl8195a; // Interrupt mode Rx
pHalRuartOp->HalRuartDmaRecv = HalRuartDmaRecvRtl8195a; // DMA mode Rx
#if CONFIG_CHIP_E_CUT
pHalRuartOp->HalRuartStopRecv = HalRuartStopRecvRtl8195a_V04; // Stop non-blocking Rx
#else
pHalRuartOp->HalRuartStopRecv = HalRuartStopRecvRtl8195a_Patch; // Stop non-blocking Rx
#endif
pHalRuartOp->HalRuartGetIMR = HalRuartGetIMRRtl8195a;
pHalRuartOp->HalRuartSetIMR = HalRuartSetIMRRtl8195a;
pHalRuartOp->HalRuartGetDebugValue = HalRuartGetDebugValueRtl8195a;
pHalRuartOp->HalRuartDmaInit = HalRuartDmaInitRtl8195a;
pHalRuartOp->HalRuartRTSCtrl = HalRuartRTSCtrlRtl8195a;
pHalRuartOp->HalRuartRegIrq = HalRuartRegIrqRtl8195a;
pHalRuartOp->HalRuartIntEnable = HalRuartIntEnableRtl8195a;
pHalRuartOp->HalRuartIntDisable = HalRuartIntDisableRtl8195a;
}
/**
* Load UART HAL default setting
*
* Call this function to load the default setting for UART HAL adapter
*
*
*/
VOID
HalRuartAdapterInit(
PRUART_ADAPTER pRuartAdapter,
u8 UartIdx
)
{
PHAL_RUART_OP pHalRuartOp;
PHAL_RUART_ADAPTER pHalRuartAdapter;
if (NULL == pRuartAdapter) {
return;
}
pHalRuartOp = pRuartAdapter->pHalRuartOp;
pHalRuartAdapter = pRuartAdapter->pHalRuartAdapter;
if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) {
return;
}
// Load default setting
if (pHalRuartOp->HalRuartAdapterLoadDef != NULL) {
pHalRuartOp->HalRuartAdapterLoadDef (pHalRuartAdapter, UartIdx);
pHalRuartAdapter->IrqHandle.Priority = 6;
}
else {
// Initial your UART HAL adapter here
}
// Start to modify the defualt setting
pHalRuartAdapter->PinmuxSelect = RUART0_MUX_TO_GPIOC;
pHalRuartAdapter->BaudRate = 38400;
// pHalRuartAdapter->IrqHandle.IrqFun = (IRQ_FUN)_UartIrqHandle;
// pHalRuartAdapter->IrqHandle.Data = (void *)pHalRuartAdapter;
// Register IRQ
InterruptRegister(&pHalRuartAdapter->IrqHandle);
}
/**
* Load UART HAL GDMA default setting
*
* Call this function to load the default setting for UART GDMA
*
*
*/
HAL_Status
HalRuartTxGdmaInit(
PHAL_RUART_OP pHalRuartOp,
PHAL_RUART_ADAPTER pHalRuartAdapter,
PUART_DMA_CONFIG pUartGdmaConfig
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL *pgdma_chnl;
if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter) || (NULL == pUartGdmaConfig)) {
return HAL_ERR_PARA;
}
// Load default setting
if (pHalRuartOp->HalRuartTxGdmaLoadDef != NULL) {
pHalRuartOp->HalRuartTxGdmaLoadDef (pHalRuartAdapter, pUartGdmaConfig);
pUartGdmaConfig->TxGdmaIrqHandle.Priority = 6;
}
else {
// Initial your GDMA setting here
}
// Start to patch the default setting
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter;
if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) {
// The default GDMA Channel is not available, try others
if (pHalRuartAdapter->UartIndex == 2) {
// UART2 TX Only can use GDMA 0
pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Uart2_TX_GDMA_Chnl_Option);
}
else {
pgdma_chnl = HalGdmaChnlAlloc(NULL);
}
if (pgdma_chnl == NULL) {
// No Available DMA channel
return HAL_BUSY;
}
else {
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pUartGdmaConfig->TxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum;
}
}
// User can assign a Interrupt Handler here
// pUartGdmaConfig->TxGdmaIrqHandle.Data = pHalRuartAdapter;
// pUartGdmaConfig->TxGdmaIrqHandle.IrqFun = (IRQ_FUN)_UartTxDmaIrqHandle
// pUartGdmaConfig->TxGdmaIrqHandle.Priority = 0x20;
pHalRuartOp->HalRuartDmaInit (pHalRuartAdapter);
InterruptRegister(&pUartGdmaConfig->TxGdmaIrqHandle);
InterruptEn(&pUartGdmaConfig->TxGdmaIrqHandle);
return HAL_OK;
}
VOID
HalRuartTxGdmaDeInit(
PUART_DMA_CONFIG pUartGdmaConfig
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL GdmaChnl;
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter;
GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex;
GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum;
GdmaChnl.IrqNum = pUartGdmaConfig->TxGdmaIrqHandle.IrqNum;
HalGdmaChnlFree(&GdmaChnl);
}
/**
* Load UART HAL GDMA default setting
*
* Call this function to load the default setting for UART GDMA
*
*
*/
HAL_Status
HalRuartRxGdmaInit(
PHAL_RUART_OP pHalRuartOp,
PHAL_RUART_ADAPTER pHalRuartAdapter,
PUART_DMA_CONFIG pUartGdmaConfig
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL *pgdma_chnl;
if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter) || (NULL == pUartGdmaConfig)) {
return HAL_ERR_PARA;
}
// Load default setting
if (pHalRuartOp->HalRuartRxGdmaLoadDef != NULL) {
pHalRuartOp->HalRuartRxGdmaLoadDef (pHalRuartAdapter, pUartGdmaConfig);
pUartGdmaConfig->RxGdmaIrqHandle.Priority = 6;
}
else {
// Initial your GDMA setting here
}
// Start to patch the default setting
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter;
if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) {
// The default GDMA Channel is not available, try others
if (pHalRuartAdapter->UartIndex == 2) {
// UART2 RX Only can use GDMA 1
pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Uart2_RX_GDMA_Chnl_Option);
}
else {
pgdma_chnl = HalGdmaChnlAlloc(NULL);
}
if (pgdma_chnl == NULL) {
// No Available DMA channel
return HAL_BUSY;
}
else {
pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx;
pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl;
pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl;
pUartGdmaConfig->RxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum;
}
}
// pUartGdmaConfig->RxGdmaIrqHandle.Data = pHalRuartAdapter;
// pUartGdmaConfig->RxGdmaIrqHandle.IrqFun = (IRQ_FUN)_UartTxDmaIrqHandle;
// pUartGdmaConfig->RxGdmaIrqHandle.Priority = 0x20;
pHalRuartOp->HalRuartDmaInit (pHalRuartAdapter);
InterruptRegister(&pUartGdmaConfig->RxGdmaIrqHandle);
InterruptEn(&pUartGdmaConfig->RxGdmaIrqHandle);
return HAL_OK;
}
VOID
HalRuartRxGdmaDeInit(
PUART_DMA_CONFIG pUartGdmaConfig
)
{
PHAL_GDMA_ADAPTER pHalGdmaAdapter;
HAL_GDMA_CHNL GdmaChnl;
pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter;
GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex;
GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum;
GdmaChnl.IrqNum = pUartGdmaConfig->RxGdmaIrqHandle.IrqNum;
HalGdmaChnlFree(&GdmaChnl);
}
/**
* Hook a RX indication callback
*
* To hook a callback function which will be called when a got a RX byte
*
*
*/
VOID
HalRuartRxIndHook(
PRUART_ADAPTER pRuartAdapter,
VOID *pCallback,
VOID *pPara
)
{
PHAL_RUART_ADAPTER pHalRuartAdapter = pRuartAdapter->pHalRuartAdapter;
pHalRuartAdapter->RxDRCallback = (void (*)(void*))pCallback;
pHalRuartAdapter->RxDRCbPara = pPara;
// enable RX data ready interrupt
pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI;
pRuartAdapter->pHalRuartOp->HalRuartSetIMR(pHalRuartAdapter);
}
HAL_Status
HalRuartResetTxFifo(
IN VOID *Data
)
{
return (HalRuartResetTxFifoRtl8195a(Data));
}
HAL_Status
HalRuartSetBaudRate(
IN VOID *Data
)
{
#if CONFIG_CHIP_E_CUT
return HalRuartSetBaudRateRtl8195a_V04(Data);
#else
return HalRuartSetBaudRateRtl8195a(Data);
#endif
}
HAL_Status
HalRuartInit(
IN VOID *Data
)
{
HAL_Status ret;
PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE UartPwrState;
#endif
#if CONFIG_CHIP_E_CUT
pHalRuartAdapter->pDefaultBaudRateTbl = (uint32_t*)BAUDRATE_166_ROM_V04;
pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)OVSR_166_ROM_V04;
pHalRuartAdapter->pDefaultOvsrAdjTbl = (uint16_t*)OVSR_ADJ_166_ROM_V04;
pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DIV_166_ROM_V04;
ret = HalRuartInitRtl8195a_V04(Data);
#else
pHalRuartAdapter->pDefaultBaudRateTbl = (uint32_t*)DEF_BAUDRATE_TABLE;
#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT)
u8 chip_ver;
chip_ver = HalRuartGetChipVerRtl8195a();
if (chip_ver < 2) {
pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)DEF_OVSR_B_CUT;
pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DEF_DIV_B_CUT;
pHalRuartAdapter->pDefOvsrAdjBitTbl_10 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_10B;
pHalRuartAdapter->pDefOvsrAdjBitTbl_9 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_9B;
pHalRuartAdapter->pDefOvsrAdjBitTbl_8 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_8B;
}
else
#endif
{
pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)DEF_OVSR_C_CUT;
pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DEF_DIV_C_CUT;
pHalRuartAdapter->pDefOvsrAdjBitTbl_10 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_10B;
pHalRuartAdapter->pDefOvsrAdjBitTbl_9 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_9B;
pHalRuartAdapter->pDefOvsrAdjBitTbl_8 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_8B;
}
pHalRuartAdapter->pDefOvsrAdjTbl_10 = (uint16_t*)ovsr_adj_table_10bit;
pHalRuartAdapter->pDefOvsrAdjTbl_9 = (uint16_t*)ovsr_adj_table_9bit;
pHalRuartAdapter->pDefOvsrAdjTbl_8 = (uint16_t*)ovsr_adj_table_8bit;
ret = HalRuartInitRtl8195a_Patch(Data);
#endif
#ifdef CONFIG_SOC_PS_MODULE
if(ret == HAL_OK) {
// To register a new peripheral device power state
UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex;
UartPwrState.PwrState = ACT;
RegPowerState(UartPwrState);
}
#endif
return ret;
}
VOID
HalRuartDeInit(
IN VOID *Data
)
{
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE UartPwrState;
PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data;
u8 HwState;
UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex;
QueryRegPwrState(UartPwrState.FuncIdx, &(UartPwrState.PwrState), &HwState);
// if the power state isn't ACT, then switch the power state back to ACT first
if ((UartPwrState.PwrState != ACT) && (UartPwrState.PwrState != INACT)) {
HalRuartEnable(Data);
QueryRegPwrState(UartPwrState.FuncIdx, &(UartPwrState.PwrState), &HwState);
}
if (UartPwrState.PwrState == ACT) {
UartPwrState.PwrState = INACT;
RegPowerState(UartPwrState);
}
#endif
HalRuartDeInitRtl8195a(Data);
}
HAL_Status
HalRuartDisable(
IN VOID *Data
)
{
HAL_Status ret;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE UartPwrState;
PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data;
#endif
#if CONFIG_CHIP_E_CUT
ret = HalRuartDisableRtl8195a_V04(Data);
#else
ret = HalRuartDisableRtl8195a(Data);
#endif
#ifdef CONFIG_SOC_PS_MODULE
if (ret == HAL_OK) {
UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex;
UartPwrState.PwrState = SLPCG;
RegPowerState(UartPwrState);
}
#endif
return ret;
}
HAL_Status
HalRuartEnable(
IN VOID *Data
)
{
HAL_Status ret;
#ifdef CONFIG_SOC_PS_MODULE
REG_POWER_STATE UartPwrState;
PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data;
#endif
#if CONFIG_CHIP_E_CUT
ret = HalRuartEnableRtl8195a_V04(Data);
#else
ret = HalRuartEnableRtl8195a(Data);
#endif
#ifdef CONFIG_SOC_PS_MODULE
if (ret == HAL_OK) {
UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex;
UartPwrState.PwrState = ACT;
RegPowerState(UartPwrState);
}
#endif
return ret;
}
HAL_Status
HalRuartFlowCtrl(
IN VOID *Data
)
{
HAL_Status ret;
#if CONFIG_CHIP_E_CUT
ret = HalRuartFlowCtrlRtl8195a_V04((VOID *)Data);
#else
ret = HalRuartFlowCtrlRtl8195a((VOID *)Data);
#endif
return ret;
}
VOID
HalRuartEnterCritical(
IN VOID *Data
)
{
#if CONFIG_CHIP_E_CUT
HalRuartEnterCriticalRtl8195a_V04(Data);
#else
HalRuartEnterCriticalRtl8195a(Data);
#endif
}
VOID
HalRuartExitCritical(
IN VOID *Data
)
{
#if CONFIG_CHIP_E_CUT
HalRuartExitCriticalRtl8195a_V04(Data);
#else
HalRuartExitCriticalRtl8195a(Data);
#endif
}