知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

linux下PCI设备驱动程序之注册详解

发布时间:2014-09-05 13:26:29作者:知识屋

一 识别方式:

天朝为了方便每个人的管理,搞了一套身份识别的玩意(档案和身份证)。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设备是怎么诞生,怎么死亡的。

诞生:需要注册函数:pci_register_driver 该函数在android4.2内核中的路径是:kernel/drivers/pci/pci-driver.c

该函数的定义:

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 void1152 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 }
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