168 lines
6.4 KiB
C
168 lines
6.4 KiB
C
/******************************************************************************
|
|
*
|
|
* Freescale Semiconductor Inc.
|
|
* (c) Copyright 2004-2006 Freescale Semiconductor, Inc.
|
|
* (c) Copyright 2001-2004 Motorola, Inc.
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
****************************************************************************//*!
|
|
*
|
|
* @file PE_freemaster_tsa.h
|
|
*
|
|
* @brief FreeMASTER Driver TSA feature
|
|
*
|
|
* @version 1.0.6.0
|
|
*
|
|
* @date Apr-11-2007
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#ifndef __FREEMASTER_TSA_H
|
|
#define __FREEMASTER_TSA_H
|
|
|
|
#include "PE_freemaster_cfg.h"
|
|
|
|
/*****************************************************************************
|
|
Target-side Address translation structures and macros
|
|
******************************************************************************/
|
|
|
|
/* current TSA version */
|
|
#define FMSTR_TSA_VERSION 2U
|
|
|
|
/* TSA flags carried in TSA_ENTRY.info (except the first entry in table) */
|
|
#define FMSTR_TSA_INFO_ENTRYTYPE_MASK 0x0003U /* flags reserved for TSA_ENTRY use */
|
|
#define FMSTR_TSA_INFO_STRUCT 0x0000U /* ENTRYTYPE: structure parent type */
|
|
#define FMSTR_TSA_INFO_RO_VAR 0x0001U /* ENTRYTYPE: read-only variable */
|
|
#define FMSTR_TSA_INFO_MEMBER 0x0002U /* ENTRYTYPE: structure member */
|
|
#define FMSTR_TSA_INFO_RW_VAR 0x0003U /* ENTRYTYPE: read-write variable */
|
|
#define FMSTR_TSA_INFO_VAR_FLAG 0x0001U /* ENTRYTYPE: FLAG: any variable */
|
|
#define FMSTR_TSA_INFO_RWV_FLAG 0x0002U /* ENTRYTYPE: FLAG: R/W access */
|
|
|
|
/* TSA table index and size (both unsigned, at least 16 bit wide) */
|
|
typedef FMSTR_SIZE FMSTR_TSA_TINDEX;
|
|
typedef FMSTR_SIZE FMSTR_TSA_TSIZE;
|
|
|
|
/* pointer types used in TSA tables can be overridden in PE_freemaster.h */
|
|
/* (this is why macros are used instead of typedefs) */
|
|
#ifndef FMSTR_TSATBL_STRPTR
|
|
#define FMSTR_TSATBL_STRPTR const char*
|
|
#endif
|
|
#ifndef FMSTR_TSATBL_STRPTR_CAST
|
|
#define FMSTR_TSATBL_STRPTR_CAST(x) ((FMSTR_TSATBL_STRPTR)(x))
|
|
#endif
|
|
#ifndef FMSTR_TSATBL_VOIDPTR
|
|
#define FMSTR_TSATBL_VOIDPTR const void*
|
|
#endif
|
|
#ifndef FMSTR_TSATBL_VOIDPTR_CAST
|
|
#define FMSTR_TSATBL_VOIDPTR_CAST(x) ((FMSTR_TSATBL_VOIDPTR)(x))
|
|
#endif
|
|
|
|
/* TSA table entry. The unions inside assures variables sized enough to */
|
|
/* accomodate both the C-pointer and the user-requested size (FMSTR_ADDR) */
|
|
typedef struct
|
|
{
|
|
union { FMSTR_TSATBL_STRPTR p; FMSTR_ADDR n; } name;
|
|
union { FMSTR_TSATBL_STRPTR p; FMSTR_ADDR n; } type;
|
|
union { FMSTR_TSATBL_VOIDPTR p; FMSTR_ADDR n; } addr;
|
|
union { FMSTR_TSATBL_VOIDPTR p; FMSTR_ADDR n; } info;
|
|
} FMSTR_TSA_ENTRY;
|
|
|
|
/* TSA table allocation modifier */
|
|
#ifndef FMSTR_USE_TSA_INROM
|
|
#define FMSTR_USE_TSA_INROM 0
|
|
#endif
|
|
#if FMSTR_USE_TSA_INROM
|
|
#define FMSTR_TSA_CDECL const
|
|
#else
|
|
#define FMSTR_TSA_CDECL
|
|
#endif
|
|
|
|
/*//////////////////////////////////////////////// */
|
|
/* single table-building macros */
|
|
|
|
#define FMSTR_TSA_FUNC(id) FMSTR_TsaGetTable_##id
|
|
#define FMSTR_TSA_FUNC_PROTO(id) const FMSTR_TSA_ENTRY* FMSTR_TSA_FUNC(id) (FMSTR_TSA_TSIZE* pTableSize)
|
|
|
|
#define FMSTR_TSA_TABLE_BEGIN(id) \
|
|
FMSTR_TSA_FUNC_PROTO(id); \
|
|
FMSTR_TSA_FUNC_PROTO(id) { \
|
|
static FMSTR_TSA_CDECL FMSTR_TSA_ENTRY fmstr_tsatable[] = {
|
|
|
|
/* entry info */
|
|
#define FMSTR_TSA_INFO1(elem, flags) FMSTR_TSATBL_VOIDPTR_CAST(((sizeof(elem))<<2)|(flags))
|
|
#define FMSTR_TSA_INFO2(size, flags) FMSTR_TSATBL_VOIDPTR_CAST(((size)<<2)|(flags))
|
|
|
|
#define FMSTR_TSA_STRUCT(name) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(NULL), FMSTR_TSATBL_VOIDPTR_CAST(NULL), FMSTR_TSA_INFO1(name, FMSTR_TSA_INFO_STRUCT) },
|
|
|
|
#define FMSTR_TSA_MEMBER(parenttype,name,type) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(type), FMSTR_TSATBL_VOIDPTR_CAST(&((parenttype*)0)->name), FMSTR_TSA_INFO1(((parenttype*)0)->name, FMSTR_TSA_INFO_MEMBER) },
|
|
|
|
#define FMSTR_TSA_RO_VAR(name,type) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(type), FMSTR_TSATBL_VOIDPTR_CAST(&(name)), FMSTR_TSA_INFO1(name, FMSTR_TSA_INFO_RO_VAR) },
|
|
|
|
#define FMSTR_TSA_RW_VAR(name,type) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(type), FMSTR_TSATBL_VOIDPTR_CAST(&(name)), FMSTR_TSA_INFO1(name, FMSTR_TSA_INFO_RW_VAR) },
|
|
|
|
#define FMSTR_TSA_RO_MEM(name,type,addr,size) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(type), FMSTR_TSATBL_VOIDPTR_CAST(addr), FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_RO_VAR) },
|
|
|
|
#define FMSTR_TSA_RW_MEM(name,type,addr,size) \
|
|
{ FMSTR_TSATBL_STRPTR_CAST(#name), FMSTR_TSATBL_STRPTR_CAST(type), FMSTR_TSATBL_VOIDPTR_CAST(addr), FMSTR_TSA_INFO2(size, FMSTR_TSA_INFO_RW_VAR) },
|
|
|
|
#define FMSTR_TSA_TABLE_END() }; \
|
|
if(pTableSize) *pTableSize = sizeof(fmstr_tsatable); \
|
|
return fmstr_tsatable; }
|
|
|
|
/*///////////////////////////////////////////////////////////////////// */
|
|
/* TSA "Base Types", all are implemented as a one-char strings */
|
|
/* retrieved by PC and parsed according to the binary scheme */
|
|
/* "111STTZZ" where TT=type[int,frac,fp,x] S=signed ZZ=size[1,2,4,8] */
|
|
|
|
#define FMSTR_TSA_UINT8 "\xE0"
|
|
#define FMSTR_TSA_UINT16 "\xE1"
|
|
#define FMSTR_TSA_UINT32 "\xE2"
|
|
#define FMSTR_TSA_UINT64 "\xE3"
|
|
#define FMSTR_TSA_SINT8 "\xF0"
|
|
#define FMSTR_TSA_SINT16 "\xF1"
|
|
#define FMSTR_TSA_SINT32 "\xF2"
|
|
#define FMSTR_TSA_SINT64 "\xF3"
|
|
#define FMSTR_TSA_UFRAC16 "\xE5"
|
|
#define FMSTR_TSA_UFRAC32 "\xE6"
|
|
#define FMSTR_TSA_FRAC16 "\xF5"
|
|
#define FMSTR_TSA_FRAC32 "\xF6"
|
|
#define FMSTR_TSA_FLOAT "\xFA"
|
|
#define FMSTR_TSA_DOUBLE "\xFB"
|
|
|
|
/* macro used to describe "User Type" */
|
|
#define FMSTR_TSA_USERTYPE(type) #type
|
|
|
|
/* macro used to describe pure memory space */
|
|
#define FMSTR_TSA_MEMORY NULL
|
|
|
|
|
|
/*//////////////////////////////////////////////// */
|
|
/* master TSA table-retrival building macros */
|
|
|
|
#define FMSTR_TSA_TABLE_LIST_BEGIN() \
|
|
const FMSTR_TSA_ENTRY* FMSTR_TsaGetTable(FMSTR_TSA_TINDEX nTableIndex, FMSTR_TSA_TSIZE* pTableSize) {
|
|
|
|
#define FMSTR_TSA_TABLE(id) \
|
|
if(!nTableIndex--) { \
|
|
FMSTR_TSA_FUNC_PROTO(id); \
|
|
return FMSTR_TSA_FUNC(id)(pTableSize); \
|
|
} else
|
|
|
|
#define FMSTR_TSA_TABLE_LIST_END() \
|
|
{ return NULL; } }
|
|
|
|
/*****************************************************************************
|
|
Target-side Address translation functions
|
|
******************************************************************************/
|
|
|
|
/* master TSA table-retrival function */
|
|
const FMSTR_TSA_ENTRY* FMSTR_TsaGetTable(FMSTR_TSA_TINDEX nTableIndex, FMSTR_TSA_TSIZE* pTableSize);
|
|
|
|
#endif /* __FREEMASTER_TSA_H */
|
|
|