/***************************************************************************** * 函 数 名 : BSP_IPF_GetDlAdNum * * 功能描述 : 获取下行通道ADQ0和ADQ1队列中空闲AD个数 * * 输入参数 : 无 * * 输出参数 : pu32AD0Num 下行ADQ0队列中空闲AD个数 * pu32AD1Num 下行ADQ1队列中空闲AD个数 * 返 回 值 : IPF_SUCCESS * IPF_ERROR * * 修改记录 : 2012年11月29日 z00212992 创建 * *****************************************************************************/ int BSP_IPF_GetDlAdNum(unsigned int* pu32AD0Num, unsigned int* pu32AD1Num) { unsigned int u32DlAd0Depth = 0; unsigned int u32DlAd1Depth = 0; unsigned int u32DlAd0wptr = 0; unsigned int u32DlAd0rptr = 0; unsigned int u32DlAd1wptr = 0; unsigned int u32DlAd1rptr = 0; unsigned int u32AD0Num = 0; unsigned int u32AD1Num = 0; /*入参检测*/ if((NULL == pu32AD0Num)||(NULL == pu32AD1Num)) { IPF_PRINT_ERROR("parameter is error\n"); return BSP_ERR_IPF_INVALID_PARA; } /* 计算空闲AD0数量 */ IPF_REG_READ(SOC_IPF_CH1_ADQ0_WPTR_ADDR(IPF_REGBASE_ADR), u32DlAd0wptr); IPF_REG_READ(SOC_IPF_CH1_ADQ0_RPTR_ADDR(IPF_REGBASE_ADR), u32DlAd0rptr); if (u32DlAd0wptr >= u32DlAd0rptr)/*写指针在前,正常顺序*/ u32DlAd0Depth = IPF_DLAD0_DESC_SIZE - (u32DlAd0wptr - u32DlAd0rptr+1); else u32DlAd0Depth = u32DlAd0rptr - u32DlAd0wptr - 1; u32AD0Num = (u32DlAd0Depth > IPF_OBLIGATE_AD_NUM) ? (u32DlAd0Depth - IPF_OBLIGATE_AD_NUM) : 0; if(u32AD0Num > IPF_DLAD0_DESC_SIZE) { IPF_PRINT_ERROR("adq0 num is error\n"); return BSP_ERR_IPF_INVALID_PARA; } *pu32AD0Num = u32AD0Num; /* 计算空闲AD1数量 */ IPF_REG_READ(SOC_IPF_CH1_ADQ1_WPTR_ADDR(IPF_REGBASE_ADR), u32DlAd1wptr); IPF_REG_READ(SOC_IPF_CH1_ADQ1_RPTR_ADDR(IPF_REGBASE_ADR), u32DlAd1rptr); if (u32DlAd1wptr >= u32DlAd1rptr)/*写指针在前,正常顺序*/ u32DlAd1Depth = IPF_DLAD1_DESC_SIZE - (u32DlAd1wptr - u32DlAd1rptr+1); else u32DlAd1Depth = u32DlAd1rptr - u32DlAd1wptr - 1; u32AD1Num = (u32DlAd1Depth > IPF_OBLIGATE_AD_NUM) ? (u32DlAd1Depth - IPF_OBLIGATE_AD_NUM) : 0; if(u32AD1Num > IPF_DLAD1_DESC_SIZE) { IPF_PRINT_ERROR("adq1 num is error\n"); return BSP_ERR_IPF_INVALID_PARA; } *pu32AD1Num = u32AD1Num; return IPF_SUCCESS; }
/***************************************************************************** * 函 数 名 : IPF_ObligateAdqRpt * * 功能描述 : 根据adq状态寄存器和当前adq读指针获取adq回退读指针 * * 输入参数 : eChId 通道ID * eType AD类型 * 输出参数 : pu32Rpt 保存AD读指针 * 返 回 值 : IPF_SUCCESS 成功 * IPF_ERROR(其他错误码) 失败 * * 修改记录 : 2013年9月9日 z00212992 创建 * 1.修改日期 : 2014年05月27日 * 修改作者 : z00212992 * 修改记录 : 芯片修改adq buff预读机制,软件不再需要根据adq状态寄存器来获取adq读指针 *****************************************************************************/ static int IPF_ObligateAdqRpt(IPF_CHANNEL_TYPE_E eChId, IPF_AD_TYPE_E eType, unsigned int *pu32Rpt) { unsigned int u32Index = 0; unsigned int u32RptValue = 0; IPF_ADQ_INFO_S *pIpfAdqReg = NULL; /* ADQ读指针和状态寄存器表 */ IPF_ADQ_INFO_S stIpfAdqReg[4] = {{0}}; pIpfAdqReg = &stIpfAdqReg[0]; pIpfAdqReg->pu32RptReg = (unsigned int *)(SOC_IPF_CH0_ADQ0_RPTR_ADDR(IPF_REGBASE_ADR)); pIpfAdqReg = &stIpfAdqReg[1]; pIpfAdqReg->pu32RptReg = (unsigned int *)(SOC_IPF_CH0_ADQ1_RPTR_ADDR(IPF_REGBASE_ADR)); pIpfAdqReg = &stIpfAdqReg[2]; pIpfAdqReg->pu32RptReg = (unsigned int *)(SOC_IPF_CH1_ADQ0_RPTR_ADDR(IPF_REGBASE_ADR)); pIpfAdqReg = &stIpfAdqReg[3]; pIpfAdqReg->pu32RptReg = (unsigned int *)(SOC_IPF_CH1_ADQ1_RPTR_ADDR(IPF_REGBASE_ADR)); /* 入参检查 */ if((IPF_CHANNEL_MAX <= eChId) || (IPF_AD_MAX <= eType) || (NULL == pu32Rpt)) { IPF_PRINT_ERROR("parameter is error\n"); return BSP_ERR_IPF_INVALID_PARA; } /* 根据通道ID和AD类型获取操作寄存器对象index值 */ switch (eChId) { case IPF_CHANNEL_UP: u32Index = (IPF_AD_0 == eType) ? 0 : 1; break; case IPF_CHANNEL_DOWN: u32Index = (IPF_AD_0 == eType) ? 2 : 3; break; default: IPF_PRINT_ERROR("parameter is error\n"); u32Index = 0; break; } /* 读取ADQ读指针寄存器 */ IPF_REG_READ(stIpfAdqReg[u32Index].pu32RptReg, u32RptValue); /* 保存ADQ读指针 */ *pu32Rpt = u32RptValue; return IPF_SUCCESS; }
BSP_S32 BSP_IPF_CHInfo(IPF_CHANNEL_TYPE_E eChnType) { BSP_U32 u32ChanCtrlInfo = 0; BSP_U32 u32ChanStateInfo = 0; BSP_U32 u32BdqBaseAddr = 0; BSP_U32 u32BdqDepth = 0; BSP_U32 u32BdqWptr = 0; BSP_U32 u32BdqRptr = 0; BSP_U32 u32BdqWaddr = 0; BSP_U32 u32BdqRaddr = 0; BSP_U32 u32RdqBaseAddr = 0; BSP_U32 u32RdqDepth = 0; BSP_U32 u32RdqRptr = 0; BSP_U32 u32RdqWptr = 0; BSP_U32 u32RdqWaddr = 0; BSP_U32 u32RdqRaddr = 0; BSP_U32 u32Depth = 0; BSP_U32 u32AdqCtrlInfo = 0; BSP_U32 u32Adq0BaseAddr = 0; BSP_U32 u32Adq0StateInfo = 0; BSP_U32 u32Adq0Wptr = 0; BSP_U32 u32Adq0Rptr = 0; BSP_U32 u32Adq1BaseAddr = 0; BSP_U32 u32Adq1StateInfo = 0; BSP_U32 u32Adq1Wptr = 0; BSP_U32 u32Adq1Rptr = 0; switch (eChnType) { case IPF_CHANNEL_UP: IPF_REG_READ(SOC_IPF_CH0_CTRL_ADDR(IPF_REGBASE_ADR), u32ChanCtrlInfo); IPF_REG_READ(SOC_IPF_CH0_STATE_ADDR(IPF_REGBASE_ADR), u32ChanStateInfo); IPF_REG_READ(SOC_IPF_CH0_BDQ_BADDR_ADDR(IPF_REGBASE_ADR), u32BdqBaseAddr); IPF_REG_READ(SOC_IPF_CH0_BDQ_SIZE_ADDR(IPF_REGBASE_ADR), u32BdqDepth); IPF_REG_READ(SOC_IPF_CH0_BDQ_WPTR_ADDR(IPF_REGBASE_ADR), u32BdqWptr); IPF_REG_READ(SOC_IPF_CH0_BDQ_RPTR_ADDR(IPF_REGBASE_ADR), u32BdqRptr); IPF_REG_READ(SOC_IPF_CH0_BDQ_WADDR_ADDR(IPF_REGBASE_ADR), u32BdqWaddr); IPF_REG_READ(SOC_IPF_CH0_BDQ_RADDR_ADDR(IPF_REGBASE_ADR), u32BdqRaddr); IPF_REG_READ(SOC_IPF_CH0_RDQ_BADDR_ADDR(IPF_REGBASE_ADR), u32RdqBaseAddr); IPF_REG_READ(SOC_IPF_CH0_RDQ_SIZE_ADDR(IPF_REGBASE_ADR), u32RdqDepth); IPF_REG_READ(SOC_IPF_CH0_RDQ_RPTR_ADDR(IPF_REGBASE_ADR), u32RdqRptr); IPF_REG_READ(SOC_IPF_CH0_RDQ_WPTR_ADDR(IPF_REGBASE_ADR), u32RdqWptr); IPF_REG_READ(SOC_IPF_CH0_RDQ_WADDR_ADDR(IPF_REGBASE_ADR), u32RdqWaddr); IPF_REG_READ(SOC_IPF_CH0_RDQ_RADDR_ADDR(IPF_REGBASE_ADR), u32RdqRaddr); IPF_REG_READ(SOC_IPF_CH0_DQ_DEPTH_ADDR(IPF_REGBASE_ADR), u32Depth); IPF_REG_READ(SOC_IPF_CH0_ADQ_CTRL_ADDR(IPF_REGBASE_ADR), u32AdqCtrlInfo); IPF_REG_READ(SOC_IPF_CH0_ADQ0_BASE_ADDR(IPF_REGBASE_ADR), u32Adq0BaseAddr); IPF_REG_READ(SOC_IPF_CH0_ADQ0_STAT_ADDR(IPF_REGBASE_ADR), u32Adq0StateInfo); IPF_REG_READ(SOC_IPF_CH0_ADQ0_WPTR_ADDR(IPF_REGBASE_ADR), u32Adq0Wptr); IPF_REG_READ(SOC_IPF_CH0_ADQ0_RPTR_ADDR(IPF_REGBASE_ADR), u32Adq0Rptr); IPF_REG_READ(SOC_IPF_CH0_ADQ1_BASE_ADDR(IPF_REGBASE_ADR), u32Adq1BaseAddr); IPF_REG_READ(SOC_IPF_CH0_ADQ1_STAT_ADDR(IPF_REGBASE_ADR), u32Adq1StateInfo); IPF_REG_READ(SOC_IPF_CH0_ADQ1_WPTR_ADDR(IPF_REGBASE_ADR), u32Adq1Wptr); IPF_REG_READ(SOC_IPF_CH0_ADQ1_RPTR_ADDR(IPF_REGBASE_ADR), u32Adq1Rptr); break; case IPF_CHANNEL_DOWN: IPF_REG_READ(SOC_IPF_CH1_CTRL_ADDR(IPF_REGBASE_ADR), u32ChanCtrlInfo); IPF_REG_READ(SOC_IPF_CH1_STATE_ADDR(IPF_REGBASE_ADR), u32ChanStateInfo); IPF_REG_READ(SOC_IPF_CH1_BDQ_BADDR_ADDR(IPF_REGBASE_ADR), u32BdqBaseAddr); IPF_REG_READ(SOC_IPF_CH1_BDQ_SIZE_ADDR(IPF_REGBASE_ADR), u32BdqDepth); IPF_REG_READ(SOC_IPF_CH1_BDQ_WPTR_ADDR(IPF_REGBASE_ADR), u32BdqWptr); IPF_REG_READ(SOC_IPF_CH1_BDQ_RPTR_ADDR(IPF_REGBASE_ADR), u32BdqRptr); IPF_REG_READ(SOC_IPF_CH1_BDQ_WADDR_ADDR(IPF_REGBASE_ADR), u32BdqWaddr); IPF_REG_READ(SOC_IPF_CH1_BDQ_RADDR_ADDR(IPF_REGBASE_ADR), u32BdqRaddr); IPF_REG_READ(SOC_IPF_CH1_RDQ_BADDR_ADDR(IPF_REGBASE_ADR), u32RdqBaseAddr); IPF_REG_READ(SOC_IPF_CH1_RDQ_SIZE_ADDR(IPF_REGBASE_ADR), u32RdqDepth); IPF_REG_READ(SOC_IPF_CH1_RDQ_RPTR_ADDR(IPF_REGBASE_ADR), u32RdqRptr); IPF_REG_READ(SOC_IPF_CH1_RDQ_WPTR_ADDR(IPF_REGBASE_ADR), u32RdqWptr); IPF_REG_READ(SOC_IPF_CH1_RDQ_WADDR_ADDR(IPF_REGBASE_ADR), u32RdqWaddr); IPF_REG_READ(SOC_IPF_CH1_RDQ_RADDR_ADDR(IPF_REGBASE_ADR), u32RdqRaddr); IPF_REG_READ(SOC_IPF_CH1_DQ_DEPTH_ADDR(IPF_REGBASE_ADR), u32Depth); IPF_REG_READ(SOC_IPF_CH1_ADQ_CTRL_ADDR(IPF_REGBASE_ADR), u32AdqCtrlInfo); IPF_REG_READ(SOC_IPF_CH1_ADQ0_BASE_ADDR(IPF_REGBASE_ADR), u32Adq0BaseAddr); IPF_REG_READ(SOC_IPF_CH1_ADQ0_STAT_ADDR(IPF_REGBASE_ADR), u32Adq0StateInfo); IPF_REG_READ(SOC_IPF_CH1_ADQ0_WPTR_ADDR(IPF_REGBASE_ADR), u32Adq0Wptr); IPF_REG_READ(SOC_IPF_CH1_ADQ0_RPTR_ADDR(IPF_REGBASE_ADR), u32Adq0Rptr); IPF_REG_READ(SOC_IPF_CH1_ADQ1_BASE_ADDR(IPF_REGBASE_ADR), u32Adq1BaseAddr); IPF_REG_READ(SOC_IPF_CH1_ADQ1_STAT_ADDR(IPF_REGBASE_ADR), u32Adq1StateInfo); IPF_REG_READ(SOC_IPF_CH1_ADQ1_WPTR_ADDR(IPF_REGBASE_ADR), u32Adq1Wptr); IPF_REG_READ(SOC_IPF_CH1_ADQ1_RPTR_ADDR(IPF_REGBASE_ADR), u32Adq1Rptr); break; default: IPF_PRINT("invalidable channel type \n"); break; } IPF_PRINT("============BEGIN===========\n"); IPF_PRINT("通道控制寄存器: 0x%x\n", u32ChanCtrlInfo); IPF_PRINT("通道状态寄存器: 0x%x\n", u32ChanStateInfo); IPF_PRINT("BD 基地址: 0x%x\n", u32BdqBaseAddr); IPF_PRINT("BD 深度: 0x%x\n", u32BdqDepth); IPF_PRINT("BD 写指针: 0x%x\n", u32BdqWptr); IPF_PRINT("BD 读指针: 0x%x\n", u32BdqRptr); IPF_PRINT("BD 写地址: 0x%x\n", u32BdqWaddr); IPF_PRINT("BD 读地址: 0x%x\n", u32BdqRaddr); IPF_PRINT("RD 基地址: 0x%x\n", u32RdqBaseAddr); IPF_PRINT("RD 深度: 0x%x\n", u32RdqDepth); IPF_PRINT("RD 读指针: 0x%x\n", u32RdqRptr); IPF_PRINT("RD 写指针: 0x%x\n", u32RdqWptr); IPF_PRINT("RD 读地址: 0x%x\n", u32RdqRaddr); IPF_PRINT("RD 写地址: 0x%x\n", u32RdqWaddr); IPF_PRINT("通道深度寄存器: 0x%x\n", u32Depth); IPF_PRINT("ADQ控制寄存器: 0x%x\n", u32AdqCtrlInfo); IPF_PRINT("ADQ0 基地址: 0x%x\n", u32Adq0BaseAddr); IPF_PRINT("ADQ0 状态寄存器: 0x%x\n", u32Adq0StateInfo); IPF_PRINT("ADQ0 写指针: 0x%x\n", u32Adq0Wptr); IPF_PRINT("ADQ0 读指针: 0x%x\n", u32Adq0Rptr); IPF_PRINT("ADQ1 基地址: 0x%x\n", u32Adq1BaseAddr); IPF_PRINT("ADQ1 状态寄存器: 0x%x\n", u32Adq1StateInfo); IPF_PRINT("ADQ1 写指针: 0x%x\n", u32Adq1Wptr); IPF_PRINT("ADQ1 读指针: 0x%x\n", u32Adq1Rptr); IPF_PRINT("=============END============\n"); return 0; }