#ifndef __DBG__
#define __DBG__
#define PRT(fmt, args...) do { if(g_dbg_para.printken & 1) printk(fmt, ## args); } while(0)
#define PRN(fmt, args...) do { PRT(fmt"\r\n", ## args); } while(0)
#define PFL(fmt, args...) do { PRT("[DBG:%s(%d)] "fmt, __func__, __LINE__, ## args); } while(0)
#define PFR(fmt, args...) do { PFL(fmt"\r\n", ## args); } while(0)
#define PRT_MEM(type, mem, fmt...) do { if (type).mem) PFR("\t"#mem"\t:\t"fmt, (type).mem); } while(0)
#define PFRERR(fmt, args...) do { fprintf(stderr, "[DBG:%s(%d)] "fmt"\r\n", __func__, __LINE__, ## args); } while(0)
#define SEQ_PFR(fmt, args...) do { seq_printf(seq, fmt"\r\n", ## args); } while(0)
#define SEQ_PRT_MEM(type, mem, fmt...) do { if (type).mem) seq_printf(seq, "\t"#mem"\t:\t"fmt"\r\n", (type).mem); } while(0)
struct dbg_stat {
u32 stat0;
u32 stat1;
u32 stat2;
u32 stat3;
u32 stat4;
u32 stat5;
u32 stat6;
u32 stat7;
u32 stat8;
u32 stat9;
};
struct dbg_para {
u32 printken;
u32 para1;
u32 para2;
u32 para3;
u32 para4;
u32 para5;
u32 para6;
u32 para7;
u32 para8;
u32 para9;
};
extern struct dbg_stat g_dbg_stat;
extern struct dbg_para g_dbg_para;
#endif
#ifndef __DBG_PROC__
#ifndef __DBG_STAT__
struct dbg_stat g_dbg_stat = {0};
static int dbg_stat_show(struct seq_file* seq, void* v)
{
SEQ_PFR("%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s\r\n"
"%10u%10u%10u%10u%10u%10u%10u%10u%10u%10u\r\n",
"stat0", "stat1", "stat2", "stat3", "stat4", "stat5", "stat6", "stat7", "stat8", "stat9",
dbg_stat.stat0, dbg_stat.stat1, dbg_stat.stat2, dbg_stat.stat3, dbg_stat.stat4,
dbg_stat.stat5, dbg_stat.stat6, dbg_stat.stat7, dbg_stat.stat8, dbg_stat.stat9);
return 0;
}
static int dbg_stat_write(struct file * filp, const char __user * *ubuf,
size_t count, loff_t *f_ops)
{
memset(&g_dbg_stat, 0, sizeof(g_dbg_stat));
return count;
}
static int dbg_stat_open(struct inode *inode, struct file *file)
{
return single_open(file, dbg_stat_show, NULL);
}
struct file_operations dbg_stat_fops = {
.owner = THIS_MODULE,
.open = dbg_stat_open,
.write = dbg_stat_write,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
#endif
#ifndef __DBG_PARA__
struct dbg_para g_dbg_para = {.printken = 1};
static int dbg_para_show(struct seq_file* seq, void* v)
{
SEQ_PRT_MEM(g_dbg_para, printken);
SEQ_PFR("%10s%10s%10s%10s%10s%10s%10s%10s%10s\r\n"
"%10u%10u%10u%10u%10u%10u%10u%10u%10u\r\n",
"para1", "para2", "para3", "para4", "para5", "para6", "para7", "para8", "para9",
dbg_para.para1, dbg_para.para2, dbg_para.para3, dbg_para.para4, dbg_para.para5,
dbg_para.para6, dbg_para.para7, dbg_para.para8, dbg_para.para9);
return 0;
}
static int dbg_para_write(struct file * filp, const char __user * *ubuf,
size_t count, loff_t *f_ops)
{
char buf[32] = {0};
if(copy_from_user(buf, ubuf, (31 > count)?count:31)) {
return -1;
}
// g_dbg_para.printken = simple_strtol(buf, NULL, 0);
if (sscanf(buf, "%u %u %u %u %u %u %u %u %u %u",
&g_dbg_para.printken, &g_dbg_para.para1,
&g_dbg_para.para2 , &g_dbg_para.para3,
&g_dbg_para.para4 , &g_dbg_para.para5,
&g_dbg_para.para6 , &g_dbg_para.para7,
&g_dbg_para.para8 , &g_dbg_para.para9) < 0) {
return -1;
}
return count;
}
static int dbg_para_open(struct inode *inode, struct file *file)
{
return single_open(file, dbg_para_show, NULL);
}
struct file_operations dbg_para_fops = {
.owner = THIS_MODULE,
.open = dbg_para_open,
.write = dbg_para_write,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
#endif
static int __init proc_dbg_init(void)
{
proc_create("dbg_stat", 0, NULL, &dbg_stat_fops);
proc_create("dbg_para", 0, NULL, &dbg_para_fops);
return 0;
}
fs_initcall(proc_dbg_init);
#endif