1 /* ----------------------------------------------------------------------------
4 * Desc: ChenZhen 偏好的 log 输出的定制实现.
6 * --------------------------------------------------------------------
9 * --------------------------------------------------------------------
16 * ----------------------------------------------------------------------------
19 * ----------------------------------------------------------------------------
21 ----Fri Nov 19 15:20:28 2010 v1.0
23 * ----------------------------------------------------------------------------
26 #ifndef __CUSTOM_LOG_H__
27 #define __CUSTOM_LOG_H__
33 /* -----------------------------------------------------------------------------
35 * -----------------------------------------------------------------------------
37 #include <linux/kernel.h>
38 #include <linux/printk.h>
40 /* -----------------------------------------------------------------------------
42 * -----------------------------------------------------------------------------
45 /** 若下列 macro 有被定义, 才 使能 log 输出. */
46 /* #define ENABLE_DEBUG_LOG */
48 /*----------------------------------------------------------------------------*/
50 #ifdef ENABLE_VERBOSE_LOG
52 #define V(fmt, args...) \
53 pr_debug("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
60 #define V(...) ((void)0)
63 #ifdef ENABLE_DEBUG_LOG
65 #define D(fmt, args...) \
66 pr_debug("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
73 #define D(...) ((void)0)
76 #define I(fmt, args...) \
77 pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
84 #define W(fmt, args...) \
85 pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \
92 #define E(fmt, args...) \
93 pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
100 /*-------------------------------------------------------*/
102 /** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */
103 #define D_DEC(var) D(#var " = %d.", var)
105 #define E_DEC(var) E(#var " = %d.", var)
107 /** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */
108 #define D_HEX(var) D(#var " = 0x%x.", var)
110 #define E_HEX(var) E(#var " = 0x%x.", var)
114 * 打印指针类型变量 'ptr' 的 value.
116 #define D_PTR(ptr) D(#ptr " = %p.", ptr)
118 #define E_PTR(ptr) E(#ptr " = %p.", ptr)
120 /** 使用 D(), 打印 char 字串. */
121 #define D_STR(p_str) \
124 D(#p_str" = NULL."); \
126 D(#p_str" = '%s'.", p_str); \
129 #define E_STR(p_str) \
132 E(#p_str" = NULL."); \
134 E(#p_str" = '%s'.", p_str); \
137 #ifdef ENABLE_DEBUG_LOG
139 * log 从 'p_start' 地址开始的 'len' 个字节的数据.
141 #define D_MEM(p_start, len) \
144 char *p = (char *)(p_start); \
145 D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \
149 for (i = 0; i < (len); i++) \
150 pr_debug("0x%02x, ", p[i]); \
154 #define D_MEM(...) ((void)0)
157 /*-------------------------------------------------------*/
160 * 在特定条件下, 判定 error 发生,
161 * 将变量 'ret_var' 设置 'err_code',
162 * log 输出对应的 Error Caution,
163 * 然后跳转 'label' 指定的代码处执行.
168 * 将被设置具体的 Error Code.
169 * 通常是 'ret' or 'result'.
178 * '%s', '%d', ... 等转换说明符的具体可变长实参.
180 #define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \
182 E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \
185 (ret_var) = (err_code); \
189 /* -----------------------------------------------------------------------------
190 * Types and Structures Definition
191 * -----------------------------------------------------------------------------
194 /* -----------------------------------------------------------------------------
195 * Global Functions' Prototype
196 * -----------------------------------------------------------------------------
199 /* -----------------------------------------------------------------------------
200 * Inline Functions Implementation
201 * -----------------------------------------------------------------------------
208 #endif /* __CUSTOM_LOG_H__ */