📄 probe_com.c
字号:
/*
*********************************************************************************************************
* uC/Probe Communication
*
* (c) Copyright 2007-2008; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
* Knowledge of the source code may NOT be used to develop a similar product.
* Please help us continue to provide the Embedded community with the finest
* software available. Your honesty is greatly appreciated.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* COMMUNICATION: GENERIC
*
* Filename : probe_com.c
* Version : V2.20
* Programmer(s) : BAN
*********************************************************************************************************
* Note(s) : (1) This file contains code to respond to generic (non protocol-dependent) commands
* received by the target.
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define PROBE_COM_MODULE
#include <probe_com.h>
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* DATA FORMATS DEFINES
*********************************************************************************************************
*/
#define PROBE_COM_FMT_TX_ERR 0x8000
#define PROBE_COM_FMT_RX_QUERY 0x0001 /* Query setup parameter or capability. */
#define PROBE_COM_FMT_TX_QUERY 0x8001
#define PROBE_COM_FMT_RX_RD 0x0002 /* Read data at memory address. */
#define PROBE_COM_FMT_TX_RD 0x8002
#define PROBE_COM_FMT_RX_WR 0x0003 /* Write data at memory address. */
#define PROBE_COM_FMT_TX_WR 0x8003
#define PROBE_COM_FMT_RX_RD_MULTI 0x0007 /* Read data at multiple memory addresses. */
#define PROBE_COM_FMT_TX_RD_MULTI 0x8007
#define PROBE_COM_FMT_TX_RD_MULTI_LO 0x07
#define PROBE_COM_FMT_TX_RD_MULTI_HI 0x80
#define PROBE_COM_FMT_RX_WR_MULTI 0x0008 /* Write data at multiple memory addresses. */
#define PROBE_COM_FMT_TX_WR_MULTI 0x8008
#define PROBE_COM_FMT_RX_STR_OUT 0x0009 /* Transmit output string to Probe. */
#define PROBE_COM_FMT_TX_STR_OUT 0x8009
#define PROBE_COM_FMT_RX_STR_IN 0x000A /* Receive input string from Probe. */
#define PROBE_COM_FMT_TX_STR_IN 0x800A
#define PROBE_COM_FMT_RX_TERMINAL_EXEC 0x000B /* Execute terminal command. */
#define PROBE_COM_FMT_TX_TERMINAL_EXEC 0x800B
#define PROBE_COM_FMT_RX_TERMINAL_OUT 0x000C /* Transmit output data to Probe. */
#define PROBE_COM_FMT_TX_TERMINAL_OUT 0x800C
#define PROBE_COM_FMT_RX_TERMINAL_IN 0x000D /* Receive input data from Probe. */
#define PROBE_COM_FMT_TX_TERMINAL_IN 0x800D
/*
*********************************************************************************************************
* STATUS CONSTANTS DEFINES
*********************************************************************************************************
*/
#define PROBE_COM_STATUS_OK 0x01
#define PROBE_COM_STATUS_TERMINAL_EXEC_NOT_RDY 0xF4 /* Terminal not rdy to exec new cmd. */
#define PROBE_COM_STATUS_TERMINAL_IN_OVF 0xF5 /* Terminal in buf ovf'd. */
#define PROBE_COM_STATUS_TERMINAL_OUT_NONE 0xF6 /* Terminal out buf empty. */
#define PROBE_COM_STATUS_STR_IN_OVF 0xF7 /* String in buf ovf'd. */
#define PROBE_COM_STATUS_STR_OUT_NONE 0xF8 /* String out buf empty. */
#define PROBE_COM_STATUS_UNKNOWN_REQUEST 0xF9 /* Unknown req. */
#define PROBE_COM_STATUS_QUERY_NOT_SUPPORTED 0xFC /* Query not supported. */
#define PROBE_COM_STATUS_TX_PKT_TOO_LARGE 0xFD /* Reply pkt too large for buf. */
#define PROBE_COM_STATUS_RX_PKT_WRONG_SIZE 0xFE /* Req pkt not correct size. */
#define PROBE_COM_STATUS_FAIL 0xFF /* Req exec failed (or unknown err). */
/*
*********************************************************************************************************
* QUERIES DEFINES
*********************************************************************************************************
*/
/* ------------------- CONFIGURATION ------------------ */
#define PROBE_COM_QUERY_MAX_RX_SIZE 0x0101 /* Get data size of largest pkt target can rx. */
#define PROBE_COM_QUERY_MAX_TX_SIZE 0x0102 /* Get data size of largest pkt target can tx. */
/* ----------------- TARGET PROPERTIES ---------------- */
#define PROBE_COM_QUERY_ENDIANNESS_TEST 0x0201 /* Test endianness of target. */
#define PROBE_COM_QUERY_STATUS 0x0202 /* Target status. */
/* ------------- COMMUNICATION CAPABILITIES ----------- */
#define PROBE_COM_QUERY_FMT_SUPPORT 0x1001 /* Get list of supported req's. */
#define PROBE_COM_QUERY_VERSION 0x1002 /* Get target code ver. */
/*
*********************************************************************************************************
* MODIFIERS DEFINES
*********************************************************************************************************
*/
#define PROBE_COM_MODIFIER_NONE DEF_BIT_NONE
#define PROBE_COM_MODIFIER_STR_OUT_AVAIL DEF_BIT_00 /* Str out is avail. */
#define PROBE_COM_MODIFIER_TERMINAL_EXEC_DONE DEF_BIT_01 /* Terminal cmd exec done. */
#define PROBE_COM_MODIFIER_TERMINAL_OUT_AVAIL DEF_BIT_02 /* Terminal out is avail. */
/*
*********************************************************************************************************
* HEADER SIZES DEFINES
*
* Note(s): (1) The first four bytes in all tx data segments is identical:
*
* (a) A 2-byte format;
* (b) A 1-byte status;
* (c) A 1-byte modifier, currently unused.
*
* (2) The first two bytes in all rx data segments is identical:
*
* (a) A 2-byte format.
*********************************************************************************************************
*/
#define PROBE_COM_SIZE_RX_HDR 2
#define PROBE_COM_SIZE_TX_HDR 4
/*
*********************************************************************************************************
* LOCAL CONSTANTS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL DATA TYPES
*********************************************************************************************************
*/
typedef struct probe_com_buf {
CPU_SIZE_T Len;
CPU_SIZE_T IxRd;
CPU_SIZE_T IxWr;
CPU_INT08U *DataPtr;
} PROBE_COM_BUF;
/*
*********************************************************************************************************
* LOCAL TABLES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
#if (PROBE_COM_CFG_STR_REQ_EN == DEF_ENABLED)
static CPU_CHAR ProbeCom_StrInBufData[PROBE_COM_CFG_STR_IN_BUF_SIZE];
static PROBE_COM_BUF ProbeCom_StrInBuf;
static CPU_CHAR ProbeCom_StrOutBufData[PROBE_COM_CFG_STR_OUT_BUF_SIZE];
static PROBE_COM_BUF ProbeCom_StrOutBuf;
#endif
#if (PROBE_COM_CFG_TERMINAL_REQ_EN == DEF_ENABLED)
static PROBE_COM_TERMINAL_EXEC_FNCT ProbeCom_TerminalExecHandler;
static CPU_BOOLEAN ProbeCom_TerminalExecuting;
static PROBE_COM_TERMINAL_IN_FNCT ProbeCom_TerminalInHandler;
static CPU_INT08U *ProbeCom_TerminalOutBufPtr;
static CPU_SIZE_T ProbeCom_TerminalOutBufIx;
static CPU_SIZE_T ProbeCom_TerminalOutBufLen;
#endif
static CPU_INT32U ProbeCom_EndiannessTest;
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static CPU_INT08U ProbeCom_PktModifier (void);
static CPU_SIZE_T ProbeCom_ReqErr (CPU_INT08U *ptx_buf,
CPU_INT08U pcomm_err);
/* ------------------- HANDLE REQ'S ------------------- */
static CPU_SIZE_T ProbeCom_ReqQuery (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqRd (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqRdMulti (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
#if (PROBE_COM_CFG_WR_REQ_EN == DEF_ENABLED)
static CPU_SIZE_T ProbeCom_ReqWr (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqWrMulti (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
#endif
#if (PROBE_COM_CFG_STR_REQ_EN == DEF_ENABLED)
static CPU_SIZE_T ProbeCom_ReqStrIn (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqStrOut (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
#endif
#if (PROBE_COM_CFG_TERMINAL_REQ_EN == DEF_ENABLED)
static CPU_SIZE_T ProbeCom_ReqTerminalExec (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqTerminalIn (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
static CPU_SIZE_T ProbeCom_ReqTerminalOut (CPU_INT08U *prx_buf,
CPU_INT08U *ptx_buf,
CPU_SIZE_T rx_pkt_size,
CPU_SIZE_T tx_buf_size);
#endif
/* ------------------- DYNAMIC BUFFER ----------------- */
#if (PROBE_COM_CFG_STR_REQ_EN == DEF_TRUE)
static void ProbeCom_BufInit (PROBE_COM_BUF *pbuf,
CPU_INT08U *pdata,
CPU_SIZE_T len);
static CPU_SIZE_T ProbeCom_BufRd (PROBE_COM_BUF *pbuf,
CPU_INT08U *pdest,
CPU_SIZE_T len)
;
static CPU_SIZE_T ProbeCom_BufWr (PROBE_COM_BUF *pbuf,
CPU_INT08U *psrc,
CPU_SIZE_T len);
static CPU_BOOLEAN ProbeCom_BufIsEmpty (PROBE_COM_BUF *pbuf);
#endif
#if 0
static CPU_BOOLEAN ProbeCom_BufIsFull (PROBE_COM_BUF *pbuf);
#endif
/* ------------------- STATIC BUFFER ------------------ */
static CPU_INT08U ProbeCom_GetINT08U (CPU_INT08U **pbuf);
static CPU_INT16U ProbeCom_GetINT16U (CPU_INT08U **pbuf);
static CPU_INT32U ProbeCom_GetINT32U (CPU_INT08U **pbuf);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -