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

📄 freemaster_tsa.h

📁 freescale最新的16位单片机
💻 H
字号:
/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2004-2005 Freescale Semiconductor, Inc.
* (c) Copyright 2001-2004 Motorola, Inc.
* ALL RIGHTS RESERVED.
*
****************************************************************************//*!
*
* @file   freemaster_tsa.h
*
* @brief  FreeMaster Driver TSA feature
*
* @version 1.0.3.0
* 
* @date Jul-25-2006
* 
*******************************************************************************/

#ifndef __FREEMASTER_TSA_H
#define __FREEMASTER_TSA_H

#include "freemaster_cfg.h"

/*****************************************************************************
 Target-side Address translation structures and macros
******************************************************************************/

/// current TSA version 
#define FMSTR_TSA_VERSION 2     

// TSA flags carried in TSA_ENTRY.info (except the first entry in table)
#define FMSTR_TSA_INFO_ENTRYTYPE_MASK 0x0003    ///< flags reserved for TSA_ENTRY use
#define FMSTR_TSA_INFO_STRUCT         0x0000    ///< ENTRYTYPE: structure parent type
#define FMSTR_TSA_INFO_RO_VAR         0x0001    ///< ENTRYTYPE: read-only variable
#define FMSTR_TSA_INFO_MEMBER         0x0002    ///< ENTRYTYPE: structure member
#define FMSTR_TSA_INFO_RW_VAR         0x0003    ///< ENTRYTYPE: read-write variable
#define FMSTR_TSA_INFO_VAR_FLAG       0x0001    ///< ENTRYTYPE: FLAG: any variable
#define FMSTR_TSA_INFO_RWV_FLAG       0x0002    ///< 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 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 */

⌨️ 快捷键说明

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