gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:10 24 4
gpt4 key购买 nike

一般:
我正在使用 open()/close()/read()/write() 开发一个 PCIE(PCI Express) linux 设备驱动程序正在实现的方法和 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_dataread/write 内字符设备的方法,所以我想到了 my_own_device_struct我设置了 filp->private_data到。这样它就可以在 open/close/read/write 内使用字符设备。

我的想法可行,但我不知道如何:
我以为我可以设置 filp->private_data-> ... 在 probe()PCIE 驱动程序的功能。这样*dev (或者至少作为 bar0 成员的 my_own_device_struct 可用于字符设备的 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); */

关于linux - 在 probe() 函数中访问/设置 filp->private_data 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com