⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_cache.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/*********************************************************************************
*     Copyright (C),2004-2005,  Fuzhou Rockchip Co.,Ltd.
*         All Rights Reserved
*          V1.00
* FileName :  cache.c
* Author :  lzy
* Description:
* History  :
*   <author>  <time>    <version>    <desc>
*    lzy        07/7/29        1.0     ORG
$Log: hw_cache.c,v $
Revision 1.5  2008/06/19 04:43:29  Administrator
代码整理!

Revision 1.4  2008/05/28 12:39:20  HSL
增加CACHE性能打印接口.

Revision 1.3  2008/05/20 07:43:47  HSL
修改 CACHE SRAM 的 BUG.

Revision 1.2  2008/05/15 07:56:15  HXY
去掉LDK/Porsche宏

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

Revision 1.1.1.1  2008/03/06 13:29:04  Lingzhaojun
no message


Revision 1.7  2007/11/17 06:10:52  Linzhengyuan
修改cache_poweroninit,避免jtag 死机

Revision 1.6  2007/10/23 08:21:13  Huangxinyu
调试后修改bug

Revision 1.5  2007/10/16 04:18:03  Huangxinyu
修改cache的bug

Revision 1.4  2007/10/15 09:03:06  Huangxinyu
根据RK27提交修改driver

Revision 1.3  2007/10/08 02:38:39  Lingzhaojun
添加版本自动注释脚本


*********************************************************************************/
#include "hw_include.h"
#include "hw_cache.h"


#define pCacheReg ((pCache_Reg_t)ARM7CacheCtrl_BASE)

/**************************************************************************
* 函数名称: Cache_FlushWay
* 函数描述:  清除一组cache
* 入口参数: Cache_way_t :  way0 cache or way1 cache
* 出口参数: 无
* 返回值:      无
* 注释:
***************************************************************************/
void Cache_FlushWay(Cache_way_t cacheway)
{
    UINT32 i;

    WriteReg32(&pCacheReg->CacheOp, (cacheway << 31) | CACHEOP_FLUSHWAY);

    for (i = 100; i = 0; i--)
    {
        if (ReadReg32(&pCacheReg->CacheOp)& ~CACHEOP_ADDR_MASK)
            delay_nops(20);
        else
            break;

    }
}

/**************************************************************************
* 函数名称: Cache_SetUnCacheMem
* 函数描述: 设置不cache的内存
* 入口参数: 四个不cache的内存地址
* 出口参数: 无
* 返回值:      无
* 注释:            the frist parameter must no equal to NULL, it must to to uncachable memory
***************************************************************************/
static void Cache_SetUnCacheMem(UINT32 address0, UINT32 address1, UINT32 address2, UINT32 address3)
{
    UINT32 UnCacheaddr;

    UnCacheaddr = address0 & CACHEOP_UNCACHE_MASK;
    WriteReg32(&pCacheReg->MemMapA, UnCacheaddr | CACHEOP_UNCACHE_32M);

    if (address1)
    {
        UnCacheaddr = address1 & CACHEOP_UNCACHE_MASK;
        WriteReg32(&pCacheReg->MemMapB, UnCacheaddr | CACHEOP_UNCACHE_32M);
    }
    else
        WriteReg32(&pCacheReg->MemMapB, 0x00);

    if (address2)
    {
        UnCacheaddr = address2 & CACHEOP_UNCACHE_MASK;
        WriteReg32(&pCacheReg->MemMapC, UnCacheaddr | CACHEOP_UNCACHE_32M);
    }
    else
        WriteReg32(&pCacheReg->MemMapC, 0x00);

    if (address3)
    {
        UnCacheaddr = address3 & CACHEOP_UNCACHE_MASK;
        WriteReg32(&pCacheReg->MemMapD, UnCacheaddr | CACHEOP_UNCACHE_32M);
    }
    else
        WriteReg32(&pCacheReg->MemMapD, 0x00);
}

/**************************************************************************
* 函数名称: Cache_Enable
* 函数描述: 打开cache
* 入口参数: 无
* 出口参数: 无
* 返回值:       无
* 注释:
***************************************************************************/
static void Cache_Enable(void)
{
    SetRegBits32(&pCacheReg->DevId, CACHE_EN);
}

