📄 xio_dcr.c
字号:
/* $Id: xio_dcr.c,v 1.15 2005/10/06 15:51:52 meinelte Exp $ *//******************************************************************************** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND* SOLUTIONS FOR XILINX DEVICES. 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.** (c) Copyright 2002 Xilinx Inc.* All rights reserved.*******************************************************************************//*****************************************************************************//**** @file xio_dcr.c** The implementation of the XDcrIo interface. See xio_dcr.h for more* information about the component.** <pre>* MODIFICATION HISTORY:** Ver Who Date Changes* ----- ---- -------- -----------------------------------------------* 1.00a ecm 10/18/01 First release* ecm 01/29/03 Cleaned up the table and made it more readable.* The DCR_REG_512 was 17 and the table used DCR_REG_32* +15 which is actually the same as what DCR_REG_512* should have been,16. I removed the blocks using* DCR_REG_32+15 and added blocks using DCR_REG_512+14* to make the table correct when DCR_REG_512 = 16.* This is functionally exactly the same, just more* readable hence no rev bump.* ecm 09/21/05 Fixed the function calls into the table to allow* the code to be optimized. Also added the directive* to force the code into the text space for Linux to* function without causing a page fault.* </pre>** @internal** The C functions which subsequently call into either the assembly code or into* the provided table of functions are required since the registers assigned to* the calling and return from functions are strictly defined in the ABI and that* definition is used in the low-level functions directly. The use of macros is* not recommended since the temporary registers in the ABI are defined but there* is no way to force the compiler to use a specific register in a block of code.******************************************************************************//***************************** Include Files ********************************/#include "xstatus.h"#include "xbasic_types.h"#include "xio.h"#include "xio_dcr.h"/************************** Constant Definitions ****************************/#define SUB_RETURN 0x4E800020 /* equals 'blr' */#define MTDCR_FIXED 0x7C000386 /* this is the basic template*/ /* equals 'mtdcr 0, 0x00' */#define MFDCR_FIXED 0x7C000286 /* this is the basic template*/ /* equals 'mfdcr 0, 0x00' */#define GPR_SHIFT 21#define DCR_SHIFT_LH 16 /* bits 5 - 9 shift value */#define DCR_SHIFT_UH 11 /* bits 0 - 4 shift value */#define DCR_REG_32 1 /* register 32 and above */#define DCR_REG_512 16 /* register 512 and above *//* defines for the mfdcr and mfdcr structures */#define GPR_SOURCE_REG 4<<GPR_SHIFT#define GPR_DEST_REG 3<<GPR_SHIFT/**************************** Type Definitions ******************************/typedef Xuint32 (*XIo_DcrOpCode)(Xuint32 Register, Xuint32 Data);typedef struct DcrFunctionTableEntryTag{ Xuint32 OpCode; Xuint32 Return;} DcrFunctionTableEntry;#if defined __GNUC__#if defined XPAR_XIO_DCR_TEXT_SPACEstatic DcrFunctionTableEntry __attribute__((section(".text")))MtDcrTable[MAX_DCR_REGISTERS] =#elsestatic DcrFunctionTableEntry MtDcrTable[MAX_DCR_REGISTERS] =#endif#elsestatic DcrFunctionTableEntry MtDcrTable[MAX_DCR_REGISTERS] =#endif{ {MTDCR_FIXED | GPR_SOURCE_REG | (0)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (1)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (2)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (3)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (4)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (5)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (6)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (7)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (8)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (9)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (10)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (11)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (12)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (13)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (14)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (15)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (16)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (17)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (18)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (19)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (20)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (21)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (22)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (23)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (24)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (25)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (26)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (27)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (28)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (29)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (30)<<DCR_SHIFT_LH,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | (31)<<DCR_SHIFT_LH,SUB_RETURN}, /* this is where the DCR register numbering goes weird*/ /* 32 through 63 */ {MTDCR_FIXED | GPR_SOURCE_REG | ((0)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((1)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((2)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((3)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((4)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((5)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((6)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((7)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((8)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN}, {MTDCR_FIXED | GPR_SOURCE_REG | ((9)<<DCR_SHIFT_LH)|((DCR_REG_32+0)<<DCR_SHIFT_UH) ,SUB_RETURN},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -