深圳茁壮IPANEL浏览器中间件 debug模块移植参考,打印分级等功能,可以移到其他嵌入式系统

/********************************************************************************************************
文件名称:porting_debug.c
版权所有(c) 2010,深圳市茁壮网络股份有限公司.

当前版本:Ver 2.1
作    者:songhj 

内容说明:
        sample module.

其他:

修改记录:
版本号	     日期        作者	        修改内容
--------    --------    --------        --------
2.0         2010-05-05  Li Liao         创建
2.1         2010-12-27  songhj          整理、规范
 ********************************************************************************************************/


/********************************************************************************************************
 *                                           File Include                                               *
 ********************************************************************************************************/
#include "stdio.h"
#include "string.h"                 /*memeset*/
#include "stdarg.h"                 /*va_start va_end*/

#include "ipanel_porting_event.h"   /*porting_debug_check_dgb_key */
#include "porting_typedef.h"
#include "porting_debug.h"
#include "sys_printf.h"
#include "format.h"
/********************************************************************************************************
 *                                        Defines                                                       *
 ********************************************************************************************************/
#define MSG_LEN_MAX 512

typedef struct {
	PORT_DBG_CONF_T debug_config[PORT_DBG_MODULE_MAX];  /*debug 配置信息*/
	char            msg[MSG_LEN_MAX];                   /*打印输出级别信息*/
	int             debugLevel;                         /*打印级别*/
	int             mid_debug_out;                      /*中间件打印控制标志*/
	int             porting_debug_out;                  /*porting打印控制标志*/
	int             dbg_open[4];                        /*打开重定向*/
	int             dbg_close[4];                       /*关闭重定向*/
	int             dbg_flag;                           /*按键控制标志,用于调试*/
}debug_mgr_t;



/********************************************************************************************************
 *                                        Global Variables                                              *
 ********************************************************************************************************/
/*模块初始化状态*/
IPANEL_UINT64_T g_init_status;


/********************************************************************************************************
 *                                        Local Variables                                               *
 ********************************************************************************************************/
//static debug_mgr_t m_debug_mgr[1];
debug_mgr_t m_debug_mgr[1];

/********************************************************************************************************
 *                                        Local Functions Declaring                                     *
 ********************************************************************************************************/
static void debug_config_set_default(void);
static void debug_printf_module_name(int id, char *str);


/********************************************************************************************************
 *                                        Global Functions                                              *
 ********************************************************************************************************/

int porting_debug_init(void)
{
	stb_printf("[%s](in)------------------------->\n",__FUNCTION__);
	CHECK_MODULE_INIT_STATUS(PORT_MODULE_DBG);

	memset(m_debug_mgr, 0, sizeof(m_debug_mgr));
	m_debug_mgr->debugLevel        = 0;
	m_debug_mgr->mid_debug_out     = 1;    /* 默认打开中间件打印 */
	m_debug_mgr->porting_debug_out = 1;    /* 默认打开porting打印 */
	m_debug_mgr->dbg_flag          = 0;
	
	debug_config_set_default();
	
	SET_MODULE_INIT_STATUS(PORT_MODULE_DBG);
	stb_printf("[%s](out)\n",__FUNCTION__);
	return IPANEL_ERR;
}

int porting_debug_exit(void)
{
	printf("[%s](in)<-------------------------\n",__FUNCTION__);

	CHECK_MODULE_EXIT_STATUS(PORT_MODULE_DBG);
	memset(m_debug_mgr, 0, sizeof(m_debug_mgr));
	SET_MODULE_EXIT_STATUS(PORT_MODULE_DBG);
	
	stb_printf("[%s](out)\n",__FUNCTION__);
	return IPANEL_OK;
}

