- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
14.4. 总线, 设备, 和驱动
14.4. 总线, 设备, 和驱动
⾄今, 我们已经看到⼤量低级框架和⼀个相对少的例⼦. 我们试图在本章剩下部 中补
充, 随着我们进⼊ Linux 设备模型的更⾼级. 为此, 我们介绍⼀个新的虚拟总线, 我们称
为 lddbus, [46]并且修改 scullp 驱动来 接⼊ 到这个总线.
再⼀次, 许多驱动作者将不会需要这⾥涉及的材料. 这个⽔平的细节通常在总线级别处
理, 并且很少作者需要添加⼀个新总线类型. 这个信息是有⽤的, 但是, 对任何⼈好奇在
PCI , USB 等层⾯的⾥⾯发⽣了什么或者谁需要在那个级别做改变.
14.4.1. 总线
⼀个总线是处理器和⼀个或多个设备之间的通道. 为设备模型的⽬的, 所有的设备都通
过⼀个总线连接, 甚⾄当它是⼀个内部的虚拟的,平台总线. 总线可以插⼊另⼀个 - ⼀
个 USB 控制器常常是⼀个 PCI 设备, 例如. 设备模型表⽰在总线和它们控制的设备之
间的实际连接.
在 Linux 设备模型中, ⼀个总线由 bus_type 结构代表, 定义在 linux device .h . 这个结
构看来象:
struct bus_type {
char *name;
struct subsystem subsys;
struct kset drivers;
struct kset devices;
int (*match)(struct device *dev, struct device_driver *drv);
struct device *(*add)(struct device * parent, char * bus_id);
int (*hotplug) (struct device *dev, char **envp,
int num_envp, char *buffer, int buffer_size);
/* ome fields omitted */
};
name 成员是总线的名⼦, 有些同 pci . 你可从这个结构中见到每个总线是它⾃⼰的⼦系
统; 这个⼦系统不位于 sysfs 的顶层, 但是. 相反, 它们在总线⼦系统下⾯. ⼀个总线包含
2 个 ksets, 代表已知的总线的驱动和所有插⼊总线的设备. 所以, 有⼀套⽅法我们马上
将涉及.
. 总线注册
如同我们提过的, 例⼦源码包含⼀个虚拟总线实现称为 lddbus. 这个总线建⽴它的
bus_type 结构, 如下:
struct bus_type ldd_bus_type = { .name = ldd, .match = ldd_match
注意很少 bus_type 成员要求初始化; ⼤部 由设备模型核⼼处理. 但是, 我们确实不得
不指定总线的名⼦, 以及任何伴随它的⽅法.
不可避免地, ⼀个新总线必须注册到系统, 通过⼀个对 bus_register 的调⽤. lddbus 代码
这样做以这样的⽅式:
ret = bus_register(ldd_bus_type);
if (ret)
return ret;
这个调⽤可能失败, 当然, 因此返回值必须⼀直检查. 如果它成功, 新总线⼦系统已被添
加到系统; 在 sysfs 中 sys bus 的下⾯可以见到, 并且可能启动添加设备.
如果有必要从系统中去除⼀个总线(当关联模块被去除, 例如), 调⽤调⽤ bus_unregister:
void bus_unregister(struct bus_type *bus);
. 总线⽅法
有⼏个给 bus_type 结构定义的⽅法; 它们允许总线代码作为⼀个设备核⼼和单独驱动
之间的中介. 在 2.6.10 内核中定义的⽅法是:
int (match)(struct device device , struct device_driver *driver);
这个⽅法被调⽤, ⼤概多次, ⽆论何时⼀个新设备或者驱动被添加给这个总线. 它应当
返回⼀个⾮零值如果给定的设备可被给定的驱动处理. (我们马上进⼊设备和
device_driver 结构的细节) . 这个函数必须在总线级别处理, 因为那是合适的逻辑存在的
地⽅; 核⼼内核不能知道如何匹配每个可能总线类型的设备和驱动.
int (hotp lug) (struct device device , char *envp , int num_envp , char buffer , int b
您可能关注的文档
最近下载
- 通桥(2019)2131-Ⅲ 时速160km客货共线铁路简支箱梁(单线)跨度:23.5m(直、曲线).pdf
- 高一物理-折合质量法求解完全非弹性碰撞.pdf VIP
- 2023-2024学年北京北师大附中新高一分班考物理试题及答案.docx VIP
- “工人阶级重要论述”及“工会十八大精神”知识竞赛试题附答案.doc VIP
- 上海某温室大棚空调方案设计说明.pdf VIP
- 市政府办公楼扩建改造项目投资建设可行性研究报告.doc VIP
- 卫生间丙纶布防水施工方案.doc VIP
- 成都地铁基坑围护结构钢支撑的应力监测分析.pdf VIP
- 2024湖北农谷实业集团有限责任公司招聘试题及答案解析.docx
- 新生儿呼吸心跳骤停新生儿重度窒息死亡病例讨论记录模板.doc VIP
文档评论(0)