发布时间: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 }
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能