/********************************************************************************************************
功能:
	根据模块的id,设置该模块设置的debug输出级别
原型:
	INT32_T porting_debug_set_level (PORT_DBG_MODULE_T id, PORT_DBG_LEVEL_T lv)
参数说明:
	输入参数:
		id:     模块ID,0为全局打印级别 
		lv:     模块打印级别 
	输出参数:
		无
返    回:
	IPANEL_OK: 成功
	IPANEL_ERR:失败
********************************************************************************************************/
INT32_T porting_debug_set_level (PORT_DBG_MODULE_T id, PORT_DBG_LEVEL_T lv)
{
	int i;
	/* 判断输入参数有效性*/
	/*comparison of unsigned expression < 0 is always false
	if((id < PORT_MODULE_DEFAULT)||(id > PORT_MODULE_OTHER))*/
	if(id > PORT_MODULE_OTHER)
	{
		stb_printf("[%s] no this module id=%d, exit\n",__FUNCTION__,id);
		goto LAB_ERR;
	}

	if((lv < PORT_DBG_NONE)||(lv > PORT_DBG_FATAL))
	{
		stb_printf("[%s] cannot set module level %d\n",__FUNCTION__,lv);
		goto LAB_ERR;
	}
	/*设置默认打印级别*/
	if(PORT_MODULE_DEFAULT == id)
	{
		m_debug_mgr->debugLevel = lv;
		for(i=1; i<PORT_DBG_MODULE_MAX; i++)
		{
			m_debug_mgr->debug_config[i].m_level = (CHAR_T)lv;
		}			
	}

	/*设置模块打印级别*/
	i = id;
	m_debug_mgr->debug_config[i].m_level = (CHAR_T)lv;	
	return IPANEL_OK;
LAB_ERR:	
	return IPANEL_ERR;
}

/********************************************************************************************************
功能:
	根据模块ID,获取该模块的打印输出级别。 如果已经单独设置,返回单独设置的值;
	如果没有单独设置,返回全局打印级别。 
	因该接口调用频繁,删除不必要的打印及参数检测 。
原型:
	INT32_T porting_debug_get_level (PORT_DBG_MODULE_T id, INT32_T *lv)
参数说明:
	输入参数:
		id:     模块ID,0为全局打印级别 
	输出参数:
		lv:     模块打印级别 
返    回:
	IPANEL_OK: 成功
	IPANEL_ERR:失败
********************************************************************************************************/
INT32_T porting_debug_get_level (PORT_DBG_MODULE_T id, INT32_T *lv)
{
	/* 获取模块打印级别	*/
	INT32_T i = id;
	if(PORT_DBG_NONE == m_debug_mgr->debug_config[i].m_level )
	{
		*lv = m_debug_mgr->debugLevel;
	}
	else
	{
		*lv = m_debug_mgr->debug_config[i].m_level;
	}	
	return IPANEL_OK;
}

/********************************************************************************************************
功能:
	设置打印输出方式
原型:
	INT32_T porting_debug_set_output(PORT_DBG_OUTPUT_MODE_T param)
参数说明:
	输入参数:
		param:  打印输出方式
	输出参数:
返    回:
	IPANEL_OK: 成功
	IPANEL_ERR:失败
********************************************************************************************************/
INT32_T porting_debug_set_output(PORT_DBG_OUTPUT_MODE_T param)
{
	stb_printf("[%s](in)\n",__FUNCTION__);
	stb_printf("[%s](out)\n",__FUNCTION__);
	return IPANEL_OK;	
}

/********************************************************************************************************
功能:
	获取当前打印输出方式
原型:
	INT32_T porting_debug_get_output(PORT_DBG_OUTPUT_MODE_T *param)
参数说明:
	输入参数:
	输出参数:
		param:  打印输出方式
返    回:
	IPANEL_OK: 成功
	IPANEL_ERR:失败
********************************************************************************************************/
INT32_T porting_debug_get_output(PORT_DBG_OUTPUT_MODE_T *param)
{
	stb_printf("[%s](in)\n",__FUNCTION__);
	*param = PORT_DBG_OUTPUT_SERIAL;
	stb_printf("[%s](out)\n",__FUNCTION__);
	return IPANEL_OK;
}

