linux下PCI设备驱动程序之注册详解
2014-02-22 13:33
429 查看
一 识别方式:
天朝为了方便每个人的管理,搞了一套身份识别的玩意(档案和身份证)。kernel本省就像一个社会,每个进来的设备必须要有它独特的名字和一些档案。
这个工作对PCI来说,它是由pci_device_id这个结构体来进行身份信息保存的:
针对一些英文不好的同学,还是有必要对上面的信息进行翻译一下。vendor,device 分别代表设备商给的设备编号(身份证号)和该设备的名字(姓名)
subverdor,subdevice 分别对应的是该设备是否有别名,绝大多数设备是不需要的。class,class_mask分别对应的是该pci设备属于哪个设备:比如说,属于网络,块设备。
driver_data是属于该设备的私有数据,每个设备都不一样。
二 PCI设备注册和解注册:
人有生老病死,同样,每个驱动也有他们的宿命:出生->生活->死亡(任何中形式)这里,我就介绍一下PCI设备是怎么诞生,怎么死亡的。
诞生:需要注册函数:pci_register_driver 该函数在android4.2内核中的路径是:kernel/drivers/pci/pci-driver.c
该函数的定义:
死亡:设备的死亡就意味着是解注册,这里面要做的是删除注册过的文件设备,删除驱动,把该设备从链表中删除等操作。
天朝为了方便每个人的管理,搞了一套身份识别的玩意(档案和身份证)。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 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 }
相关文章推荐
- Ubuntu Linux下设置IP的配置命令
- linux时钟处理机制(一)
- linux学习笔记一:linux的基础知识
- Linux中ifcfg-eth0配置参数说明
- linux 下 ifcfg-eth0 配置
- linux管道(|)与重定向(<>)的异同
- 在 linux 下使用 CMake 构建应用程序
- Linux下安装Firefox
- Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
- 监控 Linux 性能的 18 个命令行工具
- u-boot2013.10引导linux3.10.30记录
- linux service命令
- linux CPU 画正弦曲线 编程之美
- Linux的10个核心面试问题
- Python Tkinter实现的linux命令帮助手册
- 红旗Linux走到尽头 国产软件为何难以长大?
- linux命令:svn
- 总结之:grep、egrep、fgrep的用法与特性详解
- Linux环境下用Weblogic发布项目【三】 -- 启动、登陆、停止WebLogic
- Linux Backup use of dd