在probe()函数中访问/设置filp-> private_data成员

时间:2018-01-12 15:25:16

标签: linux driver device pci

一般:
我正在开发一个 PCIE(PCI Express) Linux设备驱动程序,其中open()/close()/read()/write()方法正在实施,probe()部分的PCIE功能。

现状:
probe()函数中,我可以访问dev指针driver_pcie_probe(struct pci_dev *dev, const struct pci_device_id *id)并通过它可以执行以下操作:

int my_pcie_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
    int err = 0;
    int *bar0 = NULL;
    int x = 0;
    int i = 0;

    // Before any device resources can be accessed, the device needs to be enabled.
    err = pci_enable_device(dev);
    if(err < 0) {
        printk(KERN_ALERT "Unable to enable PCIe device!\n");
        return err;
    }

    // Request all BARs to this device.
    err = pci_request_regions(dev, MY_DRIVER_NAME);
    if(err) {
        printk(KERN_ALERT "Unable to request memory regions (BARs) from PCIe device!\n");
        return err;
    }

    // !!! TESTING !!!
    bar0 = pci_iomap(dev, 0, 0);
    for(i = 0; i < 16; i++) {
        x = ioread32(bar0 + i);
        printk(KERN_ALERT "cycle: %d bar0: 0x%p, x = 0x%016x\n", i, bar0, x);
    }

    for(i = 0; i < 16; i++) {
        iowrite32(i, bar0 + i);
    }
    // !!! TESTING !!!

    return err;
}

在probe()函数中完美运行。

我想做什么:
...将iowrite/ioreads转移到角色设备read/write方法中。

ssize_t char_device_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
    ssize_t ret = 0;
    struct my_device *my_dev;
    int device_buf[16];
    int i = 0;

    my_dev = filp->private_data;

    if (down_interruptible(&my_dev->sem)) {
        return -ERESTARTSYS;
    }

    for(i = 0; i < 16; i++) {
        device_buf[i] = ioread32(my_dev->BAR0 + i);
    }

    if (copy_to_user(buf, device_buf, count)) {
        return -EFAULT;
    }
    *f_pos += count;
    ret = count;

    up(&my_dev->sem);

    return ret;
}

问题
我需要访问角色设备pci_dev struct *dev方法中的read/write才能执行ioread/iowrite

我所知道的:
字符设备的filp->private_data方法中有read/write,因此我考虑将my_own_device_struct设置为filp->private_data。这样,它就可以在角色设备的open/close/read/write内使用。

我的想法有效,但我无法弄清楚如何:
我想我可以在 PCIE 驱动程序的filp->private_data->函数中设置probe() ....这样,*dev(或至少bar0成为my_own_device_struct成员的open/close/read/write可用于角色设备的dev_set_drvdata()方法,但不幸的是,这不是&#39}工作和filename.o似乎也无法完成这项任务。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

而不是iowrite(),您可以使用kernel_write()

static struct file *filp;

使用filp_open()打开文件。

filp = filp_open();

然后您可以使用kernel_write()

/* kernel_write(struct file *file, const char *buf, size_t count,loff_t pos); */

答案 1 :(得分:0)

我到目前为止找到的唯一方法是在struct my_own_device函数期间使用struct pci_dev probe()作为成员进行初始化。它只是我的设备驱动程序模块中的一个静态变量,可从每个函数访问。

由于我只有一个 PCIe 设备正在与之通信,这可能就足够了。