/********************************************************************************************************
功能:
	输出调试信息。 
	是否输出及输出的实际内容,需要根据各参数进行组合判断。 
原型:
	INT32_T porting_debug_get_output(PORT_DBG_OUTPUT_MODE_T *param)
参数说明:
	输入参数:
		id:       模块编号
		level:    本次输出的打印级别
		fil:      打印信息所在文件
		line :    打印信息所在行数
		function :打印信息所在函数
		fmt :     格式化字符串。参数说明参照标准的printf函数
	输出参数:
		>0:        实际输出的字符数
返    回:
	IPANEL_OK:    不符合打印级别设置,不做实际输出
	IPANEL_ERR:   函数异常
********************************************************************************************************/
INT32_T porting_debug_output(PORT_DBG_MODULE_T id,PORT_DBG_LEVEL_T  level, const CHAR_T *file, INT32_T line, const CHAR_T *function, const CHAR_T *fmt,...)
{	
	INT32_T ret = 0;
	char *ptr ;
	UINT32_T wlen = 0;
	if((level < PORT_DBG_VERB)||(level > PORT_DBG_FATAL))
	{
		stb_printf("[%s] cannot match the level %d\n",__FUNCTION__,level);
		goto LAB_ERR;
	}	
	m_debug_mgr->porting_debug_out = 1;
	if ( 0 == m_debug_mgr->porting_debug_out ) 
	{
		goto LAB_OK;
	}

	INT32_T mlevel = -2;
  	ret = porting_debug_get_level(id,&mlevel);
	if(mlevel > level)
	{
		/* 当前输出级别小于该模块允许输出的级别,不输出任何信息,直接返回。						  */
		goto LAB_OK;
	}

	/* 组织打印语句内容*/
	ptr = m_debug_mgr->msg;
	
	char msg[MSG_LEN_MAX]={0};
	ptr = msg;
	unsigned int buflen = sizeof (msg); 
	switch(level)
	{ 
		/*打印语句的输出级别信息添加*/
		case 0:
			wlen = sprintf(ptr,"[V]");
			break;
		case 1:
			wlen = sprintf(ptr,"[I]");
			break;
		case 2:
			wlen = sprintf(ptr,"[W]");
			break;
		case 3:
			wlen = sprintf(ptr,"[F]");
			break;
		case 4:
			wlen = sprintf(ptr,"[ERROR]");
			break;
		case 5:	
			wlen = sprintf(ptr,"[FATAL]");
			break;
		default:
			ret = -1;
			goto LAB_ERR;
			break;
	}
	/*打印语句的输出级别信息添加*/


	ptr += wlen;
	buflen -= wlen;

	wlen = 0;
	if(file == NULL)
	{ 
		/*打印语句所在文件名和文件中的行数信息添加*/
		if(line > 0)
		{
			wlen = sprintf(ptr,"[%d]",line);
		}
	}
	else
	{
		if(line > 0)
		{
			wlen = sprintf(ptr,"[%s:%d]",file,line);
		}
		else
		{
			wlen = sprintf(ptr,"[%s]",file);
		}
	}
	ptr += wlen;
	buflen -= wlen;

	if(function != NULL)
	{ 
		/*打印语句所在函数信息添加*/
		wlen = sprintf(ptr,"[%s]",function);
		ptr += wlen;
		buflen -= wlen;
	}	

    S8  *args;
    U32         len = 0;
    ck_va_start(args, fmt);
    len   = ck_vsnprintf(ptr,buflen , fmt, args);
	*(ptr+len)='\n';
    ck_va_end(args);
  //  GXUART_Printf(UART1, msg, len+MSG_LEN_MAX-buflen);   
 // GXUART_Printf(UART1,"%s","%...%....")
	  GXUART_Printf(UART1, "%s",msg);   
     return (len+MSG_LEN_MAX-buflen); 
	//return ret;
LAB_OK:
	return IPANEL_OK;
LAB_ERR:	
	return IPANEL_ERR;
}


