debugfs使用记录

debugfs使用记录



/*
    debugfs文件调试例:
    先进行echo 命令write 文件
	再进行cat 命令,读取文件
*/

#define STMMAC_DC0 "dc0"
#define OPEN_RX     "open_rx"
#define CLOSE_RX    "close_rx"
#define OPEN_RX_LEN   7
#define CLOSE_RX_LEN   8
#define OPEN_DUMP_REGS "dump_regs"
#define DUMP_REGS_LEN  9
#define CLOSE_DUMP_REGS "no_dump_regs"
#define NO_DUMP_REGS_LEN  12

static ssize_t stmmac_write(struct file *fs, char __user *buf, size_t len, loff_t *lf)
{
    char cmd[len];
	memset(cmd, 0, len);
	
	if (copy_from_user(cmd, buf, len) < 0) {
	    pr_err("can't copy data\n);
		return -EINVAL;
	}
	if (!strncmp(cmd, OPEN_RX, OPEN_RX_LEN)) {
	    open_rx = true;
		pr_info("open rx\n");
	} else if (!strncmp(cmd, CLOSE_RX, CLOSE_RX_LEN)) {
	    open_rx = false;
		pr_info("close rx\n");
	} else if (!strncmp(cmd, OPEN_DUMP_REGS, DUMP_REGS_LEN)) {
		dump_regs = true;
		pr_info("open dump regs\n");
	} else if (!strncmp(cmd, CLOSE_DUMP_REGS, NO_DUMP_REGS_LEN)) {
		dump_regs = false;
		pr_info("close dump regs\n");
	} else {
		pr_info("please put in valid cmd:\n");
		pr_info("usage: echo cmd > /proc/stmmac/dump_info\n");
		pr_info("    cmd is one of these values as follows:\n");
		pr_info("        open_rx: open rx");
		pr_info("        close_rx: close rx");
		pr_info("        dump_reas: open dumping regs");
		pr_info("        no_dump_reas: close dumping regs");
	}
}

static ssize_t stmmac_read(struct file *fs, char __user *buf, size_t len, loff_t *lf)
{
    struct stmmac_prive *priv;
	unsigned int rxsize = 0;
	unsigned int count = 0;
	struct dma_desc *p = NULL;
	struct net_device *netdev;
	struct sk_buff *skb;
	void *ioaddr;
	
	netdev = dev_get_by_name(&init_net, STMMAC_DC0);
	if (!netdev) {
		pr_err("invalid netdev\n");
		return -EINVAL;
	}
	
	ioaddr = (void *)netdev->base_addr;
	if (!ioaddr) {
		pr_err("invalid ioaddr\n");
		return -EINVAL;
	}
	
	priv = netdev_priv(netdev);
	if (!priv) {
		pr_err("invalid priv\n");
		return -EINVAL;
	}
	
	if (dump_regs) {
	    /* 读取寄存器信息 */
		priv->hw->mac->dump_regs(ioaddr);
	}
	
	rxsize = priv->dma_rx_size;
	if (dump_xstats) {
		DUMP_XSTATS(priv)
	}
	
	if (dump_erx_desc01) {
		LOOP_DUMP_ERX_DESC(priv);
	}
	
	return 0;
}


static const struct file_operations stmmac_proc_ops = {
    .owner = THIS_MODULE,
	.open = simple_open,
	.read = stmmac_read,
	.write = stmmac_write,
};


static struct proc_dir_entry *stmmac_dump_dir = NULL;
static struct proc_dir_entry *stmmac_dump_proc = NULL;


stmmac_dump_init(void{
	int ret = 0;
        
	stmmac_dump_dir = proc_mkdir("stmmac", NULL);
	if (!stmmac_dump_dir) {
		ret = -EINVAL;
		goto out;
	}
	stmmac_dump_proc = proc_creat("dump_info", 0666, stmmac_dump_dir, &stmmac_proc_ops);
	if (!stmmac_dump_proc) {
		remove_proc_entry("stmmac", NULL);
		ret = -EINVAL;
	}
out:
    return ret;
}

static void stmmac_dump_exit(void)
{
    if (stmmac_dump_dir) {
		remove_proc_entry("dump_info", stmmac_dump_dir);
	}
	if (stmmac_dump_dir) {
		remove_proc_entry("stmmac", NULL);
	}
}

module_init(stmmac_dump_init);
module_exit(stmmac_dump_exit);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`debugfs` 是一个用于调试文件系统的工具,可以用来查看和修改文件系统的元数据,包括 inode、块、目录等信息。它通常用于恢复损坏的文件系统或者进行文件系统的调试和分析。 以下是 `debugfs` 常用的一些命令和用法: 1. 打开文件系统 ``` debugfs /dev/device ``` 这个命令会打开 `/dev/device` 设备对应的文件系统,以便进行调试操作。请注意,使用 `debugfs` 命令需要以 root 用户身份运行。 2. 查看 inode 节点 ``` debugfs: inode <inode> ``` 这个命令会查看指定 inode 节点的详细信息,包括文件类型、权限、大小、数据块列表等。 3. 查看目录内容 ``` debugfs: ls <directory> ``` 这个命令会列出指定目录下的所有文件和子目录。 4. 查看数据块内容 ``` debugfs: dump <block> ``` 这个命令会查看指定数据块的内容。请注意,这里的数据块编号是逻辑块编号,不是物理块编号。 5. 查找文件名对应的 inode 节点 ``` debugfs: ncheck <inode> ``` 这个命令会查找指定 inode 节点对应的文件名和路径。 6. 查找数据块对应的文件名和 inode 节点 ``` debugfs: icheck <block> ``` 这个命令会查找指定数据块所属的文件名和 inode 节点。 7. 修改 inode 节点的属性 ``` debugfs: set_inode_field <inode> <field> <value> ``` 这个命令会修改指定 inode 节点的属性。其中,`<field>` 可以是 `mode`、`uid`、`gid`、`atime`、`ctime`、`mtime`、`size` 等字段。 8. 修改数据块的内容 ``` debugfs: write <block> <file> ``` 这个命令会将指定文件的内容写入指定数据块中。 请注意,使用 `debugfs` 命令需要非常小心,因为不正确的操作可能会损坏文件系统。建议在进行任何修改之前先备份文件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值