166 lines
5.5 KiB
C
166 lines
5.5 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* Freescale Semiconductor Inc.
|
||
|
* (c) Copyright 2004-2006 Freescale Semiconductor, Inc.
|
||
|
* (c) Copyright 2001-2004 Motorola, Inc.
|
||
|
* ALL RIGHTS RESERVED.
|
||
|
*
|
||
|
****************************************************************************//*!
|
||
|
*
|
||
|
* @file PE_freemaster_sfio.c
|
||
|
*
|
||
|
* @brief FreeMASTER SFIO (Matlab/Simulink interface) encapsulation handler
|
||
|
*
|
||
|
* @version 1.0.2.0
|
||
|
*
|
||
|
* @date Aug-17-2006
|
||
|
*
|
||
|
*******************************************************************************
|
||
|
*
|
||
|
* This file contains the SFIO communication handler and enables the SFIO tool
|
||
|
* to run over FreeMASTER. For more information, see Freescale SFIO documentation.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
|
||
|
#include "PE_freemaster.h"
|
||
|
#include "PE_freemaster_private.h"
|
||
|
#include "PE_freemaster_protocol.h"
|
||
|
|
||
|
#if FMSTR_USE_SFIO
|
||
|
|
||
|
/* the sfiolib needs to be added to the project */
|
||
|
#include "sfiolib.h"
|
||
|
|
||
|
/***********************************
|
||
|
* local variables
|
||
|
***********************************/
|
||
|
|
||
|
static FMSTR_U8 pcm_nSfioRespLen;
|
||
|
|
||
|
/* recorder runtime flags */
|
||
|
static volatile union
|
||
|
{
|
||
|
FMSTR_FLAGS all;
|
||
|
|
||
|
struct
|
||
|
{
|
||
|
unsigned bEvenRun : 1; /* last command executed was the even one */
|
||
|
unsigned bLastOK : 1; /* last command executed properly */
|
||
|
} flg;
|
||
|
|
||
|
} pcm_wSfioFlags;
|
||
|
|
||
|
/**************************************************************************//*!
|
||
|
*
|
||
|
* @brief Initialization of SFIO communication layer
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
void FMSTR_InitSfio(void)
|
||
|
{
|
||
|
pcm_wSfioFlags.all = 0;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************//*!
|
||
|
*
|
||
|
* @brief Handling SFIOFRAME (even and odd) commands
|
||
|
*
|
||
|
* @param pMessageIO - original command (in) and response buffer (out)
|
||
|
*
|
||
|
* @note This function handles the SFIO (Matlab/Simulink Interface) command
|
||
|
* encapsulated into FreeMASTER protocol. It emulates the SFIO serial
|
||
|
* char-by-char communication.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
FMSTR_BPTR FMSTR_SfioFrame(FMSTR_BPTR pMessageIO)
|
||
|
{
|
||
|
FMSTR_BPTR pResponse = pMessageIO;
|
||
|
FMSTR_U8 i, nFrameLen, nByte;
|
||
|
SFIO_U16 nRet = 0;
|
||
|
|
||
|
/* get command and remember if it was even/odd */
|
||
|
pMessageIO = FMSTR_ValueFromBuffer8(&nByte, pMessageIO);
|
||
|
pcm_wSfioFlags.flg.bEvenRun = (nByte & 1) ? 0 : 1;
|
||
|
pcm_wSfioFlags.flg.bLastOK = 0;
|
||
|
|
||
|
/* get data length */
|
||
|
pMessageIO = FMSTR_ValueFromBuffer8(&nFrameLen, pMessageIO);
|
||
|
|
||
|
/* feed the SFIO engine byte-by-byte */
|
||
|
for(i=0; nRet == 0 && i<nFrameLen; i++)
|
||
|
{
|
||
|
pMessageIO = FMSTR_ValueFromBuffer8(&nByte, pMessageIO);
|
||
|
nRet = SFIO_ProcessRecievedChar(nByte);
|
||
|
}
|
||
|
|
||
|
/* frame not handled or handled prematurely */
|
||
|
if(!nRet || i < nFrameLen)
|
||
|
return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_SFIOERR);
|
||
|
|
||
|
/* how much data to return? */
|
||
|
if(nRet > FMSTR_COMM_BUFFER_SIZE)
|
||
|
return FMSTR_ConstToBuffer8(pResponse, FMSTR_STC_RSPBUFFOVF);
|
||
|
|
||
|
/* remember this command had executed properly */
|
||
|
pcm_nSfioRespLen = (FMSTR_U8) nRet;
|
||
|
pcm_wSfioFlags.flg.bLastOK = 1;
|
||
|
|
||
|
/* SFIO response to return */
|
||
|
pResponse = FMSTR_ConstToBuffer8(pResponse, FMSTR_STS_OK | FMSTR_STSF_VARLEN);
|
||
|
pResponse = FMSTR_ValueToBuffer8(pResponse, pcm_nSfioRespLen);
|
||
|
return FMSTR_CopyToBuffer(pResponse, (FMSTR_ADDR) SFIO_GetOutputBuffer(), pcm_nSfioRespLen);
|
||
|
}
|
||
|
|
||
|
/**************************************************************************//*!
|
||
|
*
|
||
|
* @brief Handling SFIOGETRESP (even and odd) commands
|
||
|
*
|
||
|
* @param pMessageIO - original command (in) and response buffer (out)
|
||
|
*
|
||
|
* @note This function handles the retried request for the last SFIO response.
|
||
|
* PC may request this retry when the last frame execution took too long
|
||
|
* (e.g. due to breakpoint) but is still finished properly. The original
|
||
|
* SFIOFRAME command returned timeout, so the PC will use SFIOGETRESP
|
||
|
* to finish data.
|
||
|
*
|
||
|
* The even/odd matching is here to have some dgree of robustness for
|
||
|
* a case when SFIOFRAME packet gets lost without ever reaching SFIO engine.
|
||
|
* Without any checking, the SFIOGETRESP would just blindly return the
|
||
|
* pre-last result and would definietelly cause Simulink problems.
|
||
|
* Having the check implemented, the PC can determine the even/odd mismatch
|
||
|
* and may re-send the last SFIOFRAME command.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
FMSTR_BPTR FMSTR_SfioGetResp(FMSTR_BPTR pMessageIO)
|
||
|
{
|
||
|
FMSTR_U8 nByte;
|
||
|
|
||
|
/* get command and determine if it is even/odd */
|
||
|
FMSTR_ValueFromBuffer8(&nByte, pMessageIO);
|
||
|
|
||
|
/* last command must have been finished propely */
|
||
|
if(!pcm_wSfioFlags.flg.bLastOK)
|
||
|
return FMSTR_ConstToBuffer8(pMessageIO, FMSTR_STC_SFIOERR);
|
||
|
|
||
|
/* only respond to "matching" request (even to even, odd to odd) */
|
||
|
if(nByte & 1)
|
||
|
{
|
||
|
if(pcm_wSfioFlags.flg.bEvenRun)
|
||
|
return FMSTR_ConstToBuffer8(pMessageIO, FMSTR_STC_SFIOUNMATCH);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(!pcm_wSfioFlags.flg.bEvenRun)
|
||
|
return FMSTR_ConstToBuffer8(pMessageIO, FMSTR_STC_SFIOUNMATCH);
|
||
|
}
|
||
|
|
||
|
/* SFIO response to return */
|
||
|
pMessageIO = FMSTR_ConstToBuffer8(pMessageIO, FMSTR_STS_OK | FMSTR_STSF_VARLEN);
|
||
|
pMessageIO = FMSTR_ValueToBuffer8(pMessageIO, pcm_nSfioRespLen);
|
||
|
return FMSTR_CopyToBuffer(pMessageIO, (FMSTR_ADDR) SFIO_GetOutputBuffer(), pcm_nSfioRespLen);
|
||
|
}
|
||
|
|
||
|
#endif /* FMSTR_USE_SFIO */
|