| |--->初始化设备中断(uio_interrupt),每个uio设备的硬件中断处理函数都是单独注册的,非收发包使用,好像是设备link状态中断; bing操作后,dmesg就会看到igb_uio模块的probe函数执行了(id_table不为空了),也就是意味着扫描到了匹配的pci设备,将uio_info注册到内核中,注册后在/sys/class/uio/uioX,同时生成/dev...
在这个函数中,设置PCI的一些操作(如设置PCI BAR、DMA等),不是重点,那是驱动工程师的职责:) 对于PMD来说,重点是与UIO的交互。 1. 调用igbuio_setup_bars,设置uio_info的uio_mem和uio_port。 图2. igbuio_setup_bars 2. 设置uio_info的其他成员 图3. igb_uio设置uio_info 3. 调用uio_register_device,...
1和2中分别得到uio_major和uio_class接口变量,给添加uio设备使用。 三、uio_fops操作函数和uio_info的对应关系 当操作对应设备节点就是调用对应uio_xx函数 1、uio_open函数 ->idev->info->open //在对应注册uio设备时要封装uio_info对应的成员open函数 2、uio_wirte函数 ->idev->info->irqcontrol//在对应...
structuio_device {structmodule *owner;structdevice dev;intminor;/* 次设备号 */atomic_tevent;/* 中断事件计数 */structfasync_struct *async_queue;/* 异步等待队列 */wait_queue_head_t wait;/* 等待队列 */structuio_info *info;/* uio设备信息 */structmutex info_lock;structkobject *map_dir;s...
调用igbuio_setup_bars,设置 uio_info 的 uio_mem 和 uio_port。 设置uio_info 的其他成员。 调用uio_register_device,注册 UIO 设备。 打开UIO 设备并注册中断。 调用uio_event_notify,将注册的 UIO 设备的 “内存空间” 映射到用户态的应用空间。其 mmap 的函数为 uio_mmap。至此,UIO 就可以让 PMD 驱动...
static int uio_pdrv_genirq_open(struct uio_info *info, struct inode *inode) { struct uio_pdrv_genirq_platdata *priv = info->priv; /* Wait until the Runtime PM code has woken up the device */ pm_runtime_get_sync(&priv->pdev->dev); ...
在igb_uio模块中,uio_info结构体的mem与port io字段填充的意义在于,每个uio设备在实例化过程中会调用uio_dev_add_attributes创建maps与portio sysfs属性。当网卡绑定到igb_uio后,我们可以通过访问sysfs目录中的当前pci设备uio maps与uio portio文件来获取到网卡的pci bar中的物理内存信息。例如,00:06....
int (*open)(struct uio_info *info,struct inode *inode);//在uio_open中被调用,执行设备打开特定操作 int (*release)(struct uio_info*info, struct inode *inode);//在uio_device中被调用,执行设备关闭特定操作 int (*irqcontrol)(struct uio_info*info, s32 irq_on);//在uio_write方法中被调用,执...
void*priv;irqreturn_t(*handler)(int irq,struct uio_info*dev_info);int(*mmap)(structuio_info*info,struct vm_area_struct*vma);int(*open)(structuio_info*info,struct inode*inode);int(*release)(struct uio_info*info,struct inode*inode);int(*irqcontrol)(struct uio_info*info,s32 irq_on);...
kfree((void*)kpart_info.mem[0].addr); uio_unregister_device(&kpart_info);return0; }#endif#if1staticintuser_cmd_proc(char*user_cmd) {if(strncmp(user_cmd,"sendsig",7) ==0) { unsignedlong*ret_val_add = (unsignedlong*)(kpart_info.mem[0].addr);*ret_val_add =333; ...