Access/Set filp->private_data probe() 函数中的成员
Access/Set filp->private_data member in probe() function
一般:
我正在开发一个 PCIE(PCI Express) linux 设备驱动程序,其中实现了 open()/close()/read()/write()
方法和 PCIE
的 probe()
函数]部分。
现状:
在 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_device
和 struct pci_dev
作为在 probe()
函数期间初始化的成员。它只是我的设备驱动程序模块中的一个静态变量,可从每个函数访问。
因为我只有一个 PCIe 设备与我通信,这可能就足够了。
一般:
我正在开发一个 PCIE(PCI Express) linux 设备驱动程序,其中实现了 open()/close()/read()/write()
方法和 PCIE
的 probe()
函数]部分。
现状:
在 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_device
和 struct pci_dev
作为在 probe()
函数期间初始化的成员。它只是我的设备驱动程序模块中的一个静态变量,可从每个函数访问。
因为我只有一个 PCIe 设备与我通信,这可能就足够了。