269 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
#ifndef _VOS_DEBUG_H_
 | 
						|
#define _VOS_DEBUG_H_
 | 
						|
 | 
						|
#include <stdarg.h>
 | 
						|
#include <kwrap/type.h>
 | 
						|
 | 
						|
 | 
						|
#if defined(__LINUX) && defined(__KERNEL__)
 | 
						|
#include <linux/printk.h>
 | 
						|
#define vk_pr_warn pr_warn
 | 
						|
#define vk_printk printk
 | 
						|
#define vk_print_isr printk
 | 
						|
#define vos_dump_stack dump_stack
 | 
						|
#define __DBG_COLOR_MONO__
 | 
						|
 | 
						|
#elif defined(__FREERTOS)
 | 
						|
#define vk_pr_warn debug_msg_isr
 | 
						|
#define vk_printk debug_msg_isr
 | 
						|
#define vk_print_isr debug_msg_isr
 | 
						|
 | 
						|
#ifndef unlikely
 | 
						|
#define unlikely(x) (x)
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef KERN_EMERG
 | 
						|
#define KERN_EMERG ""
 | 
						|
#endif
 | 
						|
 | 
						|
#else
 | 
						|
#include <stdio.h>
 | 
						|
#define vk_pr_warn printf
 | 
						|
#define vk_printk printf
 | 
						|
#define vk_print_isr printf
 | 
						|
 | 
						|
#ifndef unlikely
 | 
						|
#define unlikely(x) (x)
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#define NVT_DBG_FATAL     0
 | 
						|
#define NVT_DBG_ERR       1
 | 
						|
#define NVT_DBG_WRN       2
 | 
						|
#define NVT_DBG_UNIT      3
 | 
						|
#define NVT_DBG_FUNC      4
 | 
						|
#define NVT_DBG_IND       5
 | 
						|
#define NVT_DBG_MSG       6
 | 
						|
#define NVT_DBG_VALUE     7
 | 
						|
#define NVT_DBG_USER      8
 | 
						|
 | 
						|
#define _TOKEN_BIND(a, b)  a ## b
 | 
						|
#define TOKEN_BIND(a, b)  _TOKEN_BIND(a, b)
 | 
						|
 | 
						|
//If __MODULE__ not defined, just give it a name to let other macros can be used
 | 
						|
#ifndef __MODULE__
 | 
						|
#define __MODULE__ __SHORT_FILE__
 | 
						|
#endif
 | 
						|
 | 
						|
//If __DBGLVL__ not defined, use NVT_DBG_WRN as the default level
 | 
						|
#ifndef __DBGLVL__
 | 
						|
#define __DBGLVL__ NVT_DBG_WRN
 | 
						|
#endif
 | 
						|
 | 
						|
/**
 | 
						|
	If __DBGLVL__ equals NVT_DBG_USER, the debug level is controlled by users
 | 
						|
	Otherwise, the debug level is fixed to __DBGLVL__
 | 
						|
 | 
						|
	e.g.
 | 
						|
	1. Fixed debug level
 | 
						|
	@code
 | 
						|
    {
 | 
						|
		#define __MODULE__ my_module
 | 
						|
		#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | 
						|
		#include <kwrap/debug.h>
 | 
						|
	}
 | 
						|
    2. Dynamic debug level (an extern variable is requred)
 | 
						|
	@code
 | 
						|
    {
 | 
						|
		#define __MODULE__ my_module
 | 
						|
		#define __DBGLVL__ 8 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
 | 
						|
		#include <kwrap/debug.h>
 | 
						|
 | 
						|
		unsigned int my_module_debug_level = NVT_DBG_WRN;
 | 
						|
		//Note: It will cause linking error if you set __DBGLVL__ as 8 but the variable is not found
 | 
						|
	}
 | 
						|
*/
 | 
						|
#if (__DBGLVL__ == NVT_DBG_USER)
 | 
						|
#define _NVT_DBG_CURRENT_ TOKEN_BIND(__MODULE__, _debug_level)
 | 
						|
extern unsigned int _NVT_DBG_CURRENT_;
 | 
						|
 | 
						|
#define nvt_dbg(level, fmt, args...) do { \
 | 
						|
	if (unlikely(NVT_DBG_##level <= _NVT_DBG_CURRENT_)) { \
 | 
						|
		vk_pr_warn(fmt, ##args); \
 | 
						|
	} \
 | 
						|
} while (0)
 | 
						|
 | 
						|
#else //#if (__DBGLVL__ == NVT_DBG_USER)
 | 
						|
#define _NVT_DBG_CURRENT_ __DBGLVL__
 | 
						|
#define nvt_dbg(level, fmt, args...) NVT_PRINT_##level(fmt, ##args)
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_FATAL)
 | 
						|
