日期:2014-05-16 浏览次数:20705 次
作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
内核版本:3.10.1
一、bus定义
Linux设备驱动模型中的bus,即可以是物理总线(如PCI、I2C总线)的抽象,也可以是出于设备驱动模型架构需要而定义的虚拟的“platform”总线。一个符合Linux设备驱动模型的device或device_driver必须挂靠在一个bus上,无论这个bus是物理的还是虚拟的。
Linux内核使用bus_type结构体来描述bus,该结构体定义在include/linux/device.h文件中,其内容如下:
56/** 57 * struct bus_type - The bus type of the device 58 * 59 * @name: The name of the bus. 60 * @dev_name: Used for subsystems to enumerate devices like ("foo%u", dev->id). 61 * @dev_root: Default device to use as the parent. 62 * @bus_attrs: Default attributes of the bus. 63 * @dev_attrs: Default attributes of the devices on the bus. 64 * @drv_attrs: Default attributes of the device drivers on the bus. 65 * @match: Called, perhaps multiple times, whenever a new device or driver 66 * is added for this bus. It should return a nonzero value if the 67 * given device can be handled by the given driver. 68 * @uevent: Called when a device is added, removed, or a few other things 69 * that generate uevents to add the environment variables. 70 * @probe: Called when a new device or driver add to this bus, and callback 71 * the specific driver's probe to initial the matched device. 72 * @remove: Called when a device removed from this bus. 73 * @shutdown: Called at shut-down time to quiesce the device. 74 * @suspend: Called when a device on this bus wants to go to sleep mode. 75 * @resume: Called to bring a device on this bus out of sleep mode. 76 * @pm: Power management operations of this bus, callback the specific 77 * device driver's pm-ops. 78 * @iommu_ops: IOMMU specific operations for this bus, used to attach IOMMU 79 * driver implementations to a bus and allow the driver to do 80 * bus-specific setup 81 * @p: The private data of the driver core, only the driver core can 82 * touch this. 83 * 84 * A bus is a channel between the processor and one or more devices. For the 85 * purposes of the device model, all devices are connected via a bus, even if 86 * it is an internal, virtual, "platform" bus. Buses can plug into each other. 87 * A USB controller is usually a PCI device, for example. The device model 88 * represents the actual connections between buses and the devices they control. 89 * A bus is represented by the bus_type structure. It contains the name, the 90 * default attributes, the bus' methods, PM operations, and the driver core's 91 * private data. 92 */ 93struct bus_type { 94 const char *name; 95 const char *dev_name; 96 struct device *dev_root; 97 struct bus_attribute *bus_attrs; 98 struct device_attribute *dev_attrs; 99 struct driver_attribute *drv_attrs; 100 101 int (*match)(struct device *dev, struct device_driver *drv); 102 int (*uevent)(struct device *dev, struct kobj_uevent_env *env); 103 int (*probe)(struct device *dev); 104 int (*remove)(struct device *dev); 105 void (*shutdown)(struct device *dev); 106 107 int (*suspend)(struct device *dev, pm_message_t state); 108 int (*resume)(struct device *dev); 109 110 const struct dev_pm_ops *pm; 111 112 struct iommu_ops *iommu_ops; 113 114 struct subsys_private *p; 115 struct lock_class_key lock_key; 116};
下面我们来看一下bus_type各个成员的作用:
name,代表bus的名字。
dev_name,用来遍历bus上的device。
dev_root,bus上device的根节点。
bus_attrs,bus的属性。
dev_attrs,bus上device的属性。
drv_attrs,bus上device_driver的属性。
match,当一个新的device或device driver被加入到该bus时,match函数会被调用进行匹配操作。更详细的说,当一个device被加入时,会和bus上的所有device_driver进行匹配操作,如果有device_driver能支持这个device,则匹配成功,match返回非0值。当一个device_driver被加入到