/* * (C) COPYRIGHT RockChip Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software * Foundation, and any use by you of this program is subject to the terms * of such GNU licence. */ #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__ */