1 /* --------------------------------------------------------------------------------------------------------
\r
2 * File: custom_log.h
\r
4 * Desc: ChenZhen 偏好的 log 输出的定制实现.
\r
6 * -----------------------------------------------------------------------------------
\r
9 * -----------------------------------------------------------------------------------
\r
16 * --------------------------------------------------------------------------------------------------------
\r
19 * --------------------------------------------------------------------------------------------------------
\r
21 ----Fri Nov 19 15:20:28 2010 v1.0
\r
23 * --------------------------------------------------------------------------------------------------------
\r
27 #ifndef __CUSTOM_LOG_H__
\r
28 #define __CUSTOM_LOG_H__
\r
34 /* ---------------------------------------------------------------------------------------------------------
\r
36 * ---------------------------------------------------------------------------------------------------------
\r
38 #include <linux/kernel.h>
\r
41 /* ---------------------------------------------------------------------------------------------------------
\r
42 * Macros Definition
\r
43 * ---------------------------------------------------------------------------------------------------------
\r
46 /** 若下列 macro 有被定义, 才 使能 log 输出. */
\r
47 // #define ENABLE_DEBUG_LOG
\r
49 /** .! : 若需要全局地关闭 D log, 可以使能下面的代码. */
\r
51 #undef ENABLE_DEBUG_LOG
\r
52 #warning "custom debug log is disabled globally!"
\r
55 #define LOGD(fmt, args...) \
\r
56 printk(KERN_DEBUG fmt "\n", ## args)
\r
58 /*---------------------------------------------------------------------------*/
\r
60 #ifdef ENABLE_VERBOSE_LOG
\r
62 #define V(fmt, args...) \
\r
63 { printk(KERN_DEBUG "V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }
\r
65 #define V(...) ((void)0)
\r
69 #ifdef ENABLE_DEBUG_LOG
\r
71 #define D(fmt, args...) \
\r
72 { printk(KERN_DEBUG "D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }
\r
74 #define D(...) ((void)0)
\r
77 #define I(fmt, args...) \
\r
78 { printk(KERN_INFO "I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }
\r
80 #define W(fmt, args...) \
\r
81 { printk(KERN_WARNING "W : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }
\r
83 #define E(fmt, args...) \
\r
84 { printk(KERN_ERR "E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }
\r
86 /*-------------------------------------------------------*/
\r
88 /** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */
\r
89 #define D_DEC(var) D(#var " = %d.", var);
\r
91 #define E_DEC(var) E(#var " = %d.", var);
\r
93 /** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */
\r
94 #define D_HEX(var) D(#var " = 0x%x.", var);
\r
96 #define E_HEX(var) E(#var " = 0x%x.", var);
\r
98 /** 使用 D(), 以十六进制的形式 打印指针类型变量 'ptr' 的 value. */
\r
99 #define D_PTR(ptr) D(#ptr " = %p.", ptr);
\r
101 #define E_PTR(ptr) E(#ptr " = %p.", ptr);
\r
103 /** 使用 D(), 打印 char 字串. */
\r
104 #define D_STR(pStr) \
\r
106 if ( NULL == pStr )\
\r
108 D(#pStr" = NULL.");\
\r
112 D(#pStr" = '%s'.", pStr);\
\r
116 #define E_STR(pStr) \
\r
118 if ( NULL == pStr )\
\r
120 E(#pStr" = NULL.");\
\r
124 E(#pStr" = '%s'.", pStr);\
\r
128 #ifdef ENABLE_DEBUG_LOG
\r
130 * log 从 'pStart' 地址开始的 'len' 个字节的数据.
\r
132 #define D_MEM(pStart, len) \
\r
135 char* p = (char*)pStart;\
\r
136 D("dump memory from addr of '" #pStart "', from %p, length %d' : ", pStart, len); \
\r
138 for ( i = 0; i < len ; i++ )\
\r
140 printk("0x%02x, ", p[i] );\
\r
145 #define D_MEM(...) ((void)0)
\r
148 /*-------------------------------------------------------*/
\r
150 #define EXIT_FOR_DEBUG \
\r
152 E("To exit for debug.");\
\r
156 /*-------------------------------------------------------*/
\r
159 * 调用函数, 并检查返回值, 根据返回值决定是否跳转到指定的错误处理代码.
\r
160 * @param functionCall
\r
161 * 对特定函数的调用, 该函数的返回值必须是 表征 成功 or err 的 整型数.
\r
162 * 这里, 被调用函数 "必须" 是被定义为 "返回 0 表示操作成功".
\r
164 * 用于记录函数返回的 error code 的 整型变量, 通常是 "ret" or "result" 等.
\r
166 * 若函数返回错误, 程序将要跳转到的 错误处理处的 标号, 通常就是 "EXIT".
\r
168 #define CHECK_FUNC_CALL(functionCall, result, label) \
\r
170 if ( 0 != ( (result) = (functionCall) ) )\
\r
172 E("Function call returned error : " #result " = %d.", result);\
\r
178 * 在特定条件下, 判定 error 发生, 对变量 'retVar' 设置 'errCode',
\r
179 * Log 输出对应的 Error Caution, 然后跳转 'label' 指定的代码处执行.
\r
183 * 标识函数执行状态或者结果的变量, 将被设置具体的 Error Code.
\r
184 * 通常是 'ret' or 'result'.
\r
186 * 表征特定 error 的常数标识, 通常是 宏的形态.
\r
188 * 程序将要跳转到的错误处理代码的标号, 通常就是 'EXIT'.
\r
190 * 对应 'msgFmt' 实参中 '%s', '%d', ... 等 转换说明符 的具体可变长实参.
\r
192 #define SET_ERROR_AND_JUMP(msgFmt, retVar, errCode, label, args...) \
\r
194 E("To set '" #retVar "' to %d('" #errCode "'), because : " msgFmt, (errCode), ## args);\
\r
195 (retVar) = (errCode);\
\r
200 /* ---------------------------------------------------------------------------------------------------------
\r
201 * Types and Structures Definition
\r
202 * ---------------------------------------------------------------------------------------------------------
\r
206 /* ---------------------------------------------------------------------------------------------------------
\r
207 * Global Functions' Prototype
\r
208 * ---------------------------------------------------------------------------------------------------------
\r
212 /* ---------------------------------------------------------------------------------------------------------
\r
213 * Inline Functions Implementation
\r
214 * ---------------------------------------------------------------------------------------------------------
\r
221 #endif /* __CUSTOM_LOG_H__ */
\r