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

时间:2018-02-23 15:28:38

标签: linux driver device

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

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

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

感谢

2 个答案:

答案 0 :(得分:0)

使用ioctl()驱动程序将执行命令&

这些命令的工作
 ioctl(fd, cmd , INPARAM or OUTPARAM);

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

答案 1 :(得分:0)

如果有一台以上的设备,则可能使用IDR来分配和跟踪次要的dev节点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);