/**************************************************************************
* 函数名称: Cache_PowerOnInit
* 函数描述: 开机时cache 初始化
* 入口参数: 无
* 出口参数: 无
* 返回值:       无
* 注释:         目前设定四个不cache 的地址为
                        外设地址:       0x18000000
                        DSP_DMEM    :         0x30000000
                       ARM7CacheCtrl_BASE:
                       AHB_SRAM:
***************************************************************************/
void Cache_PowerOnInit(void)
{
    Cache_Disable();

    //Cache_SetUnCacheMem(AHB_SRAM, BUS0IP_BASE, DSP_DMEM, ARM7CacheCtrl_BASE);
    // 080520,huangsl,改 NULL 为 BUS0IP_BASE,因为 NULL == 0 == AHB_SRAM .
    Cache_SetUnCacheMem(BUS0IP_BASE, DSP_DMEM, ARM7CacheCtrl_BASE, BUS0IP_BASE); //hj 2008.2.29 cache destroyed bug

    Cache_FlushWay(Cache_way0);
    Cache_FlushWay(Cache_way1);

// 由于sram 地址为0,需要固定在第一个参数

    Cache_Enable();
}

/**************************************************************************
* 函数名称:   Cache_Disable
* 函数描述:   关闭cache
* 入口参数:   无
* 出口参数:    无
* 返回值:         无
***************************************************************************/
void Cache_Disable(void)
{
    ClrRegBits16(&pCacheReg->DevId, CACHE_EN);
}

/**************************************************************************
* 函数名称:   Cache_FlushDataLine
* 函数描述:   根据地址清除cache 中的数据
* 入口参数:   address : 变量地址
                            numofbyte:  变量长度,byte 单位
* 出口参数:    无
* 返回值:         无
***************************************************************************/
void Cache_FlushDataLine(UINT32 address, UINT32 numofbyte)
{
    int count;
    count = (int)(numofbyte + (address & 0x1f));
    address = address & 0xffffffe0 | CACHEOP_FLUSHLINE;  //屏蔽低位地址,与cache line 32byte 对齐

    while (count > 0)
    {
        UINT32 i;
        WriteReg32(&pCacheReg->CacheOp, address);

        for (i = 100; i = 0; i--)
        {
            if (ReadReg32(&pCacheReg->CacheOp)& ~CACHEOP_ADDR_MASK)
                delay_nops(10);
            else
                break;
        }
        count -= 32;
        address += 32;
    }
}

void Cache_MeasureStart(INT32U measureType)
{
    // PFCNTRA_CTRL:TOTAL,PFCNTRB_CTRL: HIT
    INT32U      totalRegValue;
    INT32U      hitRegValue;
    if (measureType == CACHE_MEASURE_DATA)
    {
        totalRegValue = CHACHEPF_COUNT_CACHEDATA;
        hitRegValue = CHACHEPF_COUNT_HITDATA;
    }
    else
    {
        totalRegValue = CHACHEPF_COUNT_CACHEINST;
        hitRegValue = CHACHEPF_COUNT_HITINST;
    }

    //RESET COUNT =0.
    WriteReg32(&pCacheReg->PFCNTRA, 0);
    WriteReg32(&pCacheReg->PFCNTRB, 0);

    //START COUNTER
    WriteReg32(&pCacheReg->PFCNTRA_CTRL, totalRegValue | CHACHEPF_COUNT_ENABLE);
    WriteReg32(&pCacheReg->PFCNTRB_CTRL, hitRegValue | CHACHEPF_COUNT_ENABLE);

}

void Cache_MeasureStop(INT32U *totalAccessCount , INT32U *hitCount)
{
    *totalAccessCount = ReadReg32(&pCacheReg->PFCNTRA);
    *hitCount = ReadReg32(&pCacheReg->PFCNTRB);

    //STOP COUNTER
    WriteReg32(&pCacheReg->PFCNTRA_CTRL, CHACHEPF_COUNT_DISABLE);
    WriteReg32(&pCacheReg->PFCNTRB_CTRL, CHACHEPF_COUNT_DISABLE);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -