hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/* SPDX-License-Identifier: GPL-2.0 */
/*  ----------------------------------------------------------------------------
 *  File:   custom_log.h
 *
 *  Desc:   ChenZhen 偏好的 log 输出的定制实现.
 *
 *          --------------------------------------------------------------------
 *          < 习语 和 缩略语 > :
 *
 *          --------------------------------------------------------------------
 *  Usage:
 *
 *  Note:
 *
 *  Author: ChenZhen
 *
 *  ----------------------------------------------------------------------------
 *  Version:
 *          v1.0
 *  ----------------------------------------------------------------------------
 *  Log:
   ----Fri Nov 19 15:20:28 2010            v1.0
 *
 *  ----------------------------------------------------------------------------
 */
 
#ifndef __CUSTOM_LOG_H__
#define __CUSTOM_LOG_H__
 
#ifdef __cplusplus
extern "C" {
#endif
 
/* -----------------------------------------------------------------------------
 *  Include Files
 * -----------------------------------------------------------------------------
 */
#include <linux/kernel.h>
#include <linux/printk.h>
 
/* -----------------------------------------------------------------------------
 *  Macros Definition
 * -----------------------------------------------------------------------------
 */
 
/** 若下列 macro 有被定义, 才 使能 log 输出. */
/* #define ENABLE_DEBUG_LOG */
 
/*----------------------------------------------------------------------------*/
 
#ifdef ENABLE_VERBOSE_LOG
/** Verbose log. */
#define V(fmt, args...) \
   pr_debug("V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
           "\n",    \
       __FILE__,    \
       __LINE__,    \
       __func__,    \
       ## args)
#else
#define  V(...)  ((void)0)
#endif
 
#ifdef ENABLE_DEBUG_LOG
/** Debug log. */
#define D(fmt, args...) \
   pr_info("D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
           "\n",    \
       __FILE__,    \
       __LINE__,    \
       __func__,    \
       ## args)
#else
#define  D(...)  ((void)0)
#endif
 
#define I(fmt, args...) \
   pr_info("I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
           "\n", \
       __FILE__, \
       __LINE__, \
       __func__, \
       ## args)
 
#define W(fmt, args...) \
   pr_warn("W : [File] : %s; [Line] : %d; [Func] : %s(); " \
           fmt "\n", \
       __FILE__, \
       __LINE__, \
       __func__, \
       ## args)
 
#define E(fmt, args...) \
   pr_err("E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt \
           "\n", \
       __FILE__, \
       __LINE__, \
       __func__, \
       ## args)
 
/*-------------------------------------------------------*/
 
/** 使用 D(), 以十进制的形式打印变量 'var' 的 value. */
#define D_DEC(var)  D(#var " = %d.", var)
 
#define E_DEC(var)  E(#var " = %d.", var)
 
/** 使用 D(), 以十六进制的形式打印变量 'var' 的 value. */
#define D_HEX(var)  D(#var " = 0x%x.", var)
 
#define E_HEX(var)  E(#var " = 0x%x.", var)
 
/**
 * 使用 D(), 以十六进制的形式,
 * 打印指针类型变量 'ptr' 的 value.
 */
#define D_PTR(ptr)  D(#ptr " = %p.", ptr)
 
#define E_PTR(ptr)  E(#ptr " = %p.", ptr)
 
/** 使用 D(), 打印 char 字串. */
#define D_STR(p_str) \
do { \
   if (!p_str) { \
       D(#p_str " = NULL."); \
   else \
       D(#p_str " = '%s'.", p_str); \
} while (0)
 
#define E_STR(p_str) \
do { \
   if (!p_str) \
       E(#p_str " = NULL."); \
   else \
       E(#p_str " = '%s'.", p_str); \
} while (0)
 
#ifdef ENABLE_DEBUG_LOG
/**
 * log 从 'p_start' 地址开始的 'len' 个字节的数据.
 */
#define D_MEM(p_start, len) \
do { \
   int i = 0; \
   char *p = (char *)(p_start); \
   D("dump memory from addr of '" #p_start "', from %p, length %d' : ", \
       (p_start), \
       (len)); \
   pr_debug("\t\t"); \
   for (i = 0; i < (len); i++) \
       pr_debug("0x%02x, ", p[i]); \
   pr_debug("\n"); \
} while (0)
#else
#define  D_MEM(...)  ((void)0)
#endif
 
/*-------------------------------------------------------*/
 
/**
 * 在特定条件下, 判定 error 发生,
 * 将变量 'ret_var' 设置 'err_code',
 * log 输出对应的 Error Caution,
 * 然后跳转 'label' 指定的代码处执行.
 * @param msg
 *    纯字串形式的提示信息.
 * @param ret_var
 *    标识函数执行状态或者结果的变量,
 *    将被设置具体的 Error Code.
 *    通常是 'ret' or 'result'.
 * @param err_code
 *    表征特定 error 的常数标识,
 *    通常是 宏的形态.
 * @param label
 *      程序将要跳转到的错误处理代码的标号,
 *      通常就是 'EXIT'.
 * @param args...
 *      对应 'msg_fmt' 实参中,
 *      '%s', '%d', ... 等转换说明符的具体可变长实参.
 */
#define SET_ERROR_AND_JUMP(msg_fmt, ret_var, err_code, label, args...) \
do { \
   E("To set '" #ret_var "' to %d('" #err_code "'), because : " msg_fmt, \
       (err_code), \
       ## args); \
   (ret_var) = (err_code); \
   goto label; \
} while (0)
 
/* -----------------------------------------------------------------------------
 *  Types and Structures Definition
 * -----------------------------------------------------------------------------
 */
 
/* -----------------------------------------------------------------------------
 *  Global Functions' Prototype
 * -----------------------------------------------------------------------------
 */
 
/* -----------------------------------------------------------------------------
 *  Inline Functions Implementation
 * -----------------------------------------------------------------------------
 */
 
#ifdef __cplusplus
}
#endif
 
#endif /* __CUSTOM_LOG_H__ */