我正在为 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)
感谢
答案 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);