#define NVT_PRINT_FATAL(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_FATAL(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_ERR)
 | 
						|
#define NVT_PRINT_ERR(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_ERR(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_WRN)
 | 
						|
#define NVT_PRINT_WRN(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_WRN(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_UNIT)
 | 
						|
#define NVT_PRINT_UNIT(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_UNIT(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_FUNC)
 | 
						|
#define NVT_PRINT_FUNC(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_FUNC(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_IND)
 | 
						|
#define NVT_PRINT_IND(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_IND(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_MSG)
 | 
						|
#define NVT_PRINT_MSG(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_MSG(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_VALUE)
 | 
						|
#define NVT_PRINT_VALUE(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_VALUE(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#if (_NVT_DBG_CURRENT_ >= NVT_DBG_USER)
 | 
						|
#define NVT_PRINT_USER(fmt, args...) vk_pr_warn(fmt, ##args)
 | 
						|
#else
 | 
						|
#define NVT_PRINT_USER(fmt, args...)
 | 
						|
#endif
 | 
						|
 | 
						|
#endif //#if (__DBGLVL__ == NVT_DBG_USER)
 | 
						|
 | 
						|
#ifdef __DBG_COLOR_MONO__
 | 
						|
#define DBG_COLOR_GRAY ""
 | 
						|
#define DBG_COLOR_RED ""
 | 
						|
#define DBG_COLOR_YELLOW ""
 | 
						|
#define DBG_COLOR_CYAN ""
 | 
						|
#define DBG_COLOR_GREEN ""
 | 
						|
#define DBG_COLOR_MAGENTA ""
 | 
						|
#define DBG_COLOR_BLUE ""
 | 
						|
#define DBG_COLOR_WHITE ""
 | 
						|
#define DBG_COLOR_HI_GRAY ""
 | 
						|
#define DBG_COLOR_HI_RED ""
 | 
						|
#define DBG_COLOR_HI_YELLOW ""
 | 
						|
#define DBG_COLOR_HI_CYAN ""
 | 
						|
#define DBG_COLOR_HI_GREEN ""
 | 
						|
#define DBG_COLOR_HI_MAGENTA ""
 | 
						|
#define DBG_COLOR_HI_BLUE ""
 | 
						|
#define DBG_COLOR_HI_WHITE ""
 | 
						|
#define DBG_COLOR_FATAL ""
 | 
						|
#define DBG_COLOR_ERR ""
 | 
						|
#define DBG_COLOR_WRN ""
 | 
						|
#define DBG_COLOR_UNIT ""
 | 
						|
#define DBG_COLOR_FUNC ""
 | 
						|
#define DBG_COLOR_IND ""
 | 
						|
#define DBG_COLOR_MSG ""
 | 
						|
#define DBG_COLOR_VALUE ""
 | 
						|
#define DBG_COLOR_USER ""
 | 
						|
#define DBG_COLOR_END ""
 | 
						|
#else
 | 
						|
#define DBG_COLOR_GRAY "\033[0;30m"
 | 
						|
#define DBG_COLOR_RED "\033[0;31m"
 | 
						|
#define DBG_COLOR_YELLOW "\033[0;33m"
 | 
						|
#define DBG_COLOR_CYAN "\033[0;36m"
 | 
						|
#define DBG_COLOR_GREEN "\033[0;32m"
 | 
						|
#define DBG_COLOR_MAGENTA "\033[0;35m"
 | 
						|
#define DBG_COLOR_BLUE "\033[0;34m"
 | 
						|
#define DBG_COLOR_WHITE "\033[0;37m"
 | 
						|
#define DBG_COLOR_HI_GRAY "\033[1;30m"
 | 
						|
#define DBG_COLOR_HI_RED "\033[1;31m"
 | 
						|
#define DBG_COLOR_HI_YELLOW "\033[1;33m"
 | 
						|
#define DBG_COLOR_HI_CYAN "\033[1;36m"
 | 
						|
#define DBG_COLOR_HI_GREEN "\033[1;32m"
 | 
						|
#define DBG_COLOR_HI_MAGENTA "\033[1;35m"
 | 
						|
#define DBG_COLOR_HI_BLUE "\033[1;34m"
 | 
						|
#define DBG_COLOR_HI_WHITE "\033[1;37m"
 | 
						|
#define DBG_COLOR_FATAL "\033[1;31m"
 | 
						|
#define DBG_COLOR_ERR "\033[1;31m"
 | 
						|
#define DBG_COLOR_WRN "\033[1;33m"
 | 
						|
#define DBG_COLOR_UNIT "\033[0;32m"
 | 
						|
