2011年(125)
分类: LINUX
2011-04-26 09:47:53
总线 总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连, 甚至是内部的虚拟"platform"总线。总线可以相互插入。设备模型展示了总线和它们所控制的设备之间的实际连接。 在 Linux 设备模型中, 总线由 bus_type 结构表示, 定义在
总线的注册和删除 总线的主要注册步骤: (1)申明和初始化 bus_type 结构体。只有很少的 bus_type 成员需要初始化,大部分都由设备模型核心控制。但必须为总线指定名字及一些必要的方法。例如:
(2)调用bus_register函数注册总线。
调用可能失败, 所以必须始终检查返回值。若成功,新的总线子系统将被添加进系统,并可在 sysfs 的 /sys/bus 下看到。之后可以向总线添加设备。 例如:
当必须从系统中删除一个总线时, 调用:
总线方法 在 bus_type 结构中定义了许多方法,它们允许总线核心作为设备核心和单独的驱动程序之间提供服务的中介,主要介绍以下两个方法:
lddbus的match和uevent方法:
对设备和驱动的迭代 若要编写总线层代码, 可能不得不对所有已经注册到总线的设备或驱动进行一些操作,这可能需要仔细研究嵌入到 bus_type 结构中的其他数据结构, 但最好使用内核提供的辅助函数:
总线属性 几乎 Linux 设备模型中的每一层都提供添加属性的函数, 总线层也不例外。bus_attribute 类型定义在
可以看出struct bus_attribute 和struct attribute 很相似,其实大部分在 kobject 级上的设备模型层都是以这种方式工作。 内核提供了一个宏在编译时创建和初始化 bus_attribute 结构:
例如创建一个包含源码版本号简单属性文件方法如下:
设备 在最底层, Linux 系统中的每个设备由一个 struct device 代表:
设备注册 设备的注册和注销函数为:
一个实际的总线也是一个设备,所以必须单独注册,以下为 lddbus 在编译时注册它的虚拟总线设备源码:
|