/********************************************************************************************************
功能:
	检测各模块打印级别
原型:
	void porting_debug_check_all_debug_status(void)
参数说明:
	输入参数:
	输出参数:
返    回:
********************************************************************************************************/
#ifdef PORTING_DEBUG_ON
void porting_debug_check_all_debug_status(void)
{
	int i = 0;
	int lv = 0;
	char str[32] = {0};
	porting_info(PORT_MODULE_DBG, "(in)");
	
	for (i=0; i<PORT_MODULE_OTHER; i++)
	{
		porting_debug_get_level(i, &lv);
		sprintf(str, "%s %d", "debug lv:", lv);
		debug_printf_module_name(i, str);
	}

	porting_info(PORT_MODULE_DBG, "(out)");
	return;
}
#endif

/********************************************************************************************************
功能:
	检测各模块初始化状态
原型:
	void porting_debug_check_all_init_status(IPANEL_UINT64_T *status)
参数说明:
	输入参数: 
		status : 初始化状态
	输出参数:
返    回:
********************************************************************************************************/
void porting_debug_check_all_init_status(IPANEL_UINT64_T *status)
{
	int i = 0;
	char *str = "UnInit";
	porting_info(PORT_MODULE_DBG, "(in)");
	porting_info(PORT_MODULE_DBG,"uint64_32h:0x%08x, uint64_32l:0x%08x\n", status->uint64_32h, status->uint64_32l);
	/*检测前32个模块的初始化状态*/
	for (i=0; i<32; i++)
	{
		if (status->uint64_32l & ((unsigned int)0x1<<i))	
			continue;
		else
		{
			debug_printf_module_name(i+1, str);
		}
	}
	/*检测后32个模块的初始化状态*/
	for (i=0; i<32; i++)
	{
		if (status->uint64_32h & ((unsigned int)0x1<<i))	
			continue;
		else
		{
			debug_printf_module_name(i+1+32, str);
		}
	}
	porting_info(PORT_MODULE_DBG, "(out)");
	return;
}

/********************************************************************************************************
功能:
	检测各模块退出状态
原型:
	void porting_debug_check_all_exit_status(IPANEL_UINT64_T *status)
参数说明:
	输入参数: 
		status : 退出状态
	输出参数:
返    回:
********************************************************************************************************/
void porting_debug_check_all_exit_status(IPANEL_UINT64_T *status)
{
	int i = 0;
	char *str = "UnExit";
	porting_info(PORT_MODULE_DBG, "(in)");
	porting_info(PORT_MODULE_DBG,"uint64_32h:0x%08x, uint64_32l:0x%08x\n", status->uint64_32h, status->uint64_32l);
	/*检测前32个模块的退出状态*/
	for (i=0; i<32; i++)
	{
		if (!(status->uint64_32l & ((unsigned int)0x1<<i)))
			continue;
		else
		{
			debug_printf_module_name(i+1, str);
		}
	}
	/*检测后32个模块的退出状态*/
	for (i=0; i<32; i++)
	{
		if (!(status->uint64_32h & ((unsigned int)0x1<<i)))
			continue;
		else
		{
			debug_printf_module_name(i+1+32, str);
		}
	}
	porting_info(PORT_MODULE_DBG, "(out)");
	return;
}

