Access/Set filp->private_data probe() 函数中的成员

Access/Set filp->private_data member in probe() function

一般:
我正在开发一个 PCIE(PCI Express) linux 设备驱动程序,其中实现了 open()/close()/read()/write() 方法和 PCIEprobe() 函数]部分。

现状:
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;
}

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

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

我的想法可行,但我不知道如何实现:
我以为我可以在 PCIE 驱动程序的 probe() 函数中设置 filp->private_data->...。这样 *dev(或者至少 my_own_device_struct 的成员 a bar0 可用于字符设备的 open/close/read/write 方法,但不幸的是,这不是工作,dev_set_drvdata() 似乎也没有完成这项工作。

任何人都可以帮助我吗?

您可以使用 kernel_write().

而不是 iowrite()
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); */

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

因为我只有一个 PCIe 设备与我通信,这可能就足够了。