一般:
我正在开发一个 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
似乎也无法完成这项任务。
任何人都可以帮助我吗?
答案 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 设备正在与之通信,这可能就足够了。