/********************************************************************************************************
功能:
	重定向键值访问页面
原型:
	void porting_debug_check_all_exit_status(IPANEL_UINT64_T *status)
参数说明:
	输入参数: 
		status : 退出状态
	输出参数:
返    回:
********************************************************************************************************/
INT32_T porting_debug_check_dgb_key(void *handle, IPANEL_QUEUE_MESSAGE *event_msg)
{
	porting_info(PORT_MODULE_DBG, "(in)");
	if ( 1 == m_debug_mgr->dbg_flag )
	{
		/*按键控制,用于调试*/
		
		/*  测试用的URL
			杭州 新URL
		ipanel_open_uri(handle,"http://218.108.130.169/ipanelTest/"); 		
			测试PCM的URL 	
		ipanel_open_uri(handle,"http://192.168.10.222/suite/jvm/JVM/index.htm"); 
			公司内网的URL 
		ipanel_open_uri(handle,"http://172.16.252.163/resease_2D_Meta/index.htm");  
		*/
		/*绿键 调试的内容*/
		if (EIS_IRKEY_GREEN == event_msg->q2ndWordOfMsg && EIS_EVENT_TYPE_KEYDOWN == event_msg->q1stWordOfMsg)
		{
			/*可以在此添加按 绿键 调试的内容,例如按绿键打印 hello world*/
			printf("hello world! \n");
		}
		/*红键 调试的内容*/
		if (EIS_IRKEY_YELLOW == event_msg->q2ndWordOfMsg && EIS_EVENT_TYPE_KEYDOWN == event_msg->q1stWordOfMsg)
		{
			/*可以在此添加按 黄键 调试的内容,例如按黄键打印 hello world*/
			printf("hello world! \n");
		}
		/*数字键 2 调试的内容*/
		if (EIS_IRKEY_NUM2 == event_msg->q2ndWordOfMsg && EIS_EVENT_TYPE_KEYDOWN == event_msg->q1stWordOfMsg)
		{
			/*用于开关中间件打印,只在中间件打印放开的情况下起作用 */
			if (m_debug_mgr->mid_debug_out) m_debug_mgr->mid_debug_out = 0;
			else m_debug_mgr->mid_debug_out = 1;
			porting_base_set_mid_debug_flag(m_debug_mgr->mid_debug_out);
			porting_info(PORT_MODULE_DBG, "m_debug_mgr->mid_debug_out:%d", m_debug_mgr->mid_debug_out);
		}
		/*数字键 3 调试的内容*/
		if (EIS_IRKEY_NUM3 == event_msg->q2ndWordOfMsg && EIS_EVENT_TYPE_KEYDOWN == event_msg->q1stWordOfMsg)
		{
			/*用于开关porting打印*/
			if (m_debug_mgr->porting_debug_out) m_debug_mgr->porting_debug_out = 0;
			else m_debug_mgr->porting_debug_out = 1;
			porting_info(PORT_MODULE_DBG, "m_debug_mgr->porting_debug_out:%d", m_debug_mgr->porting_debug_out);
		}
	}
	porting_info(PORT_MODULE_DBG, "(out)");
	return 0;
}

