1 /* ----------------------------------------------------------------------------
4 * Desc: ChenZhen 偏好的 log 输出的定制实现.
6 * --------------------------------------------------------------------
9 * --------------------------------------------------------------------
16 * ----------------------------------------------------------------------------
19 * ----------------------------------------------------------------------------
21 ----Fri Nov 19 15:20:28 2010 v1.0
23 * ----------------------------------------------------------------------------
27 #ifndef __CUSTOM_LOG_H__
28 #define __CUSTOM_LOG_H__
34 /* -----------------------------------------------------------------------------
36 * -----------------------------------------------------------------------------
38 #include <linux/kernel.h>
39 #include <linux/printk.h>
42 /* -----------------------------------------------------------------------------
44 * -----------------------------------------------------------------------------
47 /** 若下列 macro 有被定义, 才 使能 log 输出. */
48 /* #define ENABLE_DEBUG_LOG */
50 /** .! : 若需要全局地关闭 D log, 可以使能下面的代码. */
52 #undef ENABLE_DEBUG_LOG
53 #warning "custom debug log is disabled globally!"
56 /*----------------------------------------------------------------------------*/
58 #ifdef ENABLE_VERBOSE_LOG
60 #define V(fmt, args...) \
61 pr_info("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
68 #define V(...) ((void)0)
72 #ifdef ENABLE_DEBUG_LOG
74 #define D(fmt, args...) \
75 pr_info("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
82 #define D(...) ((void)0)
85 #define I(fmt, args...) \
86 pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
93 #define W(fmt, args...) \
94 pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \
101 #define E(fmt, args...) \
102 pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
109 /*-------------------------------------------------------*/
111 /** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */
112 #define D_DEC(var) D(#var " = %d.", var)
114 #define E_DEC(var) E(#var " = %d.", var)
116 /** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */
117 #define D_HEX(var) D(#var " = 0x%x.", var)
119 #define E_HEX(var) E(#var " = 0x%x.", var)
123 * 打印指针类型变量 'ptr' 的 value.
125 #define D_PTR(ptr) D(#ptr " = %p.", ptr)
127 #define E_PTR(ptr) E(#ptr " = %p.", ptr)
129 /** 使用 D(), 打印 char 字串. */
130 #define D_STR(p_str) \
132 if (NULL == p_str) { \
133 D(#p_str" = NULL."); \
135 D(#p_str" = '%s'.", p_str); \
138 #define E_STR(p_str) \
141 E(#p_str" = NULL."); \
143 E(#p_str" = '%s'.", p_str); \
146 #ifdef ENABLE_DEBUG_LOG
148 * log 从 'p_start' 地址开始的 'len' 个字节的数据.
150 #define D_MEM(p_start, len) \
153 char *p = (char *)(p_start); \
154 D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \
158 for (i = 0; i < (len); i++) \
159 pr_debug("0x%02x, ", p[i]); \
163 #define D_MEM(...) ((void)0)
166 /*-------------------------------------------------------*/
168 #define EXIT_FOR_DEBUG \
170 E("To exit for debug."); \
174 /*-------------------------------------------------------*/
177 * 调用函数, 并检查返回值, 根据返回值决定是否跳转到指定的错误处理代码.
180 * 该函数的返回值必须是 表征 成功 or err 的 整型数.
181 * 且被 "必须" 被定义为 "返回 0 表示操作成功".
183 * 用于记录函数返回的 error code 的 整型变量,
184 * 通常是 "ret" or "result" 等.
187 * 程序将要跳转到的 错误处理处的 标号,
190 #define CHECK_FUNC_CALL(func_call, result, label) \
192 (result) = (func_call) \
193 if (0 != (result)) { \
194 E("Function call returned error : " #result " = %d.", result); \
200 * 在特定条件下, 判定 error 发生, 对变量 'ret_var' 设置 'err_code',
201 * Log 输出对应的 Error Caution,
202 * 然后跳转 'label' 指定的代码处执行.
207 * 将被设置具体的 Error Code.
208 * 通常是 'ret' or 'result'.
217 * '%s', '%d', ... 等转换说明符的具体可变长实参.
219 #define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \
221 E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \
224 (ret_var) = (err_code); \
229 /* -----------------------------------------------------------------------------
230 * Types and Structures Definition
231 * -----------------------------------------------------------------------------
235 /* -----------------------------------------------------------------------------
236 * Global Functions' Prototype
237 * -----------------------------------------------------------------------------
241 /* -----------------------------------------------------------------------------
242 * Inline Functions Implementation
243 * -----------------------------------------------------------------------------
250 #endif /* __CUSTOM_LOG_H__ */