nt9856x/rtos/code/lib/include/DbgUtApi.h
2023-03-28 15:07:53 +08:00

316 lines
13 KiB
C
Executable File

/**
DbgUt, APIs declare.
@file DbgUtApi.h
@ingroup mDBGUT
Copyright Novatek Microelectronics Corp. 2012. All rights reserved.
*/
#ifndef _DBGUTAPI_H
#define _DBGUTAPI_H
#include "dma.h"
/**
@addtogroup mDBGUT
*/
//@{
#define DBGUT_API_VERSION 0x13040911U ///< API version
/**
Calculation of engine group and bit. Used in uiExcludeMask.
Example:
@code
{
//Mask Grph Channel
Cfg.User.Base.uiExcludeMask[DMA_WPCH_GRA_3/DBGUT_WP_BITS_PER_GROUP]
= 1 << (DMA_WPCH_GRA_3%DBGUT_WP_BITS_PER_GROUP);
}
@endcode
*/
#define DBGUT_WP_BITS_PER_GROUP 32
#define DBGUT_DMA_CH_GROUP_CNT 6 ///< Total DMA group counts
/**
Error Code.
Any error code occured will display on uart or return.
*/
typedef enum _DBGUT_ER {
DBGUT_ER_OK = 0, ///< no error
DBGUT_ER_NOT_INIT = -1, ///< DbgUt_Init() is not called or not success
DBGUT_ER_SYS = -2, ///< unknown system error
DBGUT_ER_LOCK = -3, ///< failed to lock API
DBGUT_ER_UNLOCK = -4, ///< failed to unlock API
DBGUT_ER_PARAM = -5, ///< wrong Parameters
DBGUT_ER_API_VERSION = -6, ///< wrong API version
DBGUT_ER_STA_TASK = -7, ///< failed to call sta_tsk
DBGUT_ER_WAIT_IDLE = -8, ///< failed to call wai_flg for idle
DBGUT_ER_SET_IDLE = -9, ///< failed to call set_flg to idle
DBGUT_ER_NOT_IN_IDLE = -10, ///< if Prop.bEnterOnlyIdle is true, but system is not idle
DBGUT_ER_STATE = -11, ///< service state machine is not correctly.
DBGUT_ER_INVALID_CALL = -12, ///< invald to call this API
DBGUT_ER_OUT_DATA_VOLATILE = -13, ///< the parameter DBGUT_CMD.out maybe volatile. (suggest to bExitCmdFinish=TRUE)
DBGUT_ER_CMD_MAXDATA = -14, ///< internal error. all cmd data structure have to declare in DBGUT_CMD_MAXDATA
DBGUT_ER_INVALID_CMD_IDX = -15, ///< invalid command index
DBGUT_ER_CMD_MAP_NULL = -16, ///< internal error. cmd function map to a null pointer
DBGUT_ER_CMD_NOT_MATCH = -17, ///< internal error. g_DbgUtCallTbl is not match to DBGUT_CMD_IDX
DBGUT_ER_CMD_IN_DATA = -18, ///< wrong DBGUT_CMD.In Data
DBGUT_ER_CMD_OUT_DATA = -19, ///< wrong DBGUT_CMD.Out Data
DBGUT_ER_TIMER_ALREADY_LOCK = -20, ///< internal timer already locked
DBGUT_ER_TIMER_ALREADY_UNLOCK = -21, ///< internal timer already unlocked
DBGUT_ER_TIMER_LOCK_FAIL = -22, ///< internal timer lock failed
DBGUT_ER_TIMER_LOCK_EXCEPTION = -23, ///< internal timer lock exception
DBGUT_ER_TIMER_UNLOCK_EXCEPTION = -24, ///< internal timer unlock exception
DBGUT_ER_TIMER_CFG_EXCEPTION = -25, ///< internal timer config exception
DBGUT_ER_TIMER_CFG_INVALID_TID = -26, ///< internal timer config invalid timer id
DBGUT_ER_TIMER_CFG_FAIL = -27, ///< internal timer config fail
ENUM_DUMMY4WORD(DBGUT_ER)
} DBGUT_ER;
/**
Warning Code.
The warning codes is only displayed via uart.
*/
typedef enum _DBGUT_WR {
DBGUT_WR_OK = 0, ///< no warning
DBGUT_WR_INIT_TWICE = -1, ///< DbgUt_Init() is called twice
DBGUT_WR_ALREADY_CLOSED = -2, ///< service is already closed.
DBGUT_WR_SUSPEND_TWICE = -3, ///< DbgUt_Suspend maybe is called twice
DBGUT_WR_NOT_IN_SUSPEND = -4, ///< call DbgUt_Resume, but service isn't in suspend state before.
DBGUT_WR_CMD_SKIP = -5, ///< existing a command is skipped
DBGUT_WR_DMA_USAGE_START_TWICE = -6, ///< DBGUT_CMD_DMA_USAGE_START already start
DBGUT_WR_DMA_USAGE_ALREADY_STOPED = -7, ///< DBGUT_CMD_DMA_USAGE_STOP already stop
DBGUT_WR_DMA2_USAGE_START_TWICE = -6, ///< DBGUT_CMD_DMA_USAGE_START already start
DBGUT_WR_DMA2_USAGE_ALREADY_STOPED = -7, ///< DBGUT_CMD_DMA_USAGE_STOP already stop
DBGUT_WR_CPU_USAGE_START_TWICE = -6, ///< DBGUT_CMD_CPU_USAGE_START already start
DBGUT_WR_CPU_USAGE_ALREADY_STOPED = -7, ///< DBGUT_CMD_CPU_USAGE_STOP already stop
ENUM_DUMMY4WORD(DBGUT_WR)
} DBGUT_WR;
/**
Dma Command Index.
The command of DbgUt service support. Set this index to the DBGUT_CMD_DMA
and call the DbgUt_CmdDma to do command when service is opened.
*/
typedef enum _DBGUT_CMD_DMA {
DBGUT_CMD_DMA_UNKNOWN = 0, ///< unknown command.
DBGUT_CMD_DMA_USAGE_CFG, ///< In:DBGUT_DMA_USAGE_CFG Out:NULL,
DBGUT_CMD_DMA_USAGE_START, ///< In:NULL, Out:NULL, start to count usage
DBGUT_CMD_DMA_USAGE_GET, ///< In:NULL, Out:UINT32
DBGUT_CMD_DMA_USAGE_STOP, ///< In:NULL, Out:NULL, stop to count usage
DBGUT_CMD_DMA2_USAGE_CFG, ///< In:DBGUT_DMA_USAGE_CFG Out:NULL,
DBGUT_CMD_DMA2_USAGE_START, ///< In:NULL, Out:NULL, start to count usage
DBGUT_CMD_DMA2_USAGE_GET, ///< In:NULL, Out:UINT32
DBGUT_CMD_DMA2_USAGE_STOP, ///< In:NULL, Out:NULL, stop to count usage
DBGUT_CMD_DMA_PROTECT_CFG, ///< In:DBGUT_DMA_PROTECT_CFG, Out:NULL
DBGUT_CMD_DMA_PROTECT_START,
DBGUT_CMD_DMA_PROTECT_STOP,
DBGUT_CMD_DMA_PROTECT_DUMP, ///< In:NULL, Out:NULL, dump protected address info
ENUM_DUMMY4WORD(DBGUT_CMD_DMA)
} DBGUT_CMD_DMA;
/**
CPU Command Index.
The command of DbgUt service support. Set this index to the DBGUT_CMD_CPU
and call the DbgUt_CmdCpu to do command when service is opened.
*/
typedef enum _DBGUT_CMD_CPU {
DBGUT_CMD_CPU_UNKNOWN = 0, ///< unknown command.
DBGUT_CMD_CPU_USAGE_CFG, ///< In:DBGUT_CPU_USAGE_CFG Out:NULL
DBGUT_CMD_CPU_USAGE_START, ///< In:NULL, Out:NULL, start to count usage
DBGUT_CMD_CPU_USAGE_GET, ///< In:NULL, Out:UINT32
DBGUT_CMD_CPU_USAGE_STOP, ///< In:NULL, Out:NULL, stop to count usage
ENUM_DUMMY4WORD(DBGUT_CMD_CPU)
} DBGUT_CMD_CPU;
/**
OS Command Index.
The command of DbgUt service support. Set this index to the DBGUT_CMD_OS
and call the DbgUt_CmdOs to do command when service is opened.
*/
typedef enum _DBGUT_CMD_OS {
DBGUT_CMD_OS_UNKNOWN = 0, ///< unknown command.
DBGUT_CMD_OS_DUMP_KER, ///< dump ker
ENUM_DUMMY4WORD(DBGUT_CMD_OS)
} DBGUT_CMD_OS;
/**
Initial Data.
For system inital via DbgUt_Init().
*/
typedef struct _DBGUT_INIT {
UINT32 uiApiVer; ///< just assign to DBGUT_API_VERSION
VK_TASK_HANDLE TaskID; ///< given a task id form project layer creation (can set 0 to use system default)
SEM_HANDLE SemID; ///< given a semaphore id form project layer creation (can set 0 to use system default)
ID FlagID; ///< given a flag id form project layer creation (can set 0 to use system default)
} DBGUT_INIT, *PDBGUT_INIT;
/**
Command Input/Output Data.
Including data pointer and data size depend on DBGUT_CMD_IDX.
*/
typedef struct _DBGUT_DATA {
VOID *pData; ///< input/output data pointer
UINT32 uiNumByte; ///< input/output data size
} DBGUT_DATA, *PDBGUT_DATA;
/**
Command Description.
The necessary information for running a command via DbgUt_Cmd().
*/
typedef struct _DBGUT_CMD_DATA {
DBGUT_DATA In; ///< input data description (depend on Idx)
DBGUT_DATA Out; ///< output data description (depend on Idx)
} DBGUT_CMD_DATA, *PDBGUT_CMD_DATA;
typedef struct _DBGUT_USAGE_QUEUE {
UINT8 *pUsageQueue; ///< can be NULL for disable. or input an gloal array for saving each usage when time interval occured.
UINT32 uiByteQueue; ///< sizeof usage queue
UINT32 *pCurrIdxQueue; ///< user provide an UINT32 variable for get index when usage module saving
UINT32 *pTotalSamples; ///< user provide an UINT32 variable for get total samples that have been count
} DBGUT_USAGE_QUEUE, *PDBGUT_USAGE_QUEUE;
typedef struct _DBGUT_CPU_USAGE_CFG {
UINT32 uiItervalMs; ///< time Interval in Ms
BOOL bAutoDisp; ///< auto display usage on uart
DBGUT_USAGE_QUEUE Queue; ///< (Optional) an gloal structure for saving each usage when time interval occured.
} DBGUT_CPU_USAGE_CFG, *PDBGUT_CPU_USAGE_CFG;
typedef struct _DBGUT_DMA_USAGE_CFG {
UINT32 uiItervalMs; ///< Time Interval in Ms
BOOL bAutoDisp; ///< auto display usage on uart
DBGUT_USAGE_QUEUE Queue; ///< (Optional) an gloal structure for saving each usage when time interval occured.
} DBGUT_DMA_USAGE_CFG, *PDBGUT_DMA_USAGE_CFG;
typedef struct _DBGUT_DMA_PROTECT_UNIT {
BOOL bEn; ///< indicate enable
BOOL bDetectOnly; ///< select detect only or including protection.
UINT32 uiExcludeMask[DBGUT_DMA_CH_GROUP_CNT]; ///< set any bit to '1' to exclude you dont wanna see engine information
} DBGUT_DMA_PROTECT_UNIT, *PDBGUT_DMA_PROTECT_UNIT;
typedef struct _DBGUT_DMA_PROTECT_USER {
DBGUT_DMA_PROTECT_UNIT Base; ///< indicate enable, detect only and exclude mask.
UINT32 uiAddr; ///< user defined detection of address
UINT32 uiSize; ///< user defined detection of size
BOOL bIncludeCpu; ///< indicate including CPU r/w detection or pretection.
BOOL bIncludeCpu2; ///< indicate including CPU2 r/w detection or pretection.
BOOL bIncludeDsp; ///< indicate including DSP r/w detection or pretection.
BOOL bIncludeDsp2; ///< indicate including DSP2 r/w detection or pretection.
} DBGUT_DMA_PROTECT_USER, *PDBGUT_DMA_PROTECT_USER;
typedef struct _DBGUT_DMA_PROTECT_CFG {
DBGUT_DMA_PROTECT_UNIT Fw; ///< firmware area of memory protection
DBGUT_DMA_PROTECT_UNIT Heap; ///< firmware area of stack protection
DBGUT_DMA_PROTECT_USER User; ///< user defined of memory protection
} DBGUT_DMA_PROTECT_CFG, *PDBGUT_DMA_PROTECT_CFG;
/**
Install DbgUt task,flag and semaphore id
This is default install API. User can create own task id, semphore id,
flag id to adjust own stack size and task priority as following:
@code
{
#define PRI_DBGUT 4
#define STKSIZE_DBGUT 2048
UINT32 DBGUT_TSK_ID = 0;
UINT32 DBGUT_FLG_ID = 0;
UINT32 DBGUT_SEM_ID = 0;
void Install_UserDbgUtID(void)
{
OS_CONFIG_TASK(DBGUT_TSK_ID,PRI_DBGUT,STKSIZE_DBGUT,DbgUtTsk);
OS_CONFIG_FLAG(DBGUT_FLG_ID);
OS_CONFIG_SEMPHORE(DBGUT_SEM_ID,0,1,1);
}
}
@endcode
*/
extern void DbgUt_InstallID(void) _SECTION(".kercfg_text");
/**
DbgUt main task.
Task body. Just set it into user_systasktabl in SysCfg.c. The stack size
suggest to 4096KB. If there are many callbacks have plug-in, the stack
size maybe need to more.
*/
extern VOID DbgUtTsk(VOID);
/**
Initialize DbgUt service.
For using the DbgUt service, the task id, flag id, semphore id have to
prepare by project layer. Assign these ids to the DBGUT_INIT strcuture
when system starup (just set once).
@param[in] pInit necessary inital data.
@return
- @b DBGUT_ER_OK: inital success.
- @b DBGUT_ER_API_VERSION: DbgUtApi.h and AppDbgUt.a not match.
*/
extern DBGUT_ER DbgUt_Init(void);
/**
Set a command action to DbgUt service.
Configure DBGUT_CMD and send it to the service to do some action via
DbgUt_Cmd.
@param[in] Cmd command index description.
@param[in] pData command description.
@return
- @b DBGUT_ER_OK: send command success.
- @b DBGUT_ER_CMD_NOT_MATCH: internal error. Please contact to module
maintenance staff.
- @b DBGUT_ER_CMD_IN_DATA: the DBGUT_CMD.In maybe assing wrong object
/ structure
- @b DBGUT_ER_CMD_IN_DATA: the DBGUT_CMD.Out maybe assing wrong object
/ structure
- @b DBGUT_ER_STATE: may DbgUt_Open does not be opened yet.
- @b DBGUT_ER_NOT_IN_IDLE: If DBGUT_CMD.DBGUT_PROP.bEnterOnlyIdle set
to TRUE and service is not in idle. Notice you this command is
skipped.
- @b DBGUT_ER_OUT_DATA_VOLATILE: If the command include the output data
and set DBGUT_CMD.DBGUT_PROP.bExitCmdFinish to FALSE, the finish
callback have to plug-in a callback function to DBGUT_CMD
.DBGUT_PROP.fpFinishCb and DBGUT_CMD.Out have to point to a
global data structure.
- @b DBGUT_ER_CMD_MAXDATA: internal error. Please contact to module
maintenance staff.
*/
//@{
extern DBGUT_ER DbgUt_CmdDma(const DBGUT_CMD_DMA Cmd, const DBGUT_CMD_DATA *pData); ///< Do related DMA command
extern DBGUT_ER DbgUt_CmdDma2(const DBGUT_CMD_DMA Cmd, const DBGUT_CMD_DATA *pData); ///< Do related DMA command
extern DBGUT_ER DbgUt_CmdCpu(const DBGUT_CMD_CPU Cmd, const DBGUT_CMD_DATA *pData); ///< Do related CPU command
//@}
/**
Install SxCmd
Install uart command to SxCmd
*/
extern void DbgUt_InstallCmd(void);
extern void cpu_enableWatch(int i, UINT32 addr, UINT32 size);
extern void cpu_disableWatch(int i);
//@}
#endif