/********************************************************************************************************
功能:
	键值重定向
	打开重定向密码数字键1001
	关闭重定向密码数字键0110
原型:
	int porting_debug_check_dbg_passwd(IPANEL_QUEUE_MESSAGE *event_msg)
参数说明:
	输入参数: 
		event_msg : 键值信息
	输出参数:
返    回:
********************************************************************************************************/
int porting_debug_check_dbg_passwd(IPANEL_QUEUE_MESSAGE *event_msg)
{
	porting_info(PORT_MODULE_DBG, "(in)");
	if (EIS_EVENT_TYPE_KEYDOWN == event_msg->q1stWordOfMsg
		/*|| EIS_EVENT_TYPE_IRKEY == event_msg->q1stWordOfMsg*/)
	{
		if ( 0 == m_debug_mgr->dbg_flag )
		{
			/*1001 开启密码*/
			if (EIS_IRKEY_NUM1 == event_msg->q2ndWordOfMsg 
				&& !m_debug_mgr->dbg_open[1]
				&& !m_debug_mgr->dbg_open[2]
				&& !m_debug_mgr->dbg_open[3])
			{
				m_debug_mgr->dbg_open[0] = 1;
				printf("open passwd 1\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM0 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_open[0]
				&& !m_debug_mgr->dbg_open[1]
				&& !m_debug_mgr->dbg_open[2]
				&& !m_debug_mgr->dbg_open[3])
			{
				m_debug_mgr->dbg_open[1] = 1;
				printf("open passwd 2\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM0 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_open[0]
				&& m_debug_mgr->dbg_open[1]
				&& !m_debug_mgr->dbg_open[2]
				&& !m_debug_mgr->dbg_open[3])
			{
				m_debug_mgr->dbg_open[2] = 1;
				printf("open passwd 3\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM1 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_open[0]
				&& m_debug_mgr->dbg_open[1]
				&& m_debug_mgr->dbg_open[2]
				&& !m_debug_mgr->dbg_open[3])
			{
				m_debug_mgr->dbg_open[3] = 1;
				m_debug_mgr->dbg_flag = 1;
				printf("open passwd 4 m_debug_mgr->dbg_flag = 1\n");
				goto LAB_OK;
			}
		}

		if (1 == m_debug_mgr->dbg_flag )
		{
			/*0110 关闭密码*/
			if (EIS_IRKEY_NUM0 == event_msg->q2ndWordOfMsg 
				&& !m_debug_mgr->dbg_close[1]
				&& !m_debug_mgr->dbg_close[2]
				&& !m_debug_mgr->dbg_close[3])
			{
				m_debug_mgr->dbg_close[0] = 1;
				printf("close passwd 1\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM1 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_close[0]
				&& !m_debug_mgr->dbg_close[1]
				&& !m_debug_mgr->dbg_close[2]
				&& !m_debug_mgr->dbg_close[3])
			{
				m_debug_mgr->dbg_close[1] = 1;
				printf("close passwd 2\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM1 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_close[0]
				&& m_debug_mgr->dbg_close[1]
				&& !m_debug_mgr->dbg_close[2]
				&& !m_debug_mgr->dbg_close[3])
			{
				m_debug_mgr->dbg_close[2] = 1;
				printf("close passwd 3\n");
				goto LAB_NEXT;
			}
			else if (EIS_IRKEY_NUM0 == event_msg->q2ndWordOfMsg 
				&& m_debug_mgr->dbg_close[0]
				&& m_debug_mgr->dbg_close[1]
				&& m_debug_mgr->dbg_close[2]
				&& !m_debug_mgr->dbg_close[3])
			{
				m_debug_mgr->dbg_close[3] = 1;
				m_debug_mgr->dbg_flag = 0;
				printf("close passwd 4 m_debug_mgr->dbg_flag = 0\n");
				goto LAB_OK;
			}
		}
	LAB_OK:
		m_debug_mgr->dbg_open[0] = 0;
		m_debug_mgr->dbg_open[1] = 0;	
		m_debug_mgr->dbg_open[2] = 0;	
		m_debug_mgr->dbg_open[3] = 0;
		m_debug_mgr->dbg_close[0] = 0;
		m_debug_mgr->dbg_close[1] = 0;	
		m_debug_mgr->dbg_close[2] = 0;	
		m_debug_mgr->dbg_close[3] = 0;
	}
	porting_info(PORT_MODULE_DBG, "(out)");
	return 0;
LAB_NEXT:
	porting_info(PORT_MODULE_DBG, "(out)");
	return 0;

}


/********************************************************************************************************
 *                                        Local Functions                                               *
 ********************************************************************************************************/
/********************************************************************************************************
功能:
	设置默认打印级别
原型:
	static void debug_config_set_default(void)
参数说明:
	输入参数: 
	输出参数:
返    回:
********************************************************************************************************/
static void debug_config_set_default(void)
{

	INT32_T i;
	stb_printf("[%s](in)\n",__FUNCTION__);
	
	m_debug_mgr->debug_config[0].m_level = (CHAR_T)PORT_DBG_NONE;
	m_debug_mgr->debugLevel = PORT_DBG_WARN;
	
	for(i = 1;i < PORT_DBG_MODULE_MAX;i++)
	{
		m_debug_mgr->debug_config[i].m_level = (CHAR_T)PORT_DBG_NONE;
	}	
	stb_printf("[%s](out)\n",__FUNCTION__);
	return;
}

/********************************************************************************************************
功能:
	打印各模块名字
原型:
	static void debug_printf_module_name(int id, char *str)
参数说明:
	输入参数: 
		id :           模块id
	输出参数:
		str :          输出信息
返    回:
********************************************************************************************************/
//#define printf stb_printf
static void debug_printf_module_name(int id, char *str)
{
	porting_info(PORT_MODULE_DBG, "(in)");
	switch (id)
	{
		case PORT_MODULE_ADEC        : stb_printf("ADEC        %s\n", str); break;
		case PORT_MODULE_AOUT        : stb_printf("AOUT        %s\n", str); break;
		case PORT_MODULE_APP         : stb_printf("APP         %s\n", str); break;
		case PORT_MODULE_AVM         : stb_printf("AVM         %s\n", str); break;
		case PORT_MODULE_BASE        : stb_printf("BASE        %s\n", str); break;
		case PORT_MODULE_CURSOR      : stb_printf("CURSOR      %s\n", str); break;
		case PORT_MODULE_COMMON      : stb_printf("COMMON      %s\n", str); break;
		case PORT_MODULE_DBG         : stb_printf("DBG         %s\n", str); break;
		case PORT_MODULE_DEVICE      : stb_printf("DEVICE      %s\n", str); break;
		case PORT_MODULE_DEMUX       : stb_printf("DEMUX       %s\n", str); break;
		case PORT_MODULE_DSM         : stb_printf("DSM         %s\n", str); break;
		case PORT_MODULE_EEPROM      : stb_printf("EEPROM      %s\n", str); break;
		case PORT_MODULE_EVENT       : stb_printf("EVENT       %s\n", str); break;
		case PORT_MODULE_FPANEL      : stb_printf("FPANEL      %s\n", str); break;
		case PORT_MODULE_FILE        : stb_printf("FILE        %s\n", str); break;
		case PORT_MODULE_GFX         : stb_printf("GFX         %s\n", str); break;
		case PORT_MODULE_JOYPAD      : stb_printf("JOYPAD      %s\n", str); break;
		case PORT_MODULE_KEYBORD     : stb_printf("KEYBORD     %s\n", str); break;
		case PORT_MODULE_HDMI        : stb_printf("HDMI        %s\n", str); break;
		case PORT_MODULE_INPUT       : stb_printf("INPUT       %s\n", str); break;
		case PORT_MODULE_MEDIA       : stb_printf("MEDIA       %s\n", str); break;
		case PORT_MODULE_MP          : stb_printf("MP          %s\n", str); break;
		case PORT_MODULE_MIC         : stb_printf("MIC         %s\n", str); break;
		case PORT_MODULE_MAIN        : stb_printf("MAIN        %s\n", str); break;
		case PORT_MODULE_NET         : stb_printf("NET         %s\n", str); break;
		case PORT_MODULE_NVRAM       : stb_printf("NVRAM       %s\n", str); break;
		case PORT_MODULE_OS          : stb_printf("OS          %s\n", str); break;
		case PORT_MODULE_OSFILE      : stb_printf("OSFILE      %s\n", str); break;
		case PORT_MODULE_SOUND       : stb_printf("SOUND       %s\n", str); break;
		case PORT_MODULE_PVR         : stb_printf("PVR         %s\n", str); break;
		case PORT_MODULE_RF          : stb_printf("RF          %s\n", str); break;
		case PORT_MODULE_SMC         : stb_printf("SMC         %s\n", str); break;
		case PORT_MODULE_SOCKET      : stb_printf("SOCKET      %s\n", str); break;
		case PORT_MODULE_STORG       : stb_printf("STORG       %s\n", str); break;
		case PORT_MODULE_TUNER       : stb_printf("TUNER       %s\n", str); break;
		case PORT_MODULE_UART        : stb_printf("UART        %s\n", str); break;
		case PORT_MODULE_UPGRADE     : stb_printf("UPGRADE     %s\n", str); break;
		case PORT_MODULE_VDEC        : stb_printf("VDEC        %s\n", str); break;
		case PORT_MODULE_VOUT        : stb_printf("VOUT        %s\n", str); break;
		case PORT_MODULE_FLASH_PLAYER: stb_printf("FLASH_PLAYER%s\n", str); break;
		case PORT_MODULE_STARTAPP    : stb_printf("STARTAPP    %s\n", str); break;
		case PORT_MODULE_CDROM       : stb_printf("CDROM       %s\n", str); break;
		default:
			break;
	}
	porting_info(PORT_MODULE_DBG, "(out)");
	return;
}


/* EOF */




深圳茁壮IPANEL浏览器中间件 debug模块移植参考,打印分级等功能,可以移到其他嵌入式系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空胆好小

您的鼓励已签收,我会继续快马加

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值