【发布时间】:2018-01-31 10:46:42
【问题描述】:
我的 FPGA 中有一个带有多个 I/O 寄存器的通用 AXI 从设备。我想使用 sysfs 接口访问我的寄存器。对于我想访问的每个寄存器,我创建了一个_show 和一个_store 函数,但这会是很多代码。
static ssize_t writereg0_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 val;
if (kstrtou32(buf, 10, &val) != 0)
return -EINVAL;
iowrite32(val, drv->reg_base + WRITE_OFFSET + 0);
return count;
}
static ssize_t writereg0_show(struct device *dev, struct device_attribute *attr, char *buf) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 reg;
reg = ioread32(drv->reg_base + WRITE_OFFSET + 0);
return sprintf(buf, "0x%x\n", reg);
}
static DEVICE_ATTR_RW(writereg0);
static ssize_t readreg0_show(struct device *dev, struct device_attribute *attr, char *buf) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 reg;
reg = ioread32(drv->reg_base + 0);
return sprintf(buf, "0x%x\n", reg);
}
static DEVICE_ATTR_RO(readreg0);
第二个只读寄存器基本相同,只是函数名和地址偏移:
static ssize_t readreg1_show(struct device *dev, struct device_attribute *attr, char *buf) {
struct axi_register_driver *drv = dev_get_drvdata(dev);
u32 reg;
reg = ioread32(drv->reg_base + OFF_REG1);
return sprintf(buf, "0x%x\n", reg);
}
static DEVICE_ATTR_RO(readreg1);
当创建例如32 个寄存器,我必须这样做 32 次;代码不会很漂亮。
那么创建一堆类似函数的最佳方法是什么,尤其是对于给定的 sysfs-attribute 用例?
【问题讨论】:
-
这里没有问题。您可以编辑您的帖子以清楚地说明您想要回答的内容吗?例如“我怎样才能生成许多相似的结构和功能”之类的。
-
顺便说一句,我对内核源代码的阅读表明它的
sprintf()支持#修饰符,就像用户空间sprintf()一样,所以你可以简单地写%#x而不是0x%x. -
@TobySpeight 谢谢,我不知道。
标签: c linux linux-kernel linux-device-driver sysfs