繁体   English   中英

如何从驱动程序的 ioctl() 中的文件 object 获取 pci_dev?

[英]how to get pci_dev from file object in a driver's ioctl()?

我正在为PCIE硬件开发 linux 驱动程序。 kernel 是v4.13 对于每个设备 object,有一堆数据存储在pci_set_drvdata(struct pci_dev *pdev, void *data)中。

IOCtl()服务例程中,如何使用struct file * pFile数据?

long IOCtlService(struct file * pFile, unsigned int cmd, unsigned long arg)

谢谢

使用ioctl()驱动程序将获取命令并处理这些命令

 ioctl(fd, cmd , INPARAM or OUTPARAM);

如何使用 struct file * pFile 取回数据? 你想执行什么操作? ioctl.h ,您可以使用ioctl.h中提供的命令。 例如IOR (如果命令需要从内核空间读取一些东西)

如果您有不止一个设备,您可能会使用 IDR 来分配和跟踪次要开发节点 ID。 idr_alloc的调用接受一个与 ID 一起存储以备将来使用的指针。

在您的 ioctl 处理程序中,您可以使用idr_find从 idr 中查找指针。 例如:

分配一个 IDR 并用它存储info

全局定义

DEFINE_MUTEX(minor_lock);
DEFINE_IDR(mydev_idr);

在您的 PCI 探针处理程序中

struct my_dev * info;

info = kzalloc(sizeof(struct mydev_info), GFP_KERNEL);
if (!info)
  return -ENOMEM;

mutex_lock(&minor_lock);
info->minor = idr_alloc(&mydev_idr, info, 0, MYDEV_MAX_DEVICES, GFP_KERNEL);
if (info->minor < 0)
{
  mutex_unlock(&minor_lock);
  goto out_unreg;
}
mutex_unlock(&minor_lock);

pci_set_drvdata(dev, info);

从 IDR 中查找存储的指针

unsigned minor = iminor(flip->f_inode);
struct my_dev * dev = (struct my_dev *)idr_find(&my_idr, minor);
if (!dev)
  return -EINVAL;

确保在移除设备时释放您的 IDR

mutex_lock(&minor_lock);
idr_remove(&mydev_idr, info->minor);
mutex_unlock(&minor_lock);

struct file也有private_data ,所以你可以在那里存储pci_dev ,就像struct miscdev所做的那样:

static int misc_open(struct inode *inode, struct file *file)
{
    ......
    struct miscdevice *c;

    ......

    /*
     * Place the miscdevice in the file's
     * private_data so it can be used by the
     * file operations, including f_op->open below
     */
    file->private_data = c;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM