5e0cbb504a
Настроен датчик тока
378 lines
15 KiB
C
378 lines
15 KiB
C
/******************************************************************************
|
|
*
|
|
* Freescale Semiconductor Inc.
|
|
* (c) Copyright 2004-2006 Freescale Semiconductor, Inc.
|
|
* (c) Copyright 2001-2004 Motorola, Inc.
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
****************************************************************************//*!
|
|
*
|
|
* @file PE_freemaster_56F8xxx.h
|
|
*
|
|
* @brief FreeMASTER Driver hardware dependent stuff
|
|
*
|
|
* @version 1.0.8.0
|
|
*
|
|
* @date May-17-2007
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#ifndef __FREEMASTER_56F8xxx_H
|
|
#define __FREEMASTER_56F8xxx_H
|
|
|
|
#include "PE_freemaster.h"
|
|
/******************************************************************************
|
|
* platform-specific default configuration
|
|
******************************************************************************/
|
|
|
|
/* using 16bit addressing commands */
|
|
#ifndef FMSTR_USE_NOEX_CMDS
|
|
#define FMSTR_USE_NOEX_CMDS 1
|
|
#endif
|
|
|
|
/* using 32bit addressing commands */
|
|
#ifndef FMSTR_USE_EX_CMDS
|
|
#define FMSTR_USE_EX_CMDS 1
|
|
#endif
|
|
|
|
/* using inline access to buffer memory */
|
|
#ifndef FMSTR_USE_INLINE_BUFFER_ACCESS
|
|
#define FMSTR_USE_INLINE_BUFFER_ACCESS 0
|
|
#endif
|
|
|
|
/*****************************************************************************
|
|
* Board configuration information
|
|
******************************************************************************/
|
|
|
|
#define FMSTR_PROT_VER 3U /* protocol version 3 */
|
|
#define FMSTR_CFG_FLAGS 0U /* board info flags */
|
|
#define FMSTR_CFG_BUS_WIDTH 2U /* data bus width = 1*/
|
|
#define FMSTR_GLOB_VERSION_MAJOR 2U /* driver version */
|
|
#define FMSTR_GLOB_VERSION_MINOR 0U
|
|
#define FMSTR_IDT_STRING "56F8xxx FreeMASTER Driver"
|
|
#define FMSTR_TSA_FLAGS FMSTR_TSA_INFO_HV2BA /* HawkV2 TSA workaround */
|
|
|
|
/******************************************************************************
|
|
* platform-specific types
|
|
******************************************************************************/
|
|
|
|
typedef unsigned char FMSTR_U8; /* smallest memory entity (mostly 8bit) */
|
|
typedef unsigned short FMSTR_U16; /* 16bit value */
|
|
typedef unsigned long FMSTR_U32; /* 32bit value */
|
|
|
|
typedef signed char FMSTR_S8; /* signed 8bit value */
|
|
typedef signed short FMSTR_S16; /* signed 16bit value */
|
|
typedef signed long FMSTR_S32; /* signed 32bit value */
|
|
|
|
typedef unsigned short FMSTR_FLAGS; /* type to be union-ed with flags (at least 8 bits) */
|
|
typedef unsigned short FMSTR_SIZE8; /* size value (at least 8 bits) */
|
|
typedef signed short FMSTR_INDEX; /* general for-loop index (must be signed) */
|
|
|
|
typedef unsigned char FMSTR_BCHR; /* type of a single character in comm.buffer */
|
|
typedef unsigned char* FMSTR_BPTR; /* pointer within a communication buffer */
|
|
|
|
typedef unsigned short FMSTR_SCISR; /* data type to store SCI status register */
|
|
|
|
/******************************************************************************
|
|
* communication buffer access functions (non-inline)
|
|
******************************************************************************/
|
|
|
|
void FMSTR_CopyMemory(FMSTR_ADDR nDestAddr, FMSTR_ADDR nSrcAddr, FMSTR_SIZE8 nSize);
|
|
FMSTR_BPTR FMSTR_CopyToBuffer(FMSTR_BPTR pDestBuff, FMSTR_ADDR nSrcAddr, FMSTR_SIZE8 nSize);
|
|
FMSTR_BPTR FMSTR_CopyFromBuffer(FMSTR_ADDR nDestAddr, FMSTR_BPTR pSrcBuff, FMSTR_SIZE8 nSize);
|
|
void FMSTR_CopyFromBufferWithMask(FMSTR_ADDR nDestAddr, FMSTR_BPTR pSrcBuff, FMSTR_SIZE8 nSize);
|
|
FMSTR_BPTR FMSTR_AddressFromBuffer(FMSTR_ADDR* pAddr, FMSTR_BPTR pSrc);
|
|
FMSTR_BPTR FMSTR_AddressToBuffer(FMSTR_BPTR pDest, FMSTR_ADDR nAddr);
|
|
|
|
/* FMSTR_SetExAddr is needed only if both EX and non-EX commands are used */
|
|
#if FMSTR_USE_EX_CMDS && FMSTR_USE_NOEX_CMDS
|
|
void FMSTR_SetExAddr(FMSTR_BOOL bNextAddrIsEx);
|
|
#else
|
|
/* otherwise, we know what addresses are used, (ignore FMSTR_SetExAddr) */
|
|
#define FMSTR_SetExAddr(bNextAddrIsEx)
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
* communication buffer access functions (inlines/functions - depending on cfg)
|
|
******************************************************************************/
|
|
|
|
#if FMSTR_USE_INLINE_BUFFER_ACCESS
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueFromBuffer16(FMSTR_U16* pDest, FMSTR_BPTR pSrc)
|
|
{
|
|
return FMSTR_CopyFromBuffer((FMSTR_ADDR)(FMSTR_U8*)pDest, pSrc, 2);
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueFromBuffer32(FMSTR_U32* pDest, FMSTR_BPTR pSrc)
|
|
{
|
|
return FMSTR_CopyFromBuffer((FMSTR_ADDR)(FMSTR_U8*)pDest, pSrc, 4);
|
|
}
|
|
|
|
FMSTR_BPTR FMSTR_ValueToBuffer16(FMSTR_BPTR pDest, FMSTR_U16 src)
|
|
{
|
|
return FMSTR_CopyToBuffer(pDest, (FMSTR_ADDR)(FMSTR_U8*)&src, 2);
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueToBuffer32(FMSTR_BPTR pDest, FMSTR_U32 src)
|
|
{
|
|
return FMSTR_CopyToBuffer(pDest, (FMSTR_ADDR)(FMSTR_U8*)&src, 4);
|
|
}
|
|
|
|
#else /* FMSTR_USE_INLINE_BUFFER_ACCESS */
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueFromBuffer16(FMSTR_U16* pDest, FMSTR_BPTR pSrc)
|
|
{
|
|
return FMSTR_CopyFromBuffer((FMSTR_ADDR)(FMSTR_U8*)pDest, pSrc, 2);
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueFromBuffer32(FMSTR_U32* pDest, FMSTR_BPTR pSrc)
|
|
{
|
|
return FMSTR_CopyFromBuffer((FMSTR_ADDR)(FMSTR_U8*)pDest, pSrc, 4);
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueToBuffer16(FMSTR_BPTR pDest, FMSTR_U16 src)
|
|
{
|
|
return FMSTR_CopyToBuffer(pDest, (FMSTR_ADDR)(FMSTR_U8*)&src, 2);
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueToBuffer32(FMSTR_BPTR pDest, FMSTR_U32 src)
|
|
{
|
|
return FMSTR_CopyToBuffer(pDest, (FMSTR_ADDR)(FMSTR_U8*)&src, 4);
|
|
}
|
|
|
|
#endif /* FMSTR_USE_INLINE_BUFFER_ACCESS */
|
|
|
|
/******************************************************************************
|
|
* communication buffer access inlines
|
|
******************************************************************************/
|
|
|
|
__inline FMSTR_BPTR FMSTR_SkipInBuffer(FMSTR_BPTR pDest, FMSTR_SIZE8 nSize)
|
|
{
|
|
return pDest + nSize;
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueFromBuffer8(FMSTR_U8* pDest, register FMSTR_BPTR pSrc)
|
|
{
|
|
*pDest = *pSrc++;
|
|
return pSrc;
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ValueToBuffer8(FMSTR_BPTR pDest, FMSTR_U8 src)
|
|
{
|
|
*pDest++ = src;
|
|
return pDest;
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ConstToBuffer8(FMSTR_BPTR pDest, FMSTR_U8 src)
|
|
{
|
|
*pDest++ = src;
|
|
return pDest;
|
|
}
|
|
|
|
__inline FMSTR_BPTR FMSTR_ConstToBuffer16(FMSTR_BPTR pDest, FMSTR_U16 src)
|
|
{
|
|
return FMSTR_ConstToBuffer8(FMSTR_ConstToBuffer8(pDest, (FMSTR_U8) src), (FMSTR_U8)(src>>8));
|
|
}
|
|
|
|
/****************************************************************************************
|
|
* memory access helper macros (used in recorder trigger compare routines)
|
|
*****************************************************************************************/
|
|
|
|
#define FMSTR_GetS8(addr) ( *(FMSTR_S8*)(addr) )
|
|
|
|
#define FMSTR_GetU8(addr) ( *(FMSTR_U8*)(addr) )
|
|
|
|
#define FMSTR_GetS16(addr) ( *(FMSTR_S16*)(addr) )
|
|
|
|
#define FMSTR_GetU16(addr) ( *(FMSTR_U16*)(addr) )
|
|
|
|
#define FMSTR_GetS32(addr) ( *(FMSTR_S32*)(addr) )
|
|
|
|
#define FMSTR_GetU32(addr) ( *(FMSTR_U32*)(addr) )
|
|
|
|
/****************************************************************************************
|
|
* Other helper macros
|
|
*****************************************************************************************/
|
|
|
|
/* This macro assigns C pointer to FMSTR_ADDR-typed variable */
|
|
/* should be done in assembly not to trim far-space pointers in SDM */
|
|
|
|
#define FMSTR_ARR2ADDR FMSTR_PTR2ADDR
|
|
|
|
|
|
|
|
#define FMSTR_PTR2ADDR(tmpAddr, ptr) ( /*lint -e{923} */ tmpAddr = (FMSTR_ADDR) (FMSTR_U8*) ptr )
|
|
|
|
/****************************************************************************************
|
|
* Platform-specific configuration check
|
|
*****************************************************************************************/
|
|
|
|
/* sanity check, at least one of the modes should be enabled */
|
|
#if (!FMSTR_USE_EX_CMDS) && (!FMSTR_USE_NOEX_CMDS)
|
|
#error At least one of FMSTR_USE_EX_CMDS or FMSTR_USE_NOEX_CMDS should be set non-zero
|
|
#endif
|
|
|
|
/* JTAG / SCI selection */
|
|
#if FMSTR_USE_JTAG
|
|
/* hardwired JTAG address on all HawkV2 devices */
|
|
#ifndef FMSTR_JTAG_BASE
|
|
#define FMSTR_JTAG_BASE 0xFFFF00
|
|
#endif
|
|
|
|
#elif FMSTR_USE_SCI
|
|
/* user must select what SCI to use */
|
|
#ifndef FMSTR_SCI_BASE
|
|
#error You have to define FMSTR_SCI_BASE as a base address of SCI register space
|
|
#endif
|
|
#endif
|
|
|
|
#if FMSTR_USE_SCI && FMSTR_USE_JTAG
|
|
#error You have to enable one of JTAG or SCI interface, not both
|
|
#endif
|
|
|
|
/****************************************************************************************
|
|
* General peripheral space access macros
|
|
*****************************************************************************************/
|
|
|
|
/*
|
|
#define FMSTR_SETBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) |= bit)
|
|
#define FMSTR_CLRBIT(base, offset, bit) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) &= (FMSTR_U16)~((FMSTR_U16)(bit)))
|
|
#define FMSTR_SETREG(base, offset, value) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)) = value)
|
|
#define FMSTR_GETREG(base, offset) (*(volatile FMSTR_U16*)(((FMSTR_U32)(base))+(offset)))
|
|
#define FMSTR_SETREG32(base, offset, value) (*(volatile FMSTR_U32*)(((FMSTR_U32)(base))+(offset)) = value)
|
|
#define FMSTR_GETREG32(base, offset) (*(volatile FMSTR_U32*)(((FMSTR_U32)(base))+(offset)))
|
|
*/
|
|
/****************************************************************************************
|
|
* SCI module constants
|
|
*****************************************************************************************/
|
|
|
|
/* SCI module registers */
|
|
#define FMSTR_SCIBR_OFFSET 0U
|
|
#define FMSTR_SCICR_OFFSET 1U
|
|
#define FMSTR_SCISR_OFFSET 3U
|
|
#define FMSTR_SCIDR_OFFSET 4U
|
|
|
|
/* SCI Control Register bits */
|
|
#define FMSTR_SCICR_LOOP 0x8000U
|
|
#define FMSTR_SCICR_SWAI 0x4000U
|
|
#define FMSTR_SCICR_RSRC 0x2000U
|
|
#define FMSTR_SCICR_M 0x1000U
|
|
#define FMSTR_SCICR_WAKE 0x0800U
|
|
#define FMSTR_SCICR_POL 0x0400U
|
|
#define FMSTR_SCICR_PE 0x0200U
|
|
#define FMSTR_SCICR_PT 0x0100U
|
|
#define FMSTR_SCICR_TEIE 0x0080U
|
|
#define FMSTR_SCICR_TIIE 0x0040U
|
|
#define FMSTR_SCICR_RFIE 0x0020U
|
|
#define FMSTR_SCICR_REIE 0x0010U
|
|
#define FMSTR_SCICR_TE 0x0008U
|
|
#define FMSTR_SCICR_RE 0x0004U
|
|
#define FMSTR_SCICR_RWU 0x0002U
|
|
#define FMSTR_SCICR_SBK 0x0001U
|
|
|
|
/* SCI Status registers bits */
|
|
#define FMSTR_SCISR_TDRE 0x8000U
|
|
#define FMSTR_SCISR_TIDLE 0x4000U
|
|
#define FMSTR_SCISR_RDRF 0x2000U
|
|
#define FMSTR_SCISR_RIDLE 0x1000U
|
|
#define FMSTR_SCISR_OR 0x0800U
|
|
#define FMSTR_SCISR_NF 0x0400U
|
|
#define FMSTR_SCISR_FE 0x0200U
|
|
#define FMSTR_SCISR_PF 0x0100U
|
|
#define FMSTR_SCISR_RAF 0x0001U
|
|
|
|
/*******************************************************************************************
|
|
* SCI access macros
|
|
*****************************************************************************************/
|
|
|
|
/* transmitter enable/disable */
|
|
/*lint -emacro(923,FMSTR_SCI_TE, FMSTR_SCI_TD) : casting long to pointer */
|
|
//#define FMSTR_SCI_TE() FMSTR_SETBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TE)
|
|
//#define FMSTR_SCI_TD() FMSTR_CLRBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TE)
|
|
|
|
/* receiver enable/disable */
|
|
/*lint -emacro(923,FMSTR_SCI_RE, FMSTR_SCI_RD) : casting long to pointer */
|
|
//#define
|
|
//#define
|
|
|
|
/* Transmitter-empty interrupt enable/disable : casting long to pointer */
|
|
/*lint -emacro(923,FMSTR_SCI_ETXI, FMSTR_SCI_DTXI) */
|
|
//#define FMSTR_SCI_ETXI() FMSTR_SETBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TEIE)
|
|
//#define FMSTR_SCI_DTXI() FMSTR_CLRBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_TEIE)
|
|
|
|
/* Receiver-full interrupt enable/disable : casting long to pointer */
|
|
/*lint -emacro(923,FMSTR_SCI_ERXI, FMSTR_SCI_DRXI) */
|
|
//#define FMSTR_SCI_ERXI() FMSTR_SETBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RFIE)
|
|
//#define FMSTR_SCI_DRXI() FMSTR_CLRBIT(FMSTR_SCI_BASE, FMSTR_SCICR_OFFSET, FMSTR_SCICR_RFIE)
|
|
|
|
/* Tranmsit character */
|
|
/*lint -emacro(923,FMSTR_SCI_PUTCHAR) : casting long to pointer */
|
|
//#define FMSTR_SCI_PUTCHAR(ch) FMSTR_SETREG(FMSTR_SCI_BASE, FMSTR_SCIDR_OFFSET, ch)
|
|
|
|
/* Get received character */
|
|
/*lint -emacro(923,FMSTR_SCI_GETCHAR) : casting long to pointer */
|
|
//#define FMSTR_SCI_GETCHAR() FMSTR_GETREG(FMSTR_SCI_BASE, FMSTR_SCIDR_OFFSET)
|
|
|
|
/* read status register */
|
|
/*lint -emacro(923,FMSTR_SCI_GETSR) : casting long to pointer */
|
|
//#define FMSTR_SCI_GETSR() FMSTR_GETREG(FMSTR_SCI_BASE, FMSTR_SCISR_OFFSET)
|
|
|
|
/* read & clear status register (clears error status bits only) */
|
|
/*lint -emacro(923,FMSTR_SCI_RDCLRSR) : casting long to pointer */
|
|
//#define FMSTR_SCI_RDCLRSR() FMSTR_SETREG(FMSTR_SCI_BASE, FMSTR_SCISR_OFFSET, FMSTR_GETREG(FMSTR_SCI_BASE, FMSTR_SCISR_OFFSET))
|
|
|
|
/*******************************************************************************************
|
|
* JTAG access macros
|
|
*******************************************************************************************/
|
|
|
|
#define FMSTR_JTAG_OTXRXSR_OFFSET 0xfdU
|
|
#define FMSTR_JTAG_ORX_OFFSET 0xfeU
|
|
#define FMSTR_JTAG_OTX_OFFSET 0xfeU
|
|
#define FMSTR_JTAG_ORX1_OFFSET 0xffU
|
|
#define FMSTR_JTAG_OTX1_OFFSET 0xffU
|
|
|
|
/* OTXRXSR register */
|
|
#define FMSTR_JTAG_OTXRXSR_RDF 0x01U
|
|
#define FMSTR_JTAG_OTXRXSR_TDF 0x02U
|
|
#define FMSTR_JTAG_OTXRXSR_RIE 0x04U
|
|
#define FMSTR_JTAG_OTXRXSR_TIE 0x08U
|
|
|
|
#define _CHECK \
|
|
if(FMSTR_GETREG(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET) & FMSTR_JTAG_OTXRXSR_RIE) \
|
|
ioctl(GPIO_A, GPIO_SET_PIN, BIT_1); \
|
|
else \
|
|
ioctl(GPIO_A, GPIO_CLEAR_PIN, BIT_1)
|
|
|
|
/* enable/disable JTAG Rx-full interrupt */
|
|
/*lint -emacro(923,FMSTR_JTAG_ERXI,FMSTR_JTAG_DRXI) : casting long to pointer */
|
|
#define FMSTR_JTAG_ERXI() FMSTR_SETBIT(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET, FMSTR_JTAG_OTXRXSR_RIE)
|
|
#define FMSTR_JTAG_DRXI() FMSTR_CLRBIT(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET, FMSTR_JTAG_OTXRXSR_RIE)
|
|
|
|
/* enable/disable JTAG Tx-empty interrupt */
|
|
/*lint -emacro(923,FMSTR_JTAG_ETXI,FMSTR_JTAG_DTXI) : casting long to pointer */
|
|
#define FMSTR_JTAG_ETXI() FMSTR_SETBIT(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET, FMSTR_JTAG_OTXRXSR_TIE)
|
|
#define FMSTR_JTAG_DTXI() FMSTR_CLRBIT(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET, FMSTR_JTAG_OTXRXSR_TIE)
|
|
|
|
/* this macro verifies if the RIE bit is set (note that RIE is held low by HW until JTAG init) */
|
|
/*lint -emacro(923,FMSTR_JTAG_ERXI_CHECK,FMSTR_JTAG_ETXI_CHECK) : casting long to pointer */
|
|
#define FMSTR_JTAG_ERXI_CHECK() (FMSTR_GETREG(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET) & FMSTR_JTAG_OTXRXSR_RIE)
|
|
#define FMSTR_JTAG_ETXI_CHECK() (FMSTR_GETREG(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET) & FMSTR_JTAG_OTXRXSR_TIE)
|
|
|
|
/* get JTAG status register */
|
|
/*lint -emacro(923,FMSTR_JTAG_GETSR) : casting long to pointer */
|
|
#define FMSTR_JTAG_GETSR() FMSTR_GETREG(FMSTR_JTAG_BASE, FMSTR_JTAG_OTXRXSR_OFFSET)
|
|
|
|
/* Tranmsit JTAG word */
|
|
/*lint -emacro(923,FMSTR_JTAG_PUTDWORD) : casting long to pointer */
|
|
#define FMSTR_JTAG_PUTDWORD(ch) FMSTR_SETREG32(FMSTR_JTAG_BASE, FMSTR_JTAG_OTX_OFFSET, ch)
|
|
|
|
/* Get received word */
|
|
/*lint -emacro(923,FMSTR_JTAG_GETDWORD) : casting long to pointer */
|
|
#define FMSTR_JTAG_GETDWORD() FMSTR_GETREG32(FMSTR_JTAG_BASE, FMSTR_JTAG_ORX_OFFSET)
|
|
|
|
/* Get upper 16bit of received word */
|
|
/*lint -emacro(923,FMSTR_JTAG_GETWORD) : casting long to pointer */
|
|
#define FMSTR_JTAG_GETWORD() FMSTR_GETREG(FMSTR_JTAG_BASE, FMSTR_JTAG_ORX1_OFFSET)
|
|
|
|
#endif /* __FREEMASTER_56F8xxx_H */
|