[英]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.