设为首页 加入收藏

TOP

Linux下PCI设备驱动程序之注册详解
2014-11-24 01:09:16 来源: 作者: 【 】 浏览:5
Tags:Linux PCI 设备 驱动程序 注册 详解

一 识别方式:


天朝为了方便每个人的管理,搞了一套身份识别的玩意(档案和身份证)。kernel本省就像一个社会,每个进来的设备必须要有它独特的名字和一些档案。


这个工作对PCI来说,它是由pci_device_id这个结构体来进行身份信息保存的:


17 struct pci_device_id {
18 __u32 vendor, device; /* Vendor and device ID or PCI_ANY_ID*/
19 __u32 subvendor, subdevice; /* Subsystem ID's or PCI_ANY_ID */
20 __u32 class, class_mask; /* (class,subclass,prog-if) triplet */
21 kernel_ulong_t driver_data; /* Data private to the driver */
22 };


针对一些英文不好的同学,还是有必要对上面的信息进行翻译一下。vendor,device 分别代表设备商给的设备编号(身份证号)和该设备的名字(姓名)


subverdor,subdevice 分别对应的是该设备是否有别名,绝大多数设备是不需要的。class,class_mask分别对应的是该pci设备属于哪个设备:比如说,属于网络,块设备。


driver_data是属于该设备的私有数据,每个设备都不一样。


二 PCI设备注册和解注册:


人有生老病死,同样,每个驱动也有他们的宿命:出生->生活->死亡(任何中形式)这里,我就介绍一下PCI设备是怎么诞生,怎么死亡的。


该函数的定义:


int __pci_register_driver(struct pci_driver *drv, struct module *owner,
1106 const char *mod_name)
1107 {
1108 int error;
1109
1110 /* initialize common driver fields */
1111 drv->driver.name = drv->name;
1112 drv->driver.bus = &pci_bus_type;
1113 drv->driver.owner = owner;
1114 drv->driver.mod_name = mod_name;
1115
1116 spin_lock_init(&drv->dynids.lock);
1117 INIT_LIST_HEAD(&drv->dynids.list);
1118
1119 /* register with core */
1120 error = driver_register(&drv->driver);
1121 if (error)
1122 goto out;
1123
1124 error = pci_create_newid_file(drv);/* crate new id file of pci */
1125 if (error)
1126 goto out_newid;
1127
1128 error = pci_create_removeid_file(drv); /* same as above function only different in create different attr */
1129 if (error)
1130 goto out_removeid;
1131 out:
1132 return error;
1133
1134 out_removeid:
1135 pci_remove_newid_file(drv);
1136 out_newid:
1137 driver_unregister(&drv->driver);
1138 goto out;
1139 }


死亡:设备的死亡就意味着是解注册,这里面要做的是删除注册过的文件设备,删除驱动,把该设备从链表中删除等操作。


1151 void
1152 pci_unregister_driver(struct pci_driver *drv)
1153 {
1154 pci_remove_removeid_file(drv);
1155 pci_remove_newid_file(drv);
1156 driver_unregister(&drv->driver);
1157 pci_free_dynids(drv);
1158 }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android怎样才能完全退出程序 下一篇为你的Java代码配上类模块注释模板

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: