spbx/roms/srcs/images/ethernet/gianfar_eth/log.c

173 lines
3.3 KiB
C
Raw Permalink Normal View History

2019-03-11 00:13:23 +00:00
/** @file log.c
@brief ϵͳ<EFBFBD><EFBFBD>־<EFBFBD>ӿ<EFBFBD><EFBFBD>ļ<EFBFBD>
@details ʵ<EFBFBD>ֱ<EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@version 1.0.0
@author HuangXin
@date 2012-11-20
@copyright Synway
*/
#include <linux/slab.h>
#include <linux/time.h>
#include <linux/rtc.h>
#include "log.h"
#ifndef NULL
#define NULL (0)
#endif
#ifndef TRUE
#define TRUE (1)
#endif
#ifndef FALSE
#define FALSE (0)
#endif
static int g_iMinLevel = LOG_All;
/**
* @brief Log <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>ת<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
* @param level <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*/
static const char* LogLevelToStr(LOG_LEVEL level)
{
switch(level)
{
case LOG_Test:
return "T";
case LOG_Info:
return "I";
case LOG_Debug:
return "D";
case LOG_Warn:
return "W";
case LOG_Error:
return "E";
case LOG_Fatal:
return "F";
case LOG_Unknown:
return "U";
default:
return "U";
}
return "U";
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>Եȼ<EFBFBD>
* @param level <EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD>
* @param iEnable 1 <EFBFBD>򿪵<EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD>رյ<EFBFBD><EFBFBD>Եȼ<EFBFBD>
*/
void HD_EnableLogLevel(LOG_LEVEL level, int iEnable)
{
if(iEnable > 0)
{
g_iMinLevel |= level;
}
else
{
g_iMinLevel &= ~(level);
}
}
/**
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD> Log<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Log<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* @details <EFBFBD><EFBFBD> Log <EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եȼ<EFBFBD><EFBFBD>ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dt Log <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
*/
static void HD_LinuxPrintf(LOG_LEVEL level, struct tm* dt, const char* pMsg)
{
char* pDebugMsg = (char*)kmalloc(strlen(pMsg) + 64, GFP_KERNEL);
if(pDebugMsg == NULL)
{
printk("Log Malloc Memory Error\n");
printk("%s", pMsg);
return;
}
sprintf(pDebugMsg, "[%02d:%02d:%02d:%03d] [%s] %s",
dt->tm_hour, dt->tm_min, dt->tm_sec, dt->tm_yday,
LogLevelToStr(level), pMsg);
printk(pDebugMsg);
kfree(pDebugMsg);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* @details <EFBFBD><EFBFBD><EFBFBD><EFBFBD> \a cFlag <EFBFBD>ĵȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ \a pMsg
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void HD_PRINTF(LOG_LEVEL level, const char* pMsg)
{
struct timeval tv;
struct tm wtm;
do_gettimeofday(&tv);
time_to_tm(tv.tv_sec, 0, &wtm);
wtm.tm_yday = tv.tv_usec / 1000;
HD_LinuxPrintf(level, &wtm, pMsg);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* @param cFlag <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void HD_LOG(LOG_LEVEL level, const char* pMsg, ...)
{
__builtin_va_list arg_ptr;
int iMsgLen = 0;
char buf[512];
char* pMsgBuf = NULL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եȼ<D4B5>
if(!(g_iMinLevel & level))
{
return;
}
memset(buf, 0, sizeof(buf));
va_start(arg_ptr, pMsg);
iMsgLen = __builtin_vsnprintf(buf, sizeof(buf), pMsg, arg_ptr);
va_end(arg_ptr);
if(iMsgLen > sizeof(buf))
{
pMsgBuf = (char*)kmalloc(iMsgLen + 1, GFP_KERNEL);
if(pMsgBuf == NULL)
{
return;
}
va_start(arg_ptr, pMsg);
iMsgLen = __builtin_vsnprintf(pMsgBuf, iMsgLen + 1, pMsg, arg_ptr);
va_end(arg_ptr);
HD_PRINTF(level, pMsgBuf);
kfree(pMsgBuf);
}
else
{
HD_PRINTF(level, buf);
}
}