#define DBG_COLOR_FUNC "\033[0;36m"
 | 
						|
#define DBG_COLOR_IND ""
 | 
						|
#define DBG_COLOR_MSG ""
 | 
						|
#define DBG_COLOR_VALUE ""
 | 
						|
#define DBG_COLOR_USER ""
 | 
						|
#define DBG_COLOR_END "\033[0m"
 | 
						|
#endif
 | 
						|
 | 
						|
#define DBG_FATAL(fmt, args...)         nvt_dbg(FATAL, DBG_COLOR_FATAL "FATAL:%s() " fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_ERR(fmt, args...)           nvt_dbg(ERR,   DBG_COLOR_ERR   "ERR:%s() "   fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_WRN(fmt, args...)           nvt_dbg(WRN,   DBG_COLOR_WRN   "WRN:%s() "   fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_UNIT(fmt, args...)          nvt_dbg(UNIT,  DBG_COLOR_UNIT  "UNIT:%s() "  fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_FUNC_BEGIN(fmt, args...)    nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s():begin " fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_FUNC(fmt, args...)          nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s(): "      fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_FUNC_END(fmt, args...)      nvt_dbg(FUNC,  DBG_COLOR_FUNC  "%s():end "   fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_IND(fmt, args...)           nvt_dbg(IND,   DBG_COLOR_IND   "%s() "       fmt DBG_COLOR_END, __func__, ##args)
 | 
						|
#define DBG_MSG(fmt, args...)           nvt_dbg(MSG,   DBG_COLOR_MSG   fmt DBG_COLOR_END, ##args)
 | 
						|
#define DBG_VALUE(fmt, args...)         nvt_dbg(VALUE, DBG_COLOR_VALUE fmt DBG_COLOR_END, ##args)
 | 
						|
#define DBG_USER(fmt, args...)          nvt_dbg(USER,  DBG_COLOR_USER  fmt DBG_COLOR_END, ##args)
 | 
						|
#define DBG_DUMP(fmt, args...)          vk_pr_warn(fmt, ##args)
 | 
						|
 | 
						|
// only used in ISR. max string len is limited
 | 
						|
#define DBG_ISR(fmt, args...)           vk_print_isr(fmt, ##args)
 | 
						|
 | 
						|
#define CHKPNT    vk_pr_warn(DBG_COLOR_WHITE "CHK: %d, %s\r\n" DBG_COLOR_END, __LINE__, __func__)
 | 
						|
#define DBGD(x)   vk_pr_warn(DBG_COLOR_MAGENTA "%s=%d\r\n" DBG_COLOR_END, #x, x)
 | 
						|
#define DBGH(x)   vk_pr_warn(DBG_COLOR_MAGENTA "%s=0x%08X\r\n" DBG_COLOR_END, #x, x)
 | 
						|
 | 
						|
#if defined(__FREERTOS)
 | 
						|
extern void profile_task_busy(void);
 | 
						|
extern void profile_task_idle(void);
 | 
						|
#define PROFILE_TASK_BUSY() profile_task_busy()
 | 
						|
#define PROFILE_TASK_IDLE() profile_task_idle()
 | 
						|
#else
 | 
						|
#define PROFILE_TASK_BUSY()
 | 
						|
#define PROFILE_TASK_IDLE()
 | 
						|
#endif
 | 
						|
 | 
						|
#define ASSERT(x)                                                       \
 | 
						|
	do {    if (x) break;                                               \
 | 
						|
		vk_printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %s\n",      \
 | 
						|
			   __FILE__, __func__, __LINE__, #x); vos_dump_stack(); vos_debug_halt();  \
 | 
						|
	} while (0)
 | 
						|
 | 
						|
 | 
						|
#if defined(__FREERTOS)
 | 
						|
int debug_msg_isr(const char *fmtstr, ...);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef exam_msg
 | 
						|
// exam_msg is used by auto-test. we directly define exam_msg as vk_printk to reserve for future modifications.
 | 
						|
#define exam_msg vk_printk
 | 
						|
#endif
 | 
						|
 | 
						|
void vos_debug_halt(void);
 | 
						|
 | 
						|
void debug_dumpmem(ULONG addr, ULONG length); ///< dump memory region to console output
 | 
						|
void debug_dumpmem2file(ULONG addr, ULONG length, CHAR *filename);
 | 
						|
void debug_kmsg(char *fmtstr, ...); ///< debug message entry
 | 
						|
void debug_kmsg_register(void (*fp)(const char *fmtstr, ...)); ///< hook debug msg
 | 
						|
 | 
						|
#endif //_VOS_DEBUG_H_
 | 
						|
 | 
						|
 |