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

📄 xcache_l.c

📁 基于Xilinx-XUPV2P开发平台的嵌入式系统实验例程:实验4编写基本的应用程序
💻 C
字号:
/*-----------------------------------------------------------------------------//     $Date: 2004/12/29 18:12:50 $//     $RCSfile: xcache_l.c,v $//-----------------------------------------------------------------------------//// Copyright (c) 2004 Xilinx, Inc.  All rights reserved. // // Xilinx, Inc. // XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A // COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS // ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR // STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION // IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE // FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. // XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO // THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO // ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE // FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY // AND FITNESS FOR A PARTICULAR PURPOSE.////---------------------------------------------------------------------------*/#include "xcache_l.h"#include "xpseudo_asm.h"#define DCWR_VAL        0x0#define SGR_VAL         0x0/* #define SU0R_VAL        0x0 *//* #define SLER_VAL        0x0 */#define CCR0_VAL        0x700a00#define DCACHE_SIZE     (16*1024)/****************************************************************************** Write to the Core-Configuration Register (CCR0)** @param    Value to be written to CCR0.  The bit fields are defined *           in xreg405.h** @return   None.** @note     ** None.*****************************************************************************//* special registers */void XCache_WriteCCR0(unsigned int val){  sync;  isync;  mtspr(XREG_SPR_CCR0, val);  sync;  isync;}/****************************************************************************** Enable the data cache. ** @param    Memory regions to be marked as cachable.  Each bit in the regions*           variable stands for 128MB of memory.*           regions    --> cached address range*           ------------|--------------------------------------------------*           0x80000000  | [0, 0x7FFFFFF]*           0x00000001  | [0xF8000000, 0xFFFFFFFF]*           0x80000001  | [0, 0x7FFFFFF],[0xF8000000, 0xFFFFFFFF]*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_EnableDCache(unsigned int regions){  XCache_DisableDCache();  /* after this point cache is disabled and invalidated */    mtspr(XREG_SPR_SGR,  SGR_VAL);  /* mtspr(XREG_SPR_SLER, SLER_VAL); */  /* mtspr(XREG_SPR_SU0R, SU0R_VAL); */  mtspr(XREG_SPR_DCWR, DCWR_VAL);   mtspr(XREG_SPR_DCCR, regions);  isync;}/****************************************************************************** Disable the data cache. ** @param    None*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_DisableDCache(void){  register unsigned int address0;  register unsigned int ccr0;  register unsigned int tag;  register unsigned int i;  unsigned int dccr;    dccr = mfspr(XREG_SPR_DCCR);  if (dccr != 0)  { /* dcache is enabled; read tags and flush valid and dirty lines */    ccr0 = mfspr(XREG_SPR_CCR0);                /* read CCR0 */    ccr0 = (ccr0 & 0xfffffffe) | 0x10;  /* read tags from A way */    i = 0;    while (i < 2)    {      mtspr(XREG_SPR_CCR0, ccr0);      address0 = 0x0;      while (address0 < (DCACHE_SIZE / 2))      {        tag = dcread(address0);        if ((tag & 0x30) == 0x30)       /* valid and dirty? */          dcbf((tag & 0xfffff000) | address0);        address0 += 32;      }      ccr0 |= 1;                        /* read tags from B way */      i++;    }    sync;    mtspr(XREG_SPR_DCCR, 0);    isync;  }  else  {  /* dcache is not enabled; invalidate all lines */    address0 = 0;    while (address0 < (DCACHE_SIZE/2))    {      dccci(address0);      address0 += 32;    }  }}/****************************************************************************** Flush a data cache line. If the byte specified by the address (adr) * is cached by the data cache, the cacheline containing that byte is * invalidated.  If the cacheline is modified (dirty), the entire * contents of the cacheline are written to system memory before the * line is invalidated.** @param    Address to be flushed*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_FlushDCacheLine(unsigned int adr){  dcbf(adr);  sync;  isync;}/****************************************************************************** Invalidate a data cache line. If the byte specified by the address (adr) * is cached by the data cache, the cacheline containing that byte is * invalidated.  If the cacheline is modified (dirty), the modified contents  * are lost and are NOT written to system memory before the line is * invalidated.** @param    Address to be flushed*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_InvalidateDCacheLine(unsigned int adr){  dcbi(adr);  sync;  isync;}/****************************************************************************** Store a data cache line. If the byte specified by the address (adr) * is cached by the data cache and the cacheline is modified (dirty), * the entire contents of the cacheline are written to system memory.  * After the store completes, the cacheline is marked as unmodified * (not dirty).** @param    Address to be stored*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_StoreDCacheLine(unsigned int adr){  dcbst(adr);  sync;  isync;}/****************************************************************************** Enable the instruction cache. ** @param    Memory regions to be marked as cachable.  Each bit in the regions*           variable stands for 128MB of memory.*           regions    --> cached address range*           ------------|--------------------------------------------------*           0x80000000  | [0, 0x7FFFFFF]*           0x00000001  | [0xF8000000, 0xFFFFFFFF]*           0x80000001  | [0, 0x7FFFFFF],[0xF8000000, 0xFFFFFFFF]*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_EnableICache(unsigned int regions){  XCache_DisableICache();    mtspr(XREG_SPR_SGR, SGR_VAL);  /* mtspr(XREG_SPR_SLER, SLER_VAL); */  /* mtspr(XREG_SPR_SU0R, SU0R_VAL); */  iccci;  mtspr(XREG_SPR_ICCR, regions);  isync;}/****************************************************************************** Disable the instruction cache. ** @param    None*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_DisableICache(void){  iccci;  mtspr(XREG_SPR_ICCR, 0);  isync;}/****************************************************************************** Invalidate the entire instruction cache. ** @param    None*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_InvalidateICache(void){  iccci;  isync;}/****************************************************************************** Invalidate an instruction cache line.  If the instruction specified by the* parameter adr is cached by the instruction cache, the cacheline containing* that instruction is invalidated.** @param    None*    * @return   None.** @note     ** Processor must be in real mode.*****************************************************************************/void XCache_InvalidateICacheLine(unsigned int adr){  icbi(adr);  isync;}

⌨️ 快捷键说明

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