--- /dev/null
+/* --------------------------------------------------------------------------------------------------------\r
+ * File: custom_log.h \r
+ *\r
+ * Desc: ChenZhen Æ«ºÃµÄ log Êä³öµÄ¶¨ÖÆÊµÏÖ. \r
+ *\r
+ * -----------------------------------------------------------------------------------\r
+ * < ϰÓï ºÍ ËõÂÔÓï > : \r
+ *\r
+ * -----------------------------------------------------------------------------------\r
+ * Usage: \r
+ *\r
+ * Note:\r
+ *\r
+ * Author: ChenZhen\r
+ *\r
+ * --------------------------------------------------------------------------------------------------------\r
+ * Version:\r
+ * v1.0\r
+ * --------------------------------------------------------------------------------------------------------\r
+ * Log:\r
+ ----Fri Nov 19 15:20:28 2010 v1.0\r
+ * \r
+ * --------------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+#ifndef __CUSTOM_LOG_H__\r
+#define __CUSTOM_LOG_H__\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/* ---------------------------------------------------------------------------------------------------------\r
+ * Include Files\r
+ * ---------------------------------------------------------------------------------------------------------\r
+ */\r
+#include <linux/kernel.h>\r
+\r
+\r
+/* ---------------------------------------------------------------------------------------------------------\r
+ * Macros Definition \r
+ * ---------------------------------------------------------------------------------------------------------\r
+ */\r
+ \r
+/** ÈôÏÂÁÐ macro Óб»¶¨Òå, ²Å ʹÄÜ log Êä³ö. */\r
+// #define ENABLE_DEBUG_LOG\r
+\r
+/** .! : ÈôÐèҪȫ¾ÖµØ¹Ø±Õ D log, ¿ÉÒÔʹÄÜÏÂÃæµÄ´úÂë. */\r
+/*\r
+#undef ENABLE_DEBUG_LOG\r
+#warning "custom debug log is disabled globally!"\r
+*/\r
+\r
+#define LOGD(fmt, args...) \\r
+ printk(KERN_DEBUG fmt "\n", ## args)\r
+\r
+/*---------------------------------------------------------------------------*/\r
+ \r
+#ifdef ENABLE_VERBOSE_LOG\r
+/** Verbose log. */\r
+#define V(fmt, args...) \\r
+ { printk(KERN_DEBUG "V : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }\r
+#else\r
+#define V(...) ((void)0)\r
+#endif\r
+\r
+\r
+#ifdef ENABLE_DEBUG_LOG\r
+/** Debug log. */\r
+#define D(fmt, args...) \\r
+ { printk(KERN_DEBUG "D : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }\r
+#else\r
+#define D(...) ((void)0)\r
+#endif\r
+\r
+#define I(fmt, args...) \\r
+ { printk(KERN_INFO "I : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }\r
+\r
+#define W(fmt, args...) \\r
+ { printk(KERN_WARNING "W : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }\r
+\r
+#define E(fmt, args...) \\r
+ { printk(KERN_ERR "E : [File] : %s; [Line] : %d; [Func] : %s(); " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ## args); }\r
+\r
+/*-------------------------------------------------------*/\r
+\r
+/** ʹÓà D(), ÒÔÊ®½øÖƵÄÐÎʽ´òÓ¡±äÁ¿ 'var' µÄ value. */\r
+#define D_DEC(var) D(#var " = %d.", var);\r
+\r
+#define E_DEC(var) E(#var " = %d.", var);\r
+\r
+/** ʹÓà D(), ÒÔÊ®Áù½øÖƵÄÐÎʽ´òÓ¡±äÁ¿ 'var' µÄ value. */\r
+#define D_HEX(var) D(#var " = 0x%x.", var);\r
+\r
+#define E_HEX(var) E(#var " = 0x%x.", var);\r
+\r
+/** ʹÓà D(), ÒÔÊ®Áù½øÖƵÄÐÎʽ ´òÓ¡Ö¸ÕëÀàÐͱäÁ¿ 'ptr' µÄ value. */\r
+#define D_PTR(ptr) D(#ptr " = %p.", ptr);\r
+\r
+#define E_PTR(ptr) E(#ptr " = %p.", ptr);\r
+\r
+/** ʹÓà D(), ´òÓ¡ char ×Ö´®. */\r
+#define D_STR(pStr) \\r
+{\\r
+ if ( NULL == pStr )\\r
+ {\\r
+ D(#pStr" = NULL.");\\r
+ }\\r
+ else\\r
+ {\\r
+ D(#pStr" = '%s'.", pStr);\\r
+ }\\r
+}\r
+\r
+#define E_STR(pStr) \\r
+{\\r
+ if ( NULL == pStr )\\r
+ {\\r
+ E(#pStr" = NULL.");\\r
+ }\\r
+ else\\r
+ {\\r
+ E(#pStr" = '%s'.", pStr);\\r
+ }\\r
+}\r
+\r
+#ifdef ENABLE_DEBUG_LOG\r
+/**\r
+ * log ´Ó 'pStart' µØÖ·¿ªÊ¼µÄ 'len' ¸ö×Ö½ÚµÄÊý¾Ý. \r
+ */\r
+#define D_MEM(pStart, len) \\r
+ {\\r
+ int i = 0;\\r
+ char* p = (char*)pStart;\\r
+ D("dump memory from addr of '" #pStart "', from %p, length %d' : ", pStart, len); \\r
+ printk("\t\t");\\r
+ for ( i = 0; i < len ; i++ )\\r
+ {\\r
+ printk("0x%02x, ", p[i] );\\r
+ }\\r
+ printk("\n");\\r
+ }\r
+#else\r
+#define D_MEM(...) ((void)0)\r
+#endif\r
+\r
+/*-------------------------------------------------------*/\r
+\r
+#define EXIT_FOR_DEBUG \\r
+{\\r
+ E("To exit for debug.");\\r
+ return 1;\\r
+}\r
+\r
+/*-------------------------------------------------------*/\r
+\r
+/**\r
+ * µ÷Óú¯Êý, ²¢¼ì²é·µ»ØÖµ, ¸ù¾Ý·µ»ØÖµ¾ö¶¨ÊÇ·ñÌø×ªµ½Ö¸¶¨µÄ´íÎó´¦Àí´úÂë. \r
+ * @param functionCall\r
+ * ¶ÔÌØ¶¨º¯ÊýµÄµ÷ÓÃ, ¸Ãº¯ÊýµÄ·µ»ØÖµ±ØÐëÊÇ ±íÕ÷ ³É¹¦ or err µÄ ÕûÐÍÊý. \r
+ * ÕâÀï, ±»µ÷Óú¯Êý "±ØÐë" ÊDZ»¶¨ÒåΪ "·µ»Ø 0 ±íʾ²Ù×÷³É¹¦". \r
+ * @param result\r
+ * ÓÃÓڼǼº¯Êý·µ»ØµÄ error code µÄ ÕûÐͱäÁ¿, ͨ³£ÊÇ "ret" or "result" µÈ.\r
+ * @param label\r
+ * Èôº¯Êý·µ»Ø´íÎó, ³ÌÐò½«ÒªÌø×ªµ½µÄ ´íÎó´¦Àí´¦µÄ ±êºÅ, ͨ³£¾ÍÊÇ "EXIT". \r
+ */\r
+#define CHECK_FUNC_CALL(functionCall, result, label) \\r
+{\\r
+ if ( 0 != ( (result) = (functionCall) ) )\\r
+ {\\r
+ E("Function call returned error : " #result " = %d.", result);\\r
+ goto label;\\r
+ }\\r
+}\r
+\r
+/**\r
+ * ÔÚÌØ¶¨Ìõ¼þÏÂ, Åж¨ error ·¢Éú, ¶Ô±äÁ¿ 'retVar' ÉèÖà 'errCode', \r
+ * Log Êä³ö¶ÔÓ¦µÄ Error Caution, È»ºóÌø×ª 'label' Ö¸¶¨µÄ´úÂë´¦Ö´ÐÐ. \r
+ * @param msg\r
+ * ´¿×Ö´®ÐÎʽµÄÌáʾÐÅÏ¢. \r
+ * @param retVar\r
+ * ±êʶº¯ÊýÖ´ÐÐ״̬»òÕß½á¹ûµÄ±äÁ¿, ½«±»ÉèÖþßÌåµÄ Error Code. \r
+ * ͨ³£ÊÇ 'ret' or 'result'. \r
+ * @param errCode\r
+ * ±íÕ÷ÌØ¶¨ error µÄ³£Êý±êʶ, ͨ³£ÊÇ ºêµÄÐÎ̬. \r
+ * @param label\r
+ * ³ÌÐò½«ÒªÌø×ªµ½µÄ´íÎó´¦Àí´úÂëµÄ±êºÅ, ͨ³£¾ÍÊÇ 'EXIT'. \r
+ * @param args...\r
+ * ¶ÔÓ¦ 'msgFmt' ʵ²ÎÖÐ '%s', '%d', ... µÈ ת»»ËµÃ÷·û µÄ¾ßÌå¿É±ä³¤Êµ²Î. \r
+ */\r
+#define SET_ERROR_AND_JUMP(msgFmt, retVar, errCode, label, args...) \\r
+{\\r
+ E("To set '" #retVar "' to %d('" #errCode "'), because : " msgFmt, (errCode), ## args);\\r
+ (retVar) = (errCode);\\r
+ goto label;\\r
+}\r
+\r
+\r
+/* ---------------------------------------------------------------------------------------------------------\r
+ * Types and Structures Definition\r
+ * ---------------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ---------------------------------------------------------------------------------------------------------\r
+ * Global Functions' Prototype\r
+ * ---------------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+\r
+/* ---------------------------------------------------------------------------------------------------------\r
+ * Inline Functions Implementation \r
+ * ---------------------------------------------------------------------------------------------------------\r
+ */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __CUSTOM_LOG_H__ */\r
+\r